cmake基础(2)

以cilantro为例子:

cmake_minimum_required(VERSION 3.5)
project(cilantro)



# Build setup
#CMAKE_MODULE_PATH 定义自己的cmake模块所在的路径,CMAKE_CURRENT_SOURCE_DIR是当前CMAKELISTS.TXT
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/")
#Release
set(CMAKE_BUILD_TYPE "Release")
set(CMAKE_CXX_STANDARD 11)

# Packages
find_package(Eigen3 REQUIRED)
find_package(Pangolin QUIET)
if(Pangolin_FOUND)
    set(HAVE_PANGOLIN ON)
endif()
find_package(OpenMP)
# if(OPENMP_FOUND)
#     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
#     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
# endif()
#OTHER_INCLUDE_DIRS,OTHER_LIBRARIES 为外部的头文件和库
set(OTHER_INCLUDE_DIRS ${EIGEN3_INCLUDE_DIRS} ${Pangolin_INCLUDE_DIRS})
set(OTHER_LIBRARIES ${EIGEN3_LIBRARIES} ${Pangolin_LIBRARIES})

#通过_WIN_选择编译什么库
if(_WIN_)
    option(BUILD_SHARED_LIBS "Build Shared Library" OFF)
else()
    option(BUILD_SHARED_LIBS "Build Shared Library" ON)
endif()

# Build options,这个应该是无关紧要的
option(ENABLE_NATIVE_BUILD_OPTIMIZATIONS "Enable native build optimization flags" ON)
option(ENABLE_NON_DETERMINISTIC_PARALLELISM "Enable parallelization that may produce non-deterministic results" ON)

