2015-06-20 82 views
-1

我在make文件下面的代碼:不能make文件編輯字符串

All:CheckOutFolder 
echo "Starting Build"; 
@for entry in ${DIR};          \ 
do               \ 
    for i in $${entry}/*.[cs];        \ 
    do              \ 
    echo "Bulding $${i}";         \ 
    arm-none-eabi-gcc ${OPT} $${i} -c -o ${OUT}/${${$${i}##*/}:-1}.o; \ 
    done             \ 
done 

的問題是,${${$${i}##*/}:-1}.o產生空字符串。

任何人都可以幫忙嗎?

+0

你不應該問同樣的問題兩次,而是編輯你的其他問題「在makefile中操縱字符串」。 – Jens

回答

1

這裏有一個概念上的問題:你在shell中運行的代碼中混合Make函數。諸如FILE=$(notdir $(i))之類的東西將在shell腳本運行之前擴展一次,而不是在shell腳本中的每個循環迭代中。

相反,通常所做的就是展開你想在目標之外迭代的東西列表,這個東西開始於@forforeach函數可以幫助你。

最後,remake寫入這些類型的問題。它有一個調試器。因此,您可以停止目標「全部」並寫出可以運行的代碼。然後更清楚的是像「notdir」和「substr」這樣的函數不會出現在運行的shell代碼中。

remake -X Makefile All 
GNU Make 4.1+dbg0.91 
... 
Updating goal targets.... 
remake: Nothing to be done for 'Makefile'. 
-> (/tmp/Makefile:2) 
All: 
remake<0> write 
File "/tmp/All.sh" written. 

現在看/tmp/All.sh:

#!/bin/sh 
#/tmp/Makefile:2 
#cd /tmp 
echo "Starting Build"; 
@for entry in ;          \ 
    do               \ 
     for i in ${entry}/*.[cs];        \ 
     do              \ 
     echo "Bulding ${i}";         \ 
     FILE=;       \ 
     FILE= ;          \ 
     echo "";           \ 
     arm-none-eabi-gcc ${i} -c -o /; \ 
     done             \ 
    done 

在上述例子嘗試一些東西, 我看到翻拍的「設置」命令有錯誤,SEGVs,我有時會進行調查。 (錯誤修復在remake-4.1 + dbg1.1中)

+0

我編輯了我的代碼,你能告訴我爲什麼'$ {$ {$$ {i} ## * /}: - 1} .o'只生成名爲「.o」的文件 –

+0

我覺得更有意思的是,如果你可以通過使用重拍來告訴自己。試試看,讓我知道那是怎麼回事。 'eval','expand'和'print'命令在這裏是你的朋友。 – rocky