1 ################################################################################################
2 # Defines global Caffe_LINK flag, This flag is required to prevent linker from excluding
3 # some objects which are not addressed directly but are registered via static constructors
4 macro(caffe_set_caffe_link)
8 if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
9 set(Caffe_LINK -Wl,-force_load caffe)
10 elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
11 set(Caffe_LINK -Wl,--whole-archive caffe -Wl,--no-whole-archive)
15 ################################################################################################
16 # Convenient command to setup source group for IDEs that support this feature (VS, XCode)
18 # caffe_source_group(<group> GLOB[_RECURSE] <globbing_expression>)
19 function(caffe_source_group group)
20 cmake_parse_arguments(CAFFE_SOURCE_GROUP "" "" "GLOB;GLOB_RECURSE" ${ARGN})
21 if(CAFFE_SOURCE_GROUP_GLOB)
22 file(GLOB srcs1 ${CAFFE_SOURCE_GROUP_GLOB})
23 source_group(${group} FILES ${srcs1})
26 if(CAFFE_SOURCE_GROUP_GLOB_RECURSE)
27 file(GLOB_RECURSE srcs2 ${CAFFE_SOURCE_GROUP_GLOB_RECURSE})
28 source_group(${group} FILES ${srcs2})
32 ################################################################################################
33 # Collecting sources from globbing and appending to output list variable
35 # caffe_collect_sources(<output_variable> GLOB[_RECURSE] <globbing_expression>)
36 function(caffe_collect_sources variable)
37 cmake_parse_arguments(CAFFE_COLLECT_SOURCES "" "" "GLOB;GLOB_RECURSE" ${ARGN})
38 if(CAFFE_COLLECT_SOURCES_GLOB)
39 file(GLOB srcs1 ${CAFFE_COLLECT_SOURCES_GLOB})
40 set(${variable} ${variable} ${srcs1})
43 if(CAFFE_COLLECT_SOURCES_GLOB_RECURSE)
44 file(GLOB_RECURSE srcs2 ${CAFFE_COLLECT_SOURCES_GLOB_RECURSE})
45 set(${variable} ${variable} ${srcs2})
49 ################################################################################################
50 # Short command getting caffe sources (assuming standard Caffe code tree)
52 # caffe_pickup_caffe_sources(<root>)
53 function(caffe_pickup_caffe_sources root)
54 # put all files in source groups (visible as subfolder in many IDEs)
55 caffe_source_group("Include" GLOB "${root}/include/caffe/*.h*")
56 caffe_source_group("Include\\Util" GLOB "${root}/include/caffe/util/*.h*")
57 caffe_source_group("Include" GLOB "${PROJECT_BINARY_DIR}/caffe_config.h*")
58 caffe_source_group("Source" GLOB "${root}/src/caffe/*.cpp")
59 caffe_source_group("Source\\Util" GLOB "${root}/src/caffe/util/*.cpp")
60 caffe_source_group("Source\\Layers" GLOB "${root}/src/caffe/layers/*.cpp")
61 caffe_source_group("Source\\Cuda" GLOB "${root}/src/caffe/layers/*.cu")
62 caffe_source_group("Source\\Cuda" GLOB "${root}/src/caffe/util/*.cu")
63 caffe_source_group("Source\\Proto" GLOB "${root}/src/caffe/proto/*.proto")
65 # source groups for test target
66 caffe_source_group("Include" GLOB "${root}/include/caffe/test/test_*.h*")
67 caffe_source_group("Source" GLOB "${root}/src/caffe/test/test_*.cpp")
68 caffe_source_group("Source\\Cuda" GLOB "${root}/src/caffe/test/test_*.cu")
71 file(GLOB test_hdrs ${root}/include/caffe/test/test_*.h*)
72 file(GLOB test_srcs ${root}/src/caffe/test/test_*.cpp)
73 file(GLOB_RECURSE hdrs ${root}/include/caffe/*.h*)
74 file(GLOB_RECURSE srcs ${root}/src/caffe/*.cpp)
75 list(REMOVE_ITEM hdrs ${test_hdrs})
76 list(REMOVE_ITEM srcs ${test_srcs})
78 # adding headers to make the visible in some IDEs (Qt, VS, Xcode)
79 list(APPEND srcs ${hdrs} ${PROJECT_BINARY_DIR}/caffe_config.h)
80 list(APPEND test_srcs ${test_hdrs})
83 file(GLOB test_cuda ${root}/src/caffe/test/test_*.cu)
84 file(GLOB_RECURSE cuda ${root}/src/caffe/*.cu)
85 list(REMOVE_ITEM cuda ${test_cuda})
87 # add proto to make them editable in IDEs too
88 file(GLOB_RECURSE proto_files ${root}/src/caffe/*.proto)
89 list(APPEND srcs ${proto_files})
91 # convert to absolute paths
92 caffe_convert_absolute_paths(srcs)
93 caffe_convert_absolute_paths(cuda)
94 caffe_convert_absolute_paths(test_srcs)
95 caffe_convert_absolute_paths(test_cuda)
97 # propagate to parent scope
98 set(srcs ${srcs} PARENT_SCOPE)
99 set(cuda ${cuda} PARENT_SCOPE)
100 set(test_srcs ${test_srcs} PARENT_SCOPE)
101 set(test_cuda ${test_cuda} PARENT_SCOPE)
104 ################################################################################################
105 # Short command for setting default target properties
107 # caffe_default_properties(<target>)
108 function(caffe_default_properties target)
109 set_target_properties(${target} PROPERTIES
110 DEBUG_POSTFIX ${Caffe_DEBUG_POSTFIX}
111 ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib"
112 LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib"
113 RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin")
114 # make sure we build all external dependencies first
115 if (DEFINED external_project_dependencies)
116 add_dependencies(${target} ${external_project_dependencies})
120 ################################################################################################
121 # Short command for setting runtime directory for build target
123 # caffe_set_runtime_directory(<target> <dir>)
124 function(caffe_set_runtime_directory target dir)
125 set_target_properties(${target} PROPERTIES
126 RUNTIME_OUTPUT_DIRECTORY "${dir}")
129 ################################################################################################
130 # Short command for setting solution folder property for target
132 # caffe_set_solution_folder(<target> <folder>)
133 function(caffe_set_solution_folder target folder)
134 if(USE_PROJECT_FOLDERS)
135 set_target_properties(${target} PROPERTIES FOLDER "${folder}")
139 ################################################################################################
140 # Reads lines from input file, prepends source directory to each line and writes to output file
142 # caffe_configure_testdatafile(<testdatafile>)
143 function(caffe_configure_testdatafile file)
144 file(STRINGS ${file} __lines)
146 foreach(line ${__lines})
147 set(result "${result}${PROJECT_SOURCE_DIR}/${line}\n")
149 file(WRITE ${file}.gen.cmake ${result})
152 ################################################################################################
153 # Filter out all files that are not included in selected list
155 # caffe_leave_only_selected_tests(<filelist_variable> <selected_list>)
156 function(caffe_leave_only_selected_tests file_list)
158 return() # blank list means leave all
160 string(REPLACE "," ";" __selected ${ARGN})
161 list(APPEND __selected caffe_main)
164 foreach(f ${${file_list}})
165 get_filename_component(name ${f} NAME_WE)
166 string(REGEX REPLACE "^test_" "" name ${name})
167 list(FIND __selected ${name} __index)
168 if(NOT __index EQUAL -1)
169 list(APPEND result ${f})
172 set(${file_list} ${result} PARENT_SCOPE)