# Build library
#THIRD_SOURCES 是所有第三方库的源文件
file(GLOB_RECURSE THIRD_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/3rd_party/*.c ${CMAKE_CURRENT_SOURCE_DIR}/src/3rd_party/*.cpp)
#CMAKE_CURRENT_BINARY_DIR目前还不是很理解这个,大致意思是所有库的头文件
file(GLOB LIB_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/${PROJECT_NAME}/*.hpp ${CMAKE_CURRENT_BINARY_DIR}/include/${PROJECT_NAME}/*.hpp)
#所有的源文件
file(GLOB LIB_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)

#生成库文件libcilantro.so
add_library(${PROJECT_NAME} ${THIRD_SOURCES} ${LIB_HEADERS} ${LIB_SOURCES})
#指定目标文件所有的头文件路径,第一个Link 的是外部库,SYSTEM,则是告诉编译器在一些平台上该目录表示系统包含目录
target_include_directories(${PROJECT_NAME} SYSTEM PUBLIC ${OTHER_INCLUDE_DIRS})
#PUBLIC会填充targe目标文件的INCLUDE_DIRECTORIES属性,INTERFACE项会填充target目标文件的INTERFACE_INCLUDE_DIRECTORIES属性
target_include_directories(${PROJECT_NAME} PUBLIC $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
                                                  $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
                                                  $<INSTALL_INTERFACE:include>)
#OTHER_LIBRARIES
target_link_libraries(${PROJECT_NAME} PUBLIC ${OTHER_LIBRARIES})
#没怎么看懂,大体上是添加openmp的库
if(OpenMP_CXX_FOUND)
    target_link_libraries(${PROJECT_NAME} PUBLIC OpenMP::OpenMP_CXX)
endif()
#这个地方应该是指定编译器的,或许在你使用交叉编译的时候,需要更改这里的某些选项
if (ENABLE_NATIVE_BUILD_OPTIMIZATIONS)
    target_compile_options(${PROJECT_NAME} PUBLIC -O3 -march=native -mtune=native)
else()
    target_compile_options(${PROJECT_NAME} PUBLIC -O3)
endif()

# Configure preprocessor definitions
#configure_file: 将一份文件拷贝到另一个位置并修改它的内容
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/config.hpp.in" "${CMAKE_CURRENT_BINARY_DIR}/include/${PROJECT_NAME}/config.hpp")

# Package config files
#REMOVE 会删除指定的文件以及子目录下的文件。
file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Targets.cmake")
#export 从构建树中导出目标供外部使用,Targets.cmake这个可以被外部工程包含进去,如果指定了APPEND选项,生成的代码将会续接在文件之后
export(TARGETS ${PROJECT_NAME} APPEND FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Targets.cmake")
#这个set 没有看懂,这两句没看懂
set(CMAKECONFIG_INSTALL_DIR lib/cmake/${PROJECT_NAME})
file(RELATIVE_PATH REL_INCLUDE_DIR "${CMAKE_INSTALL_PREFIX}/${CMAKECONFIG_INSTALL_DIR}" "${CMAKE_INSTALL_PREFIX}/include")

# Build tree config
set(EXPORT_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include;${CMAKE_CURRENT_BINARY_DIR}/include")
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}Config.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake @ONLY IMMEDIATE)

# Install tree config
set(EXPORT_INCLUDE_DIR "\${PROJECT_CMAKE_DIR}/${REL_INCLUDE_DIR}")
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}Config.cmake.in ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${PROJECT_NAME}Config.cmake @ONLY)

# Add package to CMake package registry for use from the build tree
option(EXPORT_${PROJECT_NAME} "Export ${PROJECT_NAME} package for use by other software" ON)
if(EXPORT_${PROJECT_NAME})
    export(PACKAGE ${PROJECT_NAME})
endif()

# Install target
#在targert生成了config.hpp,打开了两个编译选项 HAVE_PANGOLIN ENABLE_NON_DETERMINISTIC_PARALLELISM
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/include/${PROJECT_NAME}/config.hpp" DESTINATION ${CMAKE_INSTALL_PREFIX}/include/${PROJECT_NAME})
#目录的安装
#DIRECTORY后面如果是abc意味着abc这个目录会安装在目标路径下,abc/意味着abc这个目录的内容会被安装在目标路径下,而abc目录本身却不会被安装
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/ DESTINATION ${CMAKE_INSTALL_PREFIX}/include)
#参数中的TARGET可以是很多种目标文件,最常见的是通过ADD_EXECUTABLE或者ADD_LIBRARY定义的目标文件
#如果设置了DESTINATION参数,推荐配置在安装目录变量下的文件夹
#这个命令有相应的默认值,具体要看cmake的使用了
install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}Targets LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib)
#这个命令是普通文本文件的使用
install(FILES "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${PROJECT_NAME}Config.cmake" DESTINATION ${CMAKECONFIG_INSTALL_DIR})
#不清楚使用
install(EXPORT ${PROJECT_NAME}Targets DESTINATION ${CMAKECONFIG_INSTALL_DIR})

# Uninstall target
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY)
add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)

# Configure Doxyfile
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY)

# Build examples
option(BUILD_EXAMPLES "Build small example apps" ON)
if(BUILD_EXAMPLES AND Pangolin_FOUND)
    file(GLOB example_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/examples/*.cpp)
    #遍历所有的example的.cpp文件
    foreach(example_file ${example_files})
        #get_filename_component 得到一个完整文件名中的特定部分,去掉扩展名的文件名(NAME_WE)
        get_filename_component(example_name ${example_file} NAME_WE)
        #编译
        add_executable(${example_name} ${example_file})
        #链接库文件,这里好像没有链接Eigen
        target_link_libraries(${example_name} ${PROJECT_NAME} ${Pangolin_LIBRARIES})
        #类似交叉编译的样子
        if (ENABLE_NATIVE_BUILD_OPTIMIZATIONS)
            target_compile_options(${example_name} PUBLIC -O3 -march=native -mtune=native)
        else()
            target_compile_options(${example_name} PUBLIC -O3)
        endif()
    endforeach(example_file ${example_files})
endif()

百度了好多,这里贴出链接.

1.cmake使用示例与整理总结:https://blog.csdn.net/libaineu2004/article/details/78450341

2.CMakeFile命令之file https://blog.csdn.net/bytxl/article/details/48287499

3.target_include_directories https://blog.csdn.net/stanwayll/article/details/72673950

4. CMake命令之export https://www.cnblogs.com/liuzhenbo/p/11186613.html

5.CMake构建系统的骨架 https://www.cnblogs.com/dverdon/p/4574221.html

6.CMakeFile命令之file https://blog.csdn.net/tantion/article/details/84378266

7.   CMake install           https://blog.csdn.net/qq_38410730/article/details/102837401

8.cmake 实战指南 https://www.jianshu.com/p/aaa19816f7ad

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值