我正在努力使用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命令取决于以前的自定义命令吗?
有什么建议吗?
提前致谢, 苏里亚
答案 0 :(得分:29)
使用add_custom_command's创建文件转换链
使用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依赖于自定义目标。然后,应在构建库目标之前构建自定义目标。