> 백엔드 개발 > C#.Net 튜토리얼 > 메이크파일 규칙

메이크파일 규칙

黄舟
풀어 주다: 2016-12-16 09:48:41
원래의
1773명이 탐색했습니다.

목차
1. 소개 3
1.1. 준비 작업 3
1.2.Makefile 소개 3
1.3.Make 작업 방법 4
1.5. 사용법 변수 5
1.6. 다른 스타일 6
1.8. Makefile 7
2.1. >2.3.'MAKEFILE' 변수 8
2.4. makefile을 재생성하는 방법 8
2.5. makefile 오버로드 9
3. 규칙 9
3.2. 🎜>3.3.와일드카드 10
3.3.1.와일드카드 기능 10
3.3.2.와일드카드 기능 11
3.4. 디렉토리 검색 11
3.4.1.'VPATH' 11
3.4 .2.선택적 검색12
3.4.3.자동 변수 사용12
3.4.4.디렉토리 검색 및 암시적 규칙12
3.5.PHONY 목표13
3.6.FORCE 목표14
3.7. >3.8. 내장된 특별 타겟14
3.9. 여러 타겟에 대한 하나의 규칙15
3.11. 정적 모드 규칙 16
3.11.1. .2. 정적 모드 규칙 및 암시적 규칙 17
3.13. 종속성 자동 생성 17
4. 에코 18
4.2.
4.3. 병렬 실행 19
4.4. 오류 19
4.5. 인터럽트 만들기 20
'MAKE' 변수 20
4.6.2. 하위 make에 변수 전달 21
6. 참고 사항 25
6.2.기능 26
6.4. 특별한 변수 29
GNU Make 용도
Make 프로그램은 원래 불필요한 재컴파일을 방지하기 위해 C 프로그램 파일을 유지하도록 설계되었습니다. 명령줄 컴파일러를 사용할 때 프로젝트의 헤더 파일이 수정됩니다. 이 헤더 파일이 포함된 모든 파일이 컴파일되도록 하려면 어떻게 해야 합니까? 현재 10개 머신 버전 생성에서는 해당 파일을 컴파일하는 것이 프로그램 관리자에 따라 다릅니다. 모듈이 서로의 헤더 파일을 참조할 때 다시 컴파일해야 하는 파일을 모두 찾는 것이 어렵습니다. 이러한 파일을 편집하려면 일괄 처리 프로세스를 수정하세요. 실제로 이러한 작업은 make 프로그램에 의해 자동으로 완료될 수 있습니다. make 도구는 상호 의존성을 갖는 일부 파일을 유지 관리하는 데 매우 유용합니다. 이 도구는 파일과 명령(다른 파일을 업데이트하기 위해 호출되는 프로그램) 간의 관계에 대한 코드 세트를 제공합니다. 파일이 변경될 때). Make 도구의 기본 개념은 PROglog 언어와 유사합니다. 수행해야 할 작업을 알려주고 몇 가지 규칙을 제공하며 나머지는 make가 수행합니다.
1. 소개
make 작업은 프로젝트의 어느 부분을 다시 컴파일해야 하는지 자동으로 결정하고 이를 컴파일하기 위한 명령을 실행합니다. make는 주로 C 프로그램에 사용되지만 명령줄 컴파일러가 제공되는 한 모든 언어에 사용할 수 있습니다. 실제로 make 도구의 적용 범위는 프로그래밍에만 국한되지 않고 모든 작업을 설명하고 다른 파일을 자동으로 업데이트해야 하는 일부 파일을 변경하는 데 사용할 수 있습니다.
1.1. 준비작업
make를 사용하려면 "makefile"이라는 파일을 작성해야 합니다. 이 파일은 프로젝트 내 파일 간의 관계를 설명하고 각 파일을 업데이트하는 명령을 제공합니다. 일반적인 프로젝트는 다음과 같습니다. 실행 파일은 타겟 파일에 의해 업데이트되고, 타겟 파일은 소스 파일을 컴파일하여 업데이트됩니다.
Makefile이 작성된 후 소스 파일이 변경될 때마다 make를 실행하면 충분하며 필요한 모든 재컴파일이 수행됩니다. Make 프로그램은 makefile의 데이터베이스와 파일의 마지막 수정 시간을 사용하여 업데이트해야 하는 파일에 대해 어떤 파일을 업데이트해야 하는지 결정하고, make는 데이터베이스에 기록된 명령을 실행합니다.
재컴파일해야 하는 파일을 제어하기 위해 명령줄 매개변수를 제공할 수 있습니다.
1.2. Makefile 소개
Makefile은 Make가 무엇을 해야 할지, 대부분의 경우 프로그램을 컴파일하고 링크하는 방법을 알려줍니다.
다음은 C 파일 8개와 헤더 파일 3개로 구성된 편집기를 컴파일하고 링크하는 방법을 설명하는 간단한 makefile입니다.
edit : main.o kbd.o command.o display.o
insert .o serach .o files.o utils.o
cc ​​​​–o main.o kbd.o command.o display.o
insert.o search.o files.o utils.o
main. : main.c defs.h
cc ​​​​–c main.c
kdb.o : kbd.c defs.h command.h
cc ​​​​–c kbd.c
명령. o : 명령어 .c defs.h 명령어.h
cc ​​​​-c 명령어.c
display.o : 디스플레이.c defs.h 버퍼.h
cc ​​​​-c 디스플레이.c
insert.o : .c defs.h buffer.h 삽입
cc ​​​​-c insert.c
search.o : search.c defs.h buffer.h
cc ​​​​-c search.c
files.o : 파일 .c defs.h buffer.h command.h
cc ​​​​-c files.c
utils.o : utils.c defs.h
cc ​​-c utils.c
clean :
rm edit main.o kbd.o command.o display.o
insert.o search.o files.o utils.o
긴 줄로 구분 한 줄의 긴 줄을 사용하는 것과 같은 효과가 있습니다. 이 makefile을 사용하여 "edit" 실행 파일을 만들 때 make를 실행하세요. 실행 파일과 대상 파일을 삭제하려면 make clean을 실행하세요.
make가 이 편집기를 다시 컴파일할 때 변경된 각 C 파일을 다시 빌드해야 합니다. 헤더 파일이 변경되면 헤더 파일을 포함하는 각 C 파일을 다시 컴파일해야 합니다. 각 컴파일은 원본 파일에 해당하는 개체 파일을 생성합니다. 결국 개체 파일은 서로 연결되어 새로운 실행 파일을 생성합니다.
1.3.규칙 소개
makefile의 규칙은 다음과 같습니다.
TARGET … : DEPENDENCIES …
COMMAND

실행 파일 및 대상 파일과 같이 프로그램에 의해 생성된 대상(TARGET) 파일은 "정리"와 같이 수행할 작업일 수도 있습니다.
DEPENDENCIES는 대상을 생성하는 데 사용되는 입력 파일입니다. 일반적으로 대상은 여러 파일에 의존합니다.

