program이 작다면 하나의 file에 모든 소스코드를 담아서 작성할 수 있다.
program이 커지게 된다면, 코드의 line이 많아지고 더많은 모듈과 component가 필요.
큰 program을 하나의 file에 담았을 경우,
어떤 func? component? 호출관계?를 파악하는게 매우 어렵다.
또한 아주 작은 부분만 고쳐도 파일 전체를 새로 컴파일해야 한다.
컴파일 시간이 오래 걸린다. 여러 명이 동시에 그 파일에 변경을 가하기가 어렵다.
따라서 components를 여러 부분으로 나누는 것이 필요함.
(정리) 대규모 project를 여러 file에 나누어 관리하는 것이 바람직하다.
위와 같은 일들을 자동화하여 compile해줄 수 있는 것이 make 명령어이다.
make는 UNIX에서 사용하는 명령어이다.
make 명령어는 Makefile을 해석하여 수행시켜준다.
[Mm]akefile은 compile에 필요한 rules와 command가 기입된 script file이다.

linux kernel에 있는 Makefile개수 확인하기.
최종적으로 만들고 싶은 프로그램인 가장 상위의 target을 만든다.
그 target을 만들기 위한 sub file들(object file)을 사용하면 된다.
하지만 sub file들이 존재하지 않다면 다시 만들어야 한다.
이렇게 target을 만들기 위해 target이 의존하는 file들을 recursive하게 만들어 간다.
target이 만들어졌다면, 그 target이 의존하는 file들보다 오래되었을 경우(file 시간 check)만 compile을 새로 한다.


--

main.o this.o : funcs.h
Assignment : MACRONAME = valueUsage : ${MACRONAME} or $(MACRONAME)$@ : Full target name
$* : Name of the target, without suffix(확장자)
$< : First dependency
$^ : Name of all dependency
$? : target보다 최근에 생성된 파일들
example :


PHONY target :
target이 file이 아니라 해당되는 action을 호출하기 위해 사용되는 경우가 있다.
ex:
.PHONY: all all install
all: ${만들 program}
ex:
.PHONY: all install
install:
cp ${결과} ${경로}
.PHONY: all install clean
clean:
rm -rf ${실행파일 만드는 데 생성된 중간 파일들? *.o *.out *.a *.so core core.* ...}보통 makefile을 부르는 순서 :
gcc -c lib.c -o lib.o
gcc -c prog.c -o prog.o
gcc lib.o prog.o -o biinary
이 build system을 makefile을 이용해서 만들면?
binary: lib.o prog.o
gcc lib.o prog.o -o binary -g -Wall
lib.o: lib.c
gcc -c lib.c -o lib.o -g -Wall
prog.o: prog.c
gcc -c prog.c -o prog.o -g -Wall
위에서 반복적으로 사용되는 string들을, macro를 이용하여 대체할 수 있음.
사용자가 선언하는 macro 이용:
CC = gcc
CFLAGS = -g -Wall
OUTPUT = binary
OBJFILES = lib.o prog.o
${OUTPUT} : ${OBJFILES}
${CC} ${OBJFILES} -o ${OUTPUT} ${CFLAGS}
lib.o : lib.c
${CC} -c lib.c -o lib.o ${CLFAGS}
prog.o : prog.c
${CC} -c prog.c -o prog.o ${CLFAGS}
predefined macro를 이용해서 대체할 수도 있음.
아래 예제에서는 $<: 첫 번째 dependency, $@: full target name
CC = gcc
CFLAGS = -g -Wall
OUTPUT = binary
OBJFILES = lib.o prog.o
${OUTPUT} : ${OBJFILES}
${CC} ${OBJFILES} -o ${OUTPUT} ${CFLAGS}
lib.o : lib.c
${CC} -c ${<} -o ${@} ${CLFAGS}
prog.o : prog.c
${CC} -c ${<} -o ${@} ${CLFAGS}
여기서, wild card를 이용하여 더 간편하게 수정할 수도 있음.
CC = gcc
CFLAGS = -g -Wall
OUTPUT = binary
OBJFILES = lib.o prog.o
${OUTPUT} : ${OBJFILES}
${CC} ${OBJFILES} -o ${OUTPUT} ${CFLAGS}
%.o : %.c # 어떠한.o file은 어떠한.c을 의존함
${CC} -c ${<} -o ${@} ${CLFAGS}
오래된 makefile에서는
wild card 말고, suffix rule을 이용하기도 함.
wild card 사용이 더 일반적..
CC = gcc
CFLAGS = -g -Wall
OUTPUT = binary
OBJFILES = lib.o prog.o
.SUFFIXES: .o .c # 이렇게 어떤 suffix에 대해서 규칙이 있는지 정해줘야 함
${OUTPUT} : ${OBJFILES}
${CC} ${OBJFILES} -o ${OUTPUT} ${CFLAGS}
.c.o # 어떠한.o file은 어떠한.c을 의존함
${CC} -c ${<} -o ${@} ${CLFAGS}
phony target을 선언할 수도 있음
1:



2 : Predefined Macros


3-1 : 반복되는 단어들에 대해서 Macro 사용



3-2 : 반복되는 단어들에 대해서 Macro 사용

4 : dependency file 만들기static library linking :
shared library linking :
'$$d' :
(foo.c 내용만 수정)

$@ : Full target name$* : Name of the target, without suffix(확장자)$< : First dependency$^ : Name of all dependency$? : target보다 최근에 생성된 파일들


| )로 설정


방법 1: symbolic link에 대한 dependency

방법 2: symbolic link에 대한 dependency

echo 까지 같이 출력되는 것을 없애기 위해,

@ 추가

