如何让 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
基本上,我想要
- 有自定义目标
make foo-target
- 我希望
foo-target
依赖于我在 cpp/main.cpp
中内置的可执行文件
- 我希望
foo-target
以某种方式配置 myscript.sh
myscript.sh
被配置为知道在哪里可以找到 foo/config.ini
(类似于 ini 的绝对路径)
myscript.sh
也被配置为知道在哪里可以找到 cpp/main.cpp
中内置的可执行文件
我调查过:
- add_custom_command
- add_custom_target
- configure_file
- 正在将变量导出到环境(通过添加自定义命令)
但我就是不知道该怎么做!并且需要一些帮助!
也许还有其他 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 时,您将不必更改脚本。
我有一个具有以下文件夹结构的项目:
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
中内置的可执行文件
我调查过:
- add_custom_command
- add_custom_target
- configure_file
- 正在将变量导出到环境(通过添加自定义命令)
但我就是不知道该怎么做!并且需要一些帮助!
也许还有其他 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 时,您将不必更改脚本。