Do something for all targets

2020-08-08 10:37发布

What is the best way to do additional stuff for all (binary) targets?

Examples:

  • I want to check that each library name follows a pattern.
  • I want to sign each executable.

I dont what the C/C++ developers to use nonstandard commands (like add_library2). I want them to use and learn the official CMake functions, but have them do additonal, project specific, stuff.

标签: cmake
2条回答
Lonely孤独者°
2楼-- · 2020-08-08 11:13

The built-in CMake functions add_library and add_executable can be overidden by defining CMake functions of the same name. E.g., to automatically sign all added executables add the following code:

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()

The original built-in add_executable can be invoked by prefixing it with an underscore character. The same pattern can be applied to add_library to check the name of the library.

查看更多
看我几分像从前
3楼-- · 2020-08-08 11:28

You can overwrite any CMake command/function to extend its functionality, but please

Call Things by their Names

I strongly advocate to call the things by their names and not doing things implicitly. It will be easier for everybody using/maintaining/debugging your CMake based project.

If you want to sign your executable - and that's probably even platform specific - you create a function like add_post_build_step_sign_executable() which would add the appropriate post build steps:

add_executable(MyExe main.cpp)
if (WIN32)
    add_post_build_step_sign_executable(MyExe)
endif()

And if you have to repeat yourself too often put that code snippet into a function like my_project_add_signed_executable() itself. It could still have the same parameter syntax as CMake's add_executable() command.

Runtime Checks vs. Static Code Analysis

Regarding library naming checks, I see this more like checking against your project's CMake script coding styles and would not use runtime checks for this.

For example you could use something like cmake-lint or your own external script to check for conformity.

References

查看更多
登录 后发表回答