cmake add_custom_command

时间:2010-03-01 07:58:55

标签: cmake

我正在努力使用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)

我期望在构建post build目标时,首先构建trofiles。但事实并非如此。 $ {trofiles}没有构建,因此post build命令以失败告终。 有什么办法可以告诉POST_BUILD命令取决于以前的自定义命令吗?

有什么建议吗?

提前致谢, 苏里亚

2 个答案:

答案 0 :(得分:29)

使用add_custom_command's创建文件转换链

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

使用add_custom_target使最后一个转换成为cmake中的第一个类实体。默认情况下,此目标不会构建,除非您使用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)

答案 1 :(得分:3)

您想要创建一个使用自定义命令输出的自定义目标。然后使用ADD_DEPENDENCIES确保命令以正确的顺序运行。

这可能与你想要的有些接近: http://www.cmake.org/Wiki/CMake_FAQ#How_do_I_use_CMake_to_build_LaTeX_documents.3F

基本上,每个生成的文件都有一个add_custom_command,收集这些文件的列表(trofiles),然后在列表trofiles上使用带有DEPENDS的add_custom_target。然后使用add_dependencies使LibraryTarget依赖于自定义目标。然后,应在构建库目标之前构建自定义目标。