传递和访问包含' $'的变量在Makefile中

时间:2015-02-27 16:23:09

标签: sed makefile preprocessor

我已经深入了解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中解决此问题。

1 个答案:

答案 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}}。)