명령(COMMAND)은 make에 의해 실행되는 작업입니다. 각 명령은 한 줄을 차지하며 여러 명령을 가질 수 있습니다. 참고: 각 명령줄의 시작 문자는 TAB 문자여야 합니다!
종속성 규칙의 명령은 일반적으로 종속 파일이 변경될 때 대상 파일을 생성하는 역할을 합니다. Make는 이러한 명령을 실행하여 대상을 업데이트하거나 생성합니다. 규칙은 "clean" 대상을 포함하는 규칙과 같은 종속성을 가질 수 없습니다.
규칙은 규칙에서 파일을 다시 실행하는 방법과 시기를 설명합니다. Make는 종속 관계를 기반으로 대상을 생성하거나 업데이트하기 위해 작업을 수행하는 방법과 시기도 설명합니다. 일부 규칙은 복잡해 보일 수 있지만 모두 위의 패턴에 맞습니다.
1.4. make 작동 방식
기본적으로 make는 기본 대상이라고 하는 첫 번째 대상('.'으로 시작하지 않는 첫 번째 대상)부터 시작합니다. 위 makefile에서 기본 목표는 실행기 'edit'를 업데이트하는 것이므로 이 목표를 맨 앞에 두십시오. make가 실행되면 make 프로그램은 현재 디렉토리에서 makefile을 읽고 첫 번째 규칙 처리를 시작합니다. 이 규칙은 make가 이 규칙을 처리하기 전에 'edit'을 다시 링크하는 것입니다. 파일에 대한 규칙(이 경우 대상 파일)에 따라 다릅니다. 이러한 파일은 자체 규칙에 따라 처리됩니다. 각 '.o' 파일은 종속 관계의 소스 파일 또는 헤더 파일이 대상 파일보다 최신이거나 대상 파일이 존재하지 않는 경우 소스 파일을 컴파일하여 업데이트됩니다. 다시 컴파일해야 합니다.
다른 규칙은 해당 대상이 대상의 종속성이므로 처리됩니다. 대상에 종속성이 없는 규칙은 make 처리가 지정되지 않는 한(예: make clean) 처리되지 않습니다.
대상 파일을 다시 컴파일하기 전에 make는 종속성(소스 파일 및 헤더 파일)을 업데이트하려고 시도합니다. 예제의 makefile은 소스 파일과 헤더 파일에 대한 작업을 지정하지 않습니다. '.c' 및 '.h' 파일은 어떤 규칙의 대상도 아닙니다. 모든 객체 파일이 최신인지 확인한 후 make는 'edit'을 다시 연결할지 여부를 결정합니다. 'edit'가 존재하지 않거나 그보다 최신인 객체 파일이 있으면 연결 작업이 진행됩니다.
이런 식으로 insert.c를 변경하고 make를 실행하면 make는 이 파일을 컴파일하여 'insert.o'를 업데이트한 다음 'command.h'를 수정하고 make를 실행하면 'edit'를 링크합니다. .o', 'command.o', 'files.o'가 재생성되어 'edit'에 연결됩니다.
1.5. 변수 사용
예시의 'edit' 규칙에서 대상 파일이 두 번 나열됩니다.
edit : main.o kbd.o command.o
insert . o search.o files.o utils.o
cc ​​​​-o edit main.o kbd.o command.o display.o
insert.o search.o files.o utils.o
like 반복으로 인해 실수하기 쉽습니다. 새 대상 파일이 프로젝트에 추가되었다고 가정하면 목록에만 추가할 수 있습니다. 이 위험은 변수를 사용하여 제거할 수 있습니다. 변수를 사용하면 미리 정의된 문자열을 여러 위치에서 바꿀 수 있습니다. .
makefile에서 다음 줄을 작성하여 'object' 변수를 정의할 수 있습니다.
objects = main.o kbd.o command.o display.o
insert.o search.o files.o utils .o
따라서 대상 파일 이름 목록이 필요한 경우 $(object)를 사용하여 변수 값을 바꾸세요. 다음은 변수를 사용한 후의 makefile입니다.
objects = main.o kbd.o command.o display.o
insert.o search.o files.o utils.o
edit : $(objects)
cc ​​​​-o $(객체) 편집
main.o : main.c defs.h
cc ​​​​-c main.c
kbd.o : kbd.c defs.h command.h
cc -c kbd.c
command.o : command.c defs.h command.h
cc ​​​​-c command.c
display.o : display.c defs .h buffer.h
cc -c display.c
insert.o : insert.c defs.h buffer.h
cc ​​​​-c insert.c
search.o : 검색합니다. c defs.h buffer.h
cc -c search.c
files.o : files.c defs.h buffer.h command.h
cc ​​​​-c files.c
utils .o : utils.c defs.h
cc -c utils.c
clean :
rm edit $(objects)
1.6 단순화된 명령
각 파일에 대한 컴파일 명령. make가 스스로 이를 수행할 수 있기 때문입니다. '.o' 파일을 '.c' 파일로 업데이트하는 데는 암묵적인 규칙이 있으므로 'cc -c' 명령을 사용하십시오. Make는 main.c를 main.o로 컴파일하기 위해 'cc -c main.c -o main.o'를 사용할 것이므로 객체 파일 생성 규칙에서 해당 명령을 생략할 수 있습니다.
'.c' 파일을 이렇게 사용하면 자동으로 종속 관계에 추가되므로, 명령 생략을 전제로 '.c' 파일을 종속 관계에서 생략할 수 있습니다. 다음은 단순화된 makefile입니다:
objects = main.o kbd.o command.o display.o
insert.o search.o files.o utils.o edit : $(objects)
cc ​​​​- o 편집 $(objects) main.o : defs.h
kbd.o : defs.h command.h
command.o : defs.h command.h
display.o : defs. h buffer .h
insert.o : defs.h buffer.h
search.o : defs.h buffer.h
files.o : defs.h buffer.h command.h
utils .o : defs.h
.PHONY : clean
clean :
-rm edit $(objects)
1.7. 또 다른 스타일
makefile의 대상이 모두 암시적 규칙으로 생성된 경우 , 규칙은 종속 관계에 따라 그룹화될 수 있습니다:
objects = main.o kbd.o command.o display.o
insert.o search.o files.o utils.o edit : $(objects)
cc ​​​​-o $(objects) $(objects) 편집 : defs.h
kbd.o command.o 파일. o : command.h
display.o insert.o search.o files.o : buffer.h
여기서 'defs.h'는 모든 대상 파일에 대한 종속성으로 사용됩니다. 이 스타일이 좋은지 나쁜지는 개인의 취향에 따라 다르겠지만, 매우 간결하지만 각 대상에 대한 종속 정보를 함께 가지고 있는 것이 조금 더 명확해 보입니다.
1.8. 정리
프로그램이 컴파일되지 않도록 규칙을 작성합니다. Makefile은 일반적으로 디렉터리에 있는 개체 파일과 실행 파일을 삭제하여 디렉터리를 정리하는 등 다른 작업을 수행하는 방법을 설명합니다. 예제는 다음과 같이 작성됩니다:

clean:
rm edit $(objects)
실제 상황은 예상치 못한 이벤트를 처리해야 한다는 것입니다. 'clean'이라는 파일이 있습니다. rm에서 오류가 발생하고 make 프로세스가 중지되는 것을 원하지 않는 경우 수정된 버전은 다음과 같습니다.
.PHONY : clean
clean :
-rm edit $(objects)
이러한 규칙은 는 기본적으로 우리가 수행하는 작업이 아니기 때문에 makefile의 시작 부분에 배치할 수 없습니다. 'clean'은 'edit'에 종속되지 않으므로 이 규칙을 실행하려면 인수 없이 make를 실행할 때 이 규칙이 실행되지 않으며 'make clean'을 실행해야 합니다.
2.Makefile
Makefile에는 명시적 규칙, 암시적 규칙, 변수 정의, 지시문 및 주석이라는 다섯 가지 유형의 콘텐츠가 포함되어 있습니다.
1. 명시적 규칙은 대상이 의존하는 파일을 나열하고 대상을 생성하거나 업데이트하는 명령을 지정합니다.
2. 파일 이름을 기준으로 파일을 지정합니다. 이는 대상이 유사한 파일 이름을 가진 파일에 의존할 수 있음을 나타내며 해당 명령이 지정됩니다.
3. 명령어는 다음을 포함하여 컴파일러 의사 명령어와 유사합니다.
4. make에게 다른 makefile을 읽도록 지시합니다
5. makefile의 일부를 무시할지 여부를 결정합니다7. 줄의 '#'은 주석으로 시작하여 줄 연속 기호가 나타나지 않는 한 줄 끝까지 계속됩니다. 'define' 및 명령에는 주석이 있을 수 없습니다. 그렇지 않으면 주석이 어디에나 나타날 수 있습니다.
2.1.makefile 이름
기본적으로 make는 'GNUmakefile', 'makefile' 및 'Makefile'(대소문자 주의)이라는 이름의 makefile을 검색합니다. 일반적으로 메이크파일은 'makefile' 또는 'Makefile'이라고 불러야 합니다. 'GNUmakefile'은 권장되지 않습니다. 귀하의 makefile이 GNU make에 맞게 사용자 정의되지 않는 한, 다른 make는 해당 이름을 makefile의 이름으로 간주하지 않습니다.
비표준 이름의 makefile을 사용하는 경우 명령 스위치 '-f' 또는 '--file'을 사용해야 합니다. '-f NAME' 또는 '--file NAME' 인수는 make에게 NAME을 makefile로 읽도록 지시합니다. 여러 스위치를 사용하는 경우 모든 파일이 순차적으로 연결됩니다. 이 옵션을 사용하면 표준 makefile 이름이 자동으로 감지되지 않습니다.
2.2.
'include' 지시문을 포함하여 make에게 나머지 콘텐츠 처리를 일시 중지하고 다른 makefile을 읽도록 지시합니다. 구문은 다음과 같습니다.
include FILENAMES...
이 줄 시작 부분에 공백이 있을 수 있지만 TAB 문자는 허용되지 않습니다. 파일 이름에 변수나 함수가 포함되어 있으면 확장됩니다.
2.3. 'MAKEFILE' 변수
환경 변수 'MAKEFILE'이 정의된 경우 make는 해당 값을 공백으로 구분된 일련의 파일 이름으로 간주하며 다른 makefile을 처리하기 전에 make 프로그램에서 읽습니다. 이는 include 지시문과 유사합니다. 이 파일의 대상은 기본 대상에 영향을 주지 않으며 파일을 찾을 수 없더라도 make는 이를 오류로 간주하지 않습니다.
이 변수의 주요 목적은 통신 시 make 프로그램을 반복적으로 참조하는 것입니다.
2.4 makefile을 재생성하는 방법
makefile이 RCS 또는 SCCS 파일과 같은 다른 파일에서 생성되는 경우도 있습니다. makefile이 다른 파일에서 생성된 경우 make는 최신 버전의 makefile을 읽어야 합니다.
모든 makefile을 읽은 후 make는 각 makefile을 대상으로 간주하고 업데이트를 시도합니다. makefile에 업데이트 방법에 대한 규칙이 있거나 적용되는 암시적 규칙이 있는 경우 필요한 업데이트가 수행됩니다. . 모든 makefile을 검사한 후 변경된 사항이 있으면 make는 읽기를 다시 시작합니다(make는 다시 업데이트를 시도하지만 일반적으로 이미 최신 파일이므로 더 이상 변경되지 않습니다).
파일이 이중 콜론 규칙을 사용하고 명령을 제공하지만 종속성이 없는 경우 파일은 항상 업데이트됩니다. makefile의 경우, makefile에 이중 콜론 규칙이 있고 명령을 제공하지만 종속성이 없으면 makefile은 항상 재생성되며 이는 순환으로 이어집니다. make는 makefile을 지속적으로 업데이트할 뿐 아무런 작업도 수행하지 않습니다. 이러한 상황을 피하기 위해 make는 종속성이 없는 명령만 포함하는 이중 콜론 규칙을 사용하여 makefile을 재생성하지 않습니다.
'-f' 또는 '--file' 옵션을 사용하지 않으면 make는 기본 makefile 파일 이름을 사용합니다. '-f' 또는 '--file' 옵션을 지정하는 것과 달리 make는 이러한 파일이 존재해야 하는지 여부를 결정할 수 없습니다. 그러나 기본 makefile이 존재하지 않지만 make 규칙을 실행하여 생성할 수 있는 경우 makefile을 사용할 수 있도록 이러한 규칙을 실행해야 할 수도 있습니다.
따라서 기본 makefile이 없으면 성공하거나 이름이 부족할 때까지 makefile 이름을 조회하는 순서대로 생성을 시도합니다. make가 makefile을 찾거나 생성할 수 없는 경우에는 오류가 아닙니다. makefile이 항상 필요한 것은 아닙니다.
'-t' 또는 '--toUCh' 옵션을 사용할 때, 어떤 대상을 터치할지 결정하기 위해 오래된 makefile을 사용하는 것은 바람직하지 않습니다. 따라서 '-t' 옵션은 makefile 업데이트에 영향을 미치지 않습니다. '-q'(또는 '--question') 및 '-n'(또는 '--just-print')과 같은 옵션은 makefile 업데이트를 방지하지 않습니다. 오래된 makefile은 잘못된 출력을 생성합니다. 이 방법으로 'make -f mfile -n foo'는 'mfile'을 업데이트하고, 이를 읽고, 'foo'를 업데이트하는 데 필요한 명령을 인쇄하지만 실행하지는 않습니다. 'foo' 관련 명령어는 업데이트된 'mfile'의 내용입니다.
그러나 makefile을 업데이트하고 싶지 않은 경우에는 명령줄에서 makefile을 대상으로 사용할 수 있습니다. makefile이 대상으로 명시적으로 지정되면 '-t' 옵션도 적용됩니다.
이런 식으로 'make -f mfile -n mfile foo'는 'mfile'을 읽고 실행할 업데이트된 명령을 인쇄합니다. 'foo'의 명령은 현재 'mfile'의 내용입니다.
2.5. makefile 오버로드
'include' 지시문을 사용하여 다른 makefile을 포함하고 대상 변수 정의를 추가할 수 있습니다. 그러나 make는 동일한 대상에 대해 다른 명령을 허용하지 않으며 목표를 달성하는 다른 방법이 있습니다.
'makefile'과 'mfile'이 있다고 가정해 보겠습니다. 'makfile'에는 'mfile'이 포함되어야 하지만 둘 다 대상 'foo'에 대한 규칙이 있습니다. 이는 어떤 패턴과도 일치하도록 'makefile'에 작성할 수 있는 규칙으로, make가 'makefile'에서 대상을 찾지 못한 경우 'mfile'을 검색함을 나타냅니다.
foo:
frobnicate > 🎜>% : force
@$(MAKE) -f mfile $@
force: ;
'make foo' 실행 시 make는 'makefile'을 찾아 'frobnicate > foo' 명령을 실행합니다. 'make bar'를 실행하면 'makefile'에는 해당 규칙이 없습니다. 이때 'make -f mfile bar' 명령을 실행하면 'makefile'에 언급되지 않은 다른 대상도 유사합니다. .
이 방법은 패턴 규칙의 패턴이 모든 대상과 일치할 수 있는 '%'이기 때문에 모두 작동합니다. 이 규칙은 대상이 존재하더라도 명령이 실행되도록 보장하는 'force'에 의존합니다. ' rule 비어 있는 명령은 'make'가 이에 대한 암시적 규칙을 검색하는 것을 방지합니다. 이로 인해 종속성 순환이 발생합니다.

