<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
"); //-->

博客專(zhuān)欄

EEPW首頁(yè) > 博客 > CMake獲取當前目錄名以及獲取上層目錄名

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

發(fā)布人:電子禪石 時(shí)間:2024-01-26 來(lái)源:工程師 發(fā)布文章

CMake中有兩個(gè)變量,可以獲取到當前CMakeLists.txt的當前目錄名(絕對路徑)

和當前文件的絕對路徑,

分別是CMAKE_CURRENT_SOURCE_DIR和CMAKE_CURRENT_LIST_FILE。


但是,有時(shí)候需要的往往是相對路徑名。比如我們編寫(xiě)項目的一些樣例,

以當前文件夾的名字作為target名,同時(shí)還需要把生成的target按照上層目錄名來(lái)分組,

例如下列目錄結構:

————————————————


examples
	|- base
		|- string
			|- CMakeLists.txt
			|- base.h
			|- base.cpp
			|- main.cpp
		|- core
			|- CMakeLists.txt
			|- main.cpp
	|- network
		|- tcp
			|- CMakeLists.txt
			|- main.cpp

這個(gè)項目需要生成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}")

生成后的項目如圖所示,這里借用一個(gè)項目結構相同的項目來(lái)展示。




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

  • 利用字符串正則表達式替換

  • string(REGEX REPLACE <regular_expression>
           <replacement_expression> <output_variable>
           <input> [<input>...])

  • 利用命令get_filename_component

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

  • 正則表達式

  • string(REGEX REPLACE ".*/(.*)" "\\1" CURRENT_FOLDER
  • ${CURRENT_FOLDER_ABSOLUTE})

使用括號來(lái)保存子表達式的匹配結果,子表達式匹配的就是相對路徑的目錄名。
這種用法可以參考google protobuf的寫(xiě)法。
獲取上層目錄也是簡(jiǎn)單的,只需要使用正則表達式替換掉當前目錄名,
然后再執行一次獲取當前目錄名即可。

string(REGEX REPLACE "(.*)/${CURRENT_FOLDER}$" "\\1" SECOND_FOLDER_ABSOLUTE ${CURRENT_FOLDER_ABSOLUTE})
string(REGEX REPLACE ".*/(.*)" "\\1" SECOND_FOLDER ${SECOND_FOLDER_ABSOLUTE})


    

這里要清楚正則表達式之中的括號子表達式和"\\1"的含義就行了Search and Replace With Regular Expressions,千變萬(wàn)化都可以。


get_filename_component

這個(gè)命令就更好理解了,把目錄名當成文件名就行了;


獲取當前目錄名:


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)

————————————————


                            版權聲明:本文為博主原創(chuàng )文章,遵循 CC 4.0 BY-SA 版權協(xié)議,轉載請附上原文出處鏈接和本聲明。

                        

原文鏈接:https://blog.csdn.net/FlushHip/article/details/114677610



*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。



關(guān)鍵詞: cmake

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>