我已经深入了解Makefile-hell :(
我有一个包含值的文件test.par
:
$ABC=123 ! some comment
$DEF=456 ! comment
我有一个模板源文件(实际上是在fortran中,但这在这里没有区别)test/template.c
:
int main(void) {
return $ABC+$DEF ;
}
我希望在代码中设置值,就像预处理器一样。所以我在Makefile中编写了一个目标,如下所示:
default:
for f in test/*; do \
while read l ; do \
key="$$(echo $$l | cut -d "=" -f 1 | tr -d ' ')";\
val=$$(echo $$l | cut -d "=" -f 2 | cut -d " " -f 1);\
[[ -z "$$val" ]] && \
val=$$(echo $$l | cut -d "=" -f 2 | cut -d " " -f 2);\
echo $$key $$val;\
cp $$f $$f.out ;\
sed -i "s/$$key/$$val/g" $$f.out;\
done < test.par;\
done;
我在for循环中查看test /(有很多)中的每个文件,&#34; apply&#34; while循环中test.par
中的每一行。
预期结果是
int main(void) {
return 123+456 ;
}
我得到的是
int main(void) {
return $ABC+456 ;
}
现在它变得疯狂:如果我切换到test.par
文件中的行,我得到:
int main(void) {
return 123+$DEF ;
}
如果有更多行,则根本没有替代。
我有什么问题!!! ??? !!!
编辑:我无法对原始代码进行太多更改,因此我希望在Makefile中解决此问题。
答案 0 :(得分:1)
你不断重复使用原始文件进行替换,所以只有最后一个文件实际上是粘贴的(所有替换的结果,但是最后一个被下一个替换)。之后
sed "s/$$key/$$val/g" $$f > $$f.out;\
把
cp "$$f.out" "$$f";\
解决这个问题。 (或者如果您希望$$f
保持$$f
不变,请制作cp "$$f" "$$f.out"
的工作副本,例如,在循环之前sed -i "s/$$key/$$val/g" "$$f.out"
并在其中使用{{1}}。)