aboutsummaryrefslogtreecommitdiff
path: root/documentation/content/zh-cn/books/porters-handbook/porting-dads/_index.adoc
blob: b459f02a7f68b664e6bf9a27c844ee10634acb14 (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
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
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
---
title: 第 12 章 该做什么和不该做什么
prev: books/porters-handbook/security
next: books/porters-handbook/porting-samplem
showBookMenu: true
weight: 12
path: "/books/porters-handbook/"
---

[[porting-dads]]
= 该做什么和不该做什么
:doctype: book
:toc: macro
:toclevels: 1
:icons: font
:sectnums:
:sectnumlevels: 6
:sectnumoffset: 12
:partnums:
:source-highlighter: rouge
:experimental:
:images-path: books/porters-handbook/

ifdef::env-beastie[]
ifdef::backend-html5[]
:imagesdir: ../../../../images/{images-path}
endif::[]
ifndef::book[]
include::shared/authors.adoc[]
include::shared/mirrors.adoc[]
include::shared/releases.adoc[]
include::shared/attributes/attributes-{{% lang %}}.adoc[]
include::shared/{{% lang %}}/teams.adoc[]
include::shared/{{% lang %}}/mailing-lists.adoc[]
include::shared/{{% lang %}}/urls.adoc[]
toc::[]
endif::[]
ifdef::backend-pdf,backend-epub3[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]
endif::[]

ifndef::env-beastie[]
toc::[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]

[[dads-intro]]
== 介绍

这里是一些在移植软件时可能会遇到的常见问题。 您应按照这个列表检查自己的 port, 同样地, 您也可以帮助检查 http://www.FreeBSD.org/cgi/query-pr-summary.cgi?query[PR 数据库] 中由其它人提交的 port。 请按照在 extref:{contributing}[问题报告和一般性注释, CONTRIB-GENERAL] 中介绍的方法提交您的看法。 帮助检查 PR 数据库中的 ports 即能够帮助我们更快地 commit 它们, 也能证明您清楚地了解如何完成这些工作。

[[porting-wrkdir]]
== `WRKDIR` (联编时使用的临时目录)

任何时候都不要在 `WRKDIR` 以外的位置写文件。 `WRKDIR` 是在 port 联编过程中唯一的一处一定可写的地方 (参见 extref:{handbook}ports[如何从 CDROM 安装 port, PORTS-CD] 以了解从只读的目录中联编和安装 port 的例子)。 如果您需要改变 [.filename]##pkg-*## 文件, 请按照 <<porting-pkgfiles,重新定义某个变量>> 介绍的方法, 而不是覆盖它们来实现。

[[porting-wrkdirprefix]]
== `WRKDIRPREFIX` (用于联编的临时目录的父目录名)

一定要确保您的 port 尊重 `WRKDIRPREFIX` 的设置。 绝大多数 port 并不需要担心这个。 具体说来, 当引用其它 port 的 `WRKDIR` 时, 需要注意正确的位置应该是 [.filename]#WRKDIRPREFIXPORTSDIR/subdir/name/work# 而不是 [.filename]#PORTSDIR/subdir/name/work# 或 [.filename]#.CURDIR/../../subdir/name/work#, 或别的什么。

另外, 如果您自行定义了 `WRKDIR`, 也要把 `${WRKDIRPREFIX}${.CURDIR}` 放到前面。

[[porting-versions]]
== 区分不同的操作系统, 以及 OS 的版本

在不同版本的 Unix 下可能需要对代码进行一些修改或增加少许编译选项, 才能够正确地编译和运行。 如果您需要根据一些条件来对代码进行修改, 请尽可能让这些修改通用, 这样, 我们就能够将这些代码移植回更早的 FreeBSD 系统, 并交叉移植到其它 BSD 系统, 例如来自 CSRG 的 4.4BSD, BSD/386, 386BSD, NetBSD 和 OpenBSD。

推荐的获得 4.3BSD/Reno (1990) 以及更新版本 BSD 代码版本号的方式, 是使用 http://cvsweb.freebsd.org/src/sys/sys/param.h[sys/param.h] 中所定义的 `BSD` 宏的值。 一般来说这个文件已经被引用了; 如果没有的话, 增加下述代码:

[.programlisting]
....
#if (defined(__unix__) || defined(unix)) && !defined(USG)
#include <sys/param.h>
#endif
....

到 [.filename]#.c# 文件中合适的地方。 我们相信所有定义了这两个符号的系统中, 都提供了 [.filename]#sys/param.h#。 如果您发现有不这样做的系统, 请通过致信 {freebsd-ports} 让我们了解这一情况。

另一种方法是使用 GNU Autoconf 风格的方式:

[.programlisting]
....
#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif
....

采用这种方法时, 不要忘了把 `-DHAVE_SYS_PARAM_H` 加到 [.filename]#Makefile# 中的 `CFLAGS` 里。

一旦引用了 [.filename]#sys/param.h#, 您就可以使用:

[.programlisting]
....
#if (defined(BSD) && (BSD >= 199103))
....

来检测代码是否正在 4.3 Net2 代码基础, 或更新的系统上编译 (例如 FreeBSD 1.x, 4.3/Reno, NetBSD 0.9, 386BSD, BSD/386 1.1 以及更高版本)。

使用:

[.programlisting]
....
#if (defined(BSD) && (BSD >= 199306))
....

来检测代码是否正在 4.4 或更新的系统 (例如 FreeBSD 2.x, 4.4, NetBSD 1.0、 BSD/386 2.0 或更高版本)。

对于 4.4BSD-Lite2 代码系来说, `BSD` 宏的值应该是 `199506`。 这里只是作为信息提供, 您不应使用它来区分基于 4.4-Lite 的 FreeBSD 和基于 4.4-Lite2 的版本。 这些情况下, 您应使用 {freebsd} 宏。

保守地使用:

* {freebsd} 在所有版本的 FreeBSD 中皆有定义。 如果您正进行的修改 _只_ 影响 FreeBSD, 则应使用这个宏。 类似 `sys_errlist[]` 之于 `strerror()` 这样的移植问题是伯克利代码系公用的, 而并非 FreeBSD 所专有。
* 在 FreeBSD 2.x 中, {freebsd} 定义为 `2`。 更早版本中, 它曾经是 `1`。 新的版本都会在主要的版本号变化时变更它。
* 如果您需要区分 FreeBSD 1.x 系统和 FreeBSD 2.x 及更高版本的区别, 通常应使用前述的 `BSD` 宏来进行。 如果事实上需要一个 FreeBSD 专有的修改 (例如, 在使用 `ld` 时需要特殊的共享库选项), 则可以用 {freebsd} 和 #if {freebsd} > 1 来检测 FreeBSD 2.x 和新系统上的变化。 如果需要更细粒度地检测 FreeBSD 2.0-RELEASE 之后版本的变化, 则可以使用:
+
[.programlisting]
....
#if __FreeBSD__ >= 2
#include <osreldate.h>
#    if __FreeBSD_version >= 199504
	 /* 适用于 2.0.5+ 版本的代码 */
#    endif
#endif
....

在已有的数百个 port 中, 只有一两个应该使用 {freebsd}。 早期的 port 在不适当的地方使用了它并引发问题, 并不意味着您也必定如此。

[[freebsd-versions]]
== __FreeBSD_version 值

下面是在 http://cvsweb.freebsd.org/src/sys/sys/param.h[sys/param.h]`__FreeBSD_version` 中定义的值及其意义的列表, 这里给出以方便您查阅:

.__FreeBSD_version 值
[cols="1,1,1", frame="none", options="header"]
|===
| 值
| 日期
| 版本

|119411
|
|2.0-RELEASE

|199501, 199503
|March 19, 1995
|2.1-CURRENT

|199504
|April 9, 1995
|2.0.5-RELEASE

|199508
|August 26, 1995
|2.1 之前的 2.2-CURRENT

|199511
|November 10, 1995
|2.1.0-RELEASE

|199512
|November 10, 1995
|2.1.5 之前的 2.2-CURRENT

|199607
|July 10, 1996
|2.1.5-RELEASE

|199608
|July 12, 1996
|2.1.6 之前的 2.2-CURRENT

|199612
|November 15, 1996
|2.1.6-RELEASE

|199612
|
|2.1.7-RELEASE

|220000
|February 19, 1997
|2.2-RELEASE

|(not changed)
|
|2.2.1-RELEASE

|(无变化)
|
|在 2.2.1-RELEASE 之后的 2.2-STABLE

|221001
|April 15, 1997
|texinfo-3.9 之后的 2.2-STABLE

|221002
|April 30, 1997
|top 之后的 2.2-STABLE

|222000
|May 16, 1997
|2.2.2-RELEASE

|222001
|May 19, 1997
|2.2.2-RELEASE 之后的 2.2-STABLE

|225000
|October 2, 1997
|2.2.5-RELEASE

|225001
|November 20, 1997
|2.2.5-RELEASE 之后的 2.2-STABLE

|225002
|December 27, 1997
|合并 ldconfig -R 之后的 2.2-STABLE

|226000
|March 24, 1998
|2.2.6-RELEASE

|227000
|July 21, 1998
|2.2.7-RELEASE

|227001
|July 21, 1998
|2.2.7-RELEASE 之后的 2.2-STABLE

|227002
|September 19, 1998
|man:semctl[2] 修改之后的 2.2-STABLE

|228000
|November 29, 1998
|2.2.8-RELEASE

|228001
|November 29, 1998
|2.2.8-RELEASE 之后的 2.2-STABLE

|300000
|February 19, 1996
|man:mount[2] 修改之前的 3.0-CURRENT

|300001
|September 24, 1997
|man:mount[2] 修改之后的 3.0-CURRENT

|300002
|June 2, 1998
|man:semctl[2] 修改之后的 3.0-CURRENT

|300003
|June 7, 1998
|ioctl 参数变化之后的 3.0-CURRENT

|300004
|September 3, 1998
|ELF 变换之后的 3.0-CURRENT

|300005
|October 16, 1998
|3.0-RELEASE

|300006
|October 16, 1998
|3.0-RELEASE 之后的 3.0-CURRENT

|300007
|January 22, 1999
|3/4切分之后的 3.0-STABLE

|310000
|February 9, 1999
|3.1-RELEASE

|310001
|March 27, 1999
|3.1-RELEASE 之后的 3.1-STABLE

|310002
|April 14, 1999
|C++ 构建/析构函数顺序变化之后的 3.1-STABLE

|320000
|
|3.2-RELEASE

|320001
|May 8, 1999
|3.2-STABLE

|320002
|August 29, 1999
|二进制不兼容的 IPFW 和 socket 变化之后的 3.2-STABLE

|330000
|September 2, 1999
|3.3-RELEASE

|330001
|September 16, 1999
|3.3-STABLE

|330002
|November 24, 1999
|libc 中加入 man:mkstemp[3] 之后的 3.3-STABLE

|340000
|December 5, 1999
|3.4-RELEASE

|340001
|December 17, 1999
|3.4-STABLE

|350000
|June 20, 2000
|3.5-RELEASE

|350001
|July 12, 2000
|3.5-STABLE

|400000
|January 22, 1999
|3/4切分之后的 4.0-CURRENT

|400001
|February 20, 1999
|修改动态连接器处理方式之后的 4.0-CURRENT

|400002
|March 13, 1999
|C++ 构建/析构函数顺序变化之后的

|400003
|March 27, 1999
|提供 man:dladdr[3] 之后的 4.0-CURRENT

|400004
|April 5, 1999
|修正了 __deregister_frame_info 的 4.0-CURRENT (也表示在 EGCS 1.1.2 集成之后的 4.0-CURRENT) 

|400005
|April 27, 1999
|man:suser[9] API 变化之后的 4.0-CURRENT (也表示 newbus 之后的 4.0-CURRENT)

|400006
|May 31, 1999
|cdevsw 注册机制改变之后的 4.0-CURRENT

|400007
|June 17, 1999
|加入了 socket 级凭据的 so_cred 之后的 4.0-CURRENT

|400008
|June 20, 1999
|在 libc_r 中加入 poll 系统调用接口之后的 4.0-CURRENT

|400009
|July 20, 1999
|将内核中 `dev_t` 类型改为 `struct specinfo` 指针之后的 4.0-CURRENT

|400010
|September 25, 1999
|修正了一处 man:jail[2] 漏洞之后的 4.0-CURRENT

|400011
|September 29, 1999
|`sigset_t` 数据类型改变之后的 4.0-CURRENT

|400012
|November 15, 1999
|切换到 GCC 2.95.2 编译器之后的 4.0-CURRENT

|400013
|December 4, 1999
|加入了可插的 linux模式 ioctl 处理程序后的 4.0-CURRENT

|400014
|January 18, 2000
|引入 OpenSSL 之后的 4.0-CURRENT

|400015
|January 27, 2000
|GCC 2.95.2 中 ABI 默认值从 -fvtable-thunks 改为 -fno-vtable-thunks 之后的 4.0-CURRENT

|400016
|February 27, 2000
|引入 OpenSSH 之后的 4.0-CURRENT

|400017
|March 13, 2000
|4.0-RELEASE

|400018
|March 17, 2000
|4.0-RELEASE 之后的 4.0-STABLE

|400019
|May 5, 2000
|引入延迟校验和之后的 4.0-STABLE

|400020
|June 4, 2000
|将 libxpg4 的代码并入 libc 之后的 4.0-STABLE

|400021
|July 8, 2000
|Binutils 升级到 2.10.0 之后的 4.0-STABLE, ELF 标志变化, 以及将 tcsh 引入基本系统

|410000
|July 14, 2000
|4.1-RELEASE

|410001
|July 29, 2000
|4.1-RELEASE 之后的 4.1-STABLE

|410002
|September 16, 2000
|man:setproctitle[3] 从 libutil 移入 libc 之后的 4.1-STABLE

|411000
|September 25, 2000
|4.1.1-RELEASE

|411001
|
|4.1.1-RELEASE 之后的 4.1.1-STABLE

|420000
|October 31, 2000
|4.2-RELEASE

|420001
|January 10, 2001
|合并 libgcc.a 和 libgcc_r.a, 并修改了相关的 GCC 连接方式之后的 4.2-STABLE

|430000
|March 6, 2001
|4.3-RELEASE

|430001
|May 18, 2001
|引入 wint_t 之后的 4.3-STABLE

|430002
|July 22, 2001
|PCI 电源状态 API 合并之后的 4.3-STABLE

|440000
|August 1, 2001
|4.4-RELEASE

|440001
|October 23, 2001
|引入 d_thread_t 之后的 4.4-STABLE

|440002
|November 4, 2001
|mount 结构改变之后的 4.4-STABLE (影响文件系统 kld)

|440003
|December 18, 2001
|用户态部分的 smbfs 被引入之后的 4.4-STABLE

|450000
|December 20, 2001
|4.5-RELEASE

|450001
|February 24, 2002
|usb 结构元素改名之后的 4.5-STABLE

|450004
|April 16, 2002
|在 man:rc.conf[5] 变量 `sendmail_enable` 默认值改为 `NONE` 之后的 4.5-STABLE

|450005
|April 27, 2002
|默认将 XFree86 4 用于预编译包联编之后的 4.5-STABLE

|450006
|May 1, 2002
|accept 过滤器修正了安全问题并且不再会轻易被 DoS 之后的 4.5-STABLE

|460000
|June 21, 2002
|4.6-RELEASE

|460001
|June 21, 2002
|修正了 man:sendfile[2] 以吻合文档, 而不再根据发出的头计算发出数据量之后的 4.6-STABLE

|460002
|July 19, 2002
|4.6.2-RELEASE

|460100
|June 26, 2002
|4.6-STABLE

|460101
|June 26, 2002
|MFC `sed -i` 之后的 4.6-STABLE

|460102
|September 1, 2002
|MFC 许多 pkg_install 新特性之后的 4.6-STABLE

|470000
|October 8, 2002
|4.7-RELEASE

|470100
|October 9, 2002
|4.7-STABLE

|470101
|November 10, 2002
|开始生成 __std{in,out,err}p 引用, 而不是 __sF。 这将 std{in,out,err} 从编译时表达式变成了运行时值。

|470102
|January 23, 2003
|MFC mbuf 相关的将 m_aux mbuf 改为 m_tag 的修改之后的 4.7-STABLE

|470103
|February 14, 2003
|OpenSSL 升级到 0.9.7 之后的 4.7-STABLE

|480000
|March 30, 2003
|4.8-RELEASE

|480100
|April 5, 2003
|4.8-STABLE

|480101
|May 22, 2003
|man:realpath[3] 变为线程安全的之后的 4.8-STABLE

|480102
|August 10, 2003
|对 twe 的 3ware API 修改之后的 4.8-STABLE

|490000
|October 27, 2003
|4.9-RELEASE

|490100
|October 27, 2003
|4.9-STABLE

|490101
|January 8, 2004
|kinfo_eproc 中加入 e_sid 之后的 4.9-STABLE

|490102
|February 4, 2004
|MFC rtld 的 libmap 功能之后的 4.9-STABLE

|491000
|May 25, 2004
|4.10-RELEASE

|491100
|June 1, 2004
|4.10-STABLE

|491101
|August 11, 2004
|MFC 20040629 版本的包维护工具之后的 4.10-STABLE

|491102
|November 16, 2004
|修正了 VM 当解除 wire 不存在页面时的问题之后的 4.10-STABLE

|492000
|December 17, 2004
|4.11-RELEASE

|492100
|December 17, 2004
|4.11-STABLE

|492101
|April 18, 2006
|将 libdata/ldconfig 目录加入 mtree 文件之后的 4.11-STABLE。

|500000
|March 13, 2000
|5.0-CURRENT

|500001
|April 18, 2000
|加入 ELF 头字段, 并改变我们的 ELF 执行文件标记方式之后的 5.0-CURRENT

|500002
|May 2, 2000
|kld 元数据修改之后的 5.0-CURRENT

|500003
|May 18, 2000
|buf/bio 修改之后的 5.0-CURRENT

|500004
|May 26, 2000
|binutils 升级后的 5.0-CURRENT

|500005
|June 3, 2000
|将 libxpg4 并入 libc, 以及引入 TASKQ 之后的 5.0-CURRENT

|500006
|June 10, 2000
|加入 AGP 接口之后的 5.0-CURRENT

|500007
|June 29, 2000
|Perl 升级到 5.6.0 之后的 5.0-CURRENT

|500008
|July 7, 2000
|KAME 代码升级到 2000/07 之后的 5.0-CURRENT

|500009
|July 14, 2000
|ether_ifattach() 和 ether_detach() 修改之后的 5.0-CURRENT

|500010
|July 16, 2000
|将 mtree 改为原先的默认值, 并使用 -L 来跟随符号连接之后的 5.0-CURRENT

|500011
|July 18, 2000
|kqueue API 修改之后的 5.0-CURRENT

|500012
|September 2, 2000
|man:setproctitle[3] 从 libutil 挪到 libc 之后的 5.0-CURRENT

|500013
|September 10, 2000
|首个 SMPng commit 之后的 5.0-CURRENT

|500014
|January 4, 2001
|<sys/select.h> 改为 <sys/selinfo.h> 之后的 5.0-CURRENT

|500015
|January 10, 2001
|libgcc.a 和 libgcc_r.a 以及 GCC 连接方式变动之后的 5.0-CURRENT

|500016
|January 24, 2001
|修改以允许 libc 和 libc_r 连接到一起, 不再鼓励使用 -pthread 之后的 5.0-CURRENT

|500017
|February 18, 2001
|从 struct ucred 切换到 struct xucred 以便使内核为 mountd 等程序导出的 API 稳定下来之后的 5.0-CURRENT

|500018
|February 24, 2001
|加入 CPUTYPE 用于 CPU 专用的优化的 make 变量之后的 5.0-CURRENT

|500019
|June 9, 2001
|machine/ioctl_fd.h 改为 sys/fdcio.h 之后的 5.0-CURRENT

|500020
|June 15, 2001
|locale 名称改变之后的 5.0-CURRENT

|500021
|June 22, 2001
|引入 bzip2 之后的 5.0-CURRENT, 同时也代表删去了 S/Key

|500022
|July 12, 2001
|加入 SSE 支持之后的 5.0-CURRENT

|500023
|September 14, 2001
|KSE 第2个里程碑之后的 5.0-CURRENT

|500024
|October 1, 2001
|d_thread_t 之后的 5.0-CURRENT, 同时 UUCP 被移入 ports

|500025
|October 4, 2001
|64-位平台上的描述符和 creds API 变化之后的 5.0-CURRENT

|500026
|October 9, 2001
|采用 XFree86 4 作为默认的预编译包, 以及加入 strnstr() libc 函数之后的 5.0-CURRENT

|500027
|October 10, 2001
|加入 strcasestr() libc 函数之后的 5.0-CURRENT

|500028
|December 14, 2001
|引入了用户态的 smbfs 组件之后的 5.0-CURRENT

|(未予增加)
|
|加入了新的 C99 指定位宽整形变量之后的 5.0-CURRENT

|500029
|January 29, 2002
|修改了 man:sendfile[2] 的返回值之后的 5.0-CURRENT

|500030
|February 15, 2002
|引入适合表达文件标志的 `fflags_t` 类型之后的 5.0-

|500031
|February 24, 2002
|usb 结构元素改名之后的 5.0-CURRENT

|500032
|March 16, 2002
|引入 Perl 5.6.1 之后的 5.0-CURRENT

|500033
|April 3, 2002
|man:rc.conf[5] 变量 `sendmail_enable` 默认值改为 `NONE` 之后的 5.0-CURRENT

|500034
|April 30, 2002
|mtx_init() 增加了第三个参数之后的 5.0-CURRENT

|500035
|May 13, 2002
|包含 Gcc 3.1 的 5.0-CURRENT

|500036
|May 17, 2002
|在 /usr/src 中删去了 Perl 的 5.0-CURRENT

|500037
|May 29, 2002
|加入 man:dlfunc[3] 之后的 5.0-CURRENT

|500038
|July 24, 2002
|一些 struct sockbuf 的成员变为结构, 并重新排列顺序之后的 5.0-CURRENT

|500039
|September 1, 2002
|引入 GCC 3.2.1 之后的 5.0-CURRENT。 头文件也不再使用 _BSD_FOO_T_ 而开始使用 _FOO_T_DECLARED。 这个值还可以用于作为一个包含使用 man:bzip2[1] 的预编译包支持的预期点。

|500040
|September 20, 2002
|以去掉对 disklabel 结构内容的依赖的名义, 对磁盘相关的函数进行了许多修改之后的 5.0-CURRENT

|500041
|October 1, 2002
|libc 中加入 man:getopt_long[3] 之后的 5.0-CURRENT

|500042
|October 15, 2002
|Binutils 2.13 升级, 包含了新的 FreeBSD 模拟, vec 以及输出格式之后的 5.0-CURRENT

|500043
|November 1, 2002
|libc 中加入了弱 pthread_XXX 符号之后的 5.0-CURRENT, 从而淘汰了 libXThrStub.so。 5.0-RELEASE。

|500100
|January 17, 2003
|创建 RELENG_5_0 分支之后的 5.0-CURRENT

|500101
|February 19, 2003
|<sys/dkstat.h> 变成了一个空文件, 不应再被引用

|500102
|February 25, 2003
|修改 d_mmap_t 接口之后的 5.0-CURRENT

|500103
|February 26, 2003
|taskqueue_swi 以无全局锁的方式运行之后的 5.0-CURRENT, 同时还加入了使用全局锁的 taskqueue_swi_giant

|500104
|February 27, 2003
|去掉了 cdevsw_add() 和 cdevsw_remove() 出现 MAJOR_AUTO 分配机制

|500105
|March 4, 2003
|采用新的 cdevsw 初始化方法之后的 5.0-CURRENT

|500106
|March 8, 2003
|devstat_add_entry() 被 devstat_new_entry() 取代

|500107
|March 15, 2003
|修改 devstat 接口; 请参见 sys/sys/param.h 1.149

|500108
|March 15, 2003
|改变了 Token-Ring 接口

|500109
|March 25, 2003
|加入 vm_paddr_t

|500110
|March 28, 2003
|将 man:realpath[3] 改为线程安全之后的 5.0-CURRENT

|500111
|April 9, 2003
|man:usbhid[3] 与 NetBSD 同步之后的 5.0-CURRENT

|500112
|April 17, 2003
|加入新的 NSS 实现, 以及 POSIX.1 getpw*_r, getgr*_r 函数之后的 5.0-CURRENT

|500113
|May 2, 2003
|删去旧式 rc 系统之后的 5.0-CURRENT

|501000
|June 4, 2003
|5.1-RELEASE.

|501100
|June 2, 2003
|创建 RELENG_5_1 分支之后的 5.1-CURRENT

|501101
|June 29, 2003
|改正 sigtimedwait(2) 和 sigwaitinfo(2) 语义之后的 5.1-CURRENT

|501102
|July 3, 2003
|在 man:bus_dma_tag_create[9] 中加入了 lockfunc 和 lockfuncarg 字段之后的 5.1-CURRENT

|501103
|July 31, 2003
|集成了 GCC 3.3.1-pre 20030711 之后的 5.1-CURRENT

|501104
|August 5, 2003
|twe 中 3ware API 变化之后的 5.1-CURRENT

|501105
|August 17, 2003
|允许动态连接 /bin 和 /sbin, 以及将某些库移动到 /lib 之后的 5.1-CURRENT

|501106
|September 8, 2003
|增加内核级 Coda 6.x 支持之后的 5.1-CURRENT

|501107
|September 17, 2003
|将 16550 UART 常量从 [.filename]#<dev/sio/sioreg.h># 挪到 [.filename]#<dev/ic/ns16550.h># 之后的 5.1-CURRENT。 此外, rtld 也从此无条件支持 libmap 功能

|501108
|September 23, 2003
|更新 PFIL_HOOKS API 之后的 5.1-CURRENT

|501109
|September 27, 2003
|增加 kiconv(3) 之后的 5.1-CURRENT

|501110
|September 28, 2003
|默认的 cdevsw open 和 close 操作变化之后的 5.1-CURRENT

|501111
|October 16, 2003
|cdevsw 的布局变化之后的 5.1-CURRENT

|501112
|October 16, 2003
|增加 kobj 多继承之后的 5.1-CURRENT

|501113
|October 31, 2003
|修改 struct ifnet 中的 if_xname 之后的 5.1-CURRENT

|501114
|November 16, 2003
|将 /bin 和 /sbin 改为动态连接之后的 5.1-CURRENT

|502000
|December 7, 2003
|5.2-RELEASE

|502010
|February 23, 2004
|5.2.1-RELEASE

|502100
|December 7, 2003
|创建 RELENG_5_2 分支之后的 5.2-CURRENT

|502101
|December 19, 2003
|libc 中加入了 __cxa_atexit/__cxa_finalize 两个函数之后的 5.2-CURRENT

|502102
|January 30, 2004
|默认线程库从 libc_r 改为 libpthread 之后的 5.2-CURRENT

|502103
|February 21, 2004
|设备驱动 API 大规模翻修之后的 5.2-CURRENT

|502104
|February 25, 2004
|增加 getopt_long_only() 之后的 5.2-CURRENT

|502105
|March 5, 2004
|C 的 NULL 定义改为 ((void *)0) 之后的 5.2-CURRENT, 这会产生更多的编译警告

|502106
|March 8, 2004
|pf 连入联编和安装过程之后的 5.2-CURRENT 

|502107
|March 10, 2004
|在 sparc64 上将 time_t 改为 64-位 值之后的 5.2-CURRENT 

|502108
|March 12, 2004
|在一些头文件修改以支持 Intel C/C++ 编译器, 以及让 execve(2) 更严格地符合 POSIX 之后的 5.2-CURRENT

|502109
|March 22, 2004
|引入 bus_alloc_resource_any API 之后的 5.2-CURRENT 

|502110
|March 27, 2004
|加入 UTF-8 locale 之后的 5.2-CURRENT

|502111
|April 11, 2004
|删去 getvfsent(3) API 之后的 5.2-CURRENT

|502112
|April 13, 2004
|为 make(1) 增加 .warning 语句之后的 5.2-CURRENT

|502113
|June 4, 2004
|所有串口设备都强制使用 ttyioctl() 之后的 5.2-CURRENT

|502114
|June 13, 2004
|引入 ALTQ 框架之后的 5.2-CURRENT

|502115
|June 14, 2004
|修改 sema_timedwait(9) 使其成功时返回 0, 失败时返回非 0 的错误代码之后的 5.2-CURRENT

|502116
|June 16, 2004
|将内核 dev_t 改为指向 struct cdev * 的指针之后的 5.2-CURRENT

|502117
|June 17, 2004
|将内核 udev_t 改为 dev_t 之后的 5.2-CURRENT

|502118
|June 17, 2004
|为 clock_gettime(2) 和 clock_getres(2) 增加 CLOCK_VIRTUAL 和 CLOCK_PROF 支持之后的 5.2-CURRENT

|502119
|June 22, 2004
|对网络接口复制进行全面修改之后的 5.2-CURRENT

|502120
|July 2, 2004
|package 工具升级为 20040629 之后的 5.2-CURRENT

|502121
|July 9, 2004
|不再将蓝牙代码标记为 i386 专用之后的 5.2-CURRENT

|502122
|July 11, 2004
|引入 KDB 调试器框架之后的 5.2-CURRENT。 同时还引入了 DDB 作为后台, 以及 GDB 后台。

|502123
|July 12, 2004
|修改 VFS_ROOT 和 vflush 使其使用一个 struct thread 参数之后的 5.2-CURRENT。 struct kinfo_proc 增加了一个用户数据指针。 同时, 默认的 X 实现切换为 `xorg`

|502124
|July 24, 2004
|将使用 rc.d 和传统脚本的 port 分别启动之后的 5.2-CURRENT

|502125
|July 28, 2004
|取消前一修改之后的 5.2-CURRENT

|502126
|July 31, 2004
|删除 kmem_alloc_pageable() 并引入 gcc 3.4.2 的 5.2-CURRENT

|502127
|August 2, 2004
|修改 UMA 内核 API 允许构建函数和初始化失败之后的 5.2-CURRENT

|502128
|August 8, 2004
|vfs_mount 签名和全局替换 suser(9) API 的 PRISON_ROOT 为 SUSER_ALLOWJAIL 之后的 5.2-CURRENT

|503000
|August 23, 2004
|pfil API 修改之前的 5.3-BETA/RC

|503001
|September 22, 2004
|5.3-RELEASE

|503100
|October 16, 2004
|创建 RELENG_5_3 分支之后的 5.3-STABLE

|503101
|December 3, 2004
|加入了 glibc 风格的 man:strftime[3] 填充选项的 5.3-STABLE

|503102
|February 13, 2005
|MFC OpenBSD 的 nc(1) 之后的 5.3-STABLE

|503103
|February 27, 2005
|在 MFC 了 [.filename]#<src/include/stdbool.h># 和 [.filename]#<src/sys/i386/include/_types.h># 用于兼容 GCC 和 Intel C/C++ 编译器的修正之后的 5.4-PRERELEASE

|503104
|February 28, 2005
|MFC 了将 ifi_epoch 由 wall 时钟时间改为 uptime 之后的 5.4-PRERELEASE

|503105
|March 2, 2005
|MFC 了 vswprintf(3) 中的 EOVERFLOW 检查的 5.4-PRERELEASE

|504000
|April 3, 2005
|5.4-RELEASE.

|504100
|April 3, 2005
|创建 RELENG_5_4 分支之后的 5.4-STABLE

|504101
|May 11, 2005
|加大默认线程堆栈尺寸之后的 5.4-STABLE

|504102
|June 24, 2005
|加入 sha256 之后的 5.4-STABLE

|504103
|October 3, 2005
|MFC if_bridge 之后的 5.4-STABLE

|504104
|November 13, 2005
|bsdiff 和 portsnap MFC 之后的 5.4-STABLE

|504105
|January 17, 2006
|在 MFC 了 ldconfig_local_dirs 修改之后的 5.4-STABLE。

|505000
|May 12, 2006
|5.5-RELEASE.

|505100
|May 12, 2006
|在创建 RELENG_5_5 分支之后的 5.5-STABLE

|600000
|August 18, 2004
|6.0-CURRENT

|600001
|August 27, 2004
|内核中永久性启用 PFIL_HOOKS 之后的 6.0-CURRENT

|600002
|August 30, 2004
|最初将 ifi_epoch 加入 if_data 结构之后的 6.0-CURRENT。 此后不久即被撤销。 请不要使用这个值。

|600003
|September 8, 2004
|if_data 中再次加入 ifi_epoch 成员之后的 6.0-CURRENT

|600004
|September 29, 2004
|将 struct inpcb 参数加入 pfil API 之后的 6.0-CURRENT

|600005
|October 5, 2004
|newsyslog 加入了 "-d DESTDIR" 参数之后的 6.0-CURRENT

|600006
|November 4, 2004
|加入了 glibc 风格的 man:strftime[3] 填充选项之后的 6.0-CURRENT

|600007
|December 12, 2004
|加入了 802.11 框架更新之后的 6.0-CURRENT

|600008
|January 25, 2005
|修改 VOP_*VOBJECT() 并为无全局锁的文件系统引入 MNTK_MPSAFE 标志之后的 6.0-CURRENT

|600009
|February 4, 2005
|加入 cpufreq 框架和驱动之后的 6.0-CURRENT

|600010
|February 6, 2005
|引入 OpenBSD 的 nc(1) 之后的 6.0-CURRENT

|600011
|February 12, 2005
|删去并不存在的 SVID2 `matherr()` 支持之后的 6.0-CURRENT

|600012
|February 15, 2005
|增大默认线程堆栈尺寸之后的 6.0-CURRENT

|600013
|February 19, 2005
|增加了针对 [.filename]#<src/include/stdbool.h># 和 [.filename]#<src/sys/i386/include/_types.h># 的用于 Intel C/C++ 编译器的 GCC-兼容性修正。

|600014
|February 21, 2005
|修正了 vswprintf(3) 的 EOVERFLOW 检查之后的 6.0-CURRENT

|600015
|February 25, 2005
|将 struct if_data 成员 ifi_epoch 从 wall 时钟时间改为 uptime 之后的 6.0-CURRENT

|600016
|February 26, 2005
|修改 LC_CTYPE 磁盘格式之后的 6.0-CURRENT

|600017
|February 27, 2005
|修改 NLS 编录磁盘格式之后的 6.0-CURRENT

|600018
|February 27, 2005
|修改 LC_COLLATE 磁盘格式之后的 6.0-CURRENT

|600019
|February 28, 2005
|将 acpica 头文件安装到 /usr/include

|600020
|March 9, 2005
|为 send(2) API 加入了 MSG_NOSIGNAL

|600021
|March 17, 2005
|在 cdevsw 上增加了一些字段

|600022
|March 21, 2005
|基本系统中删去了 gtar

|600023
|April 13, 2005
|unix(4) 中加入了 LOCAL_CREDS, LOCAL_CONNWAIT 两个 socket 选项

|600024
|April 19, 2005
|加入了 man:hwpmc[4] 及其相关工具之后的 6.0-CURRENT

|600025
|April 26, 2005
|加入 struct icmphdr 之后的 6.0-CURRENT

|600026
|May 3, 2005
|pf 更新到了 3.7

|600027
|May 6, 2005
|引入了内核 libalias 和 ng_nat

|600028
|May 13, 2005
|将 ttyname_r(3) 接口改为符合 POSIX 标准, 并通过 unistd.h 和 libc

|600029
|May 29, 2005
|将 libpcap 升级为 v0.9.1 alpha 096 之后的 6.0-CURRENT

|600030
|June 5, 2005
|引入 NetBSD 的 if_bridge(4) 之后的 6.0-CURRENT

|600031
|June 10, 2005
|将 struct ifnet 从驱动的 softc 中拆出之后的 6.0-CURRENT。

|600032
|July 11, 2005
|引入了 libpcap v0.9.1 之后的 6.0-CURRENT。

|600033
|July 25, 2005
|所有自 RELENG_5 以来没有修改过的共享库的版本递增之后的 6.0-STABLE。

|600034
|August 13, 2005
|为 dev_clone 事件处理函数增加身份信息参数之后的 6.0-STABLE。 6.0-RELEASE。

|600100
|November 1, 2005
|6.0-RELEASE 之后的 6.0-STABLE

|600101
|December 21, 2005
|将 local_startup 目录中的脚本集成到基本系统的 man:rcorder[8] 之后的 6.0-STABLE。

|600102
|December 30, 2005
|更新 ELF 类型和常量之后的 6.0-STABLE。

|600103
|January 15, 2006
|MFC 了 pidfile(3) API 之后的 6.0-STABLE。

|600104
|January 17, 2006
|在 MFC 了 ldconfig_local_dirs 修改之后的 6.0-STABLE。

|600105
|February 26, 2006
|在 csh(1) 中加入了 NLS 目录支持之后的 6.0-STABLE。

|601000
|May 6, 2006
|6.1-RELEASE

|601100
|May 6, 2006
|6.1-RELEASE 之后的 6.1-STABLE。

|601101
|June 22, 2006
|引入 csup 之后的 6.1-STABLE。

|601102
|July 11, 2006
|更新了 iwi(4) 之后的 6.1-STABLE。

|601103
|July 17, 2006
|将域名解析函数更新至 BIND9, 并导出了可重入版本的 netdb 函数之后的 6.1-STABLE。

|601104
|August 8, 2006
|在 OpenSSL 中启用了 DSO (动态共享库) 支持之后的 6.1-STABLE。

|601105
|September 2, 2006
|由于 802.11 修正变动了 IEEE80211_IOC_STA_INFO ioctl API 之后的 6.1-STABLE。

|602000
|November 15, 2006
|6.2-RELEASE

|602100
|September 15, 2006
|6.2-RELEASE 之后的 6.2-STABLE。

|602101
|December 12, 2006
|加入 Wi-Spy quirk 之后的 6.2-STABLE。

|602102
|December 28, 2006
|增加 pci_find_extcap() 之后的 6.2-STABLE。

|602103
|January 16, 2007
|MFC 了对 dlsym 进行修改, 使其在指定 dso 及其暗指的依赖中查找符号之后的 6.2-STABLE。

|602104
|January 28, 2007
|MFC 了 netgraph 节点 ng_deflate(4) 和 ng_pred1(4) 以及用于 ng_ppp(4) 节点的新压缩及加密模式之后的 6.2-STABLE。

|602105
|February 20, 2007
|MFC 了从 NetBSD 移植的 BSD 授权的 man:gzip[1] 之后的 6.2-STABLE。

|602106
|March 31, 2007
|MFC 了 PCI MSI 和 MSI-X 支持之后的 6.2-STABLE。

|602107
|April 6, 2007
|MFC 了包含宽字符支持的 ncurses 5.6 之后的 6.2-STABLE。

|602108
|April 11, 2007
|MFC 了实现 Linux SCSI SG 直通设备 API 子集的 CAM 'SG' 设备之后的 6.2-STABLE。

|602109
|April 17, 2007
|MFC 了 readline 5.2 patchset 002 之后的 6.2-STABLE。

|602110
|May 2, 2007
|MFC 了用于 amd64 和 i386 的 pmap_invalidate_cache()、 pmap_change_attr()、 pmap_mapbios()、 pmap_mapdev_attr()、 and pmap_unmapbios() 之后的 6.2-STABLE。

|602111
|June 11, 2007
|由于 MFC 了 BOP_BDFLUSH 导致文件系统模块 KBI 变化之后的 6.2-STABLE。

|602112
|September 21, 2007
|一系列 libutil(3) MFC 之后的 6.2-STABLE。

|602113
|October 25, 2007
|MFC 了宽字符和单字节 ctype 函数分拆之后的 6.2-STABLE。 新编译的引用了 ctype.h 的可执行文件, 可能会需要一个在旧系统上不存在的新增符号 __mb_sb_limit。

|602114
|October 30, 2007
|恢复了 ctype ABI 向前兼容性之后的 6.2-STABLE。

|602115
|November 21, 2007
|回退了宽字符和单字节 ctype 分拆之后的 6.2-STABLE。

|603000
|November 25, 2007
|6.3-RELEASE

|603100
|November 25, 2007
|在 6.3-RELEASE 之后的 6.3-STABLE。

|603101
|December 7, 2007
|修正了 bit macro 的多字节支持之后的 6.3-STABLE。

|603102
|April 24, 2008
|为 flock 结构加入 l_sysid 之后的 6.3-STABLE。

|603103
|May 27, 2008
|MFC 了 `memrchr` 函数之后的 6.3-STABLE。

|603104
|June 15, 2008
|为 make(1) MFC `:u` 变量修饰符之后的 6.3-STABLE。

|604000
|October 4, 2008
|6.4-RELEASE

|604100
|October 4, 2008
|6.4-RELEASE 之后的 6.4-STABLE。

|700000
|July 11, 2005
|7.0-CURRENT。

|700001
|July 23, 2005
|所有自 RELENG_5 以来没有修改过的共享库的版本递增之后的 7.0-CURRENT。

|700002
|August 13, 2005
|为 dev_clone 事件处理函数中增加身份信息参数之后的 7.0-CURRENT。

|700003
|August 25, 2005
|将 memmem(3) 加入 libc 之后的 7.0-CURRENT。

|700004
|October 30, 2005
|将 solisten(9) 改为接受一 backlog 参数之后的 7.0-CURRENT。

|700005
|November 11, 2005
|将 IFP2ENADDR() 改为返回一 IF_LLADDR() 指针之后的 7.0-CURRENT。

|700006
|November 11, 2005
|在 `struct ifnet` 中增加 `if_addr` 成员, 并删除 IFP2ENADDR() 之后的 7.0-CURRENT。

|700007
|December 2, 2005
|将 local_startup 目录中的脚本集成到基本系统的 man:rcorder[8] 之后的 7.0-CURRENT。

|700008
|December 5, 2005
|去掉 MNT_NODEV 挂接选项之后的 7.0-CURRENT。

|700009
|December 19, 2005
|对 ELF-64 类型和符号版本进行变更之后的 7.0-CURRENT。

|700010
|December 20, 2005
|增加 hostb 和 vgapci 驱动、 pci_find_extcap(), 并将 AGP 驱动改为不再影射 aperature 之后的 7.0-CURRENT。

|700011
|December 31, 2005
|除 Alpha 之外的所有平台上 tv_sec 改为 time_t 之后的 7.0-CURRENT。

|700012
|January 8, 2006
|修改 ldconfig_local_dirs 之后的 7.0-CURRENT。

|700013
|January 12, 2006
|在修改了 [.filename]#/etc/rc.d/abi# 以支持 [.filename]#/compat/linux/etc/ld.so.cache# 以某只读文件系统上的符号连接形式存在之后的 7.0-CURRENT。

|700014
|January 26, 2006
|引入 pts 之后的 7.0-CURRENT。

|700015
|March 26, 2006
|在引入 man:hwpmc[4] 的第 2 版 ABI 之后的 7.0-CURRENT。

|700016
|April 22, 2006
|在 libc 中加入了 man:fcloseall[3] 之后的 7.0-CURRENT。

|700017
|May 13, 2006
|删去 ip6fw 之后的 7.0-CURRENT。

|700018
|July 15, 2006
|引入了 snd_emu10kx 之后的 7.0-CURRENT。

|700019
|July 29, 2006
|引入了 OpenSSL 0.9.8b 之后的 7.0-CURRENT。

|700020
|September 3, 2006
|增加了 bus_dma_get_tag 函数之后的 7.0-CURRENT。

|700021
|September 4, 2006
|在引入了 libpcap 0.9.4 和 tcpdump 3.9.4 之后的 7.0-CURRENT。

|700022
|September 9, 2006
|在对 dlsym 进行修改, 使其在指定 dso 及其暗指的依赖中查找符号之后的 7.0-CURRENT。

|700023
|September 23, 2006
|为 OSSv4 混音器 API 加入新的声音 IOCTL 之后的 7.0-CURRENT。

|700024
|September 28, 2006
|汇入 OpenSSL 0.9.8d 之后的 7.0-CURRENT。

|700025
|November 11, 2006
|加入了 libelf 之后的 7.0-CURRENT。

|700026
|November 26, 2006
|对音效相关的 sysctl 进行大幅调整之后的 7.0-CURRENT。

|700027
|November 30, 2006
|加入 Wi-Spy quirk 之后的 7.0-CURRENT。

|700028
|December 15, 2006
|在 libc 中加入 sctp 调用之后的 7.0-CURRENT。 

|700029
|January 26, 2007
|将 GNU man:gzip[1] 实现替换为从 NetBSD 移植的采用 BSD 授权版本之后的 7.0-CURRENT。

|700030
|February 7, 2007
|在 IPv4 多播转发代码中删去了 IPIP 隧道封装 (VIFF_TUNNEL) 之后的 7.0-CURRENT。

|700031
|February 23, 2007
|修改了 bus_setup_intr() (newbus) 之后的 7.0-CURRENT。 

|700032
|March 2, 2007
|引入了 ipw(4) 和 iwi(4) 固件之后的 7.0-CURRENT。 

|700033
|March 9, 2007
|在 ncurses 中引入了宽字符支持之后的 7.0-CURRENT。 

|700034
|March 19, 2007
|修改了 insmntque()、 getnewvnode() 以及 vfs_hash_insert() 工作方式之后的 7.0-CURRENT。 

|700035
|March 26, 2007
|增加 CPU 频率变动通知机制之后的 7.0-CURRENT。 

|700036
|April 6, 2007
|引入了 ZFS 文件系统之后的 7.0-CURRENT。

|700037
|April 8, 2007
|新增了实现 Linux SCSI SG 直通设备 API 子集的 CAM 'SG' 设备之后的 7.0-CURRENT。

|700038
|April 30, 2007
|将 man:getenv[3]、 man:putenv[3]、 man:setenv[3] 和 man:unsetenv[3] 改为符合 POSIX 之后的 7.0-CURRENT。

|700039
|May 1, 2007
|回退了 700038 中的变动之后的 7.0-CURRENT。

|700040
|May 10, 2007
|在 libutil 中增加了 man:flopen[3] 之后的 7.0-CURRENT。

|700041
|May 13, 2007
|启用了符号版本, 并将 libthr 改为默认线程库之后的 7.0-CURRENT。

|700042
|May 19, 2007
|引入了 gcc 4.2.0 之后的 7.0-CURRENT。

|700043
|May 21, 2007
|将 RELENG_6 之后未修改过版本的共享库版本增加之后的 7.0-CURRENT。

|700044
|June 7, 2007
|将 vn_open()/VOP_OPEN() 的参数由文件描述符数组下标改为 struct file * 之后的 7.0-CURRENT。

|700045
|June 10, 2007
|修改 man:pam_nologin[8] 使其向 PAM 框架提供帐号管理功能而非身份验证功能之后的 7.0-CURRENT。

|700046
|June 11, 2007
|更新 802.11 无线支持之后的 7.0-CURRENT。

|700047
|June 11, 2007
|增加 TCP LRO 网络接口能力之后的 7.0-CURRENT。

|700048
|June 12, 2007
|在 IPv4 协议栈中加入了 RFC 3678 API 支持之后的 7.0-CURRENT。 先前 IP_MULTICAST_IF ioctl 的 RFC 1724 行为被删去; 0.0.0.0/8 不再能够用于指定接口索引下标, 而应使用 struct ipmreqn 代替。

|700049
|July 3, 2007
|引入 OpenBSD 4.1 的 pf 之后的 7.0-CURRENT。

|(not changed)
|
|为 FAST_IPSEC 增加 IPv6 支持, 删去 KAME IPSEC, 并将 FAST_IPSEC 更名为 IPSEC 之后的 7.0-CURRENT。 (未变动)

|700050
|July 4, 2007
|将 setenv/putenv/等等调用, 从传统 BSD 改为 POSIX 标准之后的 7.0-CURRENT。

|700051
|July 4, 2007
|增加新的 mmap/lseek/等等这些系统调用之后的 7.0-CURRENT。

|700052
|July 6, 2007
|将 I4B 头文件移动到 include/i4b 之后的 7.0-CURRENT。

|700053
|September 30, 2007
|增加了 PCI domain 支持之后的 7.0-CURRENT。

|700054
|October 25, 2007
|MFC 了宽字符和单字节字符 ctype 分拆之后的 7.0-CURRENT。

|700055
|October 28, 2007
|7.0-RELEASE, 以及 MFC 了恢复对 FreeBSD 4/5/6 版本的 PCIOCGETCONF、 PCIOCREAD 和 PCIOCWRITE IOCTL ABI 向下兼容之后的 7.0-CURRENT, 这一变动导致 PCIOCGETCONF IOCTL 的 ABI 再次发生变化。

|700100
|December 22, 2007
|7.0-RELEASE 之后的 7.0-STABLE

|700101
|February 8, 2008
|MFC m_collapse() 之后的 7.0-STABLE。

|700102
|March 30, 2008
|MFC kdb_enter_why() 之后的 7.0-STABLE。

|700103
|April 10, 2008
|为 flock 结构加入 l_sysid 之后的 7.0-STABLE。

|700104
|April 11, 2008
|在 procstat(1) MFC 之后的 7.0-STABLE。

|700105
|April 11, 2008
|在 MFC umtx 特性之后的 7.0-STABLE。

|700106
|April 15, 2008
|为 man:psm[4] MFC man:write[2] 支持之后的 7.0-STABLE。

|700107
|April 20, 2008
|为 man:fcntl[2] MFC F_DUP2FD 之后的 7.0-STABLE。

|700108
|May 5, 2008
|对 man:lockmgr[9] 做了一些修改之后的 7.0-STABLE, 在使用 man:lockmgr[9] 时必需包含 [.filename]#sys/lock.h#。

|700109
|May 27, 2008
|MFC 了 `memrchr` 函数之后的 7.0-STABLE。

|700110
|August 5, 2008
|MFC 了内核 NFS locked 客户端之后的 7.0-STABLE。

|700111
|August 20, 2008
|加入了对物理连续巨帧支持之后的 7.0-STABLE。

|700112
|August 27, 2008
|在 MFC 内核 DTrace 支持之后的 7.0-STABLE。

|701000
|November 25, 2008
|7.1-RELEASE

|701100
|November 25, 2008
|7.1-RELEASE 之后的 7.1-STABLE。

|701101
|January 10, 2009
|合并了 `strndup` 之后的 7.1-STABLE。

|701102
|January 17, 2009
|加入了 cpuctl(4) 支持之后的 7.1-STABLE。

|701103
|February 7, 2009
|合并了 多/无-IPv4/v6 jail 之后的 7.1-STABLE。

|701104
|February 14, 2009
|在 struct mount 中保存了挂起属主, 以及在 struct vfsops 中引入了 vfs_susp_clean 方法之后的 7.1-STABLE。

|701105
|March 12, 2009
|对 kern.ipc.shmsegs sysctl 变量不兼容的修改, 以允许在 64bit 构架上分配更多的 SysV 共享内存段之后的 7.1-STABLE。

|701106
|March 14, 2009
|合并了一个对 POSIX semaphore 等待操作修正之后的 7.1-STABLE。

|702000
|April 15, 2009
|7.2-RELEASE

|702100
|April 15, 2009
|7.2-RELEASE 之后的 7.2-STABLE。

|702101
|May 15, 2009
|ichsmb(4) 改为使用左邻接辅编址来保持与其它 SMBus 控制器驱动一致性之后的 7.2-STABLE。

|702102
|May 28, 2009
|MFC 了 `fdopendir` 函数之后的 7.2-STABLE。

|702103
|June 06, 2009
|MFC 了 PmcTools 之后的 7.2-STABLE。

|702104
|July 14, 2009
|MFC 了 `closefrom` 系统调用之后的 7.2-STABLE。

|702105
|July 31, 2009
|MFC 了 SYSVIPC ABI 改动之后的 7.2-STABLE。

|702106
|September 14, 2009
|MFC 了 x86 PAT 增强, 并新增了 d_mmap_single() 以及 scatter/gather 型 VM 对象类型之后的 7.2-STABLE。

|703000
|February 9, 2010
|7.3-RELEASE

|703100
|February 9, 2010
|7.3-RELEASE 之后的 7.3-STABLE。

|704000
|December 22, 2010
|7.4-RELEASE

|704100
|December 22, 2010
|7.4-RELEASE 之后的 7.4-STABLE。

|800000
|October 11, 2007
|8.0-CURRENT。 分拆了宽字符和单字节字符 ctype。

|800001
|October 16, 2007
|引入了 libpcap 0.9.8 和 tcpdump 3.9.8 之后的 8.0-CURRENT。

|800002
|October 21, 2007
|将 kthread_create() 系列函数改名为 kproc_create() 之后的 8.0-CURRENT。

|800003
|October 24, 2007
|恢复了对 FreeBSD 4/5/6 版本的 PCIOCGETCONF、 PCIOCREAD 和 PCIOCWRITE IOCTL ABI 向下兼容之后的 8.0-CURRENT, 这一变动导致 PCIOCGETCONF IOCTL 的 ABI 再次发生变化。

|800004
|November 12, 2007
|将 agp(4) 驱动从 src/sys/pci 挪到 src/sys/dev/agp 之后的 8.0-CURRENT。

|800005
|December 4, 2007
|http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/kern/kern_mbuf.c#rev1.35[修改了 jumbo frame 分配器之后的] 8.0-CURRENT。

|800006
|December 7, 2007
|在给 man:hwpmc[4] 加入了 callgraph 捕捉功能后的 8.0-CURRENT

|800007
|December 25, 2007
|kdb_enter() 增加 "why" 参数之后的 8.0-CURRENT。

|800008
|December 28, 2007
|在去除 LK_EXCLUPGRADE 选项后的 8.0-CURRENT。

|800009
|January 9, 2008
|引入 man:lockmgr_disown[9] 之后的 8.0-CURRENT。

|800010
|January 10, 2008
|修改 man:vn_lock[9] 原型之后的 8.0-CURRENT。

|800011
|January 13, 2008
|修改 man:VOP_LOCK[9] 和 man:VOP_UNLOCK[9] 原型之后的 8.0-CURRENT。

|800012
|January 19, 2008
|引入 man:lockmgr_recursed[9]、 man:BUF_RECURSED[9] 和 man:BUF_ISLOCKED[9] 并删除了 `BUF_REFCNT()` 之后的 8.0-CURRENT。

|800013
|January 23, 2008
|引入 "ASCII" 编码之后的 8.0-CURRENT。

|800014
|January 24, 2008
|修改 man:lockmgr[9] 并删除了 `lockcount()` 和 `LOCKMGR_ASSERT()` 之后的 8.0-CURRENT。

|800015
|January 26, 2008
|扩展了 man:fts[3] 数据结构之后的 8.0-CURRENT。

|800016
|February 1, 2008
|为 MEXTADD(9) 增加了一个参数之后的 8.0-CURRENT。

|800017
|February 6, 2008
|为 man:lockmgr[9] 引入 LK_NODUP 和 LK_NOWITNESS 选项后的 8.0-CURRENT。

|800018
|February 8, 2008
|引入 m_collapse 之后的 8.0-CURRENT。

|800019
|February 9, 2008
|为 sysctl 变量 kern.proc.filedesc 加入 当前工作目录,root 目录和 jail 目录支持之后的 8.0-CURRENT。

|800020
|February 13, 2008
|引入 man:lockmgr_assert[9] 之后的 8.0-CURRENT。

|800021
|February 15, 2008
|引入 man:lockmgr_args[9] 和移除 LK_INTERNAL 标志之后的 8.0-CURRENT。

|800022
|(backed out)
|把 BSD man:ar[1] 作为系统默认的 ar 之后的 8.0-CURRENT。

|800023
|February 25, 2008
|修改了 man:lockstatus[9] 和 man:VOP_ISLOCKED[9]; 原型,特别时去掉 `struct thread` 参数之后的 8.0-CURRENT。

|800024
|March 1, 2008
|砍掉了 `lockwaiters` 和 `BUF_LOCKWAITERS` 函数, `brelvp` 的返回值从 void 修改成 int,并引入 man:lockinit[9] 新标志之后的 8.0-CURRENT。

|800025
|March 8, 2008
|为 man:fcntl[2] 引入 F_DUP2FD 之后的 8.0-CURRENT。

|800026
|March 12, 2008
|修改了 cv_broadcastpri 优先权参数之后的 8.0-CURRENT,比如 0 表示无优先权。

|800027
|March 24, 2008
|修改了 bpf 监测 ABI, 加入了 zerocopy bpf buffer 之后的 8.0-CURRENT。

|800028
|March 26, 2008
|为 flock 结构增加了 l_sysid 之后的 8.0-CURRENT。

|800029
|March 28, 2008
|重新整合了 `BUF_LOCKWAITERS` 函数并加入 man:lockmgr_waiters[9] 之后的 8.0-CURRENT。

|800030
|April 1, 2008
|引入 man:rw_try_rlock[9] 和 man:rw_try_wlock[9] 之后的 8.0-CURRENT。

|800031
|April 6, 2008
|引入 `lockmgr_rw` 和 `lockmgr_args_rw` 函数之后的 8.0-CURRENT。

|800032
|April 8, 2008
|实现了 openat 和相关的系统调用,为 man:open[2] 引入了 O_EXEC 标志,和提供了相应的 linux 兼容的系统调用之后的 8.0-CURRENT。

|800033
|April 8, 2008
|为 man:psm[4] 增加了原生的 man:write[2] 支持之后的 8.0-CURRENT。 现在任意命令可写入 [.filename]#/dev/psm%d# 并读出状态。

|800034
|April 10, 2008
|引入 `memrchr` 函数之后的 8.0-CURRENT。

|800035
|April 16, 2008
|引入 `fdopendir` 函数之后的 8.0-CURRENT

|800036
|April 20, 2008
|无线部分转向 multi-bss (也叫做 vaps) 支持之后的 8.0-CURRENT。

|800037
|May 9, 2008
|加入多路由表支持 (也就是 setfib(1)、 stfib(2)) 后的 8.0-CURRENT。

|800038
|May 26, 2008
|删去了 netatm 和 ISDN4BSD 后的 8.0-CURRENT。 这个版本也表示增加了 Compact C Type (CTF) 工具。

|800039
|June 14, 2008
|移除 sgtty 之后的 8.0-CURRENT。

|800040
|June 26, 2008
|增加了内核级 NFS lockd 客户端的 8.0-CURRENT。

|800041
|July 22, 2008
|增加了 arc4random_buf(3) 和 arc4random_uniform(3) 之后的 8.0-CURRENT。

|800042
|August 8, 2008
|增加了 cpuctl(4) 之后的 8.0-CURRENT。

|800043
|August 13, 2008
|修改 bpf(4) 使用单一的设备节点而不是克隆之后的 8.0-CURRENT。

|800044
|August 17, 2008
|在提交了 vimage 项目第一步之后的 8.0-CURRENT。把全局变量重命名为虚拟化带 V_ 前缀并用宏映射到原来的全局名称。

|800045
|August 20, 2008
|引入 MPSAFE TTY 层之后的 8.0-CURRENT, 包括对相关驱动和工具的修改。

|800046
|September 8, 2008
|将 amd64 架构上 GDT 拆分到不同 CPU 之后的 8.0-CURRENT。

|800047
|September 10, 2008
|删去了 VSVTX、 VSGID 和 VSUID 之后的 8.0-CURRENT。

|800048
|September 16, 2008
|将内核中 NFS 挂接部分的代码改为能够通过 nmount() iovec, 而不再是大的 nfs_args 结构体作为参数之后的 8.0-CURRENT。

|800049
|September 17, 2008
|删去了 man:suser[9] 和 man:suser_cred[9] 之后的 8.0-CURRENT。

|800050
|October 20, 2008
|修改了缓冲存储器 API 之后的 8.0-CURRENT。

|800051
|October 23, 2008
|删去了 man:MALLOC[9] 和 man:FREE[9] 宏之后的 8.0-CURRENT。

|800052
|October 28, 2008
|引入了 accmode_t 和重新命名 VOP_ACCES 'a_mode' 为 a_accmode 之后的 8.0-CURRENT。

|800053
|November 2, 2008
|修改了 man:vfs_busy[9] 原型并引入了 MBF_NOWAIT 和 MBF_MNTLSTLOCK 标志之后的 8.0-CURRENT。

|800054
|November 22, 2008
|增加了 buf_ring、 内存栅以及 ifnet 函数, 以方便撰写支持多硬件传输队列的驱动, 以及无锁环形缓冲实现的驱动程序, 并更高效地管理包队列功能之后的 8.0-CURRENT。

|800055
|November 27, 2008
|引入了 man:hwpmc[4] 对于 Intel(TM) Core,Core2 和 Atom 的支持之后的 8.0-CURRENT。

|800056
|November 29, 2008
|引入了 multi-/no-IPv4/v6 jail 之后的 8.0-CURRENT。

|800057
|December 1, 2008
|将 ath hal 改为使用源代码之后的 8.0-CURRENT。

|800058
|December 12, 2008
|引入了 VOP_VPTOCNP 操作之后的 8.0-CURRENT。

|800059
|December 15, 2008
|引入了新的 arp-v2 重写之后的 8.0-CURRENT。

|800060
|December 19, 2008
|引入了 makefs 之后的 8.0-CURRENT。

|800061
|January 15, 2009
|引入了 TCP Appropriate Byte Counting 之后的 8.0-CURRENT。

|800062
|January 28, 2009
|删去了 minor()、 minor2unit()、 unit2minor() 等之后的 8.0-CURRENT。

|800063
|February 18, 2009
|在 GENERIC 配置中改为使用 USB2 栈之后的 8.0-CURRENT; 这个数值同时也标志新增了 fdevname(3)。

|800064
|February 23, 2009
|将 USB2 栈移动并替换 dev/usb 之后的 8.0-CURRENT。

|800065
|February 26, 2009
|在对 libmp(3) 中所有函数更名之后的 8.0-CURRENT。

|800066
|February 27, 2009
|更改了 USB devfs 管理和布局之后的 8.0-CURRENT。

|800067
|February 28, 2009
|加入了 getdelim(), getline(), stpncpy(), strnlen(), wcsnlen(), wcscasecmp(), 和 wcsncasecmp() 之后的 8.0-CURRENT。

|800068
|March 2, 2009
|在 usbhub devclass 更名为 uhub 之后的 8.0-CURRENT。

|800069
|March 9, 2009
|重命名 libusb20.so.1 为 libusb.so.1 之后的 8.0-CURRENT。

|800070
|March 9, 2009
|合并 IGMPv3 和 Source-Specific Multicast (SSM) 入 IPv4 栈之后的 8.0-CURRENT。

|800071
|March 14, 2009
|为 gcc 打上了在 c99 和 gnu99 模式中使用 C99 inline 语义补丁之后的 8.0-CURRENT。

|800072
|March 15, 2009
|移除了 IFF_NEEDSGIANT 标志; 不再支持非线程安全的网络设备驱动之后的 8.0-CURRENT。

|800073
|March 18, 2009
|实现了 rpath 动态字符替换之后的 8.0-CURRENT.

|800074
|March 24, 2009
|引入了 tcpdump 4.0.0 和 libpcap 1.0.0 之后的 8.0-CURRENT。

|800075
|April 6, 2009
|修改了 structs vnet_net、 vnet_inet 和 vnet_ipfw 结构布局之后的 8.0-CURRENT。

|800076
|April 9, 2009
|为 dummynet 新增了延迟评估工具之后的 8.0-CURRENT。

|800077
|April 14, 2009
|删去了 VOP_LEASE() 和 vop_vector.vop_lease 之后的 8.0-CURRENT

|800078
|April 15, 2009
|在 struct rt_metrics 和 struct rt_metrics_lite 中添加了 rt_weight 字段, 导致其结构发生变化之后的 8.0-CURRENT。 此后 RTM_VERSION 增加, 但又回退了。

|800079
|April 15, 2009
|在 struct route 和 struct_in6 中添加了 struct llentry 指针之后的 8.0-CURRENT。

|800080
|April 15, 2009
|改变了 struct inpcb 布局之后的 8.0-CURRENT。

|800081
|April 19, 2009
|改变了 malloc_type 布局之后的 8.0-CURRENT。

|800082
|April 21, 2009
|改变了 struct ifnet 布局, 并增加了 if_ref() 和 if_rele() 引用计数维护功能之后的 8.0-CURRENT。

|800083
|April 22, 2009
|实现了底层蓝牙 HCI API 之后的 8.0-CURRENT。

|800084
|April 29, 2009
|修改了 IPv6 SSM 和 MLDv2 之后的 8.0-CURRENT。

|800085
|April 30, 2009
|启用了包括一个活跃映像的 VIMAGE 内核支持之后的 8.0-CURRENT。

|800086
|May 8, 2009
|为 patch(1) 增加任意长输入行支持之后的 8.0-CURRENT。

|800087
|May 11, 2009
|修改了一些 VFS KPI 之后的 8.0-CURRENT。 VFS 的 FSD 部分中删去了线程参数。 `VFS_*` 函数并不需要这些上下文信息, 因为它总是与 `curthread` 相关。 在某些特殊情况中, 则保留了原先的行为。

|800088
|May 20, 2009
|对 net80211 监视模式进行调整之后的 8.0-CURRENT。

|800089
|May 23, 2009
|增加了 UDP 控制块支持之后的 8.0-CURRENT。

|800090
|May 23, 2009
|将网络接口克隆虚拟化之后的 8.0-CURRENT。

|800091
|May 27, 2009
|增加了层次式 jail 并取消全局 securelevel 之后的 8.0-CURRENT。

|800092
|May 29, 2009
|修改了 `sx_init_flags()` KPI 之后的 8.0-CURRENT。 [constant]#SX_ADAPTIVESPIN# 退役, 而新增的 [constant]#SX_NOADAPTIVE# 标志则表达相反语义。

|800093
|May 29, 2009
|为 struct mount 增加 mnt_xflag 之后的 8.0-CURRENT。

|800094
|May 30, 2009
|新增了 man:VOP_ACCESSX[9] 之后的 8.0-CURRENT。

|800095
|May 30, 2009
|调整轮询 KPI (polling KPI) 之后的 8.0-CURRENT。 轮询处理程序会返回处理过的包的数量。 新增的 [constant]#IFCAP_POLLING_NOCOUNT# 则表示返回值不重要, 并跳过计数。

|800096
|June 1, 2009
|对新的 netisr 进行了改进, 并调整了保存和存取 FIB 方式之后的 8.0-CURRENT。

|800097
|June 8, 2009
|引入了 vnet 析构挂钩和相关基础设施之后的 8.0-CURRENT。

|800097
|June 11, 2009
|引入了 netgraph 输出到输入路径调用检测和排队机制, 并调整了 struct thread 布局之后的 8.0-CURRENT。

|800098
|June 14, 2009
|引入了 OpenSSL 0.9.8k 之后的 8.0-CURRENT。

|800099
|June 22, 2009
|更新了 NGROUPS 并将路由虚拟化挪到它自己的 VImage 模块之后的 8.0-CURRENT。

|800100
|June 24, 2009
|修改了 SYSVIPC ABI 之后的 8.0-CURRENT。

|800101
|June 29, 2009
|删去了与网络接口一一对应的 /dev/net/* 字符设备之后的 8.0-CURRENT。

|800102
|July 12, 2009
|在 struct sackhint、 struct tcpcb 以及 struct tcpstat 上增加占位元素之后的 8.0-CURRENT。

|800103
|July 13, 2009
|将 TOE 驱动接口中的 struct tcpopt 替换为 TCP syncache 中的 struct toeopt 之后的 8.0-CURRENT。

|800104
|July 14, 2009
|新增了基于 linker-set 的 per-vnet 分配器之后的 8.0-CURRENT。

|800105
|July 19, 2009
|递增了所有未使用符号版本的动态连接库版本之后的 8.0-CURRENT。

|800106
|July 24, 2009
|引入 VM 对象类型 OBJT_SG 之后的 8.0-CURRENT。

|800107
|August 2, 2009
|通过加入 newbus sxlock 使 newbus 子系统不再使用 Giant, 以及 8.0-RELEASE。

|800108
|November 21, 2009
|实现了 EVFILT_USER kevent 过滤器之后的 8.0-STABLE。

|800500
|January 7, 2010
|令 `pkg_add -r` 使用 packages-8-stable 的 `__FreeBSD_version` 版本变化的 8.0-STABLE。

|800501
|January 24, 2010
|调整了 `scandir(3)` 和 `alphasort(3)` 函数原型, 使其符合 SUSv4 之后的 8.0-STABLE。

|800502
|January 31, 2010
|新增了 `sigpause(3)` 之后的 8.0-STABLE。

|800503
|February 25, 2010
|新增了用于管理网络接口说明的 SIOCGIFDESCR 和 SIOCSIFDESCR ioctl 之后的 8.0-STABLE。 这组接口受到了 OpenBSD 的启发。

|800504
|March 1, 2010
|MFC 了 x86emu, 来自 OpenBSD 的 x86 CPU 实模式模拟器之后的 8.0-STABLE。

|800505
|May 18, 2010
|MFC 了添加 liblzma, xz, xzdec 以及 lzmainfo 之后的 8.0-STABLE。

|801000
|June 14, 2010
|8.1-RELEASE

|801500
|June 14, 2010
|8.1-RELEASE 之后的 8.1-STABLE。

|801501
|November 3, 2010
|用于 PL_FLAG_SCE/SCX/EXEC/SI 的 struct sysentvec 的 KBI 以及 用于 ptrace(PT_LWPINFO) 的 pl_siginfo 的 KBI 改变之后的 8.1-STABLE。

|802000
|December 22, 2010
|8.2-RELEASE

|802500
|December 22, 2010
|8.2-RELEASE 之后的 8.2-STABLE。

|802501
|February 28, 2011
|合并了 DTrace 变动, 包含用户态跟踪支持之后的 8.2-STABLE。

|802502
|March 6, 2011
|在 libm 中合并了 log2 和 log2f 之后的 8.2-STABLE。

|802503
|May 1, 2011
|将 gcc 升级至 FSF gcc-4_2-branch 最后一个 GPLv2 版本之后的 8.2-STABLE。

|802504
|May 28, 2011
|引入模块化拥塞控制支持基础设施和 KPI 之后的 8.2-STABLE。

|802505
|May 28, 2011
|引入了 Hhook 和 Khelp KPI 之后的 8.2-STABLE。

|802506
|May 28, 2011
|在 tcpcb 结构中增加 OSD 之后的 8.2-STABLE。

|802507
|June 6, 2011
|引入 ZFS v28 之后的 8.2-STABLE。

|802508
|June 8, 2011
|删去了 sv_schedtail struct sysvec 方法之后的 8.2-STABLE。

|802509
|July 14, 2011
|在 binutils 中合并了 SSE3 支持之后的 8.2-STABLE。

|802510
|July 19, 2011
|为 `rfork(2)` 添加了 RFTSIGZMB 标志之后的 8.2-STABLE。

|900000
|August 22, 2009
|9.0-CURRENT。

|900001
|September 8, 2009
|引入了 x86emu, 来自 OpenBSD 的 x86 CPU 实模式模拟器之后的 9.0-CURRENT。

|900002
|September 23, 2009
|实现了 EVFILT_USER kevent 过滤器之后的 9.0-CURRENT。

|900003
|December 2, 2009
|新增了 `sigpause(3)` 以及 csu 的 PIE 支持之后的 9.0-CURRENT。

|900004
|December 6, 2009
|新增了 libulog 及其 libutempter 兼容接口之后的 9.0-CURRENT。

|900005
|December 12, 2009
|新增了用于查询指定休眠队列上等待者数量的 `sleepq_sleepcnt()` 函数之后的 9.0-CURRENT。

|900006
|January 4, 2010
|调整了 `scandir(3)` 和 `alphasort(3)` 函数原型, 使其符合 SUSv4 之后的 9.0-CURRENT。

|900007
|January 13, 2010
|删去了 utmp(5) 并增加了 utmpx (参阅 `getutxent(3)`) 以改善用户登录日志和系统事件支持之后的 9.0-CURRENT。

|900008
|January 20, 2010
|9.0-CURRENT 引入了 BSD 授权的 bc/dc 并将 GNU bc/dc 标注为过时之后的 9.0-CURRENT。

|900009
|January 26, 2010
|新增了用于管理网络接口说明的 SIOCGIFDESCR 和 SIOCSIFDESCR ioctl 之后的 9.0-CURRENT。 这组接口受到了 OpenBSD 的启发。

|900010
|March 22, 2010
|引入了 zlib 1.2.4 之后的 9.0-CURRENT。

|900011
|April 24, 2010
|添加了 soft-updates 日志功能之后的 9.0-CURRENT。

|900012
|May 10, 2010
|添加了 liblzma, xz, xzdec 以及 lzmainfo 之后的 9.0-CURRENT。

|900013
|May 24, 2010
|添加了针对 linux(4) 的 USB 修正之后的 9.0-CURRENT。

|900014
|Jun 10, 2010
|添加了 Clang 之后的 9.0-CURRENT。

|900015
|July 22, 2010
|引入了 BSD grep 之后的 9.0-CURRENT。

|900016
|July 28, 2010
|在 struct malloc_type_internal 中加入了 mti_zone 之后的 9.0-CURRENT。

|900017
|August 23, 2010
|默认 grep 改回使用 GNU grep 并增加 WITH_BSD_GREP 开关之后的 9.0-CURRENT。

|900018
|August 24, 2010
|将 `pthread_kill(3)` 产生的信号在 si_code 中改为使用 SI_LWP 标记之后的 9.0-CURRENT。 之前, si_code 对应的标志为 SI_USER。

|900019
|August 28, 2010
|为 `mmap(2)` 新增了 MAP_PREFAULT_READ 标志之后的 9.0-CURRENT。

|900020
|September 9, 2010
|为 sbuf 增加了 drain 功能并改变了 struct sbuf 布局之后的 9.0-CURRENT。

|900021
|September 13, 2010
|DTrace 增加用户态跟踪支持之后的 9.0-CURRENT。

|900022
|October 2, 2010
|新增了 BSDL man 工具, 并淘汰 GNU/GPL man 工具之后的 9.0-CURRENT。

|900023
|October 11, 2010
|引入 20101010 git 快照版本 xz 之后的 9.0-CURRENT。

|900024
|November 11, 2010
|将 libgcc.a 替换为 libcompiler_rt.a 之后的 9.0-CURRENT。

|900025
|November 12, 2010
|引入了模块化拥塞控制之后的 9.0-CURRENT。

|900026
|November 30, 2010
|引入串行管理协议 (SMP) 直通, 以及与之对应的 CAM CCB XPT_SMP_IO 和 XPT_GDEV_ADVINFO 之后的 9.0-CURRENT。

|900027
|December 5, 2010
|在 libm 中增加 log2 之后的 9.0-CURRENT。

|900028
|December 21, 2010
|添加了 Hhook (Helper Hook)、 Khelp (Kernel Helpers) 和 Object Specific Data (OSD) KPI 之后的 9.0-CURRENT。

|900029
|December 28, 2010
|修改 TCP 协议栈使其允许 Khelp 模块通过 helper hook 指针, 与 TCP 控制块交互并保存连接数据之后的 9.0-CURRENT。

|900030
|January 12, 2011
|将 libdialog 更新至版本 20100428 之后的 9.0-CURRENT。

|900031
|February 7, 2011
|添加了 `pthread_getthreadid_np(3)` 之后的 9.0-CURRENT。

|900032
|February 8, 2011
|删除了 uio_yield 函数原型和符号之后的 9.0-CURRENT。

|900033
|February 18, 2011
|将 binutils 更新至 2.17.50 之后的 9.0-CURRENT。

|900034
|March 8, 2011
|修改了 struct sysvec (sv_schedtail) 之后的 9.0-CURRENT。

|900035
|March 29, 2011
|将基本系统中 gcc 和 libstdc++ 升级至最后的 GPLv2 授权版本之后的 9.0-CURRENT。

|900036
|April 18, 2011
|在基本系统中删去了 libobjc 和 Objective-C 支持之后的 9.0-CURRENT。

|900037
|May 13, 2011
|在基本系统中引入了 libprocstat(3) 函数库以及 fuser(1) 工具之后的 9.0-CURRENT。

|900038
|May 22, 2011
|为 VFS_FHTOVP(9) 添加锁标志参数之后的 9.0-CURRENT。

|900039
|June 28, 2011
|引入了来自 OpenBSD 4.5 的 pf 之后的 9.0-CURRENT。

|900040
|July 19, 2011
|将 amd64 和 ia64 平台上的 MAXCPU 提高到 64, 并把 XLP (mips) 上的值提高到 128 之后的 9.0-CURRENT。

|900041
|August 13, 2011
|实现了 Capsicum capabilities 之后的 9.0-CURRENT。 fget(9) 新增了权限参数。

|900042
|August 28, 2011
|提高修改过 ABI 的动态连接库版本号之后的 9.0-CURRENT。

|900043
|September 2, 2011
|增加了对不支持 SCSI 快取缓存同步功能的 USB 大容量存储设备自动检测功能之后的 9.0-CURRENT。

|900044
|September 10, 2011
|重构了 auto-quirk 之后的 9.0-CURRENT。

|900045
|Oct 13, 2011
|将非兼容性系统调用入口点全部增加 sys_ 前缀之后的 9.0-CURRENT。
|===

[NOTE]
====
请注意, 2.2.5-RELEASE 之后有一段时间的 2.2-STABLE 会声称自己是 "2.2.5-STABLE"。 这种模式的版本号表示的是年月。 但随后, 我们决定, 从 2.2 开始, 将它改为更为简洁的 主/次 版本号的形式来命名版本。 这是因为并行地在多个分支上进行开发, 使得通过实际的发布日期来区分不同的版本变得不再现实。 如果您正在做新的 port, 应该不需要担心较早的 -CURRENT; 在此列出仅供参考。
====

[[dads-after-port-mk]]
== 在 [.filename]#bsd.port.mk# 之后写一些内容

不要在 `.include <bsd.port.mk>` 这行之后增加任何内容。 这通常可以通过在您的 [.filename]#Makefile# 中间的某处引用 [.filename]#bsd.port.pre.mk#, 并在结尾的地方引用 [.filename]#bsd.port.post.mk# 来避免。

[NOTE]
====
只能够采用 [.filename]#bsd.port.pre.mk#/[.filename]#bsd.port.post.mk# 或 [.filename]#bsd.port.mk# 两种写法之一; 任何时候都不要同时使用两种写法。
====

[.filename]#bsd.port.pre.mk# 只定义了很少的变量, 它们可以在 [.filename]#Makefile# 中用于进行一些测试, 而 [.filename]#bsd.port.post.mk# 则定义了所有其它的变量。

下面是一些由 [.filename]#bsd.port.pre.mk# 定义的比较重要的变量 (这并不是一份完整的列表, 您可以阅读 [.filename]#bsd.port.mk# 以获得全部变量的名字)。

[.informaltable]
[cols="1,1", frame="none", options="header"]
|===
| 变量
| 描述

|`ARCH`
|由 `uname -m` 输出得到的硬件架构的名字 (例如, `i386`)

|`OPSYS`
|由 `uname -s` 返回的操作系统类型 (例如, `FreeBSD`)

|`OSREL`
|操作系统的版本号 (例如 `2.1.5` 或 `2.2.7`)

|`OSVERSION`
|操作系统的版本号的数值形式; 它等于 <<freebsd-versions,`__FreeBSD_version`>>。

|`PORTOBJFORMAT`
|系统默认的执行文件格式 (`elf` 或 `aout`; 请注意, "现代的" FreeBSD 版本中, `aout` 已在淘汰之列。)

|`LOCALBASE`
|"local" 目录的根 (例如, `/usr/local/`)

|`PREFIX`
|port 应被安装到哪里 (参见 <<porting-prefix,关于 `PREFIX` 的更多说明>>)。
|===

[NOTE]
====
如果您需要定义 `USE_IMAKE`, `USE_X_PREFIX`, 或 `MASTERDIR` 这些变量, 则应在引用 [.filename]#bsd.port.pre.mk# 之前完成。
====

下面是一些在引用 [.filename]#bsd.port.pre.mk# 之后可以进行的判断:

[.programlisting]
....
# 如果 perl5 已经在系统中提供, 则不必编译 lang/perl5
.if ${OSVERSION} > 300003
BROKEN= perl is in system
.endif

# ELF 只使用一个 shlib 版本
.if ${PORTOBJFORMAT} == "elf"
TCL_LIB_FILE=  ${TCL_LIB}.${SHLIB_MAJOR}
.else
TCL_LIB_FILE=  ${TCL_LIB}.${SHLIB_MAJOR}.${SHLIB_MINOR}
.endif

# 软件会自动为 ELF 创建符号链接, 但 a.out 则需要另行创建
post-install:
.if ${PORTOBJFORMAT} == "aout"
       ${LN} -sf liblinpack.so.1.0 ${PREFIX}/lib/liblinpack.so
.endif
....

您还记得应该在 `BROKEN=` 和 `TCL_LIB_FILE=` 后面使用制表符, 而不是空格, 对吧? :-)

[[dads-sh-exec]]
== 在 wrapper 脚本中使用 `exec` 语句

如果 port 安装了用以启动其他程序的脚本, 并且运行其他程序是这些脚本的最后一项操作, 请务必使用 `exec` 语句来运行这些程序, 例如:

[.programlisting]
....
#!/bin/sh
exec %%LOCALBASE%%/bin/java -jar %%DATADIR%%/foo.jar "$@"
....

使用 `exec` 语句表示执行指定的程序来取代 shell 进程。 如果省略了 `exec`, 则 shell 进程会一直在内存中, 从而不必要地消耗了额外的系统资源。

[[dads-rational]]
== 理性行事

任何 [.filename]#Makefile# 都应该简单并理性地行事。 如果您能让其中的条目更为简单和易读, 一定要这样做。 例如, 使用 make 提供的 `.if` 结构, 而不要使用 shell 的 `if`, 只要能重定义 `EXTRACT*` 就不要重载 `do-extract`, 尽量使用 `GNU_CONFIGURE` 而不是 `CONFIGURE_ARGS += --prefix=${PREFIX}`。

如果您在尝试做什么事情的时候发现不得不写大量的代码, 请回过头来复审一下 [.filename]#bsd.port.mk#, 看看是否有您正打算做的事情的现成实现。 尽管读起来可能很费劲, 但有很多貌似很难的问题, 在 [.filename]#bsd.port.mk# 中都给出了十分简便的解决方案。

[[dads-cc]]
== 遵循 `CC` 和 `CXX` 设置

port 应遵循 `CC` 和 `CXX` 变量的设置。 这也就是说, port 不应使用绝对的方式来设置这个变量的值, 而罔顾已经存在的设置; 与此相反, 它应该在其值后加入需要的其它值。 这样, 就可以设置全局的联编选项, 令其影响所有的 port 联编过程了。

如果实在无法这样做, 请在 [.filename]#Makefile# 中加入 `NO_PACKAGE=ignores cflags`。

下面的 [.filename]#Makefile# 实例给出了如何遵循 `CC` 和 `CXX` 变量的设置。 注意这里用到的 `?=`:

[.programlisting]
....
CC?= gcc
....

[.programlisting]
....
CXX?= g++
....

下面则是没有遵循 `CC` 和 `CXX` 的例子:

[.programlisting]
....
CC= gcc
....

[.programlisting]
....
CXX= g++
....

在 FreeBSD 系统中, `CC` 和 `CXX` 这两个变量都可以在 [.filename]#/etc/make.conf# 中自行定义。 第一个例子只有在 [.filename]#/etc/make.conf# 中没有定义时才对这两个变量进行定义, 从而保持了系统范围的配置。 而第二个例子则会覆盖任何现有的配置。

[[dads-cflags]]
== 遵循 `CFLAGS`

您的 port 应遵循 `CFLAGS` 变量的设置。 这也就是说, port 不应使用绝对的方式来设置这个变量的值, 而罔顾已经存在的设置; 与此相反, 它应该在其值后加入需要的其它值, 这样, 就可以设置全局的联编选项, 令其影响所有的 port 联编过程了。

如果实在无法这样做, 请在 [.filename]#Makefile# 中加入 `NO_PACKAGE=ignores cflags`。

下面的 [.filename]#Makefile# 例子, 可以帮助我们理解如何遵循 `CFLAGS` 的设置。 注意所用的 `+=`:

[.programlisting]
....
CFLAGS+= -Wall -Werror
....

下面是一个未能遵循 `CFLAGS` 设置的例子:

[.programlisting]
....
CFLAGS= -Wall -Werror
....

一般来说, `CFLAGS` 在 FreeBSD 系统中是在 [.filename]#/etc/make.conf# 里配置的。 第一个例子在 `CFLAGS` 变量中增加了一些参数, 并保持了所有系统预定义的标志。 而第二个例子, 则会覆盖掉任何先前定义的参数。

您应从第三方软件的 [.filename]#Makefile# 中去掉特殊的优化设置。 系统的 `CFLAGS` 给出了全系统范围内的优化设置参数。 下面是一个未经修改的 [.filename]#Makefile# 实例:

[.programlisting]
....
CFLAGS= -O3 -funroll-loops -DHAVE_SOUND
....

如果使用系统的优化参数, 则 [.filename]#Makefile# 中的设置应该类似下面这样:

[.programlisting]
....
CFLAGS+= -DHAVE_SOUND
....

[[dads-pthread]]
== 线程库

在 FreeBSD 上, 线程库必须通过特殊的连接器参数 `-pthread` 连接到可执行文件。 如果 port 一定要直接连接 `-lpthread` 或 `-lc_r`, 则应将其改为使用由 ports 框架提供的 `PTHREAD_LIBS`。 这个变量的值通常是 `-pthread`, 但在某些特定平台上的 FreeBSD 版本中, 它可能是其它值, 因此, 不要将 `-pthread` 硬编码到您的补丁中, 而应使用 `PTHREAD_LIBS` 变量。

[NOTE]
====
如果设置了 `PTHREAD_LIBS`, 而在联编时出现 `unrecognized option '-pthread'` 这样的错误, 可能需要通过将 `CONFIGURE_ENV` 设为 `LD=${CC}` 来使用 `gcc` 作为连接器。 `-pthread` 这一选项并不为 `ld` 所直接支持。
====

[[dads-freedback]]
== 反馈

如果进行了一些很好的修改和补丁, 一定要把它们发回给原作者, 或维护者, 以便在下一版本的代码中包含它们。 这会让您在软件发布新版本的时候变得轻松一些。

[[dads-readme]]
== [.filename]#README.html#

不要包含 [.filename]#README.html# 文件。 这个文件并非 CVS 代码库中的一部分, 它是由 `make readme` 命令生成的。 

[[dads-noinstall]]
== 使用 `BROKEN`、 `FORBIDDEN` 或 `IGNORE` 阻止用户安装 port

某些时候会需要阻止用户安装某个 port。 想要告诉用户某个 port 不应被安装, 有许多可以在 port 的 [.filename]#Makefile# 中使用的 `make` 变量。 下列 `make` 的值, 将是在用户试图安装时得到的提示信息。 务请使用正确的 `make` 变量, 因为每一个都表达了截然不同的意义, 而且许多自动化系统, 例如 <<build-cluster,port 联编集群>>、 <<freshports,FreshPorts>>, 以及 <<portsmon,portsmon>>, 都依赖于 [.filename]#Makefile# 的正确性。

[[dads-noinstall-variables]]
=== 变量

* `BROKEN` 专门用于表达目前无法正确编译、 安装或卸载这类问题。 如果是临时性的问题, 则可以使用它。
+ 
如果进行了相关的配置, 则联编集群仍将尝试联编它, 以确认导致问题的深层问题是否已被解决。 (不过, 一般情况下, 联编集群并不会这样做。)
+ 
举例来说, 当 port 发生下述情况时, 应使用 `BROKEN`:

** 无法编译 (does not compile)
** 无法正确进行配置或安装操作
** 在 [.filename]#${LOCALBASE}# 以外的地方安装文件
** 卸载时无法删除所安装的全部文件 (不过, 留下用户改过的文件可接受的, 因为可能希望这样作)

* `FORBIDDEN` 用于表示 ports 中包含安全漏洞, 或者可能会给安装了这个 port 的 FreeBSD 系统带来严重的安全隐患 (例如: 一个很不安全的程序, 或包含了能够被轻易攻陷的服务的软件)。 如果发现了安全漏洞, 而其作者没有发布升级版本, 则应立即把那个 port 标记为 `FORBIDDEN`。 理想情况下, 包含安全漏洞的 port 应被尽快升级, 以便减少包含漏洞的 FreeBSD 主机的数量 (我们希望保持良好的安全记录), 然而, 有时在安全漏洞的披露和软件更新之间可能会有一个间隔, 此时应予以说明。 除了安全之外, 请不要以任何其它理由将 port 标记为 `FORBIDDEN`。
* `IGNORE` 用来表示 port 由于某些其它原因不应予以联编。 如果认为发生了结构性的问题, 则应使用它。 任何情况下, 联编集群都不会联编标记为 `IGNORE` 的 port。 以下是使用 `IGNORE` 的一些例子:

** 能够编译但无法正常运行
** 无法与运行的 FreeBSD 版本一同工作
** 联编时需要 FreeBSD 内核的源代码, 但用户没有安装它们
** 由于授权原因, 必须手工下载 distfile
** 无法与的某个已安装的 port 一同工作 (例如, port 依赖于 package:www/apache21[] 而安装的则是 package:www/apache13[])

+
[NOTE]
====
如果 port 与某个已经安装的 port 冲突 (例如, 它们在同一位置安装同名但功能不同的文件), 则应 <<conflicts,使用 `CONFLICTS` 来标记它>>。 `CONFLICTS` 将自动地设置 `IGNORE`。
====

* 如果 port 只应在某些平台上标记为 `IGNORE`, 还有另外两个方便使用的 `IGNORE` 变量可供选择: `ONLY_FOR_ARCHS` 和 `NOT_FOR_ARCHS`。 例如:
+
[.programlisting]
....
ONLY_FOR_ARCHS= i386 amd64
....

+
[.programlisting]
....
NOT_FOR_ARCHS= alpha ia64 sparc64
....

+ 
可以使用 `ONLY_FOR_ARCHS_REASON` 和 `NOT_FOR_ARCHS_REASON` 来配置定制的 `IGNORE` 消息。 此外, 还可以使用 `ONLY_FOR_ARCHS_REASON__ARCH_` 和 `NOT_FOR_ARCHS_REASON__ARCH_` 来分别指定与具体平台有关的信息。
* 如果 port 会下载并安装用于 i386 的预编译二进制文件, 则应设置 `IA32_BINARY_PORT`。 如果设置了这个变量, 则系统会检查是否已经在 [.filename]#/usr/lib32# 目录中安装了 IA32 版本的函数库, 以及内核是否提供了 IA32 兼容支持。 如果这些依赖条件不满足, 则会自动设置 `IGNORE`。

[[dads-noinstall-notes]]
=== 实现说明

这些字串不应使用引号括起来。 此外, 由于显示给用户的方式不同, 这些字串的措辞也应有所不同。 例如:

[.programlisting]
....
BROKEN= this port is unsupported on FreeBSD 5.x
....

[.programlisting]
....
IGNORE= is unsupported on FreeBSD 5.x
....

它们分别会在 `make describe` 时产生下面的输出:

[.programlisting]
....
===>  foobar-0.1 is marked as broken: this port is unsupported on FreeBSD 5.x.
....

[.programlisting]
....
===>  foobar-0.1 is unsupported on FreeBSD 5.x.
....

[[dads-deprecated]]
== 使用 `DEPRECATED` 或 `EXPIRATION_DATE` 表示某个 port 将被删除

一定要记得 `BROKEN` 和 `FORBIDDEN` 只应作为当某个 port 无法正常工作时的临时解决方案。 永久性地坏掉了的 port 应被从 ports tree 中完全删除。

需要时还可以使用 `DEPRECATED` 和 `EXPIRATION_DATE` 来通知用户某个 port 不应被使用, 并即将被删除。 前一个变量用来表达为什么计划删除 port; 而后一个是则是一个 ISO 8601 格式的日期 (YYYY-MM-DD)。 两者都会向用户呈现。

也可以设置 `DEPRECATED` 而不给出 `EXPIRATION_DATE` (例如, 建议使用某个新版本的 port), 但反之则没有意义。

目前还没有确切的关于需要给出多少通知的政策。 当前的实践是, 对于与安全有关的问题为一个月, 而与联编有关的问题则为两个月。 这也让有兴趣的 committer 能够有一点时间来修正问题。

[[dads-dot-error]]
== 避免使用 `.error` 结构

在 [.filename]#Makefile# 中给出信号, 表示由于某种外界因素 (例如, 用户指定了无效的联编选项) 而无法安装的方法是将变量 `IGNORE` 设为一非空值。 这个值将被格式化, 并在用户执行 `make install` 是给出提示。

用 `.error` 实现这一目的是一种常见的误用。 这样做的问题是, 许多在 ports 树上运行的自动化工具会因此而失败。 最常见的情况见于联编 [.filename]#/usr/ports/INDEX# 的过程 (参见 crossref:testing[make-describe, 运行 make describe])。 然而, 即使十分普通的命令, 例如 `make maintainer`, 在这种情况下也会失败。 这是不可接受的。

[[dot-error-breaks-index]]
.怎样避免使用 `.error`
[example]
====
考虑有人在 [.filename]#make.conf# 中设置了 
[.programlisting]
....
USE_POINTYHAT=yes
....

的情形。 接下来的例子中, 第一个 [.filename]#Makefile# 中的问题将导致 `make index` 失败, 而第二个则不会:

[.programlisting]
....
.if USE_POINTYHAT
.error "POINTYHAT is not supported"
.endif
....

[.programlisting]
....
.if USE_POINTYHAT
IGNORE=POINTYHAT is not supported
.endif
....

====

[[dads-sysctl]]
== 对于 [.filename]#sysctl# 的使用

除了在 target 中之外, 是不鼓励使用 [.filename]#sysctl# 的。 这是因为计算 `makevar`, 例如在 `make index` 中所进行的那种, 都不得不运行一条命令, 这会使这一操作变得更慢。

在使用 man:sysctl[8] 时, 务必通过 `SYSCTL` 变量来进行, 因为此变量将展开成命令的完整路径, 并且用户可以根据需要另行指定。

[[dads-rerolling-distfiles]]
== 重新发布的 distfiles

有时, 一些软件的作者会修改业已发布的 distfile 的内容, 而并不修改文件名。 这种情况下, 您需要验证这些变动是来自软件作者的官方改动。 在过去, 曾经发生过下载服务器上的 distfile 被悄悄换成注入过恶意代码的版本, 并给用户安全造成威胁或损害的事情。

您应保留一份旧的 distfile, 并下载一份新的, 分别展开, 用 man:diff[1] 来对比其内容。 如果没有发现可疑的变动, 就可以更新 [.filename]#distinfo# 了。 请务必在您的 PR 或 commit log 中对这些差异进行描述, 以便让别人了解您已经仔细对比过差异, 并确认没有问题了。

除此之外, 也可以联系软件的作者, 以确认这些修改是否是他们做的。

[[dads-misc]]
== 杂记

需要仔细地反复检查 [.filename]#pkg-descr# 和 [.filename]#pkg-plist# 这两个文件。 如果您正在复审一个 port, 并认为这两个文件应该改进, 请一定要这样做。

请不要在系统中复制多份 GNU General Public License。

一定要非常小心地处理法律问题! 不要让我们发布没有得到合法授权的软件!