백분율과 별표(별표) makefile 전제 조건의 차이점은 무엇입니까

백분율과 별표(별표) makefile 전제 조건의 차이점은 무엇입니까

일부 Makefile에는 전제 조건이 있고 %.txt다른 Makefile에는 *.txt.

이 폴더 레이아웃을 만들었습니다.

$ tree .
.
├── hi1.txt
├── hi2.txt
├── hi3.txt
└── Makefile

먼저 이것을 시도해 보았습니다.

foo.txt: *.txt
    echo $^

그것은 내 기대에 부응했습니다.

$ make
echo hi1.txt hi2.txt hi3.txt
hi1.txt hi2.txt hi3.txt

그러나 %.txt와일드카드로 사용되는 일부 Makefile을 보았습니다. 그래서 다음에 시도해 봤습니다.

foo.txt: %.txt
    echo $^

그러나 이로 인해 오류가 발생합니다.

$ make
make: *** No rule to make target '%.txt', needed by 'foo.txt'.  Stop.

왜 이런 일이 발생하는지 설명할 수 있나요?

GNU 메이크 4.3

답변1

에서는 make패턴 일치에 백분율 기호가 사용됩니다. 이를 위해서는 대상에서 1이 필요하고 전제 조건에서 (적어도) 1이 필요합니다.

%.o: %.c
        $(CC) $(CFLAGS) -c -o $@ $<

이 메이크파일을 사용하여 파일 이름이 로 끝나는 파일을 빌드하려면 접두어는 같지만 다음으로 .o끝나는 파일이 있어야 함 을 지정합니다..c.o

이러한 규칙을 구축하려면 대상과 전제 조건을 참조할 수 있어야 하며 여기 에 변수 $@$<필요합니다. $@"이 규칙의 대상"을 의미하고 $<"이 규칙에 대해 첫 번째로 나열된 전제 조건"을 의미합니다. 빌드해야 하는 경우 다음 명령을 사용하세요.모두전제 조건(예: 실행 파일 연결)을 충족한 다음 변수를 사용할 수 있습니다 $^.

%: %.o lib.o
        $(CC) $(LDFLAGS) -o $@ $^

위의 두 가지 예제 메이크파일 조각을 단일 메이크파일로 결합하고 동일한 디렉터리의 여러 C 프로그램에서 사용하려는 일부 공통 코드가 포함된 "lib.c" 파일이 있는 경우 임의의 .c파일을 추가할 수 있습니다. , 예를 들어 makefile을 변경하지 않고 makefile의 코드에도 연결되는 foo.c프로그램으로 컴파일합니다 .foolib.c

전제 조건이 다른 한 동일한 목표를 가진 패턴을 갖는 것도 가능합니다. 예를 들어 다음이 작동합니다.

%.o: %.c
        $(CC).....
%.o: %.cpp
        $(CXX).....

즉, 이 디렉터리에 C 소스 파일과 동일한 이름(확장자 없음)을 가진 C++ 소스 파일이 없으면 예상대로 작동합니다. 이것이 사실이라면 C++ 버전은 무시되고 C 소스 코드가 컴파일됩니다(C 규칙이 makefile에서 먼저 나열되기 때문입니다).

자세한 내용은 다음을 참조하세요.관련 부품GNU make 매뉴얼에서.

관련 정보