首页 > 解决方案 > 使用 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在构建期间也生成并将其标记为可执行文件?

注意:对于运行构建而不是安装的自动构建系统,我需要这个,并且期望特定文件在构建时可用。

标签: cmake

解决方案


尝试:

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脚本上。


推荐阅读