ืืืื ืืคืงืืื makepp_rules ืฉื ืืชื ืืืจืืฅ ืืกืคืง ืืืืจืื ืืืื ืื ืฉื OnWorks ืืืืฆืขืืช ืืืช ืืชืื ืืช ืืขืืืื ืืืงืืื ืืช ืืืจืืืืช ืฉืื ื ืืืื ื ืืืื Ubuntu Online, Fedora Online, ืืืืืืืจ ืืงืืื ืฉื Windows ืื ืืืืืืืจ ืืงืืื ืฉื MAC OS
ืชึธืึฐื ึดืืช:
ืฉืึตื
makepp_rules -- ืืื ืืืืจ ื-makepp ืืื ืืช ืืฉืื
ืชืืืืจ
?: &,
-,
@, B: :build_cache,
:build_check, D: :ืึฐืฉืึทืึตืจ, E: :env, I: "ืืชืขืื_ืฉืืืื",
:ืึดืืืึนื, L: :ืืืืืื ืืช ืืืืจืื ื, M: ืืืืคืจื, N: "ื ืืงื", P: :ืื ืชื,
"ืคืจื", S: :ืึฒืชึดืืึธื
ืืื ืืื ืื ืฉืืืืจ ื-makepp ืืื ืืื ืืช ืงืืืฅ ืื ืืืืงื ืฉื ืงืืฆืื. Makepp ืชืืื ื
ืืืชื ืชืืืืจ ืืืืื ืืื ืืืฉืืืื ืืืจืื ืฉื make, ืืชืืกืคืช ืืื ืชืืกืคืืช ืืฉืื.
ืืืื ืืฉ ืืช ืืคืืจืื ืืืืื
target_expression : dependency_expression [ : ืืจืืืื ืืื ืืืคืฆืืื ืืืื]
ืคืขืืืืช
ืจืฉืืืช ืืืขืืื ืขืฉืืื ืฉืื ืืืืื ืืฉืชื ืื ืืืืืืืืื (ืืืขื "$(foreach)"). ื
ืจืฉืืืช ืืชืืืช ืขืฉืืื ืืืืื ืจืง ืืฉืชื ืื ืืืืืืืืื ืืืชืืืืกืื ืืืขื (ืืืืืจ,
"$(ืคืื)", "$(ืคืืืื)", ืื ืืืืืื ืื ืจืืคืืช ืฉืืื). ืืคืขืืื ืขืฉืืื ืืืืื ืื ืืืืืืื
ืืฉืชื ืื.
ืื makepp ืืืืื ืฉืฆืจืื ืืืฆืข ืืช ืืืื, ืื ืฉืืจื ืฉื ืืืื ืืืืฆืขืช
ืืจืฆืฃ, ืืื ืืืื ืืืืืจ ืกืืืืก ืฉืืื ื ืืคืก, ืืฉืืจ ืื ืืืืฆืขืื (ื
makepp ืืืื ืขื ืฉืืืื ืืื ืื ืฆืืื ืช ืืช ืืืคืฉืจืืช "-k" ืืฉืืจืช ืืคืงืืื.)
ืื ืคืขืืื ืฆืจืืื ืืืืืช ืจืง ืฉืืจื ืืืช. ืื ืคืขืืื ืืจืืื ืืืื ืืืชืื ืืฆืืจื ื ืืื ืขื ื
ืฉืืจื ืืืืืช, ืืชื ืืืื ืืคืฆื ืืืชื ืืืกืคืจ ืฉืืจืืช ืืืฉืื ืงื ื ืืื ืืื ืืฆืืื ืฉื
ืืฉ ืืฉืื ืืกืคืจ ืฉืืจืืช ืืืืช.
ืขื ืื ืช ืืืืืื ืืื ืคืขืืืืช ืืืื ืืื, ืืฉ ืืืื ืืก ืืช ืืคืขืืื ืืืชืจ
ืืืฉืจ ืืงื ืืืืื ืืช ืืืืจืืช ืืืชืืืช. ืื ืืืื ืืืืืืฉืื ืืืจืื ืฉื
make, ืื ืืืฉ ืืืคืช ื-makepp ืืื ืืชื ืืื ืืก ืืช ืื ืื ืื ืืชื ืืฉืชืืฉ ืืชืืื ืืื
ืืื ืจืืืืื. ืืื ืืฉืืืจ ืขื ืชืืืืืช ืืืืืจ ืขื ืชืืฆืจืช ืืกืืจืชืืช, ืืืืืื
ืืฉืชืืฉืช makepp ืืื ืืืืืื ืืชื ืืคืขืืืืช ืืกืชืืืืืช ืืืืื ืืื ืืชืืื ืื ืงืฆืช ืืกืืืืื:
ยท ืืฉ ืืืืื ืืช ืฉืืจืช ืืคืขืืื ืืจืืฉืื ื ืืืชืจ ืืืฉืืจื ืืืืืื ืืช ืืืืจื.
ยท ืื ืฉืืจื ืืืื ืกืช ืืืืฆืขืืช ืชื ืืื ืืื ืื 8 ืจืืืืื ืื ืืืชืจ, ืื ืื ื ืืฉื
ืงื ืคืขืืื.
ยท ืฉืืจื ืจืืงื ืื ืฉืืจืช ืืขืจื ืขื ืืชื "#" ืืฉืืืืื ืืืื ืืื ืืกืืืืช ืืช
ืืื, ืืื ืื ืืฉืืจื ืืื ืจืืงื ืืืื ืืืืืช ืืืชืจ ื-8 ืจืืืืื (ืื ืืืชืจ ืืืื
ืืฉืื ืืช).
ยท ืื ืฉืืจื ืืืงืคืฆืช ืืืืชื ืืืื ืื ืืืชืจ ืืฉืืจืช ืืคืขืืื ืืจืืฉืื ื, ืื ืื
ื ืืฉื ืงื ืคืขืืื ื ืืกืฃ.
ืืฉ ืืื ืคืจืืื ืคืขืืื ืืืืืืื:
& ืืืจื ืกืื ืื ืืืคืืข ืฉื ืคืงืืื ืืื ืืกืคืจ ืฉื ืืจืืืื ืืื. ืฆืืฃ
ืืชืืืืจ ืื ืืืื ืืืืืื ืืื, ืจืง ืืจืืืืช ืืืืืืช ืืืคืืืืช ืืืชืืืืช ืืืืืจ
ืืืืืืช ืืชืื, ืืื ืืื makepp. ืฉื ืืคืงืืื ืืืืื ืืคืื ืงืฆืื
"ื_ืฉืึตื" ืืืืงืจื ืขื ืืืืจืืืืช ืื ืืชืจืืช ืืืืขืื ืื. ืื ืคืื ืงืฆืื ืืื ืืืืื
ืื ื ืืฆื, ืื ืืื ืืงืจืืื "ืืคืขืื" ืืืืืง "ืคืจื".
ืื ืืืคืฉืจ ืืงืจืื ืืืขืืืืช ืืคืงืืื ืืืื ืืช, ืืกืืคืงืช ื-makefile ืื ืืืฆืื ืืช.
ืืงืืืืืช "&" ื ืืืจื ืืืืืื ืฉืืื ืืขืืจืจืช ืืคืื ืงืฆืืืช ื- Perl, ืืืฉืื
ืืืชืืื ืื ืื ืืืงื ื-Shell.
$(ROOT)/include/%.h: %.h
&ln $(ืงืื) $(ืคืื)
noecho
@ ืืืจื ืืื, ืื ืคืงืืืช ืืขืืคืช ืืืืคืกืช ืชืื ืืื ืืืฆืืขื. ืขื ืืืช, ืื ืืืืื ืืจืืฉืื ื
ืฉื ืืคืขืืื ืืื "noecho" (ืื ืื ืืื ืืชืืืื ืืืืช "@"), ืื ืืคืงืืื
ืืื ื ืืืืคืก. ืืืืืื,
%.o: %.cxx
noecho $(LIBTOOL) --mode=compile $(CC) -c $(input)
ืื ืืืืจ ืฉืืืฉืจ ืืคืงืืื libtool ืืืืฆืขืช, ืืื ืื ืืืืคืกืช. (Libtool
ืขืฆืื ืืืจื ืืื ืืืคืืก ืืช ืืคืงืืื ืฉืฉืื ืชื ืฉืืื ืืืฆืขืช, ืื ืื ืืืืชืจ
ืืืืคืืก ืืืชื ืคืขืืืื.)
ืืชืขืื_ืฉืืืื
- ืืืจื ืืื, ืื ืคืงืืืช ืืืขืืคืช ืืืืืจื ืกืืืืก ืฉืืื ื ืืคืก, ืื makepp ืืืื ืืืื
ืืคืงืืื ื ืืฉืื. ืขื ืืืช, ืชืืื ืืืช ืืกืืืืืช ืืืืืจื ืืืืคื ืฉืืื ืืช ืืืฆื ืืืฆืืื, ืื
ืืืชืื ืฉืืฉ ืฉืืืื ืฉืืืืช ืืื ื ืงืืื ืืช ืืืกืืจ ืืืื ืืช ืืืื
ืึทืืึธืจึธื. ืืชื ืืืื ืืืจืื ื-makepp ืืืชืขืื ืืกืืืืก ืืืืืจื ืขื ืืื ืฆืืื
"ignore_error" ืืชืืจ ืืืืื ืืจืืฉืื ื ืฉื ืฉืืจืช ืืคืงืืื (ืื "-" ืืชืืจ ืืชื ืืจืืฉืื).
ืืืืืื,
$(ืืคืฆื ืืืืืคืช):
ignore_error rm -r my_program-$(VERSION) # ืืืคืืจ ืืืืื ืืงืืื.
&mkdir my_program-$(VERSION)
&cp $(FILES) my_program-$(VERSION)
tar cf my_program-$(VERSION).tar my_program-$(VERSION)
ืคืงืืื ืื ืืืืฆืจืช ืกืคืจืืื, ืืขืชืืงื ืืชืืื ืืืืจื ืฉื ืงืืฆืื ืืื ืืื ืืกื
ืืื ืืงืืืฅ tar ืืืคืฆื. ืื ืจืขืืื ืืื ืื ืงืืช ืืช
ืชืืื ืงืืื ืฉื ืืกืคืจืืื, ืื ืืื ืฉื ืืฉืื ืงืืื, ืืืื
ืื ืืฉืืจื ืืจืืฉืื ื ืขืืฉื. ื-"rm" ืขืืื ืืืืืฉื, ืื ืืชืขืืืื ืืกืืืืก ืืืืืจื ืฉืื.
ืคืจื
makeperl
ืื ืืขืฆื ืืื ืืืฆืืจืช perl, ืืื ืื ืืืืฆืข ืืื ืคืขื ืืืฉืจ
ืืคืขืืช ืืืื, ืื ืืขืช ืงืจืืืช ื-makefile. ืืืจืกื ืืจืืฉืื ื ืืื ืคืจื ืจืืื
ืงืื, ืืขืื ืฉืืืจืืื ื ืืฉื ื ืืขืืืจ ืชืืืื ืืช ืืืฆืืจื ืืจื ืืืฉืชื ื Make-style
ืึทืจืึธืึธื.
ืืฉืชื ืืืคืฉืจืืืืช ืืฉืื ืืช ืืคืืื ืฉื โโืืืืฃ, ืจืื ืืกืืจ ื
"perl_perlcode" ื-makepp_statements. ืฉืืื ืื ืฉืืืจืกื ืืฉืืืฉืืช ืืืกืืจืช ืฉื
ืืื ืืืืื ืืื, ืื ืืฉ ืืืื ืืก ืืืื ืฉื ืื ืฉืืจืืช ืืคืขืืื. ืืชื ืืืื ืืืืชืช
ืืืฉืืื ืืืฆืืจืืช ืคืจื, ืขื ืืื ืงืจืืื "ืืืืช".
ืืคื ืืื, ืืฆืืจืืช Perl ืืืขืจืืืช ืืขืช ืืชืืืื ืืฉื ื ืืฉืืชืฃ, ืืืขื ื-
ืืืื ืืช. ืื ืืืืจ ืฉืืฉ ืืื ืจืง ืืืฉืช ืงืจืืื ืืื ืืฉืชื ื makefile. ืื ืื
ืืชืืืื ืฉืืืฆืข ืคืขืืืืช ืฉืืื ื Perl. ืื ืืงืจืืื ืืื ืื ืื ืืฆืืื ืชืืืื
makepp. ืืื ืื ืขืฉืื ืืืฉืชื ืืช ืืขืชืื. ืืืจื ืืขืืื ืืืชืงืฉืจ ืืคืจื
ืกืงืจืืคืืื, ืขืืื ืืคืจืื ืืงืืื "&" ืื "ืืคืขืื".
$(ืืจืกื ืืืืืคืช):
noecho perl {{ # $(target) & $(VERSION) ื- Perl:
print "ืืื ".f_target()." $VERSION\n";
}}
echo ืืชื ืืืื ืืขืจืื ืืช ืื ืขื ืคืงืืืืช Shell
-makeperl { ืืืคืก "ืืื $(ืืืจื) $(ืืจืกื)\n" }
ืืฉื ื ืืกืคืจ ืกืืืื ืฉืื ืื ืฉื ืืืืื, ืฉืืื ืืื ืืื ืืืจืืช ืฉืื ืืช.
ืึฐืคืึนืจึธืฉื ืืืงื
target1 target2: dependency1 dependency2 ...
ืคืขืืืืช ืฉืืฉ ืืืฆืข
ืชืืืืจ ืื ืืฆืืื ืืช ืื ืขื ืื ืช ืืขืฉืืช ืื TargetXNX or TargetXNX, ืื ืืงืืฆืื
ืชืืืช 1, ืชืืืช 2ืืื', ืืื ืืืจ ื ืขืฉื. ืื ืืคืขืืืืช ืื ืชืื ืืช ืื
ืืืฆื ืืืืจื ืขื ืืื ืืคืื ืืื ืืืฆืืจ ืืช ืืืืจืืช.
ืืืื ืืืคืืจืฉ ืืจืืฉืื ืืงืืืฅ ืืื ืืขื ืืจืืจืช ืืืืื, ืืืื ื ืขืฉื ืื ืื ืชืฆืืื
ืืขืืื ืืืฉืื ืืฉืืจืช ืืคืงืืื.
ืฉืื ืืื ืชืื ืืืช ืืฆืจื ืืกืืจืชืืืช, makepp ืืืจื ืืื ืื ืื ืฉืงืจืืืช ืคืขืืื ืืืช ืืื
ืขืืฉื ืืช ืื ืืืืจืืช (ืืื ืื ืื ืืื ืชืืืช). ืืืฉื, ืงืจืืื ืืืช
ืฉื yacc ืืืฆืจ ืืช ืฉื ื ืงืืืฆื ืืคืื ืขืืืจ ืืืื ืืื:
y.tab.c y.tab.h : parser.y
$(YACC) -d parser.y
ืฉืืื ืื ืฉืืืืฉืืืื ืืืจืื ืฉื make ืืื ืืืฉื ืฉื ืคืงืืื ืืืช
ืืืฆืืจ ืงืืืฆื ืคืื ืืจืืืื, ืืืื ืืืฉืจ ืืชื ืืฆืืื ืืกืคืจ ืืขืืื ืื ืืขืฉื ืืืช
ืืืฆืข ืืช ืืืื ืคืขื ืืืช ืืื ืืขื. Makepp ืืืืืจ ืืืชื ืืืืช ืืื ืื ืื ื ืจืื ืื
ืืื ืงืืืฅ ืืืืงื ืืกืื ืื ืืฉื. ืืืืคื ืกืคืฆืืคื, ืืื ืืืฆืข ืืช ืืืื ืคืขื ืืืช ืืื ืืขื,
ืืืงืื ืจืง ืคืขื ืืืช ืืกื ืืื, ืื ืื ืืืืจืื ืืืืื ื ืืื ืื:
ยท ืคืขืืืช ืืืื ืืืืืจื ืืช ืืืฉืชื ื ืืืืืืืื $@. (ืืืืืื ืื ืจืืคืืช "$(ืคืื)" ืื
"$(target)" ืื ืืคืขืื ืืชื ืืืืช ืื.)
ยท ืคืขืืืช ืืืื ืืื ื ืืืืืจื ืืช ืืืฉืชื ื ืืืืืืืื "$(ืคืืืื)" (ืื ืืืืื ืื ืจืืคืช ืฉืื
"$(ืืขืืื)").
ยท ืื ืื ืืื ืืคืืก, ืืืื ืคืกืงืช foreach.
ืืืืืื,
ืื ืืชืงื ืืช ืืืืงื:
ืขืืืจ subdir ื-$(SUBDIRS); ืขืฉื cd $$subdir && $(MAKE) $@; ืชืงืืืืืจ..; ืืืฆืข
ืืื ื ืื ื ืคืืฅ ื-makefiles, ื-makepp ืชืืื ืื. (ืฉืื ืื ืฉืืกืืจ ืื ืืืฉืชืืฉ
ืืืชื ืจืงืืจืกืืื ืืื ืงืืืฅ makefile ืืืฉ ืฉืืชื ืืืชื - ืืฉืชืืฉ ืืืฉืคื "load_makefile", ืื
ืืขืื ืช ืงืืืฅ makefile ืืืงืื ืืืช.)
ืื ืืชื ืจืืฆื ืฉืืืชื ืืื ืืืืฆืข ืคืขื ืืืช ืขืืืจ ืื ืืขื (ืืืฉื, ืืืื ืืืืจืืช
ืืฉ ืคืงืืืืช ืืืืืช), ืขืืืฃ ืืืฉืชืืฉ ืืืื ืืคืืก (ืจืื ืืืื) ืื ื
ืกืขืืฃ "ืงืืืื". ืืืืืื, ืื ืขื ืชืืื ืืช ืชืืฆืจืช ืืกืืจืชืืช ืืืืช ืืืชื:
ื ื ื ื:
do_something ืืื ืืื ืืช $@ > $@
ื-makepp, ืกืืืจ ืืื ืื ืฉืชืจืฆื ืืืชืื ืืช ืื ืื:
$(foreach): : foreach abcd
do_something ืืื ืืื ืืช $(ืคืื) > $(ืคืื)
ืืืืืฃ ืืืจืืช
A ืึฐืืึผืึธืฃ ืืขื ืืื ืืขื ืฉืืขืืื ืื ืืชืงืืื ืืคืืขื ืืืขืจืืช ืืงืืฆืื; ืื ืจืง ื
ืืจื ืืืจืื ื-makepp ืืื ืืช ืืื ืืืจืืช ืืืืื ืืืฆืข ืืื ืคืงืืืืช ื ืืกืคืืช.
ืืขื ืืืืืฃ ืืืคืืกื ืืื "ืืื", ืฉืืืจื ืืื ืืฉืืฉ ืืื ืืืจืื ืืื ืื ืฉืืืื ืืืืืช
ื ืื ื ืืื ืืืืื ืืช, ืื:
ืืื: prog1 prog2 subdir/prog3 subdir2/libmine.a
@&echo "ืืื ื ืขืฉื!"
ืื ืืชื ืืงืืื "makepp all", ืื ืื ืืชื ืฉื ืืื ืืชืืจ ืืืขื ืืืคืืจืฉ ืืจืืฉืื ื-makefile ืฉืื
(ืืื ืืืคืืื ื) ืืคืฉืื ืืงืื "makepp", ืืื ืื ืืืจืื ืืื ืืชืืืช ืืืืืช
ื ืื ื, ืืื ืืื ืืืคืืก "ืืื ื ืขืฉื!". ืืฉืื ืื, makepp ืืืคืฉ ืืช ืืงืืืฅ ./ืืช ืื
ืืืืื ืฉืื ืื ืงืืื. ืื ืืชืืื ื ืืงืื ืจื.
ืืื ืืื ืืข ื-makepp ืืฆืคืืช ืืงืืืฅ ./ืืช ืื ืืื ืืฆืืช, ืืชื ืฆืจืื ืืืืื ืื ืฉืื ื
ืืืจื ืืืืืคืช. ืคืฉืื ืฉืื ืฉืืจื ืืื ืืืื ื-makefile ืฉืื โโ(ืื ืื ืืฉื ื
ืืืคื):
.PHONY: ืืื
ืืืืคื ืืงืืืื ืฉืืขืืชืื ื ืืื ืืืชืจ ืืื ืืืฉืชืืฉ ื-"$(phony )"
ืคืื ืงืฆืื, ืื:
$(phony all): prog1 prog2 subdir/prog3 subdir2/libmine.a
ืืืจืืช ืืืืืคืืช ืืงืืืฅ makefile ืืืื ืืืชืืืืก ืืืขืืื ืืืืืคืื ืืงืืืฅ makefile ืืืจ. ืื
ื ืขืฉื ืืขืชืื ืงืจืืืืช ืขื ืืืขื ื"ื ืงื", ืื:
# Makefile ืืจืื ืืขืืืื ื:
# ืืจืื ืืืงืื ืืืืจืื ืืื
#....
$(phony clean): subdir1/clean subdir2/clean
&rm -fm my_program
ืืื ืืกืคืจืืืช ืืืฉื ื, ื-makefiles ืขืฉืืืื ืืืืงืจื ืื:
# Makefile ืืกืคืจืืืช ืืฉื ื
#...
$(ื ืงื ืืืืืฃ):
&rm -fm $(ืชื ืืืื *.o *.a)
ืืื ืืืืื ื ืืืืช ืืฉืชืืฉ ืืคืงืืื "makeppclean", ืืืงืื ืืืจื ื ืงืืื.
ืืจืืืกื ืืจ
ืื ืืืื ืืฆืืื ืชืืืื ืืืืืื ืืจืฉืืืช ืืชืืืช. ืชืืืื ืืืืืื ืชืืืืื ืื ืจืง ืงืืฆืื
ืฉืงืืืืื, ืืื ืงืืฆืื ืฉื ืืชื ืืืฆืืจ ืืืื ืชื ืืืืืื ื-makefile. ืืืืืื,
ืืื ืืื ืืช ืกืคืจืื ืืื ืงืืฆื ื-.o ืืกืคืจืื, ืชืืื ืืืชืื ืืช ืื:
libmine.a: *.o
&rm -f $(ืคืื)
ar cr $(ืคืื) $(ืื ืืกืืช)
ืื ืืขืืื ืื ืื ืืฃ ืืื ืืงืืฆื ".o" ืื ื ืืฆืจ ืขืืืื, ืื makepp's
ืชืืืื ืืืืืื ืชืืืืื ืงืืฆืื ืฉืขืืืื ืื ืงืืืืื ืืื ื ืืชื ืื ืืื ืืื. ืื ืืคืืื ืืชืืืจ
ืงืืฆืื ืฉืืืื ืฉืืื ืืชืืื ืืืืืจ ืืืชืจ (ืืืืชื makefile, ืื ืืื ืฉืืจื ื ืงืจื). ืืื
ืื ืงืืื ืืืืจืื ื ืืื ืฉืื ื ืืคืื ืงืฆืืืช "ืชื ืืืื", ืืืืืืืช ืืืืืื ืืืืืขืื,
ืืคื ืฉืืื ืืืื ืืืืืืจ ืืช ืืชืืฆืื ืฉืื ืืืฉืจ ืืื ืืืจืื.
Makepp ืชืืื ืืื ืชืืื ืืคืื ืืจืืืืื ("*", "?" ื-"[]"). ืืฉ ืื ืื ื
ืชื ืืืื "**" ืฉืืชืืื ืืื ืืกืคืจ ืฉื ืกืคืจืืืช ืืชืขืจืืืช. (ืืจืขืืื ืืื ื ืื ื
ื-zsh.) ืืืืืื, "**/*.c" ืืชืืื ืืื ื- .c ืงืืฆืื ืืื ืขืฅ ืืืงืืจ.
"objects/**/*.o" ืชืืื ืืช ืื .o ืงืืฆืื ืืืืืืื ืืื ืืงืื ืืกืคืจืืืช ืืืฉื ื ืืืืืืงืืื
ืื ืื ืืืช ืืกืคืจืืืช ืืืฉื ื ืฉืื ืื ืื ืืืช ืืกืคืจืืืช ืืืฉื ื ืฉืืื. ืืชื ืืืืื "**" ืื ืืขืฉื ืืืช
ืขืงืื ืืืจ ืงืืฉืืจืื ืจืืื ืืกืคืจืืืช ืืื ืจืื. ืื ืื ืืขืืื ืื ืืืืืจ ืืืจืืช ืืืืืคืืช.
ืืชืืืื ืืืืืืื ืฉื Makepp ืืชืขืืื ืืงืืฆืื ืื ืกืคืจืืืช ืฉืงืืืืื ืื ืื ื ืืชื ืื ืืงืจืืื. ืืืืจ
ืืื ืืงืจื, ืื ื ืืชื ืืืฉืชืืฉ ืืงืืฆืื ืืืื ืืชืืืื ืืื ืืื. ืืื ืกืช ืงืืฆืื ืืืชื ืงืจืืืื ื-a
ืกืคืจืืื ืฉืืืืฉืืช ืืขืืงืจ ืืื ืืขืื ืืช ืืืืืื โโืืืืืืืื ืฉื ืืงืืืฅ ืื ืชืื ื-a
ืืืืจ.
ืืงืืืขื ืืจืืฉืื ืืช ืืืืชื ืฉืื ืืืื. ืื ืืืืื ืฉืื ืขืืื ืื
ืืงืืฆืื ืืืจ ืงืืืืื, ืื ืฉืฆืจืื ืืื ืืช ืงืืื. ืขื ืืืช, ืื ืื ืืืื ืืืืื
ืฉืื ืขืืืื ืืชืืื ืืงืืฆืื ืฉื ืื ื ืขื ืืื makepp, ืืื ืืื ืืื ืขืื ืืื (ืืืฉื
ืืกืจืช ืืช .c ืงืืืฅ, ืืื ื .o ืืงืืืฅ ืขืืืื ืงืืื.) ืืื ืืื ืืข ืืืช, ืืฉืชืืฉ ื-
ืืคืฉืจืืช "--rm-stale".
ืชืื ืืช ืืืื
ืืื ืืคืืก ืืื ืืื ืฉืืืื ืขื ืกืื ืืคืืก ืืงืกืืืืื ืืืฉืื. ืื ืจืืื
ืืืืื ืืช ืืืชื ืืื ืขื ืืืืงื ืฉืืื ืฉื ืงืืฆืื. ืืชืืืืจ ืืื ืืชืืืืจ ืฉื GNU
ืืืื ืืคืืก:
%.o: %.c
$(CC) -c $(input) -o $(output)
ืื ืืืืจ ืฉื ืืชื ืืืืืจ ืื ืงืืืฅ ืืกืคืจืืื ืื ืืืืืช ืฉืชืืื ื-"*.c".
ืงืืืฅ .o ืืืชืืื ืืืืฆืขืืช ืืคืงืืื ืื ืชืื ื.
ืฉืื ืื ืฉืืืืืืช ืืืืืช ืืกืืคืงืืช ืืกืคืจ ืชืืืช ืืคืืก. ืืืืืื, ืื ืฉืื xyz.o ืคืืื
ืชืืื ืืืชืืื xyz.cpp ืงืืืฅ, ืืื ืขื ืงืืืฅ ืฉื ืงืจื moc_xyz.cflags ืืฉืจ
ืืืื ืืช ืืคืฉืจืืืืช ืืืืืจ, ืื ืืืื ืืืชืืื ื:
%.o: %.cpp %.cflags
$(CXX) `cat $(stem).cflags` -c $(inputs) -o $(output)
ืืืชืื ืฉืืฉ ืื ืื ืืกืคืจ ืืขืื ืืคืืก. ืืืืืื,
%.tab.h %.tab.c : %.y
yacc -d $(ืงืื)
&mv y.tab.h $(ืกืื).tab.h
&mv y.tab.c $(stem).tab.c
ืืืจื ืืื, ืืืื ืืคืืก ืืืคืฉืื ืจืง ืงืืฆืื ืืกืคืจืืืช ืื ืืืืืืช. ืืชื ืืืื ืืืืจืื
ืืืชื ืืืคืฉ ืืกืคืจืืื ืื ืืืืืช ืืืื ืืกืคืจืืืช ืฉืืชืืชืื ืืคื ืืืืจื
makepp_percent_subdirs := 1
ืืคื ื ืืื ืืืคืืก ืืจืืฉืื ื-makefile ืฉืื โโืื ืืฉืืจืช ืืคืงืืื ืืืฉื.
ืืฉ ืืืื ืืจืืจ ืืื "%" ืืืื ืืชื ืืืืื "*", ืื ืื ืฉื ืืื ืชืืืืื ืืื
string: ืืชื ืืืืื ืืืืืจ ืจืฉืืื ืฉื ืงืืฆืื ืฉื ืืฆืืื ืืฉืืืืฉ ืืื ืืืืชื ื ืงืืื. ืืื
ืื ืชืืื ืืืืื .o ืงืืฆืื ืฉื ืืชื ืืื ืืช ืืื:
ืคืจืื: *.o
$(LD) $(LDFLAGS) $(ืื ืืกืืช) -o $(ืคืื)
ืื ื ืืชื ืืื ืืืฉืื ืืืช ืขื ืืื ืืืืคืช "*" ื-"%", ืืืืืื ืฉืืืืจืื ืืื ืืื ืืืื
ืืชืืื ืฉื ืงืื ืืคืื, ืืฆืืจืช ืืื ืืื ืคื ืืื ืขืืืจ ืื ืืืข ืืืชืื.
ืกืืื ืืคืืก ืืืื
ืืื ืืคืืก ืกืืื ืืื ืืื ืืคืืก ืืืืื ืจืง ืขื ืงืืืฆื ืืืืืืช ืฉื ืงืืฆืื:
$(SPECIAL_MODULES).o : %.o : %.cpp
$(CXX) -c $(ืงืื) -o $(ืคืื)
ืื ืืืืจ ืฉืืื ืืืคืืก ืื ืจืง ืขื ืืงืืฆืื ื-"$(SPECIAL_MODULES).o".
ืื ืืขืืงืจ ืืฉืืื ืชืืืืืช ืขื GNU make; ืืืืื ืืงืืืืื (ืจืื ืืืื) ืื ืขืื
ืืจื ืขืืฆืืชืืช ืืขืฉืืช ืืช ืืืชื ืืืืจ.
ืืื ืืื ืืืื
ืชืืืืจ ืืื ืืืคืืกืื ืืขืื ืืืง ืืกืคืืง ืืื ืืชืืื ืืืขื ืืื ืืื ืืื, ืืื
ืืื ืคืขื ืืฉ ืฆืืจื ืืขืฉืืช ืืฉืื ืืืชืจ ืืกืืื. Makepp ืืกืคืง ืืืชืจ
ืชืืืืจ ืจื ืขืืฆืื: ืืกืขืืฃ ":foreach" ืขืืืจ ืืืื.
target_expression: dependency_expression: ืขืืืจ ืจืฉืืืช ืงืืฆืื
ืคืขืืืืช
ืืกืื ืืคืฉืื ืืืืชืจ ืฉื ืืื ืืื ืืื ืืื ืจืง ืืื ืืคืืก ืฉืืืืฉืื ืฉืื ืืืืื
ืืจืฉืืื ืกืคืฆืืคืืช ืฉื ืงืืฆืื. ืืืืืื, ื ื ืื ืฉืืฉ ืื ืืื ืืคืืก ืฉืืืืจ
makepp ืืื ืืงืืคื ืืื .c ืงืืฆืื. ืขื ืืืช, ืืฉ ืื ืจืฉืืื ืฉื .c ืงืืฆืื ืฉืขืืืจื ืืชื
ืจืืฆื ืืขืฉืืช ืืฉืื ืืืจ. ืืชื ืืืื ืืขืฉืืช ืืฉืื ืืื:
# ืื ื ืืืื ืฉืื ืขื ืืื:
%.o : %.c
$(CC) $(CFLAGS) -c $(ืงืื) -o $(ืคืื)
%.o : %.c : foreach $(SPECIAL_MODULES)
$(CC) $(SPECIAL_CFLAGS) -c $(ืงืื) -o $(ืคืื)
ืฉืืืืฉ ืขืืฆืืชื ืขืื ืืืชืจ ืืืืืื ืฉื ืื ืืื ืื ืฆื ืืช ืืขืืืื ืฉืืืฉืชื ื
"$(foreach)" ืืืืืจ ืืชืืจื ืืื ืงืืืฅ ืืชืืื ืืจืฉืืืช ืืงืืฆืื ืืืืืจื ื
ืืืืืื ืชืืืช ืืืขืจืืื. ืจืฉืืืช ืืงืืฆืื ืขืฉืืื ืืืืื ืชืืืื ืืืืืื, ืืืื
ืืืชืืื ืืคืืื ืงืืฆืื ืฉืขืืืื ืื ืงืืืืื ืืื ืฉื ืืชื ืืื ืืช (ืจืื "ืชืืืื ืืืืืื" ื
makepp_rules).
ืืื ืชืืืืจ ืื ืื ืืื ืืื ืืื ืืืืฉ ืืืืชืจ, ืืืื ืืืฉืชื ื "$(foreach)".
ืขืฉืื ืืืืคืืข ืืื ืืจื ืืืืืื. ืจืืฉืืช, ืฉืื ืื ืฉืืืื ืืืคืืก ืื ืืืขืฉื ื
ืืงืจื ืืืืื ืฉื ืืืืื ืืงืืืืื; ืืื ืืืคืืก
%.o : %.c
$(CC) $(CFLAGS) -c $(ืงืื) -o $(ืคืื)
ืฉืืื ืืืืืง ื:
$(patsubst %.c, %.o, $(foreach)) : $(foreach) : foreach *.c
$(CC) $(CFLAGS) -c $(ืงืื) -o $(ืคืื)
(ืืืขืฉื, ืื ืืืืจ ืืขืจื ืืื ืคื ืืื.)
ืืืืืื ืืืืคื ืฉืื ืืชื ืืฉืชืืฉ ืืกืขืืฃ ":foreach" ืฉืื ืืื ืืคืืก ืืื ื
ืืกืคืืง, ื ื ืื ืฉืืฉ ืื ืืื .c ืงืืฆืื ืฉื ืื ืื ืืืืฆืขืืช ืืืืฉืื ืืขืื ืงืื
ืืฉืจ ืืืงื ืืงืืฆื ืงืื ืขื a .k ืกืืืืช. ืืชื ืจืืฆื ืืืจืืื ืืืชื .c ืงืืฆืื ืขื ื
ืงืืืฆื ืฉืื ื ืฉื ืืคืฉืจืืืืช ืืืืืจ ืืืจืืื .c ืงืืฆืื ืฉืื ืืงืืจ ืจืืื
ืงืืฆืื. ืืชื ืืืื ืืขืฉืืช ืืฉืื ืืื:
# ืืื ืขืืืจ ืงืืฆื โ.c ืจืืืืื:
%.o : %.c
$(CC) $(CFLAGS) -c $(ืงืื) -o $(ืคืื)
# ืืื ืืืฆืืจ ืงืืฆื .c ืืงืืฆื .k:
%.c : %.k
$(ืงืื ืืขืื) $(ืงืื) > $(ืคืื)
# ืืืื ืื ืืื ืืืืืืื ืขืืืจ ืงืืฆื .c ืืฉืจ ืขืฉืืืื ืืงืืฆื .k:
$(foreach:%k=%.o) : $(foreach:%c=%.k) : foreach *.k
$(CC) $(SPECIAL_CFLAGS) -c $(ืงืื) -o $(ืคืื)
(ืื ืืฉืชืืฉ ืืชืืืืจ ืืืชืืืืกืืช ืืืืืคื ืืขื ืืืชืจ ืชืืฆืืชืืช ืืืงืื ืงืืจื
"patsubst" ืืืคืืจืฉ.)
ืฉืื ืื ืฉืื ืื ืื ืฉืืชื ืจืืฆื ืืขืฉืืช ืืื ืืฉื ืืช ืืช ืืขืจื ืฉื ืืฉืชื ื ("CFLAGS" ืืื
ืืืงืจื) ืืคืขืืื ื ืื ืืืชืจ ืืืฉืชืืฉ ืืืฉืชื ืื ืกืคืฆืืคืืื ืืืขื.
ืืึนืจึถืฉืึถืช ืกึดืืึนืึถืช ืืืื
ืขืืืจ ืชืืืืืช ืืืืืจ, makepp ืชืืื ืืืืื ืืกืืืืช ืืกืื ืื ืืืฉื.
.suffix1.suffix2:
ืคืขืืืืช
ืฉืืื
%.suffix2: %.suffix1
ืคืขืืืืช
ืืื ืืจืื ืืืชืจ ืงืฉื ืืืืืจ. (ืืืื ืกืืืืช ืงืืื?) ืืืจื ืืื ืืืคืืข ืืื
ื-makefile ืืืืจ ืงืืื ืืื ืื:
.ืฉืืชืืฃ:
$(CC) $(CFLAGS) -c $*.c -o $*.o
ืฉืืงืืื ืืืืืง ื
%.o : %.c
$(CC) $(CFLAGS) -c $(ืงืื) -o $(ืคืื)
ืืชื ืืฉ ืืืื
ืืืฉืจ ืืฉ ืืืชืจ ืืืจื ืืืช ืืืฆืืจ ืงืืืฅ, makepp ืืฉืชืืฉ ืืืืื ืคืฉืื ืืื
ืืงืืืข ืืืืื ืืื ืืืฉืชืืฉ.
ยท ืืืื ืฉืืืื ืฉืืฉ ืืืืื ืืคืืจืฉืื ืกืืชืจืื ืืื ืืืช ืงืืืฅ.
ยท ืืืงื ืืคืืก ืืืืืื ืืงืืืืื ืขื ืชืืืื ืืืืืื ืืขืืื ืืื ื ืขืืงืคืื ืืืืื ืืคืืจืฉืื. ืืื
ื ืืชื ืืืฉืชืืฉ ืืืืืื ืืคืืจืฉืื ืืื ืืฆืืื ืืจืืืื ืขืืืจ ืืืื ืืคืืก. (ืฉืื ืื ืฉืคืฉืื
ืฉืืืืฉ ืืกืขืืฃ ":foreach" ืืื ื ืืืคื ืืฉืื ืืืื ืืคืืก. ืืืื ืืืืืช ืื ื
ืชื ืืืื (ืืื "*" ืื "?") ืืืืง ืืฉื ืืงืืืฅ ืืกืขืืฃ ":foreach". ืื ืื
ืจืง ืจืฉืืื ืืคืืจืฉืช ืฉื ืงืืฆืื, ืืื ืืืืคืืช ืืืื ืืคืืจืฉ ืขืืืจ ืื ืืื ืืื
ืงืืฆืื.)
ยท ืืืฉืจ ืืืงื ืืคืืก ืกืืชืจืื ืืืืขืื ืืงืืฆื makefile ืฉืื ืื, ืืืืื ื"ืงืจืื ืืืชืจ"
makefiles ืขืืงืคืื ืืืงืื ืืงืืฆื makefile "ืจืืืงืื ืืืชืจ". "ืงืจืื ืืืชืจ" ืคืืจืืฉื ืฉื-makefile
ืืืืงื ืงืจืื ืืืชืจ ืืืขื ืืืืจืจืืืืช ืืกืคืจืืืช (ืืืืืจ, ืฉื ืืงืืืฅ ืฉื
target ืืืกืืช ืืกืคืจืืื ืฉืืื ื ืืืคืขื makefile ืงืฆืจ ืืืชืจ). ืื ืื
ืื ืืืืื ืืื ื-makefile, ืื ืืืื ืื-makefile ืฉื ืืขื
ื ืขืฉื ืฉืืืืฉ ืืืจืื.
ืืฉืืขืืช ืืืืจ ืืื ืฉืืชื ืืืื ืืฆืืื ืืื ืืคืืก ืืื ืขื ืื ืืงืืฆืื ืฉืื
ืขืฅ ืืกืคืจืืืช ืืืื ืจืง ืืงืืืฅ ื-make ืืจืื ืืขืืืื ื, ืืื ืื ืืชื ืืืื ืืขืงืืฃ ืืืชื
ืงืืืฅ makefile ืืจืื ื ืืืื ืืืชืจ. ืืืืืื, ืงืืืฅ ื-makefile ืืจืื ืืขืืืื ื ืฉืื ืืืื ืืืืื:
%.o : %.c : foreach **/*.c
$(CC) $(CFLAGS) -c $(ืงืื) -o $(ืคืื)
ืืืืื ืืืืืช ืื ืงืืืฅ makefile ืืืืช ืืชืืงืืืช ืืืฉื ื ืฉืืืืจ:
%.o : %.c
$(CC) $(SPECIAL_CFLAGS) -c $(ืงืื) -o $(ืคืื)
ยท ืืืื ืืคืืก ืืขืื ืฉืจืฉืจืช ืืกืงื ืืช ืงืฆืจื ืืืชืจ ืืืขืืคืื ืขื ืคื ื ืืคืืก ืืืจ
ืืืืื. ืืืืืื, ืื ืืื ืื ืืช ืืืืืื ืืืืื (ืืืชืืกืก ืขื ืืืืื ืื-
ืืืืช ืืื ืืงืก):
%.s: %.c
$(CC) -s $(input) -o $(output)
%.o: %.s
$(AS) $(input) -o $(output)
%.o: %.c
$(CC) -c $(input) -o $(output)
ืื ืื ืื ื ืฆืจืืืื ืืื ืืช "xyz.o", ื ืืื ืืื ืืช ืืช ืงืืืฅ ืืืื ืืื ".s" ืืื
ืืคืขื ืืช ืื ืืจื ืืืกืืืืจ ืืืืฆืขืืช ืฉื ื ืืืืืื ืืจืืฉืื ืื, ืื ืฉื ืืื ืืืืช ืืฉืืจืืช ื-a
ืงืืืฅ ".o" ืืืืฆืขืืช ืืืื ืืืืจืื. ืืืื ืืืืจืื ืขืืืฃ ืื ืืฉ ืคืืืช
ืฉืืืื ืืฉืจืฉืจืช ืืืกืงื (ืืื ืืืงืื ืฉื ืืื).
ยท ืืืื ืืคืืก ืืืืืจ ืืืชืจ ื-makefile ืขืืงืคืื ืืืื ืืคืืก ืืืงืื ืืืชืจ. (ืื
ืืืืืจ ื-GNU make.) ืื ืืืืจ ืฉืืชื ืฆืจืื ืืฉืื ืืช ืืืืืื ืืืืืืื ืืืชืจ ืฉืื
ืืืงืื ืืืชืจ, ืืืืืืื ืืกืคืฆืืคืืื ืืืชืจ ืฉืื ืืืืืจ ืืืชืจ. ืืืืืื,
%.o: %.c # ืืื ืงืืืคืืืฆืื ืืืื.
ืคืขืืื
special_%.o: special_%.c # ืืื ืืืืื ืืงืืฆืื ืขื a
ืคืขืืื ืฉืื ื # ืงืืืืืช "special_".
ืืื ืืคืฉืจืืืืช
ืืคืขืืื ืืฉ ืฆืืจื ืืกืคืง ืืคืฉืจืืืืช ื ืืกืคืืช ืืื ืืฉื ืืช ืืช ืืืืคื ืฉืื makepp ืืืฆืข ืืช
ืึผึฐืึธื. ืืคืฉืจืืืืช ืืื ืืฆืืื ืืช ื-":optionname value", ืืฉืืจื ืืืืืื
ืืชืืืช, ืื ืืฉืืจื ืืืื.
ืืกืคืงืช ืืืคืฉืจืืืืช ืืงืืืื ื ืคืจืืื ืขืฉืืื ืืืคืฉืจ ืื ืืืฉืชืืฉ ืืืืชื
makefile ืขื makepp ืืืืฆืืจ ืืกืืจืชื. ืืืืืื,
ืืขื: ืชืืืช
: ืืชืืื target_newer
ืคืขืืืืช
ืืขืืื ืืฆืืื ืขื ืืฆืจื Unix ืืกืืจืชื, ืืืืืื ืฉืืื ืืคืจืฉ ืืช ืืฉืืจื ": ืืชืืื".
ืืคืงืืื ืฉื ืืขืืคืช, ืืคืงืืื ืฉืืชืืืื ืื ืงืืืชืืื ืื ืขืืฉื ืืืื.
:build_cache /path/to/build/cache
ืืขื: ืชืืืช
: build_cache /put/cache/files/over/there
ืคืขืืืืช
ืืฆืืื ืืช ืื ืชืื ืืืืืื ืื ืืื ืฉืืฉืืฉ ืขืืืจ ืงืืฆืื ืืืืืฆืจืื ืขื ืืื ืืื ืื. ืึถื
ืขืืงืฃ ืืช ืืืฉืคืขื ืฉื ืืืฉืคื "build_cache" ืื ืืคืงืืื "--build-cache".
ืืคืฉืจืืช ืงื, ืื ืืืื, ืขืืืจ ืืื ืื. ืจืื makepp_build_cache ืืคืจืืื ืขื build
ืืืืื ืื.
ืื ืืชื ืืฆืืื "ืืื" ืืืงืื ื ืชืื, ืืชื ืืฉืืืช ืืช ืืืืื ืืื ืืื ืขืืืจ ืื
ืืื ืืกืืื. ืื ืืืื ืืืืืช ืฉืืืืฉื ืืื ืืื ืืข ืืืืื ืฉืื ืืืกืง ืขื ืงืืฆืื ืฉืืชื
know ืืื ื ืฉืืืืฉืืื ืืืืกืื ืืืืืื, ืื ืืฉืื ืฉืืชื ืืืื ืืืื ืฉืื ืืขืืื ืื ืืืื
ืืฉืืืืฉ ืืืืจ ืื ืืืื ืฉืื ืื ืืืื ืื ืื ืืืจ ืฉืื ืืืื ืืืืกื ืืืชื ืืืืืื.
:build_check build_check_method
ืืขื: ืชืืืช
: build_check target_newer
ืคืขืืืืช
ืื ืืืืจ ื-makepp ืืืืื ืืืืืจืืชื ืืืฉืชืืฉ ืืื ืืืืืื ืื ืืฉ ืืื ืืช ืืืืฉ ืืช ืืืืจืืช.
ืจืื makepp_build_check ืืคืจืืื ื ืืกืคืื. ืื ืขืืงืฃ ืืช ืืืฉืคืขื ืฉื
ืืฆืืจืช "build_check" ืื ืืคืฉืจืืช ืฉืืจืช ืืคืงืืื "--build-check-method", ืื ืืฉ, ืขืืืจ
ืืืืง ืืื.
:env ืึดืฉืึฐืชึทื ึถื ...
ืืืกืฃ ืชืืืช ืืขืจืืื ืฉื ืืฉืชื ื ืืกืืืื ืืขืื ืืฉื. ืื ืืืฉืื ืืื
ืฉืื ื ืืืืื ื ืืงืืื, ืื ืืืขืืื ื ืืฉืืื ืื ืืขืืืื ืื, ืื ื
ืฉืืืช build_check ืื ืืืชืืื. (ืื ืฉืืืืช ืืืื ืื ืืืืื ืืช ืืืขื
target_newer ืชืืื ืืช ืื.)
VARIABLE ืขืฉืื ืืืืืช ืืฆืืจืช "ืฉื ืงืืืฅ ื-PATH_VARIABLE" (ืืืจืืืืช), ืืืืงืจื ืื
ืืขืืื ื ืืฉืืื ืื ืืขืืืื ืื ืื ืืกืคืจืืื ืืจืืฉืื ื ืืื ืงืืืชืืื ืืืคืจืืช
ืืขืจื ืฉื PATH_VARIABLE ืฉืื ืงืืื ืฉื ืืงืืืฅ ืฉืื ื ืืืืื ื ืืืืจืื.
ืื ืืืื ืืฉืืฉ ืืื ืืืืื ืข ืืื ืืื ืืืืฉ ืฉื ืืืขืืื ืืืฉืจ PATH_VARIABLE ืืฉืชื ื ื-
ืืจื ืื ืจืืืื ืืืช.
:ืึฐืฉืึทืึตืจ ืืคืงืืื ...
ืกืืืจ ืื ืคืขืืืช ืืขืืคืช (ืื ืื ืคืขืืืืช Perl ืืื ืื ืคืงืืืืช Perl) ื-"sh -c '...'"
ืืชืงืืืื ืืืชื ืืคืงืืื, ืื ื ื ืื ืฉืืืืจื ืืื ื ืชืืืื ืืคืงืืื.
ืื ืฉืืืืฉื ืื ืืจืฆืื ื ืืฉืืื ืคืขืืืืช ืืืขืจืืช ืชืืจ ืขืืืื, ืื ืืชืืฆืื ืืื
ืืื ืื ืืื ืฉืืื ื ืชืืืื ืืคืจืืืจืื ืฉื ืชืืจ, ืืื ืื ืื ืืชืืจ
ืืืขืจืืช ืืฉืืฉืช ืืืื.
:ืึดืืืึนื file_or_pattern
ืืืื ืืฉืชื ื ืืืชืื ืืืืืจ:
%.o : %.c
: ืืืืืื %.d : ืืชืืื C
gcc -MD -c ...
%.o : %.c
: include %.u : signature C # IBM ืืฉืชืืฉืช ืืกืืืืช ืืืจืช
xlc -M -c ...
sub dependify { # ืืคืื ืืช ืืคืืคืื ืฉื ืืืงืจืืกืืคื ืืคืืจืื ืฉืืืืฉื
s/\$/\$\$/g;
s/(ืืขืจื: ืืืื ืงืืืฅ: *)?(.+?)\r?\n/$1 ? "'$2' " : "'".f_output()."': "/e;
}
%.o : %.c
: ืืืืืื %.d : ืืชืืื C
cl -showIncludes -c ... >$(stem).d
&sed &dependify -o +<$(stem).d
ืืื ืืืืจืื (icc ืฉื ืืื ืื ืืืืืง ืืื gcc ืืืขืื, ืื xlc ืฉื ืืื) ืืืืืื ืืืืฆืจ ืชืืืช
ืงืืฆืื ืชืื ืืื ืชื ืืขื. ืืืืืจ, ืืืื ืฉืื ืงืืืคืืืื, ืื ืืืชืืื makefile ืฉ-makepp ืืืื
ืึดืืืึนื. ืืืชืจืื ืขื ืืกืืจืง ืฉื makepp ืืื ืฉืืื ืืืืื ื-100%
ื ืืื, ืืืคื ืฉืจืง ื ืชืงืจื.
ืืคืฉืจืืช ืื ืจืืชืืช ืืืช ืืฆืืจื ืืืืืืช: ืื ืืงืืืฅ ืืื ื ืงืืื, ืืืืืจ
ืืืจื ืืื ืืื ืืื ืืจืืฉืื ื, ืืชืจืืฉืช ืกืจืืงื ืจืืืื. ืืื ืื ืืงืืืฅ ืงืืื, ืื
ืืชืจืืฉืช ืกืจืืงื (ืืืื ืื ื ืืฆืืื ืื ืืชืืื ืืืื ืืืขืื -- ืื ื ืคืืืืช ืกืจืืงื
ืืืจื ืืืจืืจืช ืืืืื ืืืืืืืืช ืฉื ืืืชืืช ืืื ืืืืื). ืืืงืื ืืืช ืืื ืืืื ืืช ืืงืืืฅ, ืืคื ื
ืืืฆืืข ืืืื. ืืืืจ ืืืฆืืข ืืืฆืื ืฉื ืืืื, ืืื ืฉืืื ืื ืฉืื ืืืื
ืงืจื ืืคืขื ืืจืืฉืื ื, ืืืชืืฉื ืืื ืฉืืงืืืฅ ืืื ืืืืฉื. ืืืงืื ืื ืืชืื
ืืงืืืฅ ืฉืื, ืื ืืื ืืฉืชื ื, ืขืืืจ ืืืืข ืื ืืื ืืขืืืื.
ืืืืจื: ืื ืืืืขื ืื ืืืื. ืงืืืฅ ืืชืืืช ืืืืฆืจ ืขื ืืื ืืืืื
ืืื ืฉืขืืืจื ืืืืืจ ืืชืืืช. ืืฆื ืฉื ื, ืืืืืจ ืืืืข ืขื ืืื
ืื ืืืื ืืฉื ื ืคื ืืื, ืฉืืงืืค ืืืจื ืืื ืืชืขืื ืืื ื. ืืืื ืืืื ืืช
ืืชืจืื ืจืง ืืืงืจื ืฉืื ืชืืงืื ืืืืจ ืืชืงื ืจืง ืืช ืืืฉื ื ืืืื. ื
ืืืืืจ ืืื ืฉ-makepp ืืกืชืื ืขื ืืจืื ืืืชืจ ืงืืฆืื, ืืื ืืืงื ืืื.
ืืฉ ืืืืื ืืืฉืจ ืืชื ืืกืืจ ืืฉืคื "#include". ื ืืงืืืฅ ืืืชืืื:
ืื ืขืืืื ืืืืืจ ืืงืืืฅ ืืชืืืช ืืืคืขื ืืืืจืื ื, ืืฉืืื ืืืืชื
ื ึธืืึผืฅ. ืืืงืจื ืืื ืขืืื ืืขืจืื ืืช ืงืืืฅ ืืชืืืช ืืื ืืืกืืจ ืืช ืืชืืืช
ืฉืืืจ ืื ื ืืชื ืืืืืืฉ.
ืื ื ืืชื ืืืฉืชืืฉ ืืชืืื ื ืื ืขื ืืืืื ืื ืืื ืืืื ืฉืืืคืช ืงืืืฅ ืืฉื
ืืืจืฉ ืืืขืช ืืื ืขื ืืงืืืฅ. ืืื ืงืืืฅ ืชืืืช ืชืืื ืืืื
ืงืืฆืื makepp ืืืื ืขื ืืื ืงืจืืืชื. ืชืืืช ืืขืืืืช ืืื ืืื ื ืจืืืื
ืืคืฉืจื ืืืขืจืืช ืื ืืื ืืืื ื. ืื ืืจืื ืื ืืืืจ ืื ืืื ืืืืฉ
ืืงืจืืื ืืืืจืช ืฉื ืงืืืฅ ืชืืืช ืืื ืฉืื ืชืงืื.
ืื ืชืื ื ืืืืืจืื ืฉืื, makepp ืืืกืืฃ ืืช ืงืืืฅ ืืชืืืช ืื-
ืืืืจ ืจืืฉืื ืฉืืืื ืืื. ืื ืื ืืืื ืืงืืฆืื ืืืจืื, ืฉืืื ืื ืืืงื ืืช ื-1
ืขื ืืืชืืื ืืฆืคืืื. ืื ืขืืืฃ ืืืฉืจ ืืื ืืช ืืืืื ืื, ืฉื ืืืืกืจ
ืืชืืื, ืื ืืคืืื ืื ืืืื ืืืฆืื ืืช ืืงืืืฅ.
:ืืืืืื ืืช ืืืืจืื ื
ืืคืฉืจ ืืื ืคืชืื, ืืืื
%.foo foo%.bar: :last_chance
&echo $@ -o $@
&cp $(ืคืืืื)
ืืืืืื ืฉืืื ืืื ืืืื ืืืฆืืจ ืืกืคืจ ืืื ืกืืคื ืฉื ืืืจืืช,
ืืขื ืฉื ืืื ืื ืื ืืชืืื ืืคืื ืงืฆืื $(ืชื ืืืื) ืื ืืื ืืคืืก ืืื ืื ืื
ืืฉืื ืืืจ ืืืจ ืืืฆืข ืืช ืืืื ืขื ืืื ืืคื ืื ืกืคืฆืืคืืช ืืืืจื.
ืืชืจ ืขื ืื, ืื ืฆืืื "--rm-stale", ืื ืืืจื ืฉื ืฉืืจื ืืงืืืืชื
makepp run ืืืจืื ืืขืืคืฉ ืื ืืืจื ืืืืืื ืืื ืืช ืืืชื ืืื ืืืืฆืขืืช ืืื last_chance
ืฉืขืืืื ืื ืืืฆืข ืขืืืจ ืืืขื, ืืื ืืชื ืืืืช ืจืฆืืื ืืืืืื
ื-build ืืืืฉื ืืืืคื ืขืงืื ืืืชืจ ืืืฉืจ ืืื ืืกืชืื ืืืขืืช ืขื ืชืืืื ืืืืืื ืืืืคืืฉ
ืืืชืืื ืืขืืื ืืจืืฆื ืงืืืืช.
ืืืคืฉืจืืช ":last_chance" ื ืืขืื ืืืกื ืชืฉืืืช ืื ืืืชื ืืืืช ืืืืืืืช ืฉื ื-
ืืื ืืืืก ืืชืืืื ืืืืืื ืชืืืืื.
: ืื ืชื ืื ืชื
ืื ืืืืจ ื-makepp ืืืฆื ืื ืชื ืืช ืืคืงืืื ืืืืืื (ืืืื) ืงืืฆืื. ืึผึฐืึถืจึถื ืึผึฐืึทื,
makepp ืื ืืฉ ืืืฆื ืืขืฉืืช ืืืช ืขื ืกืื ืืืืืื ืืคืงืืื ืขืฆืื (ืจืื
makepp_scanning ืืคืจืืื). ืขื ืืืช, ืื makepp ืื ืืฉ ืื ื ืืื, ืืืื ืืืื
ืฆืืื ืืืคืืจืฉ ืืช ืืื ืชื, ืื:
%.o: %.abc
: ืื ืชื c_compilation
ืคืขืืื ืืื
ืื ืืืจื ื-makepp ืืืฆืข ืืช ืืืชื ื ืืชืื ืืกืจืืงื ืฉืืื ืขืืฉื ืขืืืจ C/C++
ืืื ืืช ืคืงืืืืช, ืื ืื ืืื ืื ืืืื ืืช ืืคืขืืื ืืงืืืคืืืฆืื C.
ืื ืชื ืืจืืจืช ืืืืื ืชืืื ืืคืงืืื. ืื ืื ืชืฆืืื ืืคืฉืจืืช ":parser",
ืืืืจ ืืื ื ืืืงืช ืืืืื ืืจืืฉืื ื ืฉื ืื ืคืงืืื. ืืืฉื ืืงืืืคืืืฆืื ืื ืงืืฉืืจ
ืืคืงืืื, makepp ืืฉืชืืฉ ืืื ืชื "c_compilation"; ืื ืื ืืคืงืืื ื ืจืืืช ืืื
ืืจืกื ืฉื GNU, "gcc_compilation". ืื ืื ื ืืฆื ืื ืชื ืืื ืืฉืชืืฉ ืืื ืชื "ืืื". ื
ืคืจืืื ื ืืกืคืื ืขื ืื, ืื ืื ืืชื ืจืืฆื ืืืชืื ืื ืชื ืืฉืื ืื ืืฉื ืืช ืืช ื-makepp
ืื ืชืื ืืจืืจืช ืืืื, ืจืื makepp_scanning.
ืฉืื ืื ืฉืื ืื ืขื ืื ืคืงืืื ืืืื, ืฉืืืื ืืื ืื ืื ืฉืืชื ืจืืฆื:
%.o: %.c: ืื ืชื c-ืงืืืคืืืฆืื
@echo 'ืื ืืืช $(ืคืื)'
@funny_cc...
ืื ืื ืืคืจืฉ ืืช "ืื" ืืงืืืคืืืืจ ืืืกืืง ืืช ืืืืขืื ืฉืื 'ืื ืืื
mymodule.o' ืืชืืืช ืืจืืืืช. ืื ืืืืื ืืชืืื ื ืฉืื
ืื ืืืืข ืืื ืืื ืืช ืงืืืฅ ืืื. ืืืงืจื ืื ืขืืืฃ ืื
"register_parser". ืฉื ืืชื ืืืฆื ืืกืืจ ืืื ืื ืชื ื ืืชื ืืชืช ืื ืืชืืจ ื
ืฉื ืืืชื ืื ืืฉื ืคืื ืงืฆืื.
:ืึฒืชึดืืึธื ืืชืืื_ืฉืืื
ืืขื: ืชืืืช
: ืืชืืื md5
ืคืขืืืืช
ืื ืืืืจ ื-makepp ืืืืื ืืืืืจืืชื ืืืฉืชืืฉ ืืื ืืงืืืข ืื ืืชืืืช ืืฉืชื ื.
ืจืื makepp_signatures ืืคืจืืื ื ืืกืคืื. ืฉืืืืช ืืชืืื ืืืืืืืช ื-
ืืคืฆืช makepp ืื "ืจืืื", "md5", "C" ืื "c_compilation_md5", ืืื
"ืืืืืืงื_ืืฉืืชืฃ". ืื ืขืืงืฃ ืื ืฉืืืช ืืชืืื ืฉืฆืืื ื ืขื ื-"-m" ืื
ืืคืฉืจืืืืช ืฉืืจืช ืืคืงืืื "--signature-method", ืื ืขื ืืฆืืจืช "ืืชืืื".
ืืืืื ืชืืืื
Makepp ืืืื ืืชืืื ืืฉืืืช ืงืืฆืื ืฉืืฉ ืืื ืชืืืื ืืืืืืื ืืื ื ืงืืืชืืื ืื ืจืืื.
ื ื ืื, ืืืฉื, ืืชื ืจืืฆื ืืืฆืืจ ืงืืืฅ ืืฉื "a:thing" ืืืงืืืฅ "b:thing".
ืืชื ืื ืืืื ืืืชืื ืืช ืืืื ืื:
a:thing : b:thing # ืืืื ืฉืืืืช ืชืืืืจ
&cat $(ืงืื) -o $(ืคืื)
ืื makepp ืื ืืืืข ืืืื ื ืงืืืชืืื ืืคืจืืืื ืืื ืืืจืืช ืืชืืืช ืืืืื
ืืืง ืืฉืืืช ืืงืืฆืื. ืืืงืื ืืืช, ืคืฉืื ืืืกืฃ ืืช ืืฉื ืืืจืืืืช, ืื:
"a:thing" : "b:thing"
&cat $(ืงืื) -o $(ืคืื)
ืืขืช ืืืื ืื ืืฉืืขื.
ืชืืืืจ ืืฆืืืืืื ืฉื Makepp ืื ืืืื ืืื ืฉื ืืืขืืคืช. ืืชื ืืืื, ืืืฉื, ืืืฉืชืืฉ ืืกืื ืื
ืืจืืืืช ืืืงืื ืืจืืืืช ืืคืืืืช, ืื ืฉืืชื ืืืื ืืืจืื ืืชืืืื ืืืืืืื ืขื ืงื ื ืืื ืืืืจื:
a\:thing : 'b:thing'
&cat $(ืงืื) -o $(ืคืื)
ื ื ืื, ืืืฉื, ืฉืฉื ืืงืืืฅ ืฉืื ืืื "'"!;\$". ืขืืฉืื ืืื ืืชื ืจืืฆื ืฉื ืงืืืฅ ืืื
ืื ื ืื ืืืืข, ืืื ืื ื ืืื ืืจืืื ืฉืืชื ืืืื ืืฆืืื ืืช ืื ื-makepp (ืืืงืืืคื):
\''"!;\$$'
"'\"!;\\$$"
ืฉืืื ืื ืืชื makepp ืจืฆืืขืืช ืฆืืืืืื ืืืชื ืืงืืืคื ืขืืฉื ืืืช. ืืืืงืืค ืืกืชืื
ืฆืืืืืื ืจืง ืืืงืจืื ืืืืื:
ยท ืืืฉืคืืช ืืืืื ืื "ifeq".
ยท ืืคื ื ืืืืจื ื ืงืืืชืืื ืืืื
ยท ืืคืงืืื ืืืื ืืช ืฉื makepp
ยท ืืคืื ืงืฆืื ืื ืืืขืช ืืงืืฆืื
ืื ืืืื ืืืขืืคืช, makepp ืื ืืจืืื ืืจืืืืช ืชืื ืืงืฆืืชื ืืืฉืชื ื. ืืื
ืืืืืื ืืืืื ืืืื:
FILE = 'ืฉื ืขื ืจืืืืื'
x := $(ืืืคืก $(FILE)) # ืจืง ืืื ืืืืืง ืฉืืืจืืืืช ืขืืืื ืฉื
$(FILE): # ืืจืืืืช ืกืืื ืงืืืฅ ืืืื ืฉืืืกืจ ืขื ืืื makepp
&echo hello -o$(FILE) # ืืจืืืืช ืกืืื ืงืืืฅ ืืืื ืฉืืืกืจ ืขื ืืื makepp
echo there >>$(FILE) # ืืจืืืืช ืกืืื ืงืืืฅ ืืืื ืฉืืืกืจ ืขื ืืื Shell
'ืฉื ืขื ืจืืืืื':
&echo hello -o'name with spaces'
echo there >>'$(output)' # ืืจืืืืช ืืืคืฉืื ืืืขืื, ืืืกืฃ ืืืชื ืฉืื
ืฉืืื ืื (ืื ืืืื ื-Shell) ืืฉืชื ืื ืฉืืชืืืืื ื-"$" ืืืจืืืื ืืคืืื ืืชืื ืกืื ืื
ืฆืืืืืื. ืื ื ืืชื ืืืื ืขื ืฉืืื ืืืืจืื ืืืืฆืขืืช ืืจืืืืช ืื ืงืืืื ืืืืจืืื. ืืื ืืงืื ืืืืืืืช
ืกืืื ืืืืจ, ืืฉืชืืฉ ืืกืืื ืืืืจ ืืคืื, ืืืฉื,
$(ืื ืืืืืฃ):
@&echo ืืื ืกืืื ืืืืจ: $$
@for val in abcd; do echo $$val; ืืืฆืข
ืืืืคื ืืืื, ืืชื ืืืืจ ืืืืืช ืืกืืื ืืืชืืืื ืืืขื ืขื ืื ืืืืช ืืืืืืช ืขื ืืื ืฆืืืื ืฉืื
ืืืจื ืืืฉืื. ืื ืืืื ืจืืืืื, ืชืืื ืืงืจื ืืื'. ืขื ืืืช, ืฉืื ืื ืฉื-
ืืืืื, ืืคืฉืืช ืืืขืจืืช ืฉื makepp ืืื ืืขื ืคืฉืื ืืช, ืืื ืืชืืืื "#".
ืฉืืคื ืื ืจืืื ืืื ืืชืคืจืฉื ืืืขืจืืช ืื ืืฉื ื ืืื ืื ืืฆืืืืืช.
ืืืฉืจ ืฉื ืืขื ืื ืชืืืช ืืืื ืก ืืืฉืชื ื ืืืืืืื ืืื "$(ืคืื)", ืื
ืืืืจืืืืช ืืื ืืืืืช ืืืืืจืืืช ืืืคืฉืืืช. ืื ืืืืจ ืฉืื ืืชื ืจืืฆื ืืืชืืืืก ื
ืฉื ืืงืืืฅ ืืคืขืืืืช, ืื ืจืื ืชืฆืืจื ืืฆืื ืืืชื ืฉืื, ืื:
"ืฉื ืงืืืฅ ืขื ืจืืืืื":
echo "ืชืืื ืืืืื" > "$@"
ืื ืื ืชืฆืื ืืช ืืืืจืืืืช ืกืืื $@, ืืืขืืคืช ืชืจืื ืืช ืืคืงืืื
echo "ืชืืื ืืืืื" > ืฉื ืงืืืฅ ืขื ืจืืืืื
ืฉืืืชืืช ืืช ืืืืจืืืช "ืฉื ืงืืืฅ ืชืืื ืืืืื ืขื ืจืืืืื" ืืงืืืฅ ืฉื ืงืจื a.
ืื ืื ืจืื ืื ืื ืฉืืชื ืจืืฆื.
ืืฉืชืืฉ ื-makepp_rules ืืืื ืืจื ื ืืืืฆืขืืช ืฉืืจืืชื onworks.net