cmake学习记录

目录

一、cmake的基本操作

二、deepin dtkwidget中的CMakeLists.txt


一、cmake的基本操作

 下面的这个CMakeLists.txt 用来做一些简单的操作,并生成可执行的文件test

cmake_minimum_required(VERSION 3.22.1)

#项目的名称是Json 使用c语言
project(Json C)

#如果是GNU OR Clang,则设置下面的编译标志
if(CMAKE_CODEBLOCKS_COMPILER_ID MATCHES "GNU|Clang")
    set(CMAKE_C_FLAGS "-ansi -Wall -pedantic")
endif()


#compile the sjson.c to sjson(is a static library),把sjson.c编译为静态库
add_library(sjson sjson.c)
#test is a executable file,test 是一个可执行的文件
add_executable(test test.c)
# link(ld) sjson to test, 链接静态库
target_link_libraries(test sjson)

二、deepin dtkwidget中的CMakeLists.txt

1、./docs/ 下的CMakeLists.txt

        通过对deepin 的dtkwidget的CMakeLists.txt(./docs/中)进行注释,来学习cmake和doxygen.

        该CMakeLists.txt 中的变量都是与doxygen中的一些变量相对应。可以从得到的cmakedoxyfile.in文件中看到(某些字符串的值我改过,但是改的不多。

#这个文件来源于,deepin 的 dtkwidget
#我注释这个文件的目的是为了学习cmake


#设置cmake 的最低要求的版本
cmake_minimum_required (VERSION 3.10)

#find_package是一个指令,
#它可以用于在不同的搜索模式下查找并载入一个外部包的设置
#REQUIRED指明必须找到
find_package (Doxygen REQUIRED)

#给变量QCH_INSTALL_DESTINATION设置多个值,并通过";"连接起来
#CMAKE_INSTALL_PREFIX为cmake的内置变量,用于指定cmake执行install命令时,
#安装的路径前缀。Linux下的默认路径是/usr/local,当然你也可以用set修改
#CACHE 这个变量是一个缓存变量
#STRING 说明是一个字符串。
#这个变量的描述是"QCH install location",也就是说它表示QCH文件的安装位置。
#以下是newbing告诉我的:这行代码使用了ECMAddQch宏,
#它是一个用于创建QCH格式的API文档手册的目标的宏。
#它目前使用doxygen,未来版本可能也会支持其他工具。
set (QCH_INSTALL_DESTINATION ${CMAKE_INSTALLL_PREFIX}/share/qt5/doc CACHE STRING "QCH install location")

#这下面的变量就好理解了,用于做doxygen的某些变量的值,选着yes or no
set (DOXYGEN_GENERATE_HTML "YES" CACHE STRING "Doxygen HTML output")
set (DOXYGEN_GENERATE_XML "YES" CACHE STRING "Doxygen XML output")
set (DOXYGEN_GENERATE_QHP "YES" CACHE STRING "Doxygen QHP output")
#DOXYGEN_FILE_PATTERNS是一个用于Doxygen的配置选项,
#它可以指定Doxygen要解析的源文件的扩展名
set (DOXYGEN_FILE_PATTERNS *.cpp *.h *.zh_CN.md *.zh_CN.dox CACHE STRING "Doxygen File Patterns")

#newbing:CMAKE_PROJECT_VERSION变量是用于表示最顶层项目的版本的。
#这个变量保存了在最顶层的CMakeLists.txt文件中通过project()命令指定的项目的版本。
#如果最顶层的CMakeLists.txt文件中包含多个project()命令,
#那么最后一个调用的project()命令会决定CMAKE_PROJECT_VERSION变量的值。
set (DOXYGEN_PROJECT_NUMBER ${CMAKE_PROJECT_VERSION} CACHE STRING "") # Should be the same as this project is using.

#这行代码使用了DOXYGEN_EXTRACT_STATIC标签,
#它是一个用于控制doxygen是否提取文件的静态成员的标签,他的值为YES。
set (DOXYGEN_EXTRACT_STATIC YES)
set (DOXYGEN_OUTPUT_LANGUAGE "Chinese" CACHE STRING "Doxygen Output Language")

#CMAKE_CURRENT_LIST_DIR是一个CMake变量,
#它表示当前正在处理的listfile的完整目录。
#listfile是一个包含CMake命令的文本文件,
#通常命名为CMakeLists.txt。
#也就是CMakeLists.txt的路径
set (DOXYGEN_IMAGE_PATH ${CMAKE_CURRENT_LIST_DIR}/images/)

#这行代码使用了DOXYGEN_QHG_LOCATION标签,
#它是一个用于指定Qt的qhelpgenerator的位置(绝对路径包括文件名)的标签。
#qhelpgenerator是一个用于生成Qt帮助文档的工具。
set (DOXYGEN_QHG_LOCATION "qhelpgenerator")

#DOXYGEN_QHP_NAMESPACE是一个用于Doxygen的配置选项,
#它可以指定在生成Qt帮助项目输出时要使用的命名空间
set (DOXYGEN_QHP_NAMESPACE "org.deepin.dtk.widget")

#它可以指定在生成Qt压缩帮助文件时要使用的文件名1。
#Qt压缩帮助文件是一种可以用Qt的qhelpgenerator工具从HTML输出生成的格式,
#它可以在Qt Assistant中查看
set (DOXYGEN_QCH_FILE "dtkwidget.qch")

#DOXYGEN_QHP_VIRTUAL_FOLDER是一个用于Doxygen的配置选项,
#它可以指定在生成Qt帮助项目输出时要使用的虚拟文件夹1。
#虚拟文件夹是一种可以在Qt Assistant中组织文档的方式,
#它可以让文档看起来像是在一个文件夹中,而实际上它们是在一个压缩的文件中
#这个选项需要你把GENERATE_QHP选项设置为YES1
set (DOXYGEN_QHP_VIRTUAL_FOLDER "dtkwidget")

#DOXYGEN_HTML_EXTRA_STYLESHEET是一个配置变量,
#它指定了一个或多个自定义的样式表文件,
#用于改变Doxygen生成的HTML文档的外观23。
#在这个命令中,DOXYGEN_HTML_EXTRA_STYLESHEET被设置为空字符串,
#表示不使用任何自定义样式表。
#CACHE STRING表示这个变量可以被用户或者其他CMake脚本修改
set (DOXYGEN_HTML_EXTRA_STYLESHEET "" CACHE STRING "Doxygen custom stylesheet for HTML output")

#它允许你指定一个或多个标签文件,用于链接到外部文档12。
#标签文件包含了外部项目的结构和引用信息,
#可以用于生成交叉引用和模块文档
set (DOXYGEN_TAGFILES "qtcore.tags=qthelp://org.qt-project.qtcore/qtcore/" CACHE STRING "Doxygen tag files")

#DOXYGEN_PREDEFINED是一个用于Doxygen的预处理选项,
#它可以定义一些宏,让Doxygen在解析源文件时使用
set (DOXYGEN_PREDEFINED
    "D_DECL_DEPRECATED_X(x)="
    "DCORE_BEGIN_NAMESPACE=namespace Dtk { namespace Core {"
    "DCORE_END_NAMESPACE=}}"
    "DCORE_USE_NAMESPACE=using namespace Dtk::Core;"
    "DWIDGET_BEGIN_NAMESPACE=namespace Dtk { namespace Widget {"
    "DWIDGET_END_NAMESPACE=}}"
    "DWIDGET_USE_NAMESPACE=using namespace Dtk::Widget;"
)

#是否设置doxygen主题
set (BUILD_THEME OFF CACHE BOOL "Build doxgen theme")
#如果设置
if(BUILD_THEME)
#如果设置,查找是否存在该路径
if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/doxygen-theme")
# 打印消息 。STATUS = 非重要消息;
#为了使得代码不太难看,所以execute_process的注释写这里。
#execute_process是一个CMake命令,
#它可以在CMake配置项目的时候运行一些命令,
#而不是在生成构建系统或者构建项目的时候
#COMMAND:指定要运行的子进程的命令行。
#你可以指定多个COMMAND参数,每个COMMAND参数会启动一个新的子进程1。
#WORKING_DIRECTORY:指定子进程运行时的工作目录1。
#TIMEOUT:指定子进程运行的最大时间(以秒为单位)1。
#如果超过这个时间,子进程会被终止,并且返回一个错误码
#execute_process命令会在当前目录下运行
#git clone https://github.com/linuxdeepin/doxygen-theme.git --depth=1这个命令,
#并且限制它在60秒内完成。这个命令的作用是从github上克隆doxygen-theme这个项目,
#并且只获取最新的一次提交记录
message(STATUS "doxygen-theme exist")
else() 
execute_process(COMMAND git clone https://github.com/linuxdeepin/doxygen-theme.git --depth=1
        WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
        TIMEOUT 60
    )

#这个命令就简单了,在下面说明的目录,运行脚本
execute_process(COMMAND bash themesetting.sh
        WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/doxygen-theme/
)
endif()#if 存在文件

#它可以让你指定一个或多个额外的CSS文件来自定义Doxygen生成的HTML文档的样式。
#你可以在这些CSS文件中覆盖或者添加一些你喜欢的样式设置1。
#有些人也制作了一些现成的CSS主题,比如doxygen-awesome-css3,
#你可以尝试使用它们来美化你的文档。
set (DOXYGEN_HTML_EXTRA_STYLESHEET "doxygen-theme/doxygen-awesome-css/doxygen-awesome.css"
                                "doxygen-theme/doxygen-awesome-css/doxygen-awesome-sidebar-only.css"
                                "doxygen-theme/doxygen-awesome-css/doxygen-awesome-sidebar-only-darkmode-toggle.css"
                                )

#它可以让你指定一个或多个额外的图片或者其他源文件,
#这些文件会被复制到HTML输出目录中。
#你可以在你的文档中引用这些文件,
#比如作为背景图片或者图标。
#注意,这些文件会被复制到HTML输出目录的根目录下,
#而不是子目录2
set (DOXYGEN_HTML_EXTRA_FILES "doxygen-theme/doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js"
                            "doxygen-theme/doxygen-awesome-css/doxygen-awesome-fragment-copy-button.js"
                            "doxygen-theme/doxygen-awesome-css/doxygen-awesome-paragraph-link.js"
                            "doxygen-theme/doxygen-awesome-css/doxygen-awesome-interactive-toc.js"
                            )

#它可以让你控制是否在HTML输出中生成一个树形视图的导航菜单1。
#如果设置为YES,
#那么HTML输出中会有一个展开和折叠的树形结构,
#显示文档中的类、文件、命名空间等1。如果设置为NO,
#那么HTML输出中只会有一个普通的HTML链接列表1。
#这个选项可以帮助你更方便地浏览和查找文档内容。
set (DOXYGEN_GENERATE_TREEVIEW "YES")
#它可以让你控制是否在每个HTML页面的顶部生成一个简化的索引(标签)。
#如果设置为YES,
#那么HTML输出中不会有索引标签,
#只会有一个主页链接1。如果设置为NO,
#那么HTML输出中会有多个索引标签,
#比如文件索引、类索引、命名空间索引等1。
#这个选项可以帮助你调整文档的外观和导航方式。
set (DOXYGEN_DISABLE_INDEX "NO")

#它可以让你控制是否在HTML输出中生成一个完整的侧边栏。
#如果设置为YES,
#那么HTML输出中会有一个固定的侧边栏,
#显示文档的标题、导航菜单和搜索框。
#如果设置为NO,那么HTML输出中只会有一个可折叠的导航菜单。
#这个选项可以帮助你改善文档的布局和交互性。
set (DOXYGEN_FULL_SIDEBAR "NO")
set (DOXYGEN_HTML_HEADER "doxygen-theme/doxygen-awesome-css/header.html")
set (DOXYGEN_HTML_FOOTER "doxygen-theme/doxygen-awesome-css/footer.html")
endif()#if bool

#它可以让你控制是否在解析源文件之前对宏进行展开。
#如果设置为YES,那么Doxygen会使用内置的C预处理器来展开所有的宏定义,
#并将展开后的文本作为输入。
#如果设置为NO,那么Doxygen只会对条件编译语句(如#if)和宏定义进行评估,
#但不会进行宏展开。
#这个选项可以帮助你处理一些使用宏来生成文档的情况。
set (DOXYGEN_MACRO_EXPANSION "YES")

#它可以让你控制是否只对预定义的宏进行展开。
#如果设置为YES,
#那么Doxygen只会对PREDEFINED选项中列出的宏进行展开,
#而忽略其他的宏。如果设置为NO,
#那么Doxygen会对所有的宏进行展开,
#除非使用SKIP_FUNCTION_MACROS选项来排除一些函数式的宏。
#这个选项可以帮助你避免一些不需要展开的宏影响文档的生成
set (DOXYGEN_EXPAND_ONLY_PREDEF "YES")

# Exclude private classes.
#用于指定在Doxygen中排除某些文件和目录的模式
#PROJECT_SOURCE_DIR是CMake的一个内置变量,
#它代表最近一次调用project()命令的源目录。
#也就是说,它是包含project()的CMakeLists.txt文件所在的文件夹。
#例如,如果你有一个名为Foo的项目,它的CMakeLists.txt文件在/home/user/foo目录下,
#并且里面有一行project(Foo),
#那么PROJECT_SOURCE_DIR就是/home/user/foo
set(DOXYGEN_EXCLUDE_PATTERNS
    ${PROJECT_SOURCE_DIR}/src/widgets/private/dimageviewer_p.h
    ${PROJECT_SOURCE_DIR}/src/widgets/private/dimagevieweritems_p.h
    ${PROJECT_SOURCE_DIR}/src/widgets/private/dsplitscreen_p.h
    ${PROJECT_SOURCE_DIR}/src/widgets/dimagevieweritems.cpp
)

#doxygen_add_docs是CMake的一个命令,
#它可以用来生成Doxygen文档。Doxygen是一个工具,
#它可以从源代码中提取注释,
#并生成HTML、PDF等格式的文档。
#你可以用doxygen_add_docs来指定要生成文档的源文件、输出目录、配置文件等参数
#这是一个合法的CMake命令,
#它会生成一个名为doxygen的目标,
#它会从${PROJECT_SOURCE_DIR}/src、
#${PROJECT_SOURCE_DIR}/include和${PROJECT_SOURCE_DIR}/docs
#目录下的所有源文件中提取注释,
#并输出到${CMAKE_CURRENT_BINARY_DIR}目录下。
#由于指定了ALL参数,
#这个目标会在每次构建时自动执行。WORKING_DIRECTORY参数指定了Doxygen运行时的工作目录。
#COMMENT参数指定了构建时显示的信息。
doxygen_add_docs (doxygen
    ${PROJECT_SOURCE_DIR}/src
    ${PROJECT_SOURCE_DIR}/include
    ${PROJECT_SOURCE_DIR}/docs
    ALL
    WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
    COMMENT "Generate documentation via Doxygen"
)

#它会在安装时将${PROJECT_BINARY_DIR}/docs/html/dtkwidget.qch文件
#复制到${QCH_INSTALL_DESTINATION}目录下。dtkwidget.qch可能是一个Doxygen生成的Qt帮助文档。
#${QCH_INSTALL_DESTINATION}可能是一个自定义变量,它指定了Qt帮助文档的安装位置
install (FILES ${PROJECT_BINARY_DIR}/docs/html/dtkwidget.qch DESTINATION ${QCH_INSTALL_DESTINATION})

2、./  下的CMakeLists.txt 是用来编译整个项目的。

cmake_minimum_required(VERSION 3.10)

#dtkwidget 版本
set(VERSION
    "5.6.8"
    CACHE STRING "define project version"
)

#一个名为 DtkWidget 的项目,指定了它的版本号、描述、主页和使用的语言
project(DtkWidget
    VERSION ${VERSION}
    DESCRIPTION "DTK Widget module"
    HOMEPAGE_URL "https://github.com/linuxdeepin/dtkwidget"
    LANGUAGES CXX C
)

#设置
set(LIB_NAME dtkwidget)

#在指定安装路径时,应当使用变量而非写死安装目录,
#以便于在不完全符合 FHS 的系统上安装,提高程序的可移植性。
include(GNUInstallDirs)

#用于创建和安装一个包配置文件,
#以便其他项目可以使用find_package()命令找到和使用这个包
include(CMakePackageConfigHelpers)

#CMAKE_INCLUDE_CURRENT_DIR是一个CMake的变量,
#它可以控制是否把当前的源代码目录和生成目录添加到头文件的搜索路径中。
#如果你把它设置为ON,
#那么每个有CMakeLists.txt文件的目录里面创建的目标(比如库或者可执行文件)
#都会自动把这两个目录加到它们的INCLUDE_DIRECTORIES属性里面。
#这样就可以方便地在源代码中使用
#include指令来引用同一个目录或者上级目录中的头文件。
set(CMAKE_INCLUDE_CURRENT_DIR ON)

#用于控制是否生成一个名为compile_commands.json的文件,
#它包含了所有编译单元的编译命令。
#这个文件可以被一些工具或者编辑器使用,
#以提供更好的代码分析和补全功能。默认值是OFF,
#如果设置为ON,那么在每个生成目录中都会创建这个文件。
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

#用于控制是否自动运行Qt的moc工具来处理带有Q_OBJECT宏的头文件。
#moc工具可以生成一些元对象代码,以支持Qt的信号和槽机制。
#默认值是OFF,如果设置为ON,那么CMake会扫描所有的源文件和头文件,
#找出需要moc处理的文件,
#并自动为它们生成一个额外的编译目标。
set(CMAKE_AUTOMOC ON)

#用于控制是否自动运行Qt的rcc工具来处理资源文件
set(CMAKE_AUTORCC ON)

#c++11 标准
set(CMAKE_CXX_STANDARD 11)
#必须11标准
set(CMAKE_CXX_STANDARD_REQUIRED ON)

if(UNIX AND NOT APPLE)
    set(LINUX TRUE)
endif()

# Set build option  想干嘛?
set(BUILD_PLUGINS
    ON
    CACHE BOOL "Build plugin and plugin example"
)

# Set install path
#用于指定安装路径,if判断是说有没有初始化为默认值
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
    set(CMAKE_INSTALL_PREFIX /usr)
endif()

#用于指定单配置生成器(例如Makefile或者Ninja)的构建类型。
#常见的值包括Debug、Release、RelWithDebInfo和MinSizeRel,
#但也可以自定义构建类型1。这个变量会在第一次创建一个新的构建树时,
#由第一个project()或者enable_language()命令初始化1。
#不同的构建类型会影响编译器的优化选项和调试符号
if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release)
endif()

