Richard WM Jones á á
á¬áá±ážááá¬
áááºážááá¯áẠá¡áááºážá¡ááŒá
áºáá¯ááº
- ááŸá®ááá¯ááŸá¯ááŒá±ááŸááºážáááºážáá»á°áá¬áá
áºáá¯áááºážá¡ááœáẠáá¶á·ááá¯ážááŸá¯ - "áá
áºááŸááºááá¯ááºáá»á±á¬ááºáá¯á¶ážáá±áá«á ááá¯á·ááá¯áẠááŸá®ááá¯ááŸá¯áá
áºáá¯ááẠááá¯ááŒá®ážáá«á á
á¯áá±ážááŸá¯áááºážááœáŸááºááᯠáá¯ááºáá±á¬ááºáá«áááºá" áááºááŸááºážáá»ááºáá»á¬ážááẠURL áá
áºáá¯ááŸááááŸáá
á
áºáá±ážááŒááºážá áááºááá·áºááá¯ááºááŸáá·áºáááᯠááŒá¯ááŒááºááœááºážáá¶áá»áááºáá»á¬ážááᯠááŸáá¯ááºážááŸááºááŒááºážá áááºáá±á·áá»áºá¡ááœááºážááá·áºááœááºážááŒááºážááá¯á·ááᯠá¡áá²ááŒááºááŒááºážáá²á·ááá¯á·áá±á¬ á¡ááŒá¬ážáááºážáá»á°áá¬áá»á¬ážááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááẠá
á®á
ááºáá¬ážáá«áááºá
kÅji á á áºáá±ážááŸá¯áá»á¬áž ááŸáá¯ááºážááŸááºááŒááºážá ááœá±ážáá»ááºáá¬ážáá±á¬ á á áºáá±ážááŸá¯áá»á¬ážááᯠáá»á±á¬áºááœá¬ážááŒááºážááŒáá·áº á ááºážáááºáá¯ááºáá±á¬ááºáá±ááá·áº ááá á¹á áá»á¬ážá - áááºáá±á¬ááºááŸá¯áá
áºááŸááºáá»á¬ážááᯠáá¯ááºáá±á¬ááºááá·áºá¡áá«á make ááẠááá¯ááºáá»á¬ážááŸáá·áº á
ááºážáá»á¥áºážá¡áááºáá»á¬ážááᯠááœá²ááŒá¬ážááá¬ážáá²á ááááºá¡áá±ááŒáá·áºá á
ááºážáá»ááºážáá
áºáá¯á¡á¬áž áá¯ááºáá±á¬ááºááá·áºá¡áá«á áááºáá®ážáááºáá¯ááá¯áá¬ážáá±á¬ ááá¯ááºááᯠá¡ááŸááºáááẠáááºáá®ážáááá·áºáááºááá¯ááºááŒá±á¬ááºáž á
á
áºáá±ážááŒááºážáááŸááá«á á¥ááá¬á¡á¬ážááŒáá·áºá ááá·áºááœáẠscripts áá»á¬ážááᯠá
ááºážáááºááŸá¯áá»á¬áž áá¯ááºáá±á¬ááºááá·áº "test" áá¯áá±á«áºáá±á¬ á
ááºážáá»ááºážáá
áºáᯠááŸááá«á "test" áᯠá¡áááºáá±ážáá¬ážáá±á¬ ááá¯ááºááᯠááá±á¬áºáá áááºáá®ážáá¬ážáááºá ááá¯á·áá±á¬áẠtests áá»á¬ážááᯠáá±á«áºáá±á¬á·ááẠááá¯ááºáá«á áááºááá·áºáá¯ááºáá±á¬ááºáá»ááºáááᯠ(ááŒá¿áá¬ááá¯áááºáá®ážáááºá¡ááœááºá áááºááẠâ.PHONY: á
ááºážáááºááŸá¯â ááœáŸááºááŒá¬ážáá»ááºááᯠáááºááŸááºááá¯ááºáááº)á áááºážááá¯ááºáá»á¬ážááẠááá¯ááºáá»á¬ážááŸáá·áº á
ááºážáááºážá¡áááºáá»á¬ážááᯠááŒááºáá¬ážá
áœá¬ ááœá²ááŒá¬ážáá¬ážáááºá
- áááºáááºááŒááºážááá¯ááºáᬠááœáŸááºááŒá¬ážáá»ááºáá»á¬ážá¡ááœáẠááá·áºáááºáá»ááºáá
áºáá¯áᬠáá±ážáá±á¬ááºáá¬ááœáẠááŒá¿áá¬ááŸááááºá
áááºážááá¯ááºáá»á¬ážááẠááá·áºá¡á¬áž á¡áááºáá±ážáá¬ážáá±á¬ ááá·áºáááºáá»ááºáá»á¬áž á¡áá»á¬ážá¡ááŒá¬ážááᯠá¡áá¯á¶ážááŒá¯ááẠááœáá·áºááŒá¯áááºá á¥ááá¬á¡á¬ážááŒáá·áºá áááºááẠá¡áááºá០á¡ááŸá¬ážááŸá¬ááŒááºááá¯ááºáá áºáá¯á ááááááºááá¹ááá¬ááᯠáá®ážááŒá¬ážááœá²áá¯ááºááá¯ááºáááº-
- shell á
áá¬ážááŒááºááŸáá·áº áááºáá¶áá¬ááœáẠááŒá¿áá¬áá»á¬ážá á¥ááá¬á¡á¬ážááŒáá·áºá ááá¯ááºááŸáá·áºáááºážááœáŸááºá¡áááºáá»á¬ážááœáẠáá±áá¬ááœááºáá»á¬ážááœááºááŒá±ážááŒááºážááᯠááááºážáá»á¯ááºááẠááá¯á¡ááºááŒááºážá command áá
áºáá¯á
á®ááá¯áá¯ááºáá±á¬ááºááá·áºá¡áá« áá®ážááŒá¬áž shell interpreter ááá¯ááœáá·áºááŒááºážá¡ááœáẠá¡áááºážá¡ááŒá
áºáá»á¬áž ááŒá¯ááºážáá®ážááŒááºážá â$â á¡áá¹ááá¬á ááŸá
áºáá¡áááá¹áá¬ááºááœáá·áºááá¯áá»áẠ(shell ááŸáá·áº make ááŸá
áºáá»áá¯ážáá¯á¶ážááœááºáá¯á¶ážáááº)á indentations áá»á¬ážááá¯ááá·áºááœááºážá
ááºážá
á¬ážáááºá
ááœá²ááŒááºážá áááºááŒá¬ááŸá¯áá áºáá¯á¡áá¯á¶ážááŒá¯á á á¯á ááºážááŸá¯ááááºážááŸááºáá»á¬ážá¡ááœáẠ"$" á¡á á¬áž "%" áááºá¹áá±áááᯠá¡áá¯á¶ážááŒá¯ááŒááºážááŒáá·áº á€ááŒá¿áá¬áá»á¬ážááᯠáááºážááá¯ááºáá»á¬ážááœáẠááŒá±ááŸááºážááá¯ááºááẠ("$"
LALR(1) áááºážááŒá±á¬ááºážáá»á¬ážááŸáá·áº ááá¯ááºá¡áááºáá»á¬ážááᯠááá¯ážáá¬ážáá»ááºáá»á¬ážááŒáá·áº áááºážáá¶áá¬ážááŒá®áž áá¯ááºáá¯á¶ážáá»á¬ážááᯠá¡áá±á¬ááºá¡áá±á¬ááºáá»á¬ážááŒáá·áº á¡áá¬ážáá±ážáá±á¬áºááŒááẠááá¯á¡ááºáá«áááºá command block áá áºáá¯áá¯á¶ážááᯠcommand shell á á á¶ááá°áá¬áá áºáá¯ááœáẠá áááºáá¬ážááŒá®ážá block á¡ááœááºážááœáẠá¡áá°ážáá±áá¬áá»á¬ážááᯠáááºááœáŸááºážááŒááºážáááŸááá² áááá¬ážáá¯ááºáá±á¬áºáááºááŒá¯áá¯ááºááŒááºážááᯠááœáá·áºááŒá¯áá¬ážáááºáááŒá áºáá²á·áááº-
áá áºááŸááº- foo.o bar.o
${CC} ${CFLAGS} $< -o $@ááŒá áºáá¬áááº-
"áá áºááŸááº": "foo.o", "bar.o" {
%CC %CFLAGS %< -o %@
}
Goals á á¡ááŒá¬ážá¡ááºá¹áá«áááºáá»á¬áž
- áááá¬ážáá±á¬ á¡áááºáá»á¬ážááŸáá·áº ááá·áºáááºáá»ááºáá»á¬áž áááºááŸááºááŒááºážá¡ááœáẠááœá±ážáá»ááºááá¯ááºáá±á¬ áá¶á·ááá¯ážááŸá¯-
áááºážááá¯áẠ= : "áá áºááŸááº"
ááá¯ážááá·áº =
"áá áºááŸááº" : "foo.o", "bar.o" { ... }áááºážááá¯áẠcompile (á¡áááº) =
"%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ } - á
áááºááŒááºážáá¯ááºááŸá
áºáá¯- ááá¯ááºá¡áááºáá»á¬ážááŒáá·áº áááºáá±á¬ááºáá¬ážáá±á¬ áá
áºááŸááºáá»á¬ážááᯠááá¯ááºáá®á
á±ááẠáá¯ááºáá¯ááºáá« (á¥ááá¬á ááá¯áẠ"foo.o" ááẠáá
áºááŸáẠ"%name.o" ááŸáá·áº ááá¯ááºáá®áááº) ááŸáá·áº ááá¯ááºááá¯ááºá
á¯á
ááºážááŸá¯áá¯ááº-
áááºážááá¯ááºá¡á¬ážáá¯á¶áž = : ááá·áºááº
ááá¯ážááá·áº =
"target" : "foo.o", compile ("bar") { ... }áááºážááá¯áẠcompile (á¡áááº) =
"%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ } - á
ááºážáá±ážááœá²ááá¯ááºáᬠáááºážáá»á°áá¬áá»á¬ážááᯠá
ááºážáá±ážááœá²áá
áºááŸááºááᯠááŒááºáááºá
á¯á
ááºážááẠááá¯á¡ááºááŒá±á¬ááºáž áá¯á¶ážááŒááºááẠá¡áá¯á¶ážááŒá¯ááá¯ááºááá·áº á¡áá°ážá
ááºážáá»ááºážáá»á¬ážááŒáá·áº áá¯á¶ážááŒááºáááºá ááá¯ááºáá
áºáá¯áááŸá±á·ááŸá±á¬ááºááœáẠááá·áºááºáá
áºáá¯ááᯠááŒá¯áá¯ááºáá¬ážáá«á áááºážááᯠáááºááá¯ááºáᬠáááºá¹áá±á (á
ááºážáá»ááºážá¡áááºá¡ááœáẠ"áá
áºááŸááº" ááŸáá·áº ááá¯ááºááá¯á
á
áºáá±ážáááºá¡ááœáẠ* ááá¯áẠ("áá
áºááŸááº")) ááᯠáááºááá¯ááºáᬠáááºá¹áá±áááŒáá·áº á¡ááá¡áááºáž áá¯á¶ážááŒááºáááºá
"áá áºááŸááº" : "foo.o", "bar.o" { ... }
*file("áá áºááŸááº"): *file("foo.o"), *file("bar.o") { ... }
- ááŒá¯á
á¯áá°ááẠá
ááºážáá±ážááŸá¯áááºážáá»á°áá¬áá»á¬ážá áááá¬ážáá±á¬ á¡áááºá¡áá»ááºážáá»á¬ážááᯠáááºááŸááºááá¯ááºáááºá "*file" á¡áá¶ááᯠáá¯á¶áá±á¡á¬ážááŒáá·áº áááºááŸááºáá¬ážááẠ(@{...} ááẠoutput ááᯠááŸáááºááŸááºážááŒááºážááᯠááœáŸááºááŒááŒá®áž "exit 99" ááẠááŒááºáááºáááºáá±á¬ááºááẠááá¯á¡ááºááŒá±á¬ááºáž á¡áá»ááºááŒáááº-
áááºážáá»á°áᬠ*file (ááá¯ááºá¡áááº) = @{
á ááºážáááºááŸá¯ -f %filename || ááœááºáá±á«áẠáá
f á¡ááœáẠ%source: opennet.ru