我想在安装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
运行树外构建时。有什么想法吗?
答案 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"
)