25

我有一个脚本来设置交叉编译所需的所有变量。这里只是其中的一部分:cmake:从脚本设置环境变量

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调用脚本

回答

48

通过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

+3

set(ENV {PATH}“/ home/martink”)为任何人工作?它不工作在我的 –

+2

@PriteshAcharya有一个错字,类型集($ ENV {PATH}“/ home/martink”) –

+2

@JeanDavy我不认为这是一个错字集($ ENV {PATH}“/ home/martink“)会将您指定$ ENV {PATH}的PATH的当前值作为变量名称,因此它不会设置您认为正在设置的内容。我只是偶然做到了这一点!一个更常见的路径设置将被设置(ENV {PATH}“/ home/martink:$ ENV {PATH}”),这就是'$'的必要位置。 –

4

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

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

在现实中,cmake工具链文件不会经常更改。通常用于目标的基本标志在项目中很早就已经确定。使用CMake的CMAKE_BUILD_TYPE,您可以在调试和发布编译之间进行切换,而无需更改工具链文件。

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

编辑:有一两件事你可以做的是调用与-D-参数设置的CMake你想要的变量,并具有源自你的脚本之前:结果

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

会以相同使用了工具链文件。

+0

所以,它意味着没有办法做我想要的东西?虽然它不经常改变,但它确实改变了。然后有人不要忘记将该脚本转换为cmake规则。 –

+0

以目前的方式cmake正在做的事情,你不能简单地告诉cmake导入像你这样的脚本。当然,您可以创建一个包装脚本,将脚本转换为工具链文件,但这仍然是您必须要做的工作。 –