问题标签 [cmake-language]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
909 浏览

cmake - CMake - if() 命令如何处理符号?作为字符串还是变量?

我不确定 CMakeif()命令会将条件子句中的符号视为变量还是字符串文字。所以我做了一些实验。

Script1.cmake

输出是:

所以我得出以下结论 1

对于条件子句中的符号:

  • 如果符号之前定义为变量,CMake 会将其视为变量并使用其值进行评估。
  • 如果符号之前未定义为变量,CMake 会将其视为字符串。

然后我又做了一个实验。

输出是:

因此,尽管明确定义为变量,该ON命令仍将其视为 TRUE 值的常量。这与我之前的结论 1直接矛盾。if

那么我如何确定 CMake if() 命令会将符号视为字符串还是变量?

2019 年 7 月 11 日上午 11:04 添加

似乎该if(constant)形式先于其他形式的if()陈述。()

如果常数为 1、ON、YES、TRUE、Y 或非零数字,则为真。如果常量为 0、OFF、NO、FALSE、N、IGNORE、NOTFOUND、空字符串或以后缀 -NOTFOUND 结尾,则为 False。命名布尔常量不区分大小写。如果参数不是这些特定常量之一,则将其视为变量或字符串,并使用以下签名。

所以现在,在应用我的结论 1之前,我必须先参考上述规则。(这可能是一个答案,但我还不确定。)

0 投票
0 回答
18 浏览

cmake - 如何判断变量来自哪里?

我有一个目录CMakeLists.txt。它调用module1.cmake位于其他地方的 CMake 模块文件。

module1.cmake将引用一个名为 的变量XXX,该变量可能来自:

  1. 环境变量%XXX%
  2. 命令行通过cmake -D XXX=
  3. XXX在调用目录的CMakeLists.txtthrough中定义set()
  4. 以及之前配置的构建文件夹中的 CACHE 条目

然后module1.cmake将变量存储XXX到CACHE中。

module1.cmake文件中,我需要告诉XXX来自哪里,因为我需要区别对待它们。

对于 1,我可以检查 的值$ENV{XXX}

对于 4,我正在考虑使用get_property(cached_XXX CACHE XXX PROPERTY VALUE)并检查cached_XXX. 但事实证明,该-D XXX=选项总是更新 CACHE 条目。所以我无法判断该cached_XXX值是来自旧 CACHE 还是来自当前-D选项。

所以毕竟,我怎么能分辨2, 3 和 4

0 投票
1 回答
133 浏览

cmake - 自定义命令不会在 cmake 中使用 --target 选项执行

此问题的后续问题:cmake 项目仅构建一个特定的可执行文件(及其依赖项)

我编写了一个自定义目标,因此每次我在项目中编译某些内容时它都会运行。现在我按照上面的问题调用了一个显式目标,这个自定义命令不再执行。代码:

我已经尝试删除该ALL指令,但它没有改变任何东西。

忘了补充:我使用cmake/3.13.4的是从源代码编译的。

0 投票
1 回答
89 浏览

c++ - cmake:安装外部提供的包含和库

我有一个非常简单的问题,我找不到解决方案:

我正在与一家公司合作,该公司偶尔会向我发送两个目录,一个带有 .h 文件,第二个带有两种形式的库,共享和静态。说 -

我想用一个执行这个简单操作的 cmake 项目来包装这个输入 - 创建一个我可以安装的 cmake 目标、别名、版本等。

0 投票
1 回答
526 浏览

cmake - 如何使用 cmake 生成 .out 文件?

我正在使用 CMake 为 ARM Cortex-M 进行交叉编译以配置项目。

到目前为止,我已经成功地设置了项目并且正在生成可执行文件。但是,要刷新电路板,我需要一个“.hex”。文件。

我已经按照 gcc 的 Nordic nRF5SDK 示例来获取有关编译和链接阶段的一些线索,并将它们传递给 CMake 例程。

