makefile 튜토리얼
makefile 시작하기
수색…
비고
makefile 은 make
프로그램의 작동을 제어하는 텍스트 파일입니다. make
프로그램은 일반적으로 소스 파일에서 프로그램 작성을 관리하는 데 사용되지만 일반적으로 다른 파일 (또는 전제 조건 )이 수정 된 후 파일 (또는 대상 )을 다시 생성해야하는 모든 프로세스를 처리하는 데 사용될 수 있습니다. makefile 은 대상과 전제 조건 간의 관계를 설명하고 하나 이상의 전제 조건이 변경되었을 때 대상을 최신 상태로 만드는 데 필요한 명령을 지정합니다. make
"out of date" make
결정하는 유일한 방법은 대상 파일과 해당 전제 조건의 수정 시간을 비교하는 것입니다.
Makefile은 처음에는 혼란 스러울 수있는 몇 가지 방식으로 다소 독특합니다.
첫째, 메이크 파일은 동일한 파일에서 완전히 다른 두 가지 프로그래밍 언어로 구성됩니다. 파일의 대부분은 언어로 작성 make
이해할 수 :이 변수 지정 및 확장, (등 다른 파일, 파일의 섹션의 조건 구문 분석, 포함) 일부 전처리 기능뿐만 아니라 목표의 정의 및 제공 자신의 전제 조건. 또한 각 대상에는 해당 대상을 최신 상태로 만들기 위해 호출해야하는 명령을 지정하는 것과 관련된 래서 피 (recipe) 가있을 수 있습니다. 레서피는 쉘 스크립트 (기본적으로 POSIX sh)로 작성됩니다. make
프로그램은이 스크립트를 구문 분석하지 않습니다. 쉘을 실행하고 스크립트를 쉘에 전달하여 실행할 것입니다. recipes가 make
에 의해 파싱되지 않고 별도의 쉘 프로세스에 의해 처리된다는 사실은 메이크 파일을 이해하는데있어 핵심입니다.
둘째, makefile은 스크립트와 같은 절차 적 언어가 아닙니다. make
는 makefile make
구문 분석하기 때문에 대상이 그래프의 노드이고 필수 조건 관계가 가장자리 인 내부 그래프를 구성합니다. 모든 메이크가 완전히 구문 분석 된 후에 만 그래프는 것이다 완료 make
하나 개의 노드 (대상)을 선택하고 최신으로 가져 시도합니다. 대상이 최신 상태인지 확인하려면 먼저 해당 대상의 전제 조건이 최신인지 재귀 적으로 확인해야합니다.
버전
이름 | 또한 ~으로 알려진 | 초기 버전 | 번역 | 출시일 |
---|---|---|---|---|
POSIX make | 1992 년 | IEEE Std 1003.1-2008, 2016 Edition | 2016-09-30 | |
NetBSD make | 낳다 | 1988 년 | 20160926 | 2016-09-26 |
GNU make | 쥐어 짜다 | 1988 년 | 4.2.1 | 2016-06-10 |
SunPro make | dmake | 2006 년 | 2015-07-13 | |
MSVS nmake | 2003 년 | 2015p3 | 2016-06-27 |
기본 Makefile
"안녕하세요 세상을 쓰는 것을 고려하십시오!" c. 프로그램. 우리의 소스 코드가 source.c라는 파일에 있다고 가정하자. 우리 프로그램을 컴파일하기 위해 필요하다. 보통 리눅스에서 gcc를 사용하여 컴파일해야한다. $> gcc source.c -o output
여기서 output 생성 될 실행 파일의 이름입니다. 기본 프로그램의 경우이 방법이 잘 작동하지만 프로그램이 복잡 해짐에 따라 컴파일 명령이 더욱 복잡해질 수 있습니다. 이것은 Makefile 이 들어오는 곳입니다. makefile을 사용하면 프로그램을 컴파일하는 방법에 대한 상당히 복잡한 규칙 집합을 작성한 다음 명령 줄에 make를 입력하여 간단하게 컴파일 할 수 있습니다. 예를 들어 위의 hello wold 예제에 대한 Makefile 예제가 있습니다.
기본 Makefile
기본 Makefile을하고 Makefile의 이름이 우리의 소스 코드와 동일한 디렉토리에 우리의 시스템에 저장 할 수 있습니다. 이 파일의 이름은 Makefile이어야하지만 M은 선택 사항입니다. 그것은 국회 의사당을 사용하는 것이 상대적으로 표준이라고 말했다.
output: source.c
gcc source.c -o output
두 번째 줄에는 gcc 명령 앞에 정확히 하나의 탭이 있습니다 (이것은 메이크 파일에서 중요합니다). 이 Makefile이 사용자가 make를 타이핑 할 때마다 (makefile과 같은 디렉토리에) make는 source.c가 수정되었는지 (타임 스탬프를 확인하는지) 확인한다. 다음 행의 컴파일 규칙.
Makefile의 변수들
프로젝트에 따라 파일을 만드는 데 몇 가지 변수를 추가 할 수 있습니다. 다음은 변수가있는 예제 Makefile입니다.
CFLAGS = -g -Wall
output: source.c
gcc $< $(CFLAGS) -o $@
이제 여기서 일어난 일을 탐색 할 수 있습니다. 첫 번째 줄에서는 CFLAGS라는 변수를 선언했다.이 변수는 컴파일러에 전달할 수있는 몇 가지 공통 플래그를 포함하고 있으며,이 변수에 원하는만큼의 플래그를 저장할 수있다. 그런 다음 make가 출력을 최근에 변경되었는지 여부를 확인하기 위해 source.c를 확인하기 전에 make가 컴파일 규칙을 실행하는지 확인하기 전에 같은 줄을 사용합니다. 컴파일 규칙은 이전과 거의 동일하지만 변수를 사용하여 단축되었습니다. $<
변수는 make에 내장되어 있습니다 (자동 변수는 https://www.gnu.org/software/make/manual/을 참조 하십시오). html_node / Automatic-Variables.html )이 소스는 항상 소스를 나타내며이 경우 source.c 입니다. $(CFLAGS)
는 앞에서 정의한 변수이지만이 $(someVariable)
과 같이 앞쪽에 $가있는 괄호 안에 변수를 넣어야한다는 점에 유의하십시오. 이것은 Make가 변수를 이전에 입력 한 것으로 확장하도록 알려주는 구문입니다. 마지막으로 우리는 $ @ 기호를 가지고 있습니다. 다시 한번 이것은 make에 내장 된 변수이며, 컴파일 단계의 목표를 나타냅니다.이 경우 출력을 나타냅니다.
깨끗한
Make clean은 make 파일에 대해 배울 수있는 또 다른 유용한 개념입니다. 위에서 Makefile 수정 가능
CFLAGS = -g -Wall
TARGETS = output
output: source.c
gcc $< $(CFLAGS) -o $@
clean:
rm $(TARGETS)
보시다시피, Makefile에 규칙을 하나 추가하고 모든 대상을 포함하는 변수를 추가했습니다. 이것은 makefiles에 가지고있는 다소 일반적인 규칙이다. $> make clean
을 타이프하면 생성 한 모든 바이너리를 빠르게 제거 할 수 있기 때문이다. make clean을 입력하면 make 프로그램에게 clean 규칙을 실행하도록 지시 한 다음 make를 실행하여 rm 명령을 실행하여 모든 대상을 삭제합니다.
make를 사용하는 방법에 대한 간략한 개요가 여러분의 워크 플로우 속도를 높이는 데 도움이되기를 바랍니다. Makefile 은 매우 복잡해 질 수 있지만 이러한 아이디어를 사용하면 make를 사용하고 다른 프로그래머의 Makefile 에서 어떤 일이 벌어지고 있는지 더 잘 이해할 수 있어야합니다. 훌륭한 리소스를 만드는 방법에 대한 자세한 내용은 https://www.gnu.org/software/make/manual/을 참조하십시오 .
규칙 정의
빠른 시작
규칙은 특정 파일 (규칙의 대상 )이 작성되는시기와 방법을 설명합니다. 또한 생성에 필요한 파일 (대상의 전제 조건 ) 중 하나가 대상보다 새로운 경우 대상 파일을 업데이트 할 수도 있습니다.
규칙은 다음 구문을 따릅니다. (규칙 다음의 명령 은 탭 으로 들여 쓰기됩니다)
targets: prerequisites
<commands>
대상 및 전제 조건 이 파일 이름이거나 특수 예약 된 이름 및 명령 (있는 경우)은 쉘에 의해 실행되어 유효하지 않은 대상 을 빌드 / 다시 빌드합니다.
규칙을 실행하기 위해 Makefile이 있는 디렉토리와 같은 터미널에서 make
명령을 간단하게 실행할 수 있습니다. 타겟을 지정하지 않고 make
를 실행하면 Makefile에 정의 된 첫 번째 규칙이 실행됩니다. 규약에 따라 Makefile 의 첫 번째 규칙은 all 또는 default 라고도하며 일반적으로 모든 유효한 빌드 대상을 선행 조건으로 나열합니다.
make
는 대상이 오래된 경우 즉, 존재하지 않거나 수정 시간이 사전 요구 사항보다 오래된 경우에만 규칙을 실행합니다. 전제 조건 목록이 비어있는 경우, 규칙은 대상을 빌드하기 위해 처음 호출 될 때만 실행됩니다. 그러나 규칙이 파일을 만들지 않고 대상이 더미 변수 인 경우 규칙이 항상 실행됩니다.
패턴 규칙
패턴 규칙은 여러 대상을 지정하고 대상 이름에서 필수 조건 이름을 구성하는 데 사용됩니다. 각 대상이 자체 전제 조건을 가질 수 있으므로 일반 규칙과 비교하여 더 일반적이고 강력합니다. 패턴 규칙에서 대상과 전제 조건 간의 관계는 경로 이름과 접미사 또는 둘 다를 포함하여 접두사를 기반으로 작성됩니다.
C 스크립트, foo.c
및 bar.c
를 각각 컴파일하여 대상 foo.o
및 bar.o
를 작성한다고 가정하십시오. 이것은 아래의 일반적인 규칙을 사용하여 수행 할 수 있습니다.
foo.o: foo.c
cc -c $< -o $@
bar.o: bar.c
cc -c $< -o $@
여기서 자동 변수 $<
는 첫 번째 전제 조건의 이름이고 $@
는 목표 이름입니다 (자동 변수의 전체 목록은 여기 에서 찾을 수 있습니다 ).
그러나 대상이 동일한 접미어를 공유하므로 위의 두 규칙을 이제 다음 패턴 규칙으로 대체 할 수 있습니다.
%.o: %.c
cc -c $< -o $@
암시 적 규칙
암시 적 규칙을 알 make
자주 사용되는 대상 파일의 특정 유형을 구축하는 통상적 인 방법을 사용하는 방법에 대해 설명합니다. make
는 목표 파일 이름을 사용하여 호출 할 암시 적 규칙을 판별합니다.
이전 섹션에서 보았던 패턴 규칙 예제는 make
가 C 컴파일을위한 암시 적 규칙을 가지고 있기 make
Makefile 에서 실제로 선언 할 필요는 없습니다. 따라서 다음 규칙에서 foo.o
및 bar.o
의 전제 조건은 foo
를 빌드하기 전에 C 컴파일에 대한 암시 적 규칙을 사용하여 빌드됩니다.
foo : foo.o bar.o
cc -o foo foo.o bar.o $(CFLAGS) $(LDFLAGS)
묵시적인 규칙들과 그것들에 의해 사용 된 변수들의 목록은 여기 에서 찾을 수 있습니다 .
파일을 gzip하기위한 일반 규칙
디렉토리에 2 개의 파일이있는 경우 :
$ ls
makefile
example.txt
makefile
에는 다음 텍스트가 들어 있습니다.
%.gz: %
gzip $<
쉘에서 타이핑하면 example.txt.gz
를 얻을 수있다.
$ make -f makefile example.txt.gz
메이크 파일은 같은 이름 만에 .gz 접미사를 가진 파일이있는 경우 이름이 종료 된 .gz을 가진 파일을 만드는 방법을 만들어 지시 할 단 하나의 규칙으로 구성되어 있습니다.
makefile Hello World
C : \ makefile :
helloWorld :
[TAB]echo hello world
결과를 실행하십시오 :
C:\>make
echo hello world
hello world
참고 : [TAB]은 실제 탭으로 대체해야하고, stackoverflow는 탭을 공백으로 대체하고 공백은 메이크 파일의 탭과 동일하게 사용되지 않습니다.