#CMAKE_INSTALL_INCLUDEDIR是一个CMake变量,
#用于指定头文件的安装目录。这个变量的默认值是include
#PROJECT_VERSION_MAJOR 是一个变量,它表示项目版本的第一个数字,由 project () 命令设置
set(INCLUDE_INSTALL_DIR
    "${CMAKE_INSTALL_INCLUDEDIR}/dtk${PROJECT_VERSION_MAJOR}/DWidget"
)

#CMAKE_INSTALL_LIBDIR 是一个变量,
#它表示安装项目时目标代码库 (即静态库和动态库)所在的子目录
set(TOOL_INSTALL_DIR
    "${CMAKE_INSTALL_LIBDIR}/dtk${PROJECT_VERSION_MAJOR}/DWidget/bin"
)
set(LIBRARY_INSTALL_DIR
    "${CMAKE_INSTALL_LIBDIR}"
)

#Install dir for qt pri files
set(MKSPECS_INSTALL_DIR
    "${CMAKE_INSTALL_LIBDIR}/qt5/mkspecs/modules"
    CACHE STRING "Install dir for qt pri files"
)

#Install directory for cmake files
set(CONFIG_INSTALL_DIR
    "${CMAKE_INSTALL_LIBDIR}/cmake/DtkWidget"
    CACHE STRING "Install directory for cmake files"
)

