2016-08-17 153 views
1

我有一個makefile其中我試圖設置一些已存在於我寫的bash腳本中的變量:set-vars.sh(它只包含變量名稱和值)。從bash腳本讀取makefile變量

我在其他bash腳本中使用這些變量。我需要也可以在我的makefile中使用它們。

經過大量研究並試圖找出makefilebash腳本中設置變量的最佳方法後,我找到了一種可行的方法;這是如下:

set-vars.sh

# set vars 
foo=FOO1 
bar=BAR1 
baz=BAZ1 

# if a command line arg is given (e.g. foo) 
# echo value command line arg (e.g. echo $foo) 

if ! [ -z ${1+x} ]; then echo ${!1}; fi 

這裏神奇的是最後一行,其echo ES在命令行參數提供了其名稱的變量的值,如果有一個命令行參數。我在makefile中調用此腳本並提供變量名稱,並使用echo ed值設置makefile變量。

Makefile

.PHONY: target1 target2 target3 

export foo = $(shell sh set-vars.sh foo) 

target1: 
    @echo $(foo) 

# ... other targets which reference $(foo) ... 

這工作,但它可能是做這件事的哈克方式。我想知道是否有更簡單,更優雅的方式來做我想做的事情。

我在StackOverflow上遇到過幾個類似的問題和答案,但沒有找到任何適用於我的示例的東西。如果我已經錯過了一個答案,請告訴我。

非常感謝!

+0

你不能在調用'make'的shell中設置變量,或者將它們放在'make'命令行上? – Barmar

+0

其他腳本需要'如果! [-z ...'line? – Beta

+0

@Barmar,我不能把它們放在make命令行上,因爲這個makefile會被其他可能熟悉或者不熟悉這個makefile內部工作的人使用。我想保持makefile的調用盡可能簡單......但是,通過在調用'make'的shell中設置變量,你的意思是什麼?對不起,我不太精通shell腳本。 – tamjd1

回答

3

您可以定義,可以從你的shell腳本來源和Makefile中包含的文件的變量:

$ cat vardef.txt 
foo=FOO1 
bar=BAR1 
baz=BAZ1 
$ cat set-vars.sh 
source ./vardef.txt 
echo "$foo $bar $baz" 
$ sh ./set-vars.sh 
FOO1 BAR1 BAZ1 
$ cat Makefile 
include vardef.txt 
all: 
    @echo "$(foo) $(bar) $(baz)" 
$ make 
FOO1 BAR1 BAZ1 

是不是真是太好了,當兩種語言部分使用相同的語法?

+0

這看起來很有希望......我會試試看。謝謝! – tamjd1

+0

試一試。與'Makefile'很好地配合,不太適合shell腳本。得到這個:'subtest.sh:line 3:source:vars.txt:file not found'。 – tamjd1

+0

你試過'source。/ vars.txt'還是'source vars.txt'? –

1

不知道它是不是很冒險,但你可以「創建」一個可以包含到Makefile中的文件。在運行時。像這樣:

$(shell grep '=' vars.sh > /tmp/vars.tmp) 
include /tmp/vars.tmp 
$(shell rm /tmp/vars.tmp) 

用更理智的東西替換第一行。

1

構建系統依賴於環境變量通常被認爲是糟糕的做法,因爲如果他們這樣做,當輸出不僅依賴於命令行而且還依賴於環境變量的狀態時,您突然產生可重複性問題。

已經警告過你,所有的環境變量都可以在make,:

user := ${USER} # ${USER} comes from the environment. 
all : 
    @echo ${user} 

換句話說,有一個腳本,設置環境變量和調用make

#!/bin/bash 
export foo=FOO1 
export bar=BAR1 
export baz=BAZ1 
exec make "[email protected]" 

或者,你可以只用export foo=FOO1語句的shell腳本。事實證明這是有效的makefile語法,因此您可以在Makefile中執行include set-vars.sh

+0

這會工作,但我需要能夠從命令行運行'make',而不是從腳本運行。我需要make來獲得所有正確的變量和值。從而創建一個抽象級別,用戶不需要執行任何操作,只需運行'make install'或任何他們想運行的目標,而不需要知道'Makefile'裏面的內容。 – tamjd1

+0

@ tamjd1爲您添加了替代解決方案。 –

+0

只是注意到@RenaudPacalet最初給出了這個建議。 –