IT관련 지식들 2016. 7. 25. 15:55

기본적인 내용은 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
posted by 동글동글82
: