Вы можете вызвать функцию (или макрос), как в 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 не поддерживают classic возвращаемые значения - в том смысле, к которому вы можете привыкнуть с помощью C.
В макросах вы можете просто создать новую переменную (илииспользуйте тот, который передается в качестве аргумента (как указано выше), в функции вы можете использовать ключевое слово PARENT_SCOPE
, чтобы записать что-то в переданную переменную вызывающего:
function(func result_variable)
set(${result_variable} "result" PARENT_SCOPE)
endfunction()
func(ret)
message(${ret})