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)