Download presentation
Presentation is loading. Please wait.
1
작 성 자: 김선영 메 일: sunyzero (at) gmail (dot) com 버 전: 1.30
GNU make -part 1/2- Copyright by SunYoung Kim 작 성 자: 김선영 메 일: sunyzero (at) gmail (dot) com 버 전: 1.30
2
define directives macro definition with define directives what's
define MACRO_NAME values... endef define PRINT_ELEMENTS @echo "TARGET = @echo "PREREQUISITES = $(^)" endef %.o: %.c $(PRINT_ELEMENTS) $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o what's differents? PRINT_ELEMENTS "TARGET "PREREQUISITES = $(^)" %.o: %.c $(PRINT_ELEMENTS) $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o
3
define directives It can be similar to user defined function
OUT := fork_test regex_test define COMPILE_DEBUG @echo "[$(0)] $(1) --> $(2)" $(CC) $(CFLAGS) -DDEBUG_MODES=1 -c $(1) -o $(2) endef all: $(OUT) fork_test.o: fork_test.c $(call $ make [COMPILE_DEBUG] fork_test.c --> fork_test.o cc -DDEBUG_MODES=1 -c fork_test.c -o fork_test.o cc fork_test.o -o fork_test cc regex_test.c -o regex_test
4
file names functions $(dir NAMES...) $(notdir NAMES...)
DIR_SRCS = $(dir main.c ex_data.c modules/my_mod.c) # DIR_SRCS contains “./ ./ ./modules” DIR_SRCS = $(sort $(dir main.c ex_data.c modules/my_mod.c)) # DIR_SRCS contains “./ ./modules” (removing duplicate words) FILE_SRCS = $(notdir main.c ex_data.c modules/my_mod.c) # FILE_SRCS contains “main.c ex_data.c my_mod.c”
5
file names functions (con’t)
$(suffix NAMES...) NAMES 에 해당하는 경로에서 확장자만 추출한다. $(wildcard PATTERN) PATTERN과 매칭되는 파일명을 지정한다. SUFFIX_SRCS = $(dir main.c README) # SUFFIX_SRCS contains “.c README” SRCS = $(wildcard *.c) OBJS = $(wildcard *.o) # SRCS indicates all *.c, OBJS indicates all *.o
6
file names functions (con't)
$(addprefix PREFIX,TEXT ...) TEXT 에 접두어를 추가한다. $(addsuffix SUFFIX,TEXT ...) TEXT 에 접미사를 추가한다. SRCS = aa.c bb.c SRCS2 = $(addprefix .obj/, $(SRCS)) # SRCS2 is ".obj/aa.c .obj/bb.c" OUT = aa bb SRCS = $(addsuffix .c, $(OUT)) # SRCS is "aa.c bb.c"
7
file names functions (con't)
$(basename NAMES ...) NAMES 경로에서 확장자만 제거한다. SRCS = aa.c bb.c module/abc.c SRCS2 = $(basename $(SRCS)) # SRCS2 is "aa bb module/abc"
8
executives function $(shell COMMAND) $(call VAR,PARAM,PARAM,...)
VAR 에 PARAM 인수를 이용해서 매크로를 호출합니다. (define directives 참조) CURRENT_DIR = $(shell pwd)
9
executives function (con't)
$(eval TEXT) TEXT 문자열을 해석하여 명령어로 실행한다. UNAME_STRING := $(shell /bin/uname -a) MY_VAR := UNAME_STRING2 all: @echo "(shell) -> $(UNAME_STRING)" $(eval $(MY_VAR) := $(UNAME_STRING)) @echo "(eval) -> $(UNAME_STRING2)" $$(UNAME_STRING) $ make (shell) -> Linux pmlab.ssu.ac.kr _FC4 #1 Sun Nov 27 03:25:11 EST 2005 i686 athlon i386 GNU/Linux (eval) -> Linux pmlab.ssu.ac.kr _FC4
10
executives function (con't)
$(foreach VAR, LIST, TEXT) VAR : TEXT 에서 사용할 변수명 LIST : LIST 의 항목이 한개씩 VAR 에 지정되어진다. TEXT 는 실행할 명령으로서 VAR에서 사용된 변수를 가진다. dirs := module lib main files := $(foreach dir,$(dirs),$(wildcard $(dir)/*.c)) # expand directories from the list “dirs”. # That is “files” contains “module/*.c lib/*.c main/*.c”
11
text functions $(subst FROM, TO, TEXT)
문자열 교체 $(subst foo,bar,what is foo) 는 what is bar 와 동일 $(patsubst PATTERN, REPLACEMENT, TEXT) 문자열을 패턴으로 검색하여 교체 $(patsubst %.c,%.o,$(SRCS)) 는 $(SRCS) 의 접미사를 모두 .o 로 바꿈 OBJS = $(patsubst %.c,%.o,$(SRCS))
12
text functions (con't) $(findstring FIND,IN) $(sort LIST)
IN 에서 FIND 에 해당하는 문자열을 찾음, 실패하면 NULL 리턴 $(findstring aix,$(SERVER_STRING)) $(sort LIST) 알파벳 순으로 정렬 (중복 문자 발견시 제거한다) $(strip STRING) STRING 에 해당하는 앞뒤의 복수개의 공백 제거 $(strip a b c) 는 a b c 로 조작됨
13
text functions (con't) $(filter PATTERN..., TEXT)
TEXT 에서 PATTERN 에 해당하는 부분만 걸러냄 여러 타입의 파일형이 섞여있는 곳에서 유용함 $(filter-out PATTERN..., TEXT) TEXT 에서 PATTERN 에 매치되지 않은 부분만 걸러냄 FULL_SRCS = a.c b.c c.s a.h b.h lang.mo SRCS = $(filter %.c %.s, $(FULL_SRCS)) FULL_SRCS = main.c sdata.c common.c main.h common.h COMMON_SRCS = common.c common.h MAIN_SRCS = $(filter-out $(COMMON_SRCS), $(FULL_SRCS))
14
control functions $(warning TEXT) $(error TEXT) TEXT 메시지를 화면에 출력한다.
15
conditionals 특정 조건에 맞춰서 make 구문의 블럭 실행
주로 OS 나 환경에 의해서 선택적인 make 를 실행할때 사용함 COMMAND 가 아니므로 라인의 첫부분에 위치해야 함 ifeq, ifneq, ifdef, ifndef, else, endif 등의 예약어 사용 단, IF-ELSE-ENDIF 의 경우에는 단 한개의 else 만 사용가능 ifeq $(ARG1,ARG2) ifeq 'ARG1' 'ARG2' ifeq "ARG1" "ARG2" ifeq $($(CC),gcc) $(CC) .... else endif
16
dependancy Generating prerequisites automatically
modern C compiler 는 –M 옵션 지원함 : makefile 의존관계 자동 생성 옵션 .c 소스를 분석하여 의존성이 있는 소스/헤더를 makefile 규칙으로 만들어줌 .h 만 갱신되도 의존관계에 의해서 .o 를 갱신하고, 당연히 바이너리도 갱신됨 redirection 을 이용하여 makefile 뒤에 추가 혹은 dep.mk 로 만들고 맨뒤에 include 문으로 추가하기도 함 cc –M <c source file> $ cc –M mng_io.c mng_io.o: mng_io.c /usr/include/unistd.h /usr/include/features.h \ /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \ ... (생략) ... dep: $(CC) $(CPPFLAGS) -M $(SRCS) > dep.mk
17
dependancy (con't) include dependency DEPENDENCY = dep.mk all: ... ...
$(CC) $(CPPFLAGS) -M $(wildcard *.c) > $(DEPENDENCY) ifeq "$(DEPENDENCY)" "$(findstring $(DEPENDENCY),$(wildcard *.mk))" include $(DEPENDENCY) else $(warning "[ Can't find dependency file: $(DEPENDENCY) ]") endif
18
dependancy (con't) gccmakedep : X11R6 의 파생물
GNU 환경에서는 gccmakedep 를 지원한다. (자동으로 makefile 갱신) DO NOT DELETE 부분이하가 gccmakedep 가 생성한 부분 (再명령시 자동 갱신) dep: gccmakedep -- $(CPPFLAGS) -- $(SRCS) $ make dep $ cat Makefile ... 생략 ... # DO NOT DELETE io_epoll_pthread.o: io_epoll_pthread.c /usr/include/stdio.h \ /usr/include/features.h /usr/include/sys/cdefs.h \ /usr/include/bits/ipc.h /usr/include/sys/msg.h \ ../../../include/io_macro.h ../../../include/io_epoll_pthread.h \
19
static pattern rule pattern 을 적용하여 복수개의 target 을 지정 syntax
REGEX 의 의미 확장을 사용한다. Implicit rule 안에서 몇몇 타켓을 특별하게 다른 rule을 적용하도록 해준다. syntax TARGETS 는 와일드카드를 포함할 수 있다. TARGET-PATTERN 은 뒤에 나오는 각각의 PREREQUISITE-PATTERNS에 대해서 적용할 패턴을 기술한다. 이 패턴에 의해서 만들어지는 TARGETS 의 일부는 stem 이라고 부른다. TARGETS ...: TARGET-PATTERN: PREREQUISITE-PATTERNS ... COMMAND ...
20
static pattern rule (con't)
objects = foo.o bar.o all: $(objects) $(objects): %.o: %.c $(CC) -c $(CFLAGS) $< -o OUT = pthread_rwlock \ pthread_spinlock OUT2 = pthread_rwlock_pshared \ pthread_spinlock_pshared .SUFFIXES: .o .c.o .h .PHONY: all clean all: $(OUT) $(OUT2) # 뒤에 계속
21
static pattern rule (con't)
OBJ_OUT2 = $(addsuffix .o, $(OUT2)) $(OBJ_OUT2): %_pshared.o: %.c $(CC) -c -DUSE_PSHARED $(CFLAGS) $< -o $ make gcc -I../include pthread_rwlock.c -L../lib -lpthread -o pthread_rwlock gcc -I../include pthread_spinlock.c -L../lib -lpthread -o pthread_spinlock gcc -c -DUSE_PSHARED -I../include pthread_mutex.c -o pthread_mutex_pshared.o gcc pthread_mutex_pshared.o -L../lib -lpthread -o pthread_mutex_pshared gcc -c -DUSE_PSHARED -I../include pthread_rwlock.c -o pthread_rwlock_pshared.o gcc pthread_rwlock_pshared.o -L../lib -lpthread -o pthread_rwlock_pshared gcc -c -DUSE_PSHARED -I../include pthread_spinlock.c -o pthread_spinlock_pshared.o gcc pthread_spinlock_pshared.o -L../lib -lpthread -o pthread_spinlock_pshared
22
example OUT = io_poll_pthread io_epoll_pthread CC = gcc
CPPFLAGS = -I../include CFLAGS = -Wall –g LOADLIBES = -L$(PREFIX_DIR)/lib LDLIBS = -lrt –lpthread COMMON_OBJ = mng_thread.o mng_io.o OBJS = poll_main.o OBJS = epoll_main.o OBJS = $(COMMON_OBJ) $(OBJS1) $(OBJS2) SRCS = $(patsubst %.o,%.c, $(OBJS)) .SUFFIXES: .c .c.o .o .h .PHONY: all clean dep
23
example (con't) gccmakedep -- $(CPPFLAGS) -- $(SRCS) all: $(OUT)
io_poll_pthread: $(OBJS1) $(COMMON_OBJ) $(CC) $(LDFLAGS) $^ $(LOADLIBES) $(LDLIBS) –o io_epoll_pthread: $(OBJS2) $(COMMON_OBJ) clean: @rm –f *.o $(OUT) dep: $(SRCS) gccmakedep -- $(CPPFLAGS) -- $(SRCS) # End of Makefile
24
test makefile make –p make 가 해석한 makefile 의 결과를 보여줌 (테스트에 앞서서 구문해석을 검증) ...(생략)... # makefile (from `Makefile', line 34) CPPFLAGS = %.c: %: %.c # commands to execute (built-in): $(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o %.o: %.c $(COMPILE.c) $(OUTPUT_OPTION) $<
25
make command options make [-einpqrst][-f makefile]...[ -k| -S][macro=value]... [target_name...] -e 환경변수를 가져올 때 override 시킵니다. LANG = en all: @echo "Environment variable LANG=$(LANG)" $ make Environment variable LANG=en $ make -e Environment variable LANG=ko_KR.UTF-8
26
make command options (con't)
-f <filename> make 임의의 파일명으로 makefile 을 대체하여 읽게 합니다. -i make 가 수행하는 모든 명령의 리턴값을 무시합니다. 따라서 에러가 발생해도 계속 진행합니다. 이 모드는 필요조건을 명시하지 않은 .IGNORE 설정과 동일합니다. (몇몇 make 의 버전에는 .IGNORE가 제대로 작동하지 않는 경우가 있습니다) $ make -f alternative.mk ...
27
make command options (con't)
타겟을 최신의 것으로 갱신하는 도중 에러가 발생 하였을때, 의존성이 없는 서로 다른 타겟은 계속 갱신하도록 합니다. 에러가 발생한 경우에 make 종료 후 메시지를 출력합니다. -n make 가 실행할 명령어를 출력만 하고 실행하지 않습니다. (테스트 목적) 단, 명령행 앞에 "+" 접두어가 붙어있는 경우는 강제 실행됩니다. -p 표준출력으로 make 가 해석한 심볼 변수정의, 규칙, 타겟리스트를 출력합니다. 단, 표준안에서는 출력물의 형태는 강제하지 않았으므로 각 벤더들의 make 출력결과 다를 수 있습니다.
28
make command options (con't)
-q 타겟을 테스트하는데 사용됨 타겟이 최신의 것이라면 '0' 을 리턴, 그렇지 않으면 '1'을 리턴합니다. -r suffix rule 검색을 위한 접미어 탐색 리스트(.SUFFIXES)를 사용하지 않습니다. 이는 .SUFFIXES 에 아무것도 지정하지 않은 경우와 동일합니다. -S 타겟을 갱신하는 도중에 에러가 발생하면, make 를 중지합니다. 이 옵션은 기본으로 켜져있으므로 지정할 필요는 없습니다. -k 옵션과 반대의 기능을 합니다. (따라서 같이 지정될 수 없습니다)
29
make command options (con't)
silent mode 로 작동합니다. 표준출력으로 명령어를 출력하지 않습니다. .SILENT 특수 타겟에 필요조건을 설정하지 않은 경우와 동일하게 작동합니다. -t 생성되지 않은 타겟에 대해 touch 명령을 실행합니다. 이 모드는 make 가 무엇을 만들지 미리 테스트해보는 용도로 사용됩니다. 단, 명령어 앞에 "+" 접두어가 붙은 경우는 강제 실행됩니다.
Similar presentations