cmake中PROJECT_SOURCE_DIR的遐思
https://blog.csdn.net/random_repick/article/details/70045677
刀么克瑟拉莫 2017-04-11 10:23:00
PROJECT_SOURCE_DIR为包含PROJECT()的最近一个CMakeLists.txt文件所在的文件夹。
如以下文件结构:

test/CMakeLists.txt文件内容为
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(test)
ADD_SUBDIRECTORY(src)
test/src/CMakeLists.txt文件内容为
CMAKE_MINIMUM_REQUIRED(VERSION 2.8) #PROJECT(main)
在build中执行cmake ..(两个小数点别丢了)则PROJECT_SOURCE_DIR的值为(parent_path)/test,
取消#PROJECT(main)的注释,PROJECT_SOURCE_DIR的值为(parent_path)/test/src
=======================================================================
=======================================================================
CMAKE_CURRENT_SOURCE_DIR和CMAKE_CURRENT_LIST_DIR之间的区别
时间 2018-08-24
原文 https://stackoverflow.com/questions/15662497/difference-between-cmake-current-source-dir-and-cmake-current-list-dir
来自维基:
CMAKE_CURRENT_SOURCE_DIR
这是当前处理的CMakeLists.txt所在的目录
CMAKE_CURRENT_LIST_DIR
(自2.8.3开始)这是当前正在处理的列表文件的目录.
来自Docs:
CMAKE_CURRENT_SOURCE_DIR:当前正在处理的源目录的路径.
这是cmake当前正在处理的源目录的完整路径.
CMAKE_CURRENT_LIST_DIR:当前正在处理的列表文件的完整目录.
当CMake处理项目中的列表文件时,该变量将始终设置为当前正在处理的列表文件(CMAKE_CURRENT_LIST_FILE)所在的目录.该值具有动态范围.当CMake开始处理源文件中的命令时,它将此变量设置为此文件所在的目录.当CMake完成处理来自文件的命令时,它将恢复先前的值.因此,宏或函数内部变量的值是调用调用堆栈上最底部条目的文件的目录,而不是包含宏或函数定义的文件的目录.
在什么情况下这些变量会有不同的价值?
变量
CMAKE_CURRENT_SOURCE_DIR
和
CMAKE_CURRENT_LIST_DIR
可以指代由具有
include命令的不同文件包括的CMake列表文件的不同目录.例如,如果目录项目中存在CMakeLists.txt并且包含以下指令
include(src/CMakeLists.txt)
然后在处理src/CMakeLists.txt时,CMAKE_CURRENT_LIST_DIR将引用project / src,而CMAKE_CURRENT_SOURCE_DIR仍然指向外部目录项目.
当您需要找到当前正在处理的CMakeLists.txt文件旁边的模板文件或批处理脚本等资源文件时,CMAKE_CURRENT_LIST_DIR会派上用场.
==========================================================================
==========================================================================
CMake中的CMAKE_SOURCE_DIR和PROJECT_SOURCE_DIR是否相同?
http://www.voidcn.com/article/p-hfpsoipx-btw.html
时间 2018-11-08
原文 https://stackoverflow.com/questions/32028667/are-cmake-source-dir-and-project-source-dir-the-same-in-cmake
This page包含一个很好的摘要,CMake已经为我们定义了变量.我觉得有些变量是一样的.以CMAKE_SOURCE_DIR和PROJECT_SOURCE_DIR为例.它们是相同的,指的是定义顶级CMakeLists.txt的文件夹.所以我的问题是:他们之间有微妙的区别吗?谢谢.
这些变量之间有差异.
CMAKE_SOURCE_DIR
确实是指
定义了顶级CMakeLists.txt的文件夹.但是,
PROJECT_SOURCE_DIR
是指
包含最近的project()命令的CMakeLists.txt的文件夹.
例如,假设你有一个名为Outer的顶级项目,它包含一个子目录,其自己的项目叫做Inner.外面的CMakeLists.txt有:
project(Outer)
add_subdirectory(Inner)
和内在的:
然后在这两个CMakeLists文件中,CMAKE_SOURCE_DIR将引用Outer的源目录.但是外部PROJECT_SOURCE_DIR也是同一个目录,而Inner并不是这样. Inner的PROJECT_SOURCE_DIR是包含其CMakeLists.txt的子目录.
该差异适用于所有PROJECT_< var> vs CMAKE_< var>变量.