CMake:生成对configure_file的输入依赖

时间:2015-07-02 10:59:23

标签: cmake

我想在安装configure_file的输出之前,通过自定义依赖项运行configure_file(),其输入文件是使用add_custom_command生成的。

我实际上是使用ruby脚本来读取cmake格式的文件,以进行提取 一些定义,我可以在一个单独的库中转换为Ruby常量。因此,我需要configure_file,以便cmake可以替换ruby生成的文件中的内部变量,其目的是导出这些变量。

到目前为止,我尝试了以下内容:

# Custom command to build the out.rb.in
add_custom_command (
  OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/output.rb.in"
  COMMAND ruby ${CMAKE_CURRENT_SOURCE_DIR}/build_ruby_output.rb
  -i ${CMAKE_CURRENT_SOURCE_DIR}/input.cmake
  -o ${CMAKE_CURRENT_BINARY_DIR}/output.rb.in
)

# Custom target is required to build it
add_custom_target (
  dummy_target_xxx ALL DEPENDS
  "${CMAKE_CURRENT_BINARY_DIR}/output.rb.in"
)

configure_file ( 
  "${CMAKE_CURRENT_BINARY_DIR}/output.rb.in"
  "${CMAKE_CURRENT_BINARY_DIR}/output.rb"
)

install (
  FILES "${CMAKE_CURRENT_BINARY_DIR}/output.rb"
  DESTINATION "${RUBY_VENDOR_LIBDIR}/myvendor"
)

CMake抱怨错误

CMake Error: File /home/user/myproject/build/output.rb.in does not exist.
CMake Error at CMakeLists.txt:35 (configure_file):
  configure_file Problem configuring file

运行树外构建时。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

configure_file()configuration步骤立即执行 ,而add_custom_command()build添加要执行的命令(以及要评估的依赖项)步骤

您可以使用适当的add_custom_command调用替换execute_process,因此您的ruby脚本将在configuration步执行,其输出文件将为configure_file准备就绪。

或者您可以使用适当的configure_file替换add_custom_command,因此您的文件将在build步骤配置,并会看到依赖项。这里的问题是你应该明确地传递CMake变量,用于" output.rb.in"文件,到配置程序,可以是,例如,

${CMAKE_COMMAND} [-D<var-definition>]+ -P <cmake-script-file-which-calls-configure_file>

答案 1 :(得分:0)

在这种特殊情况下,通过首先执行configure_file()并将其输出传递给自定义命令,重新排序到配置操作就足够了。我只是在考虑排序错误。

我仍然没有将生成的依赖项添加到configure_file()

的输入中的答案

完整代码

configure_file ( 
  "${CMAKE_CURRENT_SOURCE_DIR}/input.cmake"
  "${CMAKE_CURRENT_BINARY_DIR}/output.rb.in"
)

# Custom command to build the output.rb
add_custom_command (
  OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/output.rb"
  COMMAND ruby ${CMAKE_CURRENT_SOURCE_DIR}/build_ruby_output.rb
  -i ${CMAKE_CURRENT_BINARY_DIR}/output.rb.in
  -o ${CMAKE_CURRENT_BINARY_DIR}/output.rb
)

# Custom target is required to build it
add_custom_target (
  dummy_target_xxx ALL DEPENDS
  "${CMAKE_CURRENT_BINARY_DIR}/output.rb"
)

install (
  FILES "${CMAKE_CURRENT_BINARY_DIR}/output.rb"
  DESTINATION "${RUBY_VENDOR_LIBDIR}/myvendor"
)