2013-10-08 64 views
0

本地我使用MacOS上的GNU Make 3.8(i386-apple-darwin11.3.0)如何將shell命令的結果存儲在makefile中?

我試圖根據目錄中的文件生成一堆測試文件。

現在我能夠抓住這些文件的基本名字,但我不能弄清楚如何將它們存儲在一個變量,所以我可以生成與基本名稱另一個文件

TEST_FILES = lib/*.js 

build-test: 
    @mkdir -p tests 
    [email protected] file in $(TEST_FILES); do \ 
     echo $$file; \ 
     MYNAMES = $(basename $$file .js) \ 
     echo $MYNAMES; \ 
    done 

我想接着使用STDOUT流的輸出創建一堆名爲$ MYNAME.log的文件。

我卡上獲取名稱到變量,這些解決方案I've foundso far扔錯誤對我來說,當我試圖實現他們

+0

目前尚不清楚你正在嘗試做什麼,你試圖做什麼或者是否使用了一種好方法。假設你有'lib/foo.js'和'lib/bar.js',那麼呢? – Beta

+0

@beta應該創建一個名爲test/foo.log的文件test/bar.log – qodeninja

回答

3

這條線在這裏

echo $MYNAMES; \ 

將在值替代的變量M,就像你寫了$(M)YNAMES一樣。你想

echo $$MYNAMES; \ 

改爲。

此行

MYNAMES = $(basename $$file .js) \ 

不能工作 - 您使用的是隻有一次前的子shell被調用執行規則執行make命令basename,而file是一個shell變量,它改變的每次迭代循環。你的意思可能是$$(basename $$file),它會以「$(basename $ file)」的形式傳遞給shell。該shell將插入運行basename命令的結果。

確保您確實想將它們存儲在shell變量中,而不是作爲make變量。瞭解其差異至關重要。

+0

簡而言之:您需要轉義Makefile中的每個$,以便在shell腳本中使用。 – Coroos

+0

@Gavin_Smith我也試過這種方法 - \t MYNAMES = $$(basename $$ file); \ echo $ MYNAMES; \ - 然後我得到「/ bin/bash:MYNAMES:command not found」 – qodeninja

+0

變量名和'='符號之間不應有空格(這與分配make變量的語法不同)。 –

相關問題