8

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

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

-- Configuring done
-- Generating done

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

编辑:我们有一个导出多个 CMake 宏的库,其中一些宏必须CMakeLists.txt在所有其他 CMake 命令运行后在每个文件的末尾执行。理想情况下,可以通过在文件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)

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

4

2 回答 2

6

好的 - 这个答案感觉有点脆弱,因为它使用了未记录的 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 ...)

于 2013-04-05T02:19:34.670 回答
2

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

于 2013-04-02T12:37:00.880 回答