Are CMAKE_SOURCE_DIR and PROJECT_SOURCE_DIR the same in CMake?

This page contains a good summary of variables CMake already defines for us. I feel that some variables are the same. Take the example of CMAKE_SOURCE_DIR and PROJECT_SOURCE_DIR for example. They are the same, referring to the folder where the top level CMakeLists.txt is defined. So my question is: are there subtle difference between them? Thanks.

52256 次浏览

这些变量之间有一个差异。CMAKE_SOURCE_DIR确实引用了定义顶级 CMakeLists.txt 的文件夹。但是,PROJECT_SOURCE_DIR引用包含最新 project()命令的 CMakeLists.txt 文件夹。

例如,假设您有一个名为 Outer的顶级项目,该项目包含一个子目录,其中有一个名为 Inner的项目。Outer的 CMakeLists.txt 有:

project(Outer)
add_subdirectory(Inner)

以及 Inner:

project(Inner)

然后在这两个 CMakeList 文件中,CMAKE_SOURCE_DIR将引用 Outer的源目录。但是,虽然 OuterPROJECT_SOURCE_DIR也是同样的 dir,但是 Inner的情况并非如此。InnerPROJECT_SOURCE_DIR是包含其 CMakeLists.txt 的子目录。

这种差异适用于所有 PROJECT_<var>CMAKE_<var>变量。

按照弗雷泽的绝妙回答。

CMAKE _ CURRENT _ SOURCE _ DIR the build directory being processed

假设您有一个名为 Inner1的目录,其中包含一个 CMakeLists.txt 文件,而不在其中调用 project。然后,不用 Inner1的目录路径设置 PROJECT_SOURCE_DIR,但是在处理时设置 CMAKE_CURRENT_SOURCE_DIR

您可能还会发现 CMAKE _ CURRENT _ LIST _ DIR很有趣,Listfile的定义也很有用。