Skip to main content

Makefile

2024๋…„ 4์›” 21์ผAbout 4 minShellArticle(s)blogdevkuma.comshbashccppgnu

Makefile ๊ด€๋ จ

Shell > Article(s)

Article(s)

Makefile | devkuma

Makefile์€ UNIX ๊ณ„์—ด OS์—์„œ ์ผ๋ฐ˜์ ์ธ ๋นŒ๋“œ ๋„๊ตฌ์ธ 'make'(make ๋ช…๋ น์–ด)์— ์‹คํ–‰ํ•  ์ ˆ์ฐจ๋ฅผ ๊ธฐ์ˆ ํ•œ ํ…์ŠคํŠธ ํŒŒ์ผ์ด๋‹ค.

.Makefile์€ UNIX ๊ณ„์—ด OS์—์„œ ์ผ๋ฐ˜์ ์ธ ๋นŒ๋“œ ๋„๊ตฌ์ธ make์— ์‹คํ–‰ํ•  ์ ˆ์ฐจ๋ฅผ ๊ธฐ์ˆ ํ•œ ํ…์ŠคํŠธ ํŒŒ์ผ์ด๋‹ค.


๊ฐœ์š”

make๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•œ ์†Œ์Šค ์ฝ”๋“œ์—์„œ ์ตœ์ข… ์‹คํ–‰ํŒŒ์ผ์„ ์–ป๊ธฐ ์œ„ํ•ด ์ปดํŒŒ์ผ, ๋งํฌ ๋“ฑ ์ผ๋ จ์˜ ๋‹จ๊ณ„๋ฅผ ์—ฐ์†์ ์œผ๋กœ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•ด์ฃผ๋Š” '๋นŒ๋“œ ๋„๊ตฌ'์˜ ํ•˜๋‚˜๋กœ, ์˜ค๋ž˜์ „๋ถ€ํ„ฐ ๋ฆฌ๋ˆ…์Šค ๋“ฑ ์œ ๋‹‰์Šค ๊ณ„์—ด OS์—์„œ ํ‘œ์ค€์œผ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค.

make์—์„œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜ํ–‰ํ•˜๊ณ ์ž ํ•˜๋Š” ์ผ๋ จ์˜ ์ ˆ์ฐจ๋ฅผ Makefile์— ๊ธฐ์ˆ ํ•˜๊ณ , make ๋ช…๋ น์–ด์— ์ด๋ฅผ ์ฃผ๋ฉด ๋‚ด์šฉ์„ ํ•ด์„ํ•˜์—ฌ ๋ช…๋ น์–ด ์‹คํ–‰ ๋“ฑ์„ ์—ฐ์†์ ์œผ๋กœ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, make ๋ช…๋ น์–ด ํ•œ ๋ฒˆ ์‹คํ–‰์œผ๋กœ ์‹คํ–‰ํŒŒ์ผ ์ƒ์„ฑ์ด ์™„๋ฃŒ๋œ๋‹ค.


Makefile์ด๋ž€?

Makefile์—๋Š” ์ปดํŒŒ์ผ๋Ÿฌ, ์†Œ์Šค ํŒŒ์ผ, ์ƒ์„ฑ๋ฌผ, ๋นŒ๋“œ ์ˆœ์„œ, ๋นŒ๋“œ ์ˆœ์„œ, ์ข…์†์„ฑ ๋“ฑ์„ ๊ธฐ์ˆ ํ•˜๊ณ , make ๋ช…๋ น์„ ์‹คํ–‰๋งŒ ํ•˜๋ฉด ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ ๋‚ด์šฉ์„ ๋ณด๋ฉด ํ”„๋กœ๊ทธ๋žจ ๋นŒ๋“œ ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ make๋Š” ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•œ ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ ํŒ๋‹จํ•ด ์ปดํŒŒ์ผ ํšŸ์ˆ˜๋ฅผ ์ตœ์†Œํ™”ํ•ด ๊ฐœ๋ฐœ ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ ๋ช…ํ•œ GNU์—์„œ ์ œ๊ณตํ•˜๋Š” GNU Make์˜ Home Page์— ๋”ฐ๋ฅด๋ฉด Make๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ Tool์ด๋ผ๊ณ  ํ•œ๋‹ค.

GNU Make is a tool which controls the generation of executables and other non-source files of a program from the program's source files.

