Introduction to Makefile
๋ค์ด๊ฐ๋ฉฐ
๋ํ์์ ์ด์์ฒด์ ์์ ์ ๋ค์ผ๋ฉด์ Pintos ๊ณผ์ ๋ฅผ ์งํํ๊ณ ์์ต๋๋ค. ๊ทธ ๊ณผ์ ์์ ์๋กญ๊ฒ ์ ํ๊ณ ์ดํดํ ๊ฒ๋ค์ ์ ๋ฆฌํ๊ณ ์์ต๋๋ค.
Pintos ์ฝ๋ ์ผ๋ถ
์ด์์ฒด์ ์์
์ Pintos ๊ณผ์ ๋ C์ธ์ด๋ ์ด์
๋ธ๋ฆฌ๋ก ์ฝ๋๋ฅผ ์์ฒญ ๋ด์ผ ํฉ๋๋ค ๐ตโ๐ซ Pintos ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด, Makefile
๋ผ๋ ํ์ผ์ด ์๋๋ฐ์. ์ฐ์
๊ธฐ๋ฅ์์์ผ๋ก ๊ทผ๋ฌดํ๋ฉด์ ํ์ฌ์์ Python๋ง ์ฃผ๊ตฌ์ฅ์ฐฝ ํ๋ ์ ๋ก์๋ ์์ํ ํ์ผ ๋ญ์น ์์ต๋๋ค.
How to learn?
์ ํ๋ธ์ Makefile์ 60์ด๋ง์ ์ค๋ช ํ๋ ์์์ด ์์ด์ ์ด๊ฑธ ๋จผ์ ๋ดค์ต๋๋ค ใ ใ
๊ทธ๋ฆฌ๊ณ losskatsu๋์ ๋ธ๋ก๊ทธ ๊ธ๋ ์ดํด์ ๋์์ด ๋์์ต๋๋ค.
Hello, gcc!
์ผ๋จ ๋
๋ค hello world ์ฝ๋๊ฐ ์ ํ main.c
ํ์ผ ํ๋๋ฅผ ์ ์ต๋๋ค.
#include <stdio.h>
int main() {
printf("Hello, World!");
return 0;
}
๊ทธ๋ฆฌ๊ณ ์๋์ gcc
์ปค๋งจ๋๋ฅผ ์
๋ ฅํ๋ฉด,
$ gcc main.c
$ ls
main.c
a.out
$ ./a.out
Hello, World!
์ด๋ฐ ์์ผ๋ก a.out
๋ผ๋ ์คํ ํ์ผ์ด ๋ง๋ค์ด์ง๋๋ค.
-c
์ต์
์ ์ฃผ๋ฉด, ์ปดํ์ผ๋ง ํ๊ฒ ํ ์ ์์ต๋๋ค.
$ gcc -c main.c
$ ls -al
main.c
main.o
๊ทธ๋ฌ๋ฉด main.o
๋ผ๋ object ํ์ผ์ด ๋ง๋ค์ด์ง๋๋ค. gcc main.c -c
์ ๊ฐ์ด ์ปดํ์ผ ์ต์
์ ๋์ค์ ์ ์ด๋ ์๊ด ์์ต๋๋ค.
์์์ ๋ง๋ object ํ์ผ์ executable๋ก ๋ง๋ค๊ณ ์ถ๋ค๋ฉด,
$ gcc -o main main.o
$ ls -al
main.c
main.o
main
$ ./main
Hello, World!
gcc main.o
๋ง ์
๋ ฅํด๋ executable์ธ a.out
์ด ์๊ธฐ์ง๋ง, ๋๋ฌด ๋์ถฉ ์ง์ ์ด๋ฆ์ด๋;; -o
์ต์
์ผ๋ก ์ถ๋ ฅ ์ด๋ฆ์ ์ง์ ํด์ค๋๋ค. gcc main.o -o main
์ ๊ฐ์ด ์ถ๋ ฅ ์ต์
์ ๋์ค์ ์ ์ด๋ ์๊ด ์์ต๋๋ค.
Hello, Makefile!
Makefile์ ์์์ ํ๋ gcc
๋ช
๋ น์ด๋ฅผ ๋ด์๋๋ ํ์ผ์
๋๋ค. ์ฐ๋ฆฌ๋ ๋ฉ์ฒญ(?)ํ๊ธฐ ๋๋ฌธ์ ์ปดํ์ผํ ํ์ผ์ด ๋ง๊ฑฐ๋ ๋งํน(linking)ํ ํ์ผ์ด ๋ง๋ค๋ฉด ์ผ์ผ์ด ์ ์ด๋๊ธฐ ํ๋ค ์ ์์ต๋๋ค. shell script ํ์ผ์ ๋ง๋ค์ด ๋ ์๋ ์๊ฒ ์ง๋ง, C์ธ์ด์์๋ Makefile
๋ผ๋ ์ข์ ๋๊ตฌ๋ฅผ ์ง์ํฉ๋๋ค.
๋น Makefile
์ ํ๋ ๋ง๋ค๊ณ , ์๋์ ๊ฐ์ด ์ ์ด๋ด
๋๋ค.
hello-compile: main.c
gcc -c main.c
๊ทธ๋ฆฌ๊ณ make hello-compile
๋ผ๊ณ ํ๋ฉด, ์ ์ด๋ gcc
๋ช
๋ น์ด๊ฐ ์คํ๋ฉ๋๋ค. ์ด์ด์ executable ํ์ผ์ ๋ง๋ค๊ธฐ ์ํ make
๋ช
๋ น์ด๋ ๋ง๋ค์ด๋ด
์๋ค. (์ด๋, ๋ช
๋ น์ด ์งํฉ์ ํ์ํ๊ธฐ ์ํด tab
์ ์จ์ผ ํฉ๋๋คโฆ;; ๊ณต๋ฐฑ์ผ๋ก ๋ฃ์ผ๋ฉด *** missing separator.
๋ฅผ ๋ง๋๊ฒ ๋ฉ๋๋ค.)
hello-compile: main.c
gcc -c main.c
hello-executable: hello-compile
gcc -o hello.out main.o
๊ทธ๋ฆฌ๊ณ make hello-executable
๋ผ๊ณ ํ๋ฉด, hello.out
๋ผ๋ executable ํ์ผ์ด ๋ง๋ค์ด์ง๋๋ค.
Makefile์ ๋ช
๋ น์ gcc
๋ง ์ธ ์ ์๋๊ฑด ์๋๋๋ค. ์๋์ ๊ฐ์ด echo
๋ฑ ๊ฐ์ข
CLI ๋ช
๋ น์ด ์งํฉ์ ๋ฌถ์ด make ๋ช
๋ น์ด๋ก ๋ฑ๋กํ ์ ์์ต๋๋ค. (์ด๋ป๊ฒ ๋ณด๋ฉด, shell script๋ ์ ๋ง ๋น์ทํฉ๋๋ค.)
hello:
echo "Hello, World!"
๊ทธ๋์ executable์ ๋ง๋ค๊ณ , ๋ฐ๋ก ์คํํ๊ฒ ๋ง๋ค ์๋ ์์ต๋๋ค.
hello-executable: hello-compile
gcc -o hello.out main.o
./hello-executable
Makefile: Deep Dive
Makefile์ด ๋ญ์ง๋ ๋์ถฉ ๊ฐ์ ์ตํ ๊ฒ ๊ฐ์ต๋๋ค ๐ผ ์ด์ Makefile์ ์ธ๋ถ์ ์ธ ์ฌํญ์ ์ข ์ดํด๋ณด์ฃ !
Syntax
Makefile์์ ์ ์ํ๋ ๋ช ๋ น์ด๋ ์๋์ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฆ ๋๋ค.
targets: prerequisites
command
command
command
๋ช
๋ น์ด ์
์ targets
๋ผ๋ ์ด๋ฆ์ ๋ถ์ฌํ๊ณ , ๊ทธ๊ฒ์ ์ํ pre-requisites
๋ฅผ ๋ช
์ํฉ๋๋ค.
prerequisites์๋ (1) ํ์ผ ์ด๋ฆ (2) ๋ค๋ฅธ target๋ค์ด ๋ค์ด๊ฐ๊ฑฐ๋ (3) ์๋ฌด๊ฒ๋ ์ ๋ค์ด๊ฐ ์ ์์ต๋๋ค.
๋ง์ฝ, ํ์ผ ์ด๋ฆ์ prerequisites๋ก ๋ฃ์๋๋ฐ, ํด๋น ํ์ผ์ด ์๋ค๋ฉด ์๋์ ๊ฐ์ด ์ค๋ฅ๋ฅผ ๋ง๋ฉ๋๋ค.
make: *** No rule to make target `main.c', needed by `hello-compile'. Stop.
๋ณดํต์ ์๋์ ๊ฐ์ด gcc
์ ์ฌ์ฉํ๋ ํ์ผ๋ค์ ๋ฃ์ด์ค๋๋ค.
hello-compile: main.c
gcc -c main.c
๊ทธ๋ฆฌ๊ณ ์๋ฌด ํ๊น๋ ๋ช
์ํ์ง ์๊ณ make
๋ฅผ ์คํํ๋ค๋ฉด, Makefile์์ ๊ฐ์ฅ ์ฒซ ๋ฒ์ฌ ํ๊น ๋ช
๋ น์ด๋ฅผ ์๋์ผ๋ก ์คํํฉ๋๋ค.
Make clean
Pintos์์๋ make clean
์ ์ฌ์ฉํด ๋น๋ํ ํ์ผ๋ค์ ์ ๊ฑฐ ํ์ต๋๋ค. ์ฌ์ค ์ clean
์ด๋ ๊ฒ๋ ํ๊น ๋ช
๋ น์ด์
๋๋ค. (์ ๋ ์ฒ์์ ์ด๊ฒ reserved keyword ์ธ ์ค ์์ต๋๋ค ใ
ใ
)
some_file:
touch some_file
clean:
rm -f some_file
clean
์ ๋ฌด์์ธ์๋ฅผ ์ง์ฐ๊ฑฐ๋ ์ ๋ฆฌํ๋ ์ฉ๋๋ก ์์ฃผ ์ฌ์ฉ๋๋ฉฐ, ์ฒซ๋ฒ์งธ ํ๊น ๋ช
๋ น์ด๋ก ๋์ง ์๋๋ก ์ ์ํด์ผ ํฉ๋๋ค.
Variables
Shell Script์ฒ๋ผ Makefile์๋ ๋ณ์๋ฅผ ๋ ์ ์์ต๋๋ค.
a := one two # a is set to the string "one two"
b := 'one two' # Not recommended. b is set to the string "'one two'"
all:
echo ${a}
echo ${b}
---
echo one two
one two
echo 'one two'
one two
๋ณ์์ ๊ฐ ํ ๋น์ :=
์๋ ์ฐ์ฐ์๋ก ์งํํ๊ณ ,
์ฌ๊ธฐ์ ์ ๊น! ๋ง์ฝ ์ด ๊ธ์ ์ฝ๋ ์ฌ๋ฌ๋ถ์ด Makefile์ ์ ๋ง ๊ธฐ๋ณธ์ ์ธ ๊ฒ๋ง ์๊ณ ์ถ๋ค๋ฉด, ์ฌ๊ธฐ์ ๋ฉ์ถฐ๋ ๋ฉ๋๋ค ใ ใ
Multiple Targets
์์ธ๋ก ํ๊น ์ด๋ฆ๋ ์ฌ๋ฌ ๊ฐ๋ฅผ ๊ฐ์ง๋๋ก ์ค์ ํ ์ ์๋ค. $@
๋ make์์ ์คํํ๋ ํ๊น ์ด๋ฆ์ ์ฐธ์กฐํ๋ ์์ฝ ๋ณ์์ด๋ค.
all: f1.o f2.o
f1.o f2.o:
echo $@
# Equivalent to:
# f1.o:
# echo f1.o
# f2.o:
# echo f2.o
Double-Colon Rules
์ ๋ง ๋๋ฌผ๊ฒ ์ฌ์ฉํ๊ธด ํ์ง๋ง, ๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง ํ๊น์ ์ ์ํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค.
all: blah
blah::
echo "hello"
blah::
echo "hello again"
์ด ๊ฒฝ์ฐ, ์์์๋ถํฐ blah
๋ผ๋ ์ด๋ฆ์ ๊ฐ์ง ๋ชจ๋ ํ๊น์ด ์์ฐจ์ ์ผ๋ก ์คํ๋๋ค.
Disable Command Echo
Makefile์ ์คํํด๋ณด๋ฉด, ํ๊น์์ ์ด๋ค ๋ช
๋ น์ด๋ฅผ ์คํํ๋์ง ์ ์๋ ๋ช
๋ น์ด๋ฅผ ๊ผญ ์ถ๋ ฅํ๊ณ ์คํํ๋ค. ๋ง์ฝ ์ด๊ฑธ ๋ณด์ฌ์ฃผ๊ณ ์ถ์ง ์๋ค๋ฉด, sliencing ์ต์
์ ๋ฃ์ด make -s
๋ฅผ ์คํํ๋ฉด ๋๋ค.
all:
@echo "This make line will not be printed"
echo "But this will"
๋๋, ๋ช
๋ น์ด ๋ผ์ธ์ ๋งจ ์์ @
๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
๋งบ์๋ง
Pintos ์ฝ๋ ์ผ๋ถ - 2
Pintos ์ฝ๋ ๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉด์, ๊ณผ์ฐ Makefile
์ด๋๊ฒ ๋ฌด์์ผ๊น๋ผ๋ ์๊ฐ์ด ๋ค์ด ์ข ์ดํด๋ณด๊ฒ ๋์๋ค. ์ด์ง๋ฝ๊ฒ๋ Makefile
์ด 4๊ฐ๋ ์๊ณ , Make.config
๋ผ๋ ํ์ผ๋ ์๋ค.
๋ฐ์ดํฐ ์์ง๋์ด๋ก์ ์์ผ๋ก C/C++์ ์ธ์ผ์ด ๋ง์๊น??๋ผ๋ ์๊ฐ์ด ๋ค๊ธฐ๋ ํ๋ค. ๊ทธ๋ฐ๋ฐ ์๊ฐํด๋ณด๋ Istio์์ ์ฐ๋ โEnvoyโ๊ฐ C๋ก ์ง์ฌ์ง Proxy๋ผ๊ณ ๋ค์๋ ๊ฒ ๊ฐ๋ค ๐ฎ ๋ด๊ฐ ์ ๋ง ์ฝ์ด ๋ ๋ฒจ์ ๋ก์ง์ ๊ฑด๋๋ฆฌ๋ ๋ ์ด ์จ๋ค๋ฉด, ์ด๋ ๊ฒ ๊ณต๋ถํด๋ ๊ฒ๋ ์ธ์ ๊ฐ ์ธ๋ชจ๊ฐ ์๊ฒ ์ง!!
์ด๊ฒ๋ง๊ณ ๋ Makefile์ ๋ํ ๋ ๋ง์ ๋ฌธ๋ฒ์ด ์์ง๋งโฆ ๋๋จธ์ง๋ ํ์ํด์ง๋ฉด ์ ์ด๋ณด๊ฒ ๋ค ใ ใ ์ด ํฌ์คํธ๋ Makefile์ ๋ํ 101์ด๋๊น!!