aboutsummaryrefslogtreecommitdiff
path: root/ja/man/man1/make.1
blob: c44f6086a5fda9c2e8b615dfce843375022c81a2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
.\" this file based on that translated to japanese on NetBSD Japanese Reference
.\" Manual Project, and modefied to fit FreeBSD Reference Manual
.\" by Mochida Shuji  1996/04/26
.\" 
.\" Copyright (c) 1990, 1993
.\" jpman %Id: make.1,v 1.2 1997/05/27 00:42:17 mutoh Stab %
.\"	The Regents of the University of California.  All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\"    notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\"    notice, this list of conditions and the following disclaimer in the
.\"    documentation and/or other materials provided with the distribution.
.\" 3. All advertising materials mentioning features or use of this software
.\"    must display the following acknowledgement:
.\"	This product includes software developed by the University of
.\"	California, Berkeley and its contributors.
.\" 4. Neither the name of the University nor the names of its contributors
.\"    may be used to endorse or promote products derived from this software
.\"    without specific prior written permission.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.\"	from: @(#)make.1	8.4 (Berkeley) 3/19/94
.\"	%Id: make.1,v 1.6.2.3 1997/09/15 09:20:40 jkh Exp %
.\"
.Dd March 19, 1994
.Dt MAKE 1
.Os
.Sh 名称
.Nm make
.Nd プログラムの依存関係をメンテナンスする
.Sh 書式
.Nm make
.Op Fl Beiknqrst
.Op Fl D Ar variable
.Op Fl d Ar flags
.Op Fl f Ar makefile
.Op Fl I Ar directory
.Bk -words
.Op Fl j Ar max_jobs
.Op Fl m Ar directory
.Ek
.Op Fl V Ar variable
.Op Ar variable=value
.Op Ar target ...
.Sh 解説
.Nm make
は、プログラムのメンテナンスを単純化するためのツールです。その入力は
ファイル毎の依存関係指定のリストで、それぞれのファイルがどのプログラム、
どのファイルに依存するか記述されています。
その指定リストとして、ファイル
.Ql Pa makefile
が存在すればそれを、無ければ
.Ql Pa Makefile
を読み込みます。
.Ql Pa .depend
というファイルがあれば、それも読み込みます
.Pq Xr mkdep 1 を参照
。
.Pp
本マニュアルはリファレンスのためのみのドキュメントです。
.Nm make
と makefile に関する詳しい記述は
.%T "Make \- A Tutorial"
を参照してください
.\"  (
.\" .Dq /usr/src/usr.bin/make/PSD.doc
.\" に、本
.\" .Nm make
.\" の元になった pmake に関する 
.\" .Xr nroff 1
.\" でフォーマットできるドキュメントがあります)
。
.Pp
オプションは以下のとおりです。
.Bl -tag -width Ds
.It Fl B
シーケンス中の依存行のソースを作成するために、各コマンドに対して
一つのシェルを実行する、バックワード互換モードで実行しようとします。
.It Fl D Ar variable
大域変数
.Ar variable
を 1 と定義します。
.It Fl d Ar flags
デバッグモードを有効にし、
.\" .Ar flags
.\" で指定されたデバッグ情報を出力します。
.Nm
が表示するデバッグ情報の種類を指定します。
.Ar flags
には、以下のうち 1 つ以上を指定できます。
.Bl -tag -width Ds
.It Ar A
すべてのデバッグ情報を出力します。他のフラグをすべて指定したことと
等価です。
.It Ar a
アーカイブ検索とキャッシュに関する情報を表示します。
.It Ar c
条件評価に関する情報を表示します。
.It Ar d
ディレクトリ検索とキャッシュに関する情報を表示します。
.It Ar "g1"
処理を行う前に、入力のグラフを表示します。
.It Ar "g2"
すべての処理を行ったあと、あるいはエラーにより終了する前に入力のグラフを
表示します。
.It Ar j
複数のシェルを起動する場合の情報を表示します。
.It Ar m
ターゲットの作成と変更日付に関する情報を表示します。
.It Ar s
拡張子解釈に関する情報を表示します。
.It Ar t
ターゲットリストのメンテナンスに関する情報を表示します。
.It Ar v
変数の値に関する情報を表示します。
.El
.It Fl e
環境変数で makefile 中の変数の値を上書きするように指示します。
.It Fl f Ar makefile
デフォルトの
.Ql Pa makefile
と
.Ql Pa Makefile
のかわりに、読み込むファイルを指定します。もし
.Ar makefile
が
.Ql Fl
なら標準入力から読み込みます。複数のファイルが指定可能で、
指定した順に読み込まれます。
.It Fl I Ar directory
makefile と、インクルードされる makefile を検索するためのディレクトリを
指定します。システムで定義してある makefile のあるディレクトリ (または、
複数のディレクトリ;
.Fl m
オプションを参照) は自動的にリストに含まれ、検索されます。
.It Fl i
makefile から実行されたシェルコマンドが 0 でない終了ステータスを返し
ても無視します。makefile 中でコマンドの先頭に
.Ql Fl
を指定するのと同じです。
.It Fl j Ar max_jobs
.Nm make
が同時に起動できるジョブの数を指定します。互換性モードをオフにするには、
.Ar B
フラグも指定してください。
.It Fl k
エラーが発生しても処理を続行します。ただし、発生したエラーによって作成
が不能になったターゲットに依存したターゲットに関しては処理が中断されます。
.It Fl m Ar directory
<...> 形式で読み込まれる sys.mk や makefile を検索するための
ディレクトリを指定します。複数のディレクトリを検索パスに加えることが
できます。このパスは、デフォルトのシステムインクルードパス 
/usr/share/mk を上書きします。
さらに、システムインクルードパスを "..."形式のインクルードによって
追加することができます(
.Fl I
オプションを参照)。
.It Fl n
make が実行するであろうコマンド内容の表示のみを行い、実行はしません。
.It Fl q
いっさいのコマンドを実行せず、指定されたターゲットが最新のものであれば 0 
を、そうでなければ 1 を終了ステータスとして返します。
.It Fl r
システムの makefile で定義された組み込みのルールを使用しません。
.It Fl s
実行するコマンドを表示しません。makefile のなかで、コマンドの先頭に
.Ql Ic @
を指定するのと同じです。
.It Fl t
makefile で指定されたターゲットを作り直すのではなく、ターゲットを作成
するか、あるいは最終更新日付を現在の時刻に設定することにより、
ターゲットが最新であるかのようにします。
.It Fl V Ar variable
グローバルな文脈での
.Nm make
の
.Ar variable 
の値を表示します。如何なるターゲットも生成しません。
このオプションで複数のインスタンスを指定することができます。
変数は、各行毎に表示されます。未定義もしくは空の変数は、空行で
表現されます。
.It Ar variable=value
変数
.Ar variable
の値を
.Ar value
に設定します。
.El
.Pp
makefile には 7 種類の行があります: 依存関係記述、シェルコマンド、変数
代入、インクルード文、条件命令、for ループ、コメントです。
.Pp
一般に、行は行末にバックスラッシュ
.Pq Ql \e
を置くことにより次行へ継続させることがで
きます。この場合、バックスラッシュ直後の改行と、次の行の先頭の
空白部分は 1 つの空白に置き換えられます。
.Sh ファイル依存関係記述
入力ファイルにおける依存関係記述行は、1 つ以上のターゲット、オペレータ、
0個 以上のソースからなります。
これは、ターゲットがソースに「依存」しているという関係を
定義しており、通常は、ソースからターゲットが作成されます。ターゲットと
ソースとの厳密な関係はオペレータによって、両者間に指定します。
オペレータには以下の種類があります。
.Bl -tag -width flag
.It Ic \&:
ターゲットの最終更新日付が、いずれかのソースの最終更新日付よりも
古いものであれば、ターゲットは古いものであり、作り直されるべきものと
判断されます。
別の行でこのオペレータによる同じターゲットに関するソースの記述があれば、
それらはすべて 1 つにまとめられます。ターゲットの作成中に
.Nm make
が中断されると、ターゲットは削除されます。
.It Ic \&!
ターゲットはつねに作り直されます。ただし、作り直されるのは、
すべてのソースが検査され、必要と判断されたソースが作り直されたあとです。
このオペレータによる同じターゲットに関するソースの記述が別の行にもあれば、
それらはすべて 1 つにまとめられます。ターゲットの作成中に
.Nm make
が中断されると、ターゲットは削除されます。
.It Ic \&::
ソースが指定されていなかった場合、つねにターゲットは作り直されます。
指定されていた場合にはソースのいずれかがターゲットよりも新しい時だけ
ターゲットは作り直されます。本オペレータでは、別の行において同じ
ターゲットに関するソースの記述があっても 1 つにまとめません。
ターゲットの作成中に
.Nm make
が中断されるても、ターゲットは削除されません。
.El
.Pp
ターゲットとソースは、シェルのワイルドカードとして
.Ql ? ,
.Ql * ,
.Ql [] ,
.Ql {}
を含むこ
とができます。
.Ql ? ,
.Ql * ,
.Ql []
は、ターゲットまたはソースの最後の要素として記述でき、
存在するファイルを指定するものでなければなりません。
.Ql {}
はファイルが存在しなくてもかまいません。シェルのように辞書順に並べられて
展開されることはなく、ファイルシステム上に並んでいる順番のまま行われます。
.Sh シェルコマンド
ターゲットは、シェルコマンドの列と関連付けることができ、通常はそれによって
ターゲットを作成します。
これに含まれる各コマンドは、
.Em 必ず
行頭のタブに続けて記述します。同一のターゲットに
対して複数の依存記述行がある場合、
.Ql Ic ::
オペレータを使用したのでなければ、それらのうちの 1 つにのみコマンド行を
続けることができます。
.Pp
もし最初の文字が
.Ql Ic @
または
.Ql Ic \-
ならば
.Pq 2\ 文字とも指定することも可能
、コマンドは特別な扱いを受けます。
.Ql Ic @
は、コマンドが実行される前にコマンド内容が表示されることを抑制します。
.Ql Ic \-
は、コマンドの 0 ではない終了ステータスを無視するように指示します。
.Sh 変数代入
.Nm make
で使われる変数はシェルでの変数に類似しています。そして、歴史的な経緯から、
すべて大文字からなる名前が用いられます。変数代入には以下の 5 通りの
オペレータを使用できます。
.Bl -tag -width Ds
.It Ic \&=
変数に値を代入します。その時点までの値は失われます。
.It Ic \&+=
現在の変数の値に、右辺の値を追加します。
.It Ic \&?=
変数が未定義の場合のみ、値を代入します
.It Ic \&:=
右辺を展開した値を代入します。つまり、変数に代入する前に値の展開を行います。
通常、値の展開は代入時には行われず、変数が参照されるときに行われます。
.It Ic \&!=
右辺を展開した値をシェルに実行させ、実行結果を左辺の変数に代入します。
結果のなかに含まれる改行は空白に置き換えられます。
.El
.Pp
いずれの場合も、値の前にある空白は無視されます。値が追加される場合、
変数の直前の値と追加する値との間に空白が挿入されます。
.Pp
変数は、ドル記号
.Pq Ql $
に続いて中括弧
.Pq Ql {}
または小括弧
.Pq Ql ()
で囲まれた変数名を置くことにより展開されます
.\" .Pq 例: ${LIBS}
。もし変数名が 1 文字な
ら、変数名を囲む括弧は省略できますが、このような省略形は推奨できません。
.Pp
変数置換は、変数が用いられている場所により、 2 つの別々のタイミングで
行われます。依存関係記述行で用いられた変数は、その行が読み込まれたときに
展開されます。シェルコマンド内で用いられた変数は、シェルコマンド実行時に
展開されます。
.Pp
変数には、優先度に従って、4 つの異なるクラスがあります:
.Bl -tag -width Ds
.It 環境変数
.Nm make
の環境中で有効な変数
.It グローバル変数
makefile とインクルードされた makefile 内で有効な変数。
.It コマンドライン変数
コマンドラインで指定された変数。
.It ローカル変数
あるターゲットのみに対して定義される変数。ローカル変数には、
以下の 7 種類があります:
.Bl -tag -width ".ARCHIVE"
.It Va .ALLSRC
このターゲットに対するすべてのソースのリスト。
.Ql Va \&> .
も同じです。
.It Va .ARCHIVE
アーカイブファイル名
.It Va .IMPSRC
ターゲット名に変換するのに使用するソースのファイル名またはパス名
.Pq 「暗黙の」ソース
.\" .Pq ターゲットが foo.o なら foo.c 等
。
.Ql Va \&< .
も同じです。
.It Va .MEMBER
アーカイブのメンバー
.It Va .OODATE
ターゲットよりも新しいソースのリスト。
.Ql Va \&? .
も同じ。
.It Va .PREFIX
ターゲットのディレクトリ名と拡張子を取り除いた名前。
.Ql Va * .
も同じ。
.It Va .TARGET
ターゲットの名前。
.Ql Va @ .
も同じ。
.El
.Pp
短い形式
.Ql Va @ ,
.Ql Va ? ,
.Ql Va \&> ,
.Ql Va *
は古い makefile での互換性のためのものですが、利用することは推奨できません。
また、
.Ql Va "@F" ,
.Ql Va "@D" ,
.Ql Va "<F" ,
.Ql Va "<D" ,
.Ql Va "*F" ,
.Ql Va "*D"
は
.At V
の makefile との互換性のために存在していますが、利用することは
推奨できません。
.Pp
次の 4 つのローカル変数は依存関係記述行のソースに使うことができます。
これらは、その行のターゲット毎の値に展開されます。
これらのローカル変数は
.Ql Va .TARGET ,
.Ql Va .PREFIX ,
.Ql Va .ARCHIVE ,
.Ql Va .MEMBER
です。
.Pp
さらに、
.Nm make
では以下の変数を利用することができます。
.Bl -tag -width MAKEFLAGS
.It Va \&$
単一のドル記号
.Ql \&$
。すなわち、
.Ql \&$$
は単一のドル記号に置換されます。
.It Va .MAKE
.Nm make
の起動に使用された名前
.Pq Va argv Op 0
。
.It Va .CURDIR
.Nm make
が実行されたディレクトリ。
.It Ev PWD
現在のディレクトリへの異なったパス。
.Nm make
は普通、
.Ql Va .CURDIR
を
.Xr getcwd 2 
で得られたパスに設定します。しかしながら、環境変数
.Ql Ev PWD
が設定されており、与えられたパスがカレントディレクトリの時、
.Nm make
は、
.Ql Va .CURDIR
を
.Ql Ev PWD
の値に設定します。
.Ql Ev PWD
は、
.Nm make
が実行している全てのプログラムに対して、
.Ql Va .OBJDIR
の値を設定します。
.El
.Pp
変数展開において、その変数内の単語を選択したり、変更したりすることが
できます
.Pq 単語とは空白で区切られた文字列です
。変数展開の一般形は、次のとおりです。
.Pp
.Dl {variable[:modifier[:...]]}
.Pp
各修飾子は、コロンと以下に示すいずれかの文字のうち 1 文字からなります。
リテラルなコロン
.Pq Ql \&:
を指定するにはコロンの前にバックスラッシュ
.Pq Ql \e
を置きます。
.Bl -tag -width Cm E\&
.It Cm E
変数中の各単語を拡張子で置換します。
.It Cm H
変数中の各単語を、パスの最後の要素
.\" (最後のスラッシュ
.\" .Pq Ql /
.\" より後の部分)
を除いた部分で置換します。
.It Cm M Ns Ar pattern
pattern にマッチする単語を選択します。標準的なワイルドカード
.Pf ( Ql * ,
.Ql ? ,
.Ql Op )
が使用できます。ワイルドカード文字はバックスラッシュ
.Pq Ql \e
によりエスケープできます。
.It Cm N Ns Ar pattern
pattern にマッチしない単語を選択します。それ以外は
.Ql Cm M
と同様です。
.It Cm R
変数中の各単語から拡張子を取り除きます。
.Sm off
.It Cm S No \&/ Ar old_pattern Xo
.No \&/ Ar new_pattern
.No \&/ Op Cm g
.Xc
.Sm on
各単語中の最初の
.Ar old_pattern
を
.Ar new_pattern
に置換します。もし、最後のスラッシュのあとに
.Ql g
が指定されていれば、各単語中に出現したすべての 
.Ar old_pattern
が
.Ar new_pattern
に置換されます。
.Ar old_pattern
が
.Ql ^
で始まっているなら、そのパタンを各単語の先頭からマッチさせることを
意味します。
.Ar old_pattern
がドル記号
.Pq Ql $
で終わっているなら、そのパタンを各単語の終端にマッチさせることを
意味します。
.Ar new_string
中のアンド記号
.Pq Ql &
は
.Ar old_pattern
に置換されます。修飾文字列の区切りにはどんな文字を使ってもかまいません。
.Ql ^
,
.Ql $
,
.Ql &
と区切り文字はバックスラッシュ
.Pq Ql \e
によりエスケープできます。
.Pp
.Ar old_string
と
.Ar new_string
中では通常の変数置換が行われます。ただし、ドル記号
.Pq Ql \&$
の展開を抑制するためには、通常のドル記号の前置ではなく、
バックスラッシュでエスケープします。
.It Cm T
変数中の各単語をパスの最後の要素
.\" (最後のスラッシュ
.\" .Pq Ql /
.\" より後の部分)
で置換します。
.It Ar old_string=new_string
これは
.At V
での変数置換の形式です。これは最後の修飾子として指定する必要があります。
もし、パタンマッチ文字
.Ar %
が 
.Ar new_string
にも
.Ar old_string
にも含まれないなら、
.Ar new_string
と 
.Ar old_string
はどちらも単語の最後にマッチするものとみなされます。すなわち、
拡張子のみか、または単語全部が置換されることになります。そうでなければ、
.Ar %
が
.Ar old_string
に含まれており、それは
.Ar new_string
に置換されます。
.\" .Pp
.\" たとえば、以下の例において、
.\" .Bd -literal -offset indent
.\" OBJS+=  ${SRCS:N*.h:N*.sh:R:S/$/.o/g}
.\" .Ed
.\" OBJS は、 SRCS の各単語のうち、
.\" .Ql *.h
.\" 、
.\" .Ql *.sh
.\" にマッチするものを除き、さらに拡
.\" 張子のかわりに
.\" .Ql .o
.\" を付加した単語のリストになります。
.\" .Pp
.\" もし、
.\" .Bd -literal -offset indent
.\" SRCS = foo.c bar.c foo.h
.\" .Ed
.\" ならば、
.\" .Bd -literal -offset indent
.\" OBJS = foo.o bar.o
.\" .Ed
.\" となります。
.El
.Sh インクルード文、条件式、FOR ループ
.Nm make
では、C 言語を彷彿させるインクルード、条件文、for ループを使用することが
できます。これらの制御構造は、行頭に単一のドット
.Pq Ql \&.
がくることで識別されます。ファイルのインクルードは
.Ql .include <file>
または、
.Ql .include \*qfile\*q
により行います。ブラケット
.Pq Ql <>
と ダブルクォート
.Pq Ql \*q\*q
中の変数はファイル名に展開されます。もし、ブラケットが使用されたなら、
makefile はシステムの makefile ディレクトリにあるものを用います。
ダブルクォートなら、makefile が存在するディレクトリ、
.Fl I
オプションで指定されたディレクトリ、システムの makefile ディレクトリの
順に検索します。
.Pp
条件式も、行頭のドットから開始します。条件式には以下のものがあります:
.Bl -tag -width Ds
.It Ic .undef Ar variable
グローバル変数を未定義とします。グローバル変数以外は未定義とすることが
できません。 
.It Xo
.Ic \&.if
.Oo \&! Oc Ns Ar expression
.Op Ar operator expression ...
.Xc
式の値をテストします。
.It Xo
.Ic .ifdef
.Oo \&! Oc Ns Ar variable
.Op Ar operator variable ...
.Xc
変数の値をテストします。
.It Xo
.Ic .ifndef
.Oo \&! Oc Ns Ar variable
.Op Ar operator variable ...
.Xc
変数の値をテストします。
.It Xo
.Ic .ifmake
.Oo \&! Oc Ns Ar target
.Op Ar operator target ...
.Xc
ターゲット
.Ar target
が作成中かどうかをテストします。
.It Xo
.Ic .ifnmake
.Oo \&! Oc Ar target
.Op Ar operator target ...
.Xc
ターゲット
.Ar target
が作成中かどうかをテストします。
.It Ic .else
最後に行った条件文の意味を逆にします。
.It Xo
.Ic .elif
.Oo \&! Oc Ar expression
.Op Ar operator expression ...
.Xc
.Ql Ic .else
と直後の
.Ql Ic .if
を対にしたものです。
.It Xo
.Ic .elifdef
.Oo \&! Oc Ns Ar variable
.Op Ar operator variable ...
.Xc
.Ql Ic .else
と直後の
.Ql Ic .ifdef
を対にしたものです。
.It Xo
.Ic .elifndef
.Oo \&! Oc Ns Ar variable
.Op Ar operator variable ...
.Xc
.Ql Ic .else
と直後の
.Ql Ic .ifndef
を対にしたものです。
.It Xo
.Ic .elifmake
.Oo \&! Oc Ns Ar target
.Op Ar operator target ...
.Xc
.Ql Ic .else
と直後の
.Ql Ic .ifmake
を対にしたものです。
.It Xo
.Ic .elifnmake
.Oo \&! Oc Ns Ar target
.Op Ar operator target ...
.Xc
.Ql Ic .else
と直後の
.Ql Ic .ifnmake
を対にしたものです。
.It Ic .endif
条件文の本体を終了させます。
.El
.Pp
オペレータ
.Ar operator
は、以下のうちのいずれかです。
.Bl -tag -width "Cm XX"
.It Cm \&|\&|
論理 OR。
.It Cm \&&&
論理 AND。
.Ic ||
より優先順位が上です。
.El
.Pp
C 言語と同様、
.Nm make
は条件式を、式の値を決定するのに必要なところまでしか評価しません。
評価順序を変更するには括弧を使います。論理オペレータ
.Ql Ic \&!
は条件式全体の値を反転するのに使用します。
.Ql Ic \&!
は
.Ql Ic \&&&
より優先順位が上です。
.Pp
式
.Ar expression
は、以下のいずれかの形式です:
.Bl -tag -width Ic defined
.It Ic defined
引数として変数名をとり、変数が定義されていれば true となる。
.It Ic make
引数としてターゲット名をとり、そのターゲットが
.Nm make
のコマンドライン引数に指定されているか、デフォルトのターゲット
.Pq 明示的なものも暗黙的なものも含む。 Va .MAIN の項を参照
として宣言されている場合に true となる。
.It Ic empty
引数として変数名
.Pq と修飾子
をとり、展開した結果が空文字列ならば true となる。
.It Ic exists
引数としてファイル名をとり、ファイルが存在すれば true となる。
ファイルはシステム検索パス
.Pq Va .PATH の項を参照
にそって検索される。
.It Ic target
引数としてターゲット名をとり、ターゲットが定義されているなら true となる。
.El
.Pp
条件式
.Ar expression
としては、数値あるいは文字列の比較を用いることもできます。比較オペレータの
両辺は、変数展開が適用されたあとに比較されます。値が 0x で始まるなら 16 進数
であると解釈し、さもなければ 10 進数と解釈します。8 進数はサポートして
いません。標準的な C 言語の関係オペレータは全て利用可能です。
変数展開後、
.Ql Ic ==
または
.Ql Ic "!="
の左辺値または右辺値のいずれかが数値とは認められない場合、文字列として
比較を行います。関係オペレータが指定されなかった場合、展開された変数と 0 とを
比較します。
.Pp
条件式を評価中に、評価できない単語が出現した場合は、条件式の形式によって、
.Dq make
または
.Dq defined
オペレータを適用します。条件式が
.Ql Ic .ifdef
または
.Ql Ic .ifndef
ならば
.Dq defined
を、条件式が
.Ql Ic .ifmake
または
.Ql Ic .ifnmake
ならば
.Dq make
を、それぞれ適用します。
.Pp
条件式が true と評価されたなら、makefile の解析はそのまま続行されます。
false と評価されたなら、
.Ql Ic .else
または
.Ql Ic .endif
が見つかるまで 
makefile の解析をスキップします。
.Pp 
for ループは、いくつかのルールを一連のファイルに適用するのによく
用いられます。以下がループの形式です:
.Bl -tag -width Ds
.It Xo
.Ic \&.for
.Ar variable 
.Ic in 
.Ar expression
.Xc
.It Xo
<make-rules>
.Xc
.It Xo
.Ic \&.endfor
.Xc
.El
.Ic expression
は評価されたあとに単語に分解され、それぞれを
.Ic variable
に代入
しながら、
.Ic make-rules
部分を繰り返し展開します。
.Sh コメント
コメントはハッシュ記号
.Pq Ql \&#
から始まり、シェルコマンド行以外のどこにでも置くことができます。
コメントは改行で終わります。
.Sh 特殊ソース
.Bl -tag -width Ic .IGNORE
.It Ic .IGNORE
本ターゲットに関連したコマンドでのエラーを無視します。シェルコマンドの
先頭にダッシュ
.Ql \-
を指定したのと等価です。
.It Ic .MAKE
たとえ、
.Fl n や
.Fl t
オプションが指定されていても、このターゲットに関連したシェルコマンドを
実行します。通常、再帰的な
.Nm make
のために用いられます。
.It Ic .NOTMAIN
通常
.Nm make
は、最初に発見したターゲットをデフォルトのターゲットとみなします。
.Ic .NOTMAIN
が指定されたターゲットはデフォルトのターゲットとはみなされなくなります。
.It Ic .OPTIONAL
もし
.Ic .OPTIONAL
が指定されたターゲットの作り方がわからなくても、エラーとはせず、
そのターゲットは必要ないか、すでに存在しているものとみなします。
.It Ic .PRECIOUS
通常
.Nm make
が中断されたときは、作成途中のターゲットは削除されます。本ソースを
指定することで、そのターゲットを削除しなくなります。
.It Ic .SILENT
指定されたターゲットに関連づけられたシェルコマンドを実行するときに
エコーを行いません。シェルコマンドの先頭に
.Ql @
を指定したのと等価です。
.It Ic .USE
指定されたターゲットをマクロ的に扱います。
.Ic .USE
をソースに持つターゲット
.Pq 以下ではマクロと呼びます
が別のターゲットのソースとなった場合、その
ターゲットはコマンド、ソース、属性(
.Ic .USE
は除く)
をマクロから受け取ります。もし、すでにターゲットにコマンドが指定されていた
場合は、マクロのコマンドが追加されます。
.It Ic .WAIT
特別な
.Ic .WAIT
ソースが依存関係行に現れた時には、ソースはその行中でソースが
作成されるまで待ちます。ループは検出されず、ループ形式のターゲットは
単に無視されます。
.El
.Sh 特殊ターゲット
特殊ターゲットは、他のターゲットとともに使用してはいけません。すなわち、
依存関係記述行の唯一のターゲットとして指定する必要があります。
.Bl -tag -width Ic .BEGIN
.It Ic .BEGIN
本ターゲットに指定されたシェルコマンドは他の処理に先立って実行されます。
.It Ic .DEFAULT
これは、作成方法がわからないどんなターゲットにも適用される
.Ic .USE
ルールのようなものです。シェルスクリプトのみを使用します。
.Ic .DEFAULT
に指定されたコマンド中の
.Ic .IMPSRC
変数はターゲット自身の名前に置換されます。
.It Ic .END
本ターゲットに指定されたシェルコマンドは、他のすべての処理の終了後に
実行されます。
.It Ic .IGNORE
指定されたソースに
.Ic .IGNORE
属性を付与します。もしソースが指定されていなければ、
.Fl i
オプションを指定したのと同じ意味になります。
.It Ic .INTERRUPT
.Nm make
が中断されたとき、本ターゲットに指定されたコマンドを実行します。
.It Ic .MAIN
ターゲットを指定せずに
.Nm make
が起動された場合、本ターゲットを処理します。
.It Ic .MAKEFLAGS
ソースにおいて、
.Nm make
に指定するフラグを指定します。フラグはシェルでタイプしたのと同様に
渡されますが、
.Fl f
オプションは無効になります。
.\" XXX: NOT YET!!!!
.\" .It Ic .NOTPARALLEL
.\" この名前のターゲットは、並列モードを使わすに実行されます。
.\" ターゲットが指定されていない時には、全てのターゲットが非並列モード
 \" で実行されます。
