백분율과 별표(별표) 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백분율 기호는 패턴 일치에 사용되며 대상에 하나가 필요하고 전제 조건에 (적어도) 하나가 필요합니다.

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

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

이러한 규칙을 구성할 수 있으려면 전제 조건은 물론 대상도 참조할 수 있어야 합니다. 이것이 $@$<변수가 들어오는 곳입니다. $@'이 규칙의 대상'을 의미하고 $<'이 규칙의 첫 번째 나열된 전제 조건'을 의미합니다. 다음을 사용하는 명령을 구성해야 하는 경우모두전제 조건(예: 실행 파일 연결)을 충족한 다음 변수를 사용할 수 있습니다 $^.

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

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

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

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

즉, 이 디렉터리에 C 소스 파일과 동일한 이름(확장자 없음)을 갖는 C++ 소스 파일이 없는 한 예상대로 작동합니다. 그런 일이 발생하면 C++ 버전은 무시되고 대신 C 소스가 컴파일됩니다(C 규칙이 makefile에서 첫 번째로 나열되기 때문입니다).

자세한 내용은 다음을 참조하세요.관련 섹션GNU make 매뉴얼에 있습니다.

관련 정보