cmake_parse_arguments, хранящий пустые строки - PullRequest
1 голос
/ 25 сентября 2019

Я пытаюсь использовать вариант сигнатуры функции cmake_parse_arguments(), отражающий пример для макросов:

include(CMakeParseArguments)

set(prefix PREFIX_)
set(${prefix}VAR "foo")
message(DEBUG " value of " "${prefix}VAR" " is " ${${prefix}VAR})

function(func)
    set(prefix ARG_)
    set(options OPTION)
    set(oneValueArgs VALUE)
    set(multiValueArgs MULTIVALUE)
    cmake_parse_arguments(PARSE_ARGV 0 "${prefix}" "${options}" "${oneValueArgs}" "${multiValueArgs}")

    message(DEBUG ${${prefix}UNPARSED_ARGUMENTS})
    message(DEBUG ${${prefix}OPTION})
    message(DEBUG ${${prefix}VALUE})
    message(DEBUG ${${prefix}MULTIVALUE})
endfunction(func)

func(VALUE 42 MULTIVALUE "foo" "bar" "baz")

Вывод сообщения:

DEBUG value of PREFIX_VAR is foo
DEBUG
DEBUG
DEBUG
DEBUG

Выходные данные - только пустые строки.Что происходит?

1 Ответ

1 голос
/ 25 сентября 2019

Из документации для cmake_parse_arguments:

cmake_parse_arguments рассмотрим для каждого из ключевых слов, перечисленных в <options>, <one_value_keywords> и <multi_value_keywords> aпеременная, состоящая из заданного <prefix>, за которым следует "_" и имени соответствующего ключевого слова.

Например, одна из переменных, заполняемых после запуска этого метода, - <prefix>_UNPARSED_ARGUMENTS.Поскольку ваш префикс уже содержит символ подчеркивания, он расширяется до ARG__UNPARSED_ARGUMENTS (с двумя символами подчеркивания после ARG).Таким образом, добавление дополнительного подчеркивания к вашим message() вызовам дает проанализированные значения:

include(CMakeParseArguments)

set(prefix PREFIX_)
set(${prefix}VAR "foo")
message(DEBUG " value of " "${prefix}VAR" " is " ${${prefix}VAR})

function(func)
    set(prefix ARG_)
    set(options OPTION)
    set(oneValueArgs VALUE)
    set(multiValueArgs MULTIVALUE)
    cmake_parse_arguments(PARSE_ARGV 0 "${prefix}" "${options}" "${oneValueArgs}" "${multiValueArgs}")

    # Add additional underscore to the variables expanded here!
    message(DEBUG ${${prefix}_UNPARSED_ARGUMENTS})
    message(DEBUG ${${prefix}_OPTION})
    message(DEBUG ${${prefix}_VALUE})
    message(DEBUG ${${prefix}_MULTIVALUE})
endfunction(func)

func(VALUE 42 MULTIVALUE "foo" "bar" "baz")

Это печатает следующее:

DEBUG value of PREFIX_VAR is foo
DEBUG
DEBUG FALSE
DEBUG 42
DEBUG foobarbaz
...