但是,我无法生成任何“.out”文件来正确提取“.hex”文件。我玩过编译标志和链接器标志,但没有成功。

我已经在工具链文件和编译器中设置了初始化标志,十六进制是使用自定义命令生成的:

问题是我使用二进制文件来提取十六进制,而不是正确的“.out”文件。

如何在不使用与主构建并行的另一个自定义命令的情况下生成它?

PS:这里是项目的当前状态https://github.com/NunoRVicente/cmake-arm-toolchain

0 投票
1 回答
254 浏览

cmake - 如何在构建步骤中从对象名称中删除文件扩展名?

CMAKE_<LANG>_COMPILE_OBJECT是设置编译规则的变量。

此变量设置在CMake<LANG>Information.cmake. 源文件被构建并产生一个目标文件build/hello_world.o。CMake 期望编译器生成不同的对象名称。

如何my在构建步骤中从对象名称中删除源文件扩展名?

0 投票
0 回答
543 浏览

cmake - CMake:使用转义字符获取环境变量

假设想MY_VAR在 CMake 中使用环境变量。这可以简单地通过使用来完成set(myVar $ENV{MY_VAR})

但是如果MY_VAR包含转义字符MY_VAR="/path/with/escaped\ chars"怎么办?CMake 将\后跟空格视为两个单独的字符,而不是单个字符(空格)。换句话说,

打印/path/with/escaped\ chars,不是/path/with/escaped chars如何让 CMake 识别环境变量中的转义字符?有没有关于这个问题的最佳实践?我在 macOS 上运行 CMake,但希望有一个独立于平台的解决方案......

上下文: Cmake 用于C++在安装之前配置框架。MY_VAR包含用户提供的路径,用于 (a) 在 Makefile 中设置和CMAKE_PREFIX_PATH(b) 由 Cmake 到configure_file框架所需的 python 脚本的配置文件。

0 投票
0 回答
121 浏览

c++ - 为什么每次我编辑任何副本时,我在不同文件夹中的所有 CMakelist.txt 文件都会被覆盖?

我有一个文件夹/home/ros/codes。在其中,我有按日期排列的文件夹,其中有一个 CMakeLists.txt 文件和一个构建文件夹,我在其中运行 cmake.. 和 make 命令。

最近,我观察到如果我从这组文件夹中的任何一个中编辑任何 CMakelists.txt 文件,编辑会自动覆盖在所有其他文件中。即使我已将另一个文件重命名为 -say- CMakelists(copy).txt ,这些更改仍然会得到反映。我可以看到这些是锁定的文件。所以我正在使用 sudo gedit 来编辑它们。

为什么会发生这种情况,我该如何进一步避免它?

0 投票
1 回答
215 浏览

c++ - 将从命令行翻译的库链接到 Make

我正在尝试运行英特尔数学内核库(mkl)。有一个工具 ( https://software.intel.com/en-us/articles/intel-mkl-link-line-advisor ) 可以打印必要的、依赖于环境的 cmd 命令,以便将其用于 C++ 脚本。对我来说,它说:

使用此链接行: ${MKLROOT}/lib/libmkl_intel_lp64.a ${MKLROOT}/lib/libmkl_intel_thread.a ${MKLROOT}/lib/libmkl_core.a -liomp5 -lpthread -lm -ldl

编译器选项: -m64 -I${MKLROOT}/include

我的目标是在 CMake 脚本中编写它。我哪里错了/我必须写什么才能完成这项工作?

0 投票
2 回答
113 浏览

cmake - 在宏内使用带有 CMake 的 find_package 的 Qt4 出现问题

我在 CMake(版本 3.10)中定义了以下宏:

现在,当我尝试通过以下方式调用宏时,出现错误:

报告的错误是:

如果我find_package()在宏内按以下方式调用,它可以工作!

但是我需要通过设置一个变量来使用它,如前所述。我该如何解决这个问题?