POSIX makeは前提条件でglobをサポートしていませんか?

POSIX makeは前提条件でglobをサポートしていませんか?

私が読んでいるPOSIX 7は定義します、前提条件がほぼ常に「ファイル」として記述されることがわかりました。

これ作るユーティリティは一時的な関係を確認し、修正時間が派生ファイル(前提条件と呼ばれる)の修正時間よりも速い派生ファイル(ターゲットと呼ばれる)を更新する必要があります。

これは、POSIX準拠のmakeが次の規則を解釈する必要があることを意味しますか?

binary.bin: src/main.c src/1.dir/*.c src/2.dir/*.c
    $(CC) -o binary.bin src/main.c src/1.dir/*.c src/2.dir/*.c

*.c文字通り、? という名前のファイルを検索するsrc/1.dir/のと同じです。src/2.dir/

これはまた、POSIX準拠のmakeを使用するときに、ユーザーがmakefileのプロジェクト内のすべてのファイルを列挙する必要があることを意味しますか?

答え1

make私はPOSIX仕様に必要な機能だけを実装し、POSIX準拠のためにmakefileをチェックするために使用できる「簡単な」実装はないと思います。 POSIXmake仕様は非常に良くないため、指定されていない部分が多いですが、疑わしく無駄な機能が含まれています。

FWIW、すべてのUnix make実装(GNU make、BSD make、Solarisのdmakeなどを含む)は、ターゲットと前提条件でglobモードを拡張します。これはmakeUnix v7の最初の実装にさかのぼります。原文の引用文書:

他の行は、ターゲットファイルに関する情報を提供します。一般的な項目形式は次のとおりです。

target1 [target2 . . .] :[:] [dependent1 . . .] [; commands] [# . . .]
[(tab) commands] [# . . .]
 . . .

括弧内の項目は省略可能です。ターゲットと依存関係は、文字、数字、ピリオド、スラッシュで構成される文字列です。 (シェルメタ文字*?展開されます。)

そして実際にテストされました:

# touch foo.bar zoo.bar

# echo 'foo: *.bar; echo "($?)"' | make -f -
echo "(zoo.bar foo.bar)"
(zoo.bar foo.bar)

# echo 'foo: [zf]oo.bar; echo "($?)"' | make -f -
echo "(zoo.bar foo.bar)"
(zoo.bar foo.bar)

関連情報