Search
Duplicate

Makefile 내장 변수와 규칙

간단소개
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
태그
Scrap
8 more properties
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