Wildcards

POSIX 是否在先決條件中不支持 glob?

  • April 21, 2019

我正在閱讀POSIX 7 Make 定義,我注意到先決條件幾乎總是被描述為“文件”:

make實用程序檢查時間關係,並應更新那些修改時間早於派生它們的文件(稱為先決條件)的修改時間的派生文件(稱為目標)。

這是否意味著符合 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

從字面上尋找以and命名*.c的文件?src/1.dir/``src/2.dir/

這是否也意味著,當使用符合 POSIX 的 make 時,使用者必須在 makefile 中列舉項目中的每個文件?

我認為沒有任何“精益”實現make僅實現 POSIX 規範所需的功能,並且可用於驗證 makefile 是否符合 POSIX。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)

引用自:https://unix.stackexchange.com/questions/513644