從命令列傳遞其他變數來製作

2021-10-02 02:56:20 字數 2460 閱讀 2440

我可以將變數作為命令列引數傳遞給gnu

makefile嗎? 換句話說,我想傳遞一些最終會成為makefile變數的引數。

如果你建立乙個名為makefile的檔案並新增乙個像$(unittest)這樣的變數,那麼即使使用萬用字元,你也可以在makefile中使用這個變數

例如:

make unittest=*
我使用boost_test並通過引數--run_test = $(unittest)給出乙個萬用字元然後我將能夠使用正規表示式過濾掉我希望我的makefile執行的測試

最簡單的方法是:

make foo=bar target
然後在你的makefile中你可以引用$(foo)。 請注意,這不會自動傳播到子品牌。

如果您正在使用子品牌,請參閱此文章:將變數傳遞給子品牌

假設您有乙個這樣的makefile:

action:

echo argument is $(argument)

然後你會稱之為make action argument=something

從手冊 :

make中的變數可以來自執行make的環境。 在啟動時檢視的每個環境變數都將轉換為具有相同名稱和值的make變數。 但是,makefile中的顯式賦值或命令引數會覆蓋環境。

所以你可以做(​​從bash):

foobar=1 make
在makefile中生成乙個變數foobar

您有幾個選項可以從makefile外部設定變數:

從命令列-make可以將變數賦值作為其命令列的一部分,與目標混合:

make target foo=bar
但是,除非在賦值中使用override指令 ,否則將忽略makefile中foo變數的所有賦值。 (效果與環境變數的-e選項相同)。

從父make匯出- 如果從makefile呼叫make,通常不應該顯式寫這樣的變數賦值:

# don't do this! target: $(make) -c target cc=$(cc) cflags=$(cflags)
相反,更好的解決方案可能是匯出這些變數。 匯出變數使其進入每個shell呼叫的環境中,並且使用這些命令進行呼叫將按照上面的指定選擇這些環境變數。

# do like this cflags=-g export cflags target: $(make) -c target
您也可以通過使用匯出所有變數export不帶引數。

這裡沒有引用的另乙個選項包含在stallman和mcgrath的gnu make書中(參見 )。 它提供了乙個例子:

archive.a: ...

ifneq (,$(findstring t,$(makeflags)))

+touch archive.a

+ranlib -t archive.a

else

ranlib archive.a

endif

它涉及驗證給定引數是否出現在makeflags。 例如..假設您正在研究c ++ 11中的執行緒,並且您已將研究劃分為多個檔案(class01,...,classnm),並且您希望:編譯然後編譯所有並單獨執行或編譯乙個如果指定了乙個標誌(例如-r,則一次執行它。 所以,你可以提出以下makefile

cxx=clang++-3.5

cxxflags = -wall -werror -std=c++11

ldlibs = -lpthread

sources = class01 class02 class03

%: %.cxx

$(cxx) $(cxxflags) -o [email protected] $^ $(ldlibs)

ifneq (,$(findstring r, $(makeflags)))

./[email protected]

endif

all: $(sources)

.phony: clean

clean:

find . -name "*.out" -delete

有了這個,你會:

export root_dir=
然後在makefile中使用變數$(root_dir)

PHP從命令列接收引數

昨天,在牛客網做華為機試題,不太熟悉它的環境,吃了大虧。測試樣例是通過標準輸入輸入的,執行結果是通過標準輸出輸出的。標準輸入就是鍵盤,標準輸出就是顯示器。經過大量實踐,發現fscanf 最好用,沒有之一!mixed fscanf resource handle,string format mixed...

LinuxTips 從命令列到指令碼

對於linux的中的一些問題,一般地我們可以通過以下的思路來解決 1 使用linux提供的很多的小工具和管道來處理 2 如果需要使用多條命令,或需要邏輯判斷,考慮使用sh,sh除了能直接使用linux的小工具外,還可以進行很多的邏輯和流程控制 3 如果需要很多的字串處理,問題也比較複雜,考慮使用pe...

C語言從命令列接收引數

設包含如下程式的檔名為myprog.c編譯後輸入命令 myprog how are you則執行結果是 include int main int argc,char argv argc是命令列總的引數個數,如 c users kang desktop main.exe myprog how are ...