在 CMake 中执行命令或宏作为“配置”步骤完成之前的最后一步

2023-11-21

在配置阶段完成之前,是否可以使用 CMake(版本 >= 2.8.7)作为最后一步执行宏或命令?

应在屏幕上打印以下行之前执行该功能:

-- Configuring done
-- Generating done

到目前为止,我无法找到可以用作依赖项来实现此目的的 CMake 目标add_custom_command add_custom_target or add_dependencies.

编辑: 我们有一个导出多个 CMake 宏的库,其中一些宏必须在每个宏的末尾执行CMakeLists.txt运行所有其他 CMake 命令后生成文件。 理想情况下,可以通过包含文件来实现所需的行为macros.cmake in a CMakeLists.txt文件,无需在此末尾添加额外的命令CMakeLists.txt file.

也可以通过将所有功能收集在一个宏中来实现这一目标,该宏需要在宏的末尾显式调用CMakeLists.txt。 但是,已经有几个需要调整的依赖库,并且此问题的解决方案将省略此额外的工作。 此外,添加宏可能会被忘记,或者很容易违反将其作为最后一条语句的要求。

Example macros.cmake:

macro(FINAL_MACRO)
    message(STATUS "Last step before finishing Configure phase")
endmacro()

# HERE: something like add_custom_target(final_steps)
# followed by something like add_dependencies(final_steps cmake_configure_finished)

顶层示例CMakeLists.txt:

cmake_minimum_required(VERSION 2.8.7)
include(macros.cmake)

add_subdirectory(source)
add_subdirectory(interfaces)

# Here FINAL_MACRO should get executed without explicitly writing it down

如果没有其他选择,我们将不得不要求每个用户在他们的末尾调用一个特殊的宏CMakeLists.txt file.


如果您使用的是 CMake >=3.18,那么您可以使用cmake_语言(DEFER)将调用推迟到当前目录或另一个目录的末尾,例如CMAKE_SOURCE_DIR.

Example:

## Things to be done at the very end of configure phase
## as if they would be at bottom of CMakelists.txt
cmake_language(DEFER DIRECTORY ${CMAKE_SOURCE_DIR} CALL _my_hook_end_of_configure())
function(_my_hook_end_of_configure)
    message("Hello end of configure!")
endfunction(_my_hook_end_of_configure)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 CMake 中执行命令或宏作为“配置”步骤完成之前的最后一步 的相关文章

随机推荐