在CMake中执行命令或宏,作为';配置';台阶饰面

在CMake中执行命令或宏,作为';配置';台阶饰面,cmake,Cmake,CMake(版本>=2.8.7)是否有可能在配置阶段结束前的最后一步执行宏或命令 在屏幕上打印以下行之前,应执行该功能: -- Configuring done -- Generating done 到目前为止,我还无法找到一个可以作为依赖项使用的CMake目标,以通过add\u custom\u命令add\u custom\u target或add\u dependencies实现这一点 编辑: 我们有一个导出多个CMake宏的库,其中一些宏必须在所有其他CMake命令运行后在每个CMake

CMake(版本>=2.8.7)是否有可能在配置阶段结束前的最后一步执行宏或命令

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

-- Configuring done
-- Generating done
到目前为止,我还无法找到一个可以作为依赖项使用的CMake目标,以通过
add\u custom\u命令
add\u custom\u target
add\u dependencies
实现这一点

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

也可以通过在一个宏中收集所有功能来实现这一点,该宏需要在
CMakeLists.txt
末尾显式调用。 然而,已经有几个依赖的库需要修改,而解决这个问题的方法将省去这些额外的工作。 此外,添加宏可能会被遗忘,或者很容易违反将其作为最后一条语句的要求

示例
宏.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)
示例toplevel
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
文件末尾调用一个特殊宏。

CMake命令将在配置阶段而不是构建阶段执行,因此如果将其放在CMakeLists.txt文件末尾,它将在最后执行。

据我所知,没有一个(我已经努力搜索了)。不过,我希望被证明是错的。

好吧-这个答案感觉有点脆弱,因为它利用了未记录的CMake行为。然而,它似乎确实起了作用

在配置过程即将结束时,在处理完CMakeLists.txt文件中的所有命令后,CMake将检查的值。如果通过命令监视此变量,则会在此处触发

因此,您可以将此功能包装为两个函数:

function(EOFHook Variable Access)
  if(${Variable} STREQUAL CMAKE_BACKWARDS_COMPATIBILITY AND
     (${Access} STREQUAL UNKNOWN_READ_ACCESS OR ${Access} STREQUAL READ_ACCESS))
    execute_process(COMMAND ${CMAKE_COMMAND} -E echo "In EOF hook command")
    ... do whatever else is required ...
  endif()
endfunction()

function(SetupEOFHook)
  variable_watch(CMAKE_BACKWARDS_COMPATIBILITY EOFHook)
endfunction()
要在任何CMakeLists文件中使用此选项,只需在文件中的任意位置调用
SetupEOFHook()

这有点冒险;如果变量也在CMakeLists.txt的其他位置读取,例如通过

message(${CMAKE_BACKWARDS_COMPATIBILITY})

然后它将在此处和末尾触发
EOFHook
函数。您可以通过添加计数器并检查它是否只被调用一次,或者发出
消息(致命错误…

感谢您的回答,从而增加函数的复杂性。然而,我正在寻找一些不同的东西。不幸的是,问题一开始并没有提到这一点(见编辑)。对不起,我还是不明白。听起来像是你要求在主CMakeLists文件中部分包含(macros.cmake),并让它在该CMakeLists文件末尾执行一个
函数
,但不显式调用文件末尾的
/
函数
?你能试着多解释一点吗,或者描述一下你的用例?我已经添加了另一个答案。我将保留这一条,因为这可能是实现标题要求的更“正常”的方式。我也对这一条投了更高的票。这不是对这个问题的直接回答,但现在是正确的做法!非常感谢你这一有趣的发现。这确实达到了预期的行为。但我同意它确实感觉有点脆弱。因此,在CMake提供一种正式的方法来执行类似的操作之前,要求显式执行最终函数/宏可能是最好的解决方案。@MKroehnert-是的,如果是我,我肯定会在每个CMakeLists.txt的末尾添加一个函数/宏调用。您仍然可以尝试强制使用它,例如,让关闭函数取消设置预处理器定义,从而停止构建工作。也有点“骇客”,但不如依赖隐藏的CMake内部进程那么糟糕?CMake_PARENT_LIST_文件和CMake_CURRENT_LIST_DIR似乎更可靠,它们的值在最后一个文件的末尾设置为空。