3. 규칙
makefile의 규칙은 규칙의 대상이 되는 특정 파일을 생성하는 방법을 설명합니다. 규칙은 대상의 종속성 파일을 나열하고 대상을 빌드하거나 업데이트하는 명령을 지정합니다.
기본 대상을 결정하는 것을 제외하고 규칙의 순서는 중요하지 않습니다. 기본 대상은 첫 번째 메이크파일의 첫 번째 규칙입니다. 첫 번째 규칙에 여러 대상이 있는 경우 첫 번째 대상이 기본값입니다. 두 가지 예외가 있습니다. '.'로 시작하는 대상은 기본 대상이 아니며 기본 대상에 영향을 주지 않습니다.
보통 우리가 작성하는 규칙 중 하나는 전체 프로그램 또는 makefile에 지정된 모든 프로그램을 컴파일하는 것입니다.
3.1. 예
foo.o : foo.c defs.h # Frobs를 조작하기 위한 모듈
cc ​​​​-c -g foo.c
'foo.o'를 대상으로 하며 이에 따라 다릅니다. on 'foo.c', 'defs.h'에는 'cc -c -g foo.c'라는 명령어가 있습니다. 명령줄은 TAB 문자로 시작하여 명령임을 나타냅니다.
이 규칙은 두 가지를 설명합니다.
8. 'foo.o'가 오래된 것인지 결정하는 방법: 존재하지 않는지, 아니면 'foo.c' 또는 'defs.h'가 최신인지 여부.
9. 'foo.o' 파일을 업데이트하는 방법: 'cc' 프로그램을 실행합니다. 명령에는 'defs.h'가 언급되어 있지 않으므로 'foo.c'에 이를 포함하고 있다고 가정할 수 있으며, 이것이 'defs.h'가 종속 관계에 배치되는 이유입니다.
3.2. 규칙 구문
구문은 다음과 같습니다.
TARGETS : DEPENDENCIES
COMMAND
...
또는
TARGETS : DEPENDENCIES
COMMAND
..
TARGETS는 공백으로 구분된 파일 이름이며 와일드카드를 사용할 수 있습니다. 일반적으로 규칙에는 하나의 목표만 있지만 때로는 여러 목표가 있는 경우도 있습니다.
명령줄은 Tab 키로 시작됩니다. 첫 번째 명령은 종속 관계 다음 줄에 있거나 세미콜론 뒤의 같은 줄에 있을 수 있습니다.
'$' 기호는 변수 참조로 사용되기 때문에 규칙에서 '$' 기호를 사용하려면 '$$' 두 개를 써야 합니다. 긴 줄을 나누기 위해 '' 기호를 사용할 수 있습니다. make는 줄의 길이에 제한이 없기 때문에 이것은 필요하지 않습니다.
3.3.와일드카드 문자
규칙의 파일 이름에는 '*', '?'와 같은 와일드카드 문자가 포함될 수 있습니다.
파일명 앞의 '~' 문자는 특별한 의미를 갖습니다. 단독으로 사용되거나 뒤에 '/'가 오면 사용자의 홈 디렉토리를 나타냅니다. 예를 들어 '~/bin'은 /home/you/bin'으로 확장됩니다. '~' 뒤에 단어가 오면 예를 들어 '~john/bin'은 '/home/john/bin'으로 확장됩니다.
와일드카드는 대상, 종속성 및 명령에서 자동으로 확장됩니다. 다른 경우에는 '와일드카드' 기능을 명시적으로 사용하지 않는 한 와일드카드가 확장됩니다. 와일드카드 문자의 특별한 의미는 '' 기호를 사용하여 닫을 수 있습니다.
예:
clean:
rm -f *.o

print: *.c
lpr -p $?
touch print
와일드카드 정의 변수는 확장되지 않습니다. 예를 들어
objects = *.o
개체의 값은 '*.o' 문자열이지만 대상, 종속성 또는 명령에서 개체를 사용하면 확장이 발생합니다. 객체를 확장된 콘텐츠로 설정하려면 다음을 사용하세요.
objects := $(wildcard *.o)
3.3.1 와일드카드의 결함
이것은 와일드카드를 사용한 예이지만 결과는 기대한 것과 다릅니다. 실행 파일 'foo'가 현재 디렉터리의 모든 '.o' 파일에서 생성된다고 가정합니다.
objects = *.o foo : $(objects)
cc ​​​​-o foo $(CFLAGS) $(objects )
objects 변수의 값은 문자열 '*.o'입니다. 와일드카드 확장은 'foo' 규칙에서 수행되므로 기존의 모든 '.o' 파일은 'foo'에 종속되며 필요한 경우 다시 컴파일됩니다.
그런데 '.o' 파일이 모두 삭제된다면 어떨까요? 와일드카드가 어떤 파일과도 일치하지 않으면 모든 것이 그대로 유지됩니다. 그러면 'foo'는 '*.o'라는 파일에 의존합니다. 이 파일은 존재할 가능성이 없기 때문에 'make' 프로그램은 '*.o'를 생성할 수 없다고 보고합니다. o' '파일에 오류가 있습니다. 예상한 결과가 아닙니다.
실제로 와일드카드를 사용하면 원하는 결과를 얻을 수 있지만 '와일드카드' 기능, 문자열 대체 기능 등 복잡한 기술이 필요합니다.
3.3.2.와일드카드 기능
와일드카드는 규칙에서 자동으로 수행됩니다. 그러나 변수 할당 및 함수 인수에서는 와일드카드가 확장되지 않습니다. 이러한 경우 와일드카드 확장이 필요한 경우 '와일드카드' 함수를 사용해야 합니다. 구문은 다음과 같습니다.
$(와일드카드 패턴...)
메이크파일의 어느 위치에나 나타나는 이 문자열은 모든 파일 이름 패턴과 일치하는 공백으로 구분된 기존 파일 목록으로 대체됩니다. 패턴과 일치하는 파일이 없으면 'wildcard' 출력에서 ​​해당 패턴이 무시됩니다. 이는 위에서 설명한 와일드카드 처리와 다릅니다.
'와일드카드' 기능의 한 가지 기능은 다음 디렉터리에서 모든 '.c' 파일을 찾는 것입니다.
$(wildcard *.c)
접미사 '.c'를 '.o로 바꿀 수 있습니다. ' C 파일 목록에서 대상 파일 목록을 가져옵니다:
$(patsubst %.c,%.o,$(wildcard *.c))
이런 방식으로 이전 섹션의 makefile은 다음과 같이 다시 작성됩니다. :
objects := $(patsubst %.c,%.o,$(wildcard *.c)) foo : $(objects)
cc ​​​​-o foo $(objects)
이 makefile C 프로그램 컴파일을 위한 암시적 규칙을 활용하므로 컴파일을 위해 명시적인 규칙을 작성할 필요가 없습니다. (':='는 '='의 변형입니다.)
참고: 'PATTERN'은 대소문자를 구분합니다.
3.4.디렉터리 검색
대규모 시스템의 경우 일반적으로 소스 파일과 대상 파일이 서로 다른 디렉터리에 위치합니다. 디렉토리 검색 기능을 사용하면 make가 여러 디렉토리에 있는 종속 파일을 자동으로 검색할 수 있습니다. 파일을 재배포할 때 규칙을 변경할 필요가 없으며 검색 경로만 변경하면 됩니다.
3.4.1. 'VPATH'
make 변수 'VPATH'는 make가 검색해야 하는 디렉터리 목록을 나열합니다. 대부분의 경우 현재 디렉터리에는 종속 파일이 포함되어 있지 않으며 'VPATH'는 규칙의 대상인 파일을 포함한 모든 파일의 검색 목록을 설명합니다.
현재 디렉터리에 대상 파일이나 종속 파일이 없으면 'make'는 'VPATH'에 나열된 디렉터리에서 동일한 이름을 가진 파일을 검색합니다. 발견되면 해당 파일은 종속 파일이 되며 규칙은 파일이 현재 디렉터리에 있는 것처럼 사용할 수 있습니다.
'VPATH' 변수에서 디렉토리 이름은 콜론이나 공백으로 구분됩니다. 디렉토리가 나열된 순서에 따라 검색 순서가 결정됩니다. (참고: pSOSystem 2.5의 Win32에 이식된 GNU make 디렉토리 이름은 세미콜론으로 구분되어야 하며, 이후에는 Win32 GNU make라고 합니다.) 예: VPATH = src:../headers 그러면
foo.o : foo.c
규칙은 'foo.c'를 가정하여
foo.o : src/foo.c
로 해석됩니다. ' 현재 디렉터리에는 존재하지 않으며, 'src' 디렉터리에서 찾을 수 있습니다.
3.4.2. 선택적 검색
'VPATH' 변수와 유사하지만 더 선택적은 특정 패턴과 일치하는 파일의 검색 경로를 지정할 수 있는 'vpath' 지시문입니다(소문자에 유의하세요). 이를 통해 다양한 유형의 파일에 대해 다양한 검색 경로를 지정할 수 있습니다.
'vpath' 지시문에는 세 가지 형식이 있습니다.
10.'vpath PATTERN DirectorIES'

