首页 > 解决方案 > cmake configure_file 未正确扩展 mylib.pc.in

问题描述

我有以下代码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
...

我应该怎么办?!

标签: cmake

解决方案


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

  1. 如果您希望CMake扩展此引用,则需要在使用时 命名一个CMake 变量prefixconfigure_file

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

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

    # 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. 如果只想在调用pkg-config${prefix}时扩展变量引用,则需要阻止 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 中的变量名称无效。


推荐阅读