17

我正在为 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。但事实并非如此。${trofiles} 未构建,因此构建后命令以失败告终。有什么办法可以告诉 POST_BUILD 命令取决于以前的自定义命令?

有什么建议么 ?

在此先感谢,苏里亚

4

2 回答 2

31

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

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

并使用 add_custom_target 使最后一个转换成为 cmake 中的第一类实体。默认情况下,不会构建此目标,除非您将其标记为 ALL 或让另一个构建的目标依赖于它。

设置(来源 foo.cxx foo.hxx)
add_library(Foo ${SOURCES})

设置(trofiles)
foreach(_file ${SOURCES})
  字符串(替换“。”“_”file_tro ${_file})
  设置(file_tro“${file_tro}_tro”)
  add_custom_command(
    输出 ${file_tro}
    命令 perl ${CMAKE_CURRENT_SOURCE_DIR}/trans.pl ${CMAKE_CURRENT_SOURCE_DIR}/${_file} -o ${file_tro}
    依赖 ${_file}
  )
  列表(追加 trofiles ${file_tro})
endforeach()
add_custom_command(
  输出脚.trx  
  命令 perl ${CMAKE_CURRENT_SOURCE_DIR}/combine.pl ${trofiles} -o Foo.trx
  依赖 ${trofiles}
)
add_custom_target(do_trofiles 依赖 Foo.trx)
add_dependencies(Foo do_trofiles)
于 2010-03-02T09:56:28.740 回答
3

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

这可能有点接近您想要的: https ://gitlab.kitware.com/cmake/community/-/wikis/FAQ#how-do-i-use-cmake-to-build-latex-documents

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

于 2010-03-02T04:31:08.890 回答