我有一个包含使用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
,以使其在不同目录中创建输出文件,但这没有用。
还有其他想法吗?
用野牛的名字(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
而不是:
来获取更正确的规则>