GNU make part 12 Copyright by Sun Young
GNU make -part 1/2 Copyright by Sun. Young Kim 작 성 자: 김선영 메 com 일: sunyzero (at) gmail (dot) 버 전: 1. 30
define directives v macro definition with define directives define MACRO_NAME values. . . endef define PRINT_ELEMENTS @echo "TARGET = $(@)" @echo "PREREQUISITES = $(^)" endef %. o: %. c $(PRINT_ELEMENTS) what's differents? $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@ PRINT_ELEMENTS : = @echo "TARGET = $(@)"; @echo "PREREQUISITES = $(^)" %. o: %. c $(PRINT_ELEMENTS) $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@ Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
define directives v 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 COMPILE_DEBUG, $<, $@) $ make [COMPILE_DEBUG] fork_test. c --> fork_test. o cc cc cc -DDEBUG_MODES=1 -c fork_test. c -o fork_test. o -o fork_test regex_test. c -o regex_test Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
file names functions v $(dir NAMES. . . ) § 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) v $(notdir NAMES. . . ) § NAMES 에 해당하는 경로에서 파일명만 추출한다. FILE_SRCS = $(notdir main. c ex_data. c modules/my_mod. c) # FILE_SRCS contains “main. c ex_data. c my_mod. c” Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
file names functions (con’t) v $(suffix NAMES. . . ) § NAMES 에 해당하는 경로에서 확장자만 추출한다. SUFFIX_SRCS = $(dir main. c README) # SUFFIX_SRCS contains “. c README” v $(wildcard PATTERN) § PATTERN과 매칭되는 파일명을 지정한다. SRCS = $(wildcard *. c) OBJS = $(wildcard *. o) # SRCS indicates all *. c, OBJS indicates all *. o Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
file names functions (con't) v $(addprefix PREFIX, TEXT. . . ) § TEXT 에 접두어를 추가한다. SRCS = aa. c bb. c SRCS 2 = $(addprefix. obj/, $(SRCS)) # SRCS 2 is ". obj/aa. c. obj/bb. c" v $(addsuffix SUFFIX, TEXT. . . ) § TEXT 에 접미사를 추가한다. OUT = aa bb SRCS = $(addsuffix. c, $(OUT)) # SRCS is "aa. c bb. c" Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
file names functions (con't) v $(basename NAMES. . . ) § NAMES 경로에서 확장자만 제거한다. SRCS = aa. c bb. c module/abc. c SRCS 2 = $(basename $(SRCS)) # SRCS 2 is "aa bb module/abc" Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
executives function v $(shell COMMAND) § 쉘에서 COMMAND 명령을 내린 결과를 가져온다. § `COMMAND` 도 같은 결과를 가진다. CURRENT_DIR = $(shell pwd) v $(call VAR, PARAM, . . . ) § VAR 에 PARAM 인수를 이용해서 매크로를 호출합니다. (define directives 참조) Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
executives function (con't) v $(eval TEXT) § TEXT 문자열을 해석하여 명령어로 실행한다. UNAME_STRING : = $(shell /bin/uname -a) MY_VAR : = UNAME_STRING 2 all: @echo "(shell) -> $(UNAME_STRING)" $(eval $(MY_VAR) : = $(UNAME_STRING)) @echo "(eval) -> $(UNAME_STRING 2)" $$(UNAME_STRING) $ make (shell) -> Linux pmlab. ssu. ac. kr 2. 6. 14 -1. 1644_FC 4 #1 Sun Nov 27 03: 25: 11 EST 2005 i 686 athlon i 386 GNU/Linux (eval) -> Linux pmlab. ssu. ac. kr 2. 6. 14 -1. 1644_FC 4 Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
executives function (con't) v $(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” Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
text functions v $(subst FROM, TO, TEXT) § 문자열 교체 § $(subst foo, bar, what is foo) 는 what is bar 와 동일 v $(patsubst PATTERN, REPLACEMENT, TEXT) § 문자열을 패턴으로 검색하여 교체 § $(patsubst %. c, %. o, $(SRCS)) 는 $(SRCS) 의 접미사를 모두. o 로 바꿈 OBJS = $(patsubst %. c, %. o, $(SRCS)) Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
text functions (con't) v $(findstring FIND, IN) § IN 에서 FIND 에 해당하는 문자열을 찾음, 실패하면 NULL 리턴 § $(findstring aix, $(SERVER_STRING)) v $(sort LIST) § 알파벳 순으로 정렬 (중복 문자 발견시 제거한다) v $(strip STRING) § STRING 에 해당하는 앞뒤의 복수개의 공백 제거 § $(strip a b c) 는 a b c 로 조작됨 Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
text functions (con't) v $(filter PATTERN. . . , TEXT) § TEXT 에서 PATTERN 에 해당하는 부분만 걸러냄 § 여러 타입의 파일형이 섞여있는 곳에서 유용함 FULL_SRCS = a. c b. c c. s a. h b. h lang. mo SRCS = $(filter %. c %. s, $(FULL_SRCS)) v $(filter-out PATTERN. . . , TEXT) § TEXT 에서 PATTERN 에 매치되지 않은 부분만 걸러냄 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)) Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
control functions v $(warning TEXT) § TEXT 메시지를 화면에 출력한다. v $(error TEXT) § TEXT 메시지를 화면에 출력하고 실행을 중단한다. Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
conditionals v 특정 조건에 맞춰서 make 구문의 블럭 실행 § 주로 OS 나 환경에 의해서 선택적인 make 를 실행할때 사용함 § COMMAND 가 아니므로 라인의 첫부분에 위치해야 함 § ifeq, ifneq, ifdef, ifndef, else, endif 등의 예약어 사용 » 단, IF-ELSE-ENDIF 의 경우에는 단 한개의 else 만 사용가능 ifeq $(ARG 1, ARG 2) ifeq 'ARG 1' 'ARG 2' ifeq "ARG 1" "ARG 2" ifeq $($(CC), gcc) $(CC). . else $(CC). . endif Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
dependancy v 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 Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
dependancy (con't) v include dependency DEPENDENCY = dep. mk all: . . . dep: $(CC) $(CPPFLAGS) -M $(wildcard *. c) > $(DEPENDENCY) ifeq "$(DEPENDENCY)" "$(findstring $(DEPENDENCY), $(wildcard *. mk))" include $(DEPENDENCY) else $(warning "[ Can't find dependency file: $(DEPENDENCY) ]") endif Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
dependancy (con't) v gccmakedep : X 11 R 6 의 파생물 § 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 Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
static pattern rule v pattern 을 적용하여 복수개의 target 을 지정 § REGEX 의 의미 확장을 사용한다. § Implicit rule 안에서 몇몇 타켓을 특별하게 다른 rule을 적용하도록 해준다. v syntax § TARGETS 는 와일드카드를 포함할 수 있다. § TARGET-PATTERN 은 뒤에 나오는 각각의 PREREQUISITE-PATTERNS에 대해서 적 용할 패턴을 기술한다. 이 패턴에 의해서 만들어지는 TARGETS 의 일부는 stem 이라 고 부른다. TARGETS. . . : TARGET-PATTERN: PREREQUISITE-PATTERNS. . . COMMAND. . . Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
static pattern rule (con't) v pattern 으로 명확한 기술이 가능함 objects = foo. o bar. o all: $(objects): %. o: %. c $(CC) -c $(CFLAGS) $< -o $@ v 하나의 C 소스로부터 매크로에 따라서 여러 종류의 오브젝트 생성 OUT = pthread_rwlock pthread_spinlock OUT 2 = pthread_rwlock_pshared pthread_spinlock_pshared . SUFFIXES: . o. c. o. h. PHONY: all clean all: $(OUT) $(OUT 2) # 뒤에 계속 Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
static pattern rule (con't) # Static pattern rule OBJ_OUT 2 = $(addsuffix. o, $(OUT 2)) $(OBJ_OUT 2): %_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 Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
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 1 = poll_main. o OBJS 2 = epoll_main. o OBJS = $(COMMON_OBJ) $(OBJS 1) $(OBJS 2) SRCS = $(patsubst %. o, %. c, $(OBJS)) . SUFFIXES: . c. c. o. o. h. PHONY: all clean dep Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
example (con't) all: $(OUT) io_poll_pthread: $(OBJS 1) $(COMMON_OBJ) $(CC) $(LDFLAGS) $^ $(LOADLIBES) $(LDLIBS) –o $@ io_epoll_pthread: $(OBJS 2) $(COMMON_OBJ) $(CC) $(LDFLAGS) $^ $(LOADLIBES) $(LDLIBS) –o $@ clean: @rm –f *. o $(OUT) dep: $(SRCS) gccmakedep -- $(CPPFLAGS) -- $(SRCS) # End of Makefile Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
test makefile v make –p § make 가 해석한 makefile 의 결과를 보여줌 (테스트에 앞서서 구문해석을 검증). . . (생략). . . # makefile (from `Makefile', line 34) CPPFLAGS =. . . (생략). . . %. c: %: %. c # commands to execute (built-in): $(LINK. c) $^ $(LOADLIBES) $(LDLIBS) -o $@ %. o: %. c # commands to execute (built-in): $(COMPILE. c) $(OUTPUT_OPTION) $< Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
make command options v 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 Copyright by Sun. Young Kim <sunyzero (at) gmail (dot) com>
- Slides: 29