我正在尝试使用给定的宏来编译我的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()
有人可以告诉我如何将参数传递给微指令吗?使用返回列表包含目录吗?
答案 0 :(得分:1)
您可以使用其名称调用类似于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。
在宏中,您可以简单地创建一个新变量(或使用作为参数传递的变量-如上所述),在函数中您可以使用{{1 }}关键字将一些内容写入调用方的传递变量:
PARENT_SCOPE