Boost.CMake的 CMake结构分析

Boost 库文件另外还有一个实验性质的CMake构建版本, 被单独的发布版本并且维护, 被称为 Boost.CMake.  关于Boost.CMake, 可以参考其介绍:

https://svn.boost.org/trac10/wiki/CMake 


Boost.CMake的Github 项目网址为: https://github.com/boost-cmake/boost , 打开网址, 即可以下载压缩包源码库。解压后既可以看见其CMakeLists.txt 的文件结构。


1. CMake 的项目文件结构如下:


CMakeLists.txt (root project)
|__ bcm
|__ boost (this folder is created after executing the  bootstrap.bat and b2.exe in sequence)
|__ doc
|__ ...
|__ libs
|   |__ sub_dir-1
|   |       |__ CMakeLists.txt (sub-project)
|   |       |__ include-folder
|   |       |__ Src (optional, header-only libraries haven't this folder)
|   |       |__ unitTest-folder
|   |
|   |__ sub_dir-2
|   |       |__ CMakeLists.txt (sub-project)
|   |       |__ include-folder
|   |       |__ Src (optional, header-only libraries haven't this folder)
|   |       |__ unitTest-folder
|   |
|   |__ sub_dir-3
|   |       |__ CMakeLists.txt (sub-project)
|   |       |__ include-folder
|   |       |__ Src (optional, header-only libraries haven't this folder)
|   |       |__ unitTest-folder
|   |...
|__ ...


由此可以看出,CMakeLists.txt 文件是分层次的, 顶层 root project上有一个CMakeList, 主要是组织CMake的build结构。

其内容如下:

cmake_minimum_required(VERSION 3.5)
project(boost)

macro(find_package NAME)
    if(NOT "${NAME}" MATCHES "^boost_.*$" AND NOT "${NAME}" STREQUAL BCM)
        _find_package(${ARGV})
    else()
        set(${ARGV0}_FOUND ON CACHE BOOL "")
    endif()
endmacro()

include(bcm/share/bcm/cmake/BCMConfig.cmake)

set(EXCLUDE_LIBS)

find_package(PythonLibs)
if(NOT PythonLibs_FOUND)
    list(APPEND EXCLUDE_LIBS python)
endif()

find_package(PythonLibs)
if(NOT PythonLibs_FOUND)
    list(APPEND EXCLUDE_LIBS python)
endif()

find_package(MPI)
if(NOT MPI_FOUND)
    list(APPEND EXCLUDE_LIBS mpi )
endif()

file(GLOB_RECURSE LIBS libs/*CMakeLists.txt)
foreach(lib ${LIBS})
    file(READ ${lib} CONTENT)
    if("${CONTENT}" MATCHES "project\\(")
        get_filename_component(LIB_DIR ${lib} DIRECTORY)
        get_filename_component(LIB_NAME ${LIB_DIR} NAME)
        if(NOT "${LIB_NAME}" IN_LIST EXCLUDE_LIBS)
            add_subdirectory(${LIB_DIR})
        endif()
    endif()
endforeach()

主要就是:

1. 定义了对CMake的所要求的最低版本

2. 项目名定义为 boost

3. 定义 find_package 的同名宏

4. 包含BCMConfig.cmake 并且执行

5. 检查PythonLibs  和 MPI 库是否能找到, 如不能找到则将其添加入EXCLUDE_LIBS 列表变量, 在后面将不会加入工程构建

6. 查找 目录 libs/ 以及其子目录下的所有的*CMakeLists.txt文件 , 如

你可能感兴趣的:(CMake,CMake,BOOST.CMAKE,Header-only,Library,INTERFACE,Library)