작 성 자: 김선영 메 일: sunyzero (at) gmail (dot) com 버 전: 1.30

Slides:



Advertisements
Similar presentations
UNCLASSIFIED 411 th Contracting Support Brigade U.S. Army Expeditionary Contracting CommandU.S. Army Contracting Command UNCLASSIFIED 1 Click 하여 정보 입력을.
Advertisements

Format String Attack! 포맷 스트링 공격 경일대학교 사이버보안학과 학년 남주호.
(금) 김 희 준 Makefile (금) 김 희 준
기초C언어 제1주 실습 강의 소개, C언어 개요, Cygwin/Eclipse 사용 컴퓨터시뮬레이션학과 2016년 봄학기
OpenCV 안드로이드 연동 환경설정 OpenCV-Android 를 다운 받습니다.
05. gcc, make, gdb.
Database Laboratory, Hong Ik University
Consumer PC & AIO PC DMI Refresh 방법 설명 (UEFI DMI Ver)
Cross Compiler를이용한 커널 컴파일 및 포팅
Cross Compiler를이용한 커널 컴파일 및 포팅 1
Makefile의 이해 ㈜FALinux 박진호.
리눅스 기본 명령어 및 Vi 명령어 정리 2015/1, 컴퓨터의 개념 및 실습.
CUDA Setting : Install & Compile
Linux/UNIX Programming
임베디드 프로그래밍 Lecture #
작 성 자: 김선영 메 일: sunyzero (at) gmail (dot) com 버 전: 1.30
Autotools Autoconf, automake Further Study
Embedded System Porting (2)
Homework #6 (1/3) 다음을 수행한 후, 화면(혹은 파일)을 출력하여 제출한다.
Root Filesystem Porting
C / C++ Programming in multi platform
Javascript Basic Sample Programs
Root Filesystem Porting
Geek-OS Project 정영진
메시지 큐[5] – test1.c 메시지 제어: msgctl(2) #include <sys/msg.h>
Homework #5 (1/3) 다음을 수행한 후, 결과 파일들을 출력하여 제출한다.
Cross Compiler 설치.
Cross Compiler를이용한 커널 컴파일 및 포팅
AVR – ATmega103(ATMEL) Compilers & ISP
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
Linux/UNIX Programming
Device Driver 임베디드 시스템 I.
Makefile의 이해 ㈜FALinux 박진호.
24장. 파일 입출력.
Linux/UNIX Programming
ACL(Access Control List)
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
에어 조건문.
3D 프린팅 프로그래밍 05 – 반복패턴 만들기 강사: 김영준 목원대학교 겸임교수.
C언어 응용 제7주 실습 해보기 제6장.
Lecture Notes on Computer Networks 주 홍 택 컴퓨터공학과 계명대학교
자바 5.0 프로그래밍.
PL/SQL 코드 생성 및 수행 1 여러가지 환경 DOS에서 sqlplus Windows에서의 sqlplusw
메모리 타입 분석을 통한 안전하고 효율적인 메모리 재사용
1. 스크립트 작성 마법사 2. NSIS 스크립트 컴파일
문자열 컴퓨터시뮬레이션학과 2015년 봄학기 담당교수 : 이형원 E304호,
Linux/UNIX Programming
Linux/UNIX Programming
Kernel, Ramdisk, JFFS2 Porting
디버깅 관련 옵션 실습해보기 발표 : 2008년 5월 19일 2분반 정 훈 승
DK-128 개발환경 설정 아이티즌 기술연구소
에어 PHP 입문.
Linux 9.X 기초에서 활용까지 Chapter 06 VI 편집기.
Homework #5 (1/3) 다음을 수행한 후, 결과 파일들을 출력하여 제출한다.
Tensorboard in Windows
Chapter 10 데이터 검색1.
Homework #3 (1/3) 다음을 수행한 후, 결과 파일들을 출력하여 제출한다.
함수, 모듈.
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
동적메모리와 연결 리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
Makefile
 6장. SQL 쿼리.
1. SNMP Setting IP 설정 NetAgent Mini 카드에 제공된 CD의 Netility 프로그램을 설치하여 프로그램을 실행시킨다. Netility 프로그램을 실행하면 네트워크에 있는 SNMP 카드를 찾게 됩니다. “Configure”를 선택하면 IP 설정.
Exporting User Certificate from Internet Explorer
Linux/UNIX Programming
6 객체.
Linux/UNIX Programming
C프로그래밍 도구 컴퓨터공학과 강성인.
1. 실습 시간에 수행한 avd 생성 및 실행, adb shell 접속 및 명령어 수행 결과를 제출한다.
Presentation transcript:

