cmake - 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 脚本和文件脚本中的${prefix}
变量引用。所以你需要选择在哪个阶段扩展这个引用:.pc
如果您希望CMake扩展此引用,则需要在使用时 命名一个CMake 变量:
prefix
configure_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
如果只想在调用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/
.如果您不想为逃避
${}
施工而烦恼,@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 中的变量名称无效。
推荐阅读
- webpack - Webpack 5 编译成功但应用程序不起作用:未捕获的 ReferenceError:未定义导出
- python - 使用 azure 函数从表单数据请求中详细说明并存储在 azure blob 中的多个文件
- pine-script - Pinescript如何在子窗口的左侧放置标签
- javascript - 如何使用 rselenium 单击 javascript“链接”开始下载 excel 文件?
- python - 如何将文件中的文本添加为字典的输入
- css - vis-timeline - 将自定义时间标记标签放置在时间轴上方
- javascript - 如果我不想对原始请求做任何事情,我应该在 JS Service Worker onFetch 回调函数中返回一个承诺吗?
- php - Mailtrap 不适用于 Wordpress localhost(在 Xampp 上运行)
- php - CURL API 用 php 和 html 在表格中显示数据
- c++ - Docker 镜像问题查找头文件