区分PROJECT_SOURCE_DIR, CMAKE_SOURCE_DIR,CMAKE_CURRENT_SOURCE_DIR
目录
示例工程
PROJECT_SOURCE_DIR的行为
CMAKE_SOURCE_DIR的行为
CMAKE_CURRENT_SOURCE_DIR
示例工程
根目录
|-----CMakeLists.txt
|-----sub1
|--------CMakeLists.txt
|-----sub2
|--------CMakeLists.txt
根目录下的CMakeList.txt:
project(main)message("main CMAKE_SOURCE_DIR = ${CMAKE_SOURCE_DIR}")
message("main CMAKE_CURRENT_SOURCE_DIR = ${CMAKE_CURRENT_SOURCE_DIR}")
message("main PROJECT_SOURCE_DIR = ${PROJECT_SOURCE_DIR}")add_subdirectory(sub1)
add_subdirectory(sub2)
sub1目录下的CMakeLists.txt
project(sub1)message("sub1 CMAKE_SOURCE_DIR = ${CMAKE_SOURCE_DIR}")
message("sub1 CMAKE_CURRENT_SOURCE_DIR = ${CMAKE_CURRENT_SOURCE_DIR}")
message("sub1 PROJECT_SOURCE_DIR = ${PROJECT_SOURCE_DIR}")
sub2目录下的CMakeLists.txt
message("sub2 CMAKE_SOURCE_DIR = ${CMAKE_SOURCE_DIR}")
message("sub2 CMAKE_CURRENT_SOURCE_DIR = ${CMAKE_CURRENT_SOURCE_DIR}")
message("sub2 PROJECT_SOURCE_DIR = ${PROJECT_SOURCE_DIR}")
sub1与sub2的CMakeLists的区别仅仅在于开头有没有使用project命令
PROJECT_SOURCE_DIR的行为
在根目录下运行cmake .
PROJECT_SOURCE_DIR的取值受两个因素影响:1所在目录 ,2所在的CMakeLists.txt有没有调用project命令
从打印结果可以看出来:
1 根目录下的CMakeLists.txt的PROJECT_SOURCE_DIR等于根目录路径;
2 如果不在根目录下,而是在子目录下,则:
2.1 如果子目录的CMakeLists.txt使用了project命令,则PROJECT_SOURCE_DIR等于当前子目录路径;
2.2 如果子目录的CMakeLists.txt没有使用project命令,则PROJECT_SOURCE_DIR等于上一层CMakeLists.txt的PROJECT_SOURCE_DIR
CMAKE_SOURCE_DIR的行为
不论CMakeLists在根目录还是子目录,也不论CMakeLists.txt里面有没有调用project函数,CMAKE_SOURCE_DIR都等于根目录路径
CMAKE_CURRENT_SOURCE_DIR
不论CMakeLists在根目录还是子目录,也不论CMakeLists.txt里面有没有调用project函数,CMAKE_CURRENT_SOURCE_DIR都等于当前目录路径