Я борюсь с 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
Используйте add_custom_command'ы для создания цепочки преобразований файлов
и сделайте последнее преобразование сущностью первого класса в 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)
Вы хотите создать настраиваемую цель, которая потребляет выходные данные настраиваемых команд. Затем используйте 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 зависимой от настраиваемой цели. Затем настраиваемая цель должна быть создана до создания целевой библиотеки.