PATTERN과 일치하는 파일 이름에 대한 검색 경로 DIRECTORIES를 지정합니다. 디렉토리 구분은 '와 동일합니다. VPATH'
11.'vpath PATTERN'
PATTERN과 일치하는 파일 이름에 대해 지정된 검색 경로 지우기
12.'vpath'
이전에 'vpath'로 지정한 모든 검색 경로 지우기
'vpath ' 패턴은 '%'를 포함하는 문자열입니다. 이 문자열은 검색할 파일 이름과 일치해야 하며 '%' 문자는 0개 이상의 문자와 일치합니다. 예를 들어 '%.h'는 '.h'로 끝나는 모든 파일과 일치합니다(%가 없으면 패턴은 일반적으로 사용되지 않는 종속 파일과 정확히 동일해야 합니다).
현재 디렉터리에 종속 파일이 없는 경우 'vpath'의 PATTERN이 종속 파일 이름과 일치하면 명령의 DIRECTORIES에 나열된 디렉터리는 'VPATH'와 동일하게 처리됩니다. 예:
vpath %.h ../headers
는 make에게 ../headers 디렉토리의 현재 디렉토리에 없는 '.h' 파일을 검색하라고 지시합니다.
여러 개의 'vapth' 패턴 일치가 파일 이름에 의존하는 경우 make는 이를 하나씩 처리하고 지정된 모든 디렉터리에서 검색합니다. make 파일에 나타나는 순서대로 'vapth' 프로세스를 만듭니다. 동일한 모드의 여러 'vapth'는 서로 독립적입니다.
vpath %.c foo
vpath % blish
vpath %.c bar
는 'foo', 'blish', 'bar' 순서로 '.c' 파일을 검색합니다. 그리고
vpath %.c foo:bar
vpath % blish
는 'foo', 'bar', 'blish' 순서로 검색합니다.
3.4.3.자동변수 사용하기
디렉터리 검색 결과는 규칙의 명령을 변경하지 않으며 명령은 있는 그대로 실행됩니다. 따라서 디렉토리 검색 기능에 적합한 명령어를 작성해야 합니다. 이는 '$^'와 같은 자동 변수를 사용하여 수행할 수 있습니다. '$^'은 해당 파일이 위치한 디렉터리 이름을 포함하여 규칙의 모든 종속 파일을 나타냅니다(디렉터리 검색 참조). '$@'은 대상을 나타냅니다. 예를 들면 다음과 같습니다.
foo.o : foo.c
cc ​​​​-c $(CFLAGS) $^ -o $@
일반적으로 종속 파일에는 헤더 파일도 포함되어 있지만 이러한 파일은 여기에 언급되지 않습니다. 파일 명령: '$<' 변수는 첫 번째 종속 파일을 나타냅니다.
VPATH = src:../headers
foo.o : foo.c defs.h hack.h
cc ​​​​–c $( CFLAGS) $< -o $@
3.4.4. 디렉터리 검색 및 암시적 규칙
'VPATH' 및 'vpath'를 사용하여 디렉터리 검색을 지정하면 암시적 규칙에도 영향을 미칩니다. 예를 들어, 'foo.o' 파일에는 명시적인 규칙이 없으며, make는 암시적인 규칙을 고려합니다. 'foo.c'가 존재하면 이를 컴파일하고, 'foo.c'가 존재하지 않으면 해당 디렉토리에서 검색합니다. c' '가 임의의 디렉토리에 존재하는 경우 C 컴파일의 암시적 규칙이 적용됩니다.
디렉터리 검색으로 얻은 파일 이름을 추가 노력 없이 사용할 수 있도록 암시적 규칙이 있는 명령에 자동 변수를 사용하는 것이 필요한 경우가 많습니다.
3.5.PHONY 대상
Phony 대상은 실제 파일 이름이 아니며 명시적으로 요청될 때 실행될 명령의 이름일 뿐입니다. 가짜 대상을 사용하는 두 가지 이유는 동일한 이름의 파일과의 충돌을 방지하고 성능을 향상시키기 위한 것입니다.
타겟 파일을 생성하지 않는 규칙을 작성하면 타겟이 생성될 때마다 해당 명령이 실행됩니다. 예:
clean:
rm *.o temp
'rm' 명령은 'clean' 파일을 생성하지 않기 때문에 'make clean'이 실행될 때마다 이 명령이 실행됩니다. 디렉터리에 'clean' 파일이 나타나면 규칙이 유효하지 않습니다. 종속 파일이 없고 'clean' 파일이 항상 최신 파일이며 명령이 실행되지 않습니다. 이 문제를 방지하려면 '.PHONY'를 사용하세요. 대상을 지정하는 것입니다. 예:
.PHONY : clean
이런 식으로 'make clean'을 실행하면 'clean' 파일의 존재 여부가 무시됩니다.
포니 대상은 다른 파일에 의해 생성된 실제 파일이 아니며 make는 암시적 규칙 검색을 건너뛰는 것으로 알려져 있습니다. 이것이 실제 파일의 존재 여부에 대해 걱정하지 않더라도 가짜 대상을 선언하면 성능이 향상되는 이유입니다. 전체 예는 다음과 같습니다.
.PHONY : clean
clean :
rm *.o temp
포니 대상은 실제 대상 파일에 의존해서는 안 됩니다. 그렇다면 이 파일을 업데이트할 때마다 명령이 실행됩니다. 가짜 대상이 실제 대상에 종속되지 않는 한 규칙의 명령은 이 대상이 지정된 경우에만 실행됩니다.
가짜 대상은 종속성을 가질 수 있습니다. 한 디렉토리에 여러 프로그램이 있을 경우 makefile에 넣는 것이 더 편리합니다. 기본 대상은 makefile의 첫 번째 대상이기 때문에 이 가짜 대상은 일반적으로 'all'이라고 불리며 종속 파일은 각 프로그램입니다.
all : prog1 prog2 prog3
.PHONY : all
prog1 : prog1.o utils.o
cc ​​​​-o prog1 prog1.o utils.o
prog2 : prog2.o
cc ​​​​-o prog2 prog2.o
prog3 : prog3.o sort .o utils.o
cc ​​​​-o prog3 prog3.o sort.o utils.o
이런 식으로 'make'를 사용하면 세 가지 프로그램이 모두 생성됩니다.
하나의 가짜 대상이 다른 대상에 종속된 경우 해당 기능은 서브루틴과 동일합니다. 예:
.PHONY: cleanall cleanobj cleandiff
cleanall : cleanobj cleandiff
rm program
cleanobj:
rm *.o
cleandiff :
rm *.diff
3.6.FORCE target
규칙에 종속성과 명령이 없고 해당 대상이 기존 파일 이름이 아닌 경우 make 이 규칙이 실행되는 것으로 간주합니다. 이 대상은 항상 업데이트됩니다. 이는 규칙이 이 대상에 의존하는 경우 해당 명령이 항상 실행된다는 것을 의미합니다.
clean: FORCE
rm $(objects)
FORCE:
예제에서 타겟 'FORCE'는 이 특별한 조건을 충족하므로 이에 의존하는 타겟 'clean'은 강제로 명령을 실행합니다. 'FORCE'라는 이름은 특별한 의미는 없고, 그냥 흔히 쓰이는 이름이다. 이런 식으로 'FORCE'를 사용하는 것은 '.PHONY: clean'과 동일한 효과를 갖습니다. '.PHONY'를 사용하는 것이 더 명확하고 효율적이지만 모든 'make'가 이를 지원하는 것은 아니며 많은 makefile이 'FORCE'를 사용합니다.
3.7.빈 타겟
빈 타겟은 포니 타겟의 변형으로, 명시적인 요청을 수행하는 데 사용되는 작업입니다. 가짜 대상과의 차이점은 이 대상 파일이 실제로 존재할 수 있다는 것입니다. 대상 파일의 내용은 관련이 없으며 일반적으로 비어 있습니다. 빈 대상 파일의 목적은 마지막 수정 시간을 사용하여 명령이 마지막으로 실행된 시간을 기록하는 것입니다. 이는 'touch' 명령을 사용하여 대상 파일을 업데이트함으로써 달성됩니다.
print: foo.c bar.c
lpr -p $?
touch print
이 규칙을 사용하여 'make print' 실행 시 마지막 'make print' 이후 파일이 변경되면, 'lpr' 명령이 실행됩니다. 자동 변수 '$?'는 변경된 파일만 인쇄하는 데 사용됩니다.
3.8. 내장된 특별한 타겟
특정 이름은 타겟으로 존재할 때 특별한 의미를 갖습니다.
13..PHONY 이 대상의 종속성은 가짜 대상으로 간주됩니다. 이러한 대상을 처리할 때 파일 이름이 존재하는지 또는 마지막 수정 시간에 관계없이 명령이 무조건 실행됩니다.