์ด์— ๋”ฐ๋ฅด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์žฅ์ ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

Make - GNU Project - Free Software Foundation

GNU Make is a tool which controls the generation of executables and other non-source files of a program from the program's source files.

Makefile ๊ธฐ๋ณธ ์ž‘์„ฑ๋ฒ•

๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” C/ C++์„ ๋นŒ๋“œํ•  ๋•Œ make๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์œ ์šฉํ•˜๋‹ค. make๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋Œ€์ƒ Makefile์ด ํ•„์š”ํ•œ๋ฐ, ์ด๋ฒˆ์—๋Š” ๊ทธ ์ž‘์„ฑ๋ฒ•์„ ์†Œ๊ฐœํ•œ๋‹ค.

Makefile์˜ ๊ธฐ๋ณธ ๊ตฌ๋ฌธ์€ ๋‘ ์ค„๋กœ ํ•œ ๋‹จ์œ„์ด๋ฉฐ, ์œ—์ค„์— Target: SourceFile, ์•„๋žซ์ค„์— '์‹คํ–‰ํ•  ๋ช…๋ น์–ด(๋งจ ์•ž์— ํƒญ ๋ฌธ์ž)'๋ฅผ ๊ฐ๊ฐ ๊ธฐ์ˆ ํ•œ๋‹ค. ์ค„ ๋ฐ”๊ฟˆ์„ ;(์„ธ๋ฏธ์ฝœ๋ก )์œผ๋กœ ๋Œ€์ฒดํ•˜์—ฌ ํ•œ ์ค„๋กœ ๋ฌถ์„ ์ˆ˜๋„ ์žˆ๋‹ค. ๋ณ€์ˆ˜๋ช…=๊ฐ’ ํ˜•ํƒœ๋กœ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ํŒŒ์ผ๋ช… ๋“ฑ์˜ ์ง€์ •์— ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜์กด ๊ด€๊ณ„๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค.

Target : [Prerequisites]
  Recipe

๋นŒ๋“œํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น์–ด๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทœ์น™์— ๋”ฐ๋ผ ์ž‘์„ฑํ•œ๋‹ค.

Target: SourceFile
  Command

๊ฐ„๋‹จํ•œ ์˜ˆ๋กœ ๋“ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

hello: hello.c
  gcc -o hello hello.c

๊ทธ๋Ÿฌ๊ณ , ์ƒ์„ฑ๋œ ํŒŒ์ผ์„ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ๋ณต์‚ฌํ•˜๋Š” ๋ช…๋ น๋„ ์ถ”๊ฐ€๋กœ ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

clean:
  rm -f *~ hello 
install: hello 
  install -s hello.exe Path

make๋ฅผ ์‹คํ–‰ํ•  ๋•Œ์— ์•„๋ฌด๋Ÿฐ ์ธ์ž๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๋งจ ์œ„์— ์žˆ๋Š” Target์ด ์‹คํ–‰๋œ๋‹ค. ์œ„์˜ clean์ด๋‚˜ install์„ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ธ์ˆ˜๋ฅผ ์ง€์ •ํ•œ๋‹ค. shell make clean make install Makefile์ด ์•„๋‹Œ ๋‹ค๋ฅธ ํŒŒ์ผ์„ Makefile๋กœ ์ง€์ •ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, -f ์˜ต์…˜์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

make -f sample.mk

๋˜ํ•œ, ์š”์†Œ๋ฅผ ๋ณ€์ˆ˜๋กœ ์ทจ๊ธ‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ„๋‹จํ•œ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

CXX            = g++
OPTIMIZE       = -O3
CFLAGS         = -IC:/Users/include \
  -IC:/Python/include 
DEST           = C:/Users/Local
LDFLAGS        = -LC:/Users/Local/libs
LIBS           = -lpython
OBJS           = hello

all: clean $(PROGRAM) install
$(PROGRAM): $(OBJS)
  $(CXX) -o $(OBJS) $(OBJS).cpp $(CFLAGS) $(LDFLAGS) $(LIBS)
clean: rm -f *~ $(OBJS)
install: $(PROGRAM)
  install -s $(OBJS).exe $(DEST)

Makefile ๋ณ€์ˆ˜

