Make

在 makefile 目標中使用 env 變數

  • September 21, 2021

我試圖弄清楚如何在 makefile 中使用環境變數。我有(某種)特定案例,我需要執行以下步驟:

  1. 執行命令1
  2. 將輸出形式 command2 分配給 env 變數
  3. 執行 command3 讀取在步驟 2 中分配的環境變數

這是實現上述步驟的生成文件。但是,當我執行它時,它會列印一個空變數。我究竟做錯了什麼?當我在我的 bash 中執行這些命令時,它工作得很好)🤔

test:
   @bash -c "\
       echo 'need to run some program before assigning env variable';\
       export TEST="$(date)";\
       echo 'printing env';\
       echo ${TEST};\
       "

make 使用美元符號,因此如果您希望將它們傳遞給 shell,則需要對它們進行轉義。你可以通過將它們加倍來做到這一點。

test:
       @bash -c "\
       echo 'need to run some program before assigning env variable';\
       echo 'The make CC variable is set to :${CC}:';\
       export TEST=\"\$$(date)\";\
       echo 'printing env';\
       echo \$${TEST};\
       "

testwithout:
       @echo 'need to run some program before assigning env variable';\
       echo 'The make CC variable is set to :${CC}:';\
       export TEST="$$(date)";\
       echo 'printing env';\
       echo $${TEST};

其他問題是由兩次解釋字元串引起的。make獲取接收方,轉換序列反斜杠換行符,並將結果提供給 shell 執行。當您使用雙引號時,bash -c " .... "這會導致 shell 擴展美元符號,因此您最終會得到 `bash -c “echo ’need …’ ;export TEST=Mon Sep…; echo ;"。添加一些反斜杠字元可以保護美元符號和內部雙引號。

可能不需要使用bash -c. 如testwithout target所示。您仍然需要將命令構造為一行。Gnu make.ONESHELL可以使用單個 shell 來執行配方,而不是每個邏輯行一個 shell,這樣可以避免扭曲。

引用自:https://unix.stackexchange.com/questions/669864