14. .이 대상의 SUFFIXES Reliance는 접미사 목록으로 간주됩니다. 접미사 규칙을 확인할 때
를 사용하세요.15..DEFAULT 이 대상에 대한 규칙은 규칙이 없는 대상(명시적 또는 암시적)에서 사용됩니다. 'DEFAULT' 명령이 정의된 경우 이 명령 세트는 규칙 대상이 아닌 모든 종속 파일에 대해 실행됩니다.
16..PRECIOUS 이 대상의 종속 파일은 특별한 처리를 받습니다: make가 종료되거나 실행되는 경우 명령이 중단되면 이러한 대상은 삭제되지 않으며 대상이 중간 파일인 경우 더 이상 필요하지 않으면 삭제되지 않습니다. 암시적 규칙(예: %.o)의 대상 패턴을 '.PRECIOUS'의 종속 파일로 사용할 수 있으므로 이러한 규칙에 의해 생성된 중간 파일을 저장할 수 있습니다.
17..INTERMEDIATE 이 대상의 종속 파일은 중간 파일로 간주됩니다. 대상에 종속 파일이 없으면 makefile의 모든 대상 파일이 중간 파일로 간주됩니다.
18..IGNORE 이 대상에 대한 규칙에 의존하는 명령을 실행할 때 make는 오류를 무시합니다. 명령 자체는 의미가 없습니다. 규칙에 종속성이 없으면 모든 명령 실행의 오류가 무시된다는 의미입니다. 이 사용법은 모든 명령에 영향을 미치기 때문에 특별히 유용하지 않습니다. 오류.
19..SILENT 이 대상에 대해 규칙 종속 명령을 실행할 때 make는 명령 자체를 인쇄하지 않습니다. 규칙의 명령은 의미가 없습니다. '.SILIENT'에 종속성이 없으면 실행 시 makefile의 모든 명령이 인쇄되지 않음을 의미합니다. 이 규칙은 이전 버전과의 호환성을 위해서만 제공됩니다.
20..EXPORT_ALL_VARIABLES는 대상으로만 존재하며 make가 모든 변수를 하위 프로세스에 출력하도록 지시합니다.
정의된 암시적 규칙의 접미사를 대상으로 사용하는 경우 '.c.o'와 같이 두 접미사를 연결하는 경우에도 마찬가지입니다. 이러한 대상은 암시적 규칙을 정의하는 구식(그러나 여전히 널리 사용되는) 방식인 접미사 규칙입니다. 접미사는 일반적으로 '.'으로 시작하므로 특별한 대상도 '.'로 시작합니다.
3.9. 여러 목표가 있는 하나의 규칙
여러 목표가 있는 규칙은 각각 하나의 목표가 있는 여러 규칙을 작성하는 것과 동일한 효과를 갖습니다. 동일한 명령이 모든 대상에 적용되지만 실제 대상을 '$@'로 대체하면 그 효과가 달라집니다. 규칙에 있는 모든 대상의 종속성은 동일합니다.
이 기능은 두 가지 상황에서 유용합니다.
★ 종속성만 있고 명령은 필요하지 않습니다. 예:
kbd.o command.o files.o: command.h
21. 모든 대상에는 동일한 명령이 있습니다. 다음 명령에 '$@'을 사용할 수 있으므로 명령이 완전히 동일할 필요는 없습니다.
bigoutput littleoutput : text.g
generate text.g -$(subst output,,$@) > ; $@

