CMakeLists.txt文件中如何获取当前目录和父目录?

1 获取当前目录

方法1:PROJECT_SOURCE_DIR

方法2:CMAKE_CURRENT_SOURCE_DIR

2 获取父目录

方法1:利用字符串正则表达式替换

string(REGEX REPLACE

[…])

方法2:利用命令get_filename_component

3 示例

有一个project名为t2,绝对路径:/home/xxw/dev/linux_learning/cmake_pratice/t2
t2的文件夹结构如下:
image.png
t2下有子目录doc和 src,以及文件CMakeLists.txt。
子目录src目录下有源文件CMakeLists.txt,main.c。
子目录src下的CMakeLists.txt的文件内容如下:

  1. MESSAGE(STATUS "可执行程序的目录(绝对路径):" ${PROJECT_BINARY_DIR})
  2. MESSAGE(STATUS "当前目录(绝对路径):" ${PROJECT_SOURCE_DIR})
  3. MESSAGE(STATUS "当前文件的绝对路径(含文件名):" ${CMAKE_CURRENT_LIST_FILE})
  4. MESSAGE(STATUS "当前目录的绝对路径(不含文件名):" ${CMAKE_CURRENT_SOURCE_DIR})
  5. # 删除末尾的'/'
  6. string(REGEX REPLACE "/$" "" CURRENT_FOLDER_ABSOLUTE ${CMAKE_CURRENT_SOURCE_DIR})
  7. MESSAGE(STATUS "当前目录的绝对路径:" ${CURRENT_FOLDER_ABSOLUTE})
  8. # 获取当前目录的相对路径
  9. string(REGEX REPLACE ".*/(.*)" "\\1" CURRENT_FOLDER ${CURRENT_FOLDER_ABSOLUTE})
  10. MESSAGE(STATUS "当前目录名:" ${CURRENT_FOLDER})
  11. # 方法1 获取父目录的绝对路径
  12. string(REGEX REPLACE "(.*)/${CURRENT_FOLDER}$" "\\1" PARENT_FOLDER_ABSOLUTE ${CURRENT_FOLDER_ABSOLUTE})
  13. MESSAGE(STATUS "方法1 父目录的绝对路径:" ${PARENT_FOLDER_ABSOLUTE})
  14. # 方法2 获取父目录的绝对路径
  15. # get_filename_component(PARENT_FOLDER_ABSOLUTE2 ${CMAKE_CURRENT_SOURCE_DIR} PATH)
  16. get_filename_component(PARENT_FOLDER_ABSOLUTE2 ${CMAKE_CURRENT_SOURCE_DIR} DIRECTORY)
  17. MESSAGE(STATUS "方法2 父目录的绝对路径:" ${PARENT_FOLDER_ABSOLUTE2})
  18. # 方法1 获取父目录的名称
  19. string(REGEX REPLACE ".*/(.*)" "\\1" PARENT_FOLDER ${PARENT_FOLDER_ABSOLUTE})
  20. MESSAGE(STATUS "方法1 父目录的名称:" ${PARENT_FOLDER})
  21. # 方法1 获取父目录的名称
  22. get_filename_component(PARENT_FOLDER2 ${PARENT_FOLDER_ABSOLUTE} NAME)
  23. MESSAGE(STATUS "方法2 父目录的名称:" ${PARENT_FOLDER2})
  24. SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
  25. ADD_EXECUTABLE(hello main.c)
  26. INSTALL(TARGETS hello RUNTIME DESTINATION bin)

执行如下命令

  1. cd /home/xxw/dev/linux_learning/cmake_pratice/t2/src
  2. mkdir build
  3. cd build/
  4. cmake ..

输出结果如下:

  1. ...
  2. -- 可执行程序的目录(绝对路径):/home/xxw/dev/linux_learning/cmake_pratice/t2/src/build
  3. -- 当前目录(绝对路径):/home/xxw/dev/linux_learning/cmake_pratice/t2/src
  4. -- 当前文件的绝对路径(含文件名):/home/xxw/dev/linux_learning/cmake_pratice/t2/src/CMakeLists.txt
  5. -- 当前目录的绝对路径(不含文件名):/home/xxw/dev/linux_learning/cmake_pratice/t2/src
  6. -- 当前目录的绝对路径:/home/xxw/dev/linux_learning/cmake_pratice/t2/src
  7. -- 当前目录名:src
  8. -- 方法1 父目录的绝对路径:/home/xxw/dev/linux_learning/cmake_pratice/t2
  9. -- 方法2 父目录的绝对路径:/home/xxw/dev/linux_learning/cmake_pratice/t2
  10. -- 方法1 父目录的名称:t2
  11. -- 方法2 父目录的名称:t2
  12. ...

继续执行命令: make
在build目录下的bin目录下生成了可执行程序hello