在CMake中执行命令或宏,作为';配置';台阶饰面
CMake(版本>=2.8.7)是否有可能在配置阶段结束前的最后一步执行宏或命令 在屏幕上打印以下行之前,应执行该功能:在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
-- 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)
示例toplevelCMakeLists.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似乎更可靠,它们的值在最后一个文件的末尾设置为空。