Как установить глобальную переменную в функции для cmake?

Я пишу CMakeLists.txt, чтобы сгенерировать файлы и скомпилировать сгенерированные файлы. Я создаю функцию для добавления некоторых строк пути к файлу в глобальную переменную списка.

Мой CMakeLists.txt:

<code>set(source_list "nothing")
function(test file_path)
    list(APPEND source_list ${file_path})
endfunction(test)
test(abc.txt)
test(def.txt)
message("At last, the source_list is:\"${source_list}\"")
</code>

Вывод cmake:

<code>At last, the source_list is:"nothing"
</code>

Кто-то предложил использовать макрос вместо функции, но мне нужно использовать локальную переменную, поэтому мне нужно использовать функцию вместо макроса.

Как правильно установить глобальную переменную source_list в функции test ()? Может ли сделать это простым и нормальным способом?

Ответы на вопрос(4)

PARENT_SCOPE предназначен только для parent, он не будет работать, если у вас есть другой не родительский скрипт, который также хочет его видеть.

Вам нужен кеш для истинного "глобального типа" переменная. В вашем случае используйте:

SET(source_list  "${source_list}" CACHE INTERNAL "source_list")
 25 февр. 2016 г., 23:49
INTERNAL подразумеваемыйFORCE, что означает: использоватьFORCE возможность перезаписать существующие записи.
 25 февр. 2016 г., 08:23
Он не работает для второго запуска cmake, потому что значение уже находится в кеше. Вы должны очистить перед сборкой.
Решение Вопроса

Вам нужно использоватьset вместоlist влиять на переменную в родительской области.

Так замениlist команда с:

set(source_list ${source_list} ${file_path} PARENT_SCOPE)
 04 апр. 2017 г., 08:32
Хотя это и не глобально, братья и сестры не увидят.
 01 окт. 2018 г., 12:37
@JoachimW: Зачем включать два ответа в один? Похоже, вы неправильно поняли модель Вопрос / Ответ по переполнению стека. Мы НЕ склонны иметьall solutions вsingle accepted answer, Вместо этого, имеяone answer per solution идеально. И качество ответа в первую очередь измеряетсяvotingХорошие ответы не должны быть отмечены зеленой меткой принятия. Пожалуйста, верните этот ответ слиянием.

Основываясь на ответе Максима Суслова, следующий код работал для аналогичной проблемы, с которой я столкнулся:

set_property(GLOBAL PROPERTY source_list)
function(add_source)
    get_property(tmp GLOBAL PROPERTY source_list)
    foreach(arg ${ARGV})
        set(tmp "${tmp} ${arg}")
    endforeach()
    set_property(GLOBAL PROPERTY source_list "${tmp}")
endfunction(add_source)

add_source(a_file)
add_source(b_file c_file)

get_property(local_prop GLOBAL PROPERTY source_list)
message("list: ${local_prop}")

Функция add_source может вызываться из любого подкаталога.

Другой подход заключается в использовании глобальных свойств. Как только вы установите его:

set_property(GLOBAL PROPERTY source_list_property "${source_list}")

Вы можете прочитать это отовсюду:

get_property(source_list GLOBAL PROPERTY source_list_property)

Я использовал в примерах выше разные имена для свойства (source_list_property) и для переменной (source_list). Может быть, лучше использовать то же имя. Но дело в том, чтобы использовать свойство в качестве глобальных переменных, а не об именовании.

Такие глобальные свойства не находятся в кеше.

Ваш ответ на вопрос