Π ΠΈΡΠ°ΡΠ΄ ΠΠΆΠΎΠ½Ρ (Richard WM Jones), Π°Π²ΡΠΎΡ
ΠΡΡ
ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ Goals
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½ΠΎΠΉ ΡΠ°ΠΊΡΠΈΠΊΠΈ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ — «ΡΠ±ΠΎΡΠΎΡΠ½Π°Ρ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ, Π΅ΡΠ»ΠΈ ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΡΠ°ΠΉΠ» ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ, ΠΈΠ»ΠΈ ΠΎΠ½ ΡΡΠ°ΡΠ΅Π΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ». Π Goals ΠΏΠ»Π°Π½ΠΈΡΡΠ΅ΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠ°ΠΊΡΠΈΠΊΠΈ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π°Π»ΠΈΡΠΈΡ URL, ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Ρ Π»ΡΠ±ΡΠΌ ΡΠ°ΠΉΠ»ΠΎΠΌ, ΠΎΡΠ΅Π½ΠΊΠ° ΡΠ±ΠΎΡΠΊΠΈ ΠΏΠ°ΠΊΠ΅ΡΠ° Π²
Koji , ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΡΡ ΡΡΠΌΠΌ, Π·Π°ΠΏΡΡΠΊ ΡΠ΅ΡΡΠΎΠ²ΡΡ Π½Π°Π±ΠΎΡΠΎΠ² Ρ Π²ΡΠ±ΠΎΡΠΎΡΠ½ΡΠΌ ΠΏΡΠΎΠΏΡΡΠΊΠΎΠΌ ΡΠ΅ΡΡΠΎΠ². - ΠΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ ΡΠ±ΠΎΡΠΎΡΠ½ΡΡ
ΡΠ΅Π»Π΅ΠΉ ΡΡΠΈΠ»ΠΈΡΠ° make Π½Π΅ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅Ρ ΡΠ°ΠΉΠ»Ρ ΠΈ ΠΈΠΌΠ΅Π½Π° ΠΏΡΠ°Π²ΠΈΠ», ΠΈ, ΠΊΠ°ΠΊ ΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠ΅, ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ·Π΄Π°Π½ ΡΠ°ΠΉΠ», ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π·Π°ΡΠ²Π»Π΅Π½ΠΎ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ ΠΏΡΠΈ Π½Π°Π»ΠΈΡΠΈΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π° Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ «test», Π·Π°ΠΏΡΡΠΊΠ°ΡΡΠ΅Π³ΠΎ ΡΠΊΡΠΈΠΏΡΡ Ρ ΡΠ΅ΡΡΠ°ΠΌΠΈ, ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ·Π΄Π°Π½ ΡΠ°ΠΉΠ» Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ «test», ΡΠΎ ΡΠ΅ΡΡΡ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π½ΡΡ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ make ΠΏΠΎΡΡΠΈΡΠ°Π΅Ρ, ΡΡΠΎ ΡΠ΅Π»Ρ ΡΠΎΠ±ΡΠ°Π½Π° ΠΈ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠ°ΠΊΠΈΡ
-Π»ΠΈΠ±ΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ (Π΄Π»Ρ ΠΎΠ±Ρ
ΠΎΠ΄Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π² make ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ «.PHONY: test»). Goals ΡΠ²Π½ΠΎ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅Ρ ΡΠ°ΠΉΠ»Ρ ΠΈ ΠΈΠΌΠ΅Π½Π° ΠΏΡΠ°Π²ΠΈΠ».
- ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° Π΄Π»Ρ ΡΠ±ΠΎΡΠΎΡΠ½ΡΡ
ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ.
Π Goals ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ². ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ Π²ΡΠ΄Π΅Π»ΠΈΡΡ ΠΈΠ· ΠΈΠΌΠ΅Π½ΠΈ ΠΏΡΠΈΠ·Π½Π°ΠΊ ΠΎΡΠ»Π°Π΄ΠΎΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°:
- ΠΡΠΎΠ±Π»Π΅ΠΌΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ shell-ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠΎΠΌ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΡΠΊΡΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΎΠ±Π΅Π»ΠΎΠ² Π² ΠΈΠΌΠ΅Π½Π°Ρ
ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ², ΡΡΠ°ΡΠ° ΡΠ΅ΡΡΡΡΠΎΠ² Π½Π° Π·Π°ΠΏΡΡΠΊ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠ³ΠΎ shell-ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ° ΠΏΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ, Π΄Π²ΠΎΠΉΠ½Π°Ρ ΡΡΠ°ΠΊΡΠΎΠ²ΠΊΠ° ΡΠΈΠΌΠ²ΠΎΠ»Π° «$» (ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ Π² shell, ΡΠ°ΠΊ ΠΈ Π² make), ΡΡΡΡ ΠΎΡΡΡΡΠΏΠΎΠ².
Π£ΠΊΠ°Π·Π°Π½Π½ΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΡΠ΅ΡΠ°ΡΡΡΡ Π² Goals ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠΈΠΌΠ²ΠΎΠ»Π° «%» Π²ΠΌΠ΅ΡΡΠΎ «$» Π΄Π»Ρ ΡΠ±ΠΎΡΠΎΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ («$» ΠΎΡΡΠ°ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ shell), ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ°ΡΡΠ΅ΡΠ°
LALR(1) , ΡΡΠ΅Π±ΡΡΡΠ΅Π³ΠΎ ΠΎΠ±ΡΠ°ΠΌΠ»ΡΡΡ ΠΏΡΡΠΈ ΠΈ ΠΈΠΌΠ΅Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ² ΠΊΠ°Π²ΡΡΠΊΠ°ΠΌΠΈ ΠΈ Π²ΡΠ΄Π΅Π»ΡΡΡ ΡΠΈΠ³ΡΡΠ½ΡΠΌΠΈ ΡΠΊΠΎΠ±ΠΊΠ°ΠΌΠΈ Π±Π»ΠΎΠΊΠΈ Ρ ΠΊΠΎΠ΄ΠΎΠΌ. ΠΠ΅ΡΡ Π±Π»ΠΎΠΊ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ, Π° Π²Π½ΡΡΡΠΈ Π±Π»ΠΎΠΊΠ° Π΄ΠΎΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠ΅ ΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°, Π±Π΅Π· ΠΏΡΠΈΠ²ΡΠ·ΠΊΠΈ ΠΊ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΌ ΠΏΡΠΎΠ±Π΅Π»Π°ΠΌ.ΠΡΠ»ΠΎ:
target: foo.o bar.o
${CC} ${CFLAGS} $< -o $@Π‘ΡΠ°Π»ΠΎ:
«target»: «foo.o», «bar.o» {
%CC %CFLAGS %< -o %@
}
ΠΡΡΠ³ΠΈΠ΅ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ Goals:
- ΠΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Π·Π°Π΄Π°Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΡ
ΠΈΠΌΡΠ½ ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ²:
goal all = : «target»
goal link =
«target» : «foo.o», «bar.o» { … }goal compile (name) =
«%name.o» : «%name.c», «dep.h» { %CC %CFLAGS -c $^ -o $@ } - ΠΠ²Π° ΡΠ΅ΠΆΠΈΠΌΠ° Π·Π°ΠΏΡΡΠΊΠ°: ΡΠ΅ΠΆΠΈΠΌ make Π΄Π»Ρ ΡΠΎΠΏΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠ±ΠΎΡΠΎΡΠ½ΡΡ
ΡΠ΅Π»Π΅ΠΉ Ρ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΡΠ°ΠΉΠ»ΠΎΠ² (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ°ΠΉΠ» «foo.o» ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΡΠ΅Π»ΠΈ «%name.o»), ΠΈ ΡΠ΅ΠΆΠΈΠΌ ΠΏΡΡΠΌΠΎΠ³ΠΎ Π·Π°ΠΏΡΡΠΊΠ° ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ:
goal all = : link
goal link =
«target» : «foo.o», compile («bar») { … }goal compile (name) =
«%name.o» : «%name.c», «dep.h» { %CC %CFLAGS -c $^ -o $@ } - Π’Π°ΠΊΡΠΈΠΊΠ° ΡΠ±ΠΎΡΠΊΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΌΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π°ΠΌΠΈ, ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΠΊΠΎΡΠΎΡΡΡ
ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ ΠΏΠ΅ΡΠ΅ΡΠ±ΠΎΡΠΊΠΈ ΡΠ±ΠΎΡΠΎΡΠ½ΠΎΠΉ ΡΠ΅Π»ΠΈ. ΠΡΠ»ΠΈ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΈΠ²ΡΠ·ΠΊΠ° ΠΊ Π½Π°Π»ΠΈΡΠΈΡ ΡΠ°ΠΉΠ»Π°, ΡΠΎ ΡΡΠΎ ΡΠ²Π½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΡΠ΅ΡΠ΅Π· ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΠΏΡΠΈΠ·Π½Π°ΠΊ («target» Π΄Π»Ρ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΈ *file(«target») Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠ°ΠΉΠ»Π°).
«target» : «foo.o», «bar.o» { … }
*file(«target») : *file(«foo.o»), *file(«bar.o») { … }
- Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠ΅ ΠΏΡΠΈΠ·Π½Π°ΠΊΠΈ ΡΠ±ΠΎΡΠΎΡΠ½ΡΡ
ΡΠ°ΠΊΡΠΈΠΊ. ΠΡΠΈΠ·Π½Π°ΠΊ «*file» ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ (@{…} ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° ΠΏΠΎΠ΄Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²ΡΠ²ΠΎΠ΄Π°, Π° «exit 99» ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ ΠΎ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΏΠ΅ΡΠ΅ΡΠ±ΠΎΡΠΊΠΈ):
tactic *file (filename) = @{
test -f %filename || exit 99
for f in %ΠΡΡΠΎΡΠ½ΠΈΠΊ: opennet.ru