【问题标题】:How can I get CMake to make a custom script?如何让 CMake 制作自定义脚本?
【发布时间】:2021-08-23 21:11:32
【问题描述】:

我有一个具有以下文件夹结构的项目:

src/
|
|- foo/config.ini
|- bar/config.ini
|- tool/
|   | - myscript.sh
|   | - CMakeLists.txt
|- cpp/
    |- main.cpp
    |- baz.cpp
    |- CMakeLists.txt

基本上,我想

  • 有一个自定义目标make foo-target
  • 我希望foo-target 依赖于我在cpp/main.cpp 中内置的可执行文件
  • 我希望foo-target 以某种方式配置myscript.sh
    • myscript.sh 已配置为知道在哪里可以找到 foo/config.ini类似于拥有 ini 的绝对路径
    • myscript.sh 也被配置为知道在哪里可以找到内置在 cpp/main.cpp 中的可执行文件

我已经调查过了:

但我就是不知道怎么做!并且可以使用一些帮助!

也许还有其他 CMake 命令可以提供帮助,或者我正在尝试一些我不应该做的愚蠢的事情,感谢任何帮助!

适用于 CMake 3.4 及以上版本

编辑:

这是myscript.sh的示例

#!/bin/sh
CONFIG_INI=@CONFIG_INI_ABS_PATH@
EXE_PATH=@EXE_ABS_PATH@
 
echo "Config path is $CONFIG_INI"
echo "Exe path is $EXE_PATH"

至于tools下的CMakeLists.txt

set (CONFIG_INI_ABS_PATH ${PROJECT_SOURCE_DIR}/foo/config.ini)
set (EXE_ABS_PATH ${PROJECT_SOURCE_DIR}/cpp/myExe)

# This works, but how can I make it depend on myExe
# And how can I configure it "on command" (i.e. make foo-target)
configure_file(myscript.sh myscript.sh
  USE_SOURCE_PERMISSIONS 
  @ONLY
)

# Can't figure out how to use this one
add_custom_command(OUTPUT myscript.sh
  # COMMAND use sed to modify the bash script? by cahcing all @*@ to what I want?
)

add_custom_target(foo-target
  DEPENDS myExe # I know that I need this to make my target depend on "myExe"
)

【问题讨论】:

  • myscript.sh is configured “配置脚本”是什么意思? I just can't figure out how to你能说得更具体点吗?你不知道如何添加自定义目标,或者如何依赖可执行文件,或者如何配置脚本,或者如何获取foo/config.ini 的路径,或者如何找到编译生成的可执行文件cpp/main.cpp
  • add_custom_command 应该完成你想要的,这种方法有什么问题?
  • 再更新一下问题...这基本上归结为我不知道如何正确使用add_custom_command,甚至不知道要谷歌什么
  • use sed to modify the bash script? 但是为什么要修改呢?为什么不喜欢将路径作为参数传递?脚本有什么作用?您的脚本是否生成一些输出,或者您只是想运行它来打印两行文本? IE。你的脚本是无状态的还是修改了文件?

标签: cmake


【解决方案1】:

将选项作为参数传递给脚本:

#!/bin/sh
config_ini=$1
exe_path=$2
 
echo "Config path is $config_ini"
echo "Exe path is $exe_path"

使用generator expression 获取可执行文件的路径。假设您的脚本不生成任何内容,您可以:

add_executable(my_exe ...)

find_program(SHELL sh REQUIRED)
add_custom_target(foo-target
     COMMENT "Print two lines"
     COMMAND
          ${SHELL}
          ${CMAKE_CURRENT_SOURCE_DIR}/script.sh
          ${CMAKE_CURRENT_SOURCE_DIR}/foo/config.ini
          $<TARGET_FILE:my_exe>
     DEPENDS 
          ${CMAKE_CURRENT_SOURCE_DIR}/script.sh
          ${CMAKE_CURRENT_SOURCE_DIR}/foo/config.ini 
          $<TARGET_FILE:my_exe>
     VERBATIM
)

不要使用make target_name。更喜欢使用cmake --build build_dir --target target_name,这样当您切换到速度快很多倍的 Ninja 时,您无需更改脚本。

【讨论】:

  • 抱歉这么久才回答,个人问题...最后我用了类似于你上面所说的东西,谢谢!
猜你喜欢
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
  • 2015-11-23
  • 2023-01-17
  • 1970-01-01
  • 2012-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多