为所有目标做点什么

时间:2018-01-25 16:26:15

标签: cmake

为所有(二进制)目标执行其他操作的最佳方法是什么?

示例:

  • 我想检查每个库名称是否遵循模式。
  • 我想签署每个可执行文件。

我不知道C / C ++开发人员使用非标准命令(如add_library2)。我希望他们使用和学习官方的CMake功能,但让他们做额外的,项目特定的,东西。

2 个答案:

答案 0 :(得分:1)

通过定义同名的CMake函数,可以覆盖内置CMake函数add_libraryadd_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或您自己的外部脚本来检查是否符合要求。

参考