具有多个yacc解析器的并行制作

问题描述 投票:0回答:2

我有一个包含使用yacc生成的多个解析器的项目。每个解析器都有一些规则,如下所示:

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

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

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

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

还有其他想法吗?

gnu-make yacc parallell-builds
2个回答
0
投票

用野牛的名字(bison)呼叫野牛,不要使用-y标志,而要使用-o命令行标志:

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

0
投票

我确定您在配方中键入了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而不是:来获取更正确的规则>

© www.soinside.com 2019 - 2024. All rights reserved.