.It Ic .NOTPARALLEL
並列モードを使いません。
.It Ic .NO_PARALLEL
上と同じですが、 pmake の変種のための互換性のためにあります。
.It Ic .ORDER
シーケンス中の名前付きターゲットが作成されます。
.\" XXX: NOT YET!!!!
.\" .It Ic .PARALLEL
.\" 名前付きターゲットが並列モードで実行されます。
.\" ターゲットが指定されない時には、全てのターゲットが並列モードで実行
.\" されます。
.It Ic .PATH
カレントディレクトリに発見できなかったときのファイルの検索パスを、
本ターゲットのソースとして指定します。ソースが指定されなかった場合、
以前に設定されていたディレクトリが無効になります。
.It Ic .PHONY
.Ic .PHONY
属性を指定したソースに適用します。この属性を持ったターゲットは
いつでも更新されていると考えられます。
.It Ic .PRECIOUS
指定されたソースに
.Ic .PRECIOUS
属性を付与します。もし、ソースが指定されなかった場合、
すべてのターゲットに
.Ic .PRECIOUS
属性を与えます。
.It Ic .SILENT
指定されたソースに
.Ic .SILENT
属性を付与します。もし、ソースが指定されなかった場合、
ファイル中のすべてのコマンドに
.Ic .SILENT
属性を与えます。
.It Ic .SUFFIXES
ソースにおいて、
.Nm make
で用いる拡張子を指定します。ソースが指定されなかった場合は、
以前の指定が無効になります。
.Sh 環境変数
.Nm make
は以下の環境変数の値を用います:
.Ev MACHINE ,
.Ev MAKE ,
.Ev MAKEFLAGS ,
.Ev MAKEOBJDIR ,
.Ev MAKEOBJDIRPREFIX ,
.Ev PWD 
.Sh 関連ファイル
.Bl -tag -width /usr/share/doc/psd/12.make -compact
.It .depend
依存関係リスト
.It Makefile
依存関係リスト
.It makefile
依存関係リスト
.It sys.mk
システム定義の makefile
.It /usr/share/mk
システム定義の makefile が置かれるディレクトリ
.It /usr/share/doc/psd/12.make
PMake のチュートリアル
.El
.Sh 関連項目
.Xr mkdep 1
.Rs
.%T "PMake - A Tutorial"
.Re
.Sh 歴史
.Nm make
は
.At v7
において追加されました。