#Install directory for pkgconfig files
set(PKGCONFIG_INSTALL_DIR
    "${CMAKE_INSTALL_LIBDIR}/pkgconfig"
    CACHE STRING "Install directory for pkgconfig files"
)

#CMAKE_CXX_FLAGS 是一个变量,它表示编译 C++ 文件时使用的默认编译选项。
#它的初始值是从 CXXFLAGS 环境变量中获取的,
#但是你也可以在 CMakeLists.txt 文件中修改它,下面就修改了
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -Wall -Wextra")

#CMAKE_SHARED_LINKER_FLAGS 是一个变量,
#它表示链接共享库时使用的链接器选项。
#这些选项会在创建共享库时传递给链接器。
#你可以在 CMakeLists.txt 文件中修改这个变量,
#或者通过命令行参数传递给 cmake 命令。
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--as-needed")

#strequal  字符串是否相等
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
    set(BUILD_TESTING ON)
else()
    #不等时,编译选项加一个这个
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Ofast")
endif()
# find_package

#用于在CMake项目中查找并导入Dtk库的Core和Gui模块
find_package(Dtk REQUIRED COMPONENTS Core Gui)
#在CMake项目中查找并导入Qt5库的Core模块
find_package(QT NAMES Qt5 REQUIRED COMPONENTS Core)

