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 зависеть от настраиваемой цели. Затем пользовательская цель должна быть построена до того, как объект библиотеки будет создан.