Makefile์˜ ๋ณ€์ˆ˜๋Š” ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ์•”๋ฌต์  ๋ณ€์ˆ˜์™€ ์ƒˆ๋กœ ์ •์˜๋˜๋Š” ๋ณ€์ˆ˜์ด๋‹ค. ์•”๋ฌต์  ๋ณ€์ˆ˜๋Š” ์•”๋ฌต์  ๊ทœ์น™์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํŠน์ • ์‚ฌ์ „ ์ •์˜๋œ ๋ณ€์ˆ˜๋ฅผ ๋งํ•œ๋‹ค.

์•”๋ฌต์  ๊ทœ์น™์ด๋ž€?

๋‹ค์–‘ํ™”๋˜๋Š” ๊ทœ์น™์€ ๊ตณ์ด ์„ค๋ช…ํ•˜์ง€ ์•Š์•„๋„ ๋ฏธ๋ฆฌ ์•”๋ฌต์ ์ธ ์ •์˜๋œ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋‹ค.

.C ์†Œ์Šค ํŒŒ์ผ์˜ ์ปดํŒŒ์ผ์— ์‚ฌ์šฉ๋˜๋Š” ๋ ˆ์‹œํ”ผ๋Š” ์‹ค์ œ๋กœ $(CC) -c $(CFLAGS) $(CPPFLAGS)๋ผ๋Š” ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์žˆ๋‹ค. CC, CFLAGS, CPPFLAGS๋Š” ๋ฏธ๋ฆฌ ๋ณ€์ˆ˜๋กœ ์ •์˜๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ด ๋‚ด์šฉ์„ ๋ฎ์–ด์จ์„œ ์ปดํŒŒ์ผ ๋ ˆ์‹œํ”ผ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์•”๋ฌต์  ๋ณ€์ˆ˜ ๋ชฉ๋ก

์ฃผ์š”ํ•œ ๋ณ€์ˆ˜ ํ•ญ๋ชฉ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

