簡體   English   中英

如何在cmake中使用宏?

[英]How to use macro in cmake?

我正在嘗試使用給定的宏來編譯我的 C++ 程序?

MACRO(HEADER_DIRECTORIES return_list)
    FILE(GLOB_RECURSE new_list *.h)
    SET(dir_list "")
    FOREACH(file_path ${new_list})
        GET_FILENAME_COMPONENT(dir_path ${file_path} PATH)
        SET(dir_list ${dir_list} ${dir_path})
    ENDFOREACH()
    LIST(REMOVE_DUPLICATES dir_list)
    SET(${return_list} ${dir_list})
ENDMACRO()

有人能告訴我如何將參數傳遞給 micro ans 使用返回列表來包含目錄嗎?

您可以使用其名稱調用函數(或宏),就像在 C 中一樣。 名稱由括號內的第一個字符串定義 - 因此您可以這樣調用宏:

header_directories(...)

您的宏需要一個參數 - 一個變量 - 因此您的CMakeLists.txt將如下所示:

cmake_minimum_required(VERSION 3.13)


macro(header_directories return_list)

    file(GLOB_RECURSE new_list *.h)
    set(dir_list "")

    foreach(file_path ${new_list})
        get_filename_component(dir_path ${file_path} PATH)
        set(dir_list ${dir_list} ${dir_path})
    endforeach()

    list(REMOVE_DUPLICATES dir_list)
    set(${return_list} ${dir_list})

endmacro()


header_directories(foobar_list)
message(${foobar_list})

在如下所示的目錄中

CMakeLists.txt
include/
    foo.h

輸出將如下所示:

$ cmake .
/.../directoryname/include
-- Configuring done
-- Generating done
-- Build files have been written to: /.../directoryname/

如果您現在想使用由您的宏生成的列表來包含這些目錄,只需使用

include_directories(${foobar_list})

或者,甚至更好

target_include_directories(<target> <INTERFACE|PUBLIC|PRIVATE> ${foobar_list})

請注意,CMake 中的函數和宏不支持經典的返回值 - 從某種意義上說,您可能已經習慣使用 C。

宏中,您可以簡單地創建一個新變量(或使用作為參數傳遞的變量 - 如上所述),在函數中,您可以使用PARENT_SCOPE關鍵字將某些內容寫入調用者的傳遞變量:

function(func result_variable)
    set(${result_variable} "result" PARENT_SCOPE)
endfunction()

func(ret)
message(${ret})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM