summaryrefslogtreecommitdiffstats
path: root/kBuild/doc/QuickReference-kmk.html
blob: e7529a65f8db0e05c843027e95acce5662917634 (plain)
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
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.4: http://docutils.sourceforge.net/" />
<title>kmk Quick Reference</title>
<style type="text/css">

/*
:Author: David Goodger
:Contact: goodger@users.sourceforge.net
:Date: $Date: 2009-04-18 14:05:47 +0200 (sab, 18 apr 2009) $
:Revision: $Revision: 2340 $
:Copyright: This stylesheet has been placed in the public domain.

Default cascading style sheet for the HTML output of Docutils.

See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/

/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
  border: 0 }

table.borderless td, table.borderless th {
  /* Override padding for "table.docutils td" with "! important".
     The right padding separates the table cells. */
  padding: 0 0.5em 0 0 ! important }

.first {
  /* Override more specific margin styles with "! important". */
  margin-top: 0 ! important }

.last, .with-subtitle {
  margin-bottom: 0 ! important }

.hidden {
  display: none }

a.toc-backref {
  text-decoration: none ;
  color: black }

blockquote.epigraph {
  margin: 2em 5em ; }

dl.docutils dd {
  margin-bottom: 0.5em }

/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
  font-weight: bold }
*/

div.abstract {
  margin: 2em 5em }

div.abstract p.topic-title {
  font-weight: bold ;
  text-align: center }

div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
  margin: 2em ;
  border: medium outset ;
  padding: 1em }

div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
  font-weight: bold ;
  font-family: sans-serif }

div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title {
  color: red ;
  font-weight: bold ;
  font-family: sans-serif }

/* Uncomment (and remove this text!) to get reduced vertical space in
   compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
  margin-bottom: 0.5em }

div.compound .compound-last, div.compound .compound-middle {
  margin-top: 0.5em }
*/

div.dedication {
  margin: 2em 5em ;
  text-align: center ;
  font-style: italic }

div.dedication p.topic-title {
  font-weight: bold ;
  font-style: normal }

div.figure {
  margin-left: 2em ;
  margin-right: 2em }

div.footer, div.header {
  clear: both;
  font-size: smaller }

div.line-block {
  display: block ;
  margin-top: 1em ;
  margin-bottom: 1em }

div.line-block div.line-block {
  margin-top: 0 ;
  margin-bottom: 0 ;
  margin-left: 1.5em }

div.sidebar {
  margin-left: 1em ;
  border: medium outset ;
  padding: 1em ;
  background-color: #ffffee ;
  width: 40% ;
  float: right ;
  clear: right }

div.sidebar p.rubric {
  font-family: sans-serif ;
  font-size: medium }

div.system-messages {
  margin: 5em }

div.system-messages h1 {
  color: red }

div.system-message {
  border: medium outset ;
  padding: 1em }

div.system-message p.system-message-title {
  color: red ;
  font-weight: bold }

div.topic {
  margin: 2em }

h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
  margin-top: 0.4em }

h1.title {
  text-align: center }

h2.subtitle {
  text-align: center }

hr.docutils {
  width: 75% }

img.align-left {
  clear: left }

img.align-right {
  clear: right }

ol.simple, ul.simple {
  margin-bottom: 1em }

ol.arabic {
  list-style: decimal }

ol.loweralpha {
  list-style: lower-alpha }

ol.upperalpha {
  list-style: upper-alpha }

ol.lowerroman {
  list-style: lower-roman }

ol.upperroman {
  list-style: upper-roman }

p.attribution {
  text-align: right ;
  margin-left: 50% }

p.caption {
  font-style: italic }

p.credits {
  font-style: italic ;
  font-size: smaller }

p.label {
  white-space: nowrap }

p.rubric {
  font-weight: bold ;
  font-size: larger ;
  color: maroon ;
  text-align: center }

p.sidebar-title {
  font-family: sans-serif ;
  font-weight: bold ;
  font-size: larger }

p.sidebar-subtitle {
  font-family: sans-serif ;
  font-weight: bold }

p.topic-title {
  font-weight: bold }

pre.address {
  margin-bottom: 0 ;
  margin-top: 0 ;
  font-family: serif ;
  font-size: 100% }

pre.literal-block, pre.doctest-block {
  margin-left: 2em ;
  margin-right: 2em ;
  background-color: #eeeeee }

span.classifier {
  font-family: sans-serif ;
  font-style: oblique }

span.classifier-delimiter {
  font-family: sans-serif ;
  font-weight: bold }

span.interpreted {
  font-family: sans-serif }

span.option {
  white-space: nowrap }

span.pre {
  white-space: pre }

span.problematic {
  color: red }

span.section-subtitle {
  /* font-size relative to parent (h1..h6 element) */
  font-size: 80% }

table.citation {
  border-left: solid 1px gray;
  margin-left: 1px }

table.docinfo {
  margin: 2em 4em }

table.docutils {
  margin-top: 0.5em ;
  margin-bottom: 0.5em }

table.footnote {
  border-left: solid 1px black;
  margin-left: 1px }

table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
  padding-left: 0.5em ;
  padding-right: 0.5em ;
  vertical-align: top }

table.docutils th.field-name, table.docinfo th.docinfo-name {
  font-weight: bold ;
  text-align: left ;
  white-space: nowrap ;
  padding-left: 0 }

h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
  font-size: 100% }

tt.docutils {
  background-color: #eeeeee }

ul.auto-toc {
  list-style-type: none }

</style>
</head>
<body>
<div class="document" id="kmk-quick-reference">
<h1 class="title">kmk Quick Reference</h1>
<p>This is an attempt at summarizing all directives, functions, special variables,
special targets, built-in commands, external commands, and <tt class="docutils literal"><span class="pre">kmk</span></tt>-expressions.
Since <em>all</em> the features are included, the quickness of this reference can be
disputed. ;-)</p>
<div class="section">
<h1><a id="directives" name="directives">Directives</a></h1>
<p>Here is a summary of the directives <tt class="docutils literal"><span class="pre">kmk</span></tt> recognizes:</p>
<blockquote>
<p>Define a multi-line, recursively-expanded variable:</p>
<pre class="literal-block">
define variable
endef
</pre>
<p>Conditionally evaluate part of the makefile:</p>
<pre class="literal-block">
ifdef variable
ifndef variable
ifeq (a,b)
ifeq &quot;a&quot; &quot;b&quot;
ifeq 'a' 'b'
ifneq (a,b)
ifneq &quot;a&quot; &quot;b&quot;
ifneq 'a' 'b'
if1of (set-a,set-b)             [1]
ifn1of (set-a,set-b)            [1]
if expression                   [1]
else
endif
</pre>
<p>Include another makefile:</p>
<pre class="literal-block">
include file
-include file
sinclude file
</pre>
<p>Include another dependency file <a class="footnote-reference" href="#id84" id="id1" name="id1">[1]</a>:</p>
<pre class="literal-block">
includedep file
</pre>
<p>Define a variable, overriding any previous definition, even one from the
command line:</p>
<pre class="literal-block">
override variable = value
override variable := value
override variable += value
override variable &lt;= value      [1]
override variable ?= value
override define variable
endef
</pre>
<p>Tell <tt class="docutils literal"><span class="pre">kmk</span></tt> to export all variables to child processes by default:</p>
<pre class="literal-block">
export
</pre>
<p>Tell <tt class="docutils literal"><span class="pre">kmk</span></tt> whether or not to export a particular variable to child
processes:</p>
<pre class="literal-block">
export variable
export variable = value
export variable := value
export variable += value
export variable &lt;= value        [1]
export variable ?= value
unexport variable
</pre>
<p>Define a variable in the local context instead of the global one <a class="footnote-reference" href="#id84" id="id2" name="id2">[1]</a>:</p>
<pre class="literal-block">
local variable = value
local variable := value
local variable += value
local variable &lt;= value
local variable ?= value
local define variable
endef
</pre>
<p>Specify a search path for files matching a <tt class="docutils literal"><span class="pre">%</span></tt> pattern:</p>
<pre class="literal-block">
vpath pattern path
</pre>
<p>Remove all search paths previously specified for pattern:</p>
<pre class="literal-block">
vpath pattern
</pre>
<p>Remove all search paths previously specified in any vpath directive:</p>
<pre class="literal-block">
vpath
</pre>
</blockquote>
</div>
<div class="section">
<h1><a id="automatic-variables" name="automatic-variables">Automatic variables</a></h1>
<p>Here is a summary of the automatic variables.</p>
<table border="1" class="docutils">
<colgroup>
<col width="14%" />
<col width="86%" />
</colgroup>
<thead valign="bottom">
<tr><th class="head">Variable</th>
<th class="head">Description</th>
</tr>
</thead>
<tbody valign="top">
<tr><td><tt class="docutils literal"><span class="pre">$&#64;</span></tt></td>
<td>The file name of the target.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">$&lt;</span></tt></td>
<td>The name of the first prerequisite.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">$?</span></tt></td>
<td>The names of all the prerequisites that are newer than the
target, with spaces between them.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">$^</span></tt></td>
<td>The names of all the prerequisites, duplicates omitted.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">$+</span></tt></td>
<td>The names of all the prerequisites, duplicates and order
preserved</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">$*</span></tt></td>
<td>The stem with which an implicit rule matches.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">$|</span></tt></td>
<td>The name of all the order only prerequisites.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">$(&#64;D)</span></tt></td>
<td>The directory part of <tt class="docutils literal"><span class="pre">$&#64;</span></tt>.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">$(&lt;D)</span></tt></td>
<td>The directory part of <tt class="docutils literal"><span class="pre">$&lt;</span></tt>.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">$(?D)</span></tt></td>
<td>The directory part of <tt class="docutils literal"><span class="pre">$?</span></tt>.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">$(^D)</span></tt></td>
<td>The directory part of <tt class="docutils literal"><span class="pre">%^</span></tt>.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">$(+D)</span></tt></td>
<td>The directory part of <tt class="docutils literal"><span class="pre">$+</span></tt>.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">$(*D)</span></tt></td>
<td>The directory part of <tt class="docutils literal"><span class="pre">$*</span></tt>.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">$(|D)</span></tt></td>
<td>The directory part of <tt class="docutils literal"><span class="pre">$|</span></tt>.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">$(&#64;F)</span></tt></td>
<td>The file-within-directory part of <tt class="docutils literal"><span class="pre">$&#64;</span></tt>.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">$(&lt;F)</span></tt></td>
<td>The file-within-directory part of <tt class="docutils literal"><span class="pre">$&lt;</span></tt>.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">$(?F)</span></tt></td>
<td>The file-within-directory part of <tt class="docutils literal"><span class="pre">$?</span></tt>.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">$(^F)</span></tt></td>
<td>The file-within-directory part of <tt class="docutils literal"><span class="pre">$^</span></tt>.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">$(+F)</span></tt></td>
<td>The file-within-directory part of <tt class="docutils literal"><span class="pre">$+</span></tt>.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">$(*F)</span></tt></td>
<td>The file-within-directory part of <tt class="docutils literal"><span class="pre">$*</span></tt>.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">$(|F)</span></tt></td>
<td>The file-within-directory part of <tt class="docutils literal"><span class="pre">$|</span></tt>.</td>
</tr>
</tbody>
</table>
</div>
<div class="section">
<h1><a id="special-variables" name="special-variables">Special variables</a></h1>
<p>All variables starting with a <tt class="docutils literal"><span class="pre">.</span></tt> is reserved by <tt class="docutils literal"><span class="pre">kmk</span></tt>. The following
variables are specially used or/and defined by <tt class="docutils literal"><span class="pre">kmk</span></tt>:</p>
<table border="1" class="docutils">
<colgroup>
<col width="34%" />
<col width="66%" />
</colgroup>
<thead valign="bottom">
<tr><th class="head">Variable</th>
<th class="head">Description</th>
</tr>
</thead>
<tbody valign="top">
<tr><td><tt class="docutils literal"><span class="pre">.DEFAULT_GOAL</span></tt></td>
<td>The makefile default goal. You can set this in
the makefile, if you don't it will default to
the first target that is encountered.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">.FEATURES</span></tt></td>
<td>List of GNU <tt class="docutils literal"><span class="pre">make</span></tt> features. Do not set this.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">.INCLUDE_DIRS</span></tt></td>
<td>List of include directories, <tt class="docutils literal"><span class="pre">-I</span></tt> arguments
and defaults. Do not set this.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">.RECIPEPREFIX</span></tt></td>
<td>Recipe prefix, defaults to tab.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">.VARIABLES</span></tt></td>
<td>Special variable which exands to the list of
variable. Do not set this.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">CURDIR</span></tt></td>
<td>Set to the pathname of the current working
directory (after all <tt class="docutils literal"><span class="pre">-C</span></tt> options are
processed, if any). Do not set this.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">KBUILD_VERSION</span></tt>,
<tt class="docutils literal"><span class="pre">KBUILD_VERSION_MAJOR</span></tt>,
<tt class="docutils literal"><span class="pre">KBUILD_VERSION_MINOR</span></tt>,
<tt class="docutils literal"><span class="pre">KBUILD_VERSION_PATCH</span></tt>,
<tt class="docutils literal"><span class="pre">KBUILD_KMK_REVISION</span></tt></td>
<td>The kBuild version string and the break down
into individual components. <a class="footnote-reference" href="#id84" id="id3" name="id3">[1]</a></td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">KBUILD_HOST</span></tt> <a class="footnote-reference" href="#id84" id="id4" name="id4">[1]</a></td>
<td>The host operating system.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">KBUILD_HOST_ARCH</span></tt> <a class="footnote-reference" href="#id84" id="id5" name="id5">[1]</a></td>
<td>The host architecture.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">KBUILD_HOST_CPU</span></tt> <a class="footnote-reference" href="#id84" id="id6" name="id6">[1]</a></td>
<td>The host CPU <tt class="docutils literal"><span class="pre">kmk</span></tt> is built for, set to
<tt class="docutils literal"><span class="pre">blend</span></tt> if not any particular CPU.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">KBUILD_PATH</span></tt> <a class="footnote-reference" href="#id84" id="id7" name="id7">[1]</a></td>
<td>Where the kBuild scripts are.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">KBUILD_BIN_PATH</span></tt> <a class="footnote-reference" href="#id84" id="id8" name="id8">[1]</a></td>
<td>Where the host specific kBuild binaries are.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">KMK</span></tt> <a class="footnote-reference" href="#id84" id="id9" name="id9">[1]</a>,
<tt class="docutils literal"><span class="pre">MAKE</span></tt></td>
<td>The name with which <tt class="docutils literal"><span class="pre">kmk</span></tt> was invoked. Using
this variable in recipes has special meaning.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">KMK_BUILTIN</span></tt> <a class="footnote-reference" href="#id84" id="id10" name="id10">[1]</a></td>
<td>List of built-in commands.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">KMK_FEATURES</span></tt> <a class="footnote-reference" href="#id84" id="id11" name="id11">[1]</a></td>
<td>List of <tt class="docutils literal"><span class="pre">kmk</span></tt> specific features.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">KMK_FLAGS</span></tt> <a class="footnote-reference" href="#id84" id="id12" name="id12">[1]</a></td>
<td><p class="first">The flags given to <tt class="docutils literal"><span class="pre">kmk</span></tt>. You can set this in
the environment or a makefile to set flags.</p>
<p class="last">It is never appropriate to use <tt class="docutils literal"><span class="pre">KMK_FLAGS</span></tt>
directly in a recipe line: its contents may not
be quoted correctly for use in the shell. Always
allow recursive <tt class="docutils literal"><span class="pre">kmk</span></tt>'s to obtain these values
through the environment from its parent.</p>
</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">KMK_LEVEL</span></tt> <a class="footnote-reference" href="#id84" id="id13" name="id13">[1]</a></td>
<td>The number of levels of recursion (sub-makes).</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">KMK_VERSION</span></tt> <a class="footnote-reference" href="#id84" id="id14" name="id14">[1]</a></td>
<td>The GNU <tt class="docutils literal"><span class="pre">make</span></tt> version number.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">MAKECMDGOALS</span></tt></td>
<td>The targets given to <tt class="docutils literal"><span class="pre">kmk</span></tt> on the command line.
Do not set this.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">MAKEFILES</span></tt></td>
<td>Makefiles to be read on every invocation of
<tt class="docutils literal"><span class="pre">kmk</span></tt>.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">MAKEFILE_LIST</span></tt></td>
<td>List of the makefiles that <tt class="docutils literal"><span class="pre">kmk</span></tt> has opened.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">MAKESHELL</span></tt></td>
<td>OS/2 and MS-DOS only, the name of the command
interpreter that is to be used by <tt class="docutils literal"><span class="pre">kmk</span></tt>. This
value takes precedence over the value of SHELL.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">SHELL</span></tt></td>
<td>The name of the default command interpreter,
kmk_ash. You can set SHELL in the makefile to
change the shell used to run recipes. The SHELL
variable is handled specially when importing
from and exporting to the environment.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">SUFFIXES</span></tt></td>
<td>The default list of suffixes before <tt class="docutils literal"><span class="pre">kmk</span></tt>
reads any makefiles (always empty).</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">VPATH</span></tt></td>
<td>Directory search path for files not found in the
current directory.</td>
</tr>
</tbody>
</table>
<p>The following variables reflects <tt class="docutils literal"><span class="pre">kmk</span></tt> options. Do not set these. <a class="footnote-reference" href="#id84" id="id15" name="id15">[1]</a></p>
<table border="1" class="docutils">
<colgroup>
<col width="49%" />
<col width="51%" />
</colgroup>
<thead valign="bottom">
<tr><th class="head">Variable</th>
<th class="head">Description</th>
</tr>
</thead>
<tbody valign="top">
<tr><td><tt class="docutils literal"><span class="pre">KMK_OPTS_JOBS</span></tt></td>
<td>-j slots, <tt class="docutils literal"><span class="pre">0</span></tt> if not given.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">KMK_OPTS_KEEP_GOING</span></tt></td>
<td>-k indictor (<tt class="docutils literal"><span class="pre">0</span></tt>/<tt class="docutils literal"><span class="pre">1</span></tt>).</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">KMK_OPTS_JUST_PRINT</span></tt></td>
<td>-n indicator (<tt class="docutils literal"><span class="pre">0</span></tt>/<tt class="docutils literal"><span class="pre">1</span></tt>).</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">KMK_OPTS_PRORITY</span></tt></td>
<td>--priority level, <tt class="docutils literal"><span class="pre">0</span></tt> if not given.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">KMK_OPTS_AFFINITY</span></tt></td>
<td>--affinity mask, <tt class="docutils literal"><span class="pre">0</span></tt> if not given.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">KMK_OPTS_STATISTICS</span></tt></td>
<td>--statistics indicator (<tt class="docutils literal"><span class="pre">0</span></tt>/<tt class="docutils literal"><span class="pre">1</span></tt>).</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">KMK_OPTS_PRINT_TIME</span></tt></td>
<td>The --print-time value.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">KMK_OPTS_PRETTY_COMMAND_PRINTING</span></tt></td>
<td>--pretty-command-printing indicator.</td>
</tr>
</tbody>
</table>
</div>
<div class="section">
<h1><a id="special-targets" name="special-targets">Special Targets</a></h1>
<p>Certain names have special meanings if they appear as targets.</p>
<table border="1" class="docutils">
<colgroup>
<col width="41%" />
<col width="59%" />
</colgroup>
<thead valign="bottom">
<tr><th class="head">Target</th>
<th class="head">Description</th>
</tr>
</thead>
<tbody valign="top">
<tr><td><tt class="docutils literal"><span class="pre">.DEFAULT</span></tt></td>
<td>The recipe is used for any target for which
no rules are found.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">.DELETE_ON_ERROR</span></tt></td>
<td>If mentioned, <tt class="docutils literal"><span class="pre">kmk</span></tt> will delete the
targets of a rule if it has changed and its
recipe fails or is interrupted.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">.EXPORT_ALL_VARIABLES</span></tt></td>
<td>If mentioned, all variables will by default
be exported to child processes.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">.IGNORE</span></tt></td>
<td>Ignore errors in the execution of the recipe
for the targets <tt class="docutils literal"><span class="pre">.IGNORE</span></tt> depends on, if
no prequisites all targets are affected.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">.INTERMEDIATE</span></tt></td>
<td>The prerequisites are treated as
intermediate files (implicite rules).</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">.LOW_RESOLUTION_TIME</span></tt></td>
<td><tt class="docutils literal"><span class="pre">kmk</span></tt> will assume prerequisite files are
created with low resolution time stamps.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">.NOTPARALLEL</span></tt></td>
<td>If mentioned without any prerequisites,
<tt class="docutils literal"><span class="pre">kmk</span></tt> will run serially as if -j1 was
given. If it has prerequisites <tt class="docutils literal"><span class="pre">kmk</span></tt> <a class="footnote-reference" href="#id84" id="id16" name="id16">[1]</a>
will only do this for the targets among
them.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">.PHONY</span></tt></td>
<td>The prerequisites are considered phony and
will be rebuilt unconditionally.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">.PRECIOUS</span></tt></td>
<td>The targets which <tt class="docutils literal"><span class="pre">.PRECIOUS</span></tt> depends
will to be deleted if <tt class="docutils literal"><span class="pre">kmk</span></tt> is killed or
interrupted while their building.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">.SECONDARY</span></tt></td>
<td>The prerequisites are treated as
intermediate files, except that they are
never automatically deleted. If used with
no prerequisites all targets gets this
treatement.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">.SECONDEXPANSION</span></tt></td>
<td>If mentioned, all prerequisite lists after
it will be expanded a second time after all
makefiles have been read.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">.SECONDTARGETEXPANSION</span></tt>
<a class="footnote-reference" href="#id84" id="id17" name="id17">[1]</a></td>
<td>If mentioned, all targets after it will be
expanded a second time after all makefiles
have been read.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">.SILENT</span></tt></td>
<td><tt class="docutils literal"><span class="pre">kmk</span></tt> will not print the recipe for
targets listed as prerequisites, if none
then it applies to all targets.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">.SUFFIXES</span></tt></td>
<td>The prerequisites are the list of suffixes
used in checking for suffix rules. If it
appears without prerequisites it the suffix
will be cleared.</td>
</tr>
</tbody>
</table>
</div>
<div class="section">
<h1><a id="commands" name="commands">Commands</a></h1>
<p>Builtin commands <a class="footnote-reference" href="#id84" id="id18" name="id18">[1]</a> all start with <tt class="docutils literal"><span class="pre">kmk_builtin_</span></tt>, so in order to save
space this prefix has been omitted in the table below. All commands comes in an
external edition that can be used by/in the shell, these are prefixed <tt class="docutils literal"><span class="pre">kmk_</span></tt>.</p>
<table border="1" class="docutils">
<colgroup>
<col width="20%" />
<col width="80%" />
</colgroup>
<thead valign="bottom">
<tr><th class="head">Command</th>
<th class="head">Description</th>
</tr>
</thead>
<tbody valign="top">
<tr><td><tt class="docutils literal"><span class="pre">append</span></tt></td>
<td>Append text to a file. The builtin version can output the
value of a variable or the commands of a target.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">cat</span></tt></td>
<td>The BSD <tt class="docutils literal"><span class="pre">cat</span></tt> command.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">chmod</span></tt></td>
<td>The BSD <tt class="docutils literal"><span class="pre">chmod</span></tt> command.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">cmp</span></tt></td>
<td>The BSD <tt class="docutils literal"><span class="pre">cmp</span></tt> command.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">cp</span></tt></td>
<td>The BSD <tt class="docutils literal"><span class="pre">cp</span></tt> command with some twaking.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">echo</span></tt></td>
<td>The BSD <tt class="docutils literal"><span class="pre">echo</span></tt> command.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">expr</span></tt></td>
<td>The BSD <tt class="docutils literal"><span class="pre">expr</span></tt> command.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">install</span></tt></td>
<td>The BSD <tt class="docutils literal"><span class="pre">install</span></tt> command with some tweaking.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">kDepIDB</span></tt></td>
<td>Extract dependencies from a Visual C++ .IDB file.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">ln</span></tt></td>
<td>The BSD <tt class="docutils literal"><span class="pre">ln</span></tt> command.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">md5sum</span></tt></td>
<td>Typical MD5 sum program, custom kBuild version.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">mkdir</span></tt></td>
<td>The BSD <tt class="docutils literal"><span class="pre">mkdir</span></tt> command.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">mv</span></tt></td>
<td>The BSD <tt class="docutils literal"><span class="pre">mv</span></tt> command with some tweaking.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">printf</span></tt></td>
<td>The BSD <tt class="docutils literal"><span class="pre">printf</span></tt> command.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">rm</span></tt></td>
<td>The BSD <tt class="docutils literal"><span class="pre">rm</span></tt> command with some tweaking.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">rmdir</span></tt></td>
<td>The BSD <tt class="docutils literal"><span class="pre">rmdir</span></tt> command with some tweaking.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">sleep</span></tt></td>
<td>Typical <tt class="docutils literal"><span class="pre">sleep</span></tt> program, custom kBuild version.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">test</span></tt></td>
<td>The BSD <tt class="docutils literal"><span class="pre">test</span></tt> program with some tweaking.</td>
</tr>
</tbody>
</table>
<p>Some additional external commands are available in the <tt class="docutils literal"><span class="pre">kmk</span></tt> / <tt class="docutils literal"><span class="pre">kBuild</span></tt>
environment (<tt class="docutils literal"><span class="pre">kSomething</span></tt> command are not prefixed with <tt class="docutils literal"><span class="pre">kmk_</span></tt>):</p>
<table border="1" class="docutils">
<colgroup>
<col width="20%" />
<col width="80%" />
</colgroup>
<thead valign="bottom">
<tr><th class="head">Command</th>
<th class="head">Description</th>
</tr>
</thead>
<tbody valign="top">
<tr><td><tt class="docutils literal"><span class="pre">kDepPre</span></tt></td>
<td>Extract dependencies from the C/C++ preprocessor output.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">kObjCache</span></tt></td>
<td>Simple object file cache program.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">ash</span></tt></td>
<td>Almquist's shell (NetBSD variant).</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">gmake</span></tt></td>
<td>Vanilla GNU <tt class="docutils literal"><span class="pre">make</span></tt> from same sources as <tt class="docutils literal"><span class="pre">kmk</span></tt>.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">redirect</span></tt></td>
<td>Shell avoidance tool. Sets up file descriptors, environment
variables and current directory before kicking of program.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">sed</span></tt></td>
<td>GNU <tt class="docutils literal"><span class="pre">sed</span></tt> with some tweaks to avoid involving the shell.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">time</span></tt></td>
<td>Stopwatch utility for measuring program execution time(s).</td>
</tr>
</tbody>
</table>
</div>
<div class="section">
<h1><a id="kmk-expression" name="kmk-expression">kmk-expression</a></h1>
<p><tt class="docutils literal"><span class="pre">kmk</span></tt>-expressions <a class="footnote-reference" href="#id84" id="id19" name="id19">[1]</a> are related to the C/C++ preprocessor in some ways as
well as <tt class="docutils literal"><span class="pre">nmake</span></tt> and BSD <tt class="docutils literal"><span class="pre">make</span></tt>. There are however some peculiarities
because of the way GNU <tt class="docutils literal"><span class="pre">make</span></tt> choose to represent booleans in its function
library, so, strings can be turned into boolean by taking any non-empty string
as true.</p>
<p>Quoting using single quotes results in hard strings, while double quotes and
unquoted string results in soft strings that can be converted to number or
boolean to fit the situation.</p>
<p>Here's the operator table in decending precedence order:</p>
<table border="1" class="docutils">
<colgroup>
<col width="20%" />
<col width="11%" />
<col width="70%" />
</colgroup>
<thead valign="bottom">
<tr><th class="head">Operator</th>
<th class="head">Type</th>
<th class="head">Description</th>
</tr>
</thead>
<tbody valign="top">
<tr><td><tt class="docutils literal"><span class="pre">defined</span></tt></td>
<td rowspan="6">Unary</td>
<td>Checks if the following variable exists.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">exists</span></tt></td>
<td>Checks if the following file exists.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">target</span></tt></td>
<td>Checks if the following target exists.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">bool</span></tt></td>
<td>Casts the following value to boolean.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">num</span></tt></td>
<td>Casts the following value to a number.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">str</span></tt></td>
<td>Casts the following value to a string.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">!</span></tt></td>
<td rowspan="4">Unary</td>
<td>Logical NOT.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">+</span></tt></td>
<td>Pluss prefix.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">-</span></tt></td>
<td>Minus prefix.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">~</span></tt></td>
<td>Bitwise one's complement.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">*</span></tt></td>
<td rowspan="3">Binary</td>
<td>Multiplication (product).</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">/</span></tt></td>
<td>Division (quotient).</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">%</span></tt></td>
<td>Modulus (remainder).</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">+</span></tt></td>
<td rowspan="2">Binary</td>
<td>Addition (sum).</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">-</span></tt></td>
<td>Subtraction (difference).</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">&lt;&lt;</span></tt></td>
<td rowspan="2">Binary</td>
<td>Bitwise left shift.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">&gt;&gt;</span></tt></td>
<td>Bitwise right shift.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">&lt;=</span></tt></td>
<td rowspan="4">Binary</td>
<td>Less or equal than.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">&lt;</span></tt></td>
<td>Less than.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">&gt;=</span></tt></td>
<td>Greater or equal than.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">&gt;</span></tt></td>
<td>Greater than.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">==</span></tt></td>
<td rowspan="2">Binary</td>
<td>Equal to.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">!=</span></tt></td>
<td>Not equal to.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">&amp;</span></tt></td>
<td>Binary</td>
<td>Bitwise AND.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">^</span></tt></td>
<td>Binary</td>
<td>Bitwise XOR.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">|</span></tt></td>
<td>Binary</td>
<td>Bitwise OR.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">&amp;&amp;</span></tt></td>
<td>Binary</td>
<td>Logical AND.</td>
</tr>
<tr><td><tt class="docutils literal"><span class="pre">||</span></tt></td>
<td>Binary</td>
<td>Logical OR.</td>
</tr>
</tbody>
</table>
</div>
<div class="section">
<h1><a id="built-in-functions" name="built-in-functions">Built-in functions</a></h1>
<p>String Manipulation Functions:</p>
<blockquote>
<p>Replace <tt class="docutils literal"><span class="pre">from</span></tt> with <tt class="docutils literal"><span class="pre">to</span></tt> in <tt class="docutils literal"><span class="pre">text</span></tt>:</p>
<pre class="literal-block">
$(subst from,to,text)
</pre>
<p>Replace words matching <tt class="docutils literal"><span class="pre">pattern</span></tt> with <tt class="docutils literal"><span class="pre">replacement</span></tt> in <tt class="docutils literal"><span class="pre">text</span></tt>:</p>
<pre class="literal-block">
$(patsubst pattern,replacement,text)
</pre>
<p>Remove excess whitespace characters from <tt class="docutils literal"><span class="pre">string</span></tt>:</p>
<pre class="literal-block">
$(strip string)
</pre>
<p>Locate <tt class="docutils literal"><span class="pre">find</span></tt> in <tt class="docutils literal"><span class="pre">text</span></tt>, returning <tt class="docutils literal"><span class="pre">find</span></tt> if found:</p>
<pre class="literal-block">
$(findstring find,text)
</pre>
<p>Select words in <tt class="docutils literal"><span class="pre">text</span></tt> that match one of the <tt class="docutils literal"><span class="pre">pattern</span></tt> words:</p>
<pre class="literal-block">
$(filter pattern...,text)
</pre>
<p>Select words in <tt class="docutils literal"><span class="pre">text</span></tt> that do not match any of the <tt class="docutils literal"><span class="pre">pattern</span></tt> words:</p>
<pre class="literal-block">
$(filter-out pattern...,text)
</pre>
<p>Sort the words in <tt class="docutils literal"><span class="pre">list</span></tt> lexicographically, removing duplicates:</p>
<pre class="literal-block">
$(sort list)
</pre>
<p>Sort the words in <tt class="docutils literal"><span class="pre">list</span></tt> lexicographically in reserve order, removing
duplicates <a class="footnote-reference" href="#id84" id="id20" name="id20">[1]</a>:</p>
<pre class="literal-block">
$(rsort list)
</pre>
<p>Count the number of words in <tt class="docutils literal"><span class="pre">text</span></tt>:</p>
<pre class="literal-block">
$(words text)
</pre>
<p>Extract the <tt class="docutils literal"><span class="pre">n</span></tt>th word (one-origin) of <tt class="docutils literal"><span class="pre">text</span></tt>:</p>
<pre class="literal-block">
$(word n,text)
</pre>
<p>Returns the list of words in <tt class="docutils literal"><span class="pre">text</span></tt> from <tt class="docutils literal"><span class="pre">s</span></tt> to <tt class="docutils literal"><span class="pre">e</span></tt> (one-origin):</p>
<pre class="literal-block">
$(wordlist s,e,text)
</pre>
<p>Extract the first word of <tt class="docutils literal"><span class="pre">names</span></tt>:</p>
<pre class="literal-block">
$(firstword names...)
</pre>
<p>Extract the last word of <tt class="docutils literal"><span class="pre">names</span></tt>:</p>
<pre class="literal-block">
$(lastword names...)
</pre>
<p>Join two parallel lists of words:</p>
<pre class="literal-block">
$(join list1,list2)
</pre>
<p>Fold <tt class="docutils literal"><span class="pre">text</span></tt> to upper case <a class="footnote-reference" href="#id84" id="id21" name="id21">[1]</a>:</p>
<pre class="literal-block">
$(toupper text)
</pre>
<p>Fold <tt class="docutils literal"><span class="pre">text</span></tt> to lower case <a class="footnote-reference" href="#id84" id="id22" name="id22">[1]</a>:</p>
<pre class="literal-block">
$(tolower text)
</pre>
<p>String formatting a la the unix <tt class="docutils literal"><span class="pre">printf</span></tt> command <a class="footnote-reference" href="#id84" id="id23" name="id23">[1]</a>:</p>
<pre class="literal-block">
$(printf fmt, arg...)
</pre>
<p>Return the length of a string or a (unexpanded) variable <a class="footnote-reference" href="#id84" id="id24" name="id24">[1]</a>:</p>
<pre class="literal-block">
$(length string)
$(length-var var)
</pre>
<p>Find the position of <tt class="docutils literal"><span class="pre">needle</span></tt> in <tt class="docutils literal"><span class="pre">haystack</span></tt>, returns 0 if not found.
Negative <tt class="docutils literal"><span class="pre">start</span></tt> indices are relative to the end of <tt class="docutils literal"><span class="pre">haystack</span></tt>, while
positive ones are one based <a class="footnote-reference" href="#id84" id="id25" name="id25">[1]</a>:</p>
<pre class="literal-block">
$(pos needle, haystack[, start])
$(lastpos needle, haystack[, start])
</pre>
<p>Returns the specified substring. The <tt class="docutils literal"><span class="pre">start</span></tt> works like with <tt class="docutils literal"><span class="pre">$(pos</span> <span class="pre">)</span></tt>.
If the substring is partially outside the <tt class="docutils literal"><span class="pre">string</span></tt> the result will be
padded with <tt class="docutils literal"><span class="pre">pad</span></tt> if present <a class="footnote-reference" href="#id84" id="id26" name="id26">[1]</a>:</p>
<pre class="literal-block">
$(substr string, start[, length[, pad]])
</pre>
<p>Insert <tt class="docutils literal"><span class="pre">in</span></tt> into <tt class="docutils literal"><span class="pre">str</span></tt> at the specified position. <tt class="docutils literal"><span class="pre">n</span></tt> works like with
<tt class="docutils literal"><span class="pre">$(pos</span> <span class="pre">)</span></tt>, except that <tt class="docutils literal"><span class="pre">0</span></tt> is the end of the string <a class="footnote-reference" href="#id84" id="id27" name="id27">[1]</a>:</p>
<pre class="literal-block">
$(insert in, str[, n[, length[, pad]]])
</pre>
<p>Translate <tt class="docutils literal"><span class="pre">string</span></tt> exchanging characters in <tt class="docutils literal"><span class="pre">from-set</span></tt> with <tt class="docutils literal"><span class="pre">to-set</span></tt>,
optionally completing <tt class="docutils literal"><span class="pre">to-set</span></tt> with <tt class="docutils literal"><span class="pre">pad-char</span></tt> if specified. If no
<tt class="docutils literal"><span class="pre">pad-char</span></tt> characters absent in <tt class="docutils literal"><span class="pre">to-set</span></tt> will be deleted <a class="footnote-reference" href="#id84" id="id28" name="id28">[1]</a>:</p>
<pre class="literal-block">
$(translate string, from-set[, to-set[, pad-char]])
</pre>
</blockquote>
<p>Functions for file names:</p>
<blockquote>
<p>Extract the directory part of each file <tt class="docutils literal"><span class="pre">name</span></tt>:</p>
<pre class="literal-block">
$(dir names...)
</pre>
<p>Extract the non-directory part of each file <tt class="docutils literal"><span class="pre">name</span></tt>:</p>
<pre class="literal-block">
$(notdir names...)
</pre>
<p>Extract the suffix (the last <tt class="docutils literal"><span class="pre">.</span></tt> and following characters) of each file
<tt class="docutils literal"><span class="pre">name</span></tt>:</p>
<pre class="literal-block">
$(suffix names...)
</pre>
<p>Extract the base name (name without suffix) of each file name:</p>
<pre class="literal-block">
$(basename names...)
</pre>
<p>Extract the root specification of each file name (a bit complicated on
Windows &amp; OS/2) <a class="footnote-reference" href="#id84" id="id29" name="id29">[1]</a>:</p>
<pre class="literal-block">
$(root names...)
</pre>
<p>Append <tt class="docutils literal"><span class="pre">suffix</span></tt> to each word in <tt class="docutils literal"><span class="pre">names</span></tt>:</p>
<pre class="literal-block">
$(addsuffix suffix,names...)
</pre>
<p>Prepend <tt class="docutils literal"><span class="pre">prefix</span></tt> to each word in <tt class="docutils literal"><span class="pre">names</span></tt>:</p>
<pre class="literal-block">
$(addprefix prefix,names...)
</pre>
<p>Find file names matching a shell file name <tt class="docutils literal"><span class="pre">pattern</span></tt> (not a <tt class="docutils literal"><span class="pre">%</span></tt>
pattern):</p>
<pre class="literal-block">
$(wildcard pattern...)
</pre>
<p>For each file name in <tt class="docutils literal"><span class="pre">names</span></tt>, expand to an absolute name that does not
contain any <tt class="docutils literal"><span class="pre">.</span></tt>, <tt class="docutils literal"><span class="pre">..</span></tt>, nor symlinks:</p>
<pre class="literal-block">
$(realpath names...)
</pre>
<p>For each file name in <tt class="docutils literal"><span class="pre">names</span></tt>, expand to an absolute name that does not
contain any <tt class="docutils literal"><span class="pre">.</span></tt> or <tt class="docutils literal"><span class="pre">..</span></tt> components, but preserves symlinks:</p>
<pre class="literal-block">
$(abspath names...)
</pre>
<p>Same as <tt class="docutils literal"><span class="pre">$(abspath</span> <span class="pre">)</span></tt> except that the current directory can be
specified as <tt class="docutils literal"><span class="pre">curdir</span></tt> <a class="footnote-reference" href="#id84" id="id30" name="id30">[1]</a>:</p>
<pre class="literal-block">
$(abspathex names...[, curdir])
</pre>
</blockquote>
<p>Arithmetic Functions:</p>
<blockquote>
<p>Returns the sum of the arguments <a class="footnote-reference" href="#id84" id="id31" name="id31">[1]</a>:</p>
<pre class="literal-block">
$(int-add addend1, addend2[, addendN])
</pre>
<p>Returns the difference between the first argument and the sum of the
rest <a class="footnote-reference" href="#id84" id="id32" name="id32">[1]</a>:</p>
<pre class="literal-block">
$(int-sub minuend, subtrahend[, subtrahendN])
</pre>
<p>Returns the product of the arguments <a class="footnote-reference" href="#id84" id="id33" name="id33">[1]</a>:</p>
<pre class="literal-block">
$(int-mul factor1, factor2[, factorN])
</pre>
<p>Returns the quotient of first argument and the rest <a class="footnote-reference" href="#id84" id="id34" name="id34">[1]</a>:</p>
<pre class="literal-block">
$(int-div dividend, divisor[, divisorN])
</pre>
<p>Returns the modulus of the two arguments <a class="footnote-reference" href="#id84" id="id35" name="id35">[1]</a>:</p>
<pre class="literal-block">
$(int-mod dividend, divisor)
</pre>
<p>Returns the bitwise two-complement of argument <a class="footnote-reference" href="#id84" id="id36" name="id36">[1]</a>:</p>
<pre class="literal-block">
$(int-not val)
</pre>
<p>Returns the result of a bitwise AND of the arguments <a class="footnote-reference" href="#id84" id="id37" name="id37">[1]</a>:</p>
<pre class="literal-block">
$(int-and val1, val2[, valN])
</pre>
<p>Returns the result of a bitwise OR of the arguments <a class="footnote-reference" href="#id84" id="id38" name="id38">[1]</a>:</p>
<pre class="literal-block">
$(int-or val1, val2[, valN])
</pre>
<p>Returns the result of a bitwise XOR of the arguments <a class="footnote-reference" href="#id84" id="id39" name="id39">[1]</a>:</p>
<pre class="literal-block">
$(int-xor val1, val2[, valN])
</pre>
<p>Returns the <tt class="docutils literal"><span class="pre">kmk</span></tt> boolean (true = non-empty, false = empty) result
of <tt class="docutils literal"><span class="pre">val1</span> <span class="pre">==</span> <span class="pre">val2</span></tt> <a class="footnote-reference" href="#id84" id="id40" name="id40">[1]</a>:</p>
<pre class="literal-block">
$(int-eq val1, val2)
</pre>
<p>Returns the <tt class="docutils literal"><span class="pre">kmk</span></tt> boolean result of <tt class="docutils literal"><span class="pre">val1</span> <span class="pre">!=</span> <span class="pre">val2</span></tt> <a class="footnote-reference" href="#id84" id="id41" name="id41">[1]</a>:</p>
<pre class="literal-block">
$(int-ne val1, val2)
</pre>
<p>Returns the <tt class="docutils literal"><span class="pre">kmk</span></tt> boolean result of <tt class="docutils literal"><span class="pre">val1</span> <span class="pre">&gt;</span> <span class="pre">val2</span></tt> <a class="footnote-reference" href="#id84" id="id42" name="id42">[1]</a>:</p>
<pre class="literal-block">
$(int-gt val1, val2)
</pre>
<p>Returns the <tt class="docutils literal"><span class="pre">kmk</span></tt> boolean result of <tt class="docutils literal"><span class="pre">val1</span> <span class="pre">&gt;=</span> <span class="pre">val2</span></tt> <a class="footnote-reference" href="#id84" id="id43" name="id43">[1]</a>:</p>
<pre class="literal-block">
$(int-ge val1, val2)
</pre>
<p>Returns the <tt class="docutils literal"><span class="pre">kmk</span></tt> boolean result of <tt class="docutils literal"><span class="pre">val1</span> <span class="pre">&lt;</span> <span class="pre">val2</span></tt> <a class="footnote-reference" href="#id84" id="id44" name="id44">[1]</a>:</p>
<pre class="literal-block">
$(int-lt val1, val2)
</pre>
<p>Returns the <tt class="docutils literal"><span class="pre">kmk</span></tt> boolean result of <tt class="docutils literal"><span class="pre">val1</span> <span class="pre">&lt;=</span> <span class="pre">val2</span></tt> <a class="footnote-reference" href="#id84" id="id45" name="id45">[1]</a>:</p>
<pre class="literal-block">
$(int-le val1, val2)
</pre>
</blockquote>
<p>Boolean and Conditional Functions:</p>
<blockquote>
<p>Condition is false if the <tt class="docutils literal"><span class="pre">condition</span></tt> evaluates to an empty string
(stripped). Evaluate the <tt class="docutils literal"><span class="pre">true-part</span></tt> if the condition is true, otherwise
the <tt class="docutils literal"><span class="pre">false-part</span></tt>:</p>
<pre class="literal-block">
$(if condition,true-part[,false-part])
</pre>
<p>Test if any of the conditions evalues to non-empty string, returning the
first one:</p>
<pre class="literal-block">
$(or condition1[,condition2[,condition3[...]]])
</pre>
<p>Test if all of the conditions evaluates to non-empty strings, returning the
last one:</p>
<pre class="literal-block">
$(and condition1[,condition2[,condition3[...]]])
</pre>
<p>Test if the two strings are identical, returning <tt class="docutils literal"><span class="pre">kmk</span></tt> boolean (true =
non-empty, false = empty) <a class="footnote-reference" href="#id85" id="id46" name="id46">[2]</a>:</p>
<pre class="literal-block">
$(eq str1, str2)
</pre>
<p>Invert a <tt class="docutils literal"><span class="pre">kmk</span></tt> boolean value <a class="footnote-reference" href="#id85" id="id47" name="id47">[2]</a>:</p>
<pre class="literal-block">
$(not val)
</pre>
<p>Test if <tt class="docutils literal"><span class="pre">variable</span></tt> is defined, returning a <tt class="docutils literal"><span class="pre">kmk</span></tt> boolean value <a class="footnote-reference" href="#id84" id="id48" name="id48">[1]</a>:</p>
<pre class="literal-block">
$(defined variable)
</pre>
<p>Test if <tt class="docutils literal"><span class="pre">set-a</span></tt> and <tt class="docutils literal"><span class="pre">set-b</span></tt> intersects, returning a <tt class="docutils literal"><span class="pre">kmk</span></tt> boolean
value <a class="footnote-reference" href="#id84" id="id49" name="id49">[1]</a>:</p>
<pre class="literal-block">
$(intersects set-a, set-b)
</pre>
<p>Same as <tt class="docutils literal"><span class="pre">$(if</span> <span class="pre">)</span></tt> execpt that the condition is a <tt class="docutils literal"><span class="pre">kmk</span></tt>-expression <a class="footnote-reference" href="#id84" id="id50" name="id50">[1]</a>:</p>
<pre class="literal-block">
$(if-expr kmk-expression,true-part[,false-part])
</pre>
<p>Select the first true condition (<tt class="docutils literal"><span class="pre">kmk</span></tt>-expression) and expand the
following body. Special condition strings <tt class="docutils literal"><span class="pre">default</span></tt> and
<tt class="docutils literal"><span class="pre">otherwise</span></tt> <a class="footnote-reference" href="#id84" id="id51" name="id51">[1]</a>:</p>
<pre class="literal-block">
$(select when1-cond, when1-body[, whenN-cond, whenN-body])
</pre>
<p>Evalutate the <tt class="docutils literal"><span class="pre">kmk-expression</span></tt> returning what it evalues as. This is
the preferred way of doing arithmentic now <a class="footnote-reference" href="#id84" id="id52" name="id52">[1]</a>:</p>
<pre class="literal-block">
$(expr kmk-expression)
</pre>
</blockquote>
<p>Stack Fuctions:</p>
<blockquote>
<p>Push <tt class="docutils literal"><span class="pre">item</span></tt> onto the <tt class="docutils literal"><span class="pre">stack-var</span></tt>, returning the empty string <a class="footnote-reference" href="#id84" id="id53" name="id53">[1]</a>:</p>
<pre class="literal-block">
$(stack-push stack-var, item)
</pre>
<p>Pop the top item off the <tt class="docutils literal"><span class="pre">stack-var</span></tt> <a class="footnote-reference" href="#id84" id="id54" name="id54">[1]</a>:</p>
<pre class="literal-block">
$(stack-pop stack-var)
</pre>
<p>Pop the top item off the <tt class="docutils literal"><span class="pre">stack-var</span></tt>, returning the empty string <a class="footnote-reference" href="#id84" id="id55" name="id55">[1]</a>:</p>
<pre class="literal-block">
$(stack-popv stack-var)
</pre>
<p>Get the top item of the <tt class="docutils literal"><span class="pre">stack-var</span></tt>, returning the empty string <a class="footnote-reference" href="#id84" id="id56" name="id56">[1]</a>:</p>
<pre class="literal-block">
$(stack-top stack-var)
</pre>
</blockquote>
<p>Advanced Functions:</p>
<blockquote>
<p>Evaluates to the contents of the variable <tt class="docutils literal"><span class="pre">var</span></tt>, with no expansion
performed on it:</p>
<pre class="literal-block">
$(value var)
</pre>
<p>Evaluate <tt class="docutils literal"><span class="pre">body</span></tt> with <tt class="docutils literal"><span class="pre">var</span></tt> bound to each word in <tt class="docutils literal"><span class="pre">words</span></tt>, and
concatenate the results (spaced):</p>
<pre class="literal-block">
$(foreach var,words,body)
</pre>
<p>C-style for-loop. Start by evaluating <tt class="docutils literal"><span class="pre">init</span></tt>. Each iteration will
first check whether the <tt class="docutils literal"><span class="pre">condition</span></tt> (<tt class="docutils literal"><span class="pre">kmk</span></tt>-expression) is true,
then expand <tt class="docutils literal"><span class="pre">body</span></tt> concatenating the result to the previous iterations
(spaced), and finally evaluate <tt class="docutils literal"><span class="pre">next</span></tt> <a class="footnote-reference" href="#id84" id="id57" name="id57">[1]</a>:</p>
<pre class="literal-block">
$(for init,conditions,next,body)
</pre>
<p>C-style while-loop. Each iteration will check whether the <tt class="docutils literal"><span class="pre">condition</span></tt>
(<tt class="docutils literal"><span class="pre">kmk</span></tt>-expression) is true, then expand <tt class="docutils literal"><span class="pre">body</span></tt> concatenating the
result to the previous iterations <a class="footnote-reference" href="#id84" id="id58" name="id58">[1]</a>:</p>
<pre class="literal-block">
$(while conditions,body)
</pre>
<p>Evaluate the variable <tt class="docutils literal"><span class="pre">var</span></tt> replacing any references to <tt class="docutils literal"><span class="pre">$(1)</span></tt>,
<tt class="docutils literal"><span class="pre">$(2)</span></tt> with the first, second, etc. <tt class="docutils literal"><span class="pre">param</span></tt> values:</p>
<pre class="literal-block">
$(call var,param,...)
</pre>
<p>Evaluate <tt class="docutils literal"><span class="pre">text</span></tt> then read the results as makefile commands. Expands
to the empty string:</p>
<pre class="literal-block">
$(eval text)
</pre>
<p>Same as <tt class="docutils literal"><span class="pre">$(eval</span> <span class="pre">text)</span></tt> except that the <tt class="docutils literal"><span class="pre">text</span></tt> is expanded in its
own variable context <a class="footnote-reference" href="#id84" id="id59" name="id59">[1]</a>:</p>
<pre class="literal-block">
$(evalctx text)
</pre>
<p>Same as <tt class="docutils literal"><span class="pre">$(eval</span> <span class="pre">$(value</span> <span class="pre">var))</span></tt> <a class="footnote-reference" href="#id84" id="id60" name="id60">[1]</a>:</p>
<pre class="literal-block">
$(evalval var)
</pre>
<p>Same as <tt class="docutils literal"><span class="pre">$(evalctx</span> <span class="pre">$(value</span> <span class="pre">var))</span></tt> <a class="footnote-reference" href="#id84" id="id61" name="id61">[1]</a>:</p>
<pre class="literal-block">
$(evalvalctx var)
</pre>
<p>A combination of <tt class="docutils literal"><span class="pre">$(eval</span> <span class="pre">)</span></tt>, <tt class="docutils literal"><span class="pre">$(call</span> <span class="pre">)</span></tt> and <tt class="docutils literal"><span class="pre">$(value</span> <span class="pre">)</span></tt> <a class="footnote-reference" href="#id84" id="id62" name="id62">[1]</a>:</p>
<pre class="literal-block">
$(evalcall var)
</pre>
<p>A combination of <tt class="docutils literal"><span class="pre">$(eval</span> <span class="pre">)</span></tt> and <tt class="docutils literal"><span class="pre">$(call</span> <span class="pre">)</span></tt> <a class="footnote-reference" href="#id84" id="id63" name="id63">[1]</a>:</p>
<pre class="literal-block">
$(evalcall var)
</pre>
<p>Remove comments and blank lines from the variable <tt class="docutils literal"><span class="pre">var</span></tt>. Expands to
the empty string <a class="footnote-reference" href="#id84" id="id64" name="id64">[1]</a>:</p>
<pre class="literal-block">
$(eval-opt-var var)
</pre>
<p>Returns accessing <tt class="docutils literal"><span class="pre">$&lt;</span></tt> of <tt class="docutils literal"><span class="pre">target</span></tt>, either retriving the whole thing
or the file at <tt class="docutils literal"><span class="pre">pos</span></tt> (one-origin) <a class="footnote-reference" href="#id84" id="id65" name="id65">[1]</a>:</p>
<pre class="literal-block">
$(deps target[, pos])
</pre>
<p>Returns accessing <tt class="docutils literal"><span class="pre">$+</span></tt> (order + duplicates) of <tt class="docutils literal"><span class="pre">target</span></tt>, either
retriving the whole thing or the file at <tt class="docutils literal"><span class="pre">pos</span></tt> (one-origin) <a class="footnote-reference" href="#id84" id="id66" name="id66">[1]</a>:</p>
<pre class="literal-block">
$(deps-all target[, pos])
</pre>
<p>Returns accessing <tt class="docutils literal"><span class="pre">$?</span></tt>  of <tt class="docutils literal"><span class="pre">target</span></tt>, either retriving the whole
thing or the file at <tt class="docutils literal"><span class="pre">pos</span></tt> (one-origin) <a class="footnote-reference" href="#id84" id="id67" name="id67">[1]</a>:</p>
<pre class="literal-block">
$(deps-newer target[, pos])
</pre>
<p>Returns accessing <tt class="docutils literal"><span class="pre">$|</span></tt> (order only)  of <tt class="docutils literal"><span class="pre">target</span></tt>, either retriving the
whole thing or the file at <tt class="docutils literal"><span class="pre">pos</span></tt> (one-origin) <a class="footnote-reference" href="#id84" id="id68" name="id68">[1]</a>:</p>
<pre class="literal-block">
$(deps-oo target[, pos])
</pre>
</blockquote>
<p>Command Functions:</p>
<blockquote>
<p>Create one or more command lines avoiding the max argument
length restriction of the host OS <a class="footnote-reference" href="#id84" id="id69" name="id69">[1]</a>:</p>
<pre class="literal-block">
$(xargs ar cas mylib.a,$(objects))
$(xargs ar cas mylib.a,ar as mylib.a,$(objects))
</pre>
<p>Returns the commands for the specified target separated by new-line, space,
or a user defined string. Note that this might not produce the 100% correct
result if any of the prerequisite automatic variables are used <a class="footnote-reference" href="#id84" id="id70" name="id70">[1]</a>:</p>
<pre class="literal-block">
$(commands target)
$(commands-sc target)
$(commands-usr target,sep)
</pre>
<p>Compares two commands returning the empty string if equal and the 3rd
argument if not. This differs from <tt class="docutils literal"><span class="pre">$(comp-vars</span> <span class="pre">v1,v2,ne)</span></tt> in that
line by line is stripped of leading spaces, command prefixes and
trailing spaces before comparing <a class="footnote-reference" href="#id84" id="id71" name="id71">[1]</a>:</p>
<pre class="literal-block">
$(comp-cmds cmds-var1, cmds-var2, ne)
$(comp-cmds-ex cmds1, cmd2, ne)
</pre>
<p>Compares the values of the two variables returning the empty string if
equal and the 3rd argument if not. Leading and trailing spaces is
ignored <a class="footnote-reference" href="#id84" id="id72" name="id72">[1]</a>:</p>
<pre class="literal-block">
$(comp-var var1, var2, ne)
</pre>
</blockquote>
<p>Utility functions:</p>
<blockquote>
<p>When this function is evaluated, <tt class="docutils literal"><span class="pre">kmk</span></tt> generates a fatal error with the
message <tt class="docutils literal"><span class="pre">text</span></tt>:</p>
<pre class="literal-block">
$(error text...)
</pre>
<p>When this function is evaluated, <tt class="docutils literal"><span class="pre">kmk</span></tt> generates a warning with the
message <tt class="docutils literal"><span class="pre">text</span></tt>:</p>
<pre class="literal-block">
$(warning text...)
</pre>
<p>When this function is evaluated, <tt class="docutils literal"><span class="pre">kmk</span></tt> generates a info with the
message <tt class="docutils literal"><span class="pre">text</span></tt>:</p>
<pre class="literal-block">
$(info text...)
</pre>
<p>Execute a shell <tt class="docutils literal"><span class="pre">command</span></tt> and return its output:</p>
<pre class="literal-block">
$(shell command)
</pre>
<p>Return a string describing how the <tt class="docutils literal"><span class="pre">kmk</span></tt> variable <tt class="docutils literal"><span class="pre">variable</span></tt> was defined:</p>
<pre class="literal-block">
$(origin variable)
</pre>
<p>Return a string describing the flavor of the <tt class="docutils literal"><span class="pre">kmk</span></tt> variable <tt class="docutils literal"><span class="pre">variable</span></tt>:</p>
<pre class="literal-block">
$(flavor variable)
</pre>
<p>Returns the current local time and date formatted in the <tt class="docutils literal"><span class="pre">strftime</span></tt>
style specifier <tt class="docutils literal"><span class="pre">fmt</span></tt>. <tt class="docutils literal"><span class="pre">fmt</span></tt> defaults to <tt class="docutils literal"><span class="pre">%Y-%m-%dT%H:%M:%S</span></tt> when
not specified <a class="footnote-reference" href="#id84" id="id73" name="id73">[1]</a>:</p>
<pre class="literal-block">
$(date fmt)
</pre>
<p>Returns the current UTC time and date formatted in the <tt class="docutils literal"><span class="pre">strftime</span></tt>
style specifier <tt class="docutils literal"><span class="pre">fmt</span></tt>. <tt class="docutils literal"><span class="pre">fmt</span></tt> defaults to <tt class="docutils literal"><span class="pre">%Y-%m-%dT%H:%M:%SZ</span></tt> when
not specified <a class="footnote-reference" href="#id84" id="id74" name="id74">[1]</a>:</p>
<pre class="literal-block">
$(date-utc fmt)
</pre>
<p>Reformats the <tt class="docutils literal"><span class="pre">in</span></tt> time and date using <tt class="docutils literal"><span class="pre">fmt</span></tt>. The <tt class="docutils literal"><span class="pre">in-fmt</span></tt> defaults
to <tt class="docutils literal"><span class="pre">fmt</span></tt> if not specified. While <tt class="docutils literal"><span class="pre">fmt</span></tt> defaults to
<tt class="docutils literal"><span class="pre">%Y-%m-%dT%H:%M:%SZ</span></tt> if not specified <a class="footnote-reference" href="#id84" id="id75" name="id75">[1]</a>:</p>
<pre class="literal-block">
$(date-utc fmt,time,in-fmt)
</pre>
<p>Returns the current nanosecond timestamp (monotonic when possible) <a class="footnote-reference" href="#id84" id="id76" name="id76">[1]</a>:</p>
<pre class="literal-block">
$(nanots )
</pre>
<p>Returns the size of the specified file, or -1 if the size could not
be obtained. This can be used to check if a file exist or not <a class="footnote-reference" href="#id84" id="id77" name="id77">[1]</a>:</p>
<pre class="literal-block">
$(file-size file)
</pre>
<p>Searches the <tt class="docutils literal"><span class="pre">PATH</span></tt> <tt class="docutils literal"><span class="pre">kmk</span></tt> variable for the specified <tt class="docutils literal"><span class="pre">files</span></tt> <a class="footnote-reference" href="#id84" id="id78" name="id78">[1]</a>:</p>
<pre class="literal-block">
$(which files...)
</pre>
<p>OS/2: Returns the specified LIBPATH variable value <a class="footnote-reference" href="#id84" id="id79" name="id79">[1]</a>:</p>
<pre class="literal-block">
$(libpath var)
</pre>
<p>OS/2: Sets the specified LIBPATH variable value, returning the empty
string <a class="footnote-reference" href="#id84" id="id80" name="id80">[1]</a>:</p>
<pre class="literal-block">
$(libpath var,value)
</pre>
</blockquote>
<p>Debugging Functions:</p>
<blockquote>
<p>Returns various make statistics, if no item is specified a default
selection is returned <a class="footnote-reference" href="#id84" id="id81" name="id81">[1]</a>:</p>
<pre class="literal-block">
$(make-stats item[,itemN])
</pre>
<p>Raise a debug breakpoint. Used for debugging <tt class="docutils literal"><span class="pre">kmk</span></tt> makefile
parsing <a class="footnote-reference" href="#id84" id="id82" name="id82">[1]</a>:</p>
<pre class="literal-block">
$(breakpoint )
</pre>
</blockquote>
</div>
<div class="section">
<h1><a id="recipes" name="recipes">Recipes</a></h1>
<blockquote>
<p>A typical recipe takes one of the two following forms:</p>
<pre class="literal-block">
targets : normal-prerequisites | order-only-prerequisites
        command
        ...

targets : normal-prerequisites | order-only-prerequisites ; command
        command
        ...
</pre>
<p>Specifying more than one file in the <tt class="docutils literal"><span class="pre">targets</span></tt> lists is the same as
repeating the recipe for each of the files.</p>
<p>Use <tt class="docutils literal"><span class="pre">+</span></tt> and <tt class="docutils literal"><span class="pre">+|</span></tt> in the list of <tt class="docutils literal"><span class="pre">targets</span></tt> to tell <tt class="docutils literal"><span class="pre">kmk</span></tt> that the
recipe has more than one output. <a class="footnote-reference" href="#id84" id="id83" name="id83">[1]</a> The files after a <tt class="docutils literal"><span class="pre">+</span></tt> will
always be remade, while the files after a <tt class="docutils literal"><span class="pre">+|</span></tt> don't have to be remade.
The latter is frequently employed to update files which prerequisites
change wihtout the output files necessarily changing. See also
<tt class="docutils literal"><span class="pre">kmk_cp</span> <span class="pre">--changed</span></tt>.</p>
</blockquote>
<p>Double colon recipes</p>
<blockquote>
Double colon recipes are written with <tt class="docutils literal"><span class="pre">::</span></tt> instead of <tt class="docutils literal"><span class="pre">:</span></tt> and are
handled differently from ordinary recipes if the target appears in more
than one recipe. First, all the recipes must be of the double colon type.
Second, the recipes are executed individually and may be omitted depending
on the state of their prerequisites. Double colon recipes without any
prerequisites will always be executed.</blockquote>
<p>Pattern rules</p>
<blockquote>
<p>A couple of examples:</p>
<pre class="literal-block">
%.o : %.c
        gcc -o $&#64; $&lt;
%.tab.c %.tab.h : %.y
        bison -d $&lt;
</pre>
<p>The latter has two outputs.</p>
</blockquote>
<hr class="docutils" />
<table class="docutils footnote" frame="void" id="id84" rules="none">
<colgroup><col class="label" /><col /></colgroup>
<tbody valign="top">
<tr><td class="label"><a name="id84">[1]</a></td><td><em>(<a class="fn-backref" href="#id1">1</a>, <a class="fn-backref" href="#id2">2</a>, <a class="fn-backref" href="#id3">3</a>, <a class="fn-backref" href="#id4">4</a>, <a class="fn-backref" href="#id5">5</a>, <a class="fn-backref" href="#id6">6</a>, <a class="fn-backref" href="#id7">7</a>, <a class="fn-backref" href="#id8">8</a>, <a class="fn-backref" href="#id9">9</a>, <a class="fn-backref" href="#id10">10</a>, <a class="fn-backref" href="#id11">11</a>, <a class="fn-backref" href="#id12">12</a>, <a class="fn-backref" href="#id13">13</a>, <a class="fn-backref" href="#id14">14</a>, <a class="fn-backref" href="#id15">15</a>, <a class="fn-backref" href="#id16">16</a>, <a class="fn-backref" href="#id17">17</a>, <a class="fn-backref" href="#id18">18</a>, <a class="fn-backref" href="#id19">19</a>, <a class="fn-backref" href="#id20">20</a>, <a class="fn-backref" href="#id21">21</a>, <a class="fn-backref" href="#id22">22</a>, <a class="fn-backref" href="#id23">23</a>, <a class="fn-backref" href="#id24">24</a>, <a class="fn-backref" href="#id25">25</a>, <a class="fn-backref" href="#id26">26</a>, <a class="fn-backref" href="#id27">27</a>, <a class="fn-backref" href="#id28">28</a>, <a class="fn-backref" href="#id29">29</a>, <a class="fn-backref" href="#id30">30</a>, <a class="fn-backref" href="#id31">31</a>, <a class="fn-backref" href="#id32">32</a>, <a class="fn-backref" href="#id33">33</a>, <a class="fn-backref" href="#id34">34</a>, <a class="fn-backref" href="#id35">35</a>, <a class="fn-backref" href="#id36">36</a>, <a class="fn-backref" href="#id37">37</a>, <a class="fn-backref" href="#id38">38</a>, <a class="fn-backref" href="#id39">39</a>, <a class="fn-backref" href="#id40">40</a>, <a class="fn-backref" href="#id41">41</a>, <a class="fn-backref" href="#id42">42</a>, <a class="fn-backref" href="#id43">43</a>, <a class="fn-backref" href="#id44">44</a>, <a class="fn-backref" href="#id45">45</a>, <a class="fn-backref" href="#id48">46</a>, <a class="fn-backref" href="#id49">47</a>, <a class="fn-backref" href="#id50">48</a>, <a class="fn-backref" href="#id51">49</a>, <a class="fn-backref" href="#id52">50</a>, <a class="fn-backref" href="#id53">51</a>, <a class="fn-backref" href="#id54">52</a>, <a class="fn-backref" href="#id55">53</a>, <a class="fn-backref" href="#id56">54</a>, <a class="fn-backref" href="#id57">55</a>, <a class="fn-backref" href="#id58">56</a>, <a class="fn-backref" href="#id59">57</a>, <a class="fn-backref" href="#id60">58</a>, <a class="fn-backref" href="#id61">59</a>, <a class="fn-backref" href="#id62">60</a>, <a class="fn-backref" href="#id63">61</a>, <a class="fn-backref" href="#id64">62</a>, <a class="fn-backref" href="#id65">63</a>, <a class="fn-backref" href="#id66">64</a>, <a class="fn-backref" href="#id67">65</a>, <a class="fn-backref" href="#id68">66</a>, <a class="fn-backref" href="#id69">67</a>, <a class="fn-backref" href="#id70">68</a>, <a class="fn-backref" href="#id71">69</a>, <a class="fn-backref" href="#id72">70</a>, <a class="fn-backref" href="#id73">71</a>, <a class="fn-backref" href="#id74">72</a>, <a class="fn-backref" href="#id75">73</a>, <a class="fn-backref" href="#id76">74</a>, <a class="fn-backref" href="#id77">75</a>, <a class="fn-backref" href="#id78">76</a>, <a class="fn-backref" href="#id79">77</a>, <a class="fn-backref" href="#id80">78</a>, <a class="fn-backref" href="#id81">79</a>, <a class="fn-backref" href="#id82">80</a>, <a class="fn-backref" href="#id83">81</a>)</em> <tt class="docutils literal"><span class="pre">kmk</span></tt> only feature.</td></tr>
</tbody>
</table>
<table class="docutils footnote" frame="void" id="id85" rules="none">
<colgroup><col class="label" /><col /></colgroup>
<tbody valign="top">
<tr><td class="label"><a name="id85">[2]</a></td><td><em>(<a class="fn-backref" href="#id46">1</a>, <a class="fn-backref" href="#id47">2</a>)</em> Experimental GNU <tt class="docutils literal"><span class="pre">make</span></tt> feature that is not enabled by default.</td></tr>
</tbody>
</table>
<hr class="docutils" />
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field"><th class="field-name">Status:</th><td class="field-body"><p class="first">$Id: QuickReference-kmk.html 2340 2009-04-18 12:05:47Z bird $</p>
</td>
</tr>
<tr class="field"><th class="field-name">Copyright:</th><td class="field-body"><p class="first">Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
2007 Free Software Foundation, Inc.</p>
<p class="last">Copyright (c) 2008-2009 knut st. osmundsen</p>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</body>
</html>