이 글은 GNU Make에 대한 내용들을 정리한 것이다.
보통 Qualcomm의 BSP나 혹은 Linux 계열에서는 이 유틸리티를 사용한다.
이 작업의 요는 가능한 아주 초보자들 보다도, 사용하신 분들에게 유리할 macro 부분 위주로 기술되어 있다.
참고 자료
http://www.gnu.org/software/make/manual/make.pdf
O'Reilly의 Make
http://kkamagui.springnote.com/pages/359124
o 프로젝트 관리자의 필수 유틸리티.
- 프로젝트 생성 시, Compile 할 파일들을 정리하고, Dependency들을 확인하여 빌드 하고,임시 파일들을 제거 할수 있는 유틸리티이다.
- 또한 이 make는 재 빌드시에 갱신된 파일들의 시간을 확인하여 (최종 파일보다 나중에 생성된 시간) 수정된 파일이 있을 경우, 그 파일이나 혹은 그 dependency를 확인하여 빌드 시간을 감소시킨다. ( 단 메인의 header file 수정시에는 전체 빌드한다. )
즉 .o (object) 보다 .c가 변경된 시간이 이전이라면 빌드를 하지 않고, 이후라면 빌드한다.
- 역방향 연결방법 (backward-chaining : 목적중심의 관리 방법) : 연결고리를 추적해 나간다.
1. 컴파일 / 실행 / 디버그
o $make project
Project 는 Target / Prerequisites (필요 항목) / Dependents (종속 항목) 이라는 파일들로 Build 된다.
build 하는 데 필요한 Obect와 관련된 .c or .h 파일이 Prerequisities 라고 한다.
o make의 모든 명령들은 Tab 문자로 시작한다. No Space!!!
확인 ) $cat -v - t -e project
-v 와 -t는 모든 탭들을 ^I로 표시하고, -e는 각행의 마지막에 $기호를 표시.
o 행이 길어질 경우 역슬래시(\)를 추가하여 계속이어 나갈수 있다. 여기서도 역슬래시(\)는 행이 바뀌는 문자 바로 앞에 위치!!
o 비어있는 행은 무시.
o #은 주석문
o 제각기 다른 명령은 세미콜론(;)으로 한 행에 기술 가능.
o 예제 적용
# This is a sample.
(^I)project : project1.o project2.o project3.o \
project4.o $
보통 Qualcomm의 BSP나 혹은 Linux 계열에서는 이 유틸리티를 사용한다.
이 작업의 요는 가능한 아주 초보자들 보다도, 사용하신 분들에게 유리할 macro 부분 위주로 기술되어 있다.
참고 자료
http://www.gnu.org/software/make/manual/make.pdf
O'Reilly의 Make
http://kkamagui.springnote.com/pages/359124
o 프로젝트 관리자의 필수 유틸리티.
- 프로젝트 생성 시, Compile 할 파일들을 정리하고, Dependency들을 확인하여 빌드 하고,임시 파일들을 제거 할수 있는 유틸리티이다.
- 또한 이 make는 재 빌드시에 갱신된 파일들의 시간을 확인하여 (최종 파일보다 나중에 생성된 시간) 수정된 파일이 있을 경우, 그 파일이나 혹은 그 dependency를 확인하여 빌드 시간을 감소시킨다. ( 단 메인의 header file 수정시에는 전체 빌드한다. )
즉 .o (object) 보다 .c가 변경된 시간이 이전이라면 빌드를 하지 않고, 이후라면 빌드한다.
- 역방향 연결방법 (backward-chaining : 목적중심의 관리 방법) : 연결고리를 추적해 나간다.
1. 컴파일 / 실행 / 디버그
o $make project
Project 는 Target / Prerequisites (필요 항목) / Dependents (종속 항목) 이라는 파일들로 Build 된다.
build 하는 데 필요한 Obect와 관련된 .c or .h 파일이 Prerequisities 라고 한다.
o make의 모든 명령들은 Tab 문자로 시작한다. No Space!!!
확인 ) $cat -v - t -e project
-v 와 -t는 모든 탭들을 ^I로 표시하고, -e는 각행의 마지막에 $기호를 표시.
o 행이 길어질 경우 역슬래시(\)를 추가하여 계속이어 나갈수 있다. 여기서도 역슬래시(\)는 행이 바뀌는 문자 바로 앞에 위치!!
o 비어있는 행은 무시.
o #은 주석문
o 제각기 다른 명령은 세미콜론(;)으로 한 행에 기술 가능.
o 예제 적용
# This is a sample.
(^I)project : project1.o project2.o project3.o \
project4.o $
# This blank is ignored.
(^I)project_sub : project_sub.o ; project_sub_sub : project_sub_sub .o $
# End of Line
o $make clean (clean 명령 스크립트)
# clean Script
clean:
/bin/rm -f core *.o
#EoL
2. Macro
o Sample 1
ROOT_DRIVE=D:\
APPS_PATH=%ROOT_DRIVE%\%APPS_DIR%
or
$(ROOT_DRIVE)
or
${ROOT_DRIVE}
o Sample 2
LIBES = -1x11
objs = abc.o def.o dsd.o
CC=/usr/sample2/cc
23 = "This is the 23rd run"
OPT =
DEBUG_FLAG= #empty now, but assign -g for debuging
BINDIR=/usr/local/bin
sample2 : ${objs}
${CC} -o sample2 ${DEBUG_FLAG} ${objs} ${LIBES}
mv sample2 ${BINDIR}
$make sample2
==>
/usr/sample2/cc -o sample2 abc.o def.o dsd.o -1x11
mv sample2 /usr/local/bin
- 등호뒤에 아무것도 없는 것 (OPT, DEBUG_FLAG)의 경우에는 null의 문자열이 할당된다.
- macro는 선정의되지 않으면 Error를 송출한다. (재 정의는 가능하다.)
o 내부적으로 정의된 macro
- ${CC} : C compiler --> CFLAGS
- ${LD} : Linker --> LDFLAGS
- $make -p --> 사용 가능한 macro 송출
o 명령행의 macro 정의
- $make pjt "DIR=/usr/proj"
o macro 할당의 우선 순위
1. make 입력시 다음에 따라오는 macro
2. 기술 파일의 macro정의
3. 현재 shell 환경의 변수
4. make 내부의 정의.
cf) $make -e 의 경우
1. make 입력시 다음에 따라오는 macro
2. 현재 shell 환경의 변수
3. 기술 파일의 macro정의
4. make 내부의 정의.
ex)
TESTER = defaults_test
test : srcfile.c
$(TESTER) srcfile.c
==> 기술 파일에 정의
$ TESTER=new_test
$export TESTER
==> shell 내 환경 변수로 등록
$ make test
defaults_test srcfile.c
$ make -e test
new_test srcfile.c
o macro 문자열 치환
SRCS = def.c redraw.c calc.c
FINAL_OBJS = ${SRCS: .c=.o}
DEBUG_OBJS = ${SRCS: .c=_dbg.o}
...
FINAL_OBJS ==> def.o redraw.o calc.o
DEBUG_OBJS ==> def_dbg.o redraw_dbg.o calc_dbg.o
- 문자열 치환의 또 다른 예제. 공백문자 바로 앞까지만 적용됨)
LETT = xyz xyzacb abcxyz
echo ${LETT:xyz=DEF}
==> DEF xyzabc abcDEF (공백문자 앞까지만 적용 그 이후는 다른 것으로 간주)
o Target용 내부 매크로
$@ 는 현재 Target을 말한다. ==> $$@ , $(@), ${@}로도 사용가능.
$? 는 최신인 Target의 필요항목 만 받는다. ==> 만약 처음 빌드 후 update 된 내용이 없을 경우는 skip 한다. (실제 현 target에 확인을 함으로써 소요시간을 더욱 줄이는 것이 가능하다는 이야기이다 )
ex) libops= inter.o sched.o gen.o
ar r $@ $?
$make libhops
ar r libhops inter.o sched.o gen.o
$cc -c sched.c
$make libhops
ar r libhops sched.o
3. 확장자 규칙.
o $<의 의미
.SUFFIXES:.o .c .s
.c.o:
$(CC) $(CFLAGS) -c $<
.s.o:
$(AS) $(ASFLAGS) -o $<
$<의 의미는 소스(.c or .s)와 .o 파일이 생성시간을 확인하여, .c와 .o의 compile 방법을 제공해 주는 것이다. 즉 이는 확장자 규칙에서만 사용될수 있다는 것을 제외하고는 <? 와 유사하다.
o 명령옵션
$make program CFLAGS=-g
$make program "CFLAGS=-g -DTRACE"
$make program CFLAGS=-l
$make program CFLAGS=-p
cp $< $*.tmp
==> cp main.c main.tmp
$*는 확장자를 제외한 이름을 macro화 할수 있다.
# End of Line
o $make clean (clean 명령 스크립트)
# clean Script
clean:
/bin/rm -f core *.o
#EoL
2. Macro
o Sample 1
ROOT_DRIVE=D:\
APPS_PATH=%ROOT_DRIVE%\%APPS_DIR%
or
$(ROOT_DRIVE)
or
${ROOT_DRIVE}
o Sample 2
LIBES = -1x11
objs = abc.o def.o dsd.o
CC=/usr/sample2/cc
23 = "This is the 23rd run"
OPT =
DEBUG_FLAG= #empty now, but assign -g for debuging
BINDIR=/usr/local/bin
sample2 : ${objs}
${CC} -o sample2 ${DEBUG_FLAG} ${objs} ${LIBES}
mv sample2 ${BINDIR}
$make sample2
==>
/usr/sample2/cc -o sample2 abc.o def.o dsd.o -1x11
mv sample2 /usr/local/bin
- 등호뒤에 아무것도 없는 것 (OPT, DEBUG_FLAG)의 경우에는 null의 문자열이 할당된다.
- macro는 선정의되지 않으면 Error를 송출한다. (재 정의는 가능하다.)
o 내부적으로 정의된 macro
- ${CC} : C compiler --> CFLAGS
- ${LD} : Linker --> LDFLAGS
- $make -p --> 사용 가능한 macro 송출
o 명령행의 macro 정의
- $make pjt "DIR=/usr/proj"
o macro 할당의 우선 순위
1. make 입력시 다음에 따라오는 macro
2. 기술 파일의 macro정의
3. 현재 shell 환경의 변수
4. make 내부의 정의.
cf) $make -e 의 경우
1. make 입력시 다음에 따라오는 macro
2. 현재 shell 환경의 변수
3. 기술 파일의 macro정의
4. make 내부의 정의.
ex)
TESTER = defaults_test
test : srcfile.c
$(TESTER) srcfile.c
==> 기술 파일에 정의
$ TESTER=new_test
$export TESTER
==> shell 내 환경 변수로 등록
$ make test
defaults_test srcfile.c
$ make -e test
new_test srcfile.c
o macro 문자열 치환
SRCS = def.c redraw.c calc.c
FINAL_OBJS = ${SRCS: .c=.o}
DEBUG_OBJS = ${SRCS: .c=_dbg.o}
...
FINAL_OBJS ==> def.o redraw.o calc.o
DEBUG_OBJS ==> def_dbg.o redraw_dbg.o calc_dbg.o
- 문자열 치환의 또 다른 예제. 공백문자 바로 앞까지만 적용됨)
LETT = xyz xyzacb abcxyz
echo ${LETT:xyz=DEF}
==> DEF xyzabc abcDEF (공백문자 앞까지만 적용 그 이후는 다른 것으로 간주)
o Target용 내부 매크로
$@ 는 현재 Target을 말한다. ==> $$@ , $(@), ${@}로도 사용가능.
$? 는 최신인 Target의 필요항목 만 받는다. ==> 만약 처음 빌드 후 update 된 내용이 없을 경우는 skip 한다. (실제 현 target에 확인을 함으로써 소요시간을 더욱 줄이는 것이 가능하다는 이야기이다 )
ex) libops= inter.o sched.o gen.o
ar r $@ $?
$make libhops
ar r libhops inter.o sched.o gen.o
$cc -c sched.c
$make libhops
ar r libhops sched.o
3. 확장자 규칙.
o $<의 의미
.SUFFIXES:.o .c .s
.c.o:
$(CC) $(CFLAGS) -c $<
.s.o:
$(AS) $(ASFLAGS) -o $<
$<의 의미는 소스(.c or .s)와 .o 파일이 생성시간을 확인하여, .c와 .o의 compile 방법을 제공해 주는 것이다. 즉 이는 확장자 규칙에서만 사용될수 있다는 것을 제외하고는 <? 와 유사하다.
o 명령옵션
$make program CFLAGS=-g
$make program "CFLAGS=-g -DTRACE"
$make program CFLAGS=-l
$make program CFLAGS=-p
cp $< $*.tmp
==> cp main.c main.tmp
$*는 확장자를 제외한 이름을 macro화 할수 있다.