Как использовать макрос в cmake? - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь использовать данный макрос для компиляции моей программы на 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()

Может кто-нибудь сказать мне, как передать параметр в микро и использовать список возврата для включения каталогов?

1 Ответ

0 голосов
/ 29 января 2019

Вы можете вызвать функцию (или макрос), как в 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})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...