【问题标题】:cmake configure_file does not expand mylib.pc.in correctlycmake configure_file 未正确扩展 mylib.pc.in
【发布时间】:2019-08-17 07:44:14
【问题描述】:

我在mylib.pc.in 中有以下代码,并想使用CMake 命令configure_file(mylib.pc.in mylib.pc) 生成正确的mylib.pc 文件,该文件从mylib.pc.in 扩展而来;但这不起作用。

prefix=$ENV{HOME}/xcompiled-root/
exe_prefix=${prefix}
libdir=${prefix}/lib
includedir=${prefix}/include

Name: @PROJECT_NAME@
Description: @PROJECT_DESCRIPTION@
Version: @PROJECT_VERSION@

Requires:
Libs: -L@{libdir} -lpthread -lrt -ldl  -lm
Cflags: -I@{includedir}

我只希望mylib.pc 是这样的:

prefix=/home/myusr/xcompiled-root/
exe_prefix=/home/myusr/xcompiled-root/
libdir=/home/myusr/xcompiled-root/lib
includedir=/home/myusr/xcompiled-root/include
...

但我明白了:

prefix=/home/myusr/xcompiled-root/
exe_prefix=
libdir=/lib
includedir=/include
...

我该怎么办?!

【问题讨论】:

  • 好吧,前缀变量设置正确吗?
  • @KamilCuk 正如我提到的输出文件“mylib.pc”,前缀配置正确,但不是其他

标签: cmake


【解决方案1】:

构造${prefix} 是一个变量引用在CMake 脚本中.pc 文件脚本中。所以你需要在哪个阶段选择你想扩展这个参考:

  1. 如果您希望 CMake 扩展此引用,则需要有一个 CMake 变量 当你使用configure_file时命名为prefix

    # File: CMakeLists.txt
    set(prefix "$ENV{HOME}/xcompiled-root/")
    configure_file(mylib.pc.in mylib.pc)
    

    注意,通过这样的设置,您不再需要在.pc 文件中定义prefix 变量:

    # File: mylib.pc.in
    exe_prefix=${prefix}
    libdir=${prefix}/lib
    includedir=${prefix}/include
    

    生成的mylib.pc 文件将是:

    exe_prefix=/home/myusr/xcompiled-root/
    libdir=/home/myusr/xcompiled-root/lib
    includedir=/home/myusr/xcompiled-root/include
    
  2. 如果你想扩展变量引用 ${prefix} 只有当 pkg-config 是 调用时,您需要阻止 CMake 来扩展此引用。例如。您可以在 ${ 字符之间插入 ${} 构造,该构造由 CMake 扩展为空:

    # File: mylib.pc.in
    prefix=$ENV{HOME}/xcompiled-root/
    exe_prefix=$${}{prefix}
    libdir=$${}{prefix}/lib
    includedir=$${}{prefix}/include
    

    那么,用普通的configure_file

    # File: CMakeLists.txt
    configure_file(mylib.pc.in mylib.pc)
    

    您将拥有以下mylib.pc 文件:

    prefix=/home/myusr/xcompiled-root/
    exe_prefix=${prefix}
    libdir=${prefix}/lib
    includedir=${prefix}/include
    

    pkg-config 处理此文件时,${prefix} 将(内部)扩展为/home/myusr/xcompiled-root/

  3. 如果您不想为转义 ${} 构造而烦恼,请使用 @ONLY 选项 为configure_file。使用该选项 CMake 仅扩展 @VAR@ 但离开 ${var}不变:

    # File: CMakeLists.txt
    # Construction @VAR@ doesn't support reference to environment variable.
    # So prepare pure CMake variable which contains $ENV{HOME}.
    set(user_home "$ENV{HOME}")
    configure_file(mylib.pc.in mylib.pc @ONLY)
    

    使用@ONLY 选项,您可以简单地在.in 中使用$

    prefix=@user_home@/xcompiled-root/
    exe_prefix=${prefix}
    libdir=${prefix}/lib
    includedir=${prefix}/include
    
    Name: @PROJECT_NAME@
    Description: @PROJECT_DESCRIPTION@
    Version: @PROJECT_VERSION@
    
    Requires:
    Libs: -L@{libdir} -lpthread -lrt -ldl  -lm
    Cflags: -I@{includedir}
    

    注意,CMake 也保持不变 @{var} 构造。这是因为{ 字符对于 CMake 中的变量名无效。

【讨论】:

  • 所以通过这个答案不需要检查mylib.pc,只检查mylib.pc.in就足够了?!
  • 不确定你想“检查”什么,但结果mylib.pc 的内容仍然很重要:这个文件将由pkg-config 处理,它对CMake 及其变量一无所知。我的回答只是描述了从 mylib.pc.in 模板获取 desired mylib.pc 的方法。
  • 谢谢;看来我对pkg-config的了解不是很好,所以我解决了这个作为答案
猜你喜欢
  • 2018-06-07
  • 1970-01-01
  • 2011-07-05
  • 2020-09-10
  • 2020-10-19
  • 1970-01-01
  • 1970-01-01
  • 2022-10-16
相关资源
最近更新 更多