bigoutput : text.g
generate text.g -big > bigoutput
littleoutput : text.g
generate text.g -little > >. 여기서는 'generate' 프로그램이 두 개의 출력을 생성한다고 가정합니다. 하나는 '-big' 옵션을 사용하고 다른 하나는 '-little' 옵션을 사용합니다. 종속 관계를 변경하기 위해 '$@' 변경 명령을 사용한다고 상상해 보면 일반적인 다중 목표 규칙으로는 달성할 수 없지만 패턴 규칙을 통해 달성할 수 있습니다.
3.10. 하나의 대상에 대한 여러 규칙
파일은 여러 규칙의 대상이 될 수 있으며 모든 규칙의 종속성은 병합됩니다. 대상이 종속 파일보다 오래된 경우 명령이 실행됩니다.
파일에는 하나의 명령 세트만 실행될 수 있습니다. 여러 규칙이 동일한 파일에 대해 명령을 내리는 경우 make는 마지막 그룹을 사용하고 오류 메시지를 인쇄합니다(예외: 파일 이름이 '.'로 시작하는 경우 오류 메시지가 인쇄되지 않습니다. 이는 다른 make와의 호환성을 위한 것입니다). 이와 같이 makefile을 작성할 이유가 없습니다. 이것이 바로 make가 오류 메시지를 표시하는 이유입니다.
종속성 관계만 있는 추가 규칙은 여러 파일에 대한 추가 종속성 파일을 한 번에 제공할 수 있습니다. 예를 들어, 'objects' 변수는 시스템의 컴파일러의 모든 출력을 나타냅니다. 'config.h'가 변경되면 모든 파일을 다시 실행해야 함을 보여주는 간단한 방법은 다음과 같습니다.
objects = foo.o bar .o
foo.o : defs.h
bar.o : defs.h test.h
$(objects) : config.h
실제 대상 파일 생성을 변경할 필요가 없습니다. 규칙은 필요에 따라 추가하거나 삭제할 수 있으며, 관계에 의존할 때 삽입하거나 제안할 수 있습니다. 또 다른 비결은 make가 실행될 때 변수에 값을 할당할 수 있다는 것입니다.
extradeps=
$(objects) : $(extradeps)
`make extradeps= foo.h'는 각 객체 파일에 대한 종속 파일로 'foo.h'로 실행되지만, 단순한 'make' 명령의 경우에는 그렇지 않습니다.
3.11.정적 패턴 규칙
정적 패턴 규칙은 여러 대상을 지정할 수 있으며 종속 관계가 필요하지 않기 때문에 대상 이름을 사용하여 일반적인 다중 대상 규칙보다 더 일반적인 종속 파일의 이름을 제안할 수 있습니다. 동일: 종속성은 유사해야 하지만 반드시 동일할 필요는 없습니다.
3.11.1. 구문
TARGETS ...: TARGET-PATTERN: DEP-PATTERNS ...
COMMANDS
...
TARGETS 목록은 규칙 적용 대상을 나타내며 다음을 수행할 수 있습니다. 일반 규칙과 동일한 목적을 가진 와일드카드를 포함합니다. TARGET-PATTERN 및 DEP-PATTERNS는 대상의 종속 관계가 계산되는 방법을 나타냅니다. TARGET-PATTERN과 일치하는 대상은 어간(stem)이라는 이름의 일부를 추출하고 어간은 DEP-PATTERNS로 대체되어 종속 파일 이름.
각 패턴에는 일반적으로 '%' 문자가 포함됩니다. TARGET-PATTERN이 대상과 일치하는 경우 '%' 문자는 대상 이름의 어떤 부분과도 일치할 수 있습니다. 이 부분은 어간이고 나머지 패턴은 정확히 일치해야 합니다. 예를 들어, 'foo.o'는 어간인 '%.o'와 일치합니다. 대상 'foo.c'와 'foo.out'은 이 패턴과 일치하지 않습니다.
대상의 종속성 파일 이름은 DEP-PATTERNS의 '%'를 줄기로 대체하여 구성됩니다. 종속성 패턴이 '%.c'인 경우 줄기 'foo'를 바꾸면 'foo.c'가 될 수 있습니다. 종속성 패턴에 '%'가 포함되지 않은 경우에도 유효하며 이 종속성 파일은 모든 대상에 유효합니다.
패턴 규칙에서 '%' 문자를 사용해야 하는 경우 '' 문자 앞에 '%' 문자를 추가해야 합니다. 다른 사람들은 '꼭 이럴 필요는 없어. 예를 들어 'the%weird%pattern' 앞에는 'the%weird'가 있고 뒤에는 'pattern'이 옵니다. 마지막 ''은 '%' 문자에 영향을 주지 않기 때문에 그대로 유지됩니다.
다음 예에서는 해당 '.c' 파일에서 'foo.o' 및 'bar.o'를 컴파일합니다.
objects = foo.o bar.o
$(objects): %.o: % .c
$(CC) -c $(CFLAGS) $< -o $@
각 대상은 대상 패턴과 일치해야 하며, 일치하지 않는 대상에 대해서는 경고가 표시됩니다. 목록의 일부 파일만 패턴과 일치하는 경우 필터 기능을 사용하여 일치하지 않는 파일 이름을 제거할 수 있습니다.

files = foo.elc bar.o loss.o $(filter %.o,$(files )) : %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
$(필터 %.elc,$(파일)): %.elc: %.el
emacs -f 배치-바이트-컴파일 $<
`$(filter %.o,$(files))'의 결과는 `bar.o loss.o'입니다. $(filter % .elc,$(files))' 결과는 `foo.elc'가 됩니다. 다음 예에서는 '$*'의 사용을 보여줍니다.
bigoutput littleoutput : %output : text.g
generate text.g -$* > $@
`generate' 명령이 실행되면, '$*' 'big' 또는 'little' 줄기로 확장됩니다.
3.11.2.정적 패턴 규칙과 암시적 규칙
정적 패턴 규칙과 암시적 규칙은 모두 대상 패턴과 파일 이름을 사용하여 구성한다는 점에서 공통점이 많습니다. 규칙을 적용할 시기를 결정하는 Make의 방법입니다.
암시적 규칙은 해당 패턴과 일치하는 모든 대상에 적용될 수 있지만, 지정된 명령이 없는 대상에만 적용할 수 있는 암시적 규칙이 여러 개 있는 경우 규칙 순서에 따라 하나만 사용됩니다.
반대로 정적 모드 규칙은 다른 대상이 아닌 규칙의 명시적 대상 목록에 적용되며 항상 지정된 모든 대상에 적용됩니다. 두 개의 충돌하는 규칙이 있고 둘 다 명령이 있는 경우 이는 오류입니다.
암시적 규칙에 비해 정적 모드 규칙의 장점은 다음과 같습니다.
22. 구문적으로 분류할 수는 없지만 명시적으로 나열할 수 있는 일부 파일의 경우 암시적 규칙을 재정의할 수 있습니다.
23. 일부 외부 파일의 정확한 내용으로 인해 make가 잘못된 암시적 규칙을 적용하게 될 수 있으며 최종 결과는 암시적 규칙의 순서에 따라 달라질 수 있습니다. 정적 패턴 규칙을 적용할 때 이러한 불확실성은 존재하지 않습니다. 규칙은 명확하게 지정된 목표에 적용됩니다.
3.12.더블 콜론 규칙
더블 콜론 규칙의 대상 뒤에는 ':' 대신 '::'이 옵니다. 대상이 여러 규칙에 나타날 경우 처리 방식은 일반 규칙과 동일합니다. .은 다르게 처리됩니다.
대상이 여러 규칙에 나타나는 경우 모든 규칙은 동일한 유형(모두 일반 또는 모두 이중 콜론)이어야 합니다. 이중 콜론인 경우 규칙은 서로 독립적입니다. 대상을 업데이트해야 하는 경우 규칙의 명령이 실행되지 않거나 일부가 실행될 수 있습니다. 규칙이 실행됩니다.
동일한 대상에 대한 이중 콜론 규칙이 완전히 격리되어 있다는 사실은 다른 대상에 대한 규칙과 마찬가지로 각 규칙이 별도로 처리된다는 사실입니다. 이러한 규칙의 실제 의미는 다음과 같습니다. is 명령 실행 순서와는 관련이 없습니다.
이 규칙은 때때로 모호하지만 그다지 유용하지는 않습니다. 드물게 파일 업데이트에 의존하여 대상을 다르게 처리하는 메커니즘을 제공합니다. 이러한 각 규칙은 명령을 제공해야 하며 그렇지 않은 경우 적용 가능한 암시적 규칙이 사용됩니다.
3.13. 의존성 자동 생성
makefile에서는 일부 대상 파일이 일부 헤더 파일에 의존한다는 규칙이 많습니다. 예를 들어 'main.c'는 '#include'를 통해 'defs.h'를 사용하므로 규칙:
main.o: defs.h
는 make에게 'defs.h가 'main.o를 업데이트하도록 지시합니다. '변화하다'. 프로그램이 비교적 큰 경우 이러한 규칙을 많이 작성해야 하며 '#include'가 추가되거나 삭제될 때마다 makefile을 주의 깊게 업데이트해야 합니다. 많은 최신 컴파일러는 이러한 규칙을 작성할 수 있으며 일반적으로 컴파일러의 '-M' 옵션을 통해 수행됩니다. 예를 들어
cc ​​​​-M main.c
명령은 다음을 출력합니다.
main.o : main.c defs.h
이렇게 하면 이러한 규칙을 작성할 필요가 없으며 컴파일러가 대신 작성해 줍니다.
이러한 종속 관계에 언급된 'main.o'는 암시적 규칙에 따라 중간 파일로 간주되지 않으므로 make는 이를 사용한 후에 해당 파일을 삭제하지 않는다는 것을 의미합니다. 이전 'make' 프로그램을 사용할 때 일반적인 관행은 'make dependency' 명령을 사용하여 컴파일러 기능을 사용하여 종속성을 생성하는 것입니다. 이 명령은 자동으로 생성된 모든 종속성을 포함하는 'dependent' 파일을 생성한 다음 'include'를 사용합니다. '라고 읽어 보세요.
GNU의 make를 사용할 때 makefile을 재생성하는 기능으로 인해 이 관행이 쓸모 없게 됩니다. 항상 오래된 makefile을 재생성하므로 종속성을 업데이트하라는 명시적인 요청이 전혀 없습니다.
자동 종속성 생성에 권장되는 접근 방식은 각 소스 파일에 대해 makefile을 생성하는 것입니다. 각 소스 파일 'NAME.c'에는 타겟 파일 'NAME.o'가 의존하는 모든 파일을 나열하는 makefile 'NAME.d'가 있으므로 소스 파일이 업데이트될 때 이를 업데이트해야 합니다. 새로운 종속 관계를 생성하기 위해 스캔되었습니다. 예를 들어 'NAME.c'에서 종속 파일 'NAME.d'를 생성하는 패턴 규칙이 있습니다.
%.d: %.c
$(SHELL) -ec '$(CC) -M $( CPPFLAGS) $<
sed '''s/($*).o[ :]*/1 $@/g''' > $@'
-e 옵션은 $(CC) 명령이 실패하면(종료 상태가 0이 아님) 쉘이 즉시 종료됩니다. 일반적으로 셸의 반환 값은 파이프라인의 마지막 명령(sed)의 반환 값이므로 make는 컴파일러 오류를 알아차리지 못합니다.
GNU C 컴파일러(gcc)를 사용할 때 '-M' 옵션 대신 '-MM' 옵션을 사용하면 시스템 헤더 파일에 대한 종속성을 생략할 수 있습니다. 'sed' 명령의 목적은
main.o : main.c defs.h

main.o main.d : main.c defs.h
로 변환하는 것입니다. '.d' 파일은 '.o' 파일의 해당 소스 파일과 헤더 파일에 의존하며, make는 원본 텍스트나 헤더 파일이 변경되면 종속 관계 파일을 업데이트할 수 있습니다.
'.d' 파일 생성 규칙이 정의된 경우 'include' 지시어를 사용하여 모든 파일을 읽을 수 있습니다.
sources = foo.c bar.c
include $(sources:. c= .d)
이 예에서는 대체 변수를 사용하여 소스 파일 목록 'foo.c bar.c'를 종속 관계 파일 목록으로 변환합니다. '.d' 파일은 다른 파일과 같고 더 이상 작업이 필요하지 않기 때문에 make는 필요할 때 해당 파일을 다시 생성합니다.
4. 명령 쓰기
규칙의 명령은 하나씩 실행되는 쉘 명령으로 구성됩니다. 세미콜론으로 구분된 종속성 뒤에 작성된 명령 외에도 각 명령줄은 탭 문자로 시작해야 합니다. 빈 줄과 주석 줄은 명령줄에 나타날 수 있으며 처리 중에 무시됩니다(참고: 탭 문자로 시작하는 빈 줄). is not '빈' 줄은 빈 명령입니다).
모든 프로그램을 명령에 사용할 수 있지만 이러한 프로그램은 $(SHELL)에 의해 실행됩니다.
4.1.Echo
make는 일반적으로 실행할 명령어를 출력하는데 이를 echo라고 합니다. 이는 명령어를 직접 입력하는 것과 같은 현상입니다. 행 앞에 '@' 문자가 있으면 명령은 더 이상 에코되지 않으며 '@' 문자는 쉘에 전달되기 전에 삭제됩니다. 일반적인 사용법은 'echo' 명령과 같은 인쇄 명령에만 유효합니다.
@echo 배포 파일 만들기
make가 '-n' 또는 '--just-print' 옵션을 사용할 때 표시할 내용 모든 일이 일어날 것이지만 명령을 실행하지는 않습니다. 이 경우에만 명령이 '@'으로 시작하더라도 명령줄이 계속 표시됩니다. 이 옵션은 make가 실제로 수행하는 작업을 확인하는 데 유용합니다.
'-s' 또는 '--silent' 옵션은 '@'로 시작하는 모든 명령과 마찬가지로 종속성이 없는 '.SILENT' 규칙과 동일한 효과를 가지지만 '@'가 더 많은 효과를 가집니다. 유연한.

4.2.실행
대상을 업데이트하기 위해 명령을 실행해야 하는 경우 make는 실행할 각 줄마다 하위 쉘을 생성합니다. 이는 프로세스에 대한 로컬 변수를 설정하는(프로세스의 현재 디렉토리 변경) 'cd'와 같은 쉘 명령이 후속 명령에 영향을 미치지 않음을 의미합니다. 다음 명령에 영향을 주기 위해 'cd'가 필요한 경우 세미콜론으로 구분하여 한 줄에 입력하십시오. 그러면 make는 이것이 쉘 프로그램에 전달된 명령이라고 생각하게 됩니다(참고: 이는 쉘 지원이 필요함).
foo : bar/ loss
gobble loss > ../foo
또 다른 형태는 줄 연속 문자를 사용합니다:
foo : bar/lose
cd bar
gobble loss > foo
쉘 프로그램 이름은 'SHELL' 변수를 통해 알아냅니다.
(*UNIX) 대부분의 변수와 달리 'SHELL' 변수는 환경을 통해 설정되지 않습니다(즉, makefile에 설정해야 함). 'SHELL' 환경은 개인 선택이므로, 다를 경우 사람들의 선택은 메이크파일에 영향을 미칠 것입니다. 기능적인 측면에서 이것은 끔찍합니다.
4.3. 병렬 실행
GNU make는 한 번에 여러 명령을 실행할 수 있습니다. 일반적으로 make는 한 번에 하나의 명령을 실행하고 반환을 기다린 후 다음 명령을 실행합니다. 여러 명령을 동시에 실행하려면 '-j' 또는 '--jobs'를 사용하세요. '-j' 뒤에 양수가 있으면 한 번에 실행할 수 있는 명령 수를 나타내고, '-j' 뒤에 매개 변수가 없으면 실행할 수 있는 명령 수에 제한이 없습니다. . 기본 숫자는 1입니다.
한 가지 성가신 문제는 여러 명령이 동시에 실행되면 출력이 혼합된다는 것입니다. 또 다른 문제는 두 프로세스가 동일한 장치에서 입력을 받을 수 없다는 것입니다.
4.4.오류
각 쉘 명령이 반환되면 make는 반환 상태를 확인합니다. 명령이 성공적으로 실행되면 마지막 명령이 실행된 후 다음 명령이 실행되고 규칙 실행이 종료됩니다.
오류가 있는 경우(0이 아닌 상태를 반환) make는 현재 규칙과 모든 규칙을 포기합니다.
때때로 명령 실행 오류는 문제가 되지 않습니다. 예를 들어 'mkdir' 명령을 사용하여 디렉토리가 존재하는지 확인합니다. 디렉토리가 존재하면 'mkdir'이 오류를 보고하지만 여전히 make를 계속하기를 원합니다.
명령 오류를 무시하려면 명령 앞에 '-' 문자를 사용하세요. '-' 문자는 셸에 전달되기 전에 삭제됩니다.
clean:
-rm -f *.o
'-i' 또는 '--ignore-errors' 옵션과 함께 사용하면 make는 모든 명령에서 생성된 오류를 무시합니다. 종속성이 없는 '.IGNORE' 규칙은 동일한 효과를 갖지만 '-'가 더 유연합니다.
오류를 무시할 때 make는 오류를 성공으로 처리하고 명령의 종료 상태만 알리고 오류는 무시됩니다. make가 오류를 무시하라고 지시하지 않으면 오류가 발생하면 대상을 성공적으로 업데이트할 수 없으며 이에 직접 또는 간접적으로 의존하는 대상이 확실히 성공하지 못할 것임을 의미합니다. 전제 조건이 충족되지 않았기 때문에 실행되었습니다.
일반적으로 make는 0이 아닌 상태로 즉시 종료됩니다. 그러나 '-k' 또는 '-keep-going' 옵션이 주어지면 make는 종료하기 전에 다른 종속성을 처리하고 필요한 업데이트를 수행합니다. 예를 들어, 하나의 객체 파일을 컴파일하는 동안 오류가 발생하면 'make -k'는 다른 객체 파일을 계속해서 컴파일합니다.
일반적으로 목적은 지정된 대상을 업데이트하는 것으로 간주됩니다. make가 이것이 불가능하다는 것을 알게 되면 즉시 실패를 보고합니다. '-k' 옵션은 실제 목적이 더 많은 업데이트 가능성을 테스트하는 것임을 나타냅니다. 프로그램: 컴파일하기 전에 찾기 더 관련 없는 질문입니다.
명령이 실패하면 대상 파일을 업데이트한다고 가정하고 파일이 불완전하여 사용할 수 없습니다. 적어도 완전히 업데이트되지는 않습니다. 그러나 파일의 마지막 수정 시간은 이미 최신 파일임을 나타내며 다음에 make가 실행될 때 파일이 업데이트되지 않습니다. 이 상황은 명령이 종료되는 것과 동일합니다. 명령이 실패하면 make가 대상을 삭제하는 것이 일반적입니다. 항상 make가 이 작업을 수행하기를 원하지만 이는 관례가 아니므로 make에게 이를 수행하도록 명시적으로 요청해야 합니다(다른 make는 이 작업을 자동으로 수행합니다).
4.5. make 중단
make가 명령을 실행할 때 오류가 발생하면 해당 명령으로 업데이트된 대상 파일이 삭제될 수 있습니다. make는 파일의 수정 시간이 변경되었는지 확인합니다. 대상을 제거하는 목적은 다음에 make가 실행될 때 대상이 다시 생성되도록 하는 것입니다. 왜 이런 일을 하는가? 컴파일러가 실행되는 동안 'Ctrl-c'를 눌렀다고 가정해보자. 이때 컴파일러는 'foo.o'라는 객체 파일을 작성하고 생성한다. 'Ctrl-c'는 컴파일러를 종료하고 불완전한 파일을 남기지만 수정 시간은 현재 소스 파일 'foo.c'보다 최신이므로 make는 이 불완전한 파일을 삭제하기 위해 'Ctrl-c' 신호도 받습니다. make가 이 작업을 수행하지 않으면 다음에 make를 실행할 때 'foo.o'를 업데이트할 필요가 없다고 생각하여 링크하는 동안 이상한 오류가 발생하게 됩니다.
'.PRECIOUS' 규칙을 사용하면 대상 파일이 삭제되는 것을 방지할 수 있습니다. make 업데이트 대상을 업데이트할 때 '.PRECIOUS'의 종속성인지 여부를 감지하고 명령 오류 또는 중단이 발생하면 대상을 삭제할지 여부를 결정합니다. 대상에 대한 업데이트를 원자성으로 하거나, 수정 시간을 기록하거나, 다른 유형의 오류를 방지하기 위해 지속시키려는 경우 이를 수행해야 하는 이유는 다음과 같습니다.
4.6.재귀적 사용
make의 재귀적 사용은 makefile에서 make 명령을 사용하는 것입니다. 이 기술은 대규모 시스템을 여러 하위 시스템으로 나누고 각 하위 시스템에 makefile을 제공할 때 유용합니다. 예를 들어 자체 makefile이 있는 'subdir' 하위 디렉토리가 있고 자체 디렉토리에서 make를 실행하려면 다음과 같이 하면 됩니다.
subsystem:
cd subdir; 또는
하위 시스템:
$(MAKE) -C 하위 디렉터리
make를 재귀적으로 사용하려면 이 예제를 복사할 수 있습니다.
4.6.1.'MAKE' 변수
재귀 make는 'MAKE를 사용해야 합니다. ' 변수, 명시적 make 명령 아님:
subsystem:
cd subdir $(MAKE)
이 변수의 값은 호출되는 make의 이름입니다. 명령에 'MAKE'를 사용하면 특별한 작업이 수행됩니다. 즉, `-t'(`--touch'), `-n'(`--just-print') 및 `-q'(`--question')가 변경됩니다. ') 옵션의 의미. 위의 예를 사용하여 'make –t' 명령을 고려하십시오('-t' 옵션은 대상을 최신으로 표시하지만 명령을 실행하지 않습니다). 또한 '-t' 옵션은 '하위 시스템'을 생성합니다. ' 작업은 'cd subdir; make –t'를 실행하는 것이지만 이는 '-t'의 원래 의미와 일치하지 않습니다.
이 놀라운 기능은 예상했던 대로 작동합니다. 명령줄에 'MAKE' 변수가 포함되어 있으면 '-t', '-n' 및 '-q' 옵션이 적용되지 않습니다. 명령이 실행되지 않도록 하는 이러한 플래그와 관계없이 'MAKE' 변수를 포함하는 명령은 항상 실행됩니다. 일반적인 'MAKEFLAGS' 메커니즘은 이러한 플래그를 submake에 전달하여 인쇄 명령에 대한 요청이 하위 시스템에 전파되도록 합니다.
4.6.2.하위 make에 변수 전달
상위(최상위) make의 변수는 환경을 통해 명시적으로 하위 make에 전달될 수 있습니다. 하위 make에서 이러한 변수는 기본적으로 정의되지만 '-e' 옵션을 사용하지 않는 한 하위 makefile의 정의는 재정의되지 않습니다.
변수를 전달하거나 출력하려면 make가 명령을 실행할 때 환경 변수에 추가하고 환경 변수를 사용하여 변수 테이블을 초기화할 수 있습니다. 명시적으로 요청하지 않는 한, 초기 환경이나 명령줄에서 설정된 출력 변수만 만들고 변수 이름은 문자, 숫자, 밑줄로만 구성합니다. 일부 쉘은 다른 문자가 포함된 환경 변수를 처리할 수 없습니다.
특수변수 'SHELL', 'MAKEFLAGS'는 항상 출력됩니다. 'MAKEFILE' 변수에 값이 있으면 그 값도 출력됩니다. Make는 'MAKEFLAGS'를 통해 명령줄에 정의된 변수를 자동으로 출력합니다.
특정 변수를 내보내려면 'export' 명령을 사용하세요.
export VARIABLE...
변수를 내보내지 않으려면 'unexport' 명령을 사용하세요.

unexport VARIABLE.. .
편의를 위해 변수를 정의할 때 변수를 내보낼 수 있습니다.
export VARIABLE = value

VARIABLE = value
export VARIABLE
같은 효과가 있습니다.
모든 변수를 내보내려면 '내보내기' 명령 자체를 사용하면 됩니다.
'MAKELEVEL' 변수는 레벨별로 전달될 때 변경됩니다. 이 변수의 값은 중첩 레벨 수를 나타내는 문자열입니다. 최상위 레벨 'make'는 변수 값이 '0'입니다. 하위 make의 값은 '1'이고, 하위 make의 값은 '2'입니다.
'MAKELEVEL'의 목적은 조건부 지시어로 테스트하여 재귀적으로 실행될 때와 직접 실행될 때 다르게 동작하는 makefile을 작성하는 것입니다.
다음 내용은 GNU Make 매뉴얼에서 복사되었습니다
5. 명령줄 매개변수
`-b'
`-m'
이 옵션은 다른 버전과의 호환성을 위해 무시됩니다.
`make '. `-C DIR'
`--directory=DIR'
makefile을 읽기 전에 디렉토리 DIR로 변경합니다.
`-C' 옵션이 여러 개 지정된 경우 각각은 다음을 기준으로 해석됩니다.
이전 항목: `-C / -C etc'는 `-C /etc'와 동일합니다. 이는
일반적으로 `make'의 재귀 호출과 함께 사용됩니다(*참고
`make의 재귀 사용). ': Recursion .) `-d'
`--debug'
정상적인 처리 외에 디버깅 정보를 인쇄합니다.
디버깅 정보는 어떤 파일이
재작성 대상인지 알려줍니다. -시간이 비교되고
결과가 무엇인지, 어떤 파일을 실제로 다시 만들어야 하는지, 어떤 암시적
규칙이 고려되고 적용되는지 등 `make'가 무엇을 할지 결정하는 방법에 대한 모든 것이
흥미롭습니다. `-e '
`--environment-overrides'
makefile의 변수보다
환경에서 가져온 변수를 지정합니다. *환경 변수 참고:
Environment. 🎜>` --file=FILE'
`--makefile=FILE'
FILE이라는 파일을 makefile로 읽습니다. `-h'
`--help'
` make'가 이해한 다음 종료합니다.
`-i'
`--ignore-errors'
`-I DIR'
`- 파일을 다시 만들기 위해 실행된 명령의 모든 오류를 무시합니다. -include- dir=DIR'
포함된 makefile을 검색할 디렉터리 DIR을 지정합니다. 여러 `-I' 옵션을 사용하여
여러 디렉터리를 지정하면 디렉터리가
지정된 순서대로 검색됩니다. -j [ JOBS]'
`--jobs=[JOBS]'
동시에 실행할 작업(명령) 수를 지정합니다.
인수 없이 `make'는 동시에 많은 작업을 실행합니다.
가능합니다. `-j' 옵션이 두 개 이상 있으면 마지막 옵션이
효과적입니다.
`-k'
`--keep-going'
최대한 계속하세요. 오류가 발생하면
실패한 대상과 이에 의존하는 대상은 다시 만들 수 없지만
이 대상의 다른 종속성은 모두 동일하게 처리될 수 있습니다. `-- load-average[=LOAD]'
`--max-load[=LOAD]'
실행 중인 다른 작업이 있고
새 작업(명령)이 시작되지 않도록 지정합니다. 로드 평균은 LOAD(
부동 소수점 숫자) 이상입니다. 인수가 없으면 이전 로드
제한을 제거합니다. *참고 병렬 실행: 병렬. '
`--dry-run'
`--recon'
실행할 명령을 인쇄하되 실행하지는 마세요.
`-o FILE'
`-- old-file =FILE'
`--assume-old=FILE'
FILE 파일이 종속성보다 오래되었더라도
파일을 다시 만들지 말고
의 변경 사항으로 인해 아무것도 다시 만들지 마세요. 🎜>
파일은 기본적으로 매우 오래된 파일로 처리되며
`-p'
`--print-data-base'
데이터베이스를 인쇄합니다(규칙 및 변수 값)은
makefile을 읽은 다음 평소대로 실행하거나

