博客專欄

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

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

        發布人:電子禪石 時間:2024-01-26 來源:工程師 發布文章

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

        和當前文件的絕對路徑,

        分別是CMAKE_CURRENT_SOURCE_DIR和CMAKE_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 ${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}")

        生成后的項目如圖所示,這里借用一個項目結構相同的項目來展示。




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

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

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

        • 利用命令get_filename_component

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

        • 正則表達式

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

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

        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,千變萬化都可以。


        get_filename_component

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


        獲取當前目錄名:


        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)

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


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

                                

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



        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



        關鍵詞: cmake

        技術專區

        關閉
        主站蜘蛛池模板: 徐水县| 聂拉木县| 敖汉旗| 武功县| 永昌县| 峨山| 南乐县| 新宁县| 盐亭县| 赣州市| 剑阁县| 长垣县| 裕民县| 星座| 中阳县| 太仆寺旗| 界首市| 饶河县| 花垣县| 安远县| 木兰县| 潞城市| 介休市| 岫岩| 蓝田县| 衡阳县| 永吉县| 南充市| 洛宁县| 巴林右旗| 习水县| 西乌珠穆沁旗| 中阳县| 盐边县| 依兰县| 清丰县| 兴宁市| 嘉黎县| 定兴县| 克什克腾旗| 商丘市|