如何让 CMake 制作自定义脚本?

How can I get CMake to make a custom script?

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

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

基本上,我想要

我调查过:

但我就是不知道该怎么做!并且需要一些帮助!

也许还有其他 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"
)

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

#!/bin/sh
config_ini=
exe_path=
 
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 时,您将不必更改脚本。