gpt4 book ai didi

cmake - configure_file 中的生成器表达式

转载 作者:行者123 更新时间:2023-12-05 01:17:10 26 4
gpt4 key购买 nike

我们正在移植一些相当旧的代码,当然我们现在想使用生成器表达式。作者 configure_file生成的 .pc 文件现在包含 -I$<INSTALL_INTERFACE:include> .我发现的关于如何解析生成器表达式的唯一提示是使用

file(GENERATE 

当然这是在配置步骤中执行的,所以上面的表达式被解析为一个空字符串。

编辑:这是一个例子CMakeLists.txt:

cmake_minimum_required(VERSION 3.11)
project(test CXX)

add_library(foo SHARED main.cpp)

target_include_directories(foo PUBLIC $<INSTALL_INTERFACE:include>)

# now later buried deep in some functions

get_property( _include_dirs TARGET foo PROPERTY INCLUDE_DIRECTORIES )

configure_file(config.in config.out @ONLY)
# content of config.out is "include = -I$<INSTALL_INTERFACE:include>"

file(GENERATE OUTPUT config.out2 INPUT ${CMAKE_CURRENT_BINARY_DIR}/config.out)
# content of config.out2 is "include = -I"
# most likely because the INSTALL_INTERFACE isn't used when the file is generated

config.in:

include = @_include_dirs@

而 main.cpp 只是空的。

最佳答案

正如 CMake 文档所述 file (GENERATE ...)命令可以使用由生成器计算的生成器表达式。

生成文件

您可以让 CMake 直接生成包含自定义代码的文件,而无需 configure_file 的解决方法命令。

单配置生成器

对于像 Makefiles 这样的单一配置生成器,您可以使用:

file (GENERATE
OUTPUT "config.out"
CONTENT "include = -I$<INSTALL_INTERFACE:include>"
)

由于我的 CMake 代码必须同时使用多配置和单配置生成器,所以我没有专门测试代码。

单配置和多配置生成器

一般而言,对于所有生成器,可以使用以下签名:

file (GENERATE
OUTPUT "config_$<CONFIG>.out"
CONTENT "include = -I$<INSTALL_INTERFACE:include>"
)

由于与Visual Studio 等多配置生成器相关的命令的性质,这将在您的构建文件夹中为该变量中指定的每个构建类型生成多个文件 CMAKE_CONFIGURATION_TYPES :

  • config_Debug.out
  • config_Release.out
  • config_RelWithDebInfo.out
  • ...
  • config_< BUILD_TYPE >.out

如果您没有指定唯一的文件名并且 CMake 尝试生成文件,它将停止执行并出现错误。

使用生成的文件

要使用以前生成的文件,这取决于您的需要。首先,所有文件将在配置 阶段之后存在。

单配置生成器

要在具有常量名称(例如 config.out)的单配置生成器场景中使用生成的文件,应该不需要额外的工作。

单配置和多配置生成器

对于多配置生成器,它略有不同。因为你必须使用 generator expressions在构建时访问适当的文件。如果您有支持生成器表达式的 CMake 指令,那么您可以只使用文件名 config_$<CONFIG>.out .

但是,如果您需要将文件命名为完全相同而不管构建类型如何(如 config.out),它就会变得有点棘手。

首先你必须告诉 CMake 应该有一个名为 config.out 的文件通过使用 add_custom_command并指定 OUTPUT 参数:

add_custom_command (
COMMAND ${CMAKE_COMMAND} "-E" "copy_if_different" "config_$<CONFIG>.out" "config.out"
VERBATIM
PRE_BUILD
DEPENDS "config_$<CONFIG>.out"
OUTPUT "config.out"
COMMENT "creating config.out file ({event: PRE_BUILD}, {filename: config.out})"
)

CMake 将在内部创建一个文件依赖项,每次引用文件名 config.out它将确保 add_custom_command 得到执行。

但这并不适用于所有情况,因为它取决于应该使用该文件的进一步说明。

根据您使用的命令,您现在可以指定文件 config.out作为某些命令(如 target_sources,...)的输入,CMake 将在文件依赖级别上检测它必须确保 config.out 的存在。 .

如果您想生成一个未在文件依赖级别上引用的文件(如 versioninfo.txt),那么您必须确保每次执行构建目标时 CMake 都执行 add_custom_command通过目标依赖:

add_custom_target ("generate_config_out" DEPENDS "config.out")
add_dependencies ("MY_LIBRARY_TARGET" "generate_config_out")

每次 CMake 构建 MY_LIBRARY_TARGET target 它之前会构建 generate_config_out目标又取决于 config.out CMake 将在文件依赖级别上进行处理。

关于cmake - configure_file 中的生成器表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51283000/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com