Update release_notes.md
[platform/upstream/caffeonacl.git] / cmake / Targets.cmake
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)
5   if(BUILD_SHARED_LIBS)
6     set(Caffe_LINK caffe)
7   else()
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)
12     endif()
13   endif()
14 endmacro()
15 ################################################################################################
16 # Convenient command to setup source group for IDEs that support this feature (VS, XCode)
17 # Usage:
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})
24   endif()
25
26   if(CAFFE_SOURCE_GROUP_GLOB_RECURSE)
27     file(GLOB_RECURSE srcs2 ${CAFFE_SOURCE_GROUP_GLOB_RECURSE})
28     source_group(${group} FILES ${srcs2})
29   endif()
30 endfunction()
31
32 ################################################################################################
33 # Collecting sources from globbing and appending to output list variable
34 # Usage:
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})
41   endif()
42
43   if(CAFFE_COLLECT_SOURCES_GLOB_RECURSE)
44     file(GLOB_RECURSE srcs2 ${CAFFE_COLLECT_SOURCES_GLOB_RECURSE})
45     set(${variable} ${variable} ${srcs2})
46   endif()
47 endfunction()
48
49 ################################################################################################
50 # Short command getting caffe sources (assuming standard Caffe code tree)
51 # Usage:
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")
64
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")
69
70   # collect files
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})
77
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})
81
82   # collect cuda files
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})
86
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})
90
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)
96
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)
102 endfunction()
103
104 ################################################################################################
105 # Short command for setting default target properties
106 # Usage:
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})
117   endif()
118 endfunction()
119
120 ################################################################################################
121 # Short command for setting runtime directory for build target
122 # Usage:
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}")
127 endfunction()
128
129 ################################################################################################
130 # Short command for setting solution folder property for target
131 # Usage:
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}")
136   endif()
137 endfunction()
138
139 ################################################################################################
140 # Reads lines from input file, prepends source directory to each line and writes to output file
141 # Usage:
142 #   caffe_configure_testdatafile(<testdatafile>)
143 function(caffe_configure_testdatafile file)
144   file(STRINGS ${file} __lines)
145   set(result "")
146   foreach(line ${__lines})
147     set(result "${result}${PROJECT_SOURCE_DIR}/${line}\n")
148   endforeach()
149   file(WRITE ${file}.gen.cmake ${result})
150 endfunction()
151
152 ################################################################################################
153 # Filter out all files that are not included in selected list
154 # Usage:
155 #   caffe_leave_only_selected_tests(<filelist_variable> <selected_list>)
156 function(caffe_leave_only_selected_tests file_list)
157   if(NOT ARGN)
158     return() # blank list means leave all
159   endif()
160   string(REPLACE "," ";" __selected ${ARGN})
161   list(APPEND __selected caffe_main)
162
163   set(result "")
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})
170     endif()
171   endforeach()
172   set(${file_list} ${result} PARENT_SCOPE)
173 endfunction()
174