对于简单的项目,使用单个文件夹是可以的,但复杂项目往往要按照模块进行拆分,这就需要划分不同的子目录。CMake提供了两种机制来实现这一目标,一个是add_subdirectory()命令,一个是include()命令。这两个命令有很大的区别,一定要仔细区别。
add_subdirectory()命令
add_subdirectory()命令允许项目将另一个目录引入到生成树中。该目录必须有自己的CMakeLists.txt文件,该文件将在调用add_subdirectory()命令时进行处理,并在项目的生成树中为其创建相应的目录。其命令格式为:
add_subdirectory(sourceDir [ binaryDir ] [ EXCLUDE_FROM_ALL ])
其中的sourceDir不必是根源码目录的子目录,尽管通常是这个样子,但实际上可以添加任何目录,sourceDir被指定为绝对路径或相对路径,相对于当前源码目录。只有在添加主源码树之外的目录时,才需要绝对路径。
一般情况下,不需要指定binaryDir。CMake会在生成树中创建一个与sourceDir同名的目录。如果sourceDir是源树之外的路径,那么CMake要求指定binaryDir。
EXCLUDE_FROM_ALL是可选的,控制该子目录定义的构建目标是否添加到all目标中。前面已经提到过很多次了。区别在于有本书上说这个特性对于某些CMake版本或者目标平台,可能会出问题,语焉不详,稍作留心即可。
相关变量
有时,开发人员需要知道与当前源码目录对应的生成目录的位置,例如在运行时复制所需的文件或执行自定义生成任务时。CMake提供了许多变量,用于跟踪当前正在处理的CMakeLists.txt文件的源目录和构建目录。当CMake处理每个文件时,以下几个只读变量将自动更新。它们总是包含绝对路径。
CMAKE_SOURCE_DIR:
源码树的最顶层目录(即主CMakeLists.txt文件位于的位置)