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을 확인하는 데 사용할 수 있는 "간단한" 구현은 없다고 생각합니다 . POSIX make사양은 매우 좋지 않아 지정되지 않은 부분이 많지만 의심스럽고 쓸모없는 기능이 포함되어 있습니다.

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)

관련 정보