\documentstyle[lslide,a4wide]{harticle}

\addtolength{\textheight}{-0.5in}
\verttop
\shadowframe

\begin{document}

\title{MAKE}
\author{권 범 준}
\organization{SPARCS} 
\date{1993년 7월 14일}
\titlepage

\begin{slide}
\subsection{Overview}
\begin{itemize}

\item Dependency Checking: {\tt make} vs Shell Scripts
	\begin{itemize}
	\item 같은 기능을 수행하는 shell scripts 제작 가능, 그러나...
	\end{itemize}
\vspace{5mm}

\item Makefile의 제작

\begin{large}
\begin{verbatim}
target... :  [ dependency... ]
             [ command ]
             ...
\end{verbatim}
\end{large}

	\begin{itemize}
	\item command가 있는 행은 tab으로 시작
	\item 주석은 sharp(\#)으로 시작
	\item 화일 이름은 {\tt makefile} 또는 {\tt Makefile}
	\item 각각의 행은 독립적인 shell에 의해 실행 (반쉼표, 백슬래쉬 사용)
	\end{itemize}
\vspace{5mm}


\item Implicit Rule의 기본적인 사용
	\begin{itemize}
	\item 특정 target에 대한 규칙이 없을 경우 implicit rule 적용
	\item {\tt /usr/include/make/default.mk}
	\item suffix rule과 pattern-matching rule
	\end{itemize}
\vspace{5mm}

\item Dependency의 처리
	\begin{itemize}
	\item 깊이 우선 탐색 (depth-first dependency scan)
	\item 탐색에서 발견되지 않은 target은 처리되지 않음
	\item 최초로 탐색하는 시점을 다르게 지정할 수 있음
	\end{itemize}
\vspace{5mm}

\item Null Rules
	\begin{itemize}
	\item implicit rule 적용, 아니면 SCCS get, 아니면 null rule
	\item 특정 target의 rule이 항상 실행되도록 하기 위해 이용
	\end{itemize}
\vspace{5mm}

\item 모르는 target
	\begin{itemize}
	\item 현 디렉토리
	\item target entry
	\item implicit rule
	\item SCCS history
	\item {\tt .DEFAULT} special target
	\end{itemize}
\vspace{5mm}

\item 표시 없이 명령 실행
	\begin{itemize}
	\item at-sign(@)으로 시작
	\item {\tt -s} 옵션
	\item {\tt .SILENT} special target 지정
	\end{itemize}
\vspace{5mm}

\item 명령 처리 상태의 무시
	\begin{itemize}
	\item minus(--)로 시작
	\item {\tt -i} 옵션 ({\tt -k} 옵션)
	\item {\tt .IGNORE} special target 지정
	\end{itemize}

\end{itemize}
\end{slide}

\begin{slide}
\begin{itemize}

\item 파라미터의 전달 - 매크로
	\begin{itemize}
	\item macro reference
	\item macro definition --- command line 또는 Makefile 내에서 지정
	\end{itemize}
\vspace{5mm}

\item Command Dependency Checking --- {\tt .KEEP\_STATE}
	\begin{itemize}
	\item 명령 실행에 따른 부가적 정보를 저장 --- {\tt .make.state}
	\item environment variable에서 지정 가능
	\item 물음표(?)로 시작하는 명령은 checking을 안 함
	\item 느낌표(!)로 시작하는 명령은 무조건 checking 함
	\end{itemize}
\vspace{5mm}

\item Hidden Dependency
	\begin{itemize}
	\item {\tt \#include}로 포함되는 헤더 화일
	\item {\tt .KEEP\_STATE}로 해결 가능
	\item {\tt .INIT} --- 초기에 필요한 헤더 화일 생성
	\end{itemize}

\end{itemize}
\end{slide}

\begin{slide}
\begin{itemize}

\item 정보의 출력
	\begin{itemize}
	\item {\tt -n} 옵션 --- 실행하지 않고 출력만
	\item {\tt -d} 옵션 --- 유효 기간을 확인하는 글 출력
	\item {\tt -dd} 옵션 --- 모든 dependency 화일 출력
	\item {\tt -D} 옵션 --- makefile의 내용 출력
	\item {\tt -DD} 옵션 --- makefile, state file, hidden dependency report
	\item {\tt -f} 옵션 --- 다른 이름의 makefile 지정
	\item {\tt -p} 옵션 --- macro definition과 target entry 출력
	\item {\tt -P} 옵션 --- dependency tree 출력
	\item {\tt -t} 옵션 --- 다시 만들지 않고 날짜만 수정 ({\tt touch})
	\item Reference Manual의 {\tt make}(1) 참조
	\end{itemize}

\end{itemize}
\end{slide}

\begin{slide}
\subsection{{\tt make}를 이용한 컴파일}
\begin{itemize}

\item Compilation Strategy
	\begin{itemize}
	\item 각 원시 화일을 각각의 목적({\tt .o}) 화일로 컴파일
	\item 하나의 실행 가능 화일로 링크
	\item 디스크 공간은 더 많이 쓰지만, 시간 절약
	\end{itemize}
\vspace{5mm}

\item 간단한 Makefile

\begin{large}
\begin{verbatim}
#   Simple makefile for compiling a program from
#   two C source files.

.KEEP_STATE:

functions: main.o data.o
    cc -sun4 -O -o functions main.o data.o

main.o: main.c
    cc -sun4 -O -c main.c

data.o: data.c
    cc -sun4 -O -c data.c

clean:
    rm functions main.o data.o
\end{verbatim}
\end{large}

\end{itemize}
\end{slide}

\begin{slide}
\begin{itemize}

\item Predefined Macros
	\begin{itemize}
	\item {\tt COMPILE.c} --- {\tt .c} 화일에서 {\tt .o} 화일을 만들기 위한 명령
	\item {\tt LINK.c} --- 목적 화일을 링크하기 위한 명령
	\item {\tt CC} --- {\tt cc} 명령
	\item {\tt CFLAGS} --- {\tt cc} 명령에 붙는 옵션
	\item {\tt CPPFLAGS} --- {\tt cpp} 명령에 붙는 옵션
	\item {\tt LDFLAGS} --- {\tt ld} 링크 에디터에 붙는 옵션
	\item {\tt TARGET\_ARCH} --- target-architecture (크로스 컴파일)
	\end{itemize}

\begin{large}
\begin{verbatim}
#   Simple makefile for compiling a program from
#   two C source files.

CFLAGS = -O

.KEEP_STATE:

functions: main.o data.o
    ($LINK.c) -o functions main.o data.o

main.o: main.c
    ($COMPILE.c) main.c

data.o: data.c
    ($COMPILE.c) data.c

clean:
    rm functions main.o data.o
\end{verbatim}
\end{large}

\end{itemize}
\end{slide}

\begin{slide}
\begin{itemize}

\item Implicit Rules (Suffix Rules)
	\begin{itemize}
	\item 같은 base name의 다른 화일로부터 생성
	\item suffixes list에 있는지 참조후 suffix rule 적용
	\item suffix가 없는 화일 (null suffix) --- 실핼 화일?
	\item 여러 개의 dependency file이 있는 경우
	\end{itemize}
	
\begin{large}
\begin{verbatim}
SUFFIXES=  .o .c .c~ .s .s~ .S .S~ .ln .f .f~ \
.F .F~ .l .l~ .mod .mod~ .sym .def .def~ .p .p~ \
.r .r~ .y .y~ .h .h~ .sh .sh~ .cps .cps~

.SUFFIXES:  $(SUFFIXES)
\end{verbatim}
\end{large}
\vspace{5mm}

\item Dynamic Macros
	\begin{itemize}
	\item {\tt \$@} --- 현재 target의 이름
	\item {\tt \$?} --- target보다 늦게 생성된 dependency의 list
	\item {\tt \$<} --- dependency file의 이름
	\item {\tt \$*} --- 현재 target의 base name
	\item modifier --- D와 F
	\item no transitive closure
	\end{itemize}
\vspace{5mm}

\item Suffix Rule의 추가

\begin{large}
\begin{verbatim}
.SUFFIXES: .ms .tr

.ms.tr:
	troff -t -ms $< > $@
\end{verbatim}
\end{large}

\end{itemize}
\end{slide}

\begin{slide}
\begin{itemize}

\item Pattern-Matching Rules
	\begin{itemize}
	\item {\em prefix{\tt \%}suffix}의 형태 ({\tt \%}는 wildcard)
	\item pattern-matching rule부터 적용
	\end{itemize}

\begin{large}
\begin{verbatim}
%.tr: %.ms
	troff -t -ms $< > $@
\end{verbatim}
\end{large}

\end{itemize}
\end{slide}
\end{document}
