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導入像你這樣的腳本。當然,您可以創建一個包裝腳本,將腳本轉換爲工具鏈文件,但這仍然是您必須要做的工作。 –