5. Makefile Rules
Program Lang./Makefile 2013. 5. 13. 08:051. Rule의 종류
- Explicit Rules
- Rule의 구성에 생략되는 부분이 없으며, 각 대상을 명확하게 지정한다. 참 애매하긴 하지만
앞에서 살펴본 것처럼 일반적으로 wildcard나 내부 변수를 사용하지 않는 경우이다.
- Pattern Rules
- 명확하게 Target이나 Prerequisite에 대한 파일이름 대신에 Wildcard를 사용한 어떤 패턴 형태이다.
위의 Explicit Rule과 반대되는 경우라고 보면 된다.
- Implicit Rules
- Pattern Rule이나 Suffix Rule이긴 하나 make 내부변수나 database를 이용하여 정의한 Rule이다.
Suffix Rule은 파일의 상관관계를 이용하여 자동으로 의존관계를 확장하는 Rule로 Pattern Rules
이 나오기 전에 많이 사용하던 방식이다.
- Static Pattern Rules
- Target 파일에 대한 리스트가 한정적으로 지정되어 있을 경우에 해당한다.
Rule을 위에서처럼 나누기는 했지만 makefile에서 Rule은 일반적으로 위의 Rule이 섞어있는 구조가
대부분이다. 앞으로 Explicit Rule 중심으로 살펴보면서 Target과 Prerequisite을 어떻게 다른 Rule로
확장해 가는지 보는 것이 이해가 빠를 것으로 보인다.
2. Suffix Rule
Implicit Rule을 정의하는 구형 방식이다. 하지만 여전히 많은 makefile에서 사용되므로 간단히 소개한다.
GNU makefile에서 Suffix Rule을 Pattern Rule로 대체되었다.
이름에서 유추되듯이 파일 확장자 규칙을 이용하여 Rule을 확장함을 알 수 있다.
$(COMPILE.c) $(OUTPUT_OPTION) $<
Pattern Rule로 위의 Suffix Rule을 다시 쓰면 아래와 같다. 다만 Target과 Prerequisite를 선언하는 방식이 다르다.
%.o : %.c
$(COMPILE.c) $(OUTPUT_OPTION) $<
위의 예제는 double suffix rule에 해당하고 single-suffix rule은 일반적으로 실행파일을 생성시 사용한다.
.p :
$(LINK.p) $^ $(LOADLIBES) $(LDLIBS) -o $@
동일한 Pattern Rule은 아래와 같다.
%: %.p
$(LINK.p) $^ $(LOADLIBES) $(LDLIBS) -o $@
Suffix Rule은 일반적으로 알려진 파일 확장자 규칙을 사용한다. 파일 확장자 규칙에 등록은 .SUFFIXES 지정자를
통해서 이루어지고 이를 수정하면 자신에 맞는 구성을 할 수 있다.
.SUFFIXES : # make --no-builtin-rules (or -r)와 동일 : 확장자가 등록 해제
3. Implicit Rules
Implicit Rule은 built-in pattern rule이다. 즉 make에서 지원하는 rule 확장 규칙이다.
implicit rule을 사용하고자 하면 command 부분을 생략하면 된다. make가 target에 가장 적합한 rule을 찾아서 빌드한다.
make에서 지원하는 built-in pattern rule은 아래와 같은 명령어로 확인할 수 있다.
impilicit rule을 사용 시에는 Target이 원하는 rule에 의해서 빌드되도록 주의를 기울여야 한다.
또한 implicit rule에 적용된 변수들을 제정의할 때도 주의를 기울여야 한다.
CC = gcc
OUTPUT_OPTION = -o $@
위 implicit rule에 정의된 CFLAGS 변수에 대한 내용을 잘못 수정하면 원하는 동작을 할 수 없을 수 있으니
주의를 기울여야 한다.
아래 예제는 1장에서 다루었던 기본 Makefile 구조를 내부 확장 규칙을 사용하는 Implicit Rule로 바꾼 것이다.
Target 인 all 밑에 아무 command가 존재하지 않는데 소스파일에서 오브젝트 파일이 생성된다.
내부 확장 규칙을 사용하여 빌드가 된 것이다. 내부 매크로인 subst와 자동 확장 변수는 다음에 소개된 장을
참조하고 여기서는 주의를 기울일 필요없다.
#***********************************************************************# # ---------------------------------------------------------------------- # Copyright(c) 2012-2013 by hee-soon kim # # All rights are reserved # # ----------------------------------------------------------------------# # # FILE NAME : Makefile # VERSION : 1.0 # AUTHOR : heesoon,kim(김희순), chipmaker.tistory.com) # DATE : 2012/12/21 # #***********************************************************************# sources = sources += bar.c foo.c main.c objects = $(subst .c,.o,$(sources)) all : $(objects) exec exec : $(objects) # gcc -o exec $(objects) gcc -o exec $^ # Using Automatic Expanded Variable clean : rm -rf *.o *.exe
4. Pattern Rules
아래의 예제는 위의 Impilicit Rule Makefile에서 소스를 오브젝트로 빌드하는 내부 규칙 대신에
새로운 Pattern을 적용하였다. Pattern Rule을 어떻게 사용하는지 확인할 수 있다.
#***********************************************************************# # ---------------------------------------------------------------------- # Copyright(c) 2012-2013 by hee-soon kim # # All rights are reserved # # ----------------------------------------------------------------------# # # FILE NAME : Makefile # VERSION : 1.0 # AUTHOR : heesoon,kim(김희순), chipmaker.tistory.com) # DATE : 2012/12/21 # #***********************************************************************# sources = sources += bar.c foo.c main.c objects = $(subst .c,.o,$(sources)) all : $(objects) exec exec : $(objects) # gcc -o exec $(objects) gcc -o exec $^ # Using Automatic Expanded Variable clean : rm -rf *.o *.exe %.o : %.c echo "Starting Pattern Rules ..." @test $(dir $@) || mkdir -p $(dir $@) # $(CC) -MMD -MF $*.d $(CFLAGS) -o $@ -c $< $(CC) $(CFLAGS) -o $@ -c $<
'Program Lang. > Makefile' 카테고리의 다른 글
8. static, shared library makefile (0) | 2013.05.18 |
---|---|
6. source와 object 분리 (0) | 2013.05.13 |
1. basic makefile structure syntax (0) | 2013.05.11 |
3. VPATH(vpath), conditional and include 지시자 (0) | 2013.05.09 |
4. variable and macros (0) | 2013.05.09 |