ファイルの同時更新の問題は、同じ規則を複数のターゲットに対して定義した場合にも起きます。たとえば、lex(1) を使用してプログラムとヘッダーの両方を作成する yacc(1) プログラムがあります。1 つの規則にもとづいて複数のターゲットファイルを作成する場合は、+ 記号を使用して各ファイルを 1 つのグループとして指定する必要があります。特に、並列構築の場合に、これが重要になります。
y.tab.c y.tab.h: parser.y $(YACC.y) parser.y
y.tab.c: parser.y $(YACC.y) parser.y y.tab.h: parser.y $(YACC.y) parser.y
直列の make ではまず、y.tab.c を生成する最初の規則を使用して構築を行い、次に y.tab.h がすでに最新版になっているため構築の必要がないと判断します。一方、並列構築の場合、dmake は yacc が y.tab.c の構築を完了する前に y.tab.h を検索し、y.tab.h が構築の必要があることを知り、最初の yacc を並行して別の yacc を開始します。いずれの yacc の呼び出しも同じファイル (y.tab.c と y.tab.h) に書き込まれるので、これらのファイルの内容が不当になる可能性があります。正しい方法は、+ 構文を使用して、両方のターゲットを同じ規則に従って同時に作成するように指示することです。たとえば次のとおりです。
y.tab.c + y.tab.h: parser.y $(YACC.y) parser.y