cmake add_custom_command - PullRequest
       14

cmake add_custom_command

16 голосов
/ 01 марта 2010

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

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

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 зависит от предыдущей пользовательской команды?

Есть предложения?

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

Ответы [ 2 ]

30 голосов
/ 02 марта 2010

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

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

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

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)
3 голосов
/ 02 марта 2010

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

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