`-v' 스위치에 의해 제공된 버전 정보를 인쇄합니다(아래 참조).
파일을 다시 만들려고 시도하지 않고 `make -p -f /dev/null'을 사용하세요. `-q'
`--question'
"질문 모드"를 실행하지 마세요. , 또는 무엇이든 인쇄하세요.
지정된 대상이 이미 최신이면
0인 종료 상태를 반환하고, 다시 작성해야 하는 경우에는 1을 반환하고,
오류가 발생하면 2를 반환합니다. '
`--내장 규칙 없음'
내장된 암시적 규칙의 사용을 제거합니다. 패턴 규칙을 작성하여
직접 정의할 수 있습니다. `-r' 옵션은 또한 접미사 규칙에 대한 접미사의 기본 목록
을 지웁니다. 그러나 여전히 `.SUFFIXES'에 대한
규칙을 사용하여 자신만의 접미사를 정의한 다음 자신만의 접미사 규칙을 정의할 수 있습니다. `-s'
`--silent'
`--quiet'
자동 작동; 명령이 실행될 때 인쇄하지 마세요.
`-S'
`--no-keep-going'
`--stop'
`-k' 옵션의 효과를 취소합니다. . 이것은 결코 필요하지 않습니다
`-k'가 `MAKEFLAGS'를 통해 최상위 레벨 `make'로부터 상속될 수 있는 재귀 `make'에서
또는 `MAKEFLAGS'에서 `-k'를 설정한 경우를 제외하고는 당신의
환경. `-t'
`--touch'
명령을 실행하는 대신 파일을 터치합니다(실제로 변경하지 않고 최신 상태로 표시)
. 이는
`make'의 향후 호출을 속이기 위해
명령이 완료된 것처럼 가장하는 데 사용됩니다. `-v'
`--version'
`make' 프로그램의 버전과 저작권, 저자 목록
및 보증이 없다는 알림을 인쇄합니다. 그런 다음 종료하세요.
`-w'
`--print-directory'
makefile을 실행하기 전과
실행한 후에 작업 디렉터리가 포함된 메시지를 인쇄합니다. 이는 반복적인 `make' 명령의 복잡하게 중첩된 오류를 추적
하는데 유용할 수 있습니다. `--no-print-directory'
`-w' 아래 작업 디렉토리 인쇄를 비활성화합니다. 이 옵션은
`-w'가 자동으로 켜져 있지만 추가 메시지를 보고 싶지 않은 경우
유용합니다. `-W FILE'
`--what-if=FILE'
`--new-file=FILE'
`--assume-new=FILE'
대상 FILE에 다음이 있다고 가정합니다. 방금 수정되었습니다.
`-n' 플래그와 함께 사용하면 해당 파일을 수정하면
어떤 일이 발생하는지 보여줍니다. `-n'이 없으면
`make'를 실행하기 전에 주어진 파일에 `touch' 명령을 실행하는 것과 거의 같습니다
수정 시간이 `의 상상에서만
변경된다는 점만 빼면 만들다'. `--warn-undefine-variables'
`make'가 정의되지 않은 변수에 대한 참조를
볼 때마다 경고 메시지를 발행합니다. 이는 변수를 복잡한 방식으로 사용하는
makefile을 디버깅할 때 도움이 될 수 있습니다. 6.参考
6.1.指令
`define VARIABLE'
`endef'
재귀적으로 확장되는 여러 줄의 변수를 정의합니다.

*참고 시퀀스::. `ifdef 변수'
`ifndef 변수'
`ifeq (A,B)'
`ifeq "A" "B"'
`ifeq 'A' 'B''
` ifneq (A,B)'
`ifneq "A" "B"'
`ifneq 'A' 'B''
`else'
`endif'
조건부 평가 일부 메이크파일. `include FILE'
다른 makefile을 포함합니다. `override VARIABLE = VALUE'
`override VARIABLE := VALUE'
`override VARIABLE += VALUE'
`override 정의 VARIABLE'
`endef'
변수를 정의하고 이전 항목을 재정의합니다.
명령줄에서
`export'
기본적으로 모든 변수를 하위 프로세스로 내보내도록 `make'에 지시합니다. `export VARIABLE'
`export VARIABLE = VALUE'
`export VARIABLE := VALUE'
`export VARIABLE += VALUE'
`unexport VARIABLE'
`make'에 여부를 알려줍니다. 특정 변수를 하위
프로세스로 내보내려면.
`vpath PATTERN PATH'
`%' 패턴과 일치하는 파일의 검색 경로를 지정합니다.
*참고 `vpath' 지시문: 선택적 검색. `vpath PATTERN'
이전에 PATTERN에 대해 지정한 모든 검색 경로를 제거합니다. `vpath'
이전에 `vpath'
지시어에 지정된 모든 검색 경로를 제거합니다.
6.2.函数
`$(subst FROM,TO,TEXT)'
FROM을 TO로 바꾸세요. 텍스트. `$(patsubst PATTERN,REPLACEMENT,TEXT)'
TEXT에서 PATTERN과 일치하는 단어를 REPLACEMENT로 바꿉니다. `$(strip STRING)'
STRING에서 초과된 공백 문자를 제거하세요. `$(findstring FIND,TEXT)'
TEXT에서 FIND를 찾습니다. `$(filter PATTERN...,TEXT)'
PATTERN 단어 중 하나와 일치하는 TEXT의 단어를 선택하세요. `$(filter-out PATTERN...,TEXT)'
TEXT에서 PATTERN 단어와 *일치하지* 않는 단어를 선택하세요. `$(sort LIST)'
LIST의 단어를 사전순으로 정렬하고 중복된 단어를 제거합니다. `$(dir NAMES...)'
각 파일 이름의 디렉터리 부분을 추출합니다. `$(notdir NAMES...)'
각 파일 이름에서 디렉터리가 아닌 부분을 추출합니다. `$(접미사 NAMES...)'

