Makefile
Makefile ๊ด๋ จ
.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๋ C ์ธ์ด๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ์ปดํ์ผ ์ธ์ด๋ ์ง์ํ๋ค.
Makefile
๊ธฐ๋ณธ ์์ฑ๋ฒ
๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ C/ C++์ ๋น๋ํ ๋ make
๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ฉํ๋ค. make
๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋์ Makefile
์ด ํ์ํ๋ฐ, ์ด๋ฒ์๋ ๊ทธ ์์ฑ๋ฒ์ ์๊ฐํ๋ค.
Makefile
์ ๊ธฐ๋ณธ ๊ตฌ๋ฌธ์ ๋ ์ค๋ก ํ ๋จ์์ด๋ฉฐ, ์์ค์ Target: SourceFile
, ์๋ซ์ค์ '์คํํ ๋ช
๋ น์ด(๋งจ ์์ ํญ ๋ฌธ์)'๋ฅผ ๊ฐ๊ฐ ๊ธฐ์ ํ๋ค. ์ค ๋ฐ๊ฟ์ ;
(์ธ๋ฏธ์ฝ๋ก )์ผ๋ก ๋์ฒดํ์ฌ ํ ์ค๋ก ๋ฌถ์ ์๋ ์๋ค. ๋ณ์๋ช
=๊ฐ
ํํ๋ก ๋ณ์๋ฅผ ์ ์ํ ์๋ ์์ผ๋ฉฐ, ํ์ผ๋ช
๋ฑ์ ์ง์ ์ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์์กด ๊ด๊ณ๋ฅผ ๊ธฐ๋กํ๋ ๋ถ๋ถ์ด๋ค.
Target : [Prerequisites]
Recipe
Target
- ํ๋ก๊ทธ๋จ์ ์ํด ์์ฑ๋๋ ํ์ผ์ ์ด๋ฆ์ด๋ค.
Prerequisites
- ์ ์ ์กฐ๊ฑด
- ํ๊ฒ์ ์์ฑํ๊ธฐ ์ํ ์ ๋ ฅ์ผ๋ก ์ฌ์ฉ๋๋ ํ์ผ์ด๋ค.
- ์ฌ๋ฌ ํ์ผ๋ ๊ฐ๋ฅํ๊ณ , ์๋ตํ ์๋ ์๋ค.
Recipe
- recipe๊ฐ ์ฑ๋ฆฝํ๊ธฐ ์ํด์๋ prerequisites๊ฐ ํ์ํ๋ค.
make
๊ฐ ์คํํ ์ก์ ์ด๋ค.- ์ฌ๋ฌ ์ค ๊ฐ๋ฅํ๋ค. (ํ์ ๋ถํ ํ ๊ฒฝ์ฐ
\
๋ฅผ ์ฌ์ฉํ๋ค) - ์ด ์์๋ Tab ์ ๋ ฅ์ ํ์์ด๋ค.
๋น๋ํ ๋ ์ฌ์ฉํ๋ ๋ช ๋ น์ด๋ฅผ ๋ค์๊ณผ ๊ฐ์ ๊ท์น์ ๋ฐ๋ผ ์์ฑํ๋ค.
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 |
CC | C ํ๋ก๊ทธ๋จ ์ปดํ์ผ ํ๋ก๊ทธ๋จ | cc |
CXX | C++ ํ๋ก๊ทธ๋จ ์ปดํ์ผ ํ๋ก๊ทธ๋จ | g++ |
CO | RCS์ ๋ฐฐํฌ ํ๋ก๊ทธ๋จ | co |
CPP | C ์ ์ฒ๋ฆฌ ํ๋ก๊ทธ๋จ, ํ์ค ์ถ๋ ฅ์ ๊ฒฐ๊ณผ | $(CC) -E |
FC | Fortranr๊ณผ Ratfor ํ๋ก๊ทธ๋จ์ ์ํ ์ปดํ์ผ ๋๋ ์ ์ฒ๋ฆฌ๊ธฐ ํ๋ก๊ทธ๋จ | f77 |
GET | SCCS์ ๋ฐฐํฌ ํ๋ก๊ทธ๋จ | get |
LEX | Lex ๋ฌธ๋ฒ์ C ๋๋ Ratfor๋ก ๋ณํํ๋ ํ๋ก๊ทธ๋จ | lex |
PC | Pascal ํ๋ก๊ทธ๋จ ์ปดํ์ผ ํ๋ก๊ทธ๋จ | pc |
YACC | Yacc ๋ฌธ๋ฒ์ C ๋๋ Ratfor๋ก ๋ณํํ๋ ํ๋ก๊ทธ๋จ | yacc |
YACCR | Yacc ๋ฌธ๋ฒ์ Ratfor๋ก ๋ณํํ๋ ํ๋ก๊ทธ๋จ | yacc -r |
MAKEINFO | Texinfo ์์ค ํ์ผ์ Info ํ์ผ๋ก ๋ณํํ๋ ํ๋ก๊ทธ๋จ | makeinfo |
TEX | TeX ์์ค์์ TeX DVI ํ์ผ์ ๋ง๋๋ ํ๋ก๊ทธ๋จ | tex |
TEXI2DVI | Texinfo ์์ค์์ TeX DVI ํ์ผ์ ๋ง๋๋ ํ๋ก๊ทธ๋จ | texi2dvi |
WEAVE | ์น์ TeX๋ก ๋ฒ์ญํ๋ ํ๋ก๊ทธ๋จ | weave |
CWEAVE | C Web์ TeX๋ก ๋ฒ์ญํ๋ ํ๋ก๊ทธ๋จ | cweave |
TANGLE | ์น์ ํ์ค์นผ๋ก ๋ฒ์ญํ๋ ํ๋ก๊ทธ๋จ | tangle |
CTANGLE | C ์น์ C๋ก ๋ฒ์ญํ๋ ํ๋ก๊ทธ๋จ | ctangle |
RM | ํ์ผ์ ์ญ์ ํ๋ ๋ช ๋ น | rm -f |
ARFLAGS | ์์นด์ด๋ธ ์ ์ง ๋ณด์ ํ๋ก๊ทธ๋จ์ ์ ๊ณตํ๋ ํ๋๊ทธ | rv |
ASFLAGS | ์ด์
๋ธ๋ฌ์ ์ฃผ๋ ํ๋๊ทธ(.s ๋๋ .S ํ์ผ์ ๋ํด ๋ช
์์ ์ผ๋ก ํธ์ถ๋๋ ๊ฒฝ์ฐ) | ์์ |
CFLAGS | C ์ปดํ์ผ๋ฌ์ ์ฃผ๋ ํ๋๊ทธ | ์์ |
CXXFLAGS | C++ ์ปดํ์ผ๋ฌ์ ์ฃผ๋ ํ๋๊ทธ | ์์ |
COFLAGS | RCS co ํ๋ก๊ทธ๋จ์ ์ฃผ๋ ํ๋๊ทธ | ์์ |
CPPFLAGS | C ํ๋ฆฌํ๋ก์ธ์ ๋ฐ ํ๋ก๊ทธ๋จ์ ์ ๊ณตํ๋ ํ๋๊ทธ(C ๋ฐ Fortran ์ปดํ์ผ๋ฌ | ์์ |
FFLAG | Fortran ์ปดํ์ผ๋ฌ์ ์ฃผ๋ ํ๋๊ทธ | ์์ |
GFLAG | SCCS get ํ๋ก๊ทธ๋จ์ ์ฃผ๋ ํ๋๊ทธ | ์์ |
LDFLAGS | ๋ง์ปค ld๋ฅผ ํธ์ถํ ๋ ์ปดํ์ผ๋ฌ์ ์ฃผ๋ ํ๋๊ทธ | ์์ |
LFLAGS | Lex์๊ฒ ์ฃผ๋ ํ๋๊ทธ | ์์ |
PFLAGS | Pascal ์ปดํ์ผ๋ฌ์ ์ฃผ๋ ํ๋๊ทธ | ์์ |
RFLAGS | Ratfor ํ๋ก๊ทธ๋จ์ ๋ํ Fortran ์ปดํ์ผ๋ฌ์ ์ ๊ณตํ๋ ํ๋๊ทธ | ์์ |
YFLAGS | Yacc์๊ฒ ์ฃผ๋ ํ๋๊ทธ | ์์ |
๋ณ์ ์ ์
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
๋ด์์ ๋ฌธ์์ด ์ฒ๋ฆฌ์ ์กฐ๊ฑด๋ถ ๋ถ๊ธฐ๋ฅผ ์ํ ํจ์๊ฐ ์๋ค. ์ฃผ์ ํจ์๋ ๋ค์๊ณผ ๊ฐ๋ค.
ํ ์คํธ ๋ณํ์ ์ํ ํจ์
ํจ์๋ makefile
์์ ๋ณ์๋ฅผ ์ ์ํ ๋, ํ
์คํธ ์กฐ์์ ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค. ์ฌ๊ธฐ์๋ ์ฃผ์ ํจ์๋ฅผ ์๊ฐํ๋ค.
ํจ์๋ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ๋ฌธ์ผ๋ก ํธ์ถ๋๋ค.
$(function arguments)
${function arguments}
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์ ํตํด ์ฌ์ฉํ ์ ์๋ค.
installer๋ฅผ Downloadํ์ฌ ์ค์นํ๋ค.
- installer๋ฅผ Downloadํ์ฌ ์ค์นํ๋ค.
C:Program Files (x86)\GnuWin32\bin
์ผ๋ก ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๋ค.
- installer๋ฅผ Downloadํ์ฌ ์ค์นํ๋ค.
choco install mingw
choco install make
ํ๊ฒฝ ๋ณ์ ์ค์
์๋์ path
๋ฑ์ ์ค์น๋๋ฏ๋ก path
๋ฅผ ํตํด ์ค์นํ๋ค.
C:\Program Files (x86)\MinGW\bin
C:\Program Files (x86)\GnuWin32\bin
๋ฆฌ๋ ์ค์์ ์ค์น
sudo apt install build-essential
sudo apt install g++
sudo apt install make
์ ๋ฆฌ
Makefile
์์ฑ ๋ฐฉ๋ฒ์ ๋ํด ์ ๋ฆฌํด ๋ณด์๋ค. ๋น๋ง๋ก์ผ๋ก ์
๋ฐ์ดํธํด ๋๊ฐ ๊ฒ์ด๋ค.