在 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"。)