CMake獲取當(dāng)前目錄名以及獲取上層目錄名
CMake中有兩個變量,可以獲取到當(dāng)前CMakeLists.txt的當(dāng)前目錄名(絕對路徑)
和當(dāng)前文件的絕對路徑,
分別是CMAKE_CURRENT_SOURCE_DIR和CMAKE_CURRENT_LIST_FILE。
但是,有時候需要的往往是相對路徑名。比如我們編寫項目的一些樣例,
以當(dāng)前文件夾的名字作為target名,同時還需要把生成的target按照上層目錄名來分組,
例如下列目錄結(jié)構(gòu):
————————————————
examples |- base |- string |- CMakeLists.txt |- base.h |- base.cpp |- main.cpp |- core |- CMakeLists.txt |- main.cpp |- network |- tcp |- CMakeLists.txt |- main.cpp
這個項目需要生成Visual Studio項目,CMakeLists.txt如下所示:
# remove last end of "/" string(REGEX REPLACE "/$" "" CURRENT_FOLDER_ABSOLUTE ${CMAKE_CURRENT_SOURCE_DIR}) # get current relative dir name and set target name string(REGEX REPLACE ".*/(.*)" "\\1" CURRENT_FOLDER ${CURRENT_FOLDER_ABSOLUTE}) set (TARGET_NAME ${CURRENT_FOLDER}) # init target add_executable (${TARGET_NAME} ${ARGN}) target_include_directories (${TARGET_NAME} ${CMAKE_CURRENT_SOURCE_DIR}) # get above dir name and set target group name get_filename_component(SECOND_FOLDER_ABSOLUTE ${CURRENT_FOLDER_ABSOLUTE} DIRECTORY) string(REGEX REPLACE ".*/(.*)" "\\1" SECOND_FOLDER ${SECOND_FOLDER_ABSOLUTE}) # group target set_target_properties (${TARGET_NAME} PROPERTIES FOLDER "examples/${SECOND_FOLDER}")
生成后的項目如圖所示,這里借用一個項目結(jié)構(gòu)相同的項目來展示。
使用括號來保存子表達(dá)式的匹配結(jié)果,子表達(dá)式匹配的就是相對路徑的目錄名。 這種用法可以參考google protobuf的寫法。 獲取上層目錄也是簡單的,只需要使用正則表達(dá)式替換掉當(dāng)前目錄名, 然后再執(zhí)行一次獲取當(dāng)前目錄名即可。
string(REGEX REPLACE "(.*)/${CURRENT_FOLDER}$" "\\1" SECOND_FOLDER_ABSOLUTE ${CURRENT_FOLDER_ABSOLUTE}) string(REGEX REPLACE ".*/(.*)" "\\1" SECOND_FOLDER ${SECOND_FOLDER_ABSOLUTE})
這里要清楚正則表達(dá)式之中的括號子表達(dá)式和"\\1"的含義就行了Search and Replace With Regular Expressions,千變?nèi)f化都可以。
get_filename_component
這個命令就更好理解了,把目錄名當(dāng)成文件名就行了;
獲取當(dāng)前目錄名:
get_filename_component(CURRENT_FOLDER ${CURRENT_FOLDER_ABSOLUTE} NAME)
獲取上層目錄名:
get_filename_component(SECOND_FOLDER_ABSOLUTE ${CURRENT_FOLDER_ABSOLUTE} DIRECTORY)
get_filename_component(SECOND_FOLDER ${SECOND_FOLDER_ABSOLUTE} NAME)
————————————————
版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。
原文鏈接:https://blog.csdn.net/FlushHip/article/details/114677610
*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點(diǎn),如有侵權(quán)請聯(lián)系工作人員刪除。