不要扩展 CMake 列表变量

2024-02-07

我有一个 CMake 脚本,可以通过以下方式运行一些测试add_test(),在 Windows(Server 2008,不要问)下运行于 CMake 3.15。当调用这些测试时,它们运行的​​环境中的 PYTHONPATH 环境变量似乎会重置为环境默认值,并且不包含它需要的一些路径。

因此,当 CMake 运行时,我需要在运行测试时将 PYTHONPATH 设置为 $ENV{PYTHONPATH} 变量的值。它有许多用分号分隔的路径,因此 CMake 认为它是一个列表,并尝试将其扩展为许多用空格分隔的字符串,这显然会导致糟糕的结果。

我不知道如何阻止 CMake 这样做。从我所看到的一切来看,你应该能够用引号引起来:

add_test(
  NAME mytest
  COMMAND cmake -E env PYTHONPATH="$ENV{PYTHONPATH}"
  run_test_here)

...但它总是进行扩展。我还尝试使用 set_tests_properties 设置:

set_tests_properties(mytest PROPERTIES
    ENVIRONMENT PYTHONPATH="$ENV{PYTHONPATH}")

...但这似乎根本没有做任何事情 - 测试时的 PYTHONPATH 没有改变。我认为这是因为它是一个环境变量,但是通过使用常规 CMake 变量set()没有什么区别,所以我做错了。请帮助!


以下应该有效:

COMMAND cmake -E env "PYTHONPATH=$ENV{PYTHONPATH}"

您需要引用命令行的完整部分,以正确扩展消息。

测试用:

set(tmp "C:\\Python27\\Scripts;E:\\JenkinsMIDEBLD\\workspace\\...;...")
add_test(NAME MYtest1 COMMAND cmake -S . -E env "tmp=${tmp}") 
add_test(NAME MYtest2 COMMAND cmake -S . -E env tmp="${tmp}") 

运行后ctest I get:

1: Test command: /bin/cmake "-S" "." "-E" "env" "tmp=C:\Python27\Scripts;E:\JenkinsMIDEBLD\workspace\...;..."
2: Test command: /bin/cmake "-S" "." "-E" "env" "tmp="C:\Python27\Scripts" "E:\JenkinsMIDEBLD\workspace\..." "...""

第一次测试有正确的;传递给var,而第二个传递空格分隔的列表。

这就是cmake的解析方式引用的论点 https://cmake.org/cmake/help/v3.12/manual/cmake-language.7.html#quoted-argument。参数要么被完全引用,要么根本不被引用 - 部分引号被解释为文字"。所以假设:

set(var a;b;c)

下列:

var="$var"

不是引用的论点并且"是按字面意思理解的!它扩展了$var列表到空格分隔的列表中,并且"留下来,有一个"之间= and a,并且还有额外的"在最后。这var="$var"等于:

var=\"a b c\"
    ^^     ^^    - the quotes stay!
^^^^^^^ ^ ^^^    - these are 3 arguments, the last one is `c"`

不带引号的是:

var=$var

等于(注意缺少引号):

var=a c c

要引用参数,您必须引用全部内容,其中元素的第一个和最后一个字符是":

"var=$var"

将扩展到:

