cmake add_custom_command

Я борюсь с add_custom_command. Позвольте мне объяснить проблему подробно.

У меня есть они набор cxx файлов и hxx файлов. Я запускаю скрипт жемчуга на каждом из них для генерации определенного вида файла перевода. Команда похожа

perl trans.pl source.cxx -o source_cxx_tro

и так же для header.hxx файлов также.

Таким образом, я закончу с немного несколько команд (каждый для файла)

Затем я выполняю другой жемчуг scripn на выводе, сгенерированном от этих команд (source_cxx_tro, header_hxx_tro)

perl combine.pl source_cxx_tro header_hxx_tro -o dir.trx

dir.trx является выходным файлом.

У меня есть что-то вроде этого.

Loop_Over_All_Files()
Add_Custom_Command (OUTPUT ${trofile} COMMAND perl trans.pl ${file} -o ${file_tro})
List (APPEND trofiles ${file_tro})
End_Loop()

Add_Custom_Command (TARGET LibraryTarget POST_BUILD COMMAND perl combine.pl ${trofiles} -o LibraryTarget.trx)

То, что я ожидаю, при создании цели сборки сообщения, trofiles будет создан сначала. но это не имеет место. $ {trofiles} не становятся созданными, и следовательно команда сборки сообщения заканчивается неудачей. Есть ли какой-либо способ, которым я могу сказать, что команда POST_BUILD зависит от предыдущей пользовательской команды?

Какие-либо предложения?

Заранее спасибо, Surya

16
задан Martin 14 September 2010 в 00:23
поделиться

2 ответа

Используйте add_custom_command'ы для создания цепочки преобразований файлов

  • *.(cxx|hxx) -> *_(cxx|hxx)_tro
  • *_(cxx|hxx)_tro -> Foo.trx

и сделайте последнее преобразование сущностью первого класса в cmake с помощью add_custom_target. По умолчанию эта цель не будет собираться, если только вы не пометите ее как ALL или не позволите другой собираемой цели зависеть от нее.

set(SOURCES foo.cxx foo.hxx)
add_library(Foo ${SOURCES})

set(trofiles)
foreach(_file ${SOURCES})
  string(REPLACE "." "_" file_tro ${_file})
  set(file_tro "${file_tro}_tro")
  add_custom_command(
    OUTPUT ${file_tro} 
    COMMAND perl ${CMAKE_CURRENT_SOURCE_DIR}/trans.pl ${CMAKE_CURRENT_SOURCE_DIR}/${_file} -o ${file_tro}
    DEPENDS ${_file}
  ) 
  list(APPEND trofiles ${file_tro})
endforeach()
add_custom_command(
  OUTPUT Foo.trx  
  COMMAND perl ${CMAKE_CURRENT_SOURCE_DIR}/combine.pl ${trofiles} -o Foo.trx
  DEPENDS ${trofiles}
)
add_custom_target(do_trofiles DEPENDS Foo.trx)
add_dependencies(Foo do_trofiles)
30
ответ дан 30 November 2019 в 17:15
поделиться

Вы хотите создать настраиваемую цель, которая потребляет выходные данные настраиваемых команд. Затем используйте ADD_DEPENDENCIES, чтобы убедиться, что команды выполняются в правильном порядке.

Это может быть похоже на то, что вы хотите: http://www.cmake.org/Wiki/CMake_FAQ#How_do_I_use_CMake_to_build_LaTeX_documents.3F

Обычно одна add_custom_command для каждого созданного файла, соберите список этих файлов (трофайлов), затем используйте add_custom_target с ЗАВИСИМОЙ от трофайлов списка. Затем используйте add_dependencies, чтобы сделать LibraryTarget зависимой от настраиваемой цели. Затем настраиваемая цель должна быть создана до создания целевой библиотеки.

3
ответ дан 30 November 2019 в 17:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: