Cmake add_custom_command
Я борюсь с add_custom_command. Позвольте мне подробно объяснить проблему.
У меня есть набор cxx файлов и файлов hxx. Я запускаю perl script для каждого из них для создания определенного типа файла перевода. Команда выглядит как
perl trans.pl source.cxx -o source_cxx_tro
и аналогично для файлов header.hxx.
Итак, у меня появятся несколько команд (каждый для файла)
Затем я запускаю еще один скрипт perl на выходе, сгенерированном из этих команд (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} не создаются, поэтому команда post build завершается сбой.
Есть ли способ, которым я могу сказать, что команда POST_BUILD зависит от предыдущей пользовательской команды?
Любые предложения?
Спасибо заранее,
Сурья
Ответы
Ответ 1
Используйте команду 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)
Ответ 2
Вы хотите создать пользовательскую цель, которая потребляет выходные данные пользовательских команд. Затем используйте ADD_DEPENDENCIES, чтобы убедиться, что команды выполняются в правильном порядке.
Это может быть похоже на то, что вы хотите:
http://www.cmake.org/Wiki/CMake_FAQ#How_do_I_use_CMake_to_build_LaTeX_documents.3F
В основном одна команда add_custom_command для каждого сгенерированного файла, собирает список этих файлов (trofiles), а затем использует add_custom_target с DEPENDS в списке trofiles. Затем используйте add_dependencies, чтобы заставить LibraryTarget зависеть от настраиваемой цели. Затем пользовательская цель должна быть построена до того, как объект библиотеки будет создан.