CMakeLists.txt文件中如何获取当前目录和父目录?
1 获取当前目录
方法1:PROJECT_SOURCE_DIR
方法2:CMAKE_CURRENT_SOURCE_DIR
2 获取父目录
方法1:利用字符串正则表达式替换
方法2:利用命令get_filename_component
3 示例
有一个project名为t2,绝对路径:/home/xxw/dev/linux_learning/cmake_pratice/t2
t2的文件夹结构如下:
t2下有子目录doc和 src,以及文件CMakeLists.txt。
子目录src目录下有源文件CMakeLists.txt,main.c。
子目录src下的CMakeLists.txt的文件内容如下:
MESSAGE(STATUS "可执行程序的目录(绝对路径):" ${PROJECT_BINARY_DIR})
MESSAGE(STATUS "当前目录(绝对路径):" ${PROJECT_SOURCE_DIR})
MESSAGE(STATUS "当前文件的绝对路径(含文件名):" ${CMAKE_CURRENT_LIST_FILE})
MESSAGE(STATUS "当前目录的绝对路径(不含文件名):" ${CMAKE_CURRENT_SOURCE_DIR})
# 删除末尾的'/'
string(REGEX REPLACE "/$" "" CURRENT_FOLDER_ABSOLUTE ${CMAKE_CURRENT_SOURCE_DIR})
MESSAGE(STATUS "当前目录的绝对路径:" ${CURRENT_FOLDER_ABSOLUTE})
# 获取当前目录的相对路径
string(REGEX REPLACE ".*/(.*)" "\\1" CURRENT_FOLDER ${CURRENT_FOLDER_ABSOLUTE})
MESSAGE(STATUS "当前目录名:" ${CURRENT_FOLDER})
# 方法1 获取父目录的绝对路径
string(REGEX REPLACE "(.*)/${CURRENT_FOLDER}$" "\\1" PARENT_FOLDER_ABSOLUTE ${CURRENT_FOLDER_ABSOLUTE})
MESSAGE(STATUS "方法1 父目录的绝对路径:" ${PARENT_FOLDER_ABSOLUTE})
# 方法2 获取父目录的绝对路径
# get_filename_component(PARENT_FOLDER_ABSOLUTE2 ${CMAKE_CURRENT_SOURCE_DIR} PATH)
get_filename_component(PARENT_FOLDER_ABSOLUTE2 ${CMAKE_CURRENT_SOURCE_DIR} DIRECTORY)
MESSAGE(STATUS "方法2 父目录的绝对路径:" ${PARENT_FOLDER_ABSOLUTE2})
# 方法1 获取父目录的名称
string(REGEX REPLACE ".*/(.*)" "\\1" PARENT_FOLDER ${PARENT_FOLDER_ABSOLUTE})
MESSAGE(STATUS "方法1 父目录的名称:" ${PARENT_FOLDER})
# 方法1 获取父目录的名称
get_filename_component(PARENT_FOLDER2 ${PARENT_FOLDER_ABSOLUTE} NAME)
MESSAGE(STATUS "方法2 父目录的名称:" ${PARENT_FOLDER2})
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
ADD_EXECUTABLE(hello main.c)
INSTALL(TARGETS hello RUNTIME DESTINATION bin)
执行如下命令
cd /home/xxw/dev/linux_learning/cmake_pratice/t2/src
mkdir build
cd build/
cmake ..
输出结果如下:
...
-- 可执行程序的目录(绝对路径):/home/xxw/dev/linux_learning/cmake_pratice/t2/src/build
-- 当前目录(绝对路径):/home/xxw/dev/linux_learning/cmake_pratice/t2/src
-- 当前文件的绝对路径(含文件名):/home/xxw/dev/linux_learning/cmake_pratice/t2/src/CMakeLists.txt
-- 当前目录的绝对路径(不含文件名):/home/xxw/dev/linux_learning/cmake_pratice/t2/src
-- 当前目录的绝对路径:/home/xxw/dev/linux_learning/cmake_pratice/t2/src
-- 当前目录名:src
-- 方法1 父目录的绝对路径:/home/xxw/dev/linux_learning/cmake_pratice/t2
-- 方法2 父目录的绝对路径:/home/xxw/dev/linux_learning/cmake_pratice/t2
-- 方法1 父目录的名称:t2
-- 方法2 父目录的名称:t2
...
继续执行命令: make
在build目录下的bin目录下生成了可执行程序hello