使用多个 yacc 解析器并行制作

Parallell make with multiple yacc parsers

我有一个项目包含多个使用 yacc 生成的解析器。每个解析器都有类似的规则:

xgram.c xgram.h : xgram.y
    yacc xgram.y
    mv y.tab.c xgram.c
    mv y.tab.h xgram.h

如果我 运行 使用 make 它工作正常,因为每个解析器将按顺序生成。

但是,如果我 运行 它与 make -j 10 显然存在关于 y.tab.c 文件的冲突,因为每个语法的命令将生成它自己的 y.tab.h并行。

我怎样才能避免这种情况?我发现并尝试过的唯一一件事是在每个 yacc 命令行上使用 TMPDIR 以使其在不同的目录中创建输出文件,但这是行不通的。

还有其他想法吗?

按名称调用 bison (bison),不要使用 -y 标志,而使用 -o 命令行标志:

xgram.c xgram.h : xgram.y
    bison -o xgram.c -d xgram.y

我确定您在食谱中输入了错误的 mv 命令。

如果你有 bison,请参阅其他答案。

如果您的 yacc 版本符合 POSIX 标准,它应该支持 -b 选项,在这种情况下您可以使用:

xgram.c xgram.h : xgram.y
        yacc -b xgram -d xgram.y
        mv xgram.tab.c xgram.c
        mv xgram.tab.h xgram.h

如果您不使用 POSIX yacc,您可以这样操作:

xgram.c xgram.h : xgram.y
        mkdir -p tmp_xgram
        (cd tmp_xgram && yacc -d ../xgram.y && mv y.tab.c ../xgram.c && mv y.tab.h ../xgram.h)
        rm -rf tmp_xgram

我认为这会奏效。如果它仍然抱怨,您可能必须先将 ../xgram.y 实际复制到临时目录...

如果你有 GNU make 4.3,你可以使用 xgram.c xgram.h &: xgram.y 来获得更正确的规则,而不是 :