#这段代码的意思是在CMake项目中查找并导入Qt5库的以下模块123:
#Core: 提供了一些基础的类和功能,例如字符串、容器、事件循环、输入输出等。
#Network: 提供了一些网络编程的类和功能,例如TCP/IP、UDP、HTTP、FTP等。
#Concurrent: 提供了一些并发编程的类和功能,例如线程、线程池、异步操作等。
#Widgets: 提供了一些图形界面编程的类和功能,例如窗口、按钮、文本框等。
#PrintSupport: 提供了一些打印相关的类和功能,例如打印机设置、打印预览等。
#LinguistTools: 提供了一些国际化相关的类和功能,例如翻译文件生成、加载等。
#X11Extras: 提供了一些针对X11平台的额外类和功能,例如键盘符号映射等。
#DBus: 提供了一些与DBus通信相关的类和功能,例如发送和接收消息等
find_package(Qt5 REQUIRED COMPONENTS
    Core
    Network
    Concurrent
    Widgets
    PrintSupport
    LinguistTools
    X11Extras
    DBus
)

find_package(PkgConfig REQUIRED)

#file是一个CMake命令,
#用于执行一些文件相关的操作,例如读取、写入、复制、重命名等
#GLOB是一个file命令的参数,
#用于根据指定的模式来查找匹配的文件路径,并返回一个列表
file(GLOB D_HEADERS "${PROJECT_SOURCE_DIR}/include/DWidget/*")