๋ณ€์ˆ˜ ์ด๋ฆ„์„ค๋ช…default
AR์•„์นด์ด๋ธŒ ๋ฉ”์ธํ…Œ๋„Œ์Šค ํ”„๋กœ๊ทธ๋žจar
AS์–ด์…ˆ๋ธ”๋ฆฌ ์‹คํ–‰ ํ”„๋กœ๊ทธ๋žจas
CCC ํ”„๋กœ๊ทธ๋žจ ์ปดํŒŒ์ผ ํ”„๋กœ๊ทธ๋žจcc
CXXC++ ํ”„๋กœ๊ทธ๋žจ ์ปดํŒŒ์ผ ํ”„๋กœ๊ทธ๋žจg++
CORCS์˜ ๋ฐฐํฌ ํ”„๋กœ๊ทธ๋žจco
CPPC ์ „์ฒ˜๋ฆฌ ํ”„๋กœ๊ทธ๋žจ, ํ‘œ์ค€ ์ถœ๋ ฅ์— ๊ฒฐ๊ณผ$(CC) -E
FCFortranr๊ณผ Ratfor ํ”„๋กœ๊ทธ๋žจ์„ ์œ„ํ•œ ์ปดํŒŒ์ผ ๋˜๋Š” ์ „์ฒ˜๋ฆฌ๊ธฐ ํ”„๋กœ๊ทธ๋žจf77
GETSCCS์˜ ๋ฐฐํฌ ํ”„๋กœ๊ทธ๋žจget
LEXLex ๋ฌธ๋ฒ•์„ C ๋˜๋Š” Ratfor๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจlex
PCPascal ํ”„๋กœ๊ทธ๋žจ ์ปดํŒŒ์ผ ํ”„๋กœ๊ทธ๋žจpc
YACCYacc ๋ฌธ๋ฒ•์„ C ๋˜๋Š” Ratfor๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจyacc
YACCRYacc ๋ฌธ๋ฒ•์„ Ratfor๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจyacc -r
MAKEINFOTexinfo ์†Œ์Šค ํŒŒ์ผ์„ Info ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจmakeinfo
TEXTeX ์†Œ์Šค์—์„œ TeX DVI ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ํ”„๋กœ๊ทธ๋žจtex
TEXI2DVITexinfo ์†Œ์Šค์—์„œ TeX DVI ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ํ”„๋กœ๊ทธ๋žจtexi2dvi
WEAVE์›น์„ TeX๋กœ ๋ฒˆ์—ญํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจweave
CWEAVEC Web์„ TeX๋กœ ๋ฒˆ์—ญํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจcweave
TANGLE์›น์„ ํŒŒ์Šค์นผ๋กœ ๋ฒˆ์—ญํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจtangle
CTANGLEC ์›น์„ C๋กœ ๋ฒˆ์—ญํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจctangle
RMํŒŒ์ผ์„ ์‚ญ์ œํ•˜๋Š” ๋ช…๋ นrm -f
ARFLAGS์•„์นด์ด๋ธŒ ์œ ์ง€ ๋ณด์ˆ˜ ํ”„๋กœ๊ทธ๋žจ์— ์ œ๊ณตํ•˜๋Š” ํ”Œ๋ž˜๊ทธrv
ASFLAGS์–ด์…ˆ๋ธ”๋Ÿฌ์— ์ฃผ๋Š” ํ”Œ๋ž˜๊ทธ(.s ๋˜๋Š” .S ํŒŒ์ผ์— ๋Œ€ํ•ด ๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ๊ฒฝ์šฐ)์—†์Œ
CFLAGSC ์ปดํŒŒ์ผ๋Ÿฌ์— ์ฃผ๋Š” ํ”Œ๋ž˜๊ทธ์—†์Œ
CXXFLAGSC++ ์ปดํŒŒ์ผ๋Ÿฌ์— ์ฃผ๋Š” ํ”Œ๋ž˜๊ทธ์—†์Œ
COFLAGSRCS co ํ”„๋กœ๊ทธ๋žจ์— ์ฃผ๋Š” ํ”Œ๋ž˜๊ทธ์—†์Œ
CPPFLAGSC ํ”„๋ฆฌํ”„๋กœ์„ธ์„œ ๋ฐ ํ”„๋กœ๊ทธ๋žจ์— ์ œ๊ณตํ•˜๋Š” ํ”Œ๋ž˜๊ทธ(C ๋ฐ Fortran ์ปดํŒŒ์ผ๋Ÿฌ์—†์Œ
FFLAGFortran ์ปดํŒŒ์ผ๋Ÿฌ์— ์ฃผ๋Š” ํ”Œ๋ž˜๊ทธ์—†์Œ
GFLAGSCCS get ํ”„๋กœ๊ทธ๋žจ์— ์ฃผ๋Š” ํ”Œ๋ž˜๊ทธ์—†์Œ
LDFLAGS๋ง์ปค ld๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ์— ์ฃผ๋Š” ํ”Œ๋ž˜๊ทธ์—†์Œ
LFLAGSLex์—๊ฒŒ ์ฃผ๋Š” ํ”Œ๋ž˜๊ทธ์—†์Œ
PFLAGSPascal ์ปดํŒŒ์ผ๋Ÿฌ์— ์ฃผ๋Š” ํ”Œ๋ž˜๊ทธ์—†์Œ
RFLAGSRatfor ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ Fortran ์ปดํŒŒ์ผ๋Ÿฌ์— ์ œ๊ณตํ•˜๋Š” ํ”Œ๋ž˜๊ทธ์—†์Œ
YFLAGSYacc์—๊ฒŒ ์ฃผ๋Š” ํ”Œ๋ž˜๊ทธ์—†์Œ
GNU make

Implicit Variables

๋ณ€์ˆ˜ ์ •์˜

Makefile ๋‚ด์—์„œ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

๊ธฐํ˜ธ์ƒ์„ธ
=์žฌ๊ท€์ ์œผ๋กœ ํ™•์žฅ๋˜๋Š” ๋ณ€์ˆ˜
:=๋‹จ์ˆœํ•˜๊ฒŒ ์ „๊ฐœ๋˜๋Š” ๋ณ€์ˆ˜
foo = $(bar)
bar = $(ugh)
ugh = Huh?

all:
  echo $(foo) # => Hub?

๋ณ€์ˆ˜ ํ˜ธ์ถœ

$(name), ๋˜๋Š” ${name}

objects = program.o foo.o utils.o # => program.o foo.o utils.o
program : $(objects)
        cc -o program $(objects) 

$(objects) : defs.h

๊ทœ์น™ ๋‚ด์—์„œ ์ž‘๋™ํ•˜๋Š” ์ž๋™ ๋ณ€์ˆ˜

์ž๋™๋ณ€์ˆ˜๋Š” ํƒ€๊ฒŸ๊ณผ ์ „์ œ์กฐ๊ฑด์„ ํ˜ธ์ถœํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ‘œ๊ธฐ๋ฒ•์ด๋‹ค. ์•ฝ์–ด๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์กฐ๊ฑด์— ๋”ฐ๋ผ ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ์ฐธ์กฐํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ ๊ฒƒ๋„ ์žˆ๋‹ค.

$@ ๋Œ€์ƒ ์ด๋ฆ„

ํ˜„์žฌ ํƒ€์ผ“ ์ด๋ฆ„.

๋ณ€์ˆ˜์„ค๋ช…
$@๊ทœ์น™์˜ ํƒ€๊ฒŸ ์ด๋ฆ„์ด๋‹ค. $(@)๋กœ ์จ๋„ ๊ฐ™์€ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„๋‹ค.
(@D)๊ทœ์น™ ํƒ€๊ฒŸ์˜ ๋””๋ ‰ํ† ๋ฆฌ ์ด๋ฆ„.
(@F)๊ทœ์น™ ํƒ€๊ฒŸ์˜ ํŒŒ์ผ ์ด๋ฆ„.
aaa/bbb/foo:
  echo $@     # => aaa/bbb/foo
  echo $(@D)  # => aaa/bbb
  echo $(@F)  # => foo

$< ์ข…์†์„ฑ์˜ ์ฒซ ๋ฒˆ์งธ ์ด๋ฆ„

์ „์ œ ์กฐ๊ฑด์˜ ์ฒซ ๋ฒˆ์งธ ์ด๋ฆ„์ด๋‹ค.

๋ณ€์ˆ˜์„ค๋ช…
$<์ „์ œ ์กฐ๊ฑด์˜ ์ฒซ ๋ฒˆ์งธ ์ด๋ฆ„์ด๋‹ค. $(<)๋กœ ์จ๋„ ๊ฐ™์€ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„๋‹ค.
$(<D)์ „์ œ ์กฐ๊ฑด์˜ ์ฒซ ๋ฒˆ์งธ ๋””๋ ‰ํ† ๋ฆฌ ์ด๋ฆ„.
$(<F)์ „์ œ ์กฐ๊ฑด์˜ ์ฒซ ๋ฒˆ์งธ ํŒŒ์ผ ์ด๋ฆ„.
output/foo: input/bar input/baz
  echo $<     # => input/bar
  echo $(<D)  # => input
  echo $(<F)  # => bar

$^ ๋Œ€์ƒ์˜ ๋ชจ๋“  ์ข…์†์„ฑ ์ด๋ฆ„

๋Œ€์ƒ์˜ ๋ชจ๋“  ์ „์ œ ์กฐ๊ฑด์˜ ์ด๋ฆ„์ด๋‹ค.

๋ณ€์ˆ˜์„ค๋ช…
$^๋Œ€์ƒ์˜ ์ „์ œ ์กฐ๊ฑด์˜ ์ด๋ฆ„์ด๋‹ค. $(^)๋กœ ์จ๋„ ๊ฐ™์€ ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š”๋‹ค.
$(^D)๋Œ€์ƒ ์ „์ œ ์กฐ๊ฑด์˜ ๋””๋ ‰ํ† ๋ฆฌ ์ด๋ฆ„.
$(^F)๋Œ€์ƒ ์ „์ œ ์กฐ๊ฑด์˜ ํŒŒ์ผ ์ด๋ฆ„.
output/foo: input/bar input/baz
  echo $^     # => input/bar input/baz
  echo $(^D)  # => input input
  echo $(^F)  # => bar baz

$? ๋Œ€์ƒ๋ณด๋‹ค ํƒ€์ž„์Šคํƒฌํ”„๊ฐ€ ์ƒˆ๋กœ์šด ์ข…์†์„ฑ์˜ ์ด๋ฆ„

ํƒ€๊ฒŸ๋ณด๋‹ค ํƒ€์ž„์Šคํƒฌํ”„๊ฐ€ ์ƒˆ๋กœ์šด ์ „์ œ ์กฐ๊ฑด์˜ ์ด๋ฆ„์ด๋‹ค.

๋ณ€์ˆ˜์„ค๋ช…
$?๋Œ€์ƒ๋ณด๋‹ค ์ƒˆ๋กœ์šด ๋ชจ๋“  ์ „์ œ ์กฐ๊ฑด์˜ ์ด๋ฆ„์ด๋‹ค. $(?) ๋กœ ์จ๋„ ๊ฐ™์€ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„๋‹ค.
$(?D)๋Œ€์ƒ๋ณด๋‹ค ์ƒˆ๋กœ์šด ๋ชจ๋“  ์ „์ œ ์กฐ๊ฑด์˜ ๋””๋ ‰ํ† ๋ฆฌ ์ด๋ฆ„.
$(?F)๋Œ€์ƒ๋ณด๋‹ค ์ƒˆ๋กœ์šด ๋ชจ๋“  ์ „์ œ ์กฐ๊ฑด์˜ ํŒŒ์ผ ์ด๋ฆ„.
output/foo: input/bar input/baz
  echo $?     # => input/bar
  echo $(?D)  # => input
  echo $(?F)  # => bar

$+ ๋Œ€์ƒ์˜ ๋ชจ๋“  ์ข…์†์„ฑ ์ด๋ฆ„

๋Œ€์ƒ์˜ ๋ชจ๋“  ์ „์ œ ์กฐ๊ฑด์˜ ์ด๋ฆ„(์ค‘๋ณต์ด ์žˆ์–ด๋„ ์ƒ๋žตํ•˜์ง€ ์•Š์Œ). ์ผ๋ฐ˜์ ์œผ๋กœ $^๊ฐ€ ๋” ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.

๋ณ€์ˆ˜์„ค๋ช…
$+์ค‘๋ณต์ด ํฌํ•จ๋œ ๋Œ€์ƒ์˜ ์ „์ œ ์กฐ๊ฑด์˜ ์ด๋ฆ„์ด๋‹ค. $(+)๋กœ ์จ๋„ ๊ฐ™์€ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„๋‹ค.
$(+D)์ค‘๋ณต์ด ํฌํ•จ๋œ ๋Œ€์ƒ ์ „์ œ ์กฐ๊ฑด์˜ ๋””๋ ‰ํ† ๋ฆฌ ์ด๋ฆ„.
$(+F)์ค‘๋ณต์ด ํฌํ•จ๋œ ๋Œ€์ƒ ์ „์ œ์กฐ๊ฑด์˜ ํŒŒ์ผ๋ช….
output/foo: input/baz input/baz input/baz
  echo $+     # => input/baz input/baz input/baz
  echo $(+D)  # => input input input
  echo $(+F)  # => baz baz baz

$* ๋Œ€์ƒ์˜ ํŒจํ„ด ๋งค์นญ๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ถ€๋ถ„

๋Œ€์ƒ์˜ ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค. ๊ด€๋ จ ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ๋•Œ ๋“ฑ์— ์œ ์šฉํ•˜๋‹ค.

๋ณ€์ˆ˜์„ค๋ช…
$*๋Œ€์ƒ์˜ ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค. $(*)๋กœ ์จ๋„ ๊ฐ™์€ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„๋‹ค.
$(*D)๋Œ€์ƒ์˜ ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ถ€๋ถ„์˜ ๋””๋ ‰ํ† ๋ฆฌ ์ด๋ฆ„.
$(*F)๋Œ€์ƒ์˜ ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ถ€๋ถ„์˜ ํŒŒ์ผ๋ช….

Makefile์˜ ํ•จ์ˆ˜

Make์—๋Š” Makefile ๋‚ด์—์„œ ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ์™€ ์กฐ๊ฑด๋ถ€ ๋ถ„๊ธฐ๋ฅผ ์œ„ํ•œ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ์ฃผ์š” ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

Functions (GNU make)

8 Functions for Transforming Text

ํ…์ŠคํŠธ ๋ณ€ํ™˜์„ ์œ„ํ•œ ํ•จ์ˆ˜

ํ•จ์ˆ˜๋Š” makefile์—์„œ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•  ๋•Œ, ํ…์ŠคํŠธ ์กฐ์ž‘์„ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์ฃผ์š” ํ•จ์ˆ˜๋ฅผ ์†Œ๊ฐœํ•œ๋‹ค.

ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ๋ฌธ์œผ๋กœ ํ˜ธ์ถœ๋œ๋‹ค.

$(function arguments)
${function arguments}
GNU make

8.2 Functions for String Substitution and Analysis

shell ํ•จ์ˆ˜

์‰˜์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

files := $(shell echo *.c)
INCLUDE := $(shell find $(INCDIRS) -type d)
SRCDIR = ./srcs
SRCS := $(shell find $(SRCDIR) -name *.c)
all:
  echo $(files) # => hoge.c foo.c
  echo $(INCLUDE) # => include
  echo $(SRCDIR) # => ./srcs
  echo $(SRCS) # => hoge.c foo.c

RESULT = $(shell seq 1 10)
all:
  echo $(RESULT)  # => 1 2 3 4 5 6 7 8 9 10

addprefix ํ•จ์ˆ˜

์•ž์— ๋ฌธ์ž์—ด์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. -l ์˜ต์…˜ ๋“ฑ์„ ์‚ฌ์šฉํ•  ๋•Œ ์œ ์šฉํ•  ๊ฒƒ ๊ฐ™๋‹ค.

$(addprefix prefix,names...)

FILES := foo bar
all:
  echo $(addprefix src/,$(FILES))  # => src/foo src/bar

dir ํ•จ์ˆ˜

ํŒŒ์ผ ์ด๋ฆ„์— ๋Œ€ํ•œ ํ•จ์ˆ˜. ๋””๋ ‰ํ† ๋ฆฌ๋งŒ ์ถ”์ถœํ•œ๋‹ค.

$(dir names...)

names์˜ ํŒŒ์ผ๋ช…์—์„œ ๋””๋ ‰ํ† ๋ฆฌ ๋ถ€๋ถ„์„ ์ถ”์ถœํ•œ๋‹ค. ํŒŒ์ผ๋ช…์˜ ๋””๋ ‰ํ† ๋ฆฌ ๋ถ€๋ถ„์€ ๋งˆ์ง€๋ง‰ ์Šฌ๋ž˜์‹œ ์ด์ „์˜ ๋ชจ๋“  ๋ถ€๋ถ„์ด๋‹ค. ์Šฌ๋ž˜์‹œ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ฉด ๋””๋ ‰ํ† ๋ฆฌ ๋ถ€๋ถ„์€ ๋ฌธ์ž์—ด ./๊ฐ€ ๋œ๋‹ค.

FILES := src/hoge.c src/hoge.h index.html
all:
  echo $(dir $(FILES))  # => src/ src/ ./

notdir ํ•จ์ˆ˜

ํŒŒ์ผ๋ช… ๊ฒ€์ƒ‰ํ•˜๋Š” ํ•จ์ˆ˜

FILES := ./dir/hoge.txt
all:
  echo $(notdir $(FILES))  # => hoge.txt

๋Œ€์ฒด ์ฐธ์กฐ

๋ฐ”๊พธ๊ธฐ ์ฐธ์กฐ๋Š” ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์ง€์ •๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ ๋Œ€์ฒดํ•œ๋‹ค. ์ด๋Š” $(var: ๋Œ€์ฒด์ „ = ๋Œ€์ฒดํ›„) (๋˜๋Š” ${var: ๋Œ€์ฒด์ „ = ๋Œ€์ฒดํ›„})์˜ ํ˜•ํƒœ๋กœ ๋ณ€์ˆ˜ var์˜ ๊ฐ’์„ ๊ฐ€์ ธ์™€ ๋‹จ์–ด ๋์— ์žˆ๋Š” ๋ชจ๋“  a๋ฅผ b๋กœ ๋Œ€์ฒดํ•˜๊ณ  ๊ฒฐ๊ณผ ๋ฌธ์ž์—ด์„ ๋Œ€์ฒดํ•œ๋‹ค.

๊ทธ๋Ÿฌ๊ณ , ๋‹จ์–ด ๋‚ด ์ž„์˜์˜ ์ˆ˜์˜ ๋ฌธ์ž์™€ ์ผ์น˜ํ•˜๋Š” ์™€์ผ๋“œ์นด๋“œ ์—ญํ• ์„ ํ•œ๋‹ค. ๋Œ€์ฒด ์ฐธ์กฐ๋Š” patsubst ํ•จ์ˆ˜์˜ ์•ฝ์–ด์ด๋‹ค.

foo := a.o b.o c.o
bar := $(foo:%.o=%.c)

all:
  echo $(bar) # => a.c b.c c.c

patsubst ํ•จ์ˆ˜๋ฅผ ์ง€์ •ํ•œ ๊ฒฝ์šฐ

$(patsubst pattern(๋Œ€์ฒด์ „), replacement(๋Œ€์ฒดํ›„), text(๋Œ€์ƒ))
foo := a.o b.o c.o
bar := $(patsubst %.o,%.c,$(foo))

all:
    echo $(bar) # => a.c b.c c.c

realpath ํ•จ์ˆ˜

์กด์žฌํ•˜๋Š” ์ „์ฒด ๊ฒฝ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ

"$(realpath ./dir/hoge.txt)"//C:users/hoge/bin/hoge.txt

suffix ํ•จ์ˆ˜

ํ™•์žฅ์ž ๊ฐ€์ ธ์˜ค๊ธฐ

"$(suffix ./dir/hoge.txt)"//.txt

wildcard ํ•จ์ˆ˜

์™€์ผ๋“œ์นด๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์กด์žฌํ•˜๋Š” ํŒŒ์ผ๋ช… ๊ฒ€์ƒ‰

"$(suffix ./dir/*.txt)"//hoge.txt hogehoge.txt

์กฐ๊ฑด๋ถ€ ๋ถ„๊ธฐ๋ฅผ ์œ„ํ•œ ํ•จ์ˆ˜

if

์กฐ๊ฑด๋ถ€ ๋ถ„๊ธฐ

"$(if $(VAR1),$(exist),$(none))"

ifeq

์กฐ๊ฑด๋ถ€ ๋ถ„๊ธฐ๋ณ„ ์ž‘์„ฑ๋ฒ•

ifeq ($(CC),gcc)
  libs=$(libs_for_gcc)
else
  libs=$(normal_libs)
endif

Makefile ๋””๋ฒ„๊น… ๋ฐฉ๋ฒ•

GNU Make์˜ -n ์˜ต์…˜์€ Makefile์˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ถœ๋ ฅํ•œ๋‹ค.

Makefile์ด ์•„๋ž˜์™€ ๊ฐ™์ด ์ •์˜๋˜์–ด ์žˆ์„ ๋•Œ,

CC = gcc
OBJ = hoge.c
CFLAGS = -c $(OBJ)

์ฒ˜๋ฆฌ ์ถœ๋ ฅ

make ๋ช…๋ น์–ด -n ์˜ต์…˜์„ ์•„๋ž˜์™€ ๊ฐ™์ด ๋„ฃ์–ด ์‹คํ–‰ํ•˜๋ฉด, make๊ฐ€ ์–ด๋–ค ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š”์ง€ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

make -n
#
# gcc -c hoge.c -o hoge

์–ด๋–ป๊ฒŒ ์ž‘์„ฑ๋˜๋Š” ํ™•์ธ ํ• ๋•Œ, ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

warning ํ•จ์ˆ˜

make ์‹คํ–‰ ์‹œ ๋‚ด์šฉ์„ ์ถœ๋ ฅํ•ด ์ค€๋‹ค.

$(warning MAKE = $(MAKE))  # => Makefile:18: MAKE = /Library/Developer/CommandLineTools/usr/bin/make
$(warning CC = $(CC)) # => Makefile:19: CC = gcc
$(warning CFLAGS = $(CFLAGS)) # => Makefile:20: CFLAGS =  -Wall -Wextra -Werror

g++์™€ make์™€ cmake์˜ install ๋ฐฉ๋ฒ•

Windows์—์„œ ์„ค์น˜

Windows OS์—์„œ g++/gcc๋Š” MinGW๋ฅผ, make๋Š” GnuWin์„, cmake๋Š” cmake.zipinstall์„ ํ†ตํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •

์•„๋ž˜์˜ path ๋“ฑ์— ์„ค์น˜๋˜๋ฏ€๋กœ path๋ฅผ ํ†ตํ•ด ์„ค์น˜ํ•œ๋‹ค.

๋ฆฌ๋ˆ…์Šค์—์„œ ์„ค์น˜

์ผ๊ด„์ ์œผ๋กœ install
sudo apt install build-essential

์ •๋ฆฌ

Makefile ์ž‘์„ฑ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณด์•˜๋‹ค. ๋น„๋ง๋ก์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ด ๋‚˜๊ฐˆ ๊ฒƒ์ด๋‹ค.