์ ์ ๋ฆฌ์ฐจ๋ WM ์กด์ค
๋ชฉํ ์์ค ์ฝ๋
- ํ๋์ ์ข
์์ฑ ํด๊ฒฐ ์ ๋ต๋ง ์ง์ํฉ๋๋ค. "๋์ ํ์ผ์ด ์๊ฑฐ๋ ์ข
์์ฑ ์ค ํ๋๋ณด๋ค ์ค๋๋ ๊ฒฝ์ฐ ์ด์
๋ธ๋ฆฌ ๋ช
๋ น์ด ์คํ๋ฉ๋๋ค." Goals๋ URL ์กด์ฌ ์ฌ๋ถ ํ์ธ, ํ์ผ ์์ ์๊ฐ ๋น๊ต, ํจํค์ง ๋น๋ ํ๊ฐ ๋ฑ์ ๋ค๋ฅธ ์ ์ ์ ๊ตฌํํ ๊ณํ์
๋๋ค.
์ฝ์ง , ์ฒดํฌ์ฌ ๋น๊ต, ํ ์คํธ๋ฅผ ์ ํ์ ์ผ๋ก ๊ฑด๋๋ฐ๋ ํ ์คํธ ์ผ์ด์ค ์คํ. - ๋น๋ ํ๊ฒ์ ์ฒ๋ฆฌํ ๋ make๋ ํ์ผ๊ณผ ๊ท์น ์ด๋ฆ์ ๋ถ๋ฆฌํ์ง ์์ผ๋ฏ๋ก ๊ฒฐ๊ณผ์ ์ผ๋ก ๊ท์น์ ์คํํ ๋ ์์ฑ๋๋ค๊ณ ์ฃผ์ฅํ๋ ํ์ผ์ด ์ค์ ๋ก ์์ฑ๋๋์ง ํ์ธํ์ง ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํ
์คํธ์ ํจ๊ป ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ "test"๋ผ๋ ๊ท์น์ด ์๋ ๊ฒฝ์ฐ "test"๋ผ๋ ํ์ผ์ด ์ค์๋ก ์์ฑ๋๋ฉด make๋ ๋์์ด ๋น๋๋์์ผ๋ฉฐ ํ์ํ์ง ์๋ค๊ณ ๊ฐ์ฃผํ๋ฏ๋ก ํ
์คํธ๊ฐ ๋ ์ด์ ํธ์ถ๋์ง ์์ต๋๋ค. ๋ชจ๋ ์์
(make์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ".PHONY: test" ์ง์๋ฌธ์ ์ง์ ํ ์ ์์) ๋ชฉํ๋ ํ์ผ๊ณผ ๊ท์น ์ด๋ฆ์ ๋ช
์์ ์ผ๋ก ๊ตฌ๋ถํฉ๋๋ค.
- ์กฐ๋ฆฝ ์ง์นจ์ ํ๋์ ๋งค๊ฐ๋ณ์๋ง ์ ๊ณตํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๋ชฉํ๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ๊ฐ์์ ๋ช ๋ช ๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ด๋ฆ์์ ๋๋ฒ๊ทธ ํ์ผ์ ๊ธฐํธ๋ฅผ ๋ณ๋๋ก ์ถ์ถํ ์ ์์ต๋๋ค.
- ์ ์ธํฐํ๋ฆฌํฐ์ ์ํธ์์ฉํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ํ์ผ ๋ฐ ๋๋ ํฐ๋ฆฌ ์ด๋ฆ์ ๊ณต๋ฐฑ ์ด์ค์ผ์ดํ๋ฅผ ์ ์ดํด์ผ ํ๋ ํ์์ฑ, ๊ฐ ๋ช
๋ น์ ์คํํ ๋ ๋ณ๋์ ์
ธ ํด์๊ธฐ๋ฅผ ์์ํ๋ ๋ฐ ๋ฐ๋ฅธ ๋ฆฌ์์ค ๋ญ๋น, "$" ๋ฌธ์(์
ธ๊ณผ make ๋ชจ๋์์ ์ฌ์ฉ๋จ)์ ์ด์ค ํด์, ๋ค์ฌ์ฐ๊ธฐ๋ฅผ ๊ณ ๋ คํฉ๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ ๊ตฌ๋ฌธ ๋ถ์๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ด์ ๋ธ๋ฆฌ ๋ณ์์ ๋ํด "$" ๋์ "%" ๊ธฐํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ชฉํ์์ ํด๊ฒฐ๋ฉ๋๋ค("$"๋ ์ ธ์๋ง ๋จ์ ์์).
LALR(1) , ๊ฒฝ๋ก์ ํ์ผ ์ด๋ฆ์ ๋ฐ์ดํ๋ก ๋ฌถ๊ณ ์ค๊ดํธ๋ก ์ฝ๋ ๋ธ๋ก์ ๊ฐ์กฐ ํ์ํด์ผ ํฉ๋๋ค. ์ ์ฒด ๋ช ๋ น ๋ธ๋ก์ ๋ช ๋ น ์ ธ์ ๋จ์ผ ์ธ์คํด์ค์์ ์์๋๋ฉฐ ๋ธ๋ก ๋ด์์๋ ํน์ ๊ณต๋ฐฑ์ ์ฐธ์กฐํ์ง ์๊ณ ์์์ ์ฝ๋ ํ์์ด ํ์ฉ๋ฉ๋๋ค.๊ทธ๊ฒ์ :
๋์: foo.o bar.o
${CC} ${CFLAGS} $< -o $@๊ทธ๊ฒ์๋์๋ค :
"๋์": "foo.o", "bar.o" {
%CC %CFLAGS %< -o %@
}
๋ชฉํ์ ๋ค๋ฅธ ๊ธฐ๋ฅ:
- ์์์ ์ด๋ฆ ๋ฐ ๋งค๊ฐ๋ณ์ ์ง์ ์ ์ํ ์ ํ์ ์ง์:
๋ชฉํ ๋ชจ๋ = : "๋์"
๋ชฉํ ๋งํฌ =
"๋์": "foo.o", "bar.o" { ... }๋ชฉํ ์ปดํ์ผ(์ด๋ฆ) =
"%name.o": "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ } - ๋ ๊ฐ์ง ์์ ๋ชจ๋: ๋น๋ ํ๊ฒ์ ํ์ผ ์ด๋ฆ๊ณผ ์ผ์น์ํค๋ make ๋ชจ๋(์: ํ์ผ "foo.o"๊ฐ ํ๊ฒ "%name.o"์ ์ผ์น) ๋ฐ ์ง์ ์ปดํ์ผ ๋ชจ๋:
๋ชฉํ ๋ชจ๋ = : ๋งํฌ
๋ชฉํ ๋งํฌ =
"๋์": "foo.o", ์ปดํ์ผ("๋ฐ") { ... }๋ชฉํ ์ปดํ์ผ(์ด๋ฆ) =
"%name.o": "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ } - ์กฐ๋ฆฝ ์ ์ ์ ์กฐ๋ฆฝ ๋์์ ์ฌ์กฐ๋ฆฝํ ํ์์ฑ์ ๊ฒฐ์ ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ํน์ ๊ท์น์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค. ํ์ผ ์กด์ฌ์ ๋ํ ๋งํฌ๊ฐ ๋ง๋ค์ด์ง๋ฉด ์ด๋ ํด๋น ๊ธฐํธ(๊ท์น ์ด๋ฆ์ ๊ฒฝ์ฐ "target", ํ์ผ ํ์ธ์ ๊ฒฝ์ฐ *file("target"))๋ฅผ ํตํด ๋ช
์์ ์ผ๋ก ๊ฒฐ์ ๋ฉ๋๋ค.
"๋์": "foo.o", "bar.o" { ... }
*file("๋์") : *file("foo.o"), *file("bar.o") { ... }
- ๊ฐ๋ฐ์๋ ์ด์
๋ธ๋ฆฌ ์ ์ ์ ์์ ์์ฑ์ ์ ์ํ ์ ์์ต๋๋ค. "*file" ํ๋๊ทธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์๋ฉ๋๋ค(@{...}๋ ์ถ๋ ฅ ์ต์ ๋ฅผ ๋ํ๋ด๊ณ "exit 99"๋ ์ฌ๊ตฌ์ถ์ด ํ์ํจ์ ๋ํ๋).
์ ์ *file (ํ์ผ ์ด๋ฆ) = @{
test -f %ํ์ผ๋ช || 99๋ฒ ์ถ๊ตฌ
f(%)์ ๊ฒฝ์ฐ์ถ์ฒ : opennet.ru