make -p 알려드렸는데 많다고 안 보시거나 하나하나 분석하는 경우가 많아서 공유합니다.
make 관련 옵션
옵션 | 설명 |
-d 또는 --debug=[FLAGS] | 디버그 정보 출력 |
-p 또는 --print_data-base | 내부 데이터베이스 출력 |
-r 또는 --no-builtin-rules | 내장된 묵시적 규칙 비활성화 |
-R 또는 --no-builtin-variables | 내장된 변수 비활성화 |
자동 변수
# 현재 타겟 이름
@F = $(notdir $@)
@D = $(patsubst %/,%,$(dir $@))
# 종속 항목 리스트 중 가장 왼쪽 항목
<F = $(notdir $<)
<D = $(patsubst %/,%,$(dir $<))
# 종속 항목 리스트에서 가장 최근 변경된 항목
?F = $(notdir $?)
?D = $(patsubst %/,%,$(dir $?))
# 종속 항목 리스트에서 현재 타겟보다 최근에 변경된 항목
*F = $(notdir $*)
*D = $(patsubst %/,%,$(dir $*))
# 종속 항목 리스트 전체 (중복 제거)
^F = $(notdir $^)
^D = $(patsubst %/,%,$(dir $^))
# 종속 항목 리스트 전체 (중복 포함)
+D = $(patsubst %/,%,$(dir $+))
+F = $(notdir $+)
# 현재 타겟이 라이브러리 모듈일 때 .o 파일에 대응되는 이름
%F = $(notdir $%)
%D = $(patsubst %/,%,$(dir $%))
Makefile
복사
확장자 규칙(Suffix Rule)
.SUFFIXES에 설정된 확장자를 자동으로 인식해서 필요한 작업을 수행하던 설정이다.
SUFFIXES := .out .a .ln .o .c .cc .C .cpp .p .f .F .m .r .y .l .ym .yl .s .S .mod .sym .def .h .info .dvi .tex .texinfo .texi .txinfo .w .ch .web .sh .elc .el
.SUFFIXES := .out .a .ln .o .c .cc .C .cpp .p .f .F .m .r .y .l .ym .yl .s .S .mod .sym .def .h .info .dvi .tex .texinfo .texi .txinfo .w .ch .web .sh .elc .el
Makefile
복사
C와 관련된 확장자 구규칙(.c.o)과 최신 규칙(%.o : %.c)은 다음과 같으며 이하 생략한다.
.c.o:
$(COMPILE.c) $(OUTPUT_OPTION) $<
%.o : %.c
$(COMPILE.c) $(OUTPUT_OPTION) $<
Makefile
복사
.c:
$(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@
% : %.c
$(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@
Makefile
복사
.o:
$(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@
% : %.o
$(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@
Makefile
복사
내장 변수와 규칙
운영체제 등에 따라 달라질 수 있으며, 확장자 규칙과 관련된 내용은 생략한다.
미분류
LD = ld
RM = rm -f
OUTPUT_OPTION = -o $@
MAKE_COMMAND := make
MAKE = $(MAKE_COMMAND)
MAKEFILES :=
MAKE_VERSION := 4.1
MAKE_TERMERR := /dev/pts/4
MAKE_HOST := x86_64-pc-linux-gnu
.LIBPATTERNS = lib%.so lib%.a
.INCLUDE_DIRS = /usr/include /usr/local/include /usr/include
.SHELLFLAGS := -c
.FEATURES := target-specific order-only second-expansion else-if shortest-stem undefine oneshell archives jobserver output-sync check-symlink load
.RECIPEPREFIX :=
.VARIABLES :=
%: %.sh
cat $< >$@
chmod a+x $@
%.out: %
@rm -f $@
cp $< $@
Makefile
복사
AR(archive maintaining program)
AR = ar
ARFLAGS = rv
(%): %
$(AR) $(ARFLAGS) $@ $<
Makefile
복사
AS(assmbler)
AS = as
COMPILE.s = $(AS) $(ASFLAGS) $(TARGET_MACH)
COMPILE.S = $(CC) $(ASFLAGS) $(CPPFLAGS) $(TARGET_MACH) -c
LINK.S = $(CC) $(ASFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_MACH)
LINK.s = $(CC) $(ASFLAGS) $(LDFLAGS) $(TARGET_MACH)
%.o: %.s
$(COMPILE.s) -o $@ $<
%.o: %.S
$(COMPILE.S) -o $@ $<
%: %.s
$(LINK.s) $^ $(LOADLIBES) $(LDLIBS) -o $@
%: %.S
$(LINK.S) $^ $(LOADLIBES) $(LDLIBS) -o $@
Makefile
복사
C
CPP = $(CC) -E # c processor
PREPROCESS.S = $(CC) -E $(CPPFLAGS)
%.s: %.S
$(PREPROCESS.S) $< > $@
Makefile
복사
OBJC = cc
COMPILE.m = $(OBJC) $(OBJCFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
LINK.m = $(OBJC) $(OBJCFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
%.o: %.m
$(COMPILE.m) $(OUTPUT_OPTION) $<
%: %.m
$(LINK.m) $^ $(LOADLIBES) $(LDLIBS) -o $@
Makefile
복사
CC = cc # c compiler
COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
LINK.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
LINK.o = $(CC) $(LDFLAGS) $(TARGET_ARCH)
%.o: %.c
$(COMPILE.c) $(OUTPUT_OPTION) $<
%: %.c
$(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@
%: %.o
$(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@
Makefile
복사
C++
CXX = g++ # c++ compiler
COMPILE.C = $(COMPILE.cc)
COMPILE.cpp = $(COMPILE.cc)
COMPILE.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
LINK.C = $(LINK.cc)
LINK.cpp = $(LINK.cc)
LINK.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
%.o: %.C
$(COMPILE.C) $(OUTPUT_OPTION) $<
%.o: %.cc
$(COMPILE.cc) $(OUTPUT_OPTION) $<
%.o: %.cpp
$(COMPILE.cpp) $(OUTPUT_OPTION) $<
%: %.C
$(LINK.C) $^ $(LOADLIBES) $(LDLIBS) -o $@
%: %.cc
$(LINK.cc) $^ $(LOADLIBES) $(LDLIBS) -o $@
%: %.cpp
$(LINK.cpp) $^ $(LOADLIBES) $(LDLIBS) -o $@
Makefile
복사
•
코드를 분석하여 프로그램 오류, 버그, 스타일 오류, 의심스러운 구조체에 플래그 설정
LINT = lint
LINT.c = $(LINT) $(LINTFLAGS) $(CPPFLAGS) $(TARGET_ARCH)
%.ln: %.c
$(LINT.c) -C $* $<
Makefile
복사
lex, yacc
•
파서를 만들 때 주로 사용됨
LEX = lex # lexical analyzer generator
LEX.l = $(LEX) $(LFLAGS) -t
LEX.m = $(LEX) $(LFLAGS) -t
%.c: %.l
@$(RM) $@
$(LEX.l) $< > $@
%.r: %.l
$(LEX.l) $< > $@
mv -f lex.yy.r $@
%.ln: %.l
@$(RM) $*.c
$(LEX.l) $< > $*.c
$(LINT.c) -i $*.c -o $@
$(RM) $*.c
Makefile
복사
YACC = yacc # yet another compiler
YACC.m = $(YACC) $(YFLAGS)
YACC.y = $(YACC) $(YFLAGS)
%.m: %.ym
$(YACC.m) $<
mv -f y.tab.c $@
%.c: %.y
$(YACC.y) $<
mv -f y.tab.c $@
%.ln: %.y
$(YACC.y) $<
$(LINT.c) -C$* y.tab.c
$(RM) y.tab.c
Makefile
복사
Pascal
PC = pc # pascal compiler
COMPILE.p = $(PC) $(PFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
LINK.p = $(PC) $(PFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
%.o: %.p
$(COMPILE.p) $(OUTPUT_OPTION) $<
%: %.p
$(LINK.p) $^ $(LOADLIBES) $(LDLIBS) -o $@
Makefile
복사
modular-2 compiler
M2C = m2c # modular-2 compiler
COMPILE.mod = $(M2C) $(M2FLAGS) $(MODFLAGS) $(TARGET_ARCH)
COMPILE.def = $(M2C) $(M2FLAGS) $(DEFFLAGS) $(TARGET_ARCH)
%: %.mod
$(COMPILE.mod) -o $@ -e $@ $^
%.o: %.mod
$(COMPILE.mod) -o $@ $<
%.sym: %.def
$(COMPILE.def) -o $@ $<
Makefile
복사
Fortran, Ratfor
FC = f77 # fortran compiler
F77 = $(FC)
F77FLAGS = $(FFLAGS)
PREPROCESS.F = $(FC) $(FFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -F
PREPROCESS.r = $(FC) $(FFLAGS) $(RFLAGS) $(TARGET_ARCH) -F
COMPILE.f = $(FC) $(FFLAGS) $(TARGET_ARCH) -c
COMPILE.F = $(FC) $(FFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
COMPILE.r = $(FC) $(FFLAGS) $(RFLAGS) $(TARGET_ARCH) -c
LINK.F = $(FC) $(FFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
LINK.r = $(FC) $(FFLAGS) $(RFLAGS) $(LDFLAGS) $(TARGET_ARCH)
LINK.f = $(FC) $(FFLAGS) $(LDFLAGS) $(TARGET_ARCH)
%.f: %.F
$(PREPROCESS.F) $(OUTPUT_OPTION) $<
%.f: %.r
$(PREPROCESS.r) $(OUTPUT_OPTION) $<
%.o: %.f
$(COMPILE.f) $(OUTPUT_OPTION) $<
%.o: %.F
$(COMPILE.F) $(OUTPUT_OPTION) $<
%.o: %.r
$(COMPILE.r) $(OUTPUT_OPTION) $<
%: %.f
$(LINK.f) $^ $(LOADLIBES) $(LDLIBS) -o $@
%: %.F
$(LINK.F) $^ $(LOADLIBES) $(LDLIBS) -o $@
%: %.r
$(LINK.r) $^ $(LOADLIBES) $(LDLIBS) -o $@
Makefile
복사
makeinfo
MAKEINFO = makeinfo
%.info: %.texi
$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@
%.info: %.txinfo
$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@
%.info: %.texinfo
$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@
Makefile
복사
web
TEX = tex # tex processor
TEXI2DVI = texi2dvi # texinfo file processor
WEAVE = weave # web -> tex
TANGLE = tangle # web -> pascal
CWEAVE = cweave # cweb -> tex
CTANGLE = ctangle # cweb -> c
%.dvi: %.tex
$(TEX) $<
%.dvi: %.texinfo
$(TEXI2DVI) $(TEXI2DVI_FLAGS) $<
%.dvi: %.texi
$(TEXI2DVI) $(TEXI2DVI_FLAGS) $<
%.dvi: %.txinfo
$(TEXI2DVI) $(TEXI2DVI_FLAGS) $<
%.tex: %.web
$(WEAVE) $<
%.p: %.web
$(TANGLE) $<
%.tex: %.w %.ch
$(CWEAVE) $^ $@
%.tex: %.w
$(CWEAVE) $< - $@
%.c: %.w
$(CTANGLE) $< - $@
%.c: %.w %.ch
$(CTANGLE) $^ $@
Makefile
복사
소스코드 제어
1세대 | SCCS, RCS |
2세대 | CVS, SVN, Perforce Helix Core |
3세대 | Git, Mercurial, BitKeeper, Darcs, Monotone, Bazaar, Fossil, Pijul |
GET = get # SCCS(Source Code Control System) 파일 추출
CO = co # RCS(Revision Control System) 파일 추출
COFLAGS =
CHECKOUT,v = +$(if $(wildcard $@),,$(CO) $(COFLAGS) $< $@)
%:: %,v
$(CHECKOUT,v)
%:: RCS/%,v
$(CHECKOUT,v)
%:: RCS/%
$(CHECKOUT,v)
%:: s.%
$(GET) $(GFLAGS) $(SCCS_OUTPUT_OPTION) $<
%:: SCCS/s.%
$(GET) $(GFLAGS) $(SCCS_OUTPUT_OPTION) $<
Makefile
복사