【问题标题】:cmake : Set environment variables from a scriptcmake : 从脚本设置环境变量
【发布时间】:2014-01-29 14:35:43
【问题描述】:

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

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. 我找到this tutorial,它解释了如何手动设置交叉编译,但没有说明如何使用脚本,它设置了所有内容
  3. 如果我在设置 cmake 之前调用脚本,一切正常,我可以交叉编译,但我希望 cmake 调用脚本

【问题讨论】:

    标签: linux cmake environment-variables cross-compiling build-system


    【解决方案1】:

    通读cmake quick start,可以在命令行中指定变量:

    cmake -DVARIABLE1=value1 -DVARIABLE2=value2 ...
    

    否则,cmake 脚本中的set 命令可能就是你想要的,见reference manual。要设置环境变量 PATH,请执行以下操作:

    set(ENV{PATH} "/home/martink")
    

    要设置普通变量,请执行以下操作:

    set(variable "value")
    

    不确定你必须设置哪些,可能是环境的。

    也就是说,在调用 cmake 之前设置环境变量 通常是解决问题的最简单的解决方案,例如:https://stackoverflow.com/a/15053460/684229

    【讨论】:

    • set(ENV{PATH} "/home/martink") 这对任何人都有效吗?它不适用于我的
    • @PriteshAcharya 有个错字,输入 set($ENV{PATH} "/home/martink")
    • @JeanDavy 我不认为这是一个错字 - set($ENV{PATH} "/home/martink") 会将 PATH 的当前值放在您指定 $ENV{PATH} 作为变量名,因此它不会设置您认为您正在设置的内容。我只是不小心自己做了这个!将设置更常用的路径设置(ENV{PATH} "/home/martink:$ENV{PATH}"),这就是需要 '$' 的地方。
    • 对不起,我应该在哪个文件中添加 set(...) 命令?我看到一些 *.cmake 文件和 CMakeFiles 目录以及我构建的 Makefile。(构建目录)
    • @PriteshAcharya 是的,对我来说它有效(CMake v3.7)。 (我确认以防万一有人关心,因为距离第一次发表评论已经 3 年了)
    【解决方案2】:

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

    当我们遇到与您相同的问题(生成脚本的工具包,因此设置编译环境)时,我们更改了工具包,使其与脚本一起生成工具链文件。

    实际上,cmake-toolchain-file 不会经常更改。用于目标的基本标志在项目的早期就已修复 - 通常。使用 CMake 的 CMAKE_BUILD_TYPE,您可以在 Debug 和 Release 编译之间切换,而无需更改工具链文件。

    如果您要支持不同的目标,请创建不同的工具链并使用带有 CMake 的 out-of-source-build。

    编辑:您可以做的一件事是使用 -D 参数调用 cmake,设置您想要的变量并在之前获取脚本:

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

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

    【讨论】:

    • 那么,这是否意味着没有办法做我想做的事?虽然不常变,但确实变了。然后有人必须不要忘记将该脚本转换为 cmake 规则。
    • 在当前的 cmake 做事方式中,您不能简单地告诉 cmake 像您拥有的那样导入脚本。当然,您可以创建一个包装脚本,将您的脚本转换为工具链文件,但这仍然是您必须做的工作。
    猜你喜欢
    • 1970-01-01
    • 2012-01-19
    • 2016-10-07
    • 1970-01-01
    • 2011-11-26
    • 2013-02-06
    • 2011-03-05
    • 1970-01-01
    相关资源
    最近更新 更多