#一个配置文件
set(AUTOCONFIG ${CMAKE_CURRENT_BINARY_DIR}/dtkwidget_config.h)

#get_filename_component是一个CMake命令,
#用于从一个文件路径中提取一些组成部分,例如目录、文件名、扩展名等。
#CONFIG_INCLUDE是一个变量名,可以在后续的代码中使用。
#${AUTOCONFIG}是一个变量名,表示一个文件路径
#DIRECTORY是一个get_filename_component命令的参数,
#用于指定要提取的文件路径的组成部分。
#DIRECTORY表示要提取文件路径的目录部分,
#即去掉最后一级的文件名或子目录。
#如果${AUTOCONFIG}的值是/home/user/project/config.h,
#则get_filename_component(CONFIG_INCLUDE ${AUTOCONFIG} DIRECTORY)会将
#/home/user/project赋值给CONFIG_INCLUDE。
get_filename_component(CONFIG_INCLUDE ${AUTOCONFIG} DIRECTORY)
set(CONFIG_CONTENT)

#使用string命令和APPEND参数来将一个字符串追加到一个变量的值后面,
#并将结果赋值给该变量,将后面的字符串append到CONFIG_CONTENT
string(APPEND CONFIG_CONTENT "// This is an auto-generated config\n")

#foreach是一个CMake命令,用于遍历一个列表,
#并对每个元素执行一些操作。
#它可以接受一个或多个参数,第一个参数是一个变量名,
#表示要遍历的列表中的每个元素,后面的参数是要执行的操作。
#endforeach表示遍历结束

