cmake “configure_file”错误地扩展变量

zpjtge22  于 7个月前  发布在  其他
关注(0)|答案(1)|浏览(78)

我在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
...


我该怎么办

vxf3dgd4

vxf3dgd41#

构造${prefix}在CMake脚本中.pc文件脚本中都是一个变量引用,所以你需要选择在哪个阶段展开这个引用:
1.如果想让CMake展开这个引用,在使用configure_file时需要有一个名为prefixCMake变量

# 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


1.如果只想在调用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/
1.如果你不想为转义${}的构造而烦恼,可以为configure_file使用@ONLY选项。使用该选项,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中对于变量名无效。

相关问题