작 성 자: 김선영 메 일: sunyzero (at) gmail (dot) com 버 전: 1.30 GNU make -part 1/2- Copyright by SunYoung Kim 작 성 자: 김선영 메 일: sunyzero (at) gmail (dot) com 버 전: 1.30

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 := @echo "TARGET = $(@)"; @echo "PREREQUISITES = $(^)" %.o: %.c $(PRINT_ELEMENTS) $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@

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 COMPILE_DEBUG,$<,$@) $ 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

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”

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

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"

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"

executives function $(shell COMMAND) $(call VAR,PARAM,PARAM,...) VAR 에 PARAM 인수를 이용해서 매크로를 호출합니다. (define directives 참조) CURRENT_DIR = $(shell pwd)

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 2.6.14-1.1644_FC4 #1 Sun Nov 27 03:25:11 EST 2005 i686 athlon i386 GNU/Linux (eval) -> Linux pmlab.ssu.ac.kr 2.6.14-1.1644_FC4

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”

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))

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 로 조작됨

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))

control functions $(warning TEXT) $(error TEXT) TEXT 메시지를 화면에 출력한다.

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

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

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

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 \

static pattern rule pattern 을 적용하여 복수개의 target 을 지정 syntax REGEX 의 의미 확장을 사용한다. Implicit rule 안에서 몇몇 타켓을 특별하게 다른 rule을 적용하도록 해준다. syntax TARGETS 는 와일드카드를 포함할 수 있다. TARGET-PATTERN 은 뒤에 나오는 각각의 PREREQUISITE-PATTERNS에 대해서 적용할 패턴을 기술한다. 이 패턴에 의해서 만들어지는 TARGETS 의 일부는 stem 이라고 부른다. TARGETS ...: TARGET-PATTERN: PREREQUISITE-PATTERNS ... COMMAND ...

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) # 뒤에 계속

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

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 OBJS1 = poll_main.o OBJS2 = epoll_main.o OBJS = $(COMMON_OBJ) $(OBJS1) $(OBJS2) SRCS = $(patsubst %.o,%.c, $(OBJS)) .SUFFIXES: .c .c.o .o .h .PHONY: all clean dep

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

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) $<

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

make command options (con't) -f <filename> make 임의의 파일명으로 makefile 을 대체하여 읽게 합니다. -i make 가 수행하는 모든 명령의 리턴값을 무시합니다. 따라서 에러가 발생해도 계속 진행합니다. 이 모드는 필요조건을 명시하지 않은 .IGNORE 설정과 동일합니다. (몇몇 make 의 버전에는 .IGNORE가 제대로 작동하지 않는 경우가 있습니다) $ make -f alternative.mk ...

make command options (con't) 타겟을 최신의 것으로 갱신하는 도중 에러가 발생 하였을때, 의존성이 없는 서로 다른 타겟은 계속 갱신하도록 합니다. 에러가 발생한 경우에 make 종료 후 메시지를 출력합니다. -n make 가 실행할 명령어를 출력만 하고 실행하지 않습니다. (테스트 목적) 단, 명령행 앞에 "+" 접두어가 붙어있는 경우는 강제 실행됩니다. -p 표준출력으로 make 가 해석한 심볼 변수정의, 규칙, 타겟리스트를 출력합니다. 단, 표준안에서는 출력물의 형태는 강제하지 않았으므로 각 벤더들의 make 출력결과 다를 수 있습니다.

make command options (con't) -q 타겟을 테스트하는데 사용됨 타겟이 최신의 것이라면 '0' 을 리턴, 그렇지 않으면 '1'을 리턴합니다. -r suffix rule 검색을 위한 접미어 탐색 리스트(.SUFFIXES)를 사용하지 않습니다. 이는 .SUFFIXES 에 아무것도 지정하지 않은 경우와 동일합니다. -S 타겟을 갱신하는 도중에 에러가 발생하면, make 를 중지합니다. 이 옵션은 기본으로 켜져있으므로 지정할 필요는 없습니다. -k 옵션과 반대의 기능을 합니다. (따라서 같이 지정될 수 없습니다)

make command options (con't) silent mode 로 작동합니다. 표준출력으로 명령어를 출력하지 않습니다. .SILENT 특수 타겟에 필요조건을 설정하지 않은 경우와 동일하게 작동합니다. -t 생성되지 않은 타겟에 대해 touch 명령을 실행합니다. 이 모드는 make 가 무엇을 만들지 미리 테스트해보는 용도로 사용됩니다. 단, 명령어 앞에 "+" 접두어가 붙은 경우는 강제 실행됩니다.