因为最近在看GraphLab的源码和cmake,所以对GraphLab中的CMakeList.txt进行分析,学习一下
# Libraries linked via full path no longer produce linker search paths.
cmake_policy(SET CMP0003 NEW)
# Preprocessor definition values are now escaped automatically.
cmake_policy(SET CMP0005 NEW)
cmake_policy处理cmake版本兼容的,每个版本对应不同的policy,详细看文档
# Determine where additional GraphLab specific cmake modules are defined
set(CMAKE_MODULE_PATH ${GraphLab_SOURCE_DIR}/cmake)
设置CMAKE_MODULE_PATH
set(BUILD_SHARED_LIBS ON)
BUILD_SHARED_LIBS 变量可以改变add_library()来构建共享库,默认是add_library()是构建静态库
include(CheckLibraryExists)
include(CheckFunctionExists)
include(ExternalProject)
include(CheckCXXSourceCompiles)
Load and run CMake code from a file or module.
# check we are on a 64 bit machine (else fail)
if( CMAKE_SIZEOF_VOID_P EQUAL 4 )
message( SEND_ERROR "GraphLab does not support 32 bit systems. Please switch to 64 bit system and try again" )
endif ( CMAKE_SIZEOF_VOID_P EQUAL 4 )
CMAKE_SIZEOF_VOID_P是void指针的字节数
# set include path
include_directories(
${GraphLab_SOURCE_DIR}/src
${GraphLab_SOURCE_DIR}/cxxtest
${GraphLab_SOURCE_DIR}/deps/local/include)
设置include路径,引入头文件
# set link path
link_directories(${GraphLab_SOURCE_DIR}/deps/local/lib)
设置链接路径
add_definitions(-DUSE_DYNAMIC_LOCAL_GRAPH)
。。。。
if(NO_OPENMP)
set(OPENMP_C_FLAGS "")
set(OPENMP_LIBRARIES "")
add_definitions(-D__NO_OPENMP__)
else()
set(OPENMP_C_FLAGS "-fopenmp")
set(OPENMP_LIBRARIES "gomp")
endif()
if (APPLE)
link_libraries(pthread ${OPENMP_LIBRARIES})
else()
link_libraries(pthread rt ${OPENMP_LIBRARIES})
endif()
将库链接到稍后添加的所有目标
if(EXPERIMENTAL)
if (IS_DIRECTORY ${GraphLab_SOURCE_DIR}/experimental)
subdirs(experimental)
endif()
endif()
如果${GraphLab_SOURCE_DIR}/experimental
是一个directory就返回true
macro(requires_eigen NAME)
add_dependencies(${NAME} eigen)
endmacro(requires_eigen)
Add a dependency between top-level targets.
add_dependencies(<target> [<target-dependency>]...)
# Set installation rules
install(DIRECTORY src/
DESTINATION include
FILES_MATCHING PATTERN "*.hpp" PATTERN "*.h"
PATTERN ".svn" EXCLUDE
)
install(CODE "execute_process(COMMAND ./scripts/install_deps.sh
${CMAKE_INSTALL_PREFIX} WORKING_DIRECTORY
${CMAKE_CURRENT_SOURCE_DIR})")
macro(requires_opencv NAME)
get_target_property(tmp ${NAME} COMPILE_FLAGS)
if (NOT tmp)
set(tmp "-I${CMAKE_SOURCE_DIR}/deps/local/include/opencv")
else()
set(tmp "${tmp} -I${CMAKE_SOURCE_DIR}/deps/local/include/opencv")
endif()
set_target_properties(${NAME} PROPERTIES COMPILE_FLAGS "${tmp}")
target_link_libraries(${NAME} opencv_core opencv_imgproc opencv_calib3d opencv_video opencv_features2d opencv_ml opencv_highgui opencv_objdetect opencv_contrib opencv_legacy opencv_contrib opencv_stitching)
add_dependencies(${NAME} opencv)
endmacro(requires_opencv)
get_target_property():从target中得到一个COMPILE_FLAGS属性,并存储在变量tmp中。通过==set_target_property()==来设置target属性
find_package(Java)
find_package(JNI)
Finds and loads settings from an external project. _FOUND will be set to indicate whether the package was found. 如果Java被找到,JAVA_FOUND为true
# Setup testing tools
# Make sure testing is enabled
enable_testing()
# Use Python interpreter
find_package(PythonInterp)
set(CXXTESTGEN ${CMAKE_SOURCE_DIR}/cxxtest/cxxtestgen)
# create a macro to define a test
macro(ADD_CXXTEST NAME)
if(PYTHONINTERP_FOUND)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.cpp
COMMAND
${PYTHON_EXECUTABLE} ${CXXTESTGEN}
--runner=ErrorPrinter
-o ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.cpp ${ARGV}
DEPENDS ${ARGV}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)
endif(PYTHONINTERP_FOUND)
add_graphlab_executable(${NAME}test ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.cpp)
set_source_files_properties( ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.cpp
PROPERTIES COMPILE_FLAGS "-I${CMAKE_CURRENT_SOURCE_DIR}" )
add_test(${NAME} ${NAME}test)
endmacro(ADD_CXXTEST)
安装测试工具