在 Makefile 中解析和访问包含“$”的变量
Parsing and accessing variables containing '$' in Makfile
我已经陷入 Makefile 地狱:(
我有一个文件 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/(有很多)中的每个文件,在 while 循环中 "apply" 遍历 test.par
中的每一行。
预期结果是
int main(void) {
return 123+456 ;
}
我得到的是
int main(void) {
return $ABC+456 ;
}
现在变得越来越疯狂:如果我在 test.par
文件中切换到行,我得到:
int main(void) {
return 123+$DEF ;
}
如果有更多行,则根本没有替换。
我这是怎么了!!!???!!!
编辑:我不能对原始代码进行太多更改,所以我希望在 Makefile 中解决这个问题。
您一直重复使用原始文件进行替换,因此实际上只有最后一个保留下来(所有替换的结果,但最后一个被下一个覆盖)。之后
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"
。)
我已经陷入 Makefile 地狱:(
我有一个文件 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/(有很多)中的每个文件,在 while 循环中 "apply" 遍历 test.par
中的每一行。
预期结果是
int main(void) {
return 123+456 ;
}
我得到的是
int main(void) {
return $ABC+456 ;
}
现在变得越来越疯狂:如果我在 test.par
文件中切换到行,我得到:
int main(void) {
return 123+$DEF ;
}
如果有更多行,则根本没有替换。
我这是怎么了!!!???!!!
编辑:我不能对原始代码进行太多更改,所以我希望在 Makefile 中解决这个问题。
您一直重复使用原始文件进行替换,因此实际上只有最后一个保留下来(所有替换的结果,但最后一个被下一个覆盖)。之后
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"
。)