왜 일부 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
백분율 기호는 패턴 일치에 사용되며 대상에 하나가 필요하고 전제 조건에 (적어도) 하나가 필요합니다.
%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $<
이 메이크파일을 사용하여 파일 이름이 로 끝나는 것을 빌드하려면 동일한 접두어를 가지지 만 다음 .o
으로 끝나는 파일이 있어야 함 을 지정합니다..c
.o
이러한 규칙을 구성할 수 있으려면 전제 조건은 물론 대상도 참조할 수 있어야 합니다. 이것이 $@
및 $<
변수가 들어오는 곳입니다. $@
'이 규칙의 대상'을 의미하고 $<
'이 규칙의 첫 번째 나열된 전제 조건'을 의미합니다. 다음을 사용하는 명령을 구성해야 하는 경우모두전제 조건(예: 실행 파일 연결)을 충족한 다음 변수를 사용할 수 있습니다 $^
.
%: %.o lib.o
$(CC) $(LDFLAGS) -o $@ $^
위의 두 가지 예제 메이크파일 조각을 하나의 메이크파일에 결합하고 동일한 디렉토리에 있는 여러 C 프로그램에서 사용하려는 일부 공통 코드가 포함된 'lib.c' 파일이 있는 경우 임의의 .c
파일을 추가할 수 있습니다. , 예를 들어 makefile을 변경할 필요 없이 의 코드에도 연결되는 foo.c
프로그램으로 컴파일합니다 .foo
lib.c
전제 조건이 다른 한 동일한 대상을 가진 패턴을 갖는 것도 가능합니다. 예를 들어 다음과 같이 작동합니다.
%.o: %.c
$(CC).....
%.o: %.cpp
$(CXX).....
즉, 이 디렉터리에 C 소스 파일과 동일한 이름(확장자 없음)을 갖는 C++ 소스 파일이 없는 한 예상대로 작동합니다. 그런 일이 발생하면 C++ 버전은 무시되고 대신 C 소스가 컴파일됩니다(C 규칙이 makefile에서 첫 번째로 나열되기 때문입니다).
자세한 내용은 다음을 참조하세요.관련 섹션GNU make 매뉴얼에 있습니다.