일부 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
프로그램으로 컴파일합니다 .foo
lib.c
전제 조건이 다른 한 동일한 목표를 가진 패턴을 갖는 것도 가능합니다. 예를 들어 다음이 작동합니다.
%.o: %.c
$(CC).....
%.o: %.cpp
$(CXX).....
즉, 이 디렉터리에 C 소스 파일과 동일한 이름(확장자 없음)을 가진 C++ 소스 파일이 없으면 예상대로 작동합니다. 이것이 사실이라면 C++ 버전은 무시되고 C 소스 코드가 컴파일됩니다(C 규칙이 makefile에서 먼저 나열되기 때문입니다).
자세한 내용은 다음을 참조하세요.관련 부품GNU make 매뉴얼에서.