如何在 cmake 中使用宏

How to use macro in cmake?

本文关键字:cmake      更新时间:2023-10-16

我正在尝试使用给定的宏来编译我的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})