CMake:从脚本中设置环境变量

53

我有一个脚本,用于设置所有交叉编译所需的变量。这里只是其中的一部分:

export CONFIG_SITE=~/workspace/eldk-5.4/powerpc/site-config-powerpc-linux
export CC="powerpc-linux-gcc  -m32 -mhard-float --sysroot=~/workspace/eldk-5.4/powerpc/sysroots/powerpc-linux"
export CXX="powerpc-linux-g++  -m32 -mhard-float --sysroot=~/workspace/eldk-5.4/powerpc/sysroots/powerpc-linux"
export CPP="powerpc-linux-gcc -E  -m32 -mhard-float --sysroot=~/workspace/eldk-5.4/powerpc/sysroots/powerpc-linux"
export AS="powerpc-linux-as "
export LD="powerpc-linux-ld  --sysroot=~/workspace/eldk-5.4/powerpc/sysroots/powerpc-linux"
export GDB=powerpc-linux-gdb

如果我运行source environment-setup-powerpc-linux,所有的环境变量都会被导入到当前的shell会话中,然后我就可以编译我的示例代码。

是否可能在cmake中导入这些变量?如果可以,如何操作?


更多细节:

  1. 我正在使用ELDK v 5.4,它的安装脚本会生成一个脚本来设置所有的环境变量
  2. 我找到了这篇教程,其中解释了如何手动设置交叉编译,但没有解释如何使用设置了所有变量的脚本
  3. 如果在设置cmake之前调用脚本,一切都很好,并且我可以进行交叉编译,但我希望cmake能够调用该脚本
2个回答

99

阅读cmake快速入门,您可以在命令行上指定变量:

cmake -DVARIABLE1=value1 -DVARIABLE2=value2 ...
否则,cmake脚本中的set命令可能是你想要的,参见参考手册。要设置环境变量PATH,请执行以下操作:
set(ENV{PATH} "/home/martink")

设置普通变量,可以这样做:

set(variable "value")

不确定哪些变量需要设置,可能是环境变量。

话虽如此,在调用cmake之前设置环境变量通常是解决问题最简单的方法。如果你想以跨平台的方式做到这一点,而不依赖于特定shell语法来设置环境变量,则可以使用cmake -E env命令。


11
set(ENV{PATH} "/home/martink") 这个对于其他人有用吗?在我的电脑上不起作用。 - Pritesh Acharya
6
@PriteshAcharya,这里有一个错别字,应该是type set($ENV{PATH} "/home/martink")。 - Jean Davy
4
@JeanDavy,我认为那不是一个打字错误 - set($ENV{PATH} "/home/martink")会把当前路径的值放在你指定$ENV{PATH}变量名的位置,所以它不会设置你认为的内容。我自己也不小心这样做了!更常见的路径设置是set(ENV{PATH} "/home/martink:$ENV{PATH}"),这时'$'就是必需的。 - J.Churchill
请问,我应该将set(...)命令添加到哪个文件中?我看到一些*.cmake文件和CMakeFiles目录以及一个Makefile(在构建目录中) 。 - Chan Kim
1
@PriteshAcharya 是的,对我来说可以工作(CMake v3.7)。(我只是确认一下,以防有人在意,因为距离第一条评论已经过去了3年) - lef
显示剩余3条评论

6

在CMake中可靠地进行交叉编译的唯一方法是使用工具链文件,就像您找到的教程所做的那样设置编译器和标志。

当我们面临与您相同的问题(生成设置编译环境脚本的工具包)时,我们改变了工具包的方式,使其生成一个带有工具链文件的脚本。

实际上,CMake的工具链文件并不经常更改。通常,用于目标的基本标志很早就固定了。并且使用CMake的 CMAKE_BUILD_TYPE 您可以在不更改工具链文件的情况下在调试和发布模式之间切换。

如果您需要支持不同的目标,请创建不同的工具链,并使用CMake的源外构建。

编辑:您可以使用 -D 参数调用 cmake 设置所需的变量,并在运行脚本前先引用脚本。

source environment-setup-powerpc-linux
cmake -DCMAKE_C_COMPILER=$CC -DCMAKE_CXX_COMPILER=$CXX etc

结果将与使用工具链文件相同。

那么,这是否意味着没有办法做我想要的事情?虽然它不经常改变,但它确实会改变。然后有人必须不要忘记将该脚本转换为cmake规则。 - BЈовић
1
在当前的cmake工作方式中,你不能简单地告诉cmake导入一个脚本,就像你拥有它一样。当然,你可以创建一个包装脚本,将你的脚本转换为工具链文件,但这仍然是你必须要做的工作。 - Patrick B.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接