cmake add_custom_command [英] cmake add_custom_command

查看:375
本文介绍了cmake add_custom_command的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在使用add_custom_command。让我详细解释这个问题。

I'm struggling with add_custom_command. Let me explain the problem in detail.

我有这些cxx文件和hxx文件集。我运行perl脚本,每个人都生成某种翻译文件。该命令看起来像

I've these set of cxx files and hxx files. I run a perl script on each of them to generate a certain kind of translation file. The command looks like

perl trans.pl source.cxx -o source_cxx_tro

,同样也适用于header.hxx文件。

and similarly for header.hxx files as well.

多个命令(每个用于一个文件)

So I'll end up with some multiple commands (each for a file)

然后我对这些命令生成的输出运行另一个perl scripn(source_cxx_tro,header_hxx_tro)

Then I run another perl scripn on the output generated from these commands (source_cxx_tro, header_hxx_tro)

perl combine.pl source_cxx_tro header_hxx_tro -o dir.trx

dir.trx是输出文件。

dir.trx is the output file.

我有这样的东西。

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命令结束失败。
有什么方法可以告诉POST_BUILD命令取决于以前的自定义命令吗?

What I expect is when building the post build target, the trofiles will be built first. but it is not the case. The ${trofiles} are not getting built and hence the post build command ends in a failure. Is there any way I can tell the POST_BUILD command depend on the previous custom command ?

有任何建议吗?

提前感谢
Surya

Thanks in advance, Surya

推荐答案

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

Use add_custom_command's to create a file transformation chain


  • *。(cxx | hxx) - > * _(cxx | hxx)_tro

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

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

and make the last transformation an first class entity in cmake by using add_custom_target. By default this target won't be build, unless you mark it with ALL or let another target that is built depend on it.


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)

这篇关于cmake add_custom_command的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