Make 빌드 시스템 1
- 개발자라면?/Linux
- 2022. 9. 2.
Build
- 한번에 .c 로 빌드하지 말고 각각의 obejct 파일을 만들고 링킹해서 실행파일을 만드는 것이 효율적이다!!
- object 만들기
- 실행 파일 만들기
Make
- 자동 빌드 도구!!!
- Makefile 이 있어야 사용 가능 >> Makefile 을 만들 줄 알아야 한다는 뜻
- 아래 예시는 빌드 후 파일을 수정했을 때 'make' command 만으로 자동 빌드해준 결과
- make <name>
- name 만 make 해줌 (name 없이 make 해주면 default 가 실행됨 / default는 첫 target)
Makefile 만들기
# 첫 target(default)
test: test1.o test2.o test3.o #target: prerequisites (만드려는 파일: 만드는데 필요한 의존파일)
echo "Linking..."
gcc -o test test1.o test2.o test3.o #반드시 tap 으로 command 를 써줘야 함!!
# 아래는 위 파일들이 없는 경우가 있을 수 있으므로 작성하는 내용
test1.o: test1.c
echo "Compile..."
gcc -c test1.c
test2.o: test2.c
gcc -c test2.c
test3.o: test3.c
gcc -c test3.c
# phony target: 선결조건없이 실행하는 target
clean:
-rm test1.o # '-' (ignore) 가 붙는 이유는 test1.o 가 없어도 계속 진행하라는 의미
-rm test2.o test3.o
# dependency: 빌드 전에 확인하는 target 으로 정의
dep:
gccmakedep test1.c test2.c test3.c # .c 와 관련된 header 파일을 찾아서 연결해줌
- makefile 은 필요한 부분들만 실행된다
- phony target: 항상 실행되는 target
- dependency: .c 와 관련된 header 등을 check 해준다
위처럼 'make dep 를 해주면 Makefile 에 #DO NOT DELETE 를 포함한 아래 부분이 자동으로 추가된다
Variables & Macro
Variable 의 이용
- 이전과 비교하면 'test1.o, test2.o, test3.o' 가 모두 OBJS 라는 변수의 선언과 함께 바뀌었다!!
(아래 내용을 보면 command 도 대체 가능하다!)
OBJS = test1.o test2.o test3.o # shell 과 달리 '=' 사이에 공백을 둬도 됨
test: ${OBJS}
echo "Linking..."
gcc -o test ${OBJS}
test1.o: test1.c
echo "Compile..."
gcc -c test1.c
test2.o: test2.c
gcc -c test2.c
test3.o: test3.c
gcc -c test3.c
# pony(dummy) target
clean:
-rm test1.o
-rm test2.o test3.o
# dependency
dep:
gccmakedep ${OBJS}
- Internal Macro (Automatic Variables)
Macro | 의미 |
$@ | 현재의 target 파일명 |
$? | 현재의 target 보다 더 최근에 갱신된 prerequisites (의존파일) |
$* | 현재의 target 보다 더 최근에 갱신된 현재 의존파일 prerequisites (의존파일)명단 (확장자 제외) |
$< | prerequisites(의존파일) 중 첫번째 파일명 |
$^ | 현재 모든 의존파일의 명당 |
$+ | $^ 와 같으나, 두 번 이상 나열된 전제 조건은 makefile에 나열된 순서대로 복제됨 |
$% | target 이 library 모듈일 때 멤버에 대응되는 파일명 Ex) foo.a(bar.o) >> bar.o |
OBJS = test1.o test2.o test3.o
test: ${OBJS}
echo "Linking..."
gcc -o $@ $^
test1.o: test1.c
echo "Compile..."
gcc -c $?
test2.o: test2.c
gcc -c $*.c
test3.o: test3.c
gcc -c $<
# pony(dummy) target
clean:
-rm test1.o
-rm test2.o test3.o
# dependency
dep:
gccmakedep ${OBJS}
- Pre-defined Macro (Variables used by implicit rules)
Macro | 의미 |
AR | Archive-maintaining program; defalut 'ar' |
ARFLAGS | ar 명령어의 옵션 설정 |
AS | Program for compiling assembly files; default 'as' |
ASFLAGS | as 명령어의 옵션 설정 |
CC | Program for compiling C programs; default 'cc' |
CFLAGS | cc 명령어의 옵션 설정 |
CXX | Program for compiling C++ programs; default 'g++' |
CXXFLAGS | g++ 명령어의 옵션 설정 |
LD | ld |
LDFLAGS | 명령어의 옵션 설정 |
OBJS = test1.o test2.o test3.o
#CC = gcc
#CC = arm-gcc
CFLAGS = -g -O0 -Wall # flag for compile
LDFLAGS = -static # flag for linker
test: ${OBJS}
echo "Linking..."
${CC} -o $@ $^ ${LDFLAGS}
test1.o: test1.c
echo "Compile..."
${CC} -c ${CFLAGS} $?
test2.o: test2.c
${CC} -c ${CFLAGS} $*.c
test3.o: test3.c
${CC} -c ${CFLAGS} $<
# pony(dummy) target
clean:
-rm test1.o
-rm test2.o test3.o
# dependency
dep:
gccmakedep ${OBJS}
Tip
- makefile 의 우선순위
- GNUmakefile > makefile > Makefile
- 같은 directory 에 있는 경우에 주의하자!!
참고
http://doc.kldp.org/KoreanDoc/html/GNU-Make/GNU-Make.html#toc1
'개발자라면? > Linux' 카테고리의 다른 글
IP 설정, 확인하기 (0) | 2022.09.14 |
---|---|
Make 빌드 시스템 2 (0) | 2022.09.02 |
라이브러리의 동작과 제작 (0) | 2022.09.02 |
GNU (0) | 2022.09.02 |
쉘 & 쉘스크립트 (0) | 2022.09.01 |