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

时间:2013-04-02 09:28:28

标签: cmake

在配置阶段结束之前,CMake(版本> = 2.8.7)以某种方式执行宏或命令作为最后一步吗?

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

-- Configuring done
-- Generating done

到目前为止,我无法找到可用作add_custom_command add_custom_targetadd_dependencies实现此目标的依赖关系的CMake目标。

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

还可以通过收集一个宏中的所有功能来实现这一点,这需要在CMakeLists.txt结束时明确调用。 但是,已经有几个依赖库需要进行调整,这个问题的解决方案将省略这项额外的工作。 此外,添加宏可能会被遗忘,或者可能很容易违反对最后一个语句的要求。

示例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)

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

3 个答案:

答案 0 :(得分:3)

好的 - 这个答案感觉有点脆弱,因为它正在利用未记录的CMake行为。但是,它似乎确实有效。

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

所以你可以将这个功能包装成几个函数:

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函数。您可以通过添加计数器并检查它只调用一次或者发出message(FATAL_ERROR ...)

来为函数添加更多复杂性

答案 1 :(得分:1)

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

答案 2 :(得分:0)

我所知道的(并且我很努力)。不过,我很想被证明是错的。