파일 이름의 접미사(마지막 `.' 및 다음 문자)를 추출합니다. `$(basename NAMES...)'
각 파일 이름의 기본 이름(접미사 없는 이름)을 추출합니다. `$(addsuffix SUFFIX,NAMES...)'
NAMES의 각 단어에 SUFFIX를 추가합니다. `$(addprefix PREFIX,NAMES...)'
NAMES의 각 단어 앞에 PREFIX를 추가합니다. `$(join LIST1,LIST2)'
두 개의 병렬 단어 목록을 결합합니다. `$(단어 N,TEXT)'
TEXT의 N번째 단어(one-origin)를 추출합니다. `$(words TEXT)'
TEXT의 단어 수를 셉니다. `$(첫 번째 단어 NAMES...)'
NAMES의 첫 번째 단어를 추출합니다. `$(와일드카드 패턴...)'
셸 파일 이름 패턴과 일치하는 파일 이름을 찾습니다(`%'
패턴 *아님*). `$(shell COMMAND)'
쉘 명령을 실행하고 출력을 반환합니다. `$(origin VARIABLE)'
`make' 변수 VARIABLE이 정의된 방법을 설명하는 문자열을
반환합니다. `$(foreach VAR,WORDS,TEXT)'
WORDS의 각 단어에 바인딩된 VAR을 사용하여 TEXT를 평가하고

결과를 연결합니다.
6.3.自动变weight
`$@'
대상의 파일 이름입니다. `$%'
대상이 아카이브 멤버인 경우 대상 멤버 이름입니다. `$<'
첫 번째 종속성의 이름입니다. `$?'
대상보다 새로운 모든 종속성의 이름
사이에 공백이 있습니다. 아카이브
멤버인 종속성의 경우 이름이 지정된 멤버만
사이에 공백이 포함되어 사용됩니다. 아카이브
멤버인 종속성의 경우 이름이 지정된 멤버만 사용됩니다.
`$^'
`$+'
모든 종속성의 이름(사이에 공백 포함).
아카이브 멤버인 종속성의 경우 이름이 지정된 멤버만
사용됩니다. `$^' 값은 중복
종속성을 생략하는 반면, `$+'는 이를 유지하고 순서를 유지합니다. `$*'
암시적 규칙이 `$(@D)'와 일치하는 어간
`$(@F)'
`$@의 디렉토리 부분 및 디렉토리 내 파일 부분 '. `$(*D)'
`$(*F)'
`$*'의 디렉토리 부분과 디렉토리 내 파일 부분. `$(%D)'
`$(%F)'
`$%' `$(`$(의 디렉토리 부분과 디렉토리 내 파일 부분 `$<'의 디렉토리 부분과 디렉토리 내 파일 부분 `$(^D)'
`$(^F)'
`$^' `$(+D)'
`$(+의 디렉토리 부분과 디렉토리 내 파일 부분 F)'
`$+' `$(?D)'
`$(?F)'
디렉토리 부분과 디렉토리 내 파일 부분 `$+' -`$?'의 디렉토리 부분
6.4.비凡变weight
`MAKEFILES'
`make'를 호출할 때마다 읽을 Makefile입니다. `VPATH'
현재 디렉토리에서 찾을 수 없는 파일에 대한 디렉토리 검색 경로입니다. `SHELL'
시스템 기본 명령 해석기의 이름, 일반적으로
`/bin/sh'. makefile에서 `SHELL'을 설정하여
명령 실행에 사용되는 쉘을 변경할 수 있습니다. 
`MAKE'
`make'가 호출된 이름입니다.
명령에서 이 변수를 사용하는 것은 특별한 의미를 갖습니다. `MAKELEVEL'
재귀 수준(하위 `make's) 수입니다. `MAKEFLAGS'
`make'에 부여되는 플래그입니다. 이를 환경이나
메이크파일에서 설정하여 플래그를 설정할 수 있습니다. `SUFFIXES'
`make'가 makefile을 읽기 전의 기본 접미사 목록입니다. 

以上就是makefile规则的内容,更多敵关文章请关注PHP中文网(www.php.cn)!


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