#NAME是一个get_filename_component命令的参数,
#用于指定要提取的文件路径的组成部分。
#NAME表示要提取文件路径的文件名部分,即去掉目录和扩展名
foreach(header ${D_HEADERS})
    get_filename_component(thename ${header} NAME)
    string(APPEND CONFIG_CONTENT "#define DTKWIDGET_CLASS_${thename}\n")
endforeach()

#它的作用是将变量 CONFIG_CONTENT 
#的内容写入到一个由变量 AUTOCONFIG 命名的文件中
file(WRITE ${AUTOCONFIG} ${CONFIG_CONTENT})

#这个命令是 CMake 脚本中的一个命令,
#它的作用是将所有匹配 "${PROJECT_SOURCE_DIR}/include/.h” 
#这个模式的文件组成一个列表,并将其保存到变量 PUBLIC_HEADERS 中。
#这可以用于方便地收集工程中的头文件,而不用逐个指定
file(GLOB_RECURSE PUBLIC_HEADERS "${PROJECT_SOURCE_DIR}/include/*.h")

#它的作用是将变量 D_HEADERS 和 AUTOCONFIG 的值添加
#到变量 PUBLIC_HEADERS 的末尾。
#这可以用于将多个头文件列表合并到一个变量中,方便后续操作
list(APPEND PUBLIC_HEADERS ${D_HEADERS} ${AUTOCONFIG})

#它的作用是将 src 目录下的 CMakeLists.txt 和代码文件加入到构建中。
#这样可以将一个大型工程分成多个子目录,
#每个子目录有自己的 CMakeLists.txt 文件,方便管理和维护
add_subdirectory(src)
add_subdirectory(examples)
add_subdirectory(tools)

