기본적인 내용은 KLDP wiki를 참고했음.
1. makefile의 사용목적
- 편리하게 컴파일
2. 구조.
- <target> <depend> <command><macro>로 구성
<Target> : <Depend> ?... [[;] Command ]
/탭문자/ <Command>
<Target> 생성하려고 하는 목적물.
<Depend> Target을 만드는데 필요한 요소.
<Command> 일반 쉘 명령어. 앞에 /탭문자/를 입력하여 구분.
===== 예제 =====
test: test.o
ld -lc -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 \
-o test \
/usr/lib/crt1.o \
/usr/lib/crti.o \
/usr/lib/crtn.o \
test.o
test.o: test.c
cc -O2 -Wall -Werror -fomit-frame-pointer -c -o test.o test.c
3. 매크로 활용.
<Macro> 특정한 단어, 경로 등등을 미리 저장.
선언 : <Macro name> = <Macro 내용>
사용 : $(macro name)
위 내용을 다음과 같이 변환 가능
CC = cc
LD = ld
CFLAGS = -O2 -Wall -Werror -fomit-frame-pointer -c
LDFLAGS = -lc -m elf_i386 -dynamic-linker /lib/ld-linux.so.2
STARTUP = /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o
test: test.o
$(LD) $(LDFLAGS) -o test $(STARTUP) test.o
test.o: test.c
$(CC) $(CFLAGS) -o test.o test.c
4. 기본 확장자 규칙
.c.o:
- .c파일을 .o파일로 만들기
$@
- target
$<
- 열거된 depend중 최 좌측 항목
$^
- depend 전체
위 내용을 다음과 같이 변환 가능
CC = cc
LD = ld
CFLAGS = -O2 -Wall -Werror -fomit-frame-pointer -c
LDFLAGS = -lc -m elf_i386 -dynamic-linker /lib/ld-linux.so.2
STARTUP = /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o
test: test.o
$(LD) $(LDFLAGS) -o $@ $(STARTUP) $^
.c.o:
$(CC) $(CFLAGS) -o $@ $<
응용 & 확장
CC = cc
LD = ld
RM = rm -f
CFLAGS = -O2 -Wall -Werror -fomit-frame-pointer -v -c
LDFLAGS = -lc -m elf_i386 -dynamic-linker /lib/ld-linux.so.2
STARTUP = /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o
BUILD = test
OBJS = test.o hello.o
.PHONY: all clean
all: $(BUILD)
clean: ; $(RM) *.o $(BUILD)
test: $(OBJS) ; $(LD) $(LDFLAGS) -o $@ $(STARTUP) $^
# 의존관계 성립
$(OBJS): $($@:.o=.c) hello.h Makefile
# test.o hello.o: $($@:.o=.c) hello.h Makefile
# 확장자 규칙 (컴파일 공통 규칙)
.c.o: ; $(CC) $(CFLAGS) -o $@ $<
$($@:.o=.c) : 타겟의 확장자 .o를 .c로 변경
'IT관련 지식들' 카테고리의 다른 글
DateX-ASN.1 (0) | 2016.08.12 |
---|---|
gdb 디버거 사용하기. (0) | 2016.07.26 |
gcc 컴파일러. (0) | 2016.07.25 |
우분투에서 Git 시작하기 (0) | 2016.07.07 |
가상 머신 네트워크 설정. (0) | 2016.06.30 |