使用多个 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
来获得更正确的规则,而不是 :
我有一个项目包含多个使用 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
来获得更正确的规则,而不是 :