if(BUILD_TESTING)
    message("==================================")
    message("      Now Testing is enabled      ")
    message("==================================")
    #enable_testing() 这个命令是 CMake 脚本中的一个开启测试功能的语句,
    #它的作用是告诉 CMake 生成一个 test 目标,可以用来运行测试程序
    enable_testing()
    add_subdirectory(tests)
endif()

if(BUILD_PLUGINS)
    message("===================================")
    message(" You can build and run plugins now ")
    message("===================================")
    add_subdirectory(plugin)
endif()


# 这个命令是 CMake 脚本中的一个设置变量的语句,
#它的作用是将变量 BUILD_DOCS 的值设为 ON,
#并将其存储在 CMakeCache.txt 文件中。
#这样可以让用户在第一次运行 CMake 时,
#通过修改 CMakeCache.txt 文件来改变变量的值
set(BUILD_DOCS
    ON
    CACHE BOOL "Generate doxygen-based documentation"
)

if(BUILD_DOCS)
    add_subdirectory(docs)
endif()
#到这里我好像有点明白add_subdirectory  了,这就是./ 下的cmake txt 调用 ./docs 下的cmake txt

#configure_package_config_file函数的第一个参数是一个输入文件,
#它是一个模板文件,里面包含了一些变量,
#比如@TOOL_INSTALL_DIR@。这些变量会被替换成实际的值,
#比如${TOOL_INSTALL_DIR}。第二个参数是一个输出文件,
#它是生成的配置文件的名字和位置。第三个参数是安装目标,
#它指定了配置文件应该被安装到哪个目录。第四个参数是路径变量,
#它指定了哪些变量需要被转换成相对路径。
configure_package_config_file(
    misc/DtkWidgetConfig.cmake.in
    ${CMAKE_CURRENT_BINARY_DIR}/DtkWidgetConfig.cmake
    INSTALL_DESTINATION ${CONFIG_INSTALL_DIR}
    PATH_VARS TOOL_INSTALL_DIR
)

#这段代码的作用是生成一个名为DtkWidgetConfigVersion.cmake的文件,
#这个文件包含了DtkWidget库的版本信息,
#比如版本号和兼容性策略。
#这个文件可以让其他项目使用find_package(DtkWidget)命令时检查版本是否匹配
write_basic_package_version_file(
    ${CMAKE_CURRENT_BINARY_DIR}/DtkWidgetConfigVersion.cmake
    VERSION ${VERSION}
    COMPATIBILITY SameMajorVersion
)


#install命令是一个CMake函数,
#它可以用来安装文件、目录、程序、库等到指定的位置。
#它有很多选项和参数,
#可以控制安装的细节,比如权限、组件、目标等
#这段代码的作用是安装前两段生成的配置文件到指定的目录。
#这样,其他项目就可以在安装目录下找到并使用这些配置文件。
install(FILES
    ${CMAKE_CURRENT_BINARY_DIR}/DtkWidgetConfig.cmake
    ${CMAKE_CURRENT_BINARY_DIR}/DtkWidgetConfigVersion.cmake
    DESTINATION ${CONFIG_INSTALL_DIR}
)

#这段代码的作用是生成一个名为dtkwidget.pc的文件,
#这个文件是一个pkg-config文件,
#它包含了一些关于DtkWidget库的元数据,
#比如名称、版本、描述、依赖等。
#这个文件可以让其他项目使用pkg-config命令来找到并链接这个库
#@ONLY是一个选项,它表示只有@VAR@形式的变量会被替换,
#而不是${VAR}或者${VAR}形式的变量。
#这样可以避免和pkg-config文件中的变量冲突。
configure_file(misc/dtkwidget.pc.in dtkwidget.pc @ONLY)
#这个命令的作用是将 dtkwidget.pc 文件
#从当前构建目录复制到 PKGCONFIG_INSTALL_DIR 目录中。
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/dtkwidget.pc DESTINATION ${PKGCONFIG_INSTALL_DIR})

configure_file(misc/qt_lib_dtkwidget.pri.in qt_lib_dtkwidget.pri @ONLY)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/qt_lib_dtkwidget.pri DESTINATION ${MKSPECS_INSTALL_DIR})

你可能感兴趣的:(c++&c,学习,linux)