"var=a;b;c"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不要扩展 CMake 列表变量 的相关文章

  • CMake:不要为链接中使用的单个库设置 rpath

    我想要做的是配置我的 CMakeLists 文件 以便在构建我的项目时 链接器使用驻留在我的构建树中的共享库 so 的副本来链接可执行文件 但不会在中设置 rpath链接的可执行文件 以便系统必须在加载程序请求时提供该库 具体来说 我想在构
  • CMake:将为 lib 构建的对象文件重用到另一个 lib 目标中

    我正在尝试将我的项目转移到CMake 同时对编译过程进行一些优化 这是交易 我有几个子目录 必须 每个子目录都编译成静态库 这有效 我想将每个子目录中的所有目标文件收集到另一个更大的 完整的静态库中 它看起来像这样 libBig a mad
  • CXX 编译器标识未知

    我们在使用 Visual Studio 2012 在 Windows 7 64 位下使用 CMake v2 8 12 编译项目时遇到问题 CMake 给我们提供了以下错误 我们已经尝试使用管理员权限从 Visual Studio 命令行启动
  • 使用 target_link_libraries 以绝对路径作为库路径进行平台库名称扩展?

    在 CMake 中使用 target link libraries 仅使用库名称 例如 target link library myProject SomeLibrary 将根据平台将 SomeLibrary 扩展为 SomeLibrary
  • cmake MSYS Makefiles 生成器丢失

    我通过 pacman 安装了 cmake 3 2 3 当我尝试从 msys64 shell 中使用它时出现错误 cmake G MSYS Makefiles CMake Error Could not create named genera
  • 安装 ROS 时 Cmake 未检测到 boost-python

    我一直在尝试在我的 Mac 上安装 ROS 并根据不同版本的 boost 使用不同的库解决了错误 然而 似乎有一个库甚至没有检测到 boost python 这是我得到的错误 CMake Error at usr local share c
  • 无法在 Visual Studio 和 vcpkg 中构建 cmake 项目(致命错误 C1083)

    我今天安装了vcpkg 启用了与Visual Studio的集成 即 vcpkg集成安装 并开始安装库 我基本上安装了 cpprestsdk 并触发了 boost 库的安装 然后我在 Visual Studio CMake 中打开该项目 当
  • libSDL、CMake 和 Mac OS X Lion

    我正在尝试在我的Mac上编译cmake项目 但它取决于SDL框架 我安装了这个框架 在 cmake 之后向我报告找不到 libSDL 我自己设置了以下导出变量 按照 cmake 的建议 export SDL INCLUDE DIR Libr
  • pybind11:如何将 c++ 和 python 代码打包到一个包中?

    我正在尝试使用 CMake 和 pybind 11 将现有的 Python 代码和新的 C 11 代码打包在一起 我认为我缺少一些可以添加到 CMake 脚本中的简单内容 但在任何地方都找不到它 pybind11 示例只有 C 代码和没有P
  • cmake:设置多个项目以及它们之间的依赖关系

    我需要帮助为 C 项目编写一个好的 CMakeLists txt 我寻找答案 但我发现了什么 这是我的项目结构 MainProj ProjLib include proj lib h src proj lib cc CMakeLists t
  • 如何在使用cmake完成make后打印消息?

    我正在尝试使用 CMake 完成构建过程后打印消息 我只是想在之后通知用户make命令已完成 没有任何错误 我该怎么做 我试过add custom target 但我无法选择何时跑步 另外 我尝试过add custom command 它再
  • MinGW Make 抛出“系统找不到指定的路径。”错误

    我正在尝试在 Windows 7 上使用 cmake 生成一个 c 项目 在实际创建项目之前 cmake 会对您的工具链进行快速测试 我正在使用 MinGW 这就是我的问题所在 Cmake 触发 make 构建 最终失败并返回 系统找不到指
  • CMake:用于Android交叉编译的FIND_PACKAGE(Threads)

    我正在使用 Android NDK 和 Cmake 生成项目的共享库 我正在将现有项目从 Ubuntu 移植到 Android 现在我需要移植一些可执行文件 我成功编译了所有需要的可执行文件Threads图书馆 在CMakeList txt
  • ubuntu:升级软件(cmake)-版本消歧(本地编译)[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我的机器上安装了 cmake 2 8 0 来自 ubuntu 软件包 二进制文件放置在 usr bin cmake 中 我需要将 cmake 版本至少
  • 使用 NDK 构建具有适用于 Android 的 cmake 构建文件的 C++ 项目

    我必须构建 2 个独立的 C 项目 它们具有针对不同平台的 Cmake 构建文件设置 我想使用 NDK 为 Android 构建它们 以便我可以将它们用作 Android Studio 中的预构建库 如何使用 NDK 为 Android 构
  • Haskell 项目可以使用 cmake 吗?

    我正在计划一个用 Haskell 编写的项目 也许也有一些部分是用 C 编写的 对于构建系统 我决定不选择 Haskell 程序 cabal 的常见选择 主要是因为我想了解其他语言的构建程序是如何工作的 我听说过 CMake 我认为这是一个
  • 如何使用 --build 选项查看 cmake 发出的命令

    当我运行 cmake build target INSTALL 命令时 如何查看发出的命令 似乎没有像 versbose之类的选项 cmake 帮助说 cmake build 是底层构建工具的接口 但没有说明有关发出的命令转储的任何内容 我
  • 在cmake中设置PKG_CONFIG_PATH

    我已经在本地构建了 opencv 并将其安装到本地目录 不是系统默认目录 opencv pc存在于该本地文件夹中的 pkgconfig 文件夹下 我怎样才能找到这个opencv pc来自 cmake 因为我想从我的程序链接并包含 openc
  • 如何将 gnatmake/gnatbind/gnatlink 集成到 C/Ada 代码的 CMake 文件中?

    我用几种语言 C C Fortran77 Fortran90 编写了代码 并且可以使用 CMake 编译它 没有任何问题 效果很完美 现在 我想在用 C 编写的 main 中添加一些 Ada 函数 并且我想通过 CMake 编译它 鉴于我无
  • 如何判断给定目标是库还是可执行文件?

    内置功能install TARGETS 将库目标安装到可执行目标之外的其他位置 我想做类似的事情 给定目标名称列表 我想将其中的所有库目标添加到列表变量中 并将所有运行时目标添加到另一个变量中 我找不到 CMake 的默认目标属性列表 但我

随机推荐

  • MVC 5.1 Razor Display不适用于 Enum DisplayName

    我有以下包含枚举的实体 域 对象和模型 显示名称正确显示并且适用于 EnumDropdownList 但由于某种原因不适用于 DisplayFor 帮助程序 显示的只是实际的枚举名称 不确定我缺少什么 asp net MVC 5 1 添加了
  • 如何使用代码为 Visual Studio 等 CRUD 操作生成完整的样板代码?

    我正在尝试为数据库表的实体生成 CRUD 操作 例如使用相应的端点来使用 它与 Visual Studio 生成用于身份验证 帐户控制器 的样板代码相同 并且也以整个包的形式进行增删改查操作 我遇到过 t4 模板 但不知道如何使用它为我的数
  • 地图和字典有什么区别?

    I know a map is a data structure that maps keys to values Isn t a dictionary the same What is the difference between a m
  • 将反应路由链接集成到 Material UI 列表中

    我正在尝试创建一个链接列表 https material ui com components lists 在侧边栏中 问题是如果我使用
  • 无法连接到 net.tcp:连接尝试持续了一段时间

    在远程构建计算机上 运行单元测试时出现以下错误 测试方法 MyNameSpace1 MyNameSpace2 Service Test MyPath XYZServiceTest FindRecord 引发异常 System Service
  • 如何在 GlassFish 中更新 Mojarra 版本

    我想更新我的 JSF 应用程序以使用 Mojarra 版本 2 1 8 我将这些行添加到 WAR 包的 POM 文件中
  • 为旧浏览器显示替代错误页面时使用什么 HTTP 状态代码?

    我有一个大量使用 CSS3 和一些 HTML5 现代功能的网站 所以它在 IE7 或更低版本中不起作用并且看起来很糟糕 我们决定不支持这些旧浏览器 因为这对于极少数用户来说工作量太大 他们看到的是特殊的错误 警告页面 而不是显示常规页面 他
  • Delphi 中更好的多线程调试

    从关于 Delphi IDE 中的错误的另一个问题的答案开始 有谁知道是否有办法改进 IDE 的多线程调试功能 或者如果没有 至少为什么它有时如此糟糕 当程序中有多个线程时 使用 F7 或 F8 单步执行代码通常会导致长时间暂停 或者整个
  • 删除 Google Cloud Functions 的 tmp 文件夹中的文件

    我目前正在 os tmpdir 文件夹中的谷歌云函数中写入文件 现在我知道每次函数触发时都会略有不同 并且函数调用之间的 tmp 文件夹永远不会相同 不能两次引用相同的 tmp 文件夹 我的问题是我是否需要在函数完成执行之前删除该文件 或者
  • GWT:使用 GWT 登录页面对应用程序的某些部分进行身份验证

    我的应用程序具有一些所有用户都可以访问的功能 以及一些其他功能的访问权限应仅限于经过身份验证的用户 所有这些受限制的功能都存在于某些 GWT Places 集合中 因此 应用程序中可用的所有 Places 可以分为两组 所有人均可访问 和
  • AngularJS 禁用指令

    我正在使用editable text指令来自xeditableAngularJS 的模块 有没有办法禁用整个页面的指令 我考虑过使用替换可编辑文本 variable where variable editable text 启用和varia
  • 计算补货点 - 基于集合的 SQL 查询

    我有一个包含以下数据的视图 它代表 2 个生产单元的一种计划 每个细胞生产由多个部分组成的产品 每个生产单元都可以生产任何产品 但对于给定产品 每个单元的生产周期时间通常会有所不同 因为这些单元具有不同的配置 工具 设备 人力等 生产是按批
  • 包私有伴随对象中的隐式值/转换

    我试图找到与此相关的任何信息 文档 规格等 但这个主题似乎很难用谷歌搜索 我要求提供有关以下内容为何有效的参考资料 trait Foo A package bar trait Bar private bar object Bar impli
  • 在 Rails 中的路由上使用通配符和重定向时出错

    match myroute gt redirect http google com as gt myroute 上面的行在routes rb导致以下错误 Users user rvm rubies ruby 1 9 2 p290 lib r
  • 如何从实体对象获取对上级对象的引用

    如何从 EntityObject 类获取对上级 ObjectContext 的引用 看看下面的链接 http blogs msdn com alexj archive 2009 06 08 tip 24 how to get the obj
  • ScrollViewer 无法在 groupbox 内工作?

    我想包括ScrollViewer in my Groupbox 但它不起作用 我的代码是
  • Yandex Metrica 标签降低了网站速度 Google PageSpeed Insights 报告

    因此 在我的所有网页上 我都有此代码 Yandex metrika 使用该代码进行分析 根据谷歌的说法 这个脚本正在减慢我的页面速度 需要改变它的加载方式 以免渲染阻塞 TTI 时间输入阻塞 FID 第一个输入延迟阻塞 第一个内容绘制阻塞
  • 在数据框中设置样式后执行操作

    每当我尝试在代码中设置样式后执行任何操作时 我都会看到以下错误 AttributeError Styler 对象没有属性 drop 在本例中 我尝试在应用样式后删除一列 在其他情况下 我尝试连接 2 个数据帧 但它会引发类似的错误 我对 P
  • psql:错误:致命:用户的 Cloud SQL IAM 服务帐户身份验证失败

    我已按照以下说明使用 IAM 身份验证设置了我的云 sql 数据库 https binx io 2021 05 19 how to connect to a cloudsql with iam authentication https bi
  • 不要扩展 CMake 列表变量

    我有一个 CMake 脚本 可以通过以下方式运行一些测试add test 在 Windows Server 2008 不要问 下运行于 CMake 3 15 当调用这些测试时 它们运行的 环境中的 PYTHONPATH 环境变量似乎会重置为