Как определить переменную во время сборки с помощью cmake? - PullRequest
0 голосов
/ 04 сентября 2018

Я хотел бы определить переменную CMake BUILD_TIME_VAR в CMakeLists.txt:

  • вычисляется с помощью скрипта Python на этапе сборки
  • Затем я могу получить доступ к его содержимому с помощью $ {VAR}

Другими словами, эквивалент на этапе сборки:

execute_process(COMMAND bash -c "python $SCRIPT $FILE" OUTPUT_VARIABLE GEN_TIME_VAR)

Переменная затем используется для создания файла, который является зависимостью для создания двоичных файлов.

Цель состоит в том, чтобы сделать код более легким для чтения, поскольку в противном случае вычисления выполняются несколько раз.

Вместо того, чтобы вызывать n раз скрипт python для вычисления BUILD_TIME_VAR, я бы хотел использовать скрипт один раз, чтобы разложить код таким образом:

 if(expression_1)
    add_custom_command(OUTPUT foo
    COMMAND cmd_1(${BUILD_TIME_VAR}))

    ...
  elseif(expression_2)
    # elseif section.
    add_custom_command(OUTPUT foo
    COMMAND cmd_2(${BUILD_TIME_VAR}))
    ...
  else(expression_n)
    # else section.
    add_custom_command(OUTPUT foo
    COMMAND cmd_n(${BUILD_TIME_VAR}))
    ...
  endif(expression)

add_custom_target(${BINARY} ALL
DEPENDS foo)

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Полагаю, вы неправильно истолковали роль CMake. Короче говоря, CMake генерирует файлы сборки для серверной системы по вашему выбору (Make, ninja и т. Д.). Это кратко рассмотрено здесь , где шаг настройки / генерации кратко документирован вместе с тем, как он предшествует фактическому этапу сборки.

Непонятно, чего именно вы пытаетесь достичь, но может быть полезно определить пользовательские команды и использовать их выходные данные для привязки их к пользовательским целям для дальнейшего объединения зависимостей (см. DEPENDS здесь ). например,

cmake_minimum_required(VERSION 3.11)

project(foobar)

set(FOO_FILES "foo.txt")

add_custom_command(OUTPUT ${FOO_FILES}
  COMMAND ${CMAKE_COMMAND} -E touch ${FOO_FILES}
  COMMAND echo hello >> ${FOO_FILES}
  WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
  COMMENT "Creating ${FOO_FILES}"
  VERBATIM)

add_custom_target(foo DEPENDS ${FOO_FILES})

set(BAR_FILES "bar_dummy.txt") # this is only use to link the custom command to the corresponding custom target

add_custom_command(OUTPUT ${BAR_FILES}
  COMMAND ${CMAKE_COMMAND} -E touch ${BAR_FILES}
  COMMAND cat ${FOO_FILES}
  WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
  COMMENT "Displaying ${FOO_FILES}"
  VERBATIM)

add_custom_target(bar DEPENDS ${BAR_FILES})

add_dependencies(bar foo)

Однако вам, возможно, придется учитывать вероятность того, что вы столкнетесь с этим инструментом, и, следовательно, может быть понятнее выполнить требуемый шаг до настройки вашего проекта.

0 голосов
/ 04 сентября 2018

Если я правильно понимаю ваш вопрос, вы фактически пытаетесь создать «переменную времени сборки». Это то, что должен поддерживать инструмент сборки (на самом деле все инструменты сборки, поддерживаемые CMake). Я не знаю такой функциональности в инструментах сборки (make, ninja, VS, ...) и, следовательно, не поддерживаю такую ​​вещь в CMake.

Вы можете эмулировать это, записывая результаты в файл и читая этот файл на всех последующих этапах сборки, используя его.

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