2015-10-15 142 views
2
export HELLO=Hello,world 
all: 
     @echo $(HELLO) 
     @echo $(shell echo $$HELLO) 
     @echo `echo $$HELLO` 

輸出:

Hello,world 

Hello,world 

爲什麼會出現反引號和$(殼)之間的差異,是有辦法的環境變量傳遞給$(殼)調用?

我想在交叉編譯環境中使用pkg-config,所以我需要設置$ PKG_CONFIG_SYSROOT。我可以使用反引號,但是它會爲每個.o文件執行一次。根據Computing Makefile variable on assignment,我需要使用PKG_CFLAGS:= $(shell pkg-config $(PACKAGES)),但我無法傳入必需的環境變量以使其正常工作。

在GNU Make 4.0上測試。

+0

在第三行中的反引號是不必要的,因爲相比於只使用'@echo $$ HELLO'不會改變任何東西。 –

+0

是的,他們這麼做 - 重點是產生一個子殼。這比SUBSHELL_HELLO ='echo $$ HELLO'然後@echo $(SUBSHELL_HELLO)解釋得更簡潔。那裏有反引號,但註釋格式化會讓它們吃掉。 –

回答

2

恭喜你已經打了一個化妝錯誤:$(shell) doesn't honor export but this is undocumented?

有一個在代碼中的註釋(它之前的車票的申請,並在機票是引用),這表明存在該不能正常工作複雜局面所以它似乎只是沒有完成。

我可以想出兩種方法讓$(shell)環境具有您想要手動設置的變量。

  1. 顯式設置它們在$(shell)上下文中。

    PCVAR:=$(shell PKG_CONFIG_SYSROOT=$(make-level-variable-PKG_CONFIG_SYSROOT) pkg-config ...) 
    
  2. 設置他們在make流程環境,因此$(shell)環境下正常繼承他們。

    $ PKG_CONFIG_SYSROOT=/some/path make 
    
+0

謝謝,我在這個圈子裏跑。除了使用反引號之外,還有一種解決方法嗎?這個bug與我引用的問題中的mktemp問題相結合似乎使得某些類型的評估完全不可能。 –

+0

在運行make'PKG_CONFIG_SYSROOT =/some/path make'的環境中設置變量? –

+0

手動在'$(shell)'環境中設置它? 'PCVAR:= $(shell PKG_CONFIG_SYSROOT = $(make-level-PKG_CONFIG_SYSROOT)pkg-config ...)'? –

相關問題