makefile

bi_sz·2020년 6월 29일
0

Linux

목록 보기
3/5

기본적인 gcc 옵션들을 makefile을 이용해서 간단하게 사용할 수 있다.

test :
	gcc -o test main.c print.c input.c 

두 번째 줄의 gcc 앞에는 공백이 아니라 탭 문자를 사용해야 한다.

공백이나 다른 문자를 사용하면 에러가 발생하므로 주의해야 한다.

makefile을 작성한 후 $make 유틸리티를 실행하면 자동으로 빌드가 완료된다.


test : main.c print.c input.c 
	gcc -o test main.c print.c input.c 

파일하나 수정하면 전체를 컴파일 해야 한다.

test : main.o print.o input.o
	gcc -o test main.o print.o input.o

.c가 아닌 .o (목적파일) 을 컴파일 하게 한다.


테스트라는 실행파일을 만들어준거처럼 .o 파일 만드는걸 만들어 준다.

test : main.o print.o input.o
	gcc -o test main.o print.o input.o
main.o : main.c common.h
	gcc -c main.c
print.o : print.c common.h
	gcc -c print.c
input.o : input.c common.h
	gcc -c input.c

테스트 실행파일을 만들기 위해 목적파일을 아랫줄에서 만들어 준다.

> make 입력하면 실행파일이 만들어지고 컴파일 된다.

main.c 파일을 수정하고 컴파일하면 바뀐 main 만 컴파일 된다.


메이크파일을 지우는 명령어 이다.

$ rm *.o 

makefile에 목적파일을 삭제해주는 clean도 넣어준다.

test : main.o print.o input.o
	gcc -o test main.o print.o input.o
main.o : main.c common.h
	gcc -c main.c
print.o : print.c common.h
	gcc -c print.c
input.o : input.c common.h
	gcc -c input.c
clean : 
	rm test *.o

순서에 상관 없이 all을 지정해서 test가 아래있어도 all을 실행하기 위해 test를 실행한다.

# target : dependency_list
#	command_list
#
.PHONY:all clean
all : test
main.o : main.c common.h
	gcc -c main.c
print.o : print.c common.h
	gcc -c print.c
input.o : input.c common.h
	gcc -c input.c
test : main.o print.o input.o
	gcc -o test main.o print.o input.o
clean : 
	rm test *.o

라벨로 구분하기 위해 .PHONY 매크로를 지정한다.

$ make clean 하면 *.o ( 목적파일/메이크파일 ) 이 지워 진다.


makefile 의 파일명은 Makefile 이여야 하고 $ make 로 실행하지만,

다른 파일명을 사용 시 $ make -f [ 파일명 ] 으로 실행 한다.


makefile 의 매크로

매크로는 makefile 에서 편리하게 사용하기 위해 미리 정의된 변수이다.

#main.c print.c input.c common.h
#
TARGET = test
OBJECTS = main.o print.o input.o
CC = gcc
$(TARGET) : $(OBJECTS)
	$(CC) -o $(TARGET) $(OBJECTS)
clean :
	rm $(TARGET) $(OBJECTS)
main.o : main.c common.h
print.o : print.c common.h
input.o : input.c common.h

TARGET을 바꿀 수 있다.

테스트라는 실행파일을 example 로 수정하고자 할 때 저기만 바꾸면 된다.


#main.c print.c input.c common.h
#
TARGET = test
OBJECTS = main.o \
	  print.o \ 
          input.o
CC = gcc
$(TARGET) : $(OBJECTS)
	$(CC) -o $(TARGET) $(OBJECTS)
clean :
	rm $(TARGET) $(OBJECTS)
main.o : main.c common.h
print.o : print.c common.h
input.o : input.c common.h

역 슬래시로 단을 나눌 수 있다.


$@ 현재 목표 파일 ( TARGET ) 의 이름을 지칭한다.

$< 현재 목표 파일 ( TARGET) 보다 더 최근에 갱신된 파일명, 바로 위에 들어가는 첫번째 파일 main.c

.SUFFIXES : .c.o
.PHONY : all clean
TARGET = example
OBJECTS = main.o \
	  print.o \ 
          input.o
CC = gcc
all : $(TARGET)
$(TARGET) : $(OBJECTS)
	$(CC) -o $@ $(OBJECTS)
.c.o :
	$(CC) -c $<
clean :
	rm $(TARGET) $(OBJECTS)
main.o : main.c common.h
print.o : print.c common.h
input.o : input.c common.h

.SUFFIXES : .c .o 관련 파일을 추가한다.

0개의 댓글