Пользовательская команда CMake в зависимости от переменной - PullRequest
1 голос
/ 08 ноября 2019

Часть моего процесса сборки требует передачи переменной в скрипт для генерации некоторых исходных файлов. Это выглядит примерно так:

    add_custom_command(OUTPUT
        rebuild_files
        COMMAND ${CMAKE_COMMAND} -E echo
        COMMENT "Force rebuild of generated files"
    )

    add_custom_command(OUTPUT "File.c" "File.h"
        COMMAND ruby generate_files.rb ${OPTIONS_LIST}
        COMMENT "Generate files"
        DEPENDS rebuild_files
    )

Конечно, это работает на каждой компиляции, которая не нужна. OPTIONS_LIST устанавливается во время конфигурации, поэтому его можно кэшировать.

Существует ли механизм, позволяющий сделать пользовательскую команду зависимой от переменной? Конечная цель состоит в том, чтобы эта компиляция выполнялась только в том случае, если:

  1. OPTIONS_LIST изменяется.
  2. File.c или File.h не существует.

1 Ответ

1 голос
/ 13 ноября 2019

Используя 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 и его метку времени (это важно!). Таким образом, следующая сборка не будет рассматривать файл как обновленный и не вызовет повторное выполнение команды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...