cmake - 使用 cmake 在构建期间生成脚本
问题描述
我有一个带有单个源文件的 cmake 项目,名为main.c
. 我想另外提供一个包装脚本,它使用特定参数调用 main 。
我的CMakeLists.txt
样子如下:
cmake_minimum_required(VERSION 3.1...3.16)
file(WRITE ${CMAKE_BINARY_DIR}/wrapper "#!/usr/bin/env bash\n")
file(APPEND ${CMAKE_BINARY_DIR}/wrapper "./main options\n")
add_executable(main main.c)
add_custom_target(wrapper_target
ALL DEPENDS wrapper)
add_custom_target(main_target
ALL DEPENDS main wrapper_target)
add_dependencies(main wrapper_target)
install(
TARGETS main
RUNTIME DESTINATION bin/)
install(
PROGRAMS wrapper
DESTINATION bin/)
如果我运行cmake --install .
,脚本包装器将与二进制文件一起安装main
。运行cmake --build .
会生成脚本wrapper
,但它没有被标记为可执行文件(在 Linux 上)。
如何告诉 cmakewrapper
在构建期间也生成并将其标记为可执行文件?
注意:对于运行构建而不是安装的自动构建系统,我需要这个,并且期望特定文件在构建时可用。
解决方案
尝试:
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/wrapper.tmp
"#!/usr/bin/env bash
# Note that './main' is relative from whatever directory you are in
# Use just main assuming the install prefix is in your bath
# Or use $<TARGET_FILE:main>
# Or maybe ${CMAKE_INSTALL_PREFIX}/bin/main
./main options
")
# add execute permissions
file(
COPY ${CMAKE_CURRENT_BINARY_DIR}/wrapper.tmp
DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
)
# Rename the file
file(RENAME
${CMAKE_CURRENT_BINARY_DIR}/wrapper.tmp
${CMAKE_CURRENT_BINARY_DIR}/wrapper
)
如何告诉 cmake在构建期间也生成包装器并将其标记为可执行文件?
file(
在 cmake 脚本中 - 它在配置阶段执行,即执行 cmake 时。要在构建使用期间生成文件add_custom_command
,cmake 意义上最“可移植”的方式是在内部运行 cmake 脚本add_custom_command
:
add_custom_command
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/wrapper
COMMAND $(CMAKE_COMMAND)
-D CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}
-P ${CMAKE_CURRENT_SOURCE_DIR}/the_cmake_script.cmake
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/the_cmake_script.cmake
COMMAND Generating wrapper script...
VERBATIM
)
然后在里面the_cmake_script.cmake
你可以执行上面的脚本 -将在你的项目构建期间add_custom_command
执行命令。cmake -P <the script>
这样你就可以DEPEND
正确地在wrapper
脚本上。
推荐阅读
- web-services - 什么是 UDDI 及其用途?
- wordpress - 将 Angular 集成到 WordPress
- ruby-on-rails - 在 Rails 中使用迭代和枚举时更改显示值?
- sequelize.js - 通过关联更新 Sequelize
- r - 如何选择在回归中使用哪些列?
- java - 当 server.xml 中已经定义了上下文时,将第二个 webapp 添加到 tomcat
- redux-saga - 如何调试 saga?
- react-native - 布局更改后更新 KeyboardAvoidingView
- weblogic - 无法在 Weblogic server 12.2.1.3 控制台中为数据源创建成功连接
- jwt - 与 Autofac 集成时如何使用 JWT 识别租户?