summaryrefslogtreecommitdiff
path: root/cmake/Targets.cmake
diff options
context:
space:
mode:
authorAnatoly Baksheev <no@email>2014-12-17 09:09:14 (GMT)
committerEvan Shelhamer <shelhamer@imaginarynumber.net>2015-02-17 04:48:16 (GMT)
commit9358247014eb8322160c7feaad46091412d75d3f (patch)
treec95feaba2700ce53350db6a0ac7a389cb5a20a60 /cmake/Targets.cmake
parent32bf5c7ad804ad683aa5ea9382209e9284451e5f (diff)
downloadcaffeonacl-9358247014eb8322160c7feaad46091412d75d3f.zip
caffeonacl-9358247014eb8322160c7feaad46091412d75d3f.tar.gz
caffeonacl-9358247014eb8322160c7feaad46091412d75d3f.tar.bz2
improve CMake build
Diffstat (limited to 'cmake/Targets.cmake')
-rw-r--r--cmake/Targets.cmake170
1 files changed, 170 insertions, 0 deletions
diff --git a/cmake/Targets.cmake b/cmake/Targets.cmake
new file mode 100644
index 0000000..84a2aaf
--- /dev/null
+++ b/cmake/Targets.cmake
@@ -0,0 +1,170 @@
+################################################################################################
+# Defines global Caffe_LINK flag, This flag is required to prevent linker from excluding
+# some objects which are not addressed directly but are registered via static constructors
+if(BUILD_SHARED_LIBS)
+ set(Caffe_LINK caffe)
+else()
+ if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
+ set(Caffe_LINK -Wl,-force_load caffe)
+ elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
+ set(Caffe_LINK -Wl,--whole-archive caffe -Wl,--no-whole-archive)
+ endif()
+endif()
+
+################################################################################################
+# Convenient command to setup source group for IDEs that support this feature (VS, XCode)
+# Usage:
+# caffe_source_group(<group> GLOB[_RECURSE] <globbing_expression>)
+function(caffe_source_group group)
+ cmake_parse_arguments(CAFFE_SOURCE_GROUP "" "" "GLOB;GLOB_RECURSE" ${ARGN})
+ if(CAFFE_SOURCE_GROUP_GLOB)
+ file(GLOB srcs1 ${CAFFE_SOURCE_GROUP_GLOB})
+ source_group(${group} FILES ${srcs1})
+ endif()
+
+ if(CAFFE_SOURCE_GROUP_GLOB_RECURSE)
+ file(GLOB_RECURSE srcs2 ${CAFFE_SOURCE_GROUP_GLOB_RECURSE})
+ source_group(${group} FILES ${srcs2})
+ endif()
+endfunction()
+
+################################################################################################
+# Collecting sources from globbing and appending to output list variable
+# Usage:
+# caffe_source_group(<output_variable> GLOB[_RECURSE] <globbing_expression>)
+function(caffe_collect_sources variable)
+ cmake_parse_arguments(CAFFE_COLLECT_SOURCES "" "" "GLOB;GLOB_RECURSE" ${ARGN})
+ if(CAFFE_COLLECT_SOURCES_GLOB)
+ file(GLOB srcs1 ${CAFFE_COLLECT_SOURCES_GLOB})
+ set(${variable} ${variable} ${srcs1})
+ endif()
+
+ if(CAFFE_COLLECT_SOURCES_GLOB_RECURSE)
+ file(GLOB_RECURSE srcs2 ${CAFFE_COLLECT_SOURCES_GLOB_RECURSE})
+ set(${variable} ${variable} ${srcs2})
+ endif()
+endfunction()
+
+################################################################################################
+# Short command getting caffe sources (assuming standard Caffe code tree)
+# Usage:
+# caffe_pickup_caffe_sources(<root>)
+function(caffe_pickup_caffe_sources root)
+ # put all files in source groups (visible as subfolder in many IDEs)
+ caffe_source_group("Include" GLOB "${root}/include/caffe/*.h*")
+ caffe_source_group("Include\\Util" GLOB "${root}/include/caffe/util/*.h*")
+ caffe_source_group("Include" GLOB "${CMAKE_BINARY_DIR}/caffe_config.h*")
+ caffe_source_group("Source" GLOB "${root}/src/caffe/*.cpp")
+ caffe_source_group("Source\\Util" GLOB "${root}/src/caffe/util/*.cpp")
+ caffe_source_group("Source\\Layers" GLOB "${root}/src/caffe/layers/*.cpp")
+ caffe_source_group("Source\\Cuda" GLOB "${root}/src/caffe/layers/*.cu")
+ caffe_source_group("Source\\Cuda" GLOB "${root}/src/caffe/util/*.cu")
+ caffe_source_group("Source\\Proto" GLOB "${root}/src/caffe/proto/*.proto")
+
+ # source groups for test target
+ caffe_source_group("Include" GLOB "${root}/include/caffe/test/test_*.h*")
+ caffe_source_group("Source" GLOB "${root}/src/caffe/test/test_*.cpp")
+ caffe_source_group("Source\\Cuda" GLOB "${root}/src/caffe/test/test_*.cu")
+
+ # collect files
+ file(GLOB test_hdrs ${root}/include/caffe/test/test_*.h*)
+ file(GLOB test_srcs ${root}/src/caffe/test/test_*.cpp)
+ file(GLOB_RECURSE hdrs ${root}/include/caffe/*.h*)
+ file(GLOB_RECURSE srcs ${root}/src/caffe/*.cpp)
+ list(REMOVE_ITEM hdrs ${test_hdrs})
+ list(REMOVE_ITEM srcs ${test_srcs})
+
+ # adding headers to make the visible in some IDEs (Qt, VS, Xcode)
+ list(APPEND srcs ${hdrs} ${CMAKE_BINARY_DIR}/caffe_config.h)
+ list(APPEND test_srcs ${test_hdrs})
+
+ # collect cuda files
+ file(GLOB test_cuda ${root}/src/caffe/test/test_*.cu)
+ file(GLOB_RECURSE cuda ${root}/src/caffe/*.cu)
+ list(REMOVE_ITEM cuda ${test_cuda})
+
+ # add proto to make them editable in IDEs too
+ file(GLOB_RECURSE proto_files ${root}/src/caffe/*.proto)
+ list(APPEND srcs ${proto_files})
+
+ # convet to absolute paths
+ caffe_convert_absolute_paths(srcs)
+ caffe_convert_absolute_paths(cuda)
+ caffe_convert_absolute_paths(test_srcs)
+ caffe_convert_absolute_paths(test_cuda)
+
+ # propogate to parent scope
+ set(srcs ${srcs} PARENT_SCOPE)
+ set(cuda ${cuda} PARENT_SCOPE)
+ set(test_srcs ${test_srcs} PARENT_SCOPE)
+ set(test_cuda ${test_cuda} PARENT_SCOPE)
+endfunction()
+
+################################################################################################
+# Short command for setting defeault target properties
+# Usage:
+# caffe_default_properties(<target>)
+function(caffe_default_properties target)
+ set_target_properties(${target} PROPERTIES
+ DEBUG_POSTFIX ${Caffe_DEBUG_POSTFIX}
+ ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
+ LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
+ RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
+endfunction()
+
+################################################################################################
+# Short command for setting runtime directory for build target
+# Usage:
+# caffe_set_runtime_directory(<target> <dir>)
+function(caffe_set_runtime_directory target dir)
+ set_target_properties(${target} PROPERTIES
+ RUNTIME_OUTPUT_DIRECTORY "${dir}")
+endfunction()
+
+################################################################################################
+# Short command for setting solution folder property for target
+# Usage:
+# caffe_set_solution_folder(<target> <folder>)
+function(caffe_set_solution_folder target folder)
+ if(USE_PROJECT_FOLDERS)
+ set_target_properties(${target} PROPERTIES FOLDER "${folder}")
+ endif()
+endfunction()
+
+################################################################################################
+# Reads lines from input file, prepends source directory to each line and writes to output file
+# Usage:
+# caffe_configure_testdatafile(<testdatafile>)
+function(caffe_configure_testdatafile file)
+ file(STRINGS ${file} __lines)
+ set(result "")
+ foreach(line ${__lines})
+ set(result "${result}${CMAKE_SOURCE_DIR}/${line}\n")
+ endforeach()
+ dmsg(${result})
+ file(WRITE ${file}.gen.cmake ${result})
+endfunction()
+
+################################################################################################
+# Filter outs all files that are not inlcuded in selected list
+# Usage:
+# caffe_leave_only_selected_tests(<filelist_variable> <selected_list>)
+function(caffe_leave_only_selected_tests file_list)
+ if(NOT ARGN)
+ return() # blank list means leave all
+ endif()
+ string(REPLACE "," ";" __selected ${ARGN})
+ list(APPEND __selected caffe_main)
+
+ set(result "")
+ foreach(f ${${file_list}})
+ get_filename_component(name ${f} NAME_WE)
+ string(REGEX REPLACE "^test_" "" name ${name})
+ list(FIND __selected ${name} __index)
+ if(NOT __index EQUAL -1)
+ list(APPEND result ${f})
+ endif()
+ endforeach()
+ set(${file_list} ${result} PARENT_SCOPE)
+endfunction()
+