CMake獲取當前目錄名以及獲取上層目錄名

2021-10-21 19:53:04 字數 2258 閱讀 6746

cmake中有兩個變數,可以獲取到當前cmakelists.txt的當前目錄名(絕對路徑)和當前檔案的絕對路徑,分別是cmake_current_source_dircmake_current_list_file

但是,有時候需要的往往是相對路徑名。比如我們編寫專案的一些樣例,以當前資料夾的名字作為target,同時還需要把生成的target按照上層目錄名來分組,例如下列目錄結構:

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 $)

# get current relative dir name and set target name

string(regex replace ".*/(.*)" "\\1" current_folder $)

set (target_name $)

# init target

add_executable ($ $)

target_include_directories ($ $)

# get above dir name and set target group name

get_filename_component(second_folder_absolute $ directory)

string(regex replace ".*/(.*)" "\\1" second_folder $)

# group target

set_target_properties ($ properties folder "examples/$")

生成後的專案如圖所示,這裡借用乙個專案結構相同的專案來展示。

進入正題,獲取相對路徑的目錄名有兩種方式:

不管哪種,都要先去掉絕對路徑後面的/

string(regex replace ".*/(.*)" "\\1" current_folder $)
使用括號來儲存子表示式的匹配結果,子表示式匹配的就是相對路徑的目錄名。這種用法可以參考google protobuf的寫法。

獲取上層目錄也是簡單的,只需要使用正規表示式替換掉當前目錄名,然後再執行一次獲取當前目錄名即可。

string(regex replace "(.*)/$$" "\\1" second_folder_absolute $)

string(regex replace ".*/(.*)" "\\1" second_folder $)

這裡要清楚正規表示式之中的括號子表示式和"\\1"的含義就行了search and replace with regular expressions,千變萬化都可以。

這個命令就更好理解了,把目錄名當成檔名就行了;

獲取當前目錄名:

get_filename_component(current_folder $ name)
獲取上層目錄名:

get_filename_component(second_folder_absolute $ directory)

get_filename_component(second_folder $ name)

shell獲取檔名和目錄名

憬薇15940人閱讀 2018 08 23 21 23 31 對檔名或目錄名進行處理,通常的操作是由路徑中提取出檔名,從路徑中提取出目錄名,提取檔案字尾名等等。例如,從路徑 dir1 dir2 file.txt中提取也檔名file.txt,提取出目錄 dir1 dir2,提取出檔案字尾txt等。下面...

node獲取最後乙個目錄名

引入模組 const fs require fs extra 檔案操作 const shell require shelljs shell const path require path let pwd shell.pwd 當前目錄路徑 字串 let index pwd.split path.sep...

makefile 獲取當前目錄的子檔名

dir shell ls l grep d awk 上面就是makefile通過shell獲取當前目錄下所有目錄的指令碼,awk把第9列顯示出來,在命令列 9 在makefile中shell變數 9 grep d的意思 過濾d開頭的 如下 在目錄下有camera common communicati...