为所有(二进制)目标执行其他操作的最佳方法是什么?
示例:
我不知道C / C ++开发人员使用非标准命令(如add_library2
)。我希望他们使用和学习官方的CMake功能,但让他们做额外的,项目特定的,东西。
答案 0 :(得分:1)
通过定义同名的CMake函数,可以覆盖内置CMake函数add_library
和add_executable
。例如,要自动签署所有添加的可执行文件,请添加以下代码:
function (add_executable _name)
_add_executable(${ARGV})
if (TARGET ${_name})
add_custom_command(TARGET ${_name} POST_BUILD
COMMAND sign_executable $<TARGET_FILE:${_name}>)
endif()
endfunction()
原始内置add_executable
可以通过在其前面添加下划线字符来调用。可以将相同的模式应用于add_library
以检查库的名称。
答案 1 :(得分:1)
您可以覆盖任何CMake命令/功能以扩展其功能,但请
我强烈主张以他们的名字来称呼这些东西而不是暗中做事。每个人都可以更轻松地使用/维护/调试基于CMake的项目。
如果您想签署您的可执行文件 - 这甚至可能是特定于平台的 - 您可以创建一个像add_post_build_step_sign_executable()
这样的函数来添加适当的后期构建步骤:
add_executable(MyExe main.cpp)
if (WIN32)
add_post_build_step_sign_executable(MyExe)
endif()
如果你不得不经常重复自己,那么将代码片段放入像my_project_add_signed_executable()
这样的函数中。它仍然可以具有与CMake的add_executable()
命令相同的参数语法。
关于库命名检查,我认为这更像是检查项目的CMake脚本编码样式,并且不会对此使用运行时检查。
例如,您可以使用cmake-lint
或您自己的外部脚本来检查是否符合要求。