Используя configure_file
, можно преобразовать «зависимость от переменной» в «зависимость от файла», которая естественным образом обрабатывается пользовательской целью / командой:
options_list_file.in :
${OPTIONS_LIST}
CMakeLists.txt :
# Variable which can be modified by a user
set(OPTIONS_LIST "a,b" CACHE STRING "<description>")
# Configure file which will be updated on changing the variable's content
configure_file("options_list_file.in" "options_list_file")
add_custom_command(OUTPUT "File.c" "File.h"
COMMAND ruby generate_files.rb ${OPTIONS_LIST}
COMMENT "Generate files"
DEPENDS "${CMAKE_CURRENT_BINART_DIR}/options_list_file" # dependency from the file
)
Изменение переменной OPTIONS_LIST
подразумевает повторный запуск CMake ( этап настройки ). После этого повторного запуска configure_file
будет безоговорочно вызываться .
Но файл options_list_file
будет обновляться только тогда, когда его содержимое будет изменено. Это основная особенность configure_file
.
То есть, если переменная установлена пользователем на другое значение, тогда options_list_file
будет обновлено, и это вызовет повторный запуск пользовательской КОМАНДЫ при следующей сборке. .
Но если содержимое переменной не изменилось, то configure_file
не изменит файл options_list_file
и его метку времени (это важно!). Таким образом, следующая сборка не будет рассматривать файл как обновленный и не вызовет повторное выполнение команды.