File: buildfaq.tex

package info (click to toggle)
fpc 3.2.0%2Bdfsg-12
  • links: PTS, VCS
  • area: main
  • in suites: bullseye, bullseye-backports
  • size: 338,552 kB
  • sloc: pascal: 3,794,737; xml: 191,997; ansic: 9,637; asm: 8,482; java: 5,346; sh: 4,664; yacc: 3,751; makefile: 2,688; lex: 2,538; javascript: 2,375; sql: 929; php: 473; cpp: 145; perl: 134; sed: 132; csh: 34; tcl: 7
file content (3197 lines) | stat: -rw-r--r-- 136,770 bytes parent folder | download | duplicates (4)
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
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
%% LyX 2.1.4 created this file.  For more info, see http://www.lyx.org/.
%% Do not edit unless you really know what you are doing.
\documentclass[oneside,english]{book}
\usepackage[T1]{fontenc}
\usepackage[latin9]{inputenc}
\usepackage[a4paper]{geometry}
\geometry{verbose,tmargin=2cm,bmargin=2cm,lmargin=1cm,rmargin=1cm,headheight=1cm,headsep=1cm,footskip=1cm}
\setlength{\parskip}{\medskipamount}
\setlength{\parindent}{0pt}
\usepackage{babel}
\usepackage{url}
\usepackage{makeidx}
\makeindex
\usepackage{graphicx}
\usepackage[unicode=true,pdfusetitle,
 bookmarks=true,bookmarksnumbered=false,bookmarksopen=false,
 breaklinks=false,pdfborder={0 0 1},backref=false,colorlinks=false]
 {hyperref}

\makeatletter

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% LyX specific LaTeX commands.
\providecommand{\LyX}{\texorpdfstring%
  {L\kern-.1667em\lower.25em\hbox{Y}\kern-.125emX\@}
  {LyX}}
%% Because html converters don't know tabularnewline
\providecommand{\tabularnewline}{\\}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Textclass specific LaTeX commands.
\newenvironment{lyxcode}
{\par\begin{list}{}{
\setlength{\rightmargin}{\leftmargin}
\setlength{\listparindent}{0pt}% needed for AMS classes
\raggedright
\setlength{\itemsep}{0pt}
\setlength{\parsep}{0pt}
\normalfont\ttfamily}%
 \item[]}
{\end{list}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% User specified LaTeX commands.
\usepackage{hyperref}
\renewcommand{\chaptername}{}

\makeatother

\begin{document}

\title{Development Tutorial (a.k.a Build FAQ) }


\author{by Marco van de Voort }


\date{March 12th, 2012}

\maketitle

\section*{Foreword to the Development Tutorial }

FAQ version 0.10

FPC version 2.6.0/2.7.1 (release/devel) 

This FAQ was created in early 2.0 times (2005) when I noticed that
more people started playing with the more advanced aspects of the
buildprocess of FPC like tracking daily SVN status and crosscompiling.
So in general users trying to do things that used to be only done
by a small circle of core developers and maybe a select few on the
mailing lists and in the Lazarus project. Things like bootstrapping
a new version, release building, crosscompiling, parameterising the
build process, attempting to port to new OSes etc. This is logical,
because due to (mainly) Peter\textquoteright s efforts, the building
process is a lot more robust and flexible then it used to be. Since
the first version of this faq I\textquoteright ve debugged specially
the crosscompiling part of the process a bit more.

The Development Tutorial was originally meant as the successor of
the old 0.99.x make cycle FAQ, which had gotten horribly outdated.
Moreover, the basic idea of the make cycle faq didn\textquoteright t
work in practice. The FAQ contained only a step by step treatise of
the basic features, and when something went wrong (e.g. a .ppu of
an old version somewhere), users often had no idea how to solve the
problem. So this faq is set up more as an indepth treatise of building
FPC and related issues, with much more background information that
can assist general problem hunting procedures. So if you think that
this FAQ is too verbose and even pedantic at times, and should be
limited to the bare essentials, my answer will be: been there, done
that, didn\textquoteright t work :-) 

\textbf{This tutorial is not even close to being a replacement for
the real manuals.} Most of it will be in the manual though, except
some of the outlook on future versions. Try to read the tutorial entirely
at least once, including parts that are not so relevant to you. It
is all connected, and reading the parts less useful for you might
help you see the bigger picture.

The purpose of the faq is different from the docs because it tries
to document use cases rather than a reference, and also because it
is not fully synchronized with a compiler version.

If you have more questions, suggestions, try the FPC mailing lists
http://www.freepascal.org/maillist.html or irc \footnote{irc.freenode.net channel \#fpc, best populated in the late evenings
CET. }


\section*{Versioning of the faq }

The faq comes in two versions, the PDF at \href{http://www.stack.nl/marcov/buildfaq.pdf}{http://www.stack.nl/marcov/buildfaq.pdf}
one and an HTML version at \href{http://www.stack.nl/marcov/buildfaq }{http://www.stack.nl/marcov/buildfaq}.
The PDF version is the authoritative one and more often updated. The
HTML version is mainly used to post URLs to specific topics on mailing
lists and IRC. Unfortunately, the HTML export of \LyX{} is not the
stablest in the world, so sometimes exporting to html doesn't even
succeed
\begin{itemize}
\item Versions 0.01 and 0.02 were continuously updated, both exist in multiple
versions. 
\item Version 0.03 mainly is an update for the \$FPCTARGET and related directory
layout modifications in 1.9.5, and improves the index and glossary
significantly. Also 1.0.x topics are phased out. 
\item Version 0.04 is an update for 2.0 and post 2.0 development. Peter
has big plans with the build process (replacing MAKE with a more FPC
friendly solution), so 0.05 could be a major update. Also needs SVN
tutorials. 
\item Version 0.05 is an update after some progress on cross compiling,
and the emerging of an internal linker 
\item Version 0.06 is an update after a long break due to losing the \LyX{}
source as a result of a stolen computer. A PDF version was OCRed and
reformatted, and some updating was done:

\begin{itemize}
\item Compiler version numbers updated to 2.2.2
\item New packages structure.
\item Index expanded
\item More 1.0.10 and CVS removal
\end{itemize}
\item Version 0.07 is some maintenance after 2.2.4 release

\begin{itemize}
\item compiler version updated
\item some 2.3.x topics, which will be increased in the future. 
\item Lyx 1.6.2 (mostly sorting of all-caps index entries)
\item newer buildscripts
\end{itemize}
\item Updates 0.07a and b only have minor typo fixes, and was released in
the day after the initial 0.07 version
\item Version 0.08 is a maintenance release after 2.4.0, \LyX{} version
1.6.5
\item Version 0.09 is a maintenance release after 2.4.2 and 2.4.4 with some
preparations for 2.6, and only distributed privately.
\item version 0.10 was made in preparation of the 2.6.0 launch + started
cleanup 1.9.x related remarks.
\end{itemize}
\tableofcontents{}


\part{Ordinary building}


\chapter{Base principles, naming, versions, requirements etc}


\section{Versions, branches, tags }

Roughly there are four versions categories of FPC now: 
\begin{description}
\item [{pre-1.0}] These are versions are usually numbed 0.99.x Versions
before 0.99.8 don\textquoteright t have Delphi features. In general
these are non supported, but specially versions (0.99.12 and 0.99.14
based versions) are essentially beta\textquoteright s for 1.0. However
we are talking 10 year old betas here, and a lot has changed, even
during the 1.0.x series. 
\item [{1.0.x}] The so called FIXES\_1\_0\_0\index{FIXES100 branch@FIXES\_1\_0\_0 branch}
branch. These versions (1.0, 1.0.2, 1.0.4, 1.0.6 and 1.0.10 ) are
bugfix releases of what is basically 1.0. However sometimes TP and
Delphi compatibility fixes can break backwards compatibility. 1.0.x
is frozen, and there will be no new releases or even fixes, after
1.0.10 from may 2003, and we strongly recommend upgrading to 2.0 
\item [{1.1.x/1.9.x/2.0.x}] This is the branch that yielded 2.0.x series.
It used to be called the development branch before 2.0,0, but now
that 2.0 is declared stable, the best name would be 2.0.x stable branch.
Compared to the 1.0.x branch, it adds most of the missing Delphi features
(dynamic arrays, interfaces, default parameters) and supports several
processors. This branch has multiple version numbers, since while
in alpha it was called 1.1.x, while in beta 1.9.x and the real releases
were called 2.0.x. This branch is now closed , 2.0.4 will probably
be the last release of the FIXES\_2\_0\_0 branch\index{fixes20 branch@fixes\_2\_0 branch}
\item [{2.1.x/2.2.x}] This is the branch for the FPC 2.2.x series. Main
highlights are support for internal linking for windows (win32/win64/wince).
Win64 and WinCE are also new.\index{fixes22 branch@fixes\_2\_2 branch}
fixes\_2\_2 branch. 2.2.4 is the last of the 2.2.x branch, because
merging was getting increasingly laboursome. 
\item [{2.3.x/2.4.x}] The branch for post 2.4 series. 2.4.4 was released
on may 22th, 2011 and contains the much needed fix for resource handling,
as well as some more recent Delphi dialect extensions. 2.4.4 is the
last version of the 2.4 branch.
\item [{2.5.x/2.6.x}] The branch for the 2.6 series. 2.6.0 was released
on January 1st, 2011 and contains many post D7 Delphi extensions like
methods-in-records, Objective Pascal etc. 
\item [{2.7.1}] This is the version in TRUNK, the bleeding edge of development.
Some of its features will be merged back to 2.6.x, while others will
only reach endusers when 2.7.1 goes golden as 2.8.0 or 3.0.0. 
\end{description}
2.7.1 is currently a bit rocky due to ongoing work on FPC's spin of
D2009+ unicode support.

One can see what (post 2.0.0) branches exists via the \url{http://svn.freepascal.org/cgi-bin/viewvc.cgi/?root=fpc}
\index{Viewvc webinterface} Viewvc webinterface. In SVN, recent branches
are lowercase, and in a subdir ``branches'' so branches/fixes\_2\_6

Releases are tagged with a tags/RELEASE\_x\_y\_z tag for release x.y.z.
So release 2.6.0 is tagged tags/release\_2\_6\_0. The version history
is illustrated by the following graph:

\includegraphics[width=20cm,bb = 0 0 200 100, draft, type=eps]{timeline.png}

While 1.0.x also supports two processors (intel x86 and Motorola m68k).


\section{Requirements\index{Requirements}}

A supported OS and processor are of course the main requirements.
Such info can be better gotten from the website, since the status
changes frequently.\footnote{Actually, while writing this, I witnessed the first working \textquotedblleft Hello
world\textquotedblright{} program on the Sparc V8 architecture :-)} 

The FPC build process needs certain tools. While usually this is all
provided by the OS, or installed by the FPC release package, I name
them here explicitly to make it easier for people to debug build problems. 

The \textbf{main }tools: 
\begin{description}
\item [{ld}] The GNU linker. Links a bunch of .o and .a\textquoteright s
together to form a library (.dll or .so) or a finished program (like
.exe on windows, extensionless on Unix) 
\item [{as}] The GNU assembler. Assembles the textform representation in
a .s or .as file to an .o file. 
\item [{ar}] needed for creating static libraries (.a) from .o\textquoteright s.
Static libraries are used when building for smartlinking. 
\item [{make}] GNU make. Determines the order of what to build. Both on
file as on directory level. Called gmake on {*}BSD 
\item [{ppc386}] or ppc<processor> in general, preferably the last release
version. Bootstrapping from other compilers is not realistic, and,
to my best knowledge, hasn't been attempted in years (1.0.x times)
\end{description}
The first three are found in the package \textquotedblleft binutils\index{binutils}\textquotedblright ,
the version doesn\textquoteright t matter much as long as it is not
a fossil. At least on major platforms. Some platforms package an old
version, e.g. OpenBSD used to package fossils because it still used
a.out as a binary format, though I heard that they finally got rid
of that in version 3.4. These utils are rarely a source of errors,
but depend on the target OS and CPU, which complicates cross-compiling
a bit.

Make is usually obtained from the same source as binutils, but packaged
separately. See the separate section on make below for some common
caveats. 

Windows users that build a system from scratch, should get the makew32.zip
and asldw32.zip (or similar) files from the \textquotedblleft separate\textquotedblright{}
subdirectory of the last release to get the needed external tools. 

Under \emph{Mac OS X/Darwin} , the binutils and make are part of the
Apple developer tools, which for 10.3 are automatically installed
when you install XCode. Fink (an open source software distribution
for Mac OS X) is not strictly required for FPC operation, but most
Unix libraries you might need (like mysql, ncurses etc) are part of
Fink. 


\subsection{ld\index{LD}: The GNU linker. }

The GNU linker is the final step in the building process of a FPC
source to a runnable binary. As said before, a recent version that
supports linkerscript files is the only prerequisite for an easy ride,
except for win32, where the linker should understand \textendash base-file
and \textendash image-base parameters. (these are also already supported
over 3 years though). The supported Win32 platform as far as buildtools
are concerned, is mingw32/64, not cygwin. FPC can link to cygwin libraries
though. 

One could maybe use other linkers then GNU, but that\textquoteright d
require reimplementing the part that calls the linker (this has been
done e.g. for OpenBSD a.out in the 1.0.x compiler and Darwin's mach-O
LD in 2.0+). However keep in mind that the connection between the
assembler and the linker is a common format for the object file (.o).
Changing to a linker that uses a different format might also require
a different assembler, and in turn, a different assembler might require
adaptions to the FPC part that writes the assembler code. However
all these are doable, even for people that aren\textquoteright t complete
compiler wizards. The trouble is often to keep it maintained and used
long enough to become stable.

If your platform is not a mainstream {*}nix or windows, try to find
a linker that supports the \textendash ld-sections\index{-ld-sections}
parameter. The new smartlinking will be based on this LD parameter. 

Starting with FPC 2.1.1, the compiler also has a linker internal for
some platforms which is enabled using -Xi. This internal linker links
way faster, and uses less memory,specially when using smartlinking\footnote{About 250-275 MB as maximum amount of memory used to fully smartlink
Lazarus, as opposed to +/- 1.5GB for GNU LD} . At the time of writing the Windows platforms (PE) are supported
by this internal linker. 


\subsection{as\index{AS}: GNU assembler }

The assembler must be GNU (G)AS, and must be relatively recent. Really
old x86 GNU assemblers might have hidden bugs that don\textquoteright t
surface when used with gcc. Since GNU AS is a typical backend assembler,
in the past addressing modes and opcodes that aren\textquoteright t
emitted by gcc could be problematic. 

An example of this is the OpenBSD 3.x series, where by just substituting
a newer assembler from the ports tree FPC suddenly builds, while it
fails with the packaged assembler. A relatively recent version is
also nice because these probably support newer x86 instructions (SSE2,SSE3).

On some platforms (win32 and x86 ELF), FPC has an internal assembler,
and avoids AS for performance reasons. This internal assembler is
called the binwriter in FPC jargon. The binwriter is a bit more than
a pure assembler though, since it can also directly write static libraries
({*}.a) . While noticeable with ordinary compiles too, the performance
problems that the binwriter solves are mainly noticeable when smartlinking. 

FPC also has the ability to generate code in TASM, NASM, MASM and
WASM (watcom) format. However these aren\textquoteright t frequently
tested, so your mileage may vary. 

On systems that have multiple .o formats (e.g. ARM Endian Little with
its different EABI versions, or platforms where the same assembler
can assemble 32 and 64-bit code depending on a switch) passing extra
parameters to the assembler might be necessary. This can be done by
wrapping the assembler in a shellscript, or using the aswrapper template
in fpcbuild/install/cross.


\subsection{ar\index{AR}: GNU archiver }

The archiver creates archive ( .a) files out of object code files
(.o). This is mainly done to reduce the number of files involved in
the linking process, and on disc. Archive files are often called static
libraries because they contain roughly the same code for static linking
as the .so (or .DLL) files do for dynamic code. (a .dll and .so can
be more than one .o too). The GNU linker can directly access .a libraries. 

AR can be a problem sometimes, since the compiler passes all individual
files on the commandline. Due to e.g. smartlinking and this really
can be a lot, and be larger than the maximal allowed nr of parameters
for the OS. (64k params is too little, 128k is still ok)


\subsection{make\index{make}: GNU make }

The build process of Free Pascal uses plain (GNU make) makefiles that
are generated by \index{FPCMAKE}FPCmake. FPCmake generates the Makefiles
from a global template and the Makefile.fpc in each directory. This
Makefile.fpc is a simple INI file that extends and parameterises the
global template\footnote{which can be found in fpc/utils/fpcm/fpcmake.ini }.
There are plans for the future to get rid of the MAKE utility all
together and replace it with a more specialised own version, but these
are still in the initial stages. The current system is also quite
nice and flexible. 

The currently used make is GNU make, it\textquoteright s available
for nearly all platforms. However there are some platform specific
oddities listed below.
\begin{description}
\item [{Linux}] The only without much oddities. Of all Unices, Linux uses
relatively a lot GNU tools, and less tools descending from the original
unix. If there is a make or make-package on Linux it is most likely
GNU. 
\item [{{*}BSD}] The default make is a pmake variant which is slightly
different from GNU's. The makefile template used by FPC isn\textquoteright t
compatible with pmake at this moment. (hint, hint) GNU make is installable
from the ports tree, usually as devel/gmake\index{gmake}. Don\textquoteright t
forget to put the bin directory of the ports-\$PREFIX (/usr/local/bin,
/usr/pkg/bin etc) into your path, and substitute all use of make by
\textquotedblleft gmake\textquotedblright . In practice this is no
big problem, since gmake is generally available on BSD systems, installed
as dependency of a lot of development related packages.
\item [{BeOS}] On my installation (BeOS 5 Personal Edition) both binutils
and GNU make came with the developer kit. 
\item [{OS/2}] I honestly don\textquoteright t know. There are EMX and
native versions, and of course dos also. Afaik FPC used to be EMX
based, but is currently gearing towards native. I\textquoteright ll
have to research this myself first :-) 
\item [{Dos/Go32V2\index{Go32V2}}] Uses DJGPP Go32V2 utilities. This because
FPC uses the go32v2 extender, and for safe nesting of programs using
an extender, all extenders have to be the same. Including the utils
:-) 
\item [{Netware}] Not even an idea. I never saw this port operational. 
\item [{win32\index{win32}/win64\index{win64}}] Use the mingw set, and
preferably the one distributed with the most recent FPC release. See
below. 
\item [{wince}] My experiences are limited to CE as crosscompilation target.
Some people have e.g. NAS boxes that might allow bootstrap FPC on
a WinCE based host.
\item [{Mac}] OS X Come with Apple Developer tools (which are installed
with XCode on 10.3). Using generic Unix libraries like mysql, ncurses,
postgresql etc might require FINK. 
\end{description}
The situation on win32 often confuses people. This mainly because
there are at least three available sets of the above utils (ar,ld,as,make)
that run on Windows. Any mixing (one util from one category, one from
the other) can also lead to unpredictable results. Anyway, the three
candidates are: 
\begin{description}
\item [{Mingw\index{Mingw}}] (sometimes called mingw32) which is the one
to use. Win32 native tools with a real win32 feel. (driveletters and
backslashes in paths etc) Preferably versions distributed with FPC
releases, since they might include FPC specific critical patches.
E.g. at a certain point it turned out that mingw tools only searched
for a capitalised PATH variable, and not one spelled like \textquotedblleft Path\textquotedblright{}
which is common on NT based Windows versions. See the win32 specific
part of the FAQ on the FPC website for more info. 
\item [{\index{Cygwin}Cygwin}] provides maximal compatibility with Unix,
and can be seen as a Unix compatibility layer. FPC however is really
native on windows, and having half a windows, and half a (compatibility)
unix build system is hard to maintain. FPC does compile with a current
Cygwin install though, but the resulting compiler is no cygwin program.
Also cygwin programs need cygwin1.dll in the correct version . Note
: FPC can link to cygwin, however doesn\textquoteright t need it for
operation (except for the textmode IDE). Recently, Cygwin improved
in native path support, if the paths are fully qualified. Mingw is
still better, but cygwin is usable for emergency operation. 
\item [{go32v2\index{go32v2}}] Go32v2 is dos based, and used via the dos
compatibility system of Windows, don\textquoteright t use it with
the win32 compiler, it would be like using the win32 tools via Wine
on Linux :-) 
\end{description}
A common problem I encountered on win32 is putting the cygwin \textquotedblleft bin\textquotedblright{}
directory in the win32 search path. The mingw make.exe finds the cygwin
shell, and tries to execute certain programs with it. Cygwin has improved
a lot recently though, and currently this seems to work again, at
least if everything is situated on one drive (one can recompile FPC
with only cygwin and a FPC commandline compiler). 

Note that some other development tools (Borland, Microsoft, java)
might also package a make version. Always put FPC as the first directory
in the PATH. 

Due to some new developments with parallel compiling using the FPC
makefiles, \textbf{make 3.80 is strongly recommended as of FPC 2.1.1
(januari 2007 and later)}\emph{.} Unix people with dual cores and
up to date source trees might want to try \textquotedblleft \index{make -j 2}make
-j 2\textquotedblright .


\subsection{FPC itself. ppc386, ppcppc, ppcsparc, fpc. }

Free Pascal is written primarily in itself, in the Pascal dialects
it supports. This has some consequences for beginning the bootstraps. 
\begin{itemize}
\item A normal build of FPC is pretty much only doable with FPC as starting
compiler.
\item Bootstrapping from Delphi was possible for a while under certain circumstances,
but required more skill than plain fpc based bootstrapping, since
the make- files don\textquoteright t support it. Delphi compatibility
has been neglected, since too many Delphi bugs and versioning issues
popped up, and keeping it compilable was a problem. Somewhere between
1.9.4 and 1.9.6 most Delphi workarounds were removed. Newer versions,
starting with D2005 were never tested. The possibility with Delphi
as starting compiler probably failed because while Delphi would have
been great from an availability point, it was easier to use FPC because
of the permanent state of Delphi\textquoteright s bugs, and the large
number of versions in use. 
\item Bootstrapping from TP should possible for 1.0.x versions and earlier.
1.1.x uses delphi classes. However post 0.99.8, already quite some
mastership was required for this to work, since the compiler is a
large program, and the single data segment limitation of TP was a
severe limitation require all kinds of special defines to keep the
size down (which had to be regularly re-evaluated)
\item Bootstrapping from GNU GPC or p2c is not doable. Their TP modi are
not even close to being TP/BP compatible enough, and FPC 1.1.x and
beyond need Delphi compatibility. 
\item Bootstrapping though VP might be doable in theory, at least for 1.0.x
with some considerable skill. This has never been tested though, since
FPC is better on nearly all platforms anyway for basic recompilation,
and less buggy. 
\end{itemize}
The reasons for these choices belong in an advocacy document rather
than here.\footnote{The FAQ lists some reasons, but IMHO not all. }

However practically there is one major disadvantage: you need FPC
to build FPC, and one major advantage: FPC generally needs much less
tools installed to build, compared to e.g. a GCC build. One also needs\textbf{
only }a suitable\textbf{ compiler binary} to bootstrap FPC, not even
a fully fledged FPC installation. (on platforms that don\textquoteright t
come with it, you need the GNU build tools though, see paragraphs
above), and there are essentially \textbf{no library requirements}. 

With the internal linker, in time even the GNU tool requirements may
disappear, allowing a single compiler binary to fully bootstrap the
whole FPC/Lazarus project. 

The file you need to start an ordinary snapshot build is \textquotedblleft ppc<processor>\textquotedblright ,
so ppc386\index{ppc386} for x86, ppcppc for PowerPC. ppcsparc\index{ppcsparc}
for Sun Sparc V8 systems, ppcx64\index{ppcx64} for x86\_64\index{x8664@x86\_64}
(64-bit x86) etc. Till now these files always have been statically
linked. so there is only one Linux/x86 compiler, one FreeBSD compiler
etc. Kernel, library and distribution versions don\textquoteright t
matter. (except maybe major kernel changes in extreme, rare cases
like Linux 1.0.x to 2.0.x) 

For crossbuilds to the same processor but a different OS you don\textquoteright t
need a special cross-compiler\footnote{Assuming the target platform is established. For bleeding edge targets,
ask on the fpc-devel mailing list}. Only for crossbuilding to different processors you\textquoteright ll
need a different one.

Besides this, there is the \textquotedblleft{} \textbf{fpc}\index{fpc(binary)}\textquotedblright{}
binary. This is a common frontend to all ppc<cpu> compilers on a system,
one that compiles for the current architecture and one that compiles
for the rest. The reason for this is that one can use one binary,
and specify the processor with -P. So 
\begin{lyxcode}
fpc~-Ppowerpc~compileme.pp~
\end{lyxcode}
will compile \textquotedblleft compileme.pp\textquotedblright{} using
the PowerPC (ppcppc\index{ppcppc}) compiler if everything is set
up correctly. But we\textquoteright ll get into that later :-) 

The fpc binary can also be used to set compiler version: 
\begin{lyxcode}
fpc~-V1.0~compileme.pp~
\end{lyxcode}
will execute the default compiler (ppc<current processor>) with -1.0
suffixed. Combining with -P is possible. fpc -Ppowerpc -V1.0 will
try to run a binary ppcppc-1.0 as the real compiler. Specially on
Unix this is nice, since only a couple of symlinks allow to switch
versions easily. 

Combined with a masterfully created fpc.cfg file one can build very
powerful crosscompiling systems that autoselect the right targets.
We\textquoteright ll get to that later. 


\subsection{Other external tools}

Sometimes there are other platform dependant tools. Most notably the
Windows resource compiler windres to compiler resourcescripts ({*}.rc)
and dlltool to generate importlibs for FPC generated DLLs so that
certain other compilers (MSVC, mingw) can use them.


\subsection{Other FPC internal tools}

\textbf{Other} tools you might occasionally need:
\begin{description}
\item [{fpcres}] the resource compiler
\item [{data2inc}] A tool to convert various input formats to includefiles.
Usually used for binary to .inc conversion. 
\item [{fpcmake}] A tool to generate makefiles (basically expands Makefile.fpc
to Makefile using a built-in template). In case of problems pass FPCMAKE=(g)echo
to disable it
\item [{fpmake,fppkg}] see separate paragraph (t.b.d)
\end{description}
These tools are not strictly necessary, but the makefiles will invoke
them if timestamps of certain files are corrupted, and the original
is newer than the generated .inc or res file. Touching the xx.inc
file with a touch util can help.


\section{Obtaining source }


\subsection{Introduction }

Right after the FPC 2.0 release, the FPC project change to use SVN
as source version management system, for reasons mostly related to
merging and branching. 

Usually when building a snapshot, the source is obtained via SVN,
and comes as a large source tree with fpc/ as the root directory of
the repository. However the source is usually also downloadable as
an archive from the main site\footnote{\textbackslash{}href\{ftp://ftp.freepascal.org/pub/fpc/snapshot/v26/source/fpc.zip\}\{ftp://ftp.freepascal.org/pub/fpc/snapshot/v26/source/fpc.zip
(2.6.x)\}}\footnote{\textbackslash{}href\{ftp://ftp.freepascal.org/pub/fpc/snapshot/v27/source/fpc.zip\}\{ftp://ftp.freepascal.org/pub/fpc/snapshot/v27/source/fpc.zip
(2.7.x development series)\}}. This archive is getting larger each month though, and is already
25M zipped.

A better way is to get the sources via SVN, which allows to upgrade
sources to more recent versions incrementally. (i.o.w. the second
time, it only downloads changes)


\subsection{SVN Modules}

The FPC and Lazarus source is spread out over several SVN modules:

\begin{tabular}{|l|l|}
\hline 
{\small{}Module } & {\small{}Description}\tabularnewline
\hline 
\hline 
{\small{}fpc} & {\small{}The core FPC repository. Contains compiler, RTL, textmode
IDE and most non visual libraries }\tabularnewline
\hline 
{\small{}fpcdocs} & {\small{}The FPC documentation source (in \LaTeX and fpdoc XML format)}\tabularnewline
\hline 
{\small{}fpcprojects} & {\small{}Projects not yet suitable for distribution together with
FPC are parked here. (includes IRC bot)}\tabularnewline
\hline 
{\small{}fpcbuild} & {\small{}Contains fpc and fpdocs tree as well as the install and demo
dirs and a makefile for release packaging.}\tabularnewline
\hline 
{\small{}lazarus } & {\small{}The Lazarus project (visual classes library LCL and the Lazarus
IDE/RAD)}\tabularnewline
\hline 
\end{tabular}


\subsection{Downloading source via SVN }

To check out\index{Checkout(SVN)} a module, use the follow line:
\begin{lyxcode}
svn~co~http://svn.freepascal.org/svn/<module>/trunk~<module>~

\#

\#~Examples:~

\#~

\#~FPC~

\#~svn~co~http://svn.freepascal.org/svn/fpc/trunk~fpc~

\#~

\#~fpcdocs~

\#~

svn~co~http://svn.freepascal.org/svn/fpcdocs/trunk~fpcdocs~

\#~

\#~fpcprojects~(has~no~branches,~maybe~you~don't~need~/trunk~at~the~end)~

\#~

svn~co~http://svn.freepascal.org/svn/fpcprojects/trunk~fpcprojects~

\#~

\#~lazarus~

\#~

svn~co~http://svn.freepascal.org/svn/lazarus/trunk~lazarus~
\end{lyxcode}
To check out a branch, replace \textquotedblleft trunk\textquotedblright{}
in the above lines with the branches/<branch name>. E.g. to check
out the branch fixes\_2\_6: 
\begin{lyxcode}
svn~co~http://svn.freepascal.org/svn/fpc/branches/fixes\_2\_6~fpc-2.6.x~
\end{lyxcode}
Specific releases are tagged with a tag that is formated like \index{RELEASE222@RELEASE\_2\_2\_2}RELEASE\_2\_6\_0
, and can be checked out like this: 
\begin{lyxcode}
svn~co~http://svn.freepascal.org/svn/fpc/tags/RELEASE\_2\_6\_0~fpc-2.6.0
\end{lyxcode}

\subsection{Updating\index{Updating(SVN)} the source via SVN }

The advantage of getting source via SVN is of course the incremental
updating. This is very simple with SVN, simply use \textquotedblleft svn
up x\textquotedblright , if x is a directory where you have checked
out something before. http path, fixes and branches are automatically
read from the system. 

Examples: 
\begin{lyxcode}
svn~up~fpc~

\#~

svn~up~fpc-2.6.0
\end{lyxcode}

\subsection{Reverting\index{Reverting(SVN)} SVN checkouts }

Something new in SVN is reverting. If local edits cause conflicts
when updating your checkout, or if you want to be 100\% sure that
there are no local edits, you should revert your checkout, to make
sure that your local copy is really in sync with the SVN server. 

You should do this if you\textquoteright re having a problem that
other people on IRC and mailing lists can\textquoteright t duplicate,
and your starting compiler is correct. 

Examples: 
\begin{lyxcode}
svn~revert~-R~fpc~
\end{lyxcode}

\subsection{Exporting\index{Exporting(svn)} (win32/64 users, read this!) }

Exporting is basically retrieving a local working copy from a checkout.
Typical reasons to build in an export instead of a checkout are: 
\begin{itemize}
\item You are doing a release build. E.g. making RPMs, debs, freebsd ports
entries etc. 
\item You are building on win32 , and want to use \textquotedblleft make
install\textquotedblright{} to install the build, AND you want to
install examples.
\end{itemize}
The problem on windows is that some tools get confused by the read-only
attributes set on administrative files by some SVN clients. Since
svn export only copies the repository\textquoteright s content, and
not the administrative files, this is a good workaround. Exporting
is effectively copying, so this workaround takes about the same time
and space as manually copying the checkout. 

The format of the export command is: 
\begin{lyxcode}
svn~export~path\textbackslash{}to\textbackslash{}checkout~exportdirectory~
\end{lyxcode}
Example: 
\begin{lyxcode}
svn~export~d:\textbackslash{}fpc~fpcexport~

or~

svn~export~/usr/local/src/fpc~fpc~
\end{lyxcode}
If the second argument already exists, SVN will refuse to do this.
In that case use \textendash force to force svn to update. 

\textbf{Not}e 1: I haven\textquoteright t tested this yet, but cleaning
the repository before exporting could speed up somewhat, specially
on windows.

Note 2: For a \textbf{faster solution} see the build tricks section.


\subsection{(dist)Clean before update}

In general a FPC repository should clean the files it generates. However
when tracking branches, the files that are generated might vary, and
already built files may not be removed, since they belong to units
deleted or moved in the new revision.

Therefore it is generally better to first call ``make distclean''
before updating the repository.


\subsection{More info about SVN }

More info about FPC and SVN can be found here \href{http://www.freepascal.org/wiki/index.php/SVN\_Migration}{http://www.freepascal.org/wiki/index.php/SVN\_Migration}


\section{Extension\index{Extensions (file-)} conventions }

FPC defines some extensions that need some clarification: 
\begin{description}
\item [{.o}] The actual code of a compiled unit or main program 
\item [{.a}] The actual code of a compiled unit or main program when smartlinking. 
\item [{.ppu}] The rest of the compiled unit that is not actual code. (like
information about directives that where defined when compiling, the
parsed interface etc) 
\item [{.s}] Assembler code (to be assembled .o) generated by the compiler. 
\item [{.as}] Assembler code in source form (there never was a pascal equivalent).
Usually program startup code. 
\item [{.s}] files. .rst resourcestring files for internationalisation. 
\item [{.\$\$\$}] temporary files. Can be safely removed usually 
\item [{.res}] Windows or OS/2 resource file 
\item [{link.res}] Linker script file. Contains which files make up the
binary, and what external libraries are used. NOT a windows resource
file.
\item [{ppas.sh}] (or .bat) batchfile that calls the linker with the correct
arguments. 
\item [{{*}.lrs}] Lazarus resources, old style
\item [{{*}.rc}] Resource source file, to be processed by windres to .res
\end{description}
\footnote{The extensions on win32 originally ended in ``w'' ({*}.ow, {*}.ppw),
which was done to avoid confusion with dos compilers on the same system.
However this has been superceded by a better directory structure which
was needed for easy crosscompiling, and in the 1.1.x/1.9.x branch
the extensions for win32 are renamed back to .ppu/.a/.o }

So in the FPC distribution you will find a .ppu, an .a and an .o per
compiled unit.


\section{\index{Directory layout}Directory layout \label{sec:Directory_layout}}

Essentially the FPC layout is quite flexible. The binary (ppc386,
ppc68k or ppcppc) must be able to find a configuration file, and that
file can then specify the rest of the configuration. So the layouts
described here are the default layouts as installed by the releases.
Some, like the Dos (go32v2) port have a simpler layout, due to platform
limitations.

The base installation of FPC has these main categories: 
\begin{description}
\item [{binaries}] The base binaries (fpc, ppc68k, ppcppc, ppcsparc, ppcarm
and ppcx64) must be in the search PATH of the OS. If you execute fpc,
fpc must be able to find the other ones (ppcppc, ppc386 etc), also
via the PATH. 
\item [{\index{fpc.cfg}fpc.cfg}] The binary must be able to find the configuration
file in one of the default locations as specified for that OS. (see
platform dependant sections) 
\item [{units}] The configuration file must define the correct path to
the RTL and other packages compiled for that platform and cpu. This
is usually a tree. Crosscompile units also belong in this tree. 
\item [{help}] In future versions, this will be the directory where the
CHM files for the textmode IDE reside.
\item [{doc}] documentation (pdf)
\item [{doc-html}] documentation html, can also double as help for textmode
IDE.
\item [{(binutils)}] The binutils (LD,AS,AR) have to be in the PATH, or
their directory should be specified in the fpc.cfg file or on the
commandline with the -FD parameter. On operating systems that don\textquoteright t
install the binutils by default, these are installed by the FPC installation
process in the same directory as the main binaries, so this is usually
not a problem when not crosscompiling or mixing two FPC installations
(e.g. a DOS and Windows installation on one machine). Note that specifying
in the fpc.cfg file only works when compiling programs by hand. When
compiling a new compiler, the fpc.cfg file is ignored by the makefile.
\end{description}
Besides these there are source tree, documentation,the compiler localisation
(language) and example directories. However these are only interesting
for real release distribution engineering,and don\textquoteright t
influence the workings of the compiler itself. This because the compiler
has the source already in compiled form in the .o, .a and .ppu files
in the units directory. The place of the source doesn\textquoteright t
really matter. The only thing that needs the source directory for
automated processing is lazarus, and one can enter any path in Lazarus\textquoteright{}
FPC source dialogue. 

When writing paths in fpc.cfg, some substitutions are automatically
done, e.g. 
\begin{description}
\item [{\$FPCTARGET\index{FPCTARGET@\$FPCTARGET}}] is replaced by the
architecture - operating system combination you are compiling for.
(e.g. i386-linux) 
\item [{\$FPCVERSION\index{FPCVERSION@\$FPCVERSION}}] is replaced by the
version of the FPC compiler reading it, and finally 
\item [{\$FPCCPU\index{FPCCPU@\$FPCCPU}}] is replaced by the processor
which the compiler is targeting. 
\item [{\$FPCOS\index{FPCOS@\$FPCOS}}] is replaced by the operating system. 
\item [{\$FPCFULLVERSION\index{FPCFULLVERSION@\$FPCFULLVERSION}}] is replaced
by a compiler version with an extra patchlevel. (2.4.x+) 
\item [{\$FPCDATE\index{FPCDATE@\$FPCDATE}}] is replaced by the current
date.
\end{description}
Since filesystems hierarchies differ with the OS, I\textquoteright ll
put some OS specific information in the following sections.


\subsection{Unix (and full clones like Linux) \label{sub:unix dir layout}}

Under Unix, most directories are relative to the so called prefix.
A prefix is a kind of root directory for package installing. Common
prefixes are /usr, /usr/local, /usr/exp and /usr/pkg (the last one
is common on NetBSD). 

The usual convention is that programs that come with the base-distribution
go into /usr, and hand-compiled or hand-installed packages go to /usr/local.
However the definition of base-distribution varies with the distribution
and OS. The main idea is to give root (the administrator) trusted
users the ability to install and manage less important packages in
/usr/local while keeping the base system only writable for the administrator
(group) himself. Linux distributions are traditionally more likely
to install packages into /usr instead of /usr/local, but not every
distribution does that. \textquotedblleft man hier\textquotedblright{}
should list some of the conventions used on your Unix version.

If directories are relative to a prefix, they are noted as \$PREFIX/the/rest/of/the
path. Note that this has nothing to do with \$FPC<x> substitutions
in fpc.cfg. \$PREFIX is shellscript notation for \textquotedblleft get
content of environment variable PREFIX\textquotedblright . Compiled
units go into \$PREFIX/fpc/\$FPCVERSION/units/\$FPCTARGET. Units used
for crosscompiling also go into \$PREFIX/fpc/\$FPCVERSION/units/\$FPCTARGET.

Binaries go into directory \$PREFIX/bin, however sometimes these are
only symlinks to the actual files in \$PREFIX/lib/fpc/\$FPCVERSION
directory to easily switch versions. Since the binary can find its
own unit files using versioned info in fpc.cfg when properly set up,
usually the default binary is the only thing that needs to be swapped. 

The place where configuration files are searched on unix are: /etc/fpc.cfg,
\textasciitilde{}/.fpc.cfg. \$PREFIX/etc/fpc.cfg is searched from
1.9.8 onwards. (note; \textasciitilde{} means home directory on Unix)

So let\textquoteright s take \$PREFIX=/usr/local, \$VERSION=2.6.0,
\$FPCCPU=i386, \$FPCOS=freebsd and \$FPCTARGET=i386-freebsd as an
example, and see what file goes where:

\begin{tabular}{|l|l|l|}
\hline 
{\small{}File(s)} & {\small{}location } & {\small{}remarks}\tabularnewline
\hline 
\hline 
{\small{}fpc} & {\small{}/usr/local/bin} & \tabularnewline
\hline 
{\small{}ppc386} & {\small{}/usr/local/bin} & {\small{}actually symlinked to /usr/local/lib/fpc/2.6.0/ppc386}\tabularnewline
\hline 
{\small{}ppcppc} & {\small{}/usr/local/bin} & {\small{}actually symlinked to /usr/local/lib/fpc/2.6.0/ppcppc}\tabularnewline
\hline 
{\small{}rtl for i386-freebsd} & {\small{}/usr/local/lib/fpc/2.6.0/units/i386-freebsd/rtl} & \tabularnewline
\hline 
{\small{}rtl for i386-linux} & {\small{}/usr/local/lib/fpc/2.6.0/units/i386-linux/rtl } & {\small{}(cross operating system compiling)}\tabularnewline
\hline 
{\small{}rtl for powerpc-netbsd} & {\small{}/usr/local/lib/fpc/2.6.0/units/powerpc-netbsd/rtl} & {\small{}(cross architecture and OS compiling, endianness) }\tabularnewline
\hline 
{\small{}rtl for x86\_64-win64} & {\small{}/usr/local/lib/fpc/2.6.0/units/x86\_64-win64/rtl} & {\small{}(cross arch, OS, wordsize)}\tabularnewline
\hline 
\end{tabular}


\subsection{Windows and Dos }

The windows and dos case is pretty much the same. Except that \$FPCTARGET=i386-win32
for windows, and \$FPCTARGET=i386-go32v2 for dos.\textbf{ It is advised
to avoid using spaces in directory names. While (win32) fpc can handle
it, some versions of the binutils and other tools can not (yet), or
need carefully placed quotes. }

Both these two OSes have a specific directory with all FPC related
files (including the documentation etc) in them, default is usually
used to be c:\textbackslash{}pp, but has been changed to c:\textbackslash{}fpc\textbackslash{}2.4.0
since 2.0. I call this path \$INSTALLDIR. Usually there aren\textquoteright t
other versions in the same \$INSTALLDIR A different version means
a different \$INSTALLDIR, at least in the default situation. 

All binaries go into \$INSTALLDIR\textbackslash{}bin\textbackslash{}\$FPCTARGET.
This directory should be in the PATH. This directory is quite full,
since there are other tools and utilities installed. However if the
target is marked to require 8.3 compatible naming (Go32v2, OS/2),
the binary path is not \$FPCTARGET (e.g. bin/i386-go32v2) but just
\$FPCOS (e.g. bin/go32v2).

Compiled units go into \$INSTALLDIR\textbackslash{}units\textbackslash{}\$FPCTARGET
and deeper, at least under 2.0+. 

Configuration files are searched in the same directory as the binary
(\$INSTALLDIR\textbackslash{}bin\textbackslash{}\$FPCTARGET), but
if a environment variable HOME exists also in \%HOME\%/.fpc.cfg.

So let\textquoteright s assume \$INSTALLDIR=c:\textbackslash{}fpc\textbackslash{}2.6.0
and the default \$FPCTARGET=win32 

\begin{tabular}{|l|l|l|}
\hline 
{\small{}File(s)} & {\small{}location } & {\small{}remarks}\tabularnewline
\hline 
\hline 
{\small{}fpc} & {\small{}c:\textbackslash{}fpc\textbackslash{}2.6.0\textbackslash{}bin\textbackslash{}i386-win32} & \tabularnewline
\hline 
{\small{}ppc386} & {\small{}c:\textbackslash{}fpc\textbackslash{}2.6.0\textbackslash{}bin\textbackslash{}i386-win32} & \tabularnewline
\hline 
{\small{}ppcrossppc} & {\small{}c:\textbackslash{}fpc\textbackslash{}2.6.0\textbackslash{}bin\textbackslash{}i386-win32} & \tabularnewline
\hline 
{\small{}rtl for i386-win32} & {\small{}c:\textbackslash{}fpc\textbackslash{}2.6.0\textbackslash{}units\textbackslash{}i386-win32\textbackslash{}rtl} & {\small{}(cross architecture and OS compiling) }\tabularnewline
\hline 
{\small{}rtl for i386-linux} & {\small{}c:\textbackslash{}fpc\textbackslash{}2.6.0\textbackslash{}units\textbackslash{}i386-linux\textbackslash{}rtl} & {\small{}(cross operating system compiling)}\tabularnewline
\hline 
{\small{}rtl for powerpc-netbsd} & {\small{}c:\textbackslash{}fpc\textbackslash{}2.6.0\textbackslash{}units\textbackslash{}powerpc-netbsd\textbackslash{}rtl} & \tabularnewline
\hline 
{\small{}rtl for x86\_64-win64} & {\small{}c:\textbackslash{}fpc\textbackslash{}2.6.0\textbackslash{}units\textbackslash{}x86\_64-win64/\textbackslash{}rtl} & \tabularnewline
\hline 
\hline 
{\small{}Cross binutils} & {\small{}c:\textbackslash{}fpc\textbackslash{}2.6.0\textbackslash{}cross} & {\small{}(not installed by default setup) }\tabularnewline
\hline 
\hline 
{\small{}libs for i386-win32} & {\small{}c:\textbackslash{}fpc\textbackslash{}2.6.0\textbackslash{}libs\textbackslash{}i386-win32} & {\small{}(not installed by default setup) }\tabularnewline
\hline 
\hline 
{\small{}libs for i386-linux} & {\small{}c:\textbackslash{}fpc\textbackslash{}2.6.0\textbackslash{}libs\textbackslash{}i386-linux} & {\small{}(not installed by default setup) }\tabularnewline
\hline 
\end{tabular}


\subsection{Where are my units? }

Starting with later versions of FPC 1.9.5, the fpc makefiles create
a directory to store the created units. The main reason for this is
building for multiple targets without cleaning in between. 

So when just build (not installed), the rtl units files are in fpc/rtl/freebsd/units/\$FPCTARGET.
This is a silly example of course, since the RTL is platform specific,
but this change is systematic, so for the RTL too.


\section{The fpc.cfg\index{cfg} configuration file }

\textbf{Note: }Former versions used \index{ppc386.cfg}ppc386.cfg
as configuration file. Even latere 1.0.x versions already support
fpc.cfg. In time ppc386.cfg will be dropped, so \emph{please} use
fpc.cfg.

A correct configuration file should at least do the follow things: 
\begin{enumerate}
\item ( \textbf{most important }) Provide the place where to find the correct
precompiled units for the current selected operating system and architecture.
In IDE\textquoteright s this option is usually called UNITPATH\index{UNITPATH}
Option:\textbf{ -Fu\index{-Fu} }
\item If other binutils then for the default platform need to be used (like
in the case of crosscompiling), then fpc.cfg should allow the compiler
to find them. I don\textquoteright t know what name IDE\textquoteright s
typically use for this, but BINUTILS PATH\index{BINUTILS PATH} or
GNU UTILS PATH would be appropriate Option: \textbf{-FD\index{-FD}} 
\item Extra paths where static and shared libraries are searched. Often
called library path Option: \textbf{-Fl\index{-Fl} }
\item ( minor ) By default the compiler shows only very little errors, warnings
and information. It\textquoteright s convenient to add some verbosity
parameters to fpc.cfg. Option \textbf{-vihw -l}. \footnote{The warning system is currently being expanded to have more flexibility. }
\item (crosscompiling) Binutils for cross compiling are often prefix with
cpu-operatingsystem(e.g. i686-ming32),this prefix can be specified
using -XP<prefix> parameter, or using makefiles using BINUTILSPREFIX\index{BINUTILSPREFIX}.
Option \textbf{-XP\index{-XP}} 
\end{enumerate}
There are other interesting possibilities of fpc.cfg, (like internationalised
errormessages, setting the compiler in a different mode per default,
always to try smartlinking etc) but these are the important ones for
normal development.

\textbf{Note: }Keep in mind that when using the makefiles supplied
with the FPC source, the fpc.cfg is \textbf{NOT} read. This is to
avoid problems with two RTLs, the old and the new one, when bootstrapping
the system.


\subsection{Unit path -Fu\index{-Fu} }

The -Fu case is pretty much as described in the directory layout paragraphs
(\ref{sec:Directory_layout}), there are two things in which the -Fu
compiler option differs from the directory layout as described before.
If I append an asterisk ({*}) to a path, it means that it should search
all directories below that directory too, and that the layout for
crosscompiled units is a bit different.

We can use the directive \index{FPCCROSSCOMPILING@FPC\_CROSSCOMPILING}FPC\_CROSSCOMPILING
to detect crosscompilation. The FPC manual has a list of other defines
that can be tested.

\textbf{Unix:} If we assume that the compiler is installed to PREFIX
/usr/local, and we are using FreeBSD/i386 as host OS, this becomes: 
\begin{lyxcode}
\#~This~is~pretty~generic~for~OSes~with~{*}nix~filesystem~layout~

-Fu/usr/local/lib/fpc/\$FPCVERSION/units/\$FPCtarget/{*}~

\#....or~suitable~for~crosscompiling.~Note~that~the~/cross/~dir~is~not~necessary~

\#~and~only~added~as~example.~

\#ifdef~FPC\_CROSSCOMPILING

\#~OS~not~default~->~CROSS~

-Fu/usr/local/lib/fpc/\$FPCversion/cross/\$fpctarget/units/{*}~

\#else~

~\#ifndef~cpu86\index{cpu86}~

~\#~Processor~not~default~->~CROSS~

~~-Fu/usr/local/lib/fpc/\$FPCversion/cross/\$fpctarget/units/{*}~

~\#else~

~~-Fu/usr/local/lib/fpc/\$FPCVERSION/units/\$FPCtarget/{*}~

~\#endif~

\#endif~
\end{lyxcode}
Win32 and Dos installed in c:\textbackslash{}fpc\textbackslash{}2.4.0 
\begin{lyxcode}
-Fuc:\textbackslash{}fpc\textbackslash{}2.4.0\textbackslash{}units\textbackslash{}\$FPCtarget\textbackslash{}{*}~

\#~or~suitable~for~crosscompiling~

\#~OS~not~default~->~CROSS~

-Fuc:\textbackslash{}fpc\textbackslash{}2.4.0\textbackslash{}units\textbackslash{}\$fpctarget\textbackslash{}{*}~

\#~win32~binutils~are~in~the~path~

\#ifndef~win32~

\#~set~path~to~crossutils.~Assuming~in~one~dir.~

-FDc:\textbackslash{}fpc\textbackslash{}2.4.0\textbackslash{}bin\textbackslash{}cross~

\#~this~is~not~100\%~safe.~GNU~and~FPC~target~naming~differ~

-XP\$FPCTARGET-~

\#endif~
\end{lyxcode}
Keep in mind that extra paths (e.g. for own custom packages) can be
added. There is also no reason not to use \$FPCVERSION in the win32
case. It is just an example.


\subsection{Binutils path -FD\index{-FD} }

The problems with binutils 
\begin{enumerate}
\item We only have to set -FD if we set up for crosscompiling. Either when
cross compiling to a different processor or a different OS. So we
have to determine default OS and CPU somehow.
\item Under Unix, there are usually specific dirs for crossutils, but the
exact place and name differs with version. Win32 doesn\textquoteright t
have something like that at all. For win32 I propose an example layout
as described above. 
\item FPC and GNU platform naming differ
\end{enumerate}
\textbf{Unix} : As an example I take FreeBSD on an ordinary PC. The
location below (/usr/local/processor-operatingsystem) is where the
binutils base distribution installs cross compiled utils by default
under FreeBSD. However sometimes how FPC names an OS can differ from
how the binutils name it. In that case you have to be more verbose,
which I have done for the case of crosscompiling to windows\footnote{{\small{}Lazy people simply would make a symlink from the fpc naming
to the binutils naming. However being lazy is not allowed for tutorial
writers.}} . 

So our configuration file becomes: 
\begin{lyxcode}
\#ifdef~FPC\_CROSSCOMPILING\index{FPCCROSSCOMPILING@FPC\_CROSSCOMPILING}

\#~other~binutils~if~OS~differs~

\#ifdef~win32~

\#~win32~is~an~exception~

\#~FPC~OS~name~:~win32~Binutils~OS~name~:~mingw32~

\#~FPC~processor:~i386~Binutils~processor:~i686~

-FD/usr/local/i686-unknown-mingw32/bin~

\#else~\#~we~hope~that~the~fpc~and~binutils~name~match:-)~

-FD/usr/local/\$FPCTARGET/cross~

\#endif~

\#else~

\#ifndef~cpu86~

\#~other~binutils~if~processor~differs~

-FD/usr/local/\$FPCTARGET/cross~

\#endif~\#endif~
\end{lyxcode}
Win32 and Dos: Pretty much the same. However contrary to Unix I haven\textquoteright t
really tested this. Again I assume FPC to be installed in c:\textbackslash{}fpc\textbackslash{}2.4.0
.However the binutils are in d:\textbackslash{}binutils and deeper
and named like under {*}BSD:
\begin{lyxcode}
\#ifndef~win32~

\#~other~binutils~if~OS~differs~

-FDd:\textbackslash{}binutils\textbackslash{}\$FPCTARGET\textbackslash{}bin~

\#else~

\#ifndef~cpu86

\#~other~binutils~if~processor~differs~

-FDd:\textbackslash{}binutils\textbackslash{}\$FPCTARGET\textbackslash{}bin

\#endif~

\#endif~
\end{lyxcode}
\textbf{Using makefiles }

When using makefiles, one can set the -FD parameter by passing CROSSBINDIR\index{crossbindir@CROSSBINDIR}=<path>
to make. This ensures that the parameter is passed correctly from
makefile to makefile (in nested directory hierarchies).


\subsection{Binutils prefix, all binutils in one directory}

A somewhat newer addition is the -XP\index{-XP} parameter which sets
a prefix for all binutils, so if you add \textbf{-XPbla-die-bla-}
to the fpc commandline then all calls to as and ld will be prefixed
with \textbf{bla-die-bla-} . The main reason for this is that by default,
cross compiled binutils are named <cpu>-<target>-<filename>,and not
just <filename>.

When doing a cross snapshot (or cycle), setting the make variable
BINUTILSPREFIX\index{binutilsprefix@BINUTILSPREFIX} will make sure
that -XP is passed on the right moments. 

If we assume the binutils for cross compiling are all in one directory,
the above piece of code becomes:  
\begin{lyxcode}


\#ifdef~FPC\_CROSSCOMPILING

~\#~other~binutils~directory~if~processor~or~target~OS~differs~

~-FD/usr/local/cross/bin~

~\#~set~prefix~to~select~the~right~ones~from~that~directory:~

~-XP\$FPCTARGET-~

~\#endif~


\end{lyxcode}
This assumes that binutils naming of platforms is the same as FPC\textquoteright s.
It isn\textquoteright t however, there are a few exceptions: 

\begin{tabular}{|c|c|c|c|}
\hline 
{\small{}Usual name} & {\small{}FPC name} & {\small{}Binutils name} & {\small{}ppc<x> name}\tabularnewline
\hline 
\hline 
{\small{}(32-bit windows)} & {\small{}win32} & {\small{}cygwin or mingw32} & {\small{}(OS not CPU)}\tabularnewline
\hline 
{\small{}i386 or x86} & {\small{}i386} & {\small{}i386,i486,i586,i686} & {\small{}386}\tabularnewline
\hline 
{\small{}Sunos/Solaris} & {\small{}sunos} & {\small{}solaris} & \tabularnewline
\hline 
{\small{}PowerPC} & {\small{}powerpc} & {\small{}powerpc} & {\small{}ppc}\tabularnewline
\hline 
\end{tabular}

So for these targets we would have to make exceptions. (see e.g. script
code in the fpcbuild/install repository, e.g. samplecfg and install.sh)


\subsection{Library path -Fl\index{-Fl} \index{Library path}}

The library path is where static libraries (and shared libs under
unix) can be found. While this is very important for the Unix platform,
the FPC compiler on windows and dos also can link to GCC (and variants)
libraries, so FPC must be able to find them. 

The library path is of course target and processor dependant. One
couldn\textquoteright t link FreeBSD/x86 libraries to a Linux/Powerpc
binary. So essentially we are doing the same trick as with the unit
path. If the default targets are used, on unix it is set to the default
directories, otherwise it is set to some hierarchy where the user
is supposed to install his cross libraries.

\textbf{Unix} : As an example I take FreeBSD on an ordinary PC, because
most BSDs, specially on ordinary PCs have a \textquotedblleft compatibility\textquotedblright{}
Linux libraryset to run proprietary Linux programs for which no FreeBSD
version exists. This mode is called the Linuxator\footnote{The linuxator\index{linuxator} is strictly speaking an emulator.
However the emulation layer is so thin (a few 10\textquoteright s
of kbs) that there is no noticable performance loss. Since all libs
are in memory twice (Linux+FreeBSD) it eats some extra memory though. }. The Linuxator libs are usually SUSE based and in /compat/linux/
and deeper. NetBSD has a huge set of such emulations. Anyway, here
is the snippet, it assumes the user to build a hierarchy of cross
libs under /usr/local/crosslibs 
\begin{lyxcode}
\#undef~specialoscpu~



\#ifndef~FPC\_CROSSCOMPILING

\#define~specialoscpu~

\#~DEFAULT~

\#~libraries~outside~base~are~installed~with~PREFIX=/usr/local~

-Fl/usr/local/lib~

\#~however~X~stuff~is~installed~with~PREFIX=/usr/X11R6~

-Fl/usr/X11R6/lib~

\#endif~



\#ifdef~linux~

\#ifdef~cpu86~

\#~CROSS,~BUT~SPECIAL,~FreeBSD~optionally~has~a~Linux~userland~on~board~

\#~for~the~linuxator.~Usually~it~is~some~SUSE~version.~

\#define~specialoscpu~

-Fl/compat/linux/lib~

-Fl/compat/linux/usr/lib~

-Fl/compat/linux/usr/X11R6/lib~

\#endif~

\#endif~

\#~libraries~not~existing~on~target~by~default.~Reverting~

\#~to~special~cross~directories~

\#ifndef~specialoscpu~

-Fl/usr/local/crosslibs/\$FPCTARGET/lib~

-Fl/usr/local/crosslibs/\$FPCTARGET/usr/lib~

-Fl/usr/local/crosslibs/\$FPCTARGET/usr/local/lib~

-Fl/usr/local/crosslibs/\$FPCTARGET/usr/X11R6/lib~

\#endif~
\end{lyxcode}
\textbf{Win32 and Dos}: Exactly the same idea. Some directory with
the hierarchy (d:\textbackslash{}crosslibs for now), but none as default.
If you have a suitable gcc equivalent (djgpp for dos, cygwin and mingw
for win32), you could add it to the space for the default.
\begin{lyxcode}
\#ifndef~win32~

\#~other~binutils~if~OS~differs~

-Fld:\textbackslash{}crosslibs\textbackslash{}\$FPCTARGET\textbackslash{}lib~

-Fld:\textbackslash{}crosslibs\textbackslash{}\$FPCTARGET\textbackslash{}usr\textbackslash{}lib~

\#etc~

\#else~

\#ifndef~cpu86~

\#~other~binutils~if~processor~differs~

\#~maybe~somebody~does~a~port~for~win32/Sparc~or~so.~

-Fld:\textbackslash{}crosslibs\textbackslash{}\$FPCTARGET\textbackslash{}lib~

-Fld:\textbackslash{}crosslibs\textbackslash{}\$FPCTARGET\textbackslash{}usr\textbackslash{}lib~

\#else~

\#~DEFAULT~

\#endif~

\#endif~
\end{lyxcode}

\subsection{Verbosity options }

Well, there is not much to tell. The default is ok for normal use,
and I never change it in the fpc.cfg (I wrote it down below for completeness),
for more info see the manual. Note that any verbosity setting in fpc.cfg
can be overriden on the commandline (e.g. for debugging, typically
uses -va on the cmdline ) 
\begin{lyxcode}
\#~write~FPC~logo~lines.~

-l~

\#~Display~Info,~Warnings,~Notes~and~Hints~

-viwn~
\end{lyxcode}

\section{The order to compile parts of FPC}

Packages is a bit of an ambiguous term when used in the FPC project\footnote{See alsohttp://wiki.freepascal.org/packages \url{http://wiki.freepascal.org/packages}}.
Sometimes \textquotedblleft packages\textquotedblright{} refers exclusively
to the separate unit sets in the packages/ directory of the source
tree, sometimes it also includes the other separately compilable parts
of the project (like compiler, rtl, fcl, ide, fvision, lazarus, installer
and utils). In this paragraph it\textquoteright s the latter one. 

The directory structure of the packages has been reorganized starting
with FPC 2.2.4. \footnote{This reorganization was made possible with improvements in the fpcmake
system. However in time, the fpcmake system will disappear, and be
replaced with the fpmake/fppkg system that is already included for
testing in 2.2.4+}. Most importantly, the fpcmake system now figures out its own dependencies,
so all packages (including FCL and FV) could move to /fpc/packages.
This great simplifies building and maintenance of the packages. The
units of the FCL were also regrouped into multiple packages.

Of course there iss till a certain sequence one should follow when
building FPC, which is hardcoded in the top Makefile. This because
some packages need other packages and need to be build first. The
usual order is:
\begin{enumerate}
\item bootstrap the compiler (\index{make cycle}make cycle) 3x compiler,
3x rtl 
\item Rebuild the RTL smartlinking 
\item Build the packages directory including the FCL and FV packages.
\item Build the textmode IDE. 
\item utils/ directory including fpcmake in utils/fpcm 
\end{enumerate}
Lazarus can be built after the main build (with or without IDE). However
install the main build \emph{first}. Some directories are not built
at all in a standard build of the fpc repository:
\begin{enumerate}
\item demoes and example directories of packages
\item the regression testing suite (tests/) 
\end{enumerate}
Examples are often compilable by descending into the package directory
and executing ``\index{make examples}make examples''.


\subsection{Some interesting build scripts}

Some of these principles are used in some of the scripts used to build
releases, test crosscompiling etc. 
\begin{itemize}
\item fpc/installl/install.sh is the installer script for unix. Nicely demonstrates
platform name (GNU->FPC) conversion 
\item fpc/install/cross/buildcrossbinutils is a script to mass-build cross
binutils 
\item fpc/install/cross/buildcrosssnapshot is an attempt at building cross
snapshots. Works in principle, however the shared linking of mkxmlrpc
and the textmode IDE are troublesome. 
\item fpc/install/makepack is a release building script. It requires the
target name (i386-linux, i386-win32 etc) as parameter 
\end{itemize}

\section{Smart linking }

Smartlinking (ld/gcc documentation calls it dead code elimination
) essentially means avoiding linking of unused code into the final
binary. 

The problem is that the GNU linker can do dead code elimination, but
usually (read: with gcc) only does this on a compilation unit level.
In other words, it still will link in the entire unit when only one
file is used. 

Newer binutils use can do deadcode elimination based on sections,
however the problem with this is that it ups the version requirements
on binutils, which is a problem specially for operating systems as
classic MacOS, older Mac OS X versions, OS/2 etc. The new form is
also not entirely stable yet.

Using the old style smartlinking, FPC circumvents this by generating
a .o for each symbol in a unit. So each procedure, method, variable
or typed constant gets its own .o file. Since this can be thousands
of .o files in a unit (unit Windows has about 20000-30000),and the
.o files are added to an .a archive using GNU AR. 

All together this is a pretty complicated process: 
\begin{enumerate}
\item a unit is compiled by fpc to a lot of assembler source (.s) files,
\item that get assembled by a lot of calls to AS to generate a lot of .o
files 
\item that are read again by AR to form one .a file 
\end{enumerate}
.... which is why smartinking performance really benefits from the
binwriter (see \ref{par:Glossary}), which causes FPC to write the
.a directly without thousands of calls to AS.

Besides tightening code, smartlinking also solves a problem when a
unit interfaces to a shared library (unix .so or win32 .dll) and certain
unused calls aren\textquoteright t available. An example would be
if unit windows contains calls added in later Windows versions that
you don\textquoteright t use for your program and you work on/for
Windows 98. when not smartlinking, the whole of unit windows would
be linked in, and the linker wouldn\textquoteright t be able to find
the calls from later Windows versions in the Windows 98 kernel32.dll
and user32.dll.

Be careful when trying to guess the savings of smartlinking. Often
people forget unit initialisation (both of the unit in question, and
the unit it USES) and all the classes, procedures and functions the
initialisation uses are always linked in, and units (even if they
are unused) are always initialised, since the compiler can\textquoteright t
see that the effect of the initialisation on the working of the program
is zero. 

\textbf{A word of caution}: In C, an .o file usually corresponds to
one .c or .cpp file, so one .a contains <n> .o\textquoteright s that
correspond to <n> .c\textquoteright s. However under FPC, when smartlinking
per unit (.pp , .pas) the file that is ultimately written is an .a
which contains a lot of .o\textquoteright s. So an FPC .a corresponds
to one unit only. \footnote{At least for now, developments in library generation might change
this in time, but not before 2.4} An .o however is the same unit as the .a without smartlinking.

A known problem with old style smartlinking is its \textbf{memory
usage}. Ld doesn\textquoteright t manage a lot (100000+) of small
object files (.o) efficiently, and memory requirements increase enormously.
Smartlinking a fully static Lazarus wasn\textquoteright t possible
because it bombed out on my OS\textquoteright{} 512 MB memory limit
for ordinary processes, a rough estimate of the memory needed was
1.5 GB. A rule of thumb for memory usage in extreme cases is between
50 and 100 times the size of the final binary.

It seems that ld can do dead code elimination nowadays, however the
compiler needs to be adopted for this, and there is also some movement
in having an own internal linker. The advantages of this system is
less memory use by LD, and the fact that .a files will disappear (in
the new method, the smartlink data is added to the .o files). However
no matter how fast this becomes usable, old style smartlinking is
still needed for quite a while, for OSes with binutils that are not
recent or complete. 


\chapter{Standard building }

The start of the FPC buildprocess is bootstrapping a compiler. Bootstrapping
the compiler is the start of every build process, because changes
in the compiler source must be activated before one can start compiling
the libraries. Usually the bootstrap is only a minor part in an automised
snapshot or full build. However some knowledge about the process can
be handy for crosscompiling purposes and development on FPC itself. 

The other two typical build processes are building and installing
a snapshot, and building a release. Somewhat less streamlined are
building the IDE and documentation. Building Lazarus on the other
hand is fairly easy.

For the average user, building a snapshot and/or lazarus are the interesting
parts. 


\section{Cleaning }


\subsection{Make clean}

In nearly any place in the FPC tree a \textquotedblleft make clean\textquotedblright{}
will try to remove compiler generated files of snapshot or cycle building.
A \textquotedblleft \index{make distclean}make distclean\textquotedblright{}
in the upper level is even a bit more thorough, and also removes files
generated while building releases (zips etc) 

Note that the make files usually delete what they generate. So if
e.g. the generation of certain files depends on certain makefile defines
and/or compiler version, make sure that the right compiler and defines
are passed to make. 

A good check to see if the repository is clean, is to check standard
output and -error of the svn update process. If you see errors, then
revert the SVN checkout. 


\subsection{make distclean}

make distclean is the more rigorous way of cleaning. If you experiencing
build problems, always do this first. If you have snapshot scripts,
add make distclean in the top level dir as a first line. This became
a lot more important in 1.9.5, since recent 1.9.5\textquoteright s
store their units in a separate units/\$fpctarget hierarchy. Cleaning
before SVN update can speed up the SVN update process significantly,
specially on OSes that have relatively slow directory searching (like
windows and netbsd). It is a good habit to clean your checkout before
(svn) updating.


\subsection{Cleaning of crosscompile builds}

Note that the clean targets of the makefile only clean for current
\$FPCTARGET. To rigorously clean everything, kill all .o, .a and .ppu
files, and then SVN update again, to recover the few .o files in the
FPC tree (mostly for testsuite tests relating to C linking)


\section{Bootstrapping: make cycle }

\textquotedblleft make cycle\textquotedblright{} is a bootstrap of
the compiler, and builds the rtl and compiler at least three times. 

\emph{The only starting compiler that is guaranteed to work is the
most recent release compiler for that series}\footnote{E.g. For the 2.6.2, even though 2.4.4 will probably work, the only
guaranteed starting compiler is 2.6.0!}\emph{. }So if you have a problem in any aspect of building the FPC
source tree and you are not using the most recent release compiler,
\emph{please try first} with the most recent release compiler. It
is possible to specify the name of the starting compiler (see below),
so saving the release compiler under some name (I\textquoteright ll
use \emph{ppcrel} from now on in this tutorial) is advised. 

The make cycle process compiles RTL and compiler three times:
\begin{description}
\item [{RTL~1st}] Since the we start with only the starting compiler,
a new RTL must be built first before we can link a program. 
\item [{Compiler~1st}] A new compiler is created. However the new compiler
is still compiled by the release compiler, so newer optimisation and
changes aren\textquoteright t active yet in this binary. For that
reason, both the RTL and the compiler have to be rebuilt. 
\item [{RTL~2nd}] So we rebuild the RTL and... 
\item [{Compiler~2nd}] the compiler. However to make sure the compiler
is deterministic (compiles the same program to the same executable
each time it is run), the compiler and RTL are compiled......
\item [{RTL~3rd}] again.... 
\item [{Compiler~3rd}] and after building the compiler for the third time
the 2nd and 3rd compiler are compared to see if there they are the
same. If not, everything is compiled again. (for some rare secondary
effects)
\end{description}
This entire process is run by simply type \textquotedblleft make cycle\textquotedblright{}
in the compiler directory. If you want to use an alternative compiler,
specify it with \index{PP=}PP={[}full/path/to/{]}<compiler>. When
using the PP= option, use a compiler in the PATH or an absolute path,
not a relative path. Using a relative path usually won\textquoteright t
work since during the process, the make utility changes directories.
If you try to bootstrap without a full installation, you sometimes
need to specify \index{FPC=}FPC={[}full/path/to/{]}<compiler> 

Additional compiler options can be added using OPT\index{opt@OP\={T}}=\textquotedblright <the
options>\textquotedblright , often used options are turning on debugging
information with line information (-gl\index{-gl}), and increase
the verbosity level (-va). However since -va produces a \_lot\_ of
output, it is wise to pipe it to file.

Some examples: \footnote{The lines starting with \textquotedblleft \#\textquotedblright{} in
the example below are comments. Don\textquoteright t enter them }
\begin{lyxcode}
\#~go~to~the~right~directory~on~unix~



cd~/fpc/fpc/compiler~



\#~go~to~the~right~directory~on~windows~



cd~/d~d:\textbackslash{}repo\textbackslash{}fpc\textbackslash{}compiler~



\#~do~an~ordinary~make~cycle:~



make~cycle~



\#~Use~a~starting~compiler~in~the~OS~search~PATH~



make~cycle~PP=ppcrel~



\#~use~a~starting~compiler~with~(unix)~absolute~path~

\#~and~enable~line~info~and~debugging~



make~cycle~PP=/fpc/startcompilers/ppcrel~OPT=''-{}-gl''



\#~Use~LOTS~of~verbosity~in~the~process~and~redirect~it~to~file.~



make~cycle~OPT=''-va''~>cycle.log~
\end{lyxcode}

\section{Compiling a snapshot; make all or make build }

\textquotedblleft Make all\textquotedblright{} is the most important
build process, it essentially builds (but not installs) the general
purpose parts of the standard SVN tree (see 1.7), except sideways
related stuff like documentation, examples and tests. Installing is
one additional makefile command. 

In its simplest form, build a snapshot is checking out SVN (see 1.3.3),
and changing to the top fpc/ directory and call \textquotedblleft make
all\textquotedblright . Installing to the default location is done
by executing \textquotedblleft make install\textquotedblright . 
\begin{lyxcode}


cd~/fpc/fpc~make~all~

\#~lots~of~building.~Think~3~minutes~on~a~XP2000+,~10-15~minutes~on~a~500MHz~machine.~

make~install~~

\#~Installs~the~snapshot~to~the~default~location~

\#~(/usr/local/lib/fpc/\$FPCVERSION~and~deeper~probably)~

\#~

\#~or~on~Windows:~

cd~/d~d:\textbackslash{}repo\textbackslash{}fpc~

make~all~

make~install~COPYTREE=echo

\#~(default~is~c:\textbackslash{}pp\textbackslash{}~and~deeper)~
\end{lyxcode}
If you track FPC SVN very closely, this is probably what you\textquoteright ll
do quite often. However in some special cases, more parameters are
needed. Essentially this is building a snapshot. If you trick \textquotedblleft make
install\textquotedblright{} into installing in a different directory,
the contents of that directory are essentially the snapshot. 

The simplest variation is a different starting compiler. This can
be done by simply entering PP=<compiler> or PP=/full/path/to/<compiler>
after the \textquotedblleft make all\textquotedblright{} prompt:
\begin{lyxcode}
cd~/fpc/devel/fpc~

make~all~PP=/my/starting/compiler~

\#~lots~of~building.~Think~3~minutes~on~a~XP2000+,~10-15~minutes~on~a~500MHz~machine.~

make~install~

\#~Installs~the~snapshot~to~the~default~location~

\#~(/usr/local/lib/fpc/\$FPCVERSION~and~typically)

\#~

\#~or~on~Windows:~

cd~/d~c:\textbackslash{}repo\textbackslash{}fpc~

make~all~PP=ppcrel~

make~install~COPYTREE=echo

\#~(default~is~c:\textbackslash{}pp\textbackslash{}~and~deeper)~
\end{lyxcode}
A standard confusing detail when installing a snapshot is that the
target directory (e.g. /usr/local/lib/fpc/2.4.0) depends on the version
number. If you would follow the above sequence, and the generated
compiler (say version 2.5.1) is not equal to the starting compiler
(say version 2.4.0), then make install will install into the wrong
directory. The same goes for windows ( c:\textbackslash{}fpc\textbackslash{}2.4.0
... ) This can be solved by setting the compiler that is generated
in the \textquotedblleft make all\textquotedblright{} step as a starting
compiler to the \textquotedblleft make install\textquotedblright{}
step. This will ensure that the \textquotedblleft make install\textquotedblright{}
sequence gets the correct versioning info. Since we can\textquoteright t
use relative paths, this must be a full path: 
\begin{lyxcode}
cd~/fpc/devel/fpc~

make~all~PP=/my/starting/compiler/path/ppc386-someversion

\#~



\#~Now~install~using~the~NEW~compiler~for~the~correct~version~info:~

make~install~PP=/fpc/devel/fpc/compiler/ppc386~

\#~

\#~Installs~the~snapshot~to~the~default~location~

\#~(/usr/local/lib/fpc/\$FPCVERSION~and~deeper~probably)~

\#

\#~and~for~windows:

cd~/d~c:\textbackslash{}repo\textbackslash{}fpc

make~all~PP=c:\textbackslash{}fpc\textbackslash{}startingcompilers\textbackslash{}ppc386-someversion

\#~

\#~and~installing~use~the~NEW~compiler

make~install~PP=c:\textbackslash{}repository\textbackslash{}fpc\textbackslash{}compiler\textbackslash{}ppc386
\end{lyxcode}
Another very common variation is installing into a different base
directory (\$PREFIX\index{PREFIX}), this is done by setting a variable
INSTALL\_PREFIX\index{INSTALLPREFIX=@INSTALL\_PREFIX=} to the desired
directory: 
\begin{lyxcode}
cd~/fpc/devel/fpc~

make~all~PP=/my/starting/compiler

\#~

\#~Stack~installs~packages~that~don't~come~with~the~package~system~in~/usr/exp~

\#~

make~install~INSTALL\_PREFIX=/usr/exp~

\#~

\#~Or~on~Windows:~

\#~My~FPC~directory~is~on~d:\textbackslash{}pp~

\#~

cd~/d~c:\textbackslash{}repo\textbackslash{}fpc~

make~all~PP=ppcrel~

make~install~INSTALL\_PREFIX=d:\textbackslash{}pp~

\#~

\#~Or~lets~make~a~snapshot~to~upload~to~some~site~on~some~unix:~

\#~

\#~

cd~/fpc/devel/fpc~

make~all~PP=/my/starting/compiler~

\#~

\#~Make~a~scratch~directory~in~/tmp~

\#~

mkdir~/tmp/fpc~

make~install~INSTALL\_PREFIX=/tmp/fpc~

\#~

\#~archive~

\#~

cd~/tmp/fpc~

tar~cvzf~/tmp/newsnapshot.tar.gz~{*}~

\#~~remove~temp~dir.~

\#~

cd~/tmp~

rm~-rf~fpc~

\#
\end{lyxcode}
Finally, adding parameters to every compiler commandline is interesting
too. This can be done by adding OPT=\textquoteright <the parameters>\textquoteright{}
to the commandline. Often used parameters for this purpose are -d<xxx>
to define a value which can be tested using e.g. \{\$IFDEF xxx\} in
the source, and -gl to include debug info. -va is also often used
to debug the snapshot building process. If you add -va, pipe the output
to file, or the building will slow down due to the massive amounts
of output written to screen. 

\emph{Adding -gl when you are developing with FPC is a good habit,
since it allows you to single step all of the FPC runtime libraries
in GDB (roughly equivalent to the \textquotedblleft use debug .DCUs\textquotedblright{}
options in Delphi). The generated snapshot gets somewhat larger though.} 
\begin{lyxcode}
cd~/fpc/devel/fpc~

make~all~OPT='-gl'~

\#~lots~of~building.~

make~install~

\#~Installs~the~snapshot~to~the~default~location~

\#~(/usr/local/lib/fpc/\$FPCVERSION~and~deeper~probably)~

\#~

\#~or~on~Windows:~

cd~c:\textbackslash{}cvs\textbackslash{}devel\textbackslash{}fpc~

make~all~OPT='-va'~\&>~d:\textbackslash{}buildlog.log~

make~install~

\#~

\#~multiple~parameters~are~passed~like~this:~

\#~

\#~

make~all~OPT=''-gl~-va''
\end{lyxcode}
\textbf{A word of caution: }When I build snapshots for home use, I
simply \textquotedblleft \index{make install}make install\textquotedblright{}
them over the old snapshot, at least if \textquotedblleft make all\textquotedblright{}
succeeds. If you encounter errors during build or install, or even
after install (like the notorious \textquotedblleft can\textquoteright t
find unit xxx\textquotedblright , while it is there), try to remove
the units/ directory in the FPC homedir, and re-execute the \textquotedblleft make
install\textquotedblright{} used to install it. This should resolve
the problem. If not check as much settings as you can check and read
chapter 4 

The problem is usually caused by units changing directories (or packages)
in CVS. Since the usual procedure doesn\textquoteright t clean the
units/ directory, after installation two instances of that unit exist,
which could lead to conflicts. 

A good habit is to backup source tree before updating and the FPC
install directory (compiler + units/ directory) before installing
a new snapshot. This just to make sure you will have a working compiler
in case something goes wrong during building or installing. This can
easily be automated using a script that updates - backups - builds
- installs. Since I\textquoteright m not that fond of unix scripting,
I\textquoteright ll leave that as an exercise to the reader. 


\section{Current build procedure on win32 }

The situation on win32 with current SVN is a bit complex, so I decided
to dedicate a separate paragraph listing the procedure, combining
all the above data. The problem on win32 is that SVN markes its own
config files as read-only, which leads to problems with installing
examples, and the cp utils provided with 2.0 have some unix path <->
windows paths troubles. Most notable, they don\textquoteright t see
\textbackslash{}xxx\textbackslash{}yyy as a windows path, but they
do see d:\textbackslash{}xxx\textbackslash{}yyy as a windows path. 

There are two solutions, the quick one simply omits the examples,
the slow one does. Best is to do the slow one once in a while to have
up to date examples, and for the rest use the quick solution. The
slow solution also fixes some problems with older versions of the
mingw utils.

Besides the read-only svn dirs problem, there is also a problem with
Vista, and some mingw binaries have problems with the casing of PATH
statements.


\subsection{The slow solution: SVN exporting}

Before we begin, lets define the directories (my defaults) 
\begin{itemize}
\item d:\textbackslash{}pp is the directory where I currently have installed
FPC, and d:\textbackslash{}pp\textbackslash{}bin\textbackslash{}i386-win32is
the FPC dir in my \%PATH\%. 
\item d:\textbackslash{}fpcSVN is the directory where I checked out the
SVN repository. I don\textquoteright t build in it. 
\item d:\textbackslash{}fpc is the directory where I export the SVN repository
too.
\item d:\textbackslash{}fpcrel is the directory containing FPC 2.4.0 for
bootstrapping purposes. 
\end{itemize}
Another important issue: \textbf{MAKE ABSOLUTELY SURE THAT THE CYGWIN
DIRECTORY IS NOT IN THE PATH!!!!!!} The reason for this is that some
mingw utils start using cygwin sh.exe when found, and that in turn
swaps some utils from the FPC delivered mingw tools to cygwin ones.
 

Then, to make and install a snapshot, we update the SVN: 
\begin{lyxcode}
cd~/d~d:\textbackslash{}

svn~up~fpcSVN~
\end{lyxcode}
Then we export it: 
\begin{lyxcode}
\#~Cleaning~improves~performance,~

cd~fpc~

make~clean~

cd~..~

svn~export~-{}-force~fpcSVN~fpc~
\end{lyxcode}
Now, the building can start: 
\begin{lyxcode}
cd~fpc~

make~clean~all~OPT='-gl'~FPC=d:\textbackslash{}fpcrel\textbackslash{}bin\textbackslash{}i386-win32\textbackslash{}ppc386.exe~
\end{lyxcode}
If this is successful we install: (all on one line) 
\begin{lyxcode}
make~install~OPT='-gl'~INSTALL\_PREFIX=d:\textbackslash{}pp11~UPXPROG=echo

~~~~~~~~~~~~~~~~~~~~~~~FPC=d:\textbackslash{}fpcrel\textbackslash{}bin\textbackslash{}i386-win32\textbackslash{}ppc386~
\end{lyxcode}
Some things to notice: 
\begin{itemize}
\item \textbf{MAKE ABSOLUTELY SURE THAT THE CYGWIN DIRECTORY IS NOT IN THE
PATH!!!!!! }Mingw/msys can also give problems, but more rarely (see
\ref{sub:(Windows)-building-and} )
\item The options (OPT='-gl') are passed both to the make and install lines.
This because sometimes due to unit dependency glitches and utils,
a minor amount of code is (re) built during install. This goes for
\textbf{ALL} build options that are not installing related 
\item \index{UPXPROG=}UPXPROG=echo avoids UPXing of the resulting binaries,
so that the FPC binaries can be debugged. If you want as small FPC
bins as possible, leave it away, and add SMART=1 to both make lines.
Note that UPXing wastes memory that is more expensive than disk. \footnote{http://wiki.freepascal.org/Size\_matters\url{http://wiki.freepascal.org/Size_Matters}}
\item We add --force to the SVN export line to force overwriting of the
previous repository. If building goes wrong, day after day, try erasing
the export directory (d:\textbackslash{}fpc) before exporting. 
\end{itemize}

\subsection{The Quick solution: COPYTREE\index{copytree@COPYTRE\={E}}}

The quick solution exploits that the recursive copying is done using
a command that is \emph{only }used for copying the examples. And updating
the (installed) examples is not that important when daily updating,
one typically wants to avoid the slow SVN export step. The makefile
macro that is used internally in the makefile for copying files recursively
is COPYTREE, we then use the same trick as earlier to disable functionality
by specifying the ``echo'' command:
\begin{lyxcode}
make~install~COPYTREE=echo
\end{lyxcode}

\subsection{VISTA specific topics: \index{install.exe (Vista)}install.exe \label{sub:VISTA-UAC-INSTALL}}

Vista is quite draconian in some things, and there will be a lot more
problems in the future, specially for release engineering. (think
about temporary files in the root, not allowing writes in the appdir
etc). However there is one little gotcha that also affects normal
building. 

This gotcha is actually the result of an attempt to minimalize trouble
for existing installers by automatically popping up UAC (otherwise
you would have to do ``run as admininstrator'' which is not end
user friendly), but it was implemented half-assed. Any EXE with install,
setup or update in its name will pop up UAC, but.... \emph{UAC prompts
fail for console apps} .\footnote{http://technet2.microsoft.com/WindowsVista/en/library/00d04415-2b2f-422c-b70e-b18ff918c2811033.mspx
\url{http://technet2.microsoft.com/WindowsVista/en/library/00d04415-2b2f-422c-b70e-b18ff918c2811033.mspx}
search for ``keyword''}

The FPC build system uses GNU install (as ginstall.exe) to install
files with proper permissions, and that fails due to UAC.

The definition of the problem also implies the solution:
\begin{enumerate}
\item Copy the (g)install.exe binary to a new name without the keywords,
I use ``myinst.exe''
\item Pass GINSTALL=myinst.exe to the make commandline :\end{enumerate}
\begin{lyxcode}
make~install~GINSTALL=\index{GINSTALL=}myinst.exe
\end{lyxcode}
\textbf{P.s.} This Vista/Windows 7 problem is fixed in 2.4.0 by adding
a manifest.


\subsection{Putting it all together}

Here is the batchfile that I use on Windows: (the FPC source tree
is in d:\textbackslash{}repo\textbackslash{}fpc)
\begin{lyxcode}
@echo~on

set~BASEDRV=c:~

set~SRCDIR=\%BASEDRV\%\textbackslash{}repo\textbackslash{}fpc~

set~PPCNAME=ppc386~

set~FPCSTART=c:\textbackslash{}fpc\textbackslash{}2.4.0\textbackslash{}bin\textbackslash{}i386-win32\textbackslash{}\%PPCNAME\%~

set~LOGDIR=\%BASEDRV\%\textbackslash{}repo~

set~INSTALLDIR=\%BASEDRV\%\textbackslash{}pp11~

REM~some~random~opts.

set~OPTS=-gl~-dSAX\_HTML\_DEBUG~-dUSE\_MINGW\_GDB~

set~COMMONOPTS=UPXPROG=echo~COPYTREE=echo~OPT=\textquotedbl{}\%OPTS\%\textquotedbl{}~GINSTALL=myinst.exe~

rem~===~invariant~part~===

cd~/d~\%SRCDIR\%



REM~the~building



make~clean~all~\%COMMONOPTS\%~FPC=\%FPCSTART\%~1>~\%LOGDIR\%\textbackslash{}buildlog.txt~2>\&1



REM~separate~install~step~for~crossversion~purposes~(and~under~Unix~sudo)~(on~one~line)



make~install~\%COMMONOPTS\%~INSTALL\_PREFIX=\%INSTALLDIR\%~FPC=\%SRCDIR\%/compiler/\%PPCNAME\%~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~1>~\%LOGDIR\%\textbackslash{}installlog.txt~~2>\&1
\end{lyxcode}
Actually, I have several such files, another one for 64-bit, a more
advanced one for crosscompiling to wince etc. The win64 is a copy
that differs only in ``x86\_64-win64'' in the path and ppcx64 instead
of ppc386. Note that all variables are in the upper part of the batchfile,
this makes it easier to port it to systems and just adapt the paths.
Having several computers with slightly different path and drive layouts
was the motivation to write them.

Unfortunately, pure batchfile is too limited to invest too much time
in it. 


\section{fpmake outdated on Windows.}

On Windows, the makefiles in 2.6.0 might not properly erase fpmake.exe
on distclean. If you have strange sudden build problems, or build
problems after not building a branch for weeks, try recursively deleting
fpmake.exe and try again.


\section{Lazarus }

Building lazarus is actually pretty much the same as building a snapshot,
except that you have to enter directory lazarus/ instead of fpc/. 
\begin{lyxcode}
cd~/repo/~

svn~update~lazarus

cd~lazarus~

make~all~

\#~you~might~want~to~check~if~the~return~value~of~``make~install''~is~zero~before~installing.~

make~install~INSTALL\_PREFIX=/usr/local~

\#
\end{lyxcode}
At the moment of writing this there was some problem with installing
lazarus. It seems that the makefiles aren\textquoteright t entirely
up to date. I usually move the lazarus repository to /usr/local/lazarus,
and set some symlinks to execute the right binary.This isn\textquoteright t
that bad, since you need to save the lazarus source for Lazarus\textquoteright{}
operation anyway. 


\section{Typical problems and tips}


\subsection{cannot find -l<xxxx> \label{sub:cannot-find--l<xxxx>} }

Since Lazarus need to link to shared libraries, building lazarus tests
an aspect of the FPC configuration that hasn\textquoteright t been
tested by the parts above. A typical error is 
\begin{lyxcode}
Linking~./lazarus~

/usr/libexec/elf/ld:~cannot~find~-lglib12~

lazarus.pp(334)~Error:~Error~while~linking~

Closing~script~./ppas.sh~
\end{lyxcode}
This means that the linker, when building the final binary, couldn\textquoteright t
find libglib12.a or libglib12.so. This is officially not an FPC error,
since glib is part of GTK, which belongs to the operating system.\emph{
So maybe the gtk (or a corresponding gtk-devel package) is simply
not installed.} There are four other possibilities:
\begin{enumerate}
\item While the package is installed, the package manger didn\textquoteright t
create a symlink that refers the libglib.12.so.x to libglib12.so.
A quick cd /usr/local/lib; ln -s libglib12.so.2 libglib12.so would
have solved that in this case. 
\item (the actual problem in the case above) The directory with the correct
file isn\textquoteright t searched for libraries by FPC, because you
didn\textquoteright t specify the directory in fpc.cfg using -Fl.
A mere adding of -Fl/usr/local/lib to /etc/fpc.cfg solved the problem
in this case. 
\item You have a \{\$LINKLIB xx\} in the source somewhere, or a -l<xx> parameter
in some script or makefile that forces FPC to try to link the library,
but it isn\textquoteright t necessary anymore, grep is your best friend
in such cases.
\item Your distribution for some reason names it libraries differently.
Again, symlinking the searched name to the real name is the solution. 
\end{enumerate}

\subsection{CONTNRS or other FCL-BASE units not found \index{CONTNRS not found}}

If the compiler can't find contnrs, this points to a problem with
the -Fu paths. It probably means -Fu was wrong, but the makefiles
managed to auto-add the RTL, and the contnrs (and other FCL-BASE)
unit(s) are then the first unit that can't be found. It can also point
to duplicate .ppu files or mixing of FPC versions.


\subsection{Piping stderr and stdout to the same file.\label{sub:Piping-stderr}
\index{Piping stderr}}

Piping stderr and stdout of the MAKE process to the same file is useful
for debugging the exact sequence on events. This is easily done on
Unix using >\&. 

Under Windows this is a bit more complex, but can still be done:
\begin{lyxcode}
make~install~1>~filename.txt~2>\&1
\end{lyxcode}
This line pipes the output of install's stdout to filename.txt using
1>, but redirects stderr ( 2>) to stdout (\&1) first.


\subsection{(Windows) building and install fails with ``invisible'' errors
\label{sub:(Windows)-building-and}}

I suddenly had problems when doing ``make clean all install'' in
one go. Further investigation of the output showed ``ignored errors''
in make exit lines:
\begin{lyxcode}
make:~{[}fpc\_clean{]}~Error~1~(ignored)
\end{lyxcode}
however this would lead to an all stop after the \emph{all} part:
\begin{lyxcode}
make:~{*}{*}{*}~{[}fpcmade.i386-win32{]}~Error~1
\end{lyxcode}
This turned out to be a mingw related problem, a file ``sh.exe''
was left in the project source. Another solution would be to never
use these commands in one go, but script them as separate ones. 

I experimented with sh.exe because when using ``make -j 2'' it produces
a warning that -j functionality is disabled if sh.exe is not found.
I assume the makefile must be adapted to ignore ``ignored errors''
instead of ``all errors'' somewhere.

\textbf{Note:} Despite the usage of mingw tools, it is not recommended
to have the mingw directories in the path. Some of the mingw tools
(most notably make.exe when it detects sh.exe) apparently change behaviour
upon detection .


\chapter{Crosscompiling }

(you need to have read the previous chapters too, since they already
contain a lot of crosscompiling related info that I won\textquoteright t
duplicate here) 


\section{Basic crosscompiling of a snapshot }

Let\textquoteright s have two examples, freebsd to win32-mingw crosscompile,
and a FreeBSD to AMD64 linux one. 

Assume we have the following items set up correctly: 
\begin{enumerate}
\item Cross binutils have been compiled, and are installed with \$PREFIX=\textasciitilde{}/cross.
The correct prefix has been identified (probably something like i686-ming32-and
x86-64-linux-in our example) 
\item The FPC sources are in fpc/ 
\item FPC was installed in /usr/local/lib/fpc/\$FPCVERSION and deeper 
\end{enumerate}
Then we execute:
\begin{lyxcode}
cd~\textasciitilde{}/fpc~

gmake~distclean~

\#~next~all~on~one~line~

gmake~all~install~OS\_TARGET=win32~CROSSBINDIR=\textasciitilde{}/cross/bin~BINUTILSPREFIX=i686-ming32-

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~INSTALL\_PREFIX=/usr/local~
\end{lyxcode}
to build the first snapshot (note that CPU\_TARGET isn\textquoteright t
set, and that OS\_TARGET uses the FPC platform naming (win32), while
BINUTILSPREFIX uses the GNU one (since it is for the binutils). Also
note that the BINUTILSPREFIX ends with a dash. This is on purpose. 

Similarly, for x86\_64-linux the line becomes
\begin{lyxcode}
cd~\textasciitilde{}/fpc~

gmake~distclean~

\#~next~all~on~one~line~

gmake~all~install~CPU\_TARGET=x86\_64~OS\_TARGET=linux~CROSSBINDIR=\textasciitilde{}/cross/bin~BINUTILSPREFIX=x86\_64-linux-~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~INSTALL\_PREFIX=/usr/local~
\end{lyxcode}

\section{Crosscompiling without cross-assembler. }

Sometimes one doesn\textquoteright t want to really crosscompile,
just test if something like the RTL compiles under target <x>. If
this target is on the same architecture, one can try to use
\begin{lyxcode}
gmake~fpc\_units~OPT='-s'
\end{lyxcode}
The -s skips calling the assembler/linker and the use to the fpc\_units
makefile-target skips the assembling of the RTL\textquoteright s loadercode.
Another such trick is to pass AS=echo or AS=gecho to gmake. Note that
in former (2.4.x/4.x) times, crosscompiling between Linux/x86 and
FreeBSD/x86 was possible without cross assemblers and linkers. This
to my knowledge hasn\textquoteright t been retested with newer versions
of these OSes.


\section{Crosscompiling Lazarus}


\subsection{Crosscompiling Lazarus from windows to Linux }

First, we need a set of cross binutils. For windows->other platforms,
these are on FPC FTP \url{ftp://freepascal.stack.nl/pub/fpc/contrib/cross/mingw/binutils-2.15-win32-i386-linux.zip}
. Download and extract them to the same directory as your \textquotedblleft ppc386\textquotedblright{}
compiler binary. Verify their install by running i386-linux-ld on
the command prompt. 

Second, we need FPC and Lazarus source trees. Note that the FPC tree
must be an exported tree, since we are going to use make install,
and make install trips over SVN directories. So after checkout svn
export the sources (see SVN paragraph for examples)

Now we are going to build and install FPC for crosscompiling (assume
FPC is installed in c:\textbackslash{}fpc\textbackslash{}2.4.0) 
\begin{lyxcode}
make~clean~make~OS\_TARGET=linux~all~make~OS\_TARGET=linux~install~INSTALL\_PREFIX=c:\textbackslash{}fpc\textbackslash{}2.4.0
\end{lyxcode}
Lazarus is a different matter however, since it uses shared libraries.
So I copied Linux libraries from my target system and put them in
d:\textbackslash{}linuxlib. Which libraries I copied is described
in the separate paragraph below. 

Before we really start, we have to workaround a different problem.
The compiler still has a detection for pre-glibc systems which is
easy to trip if you make a mistake. So go into i386-linux rtl directory
(probably c:\textbackslash{}fpc\textbackslash{}2.4.0\textbackslash{}units\textbackslash{}i386-linux\textbackslash{}rtl)
and copy cprt21.o over cprt0.o so that both files are in fact cprt21.o.

Now we start with the Lazarus building, enter the lazarus directory
and give a 
\begin{lyxcode}
rem~on~one~line:

make~OS\_TARGET=linux~all~OPT=''-gl~-Fld:\textbackslash{}fpc\textbackslash{}linuxlib~-Xr/usr/lib~-FL/usr/lib/ld-linux.so.2~

~~~~~~~~~~~~~~~~~~~~~~~~~~-XLAc=c,dl,gmodule''
\end{lyxcode}
The -gl is about adding debuginfo (good to have a traceback if something
goes wrong), the Fl argument specifies the directory to look for the
linux libraries, and the -Xr argument makes the linker create the
binary so that it searches in /usr/lib for libraries. The -FL argument
is the name of the dynamic linker, and the -XLA line adds two libraries
(dl and gmodule) if libc is included.\footnote{Alternately, you can add \{\$linklib dl\} and \{\$linklib gmodule\}
to the main lazarus sourcefile lazarus.pp }

This should build a Linux lazarus. However most likely, it will bomb
out missing some library. The solutions to that are editing the linker
file \textquotedblleft link.res\textquotedblright{} and rerunning
ppas.sh again, or adapting the d:\textbackslash{}fpc\textbackslash{}linuxlib
dir with more or renamed libraries. The link alias options (as -XLA
above) are really handy to avoid repeated editing.


\subsection{Preparing a directory with Linux libraries }

For the crosscompile I copied a bunch of files of the target linux
distribution (and yes, these are possibly distribution and version
dependant!). Some of these are also needed for the textmode IDE. If
library files were named libname.so.x.y on linux I renamed them to
libname.so in my Windows directory, since the symlinks used for that
on Linux are not easily copied. 

Most of these libs are in directories like /lib, /usr/lib and maybe
/usr/local/lib, /usr/X11R6/lib and /opt/gnome/lib. libgcc however
is in a GCC install dir, which can be found by doing a gcc -v and
then look for a line like 
\begin{lyxcode}
``Reading~specs~from~/usr/lib/gcc-lib/i486-linux/3.3.5/specs''
\end{lyxcode}
then some of the libs are in /usr/lib/gcc-lib/i486-linux/3.3.5/ Anyway,
these are the files I copied (FC4 iirc): 
\begin{lyxcode}
libpthread.so.0~

libdl.so~

libc.so~

ld-linux.so.2~

crtbegin.o~

crtbeginS.o~

crtbeginT.o~

crtend.o~

crtendS.o~

crtn.o~

crti.o~

libgcc.a~

libX11.so~

libXi.so~

libglib-1.2.so~~

libgmodule-1.2.so.0~

libgdk\_pixbuf.so~

libgdk-1.2.so~

libgtk-1.2.so~

libXext.so~

libm.so~

libdl.so.2~

libgmodule-1.2.so~
\end{lyxcode}
Note that some directories are duplicate, with a suffix (like libgmodule-1.2.0)and
not. I need them twice because some of the other libraries names the
full name (so the form lib<name>.so.x) as an dependency and we can\textquoteright t
symlink on windows, so I simply copy it.

Making mistakes with renaming is not that bad, there will be chances
to fix it. Make sure all crt{*} and a file \textquotedblleft libc.so\textquotedblright{}
are available or generating link.res will go wrong. 


\section{Interesting compiler and makefile options}


\subsection{Skipping built in directories: -Xd\index{-Xd} }

On Unix targets, Free Pascal often automatically passes default libraries
like /lib and /usr/lib as include directories to the linker. This
can be a problem when experimenting with crosscompiling (and dual
architecture) systems. The parameter -Xd convinces the compiler to
not add these directories. 


\subsection{Difference in paths: -Xr\index{-Xr}<directory> }

-Xr configures where the dynamic linker of generated binaries should
look for library dependencies. This is mostly interesting when cross
compiling, when the internal prefix of the (cross)binutils (some directory
on the host system) is not the same as the library searchpath on the
target system.


\subsection{-Xt\index{-Xt} static linking }

The -Xt parameter tries to link static as much as possible by passing
-static to LD, the linker. A more finely grained control over what
libraries are linked statically, and which ones are linked dynamically
can at this time only be achieved by postediting the linker \textquotedblleft link.res\textquotedblright{}
file. Compile with -s, edit link.res, and then run ppas.bat or .sh
to resume the linking process. 


\subsection{CROSSOPT}

The Makefile of compiler/ allows to specify compiler options that
are only used during the actual crosscompiling state using CROSSOPT=
(so not during the initial bootstrap cycle that is not cross-)


\subsection{LIBDIR}

Allows to specify a dir to be used for linking. Don't know the exact
cross-compile consequences, specially if the host OS needs a lib path
to cycle (Solaris, OS X)


\subsection{CROSSINSTALL\index{CROSSINSTALL}}

Passing CROSSINSTALL=1 when doing a \emph{make install} after crosscompiling
skips installing binaries and examples and running samplecfg. More
research on this topic is needed, since any fpcmake based makefile
can implement own specific behaviour. Mostly it seems to skip installing
binaries from utils/ and the examples. Currently there is a problem
that (end) binaries in packages/ (chmls,chmcmd) aren't skipped.

make crossinstall is a shortcut for 
\begin{lyxcode}
make~install~CROSSINSTALL=1
\end{lyxcode}
CROSSINSTALL also modifies prefixes for archiving, but this is more
for the crosszipinstall usage. The ``cross-'' targets are mostly
interesting for generating the ``other'' compiler for biarchs. 


\subsection{crosszipinstall\index{crosszipinstall}}

Crosszipinstall is the ``cross'' variant of zipinstall, which is
the archiving variant of zipinstall. Similarly to crossinstall it
is a shortcut for
\begin{lyxcode}
\$(MAKE)~zipinstall~CROSSINSTALL=1~
\end{lyxcode}
This mostly changes some prefixes and suffixes. PKGPRE and INSTALLTARGET
(install instead of distinstall)


\subsection{crossall}

Crossall is the ``cross'' variant of all, which has no effect in
every fpcmake generated makefile, but seems to specifically used in
the makefile of compiler/, to use starting compilers that are named
according to ppccross<architecture> 
\begin{lyxcode}
\$(MAKE)~zipinstall~CROSSINSTALL=1~
\end{lyxcode}
This mostly changes some prefixes and suffixes.


\chapter{Systematic problem solving for the FPC build proces }

The questions of people that read the previous \textquotedblleft make
cycle faq\textquotedblright{} on the FPC mailing lists suggested that
the main remaining problem is what to do if something goes wrong,
and to determine the exact cause of the problem. 

The usual problems are: 
\begin{enumerate}
\item Wrong versions of FPC for a certain job or trying to combine compiler
and rtl that don\textquoteright t belong together (2.3 with the 2.2.x
RTL, or trying to generate windows binaries with the go32v2 binutils).
Specially Lazarus users often try to build with a too old version
anyway, despite the minimal version advise on the main Lazarus site. 
\item Leftovers of the previous install/build frustrate the current build
process (not deleting old directories etc, stale .ppu\textquoteright s
or .o\textquoteright s). Be hygienic with respect to old .ppu, .o\textquoteright s,
binaries and buildtrees! 
\item Omitting details that don't have to be done for each install, (like
not fixing the symlink in /usr/local/bin/ that points to the real
installation). Even quite experienced lazarus devels seem still to
be confused when mainline FPC branches.
\item Directory inclusion problems (fpc.cfg inclusive). Directories not
being searched, or wrong ones included. Stale fpc.cfgs (e.g. \textasciitilde{}/.fpc.cfg
vs /etc/fpc.cfg)
\item (windows) Having cygwin in the PATH, which causes fatal mixing of
the mingw FPC build tools and their cygwin counterparts. Same for
other development tools like Delphi also provide \textquotedblleft make\textquotedblright{} 
\item (unix and strictly not a FPC problem) not installing operation system
parts and libraries. Most notably the -devel libraries on Linux, or
ports on {*}BSD. Build-essentials on Debian like systems. Often this
is perceived as a naming mismatch.
\item (development versions only) Trying to compile something in a directory
that contains files with the same name as files in the FPC cvs. The
compiler find these, and thinks they are the RTL sources that need
recompilation. Release versions are protected against this (by compiling
the RTL with -Ur\index{-Ur}) 
\end{enumerate}
Double checking that you are not having these specific common problems
is worth the effort. 


\section{Determining the problem, increasing the verbosity\index{verbosity}. }

The standard systematic search for the problem starts with increasing
the verbosity level, by passing OPT=<switches> after make. This works
when executing the commandline compiler too. 

The commonly used verbosity options are 
\begin{description}
\item [{-vt\index{-vt}}] (show filesearching information, searched paths
etc) If you expect problems with what directories are searched, you
usually choose this to keep the amount of logged data down.
\item [{-va\index{-va}}] (show all info. REDIRECT THIS!) 
\end{description}
This is the ultimate source if something goes wrong. The rest is pretty
much guess work and experience. The verbose compiler messages are
the best source by far, and the only one that allows some systematic
problem searching. Nobody expects the Spanish Inquisition, but try
to answer these questions for yourself when looking at the -va output. 
\begin{itemize}
\item Is the correct compiler executed? 
\item Does the compiler version match with the version that you\textquoteright d
expect ? (You can also use ppc386 -i to check version). This includes
verifying the compiler date! 
\item Are the operating system and processor you are compiling for correctly
named in the output? 
\item Is the correct fpc.cfg (name and location) loaded and is it preprocessed
as you think? 
\item Are linker, include and unit directories correct? 
\item If the compiler can\textquoteright t find a unit, does a line like
\textquotedblleft unit changed, recompiling\textquotedblright{} exist
a bit higher? If so see the separate section on the \textquotedblleft recompiling\textquotedblright{}
problem. 
\item If you are using FPC supplied makefiles, keep in mind that the fpc.cfg
file is ignored while building a \textquotedblleft cycle\textquotedblright{}
or a larger target that depends on cycle (like \textquotedblleft make
all\textquotedblright ) Add parameters to the make commandline(OPT),
set environment variables, or fix config files (e.g. /etc/ld.so.conf
if it is a linker directory problem) to fix this.
\end{itemize}
If you do use nested includefiles, is the nesting the same way as
you expect? ( a small filter program can be quite handy to \textquotedblleft graph\textquotedblright{}
how includefiles are included for complex files)


\section{Checklist }

Some other things easily checked without extra verbosity : 
\begin{itemize}
\item (on unix) Check the compiler location with ``which ppc386''.
\item Check the compiler version and date with ppc386 -i 
\item Look at your path variable ( echo \$PATH on unix, echo \%PATH\% on
dos/windows), and check that the FPC directory for the target you
choose is first. Specially make sure that 

\begin{enumerate}
\item there is no cygwin directory in the path at all (cygwin tools use
non-dos path layout, and need special handling. FPC\textquoteright s
mingw based versions of make and the binutils don\textquoteright t
mix well with cygwin\textquoteright s) 
\item (Windows) there is no other directory of a development tool (Delphi,
JBuilder, VC++) in your path. These can contain own versions of certain
tools, mainly make that are not compatible. A make -v or make \textendash version
can be useful too.
\item the PATH variable is spelled in all capital letters. If you have this
problem, correct it in the windows environment dialogue (one of the
tabs of System settings) A batchfile that can fix this on the go for
if you don\textquoteright t have permissions to fix it directly on
your work system is \\
set a=\%PATH\% \\
set Path= \\
set PATH=\%A\%\\
set a= 
\item Check your fpc.cfg. I know, you never edit that one, and it has worked
always, but do so anyway. Quickly inserted ``I have to get this working
now!'' changes are easily forgotten.
\end{enumerate}
\end{itemize}

\section{Recompiling }

A standard gotcha for FPC newbies is when the compiler says it can\textquoteright t
find unit xxx, while you are really 100\% sure it is there, and the
directory with that file is searched. ( note : make 100\% sure that
this is the case, before continuing)

The most common causes are:
\begin{enumerate}
\item (by far the most common) stale .o and .ppu\textquoteright s, or incorrect
settings that include wrong directories. (with .ppu and .o\textquoteright s).
Run make distclean 
\item Including the main source trees into your unit searchpath. This is
wrong, they should only be in your debugger/codetools sourcepath
\item includefiles and unit names that are not unique. 
\item A difference in the defines. 
\end{enumerate}
If so, if you do the same build with OPT=\textquoteright -va\textquoteright{}
and search for ``Recompiling''

{[}Unfinished{]} 


\chapter{Misc topics }


\section{Programming models. }

Over the last few years, FPC has started to support an increasing
amount of platforms that use the Unix specific RTL parts.

Some form of reorganisation was necessary, and because more processor
platforms are in preparation for FPC, I decided to look into portability
issues, specially creating 64-bit clean code, and alignment and endianness.
The main reasons for researching portability for Object Pascal were
Free Pascal\textquoteright s plans to port to 64-bits platforms like
x86\_64, Sparc64 and PowerPC G5. 

The term 64-bit clean is somewhat misleading, because it is not limited
to 64-bit architectures alone, but a general principle for writing
code in a way that it runs on a lot of processors. The basic principle
is to only allow conversion between a certain integer type and pointer,
and always have a certain integer type (PtrInt) that is guaranteed
to scale with pointer size.

In C, the standard ''long'', or a new ''long long'' type is used for
this. Since pointers aren\textquoteright t generally regarded as ''signed'',
it seems logical to pick an unsigned type to be compatible with a
pointer. Signed or unsigned doesn\textquoteright t much matter for
compatibility with C as long as integers are coded using two\textquoteright s
complement, and because the interface between C and another language
is untyped. 

The reason to define a new type Long Long is simple, to allow legacy
code that assumes that integer and long are equal in size to keep
on working without modification. 

A chosen set of types is refered to in C faqs as a ''programmingmodel'',
and are named ILP-x, LLP-x or LP-x with x the processor\textquoteright s
wordsize in bits, typically 32 or 64. ILP-x means that Integer, Long
and Pointer are x bits wide, LP-x that Long and Pointer are x bits
wide, and LLP that Long Long and Pointer are x bits wide.

Some typical programming models are listed in the table below.

\begin{tabular}{|c|c|c|c|c|c|c|}
\hline 
Ctype & objpas & \multicolumn{5}{c|}{Size in model}\tabularnewline
\hline 
\hline 
 &  & ILP32 & LP32\index{LP32} & LP64\index{LP64} & ILP64\index{ILP64} & LLP64\tabularnewline
\hline 
\hline 
char & byte/char/smallint & 8 & 8 & 8 & 8 & 8\tabularnewline
\hline 
short & shortint & 16 & 16 & 16 & 16 & 16\tabularnewline
\hline 
int & integer/longint & 32 & 16 & 32 & 64 & 32\tabularnewline
\hline 
long &  & 32 & 32 & 64 & 64 & 32\tabularnewline
\hline 
long long &  & 32 & -(32)  & -(64) & -(64) & 64\tabularnewline
\hline 
pointer & pointer types & 32 & 32 & 64 & 64 & 64\tabularnewline
\hline 
\end{tabular}
\begin{itemize}
\item Some points in the table need explaining: 
\item Standard programming model for current (intel family) PC processors
is ILP32\index{ILP32}. All 32-bits OSes use it. 
\item The problem with long in C was that there are both large codebases
that expect pointer and long to have the same size, while there are
also large codebases that expect int and long to be the same size.
The compatibility model LLP64 was designed to keep the long<->int
compatibility by introducing a new type to remain compatible with
pointer (long long) 
\item long long doesn\textquoteright t exist except in LLP64\index{LLP64},
and both long and longlong don\textquoteright t have an clear equivalent
in Object Pascal yet. A new type would have to be created just like
under C. Since Pascal has no long<-> ptr equivalence established yet,
the long vs long long discussion is unimportant. It was however decided
to create both a signed ( PtrInt\index{PtrInt} ) and an unsigned
(PtrUint\index{PtrUint} ) type that scale with pointer size
\item LP32 is used as model for the win-16 APIs of Windows 3.1 
\item Most {*}nixes use LP64, mainly to conserve memory space compared to
ILP64, since using full 64-bit ints is hardly necessary and a waste
of memory. Examples: 64-bit Linux, FreeBSD,NetBSD,OpenBSD 
\item Win64 uses the LLP64 model, which was also known as P64. This model
conserves type compatibility between long and int, but loses type
compatibility between long and pointer types. Any cast between a pointer
and an existing type requires modification. 
\item ILP64 is the easiest model to work with, since it retains all compatibility
with the much used ILP32 model, except specific assumptions that the
core types are 32-bit. However this model is quite memory-hungry,and
both code and data size significantly increase. Typically used by
e.g. some (older?) Cray systems.
\item There are no dos models in the table, since dos doesn\textquoteright t
have a flat memory model. (a pointer can\textquoteright t be represented
by a single value in these models. DJGPP extender models are ILP32
though.
\end{itemize}

\section{Link ordering}

Starting with 2.0.4 some switches were added that simplify dealing
with changing library names. These switches are \textbf{BETA} and
may change or \textbf{disappear} at any time, e.g. when a linker description
language is implemented. They were mostly added to be able inventorize
how useful such a system would be in practice, mostly it is meant
to deal with changes in library names and keep a release running without
repackaging it before a final decision is made. They are BETA also
because the internal linker might totally change the linking backend
in the near future. 

The main problem it solves is that with FPC, names of libraries can
be hardcoded in the FPC source in \textbf{\$linklib} or\textbf{ EXTERNAL
}declaractions. While this is generally a good thing that makes it
way easier for the user and avoids kludges like having to specify
each and every library on the commandline like gcc, it can be annoying
in times when librarynames go through a transition, and you use a
distribution that renames libraries. 

Besides the name, also the order of libraries might sometimes be a
problem, specially when libraries don\textquoteright t specify their
dependencies correctly. Most of these issues are with relative lowlevel
libs like libgcc.

FPC 2.0.4 introduces several \textbf{beta} switches to deal with this.
There are three new parameters:
\begin{enumerate}
\item -XLAlibname={[}libname1{]}{[},libname2..{]} 
\item -XLOlibname=<number> 
\item -XLD 
\end{enumerate}
A limitation that remains is that there is no way to allow the user
to decide which libraries are to be linked statically, and which are
to be linked dynamically. This mainly for easier deployment on linux
(non standard libs? -> force static). Another limitation recently
surfaced is that this only goes for libraries. Object files, and their
order are untouched


\subsection{-XLA\index{-XLA} }

The first parameter, -XLA, defines a subsitution of library name.
The libs on the right side are added to the parameters of the linker
if the lib on the left side is in the list with libraries to link
that is constructed from the source. The right side can be empty,
and can also contain the libname that is already specified on the
left. Examples: 
\begin{itemize}
\item -XLAc=c,dl makes sure that libdl is added if libc is in the list,
libc remains in the list. 
\item -XLAdl= removes libdl from the list of libraries to link even if it
was \{\$linklib xx\}\textquoteright ed in the source 
\item -XLAgtk-12=gtk12 translates a link to libgtk12 to search for libgtk-12 
\end{itemize}

\subsection{-XLO\index{-XLO} }

The parameter XLO defines a weight. Libraries are sorted on weight
into descending order. Defaults weight is 1000. If you decrease the
weight, it will be lower in the list with libraries to link. This
is mainly useful to link certain libraries (typically the more lowlevel
ones) in a certain order, like e.g. with libc\_r and libc on FreeBSD4,
or to get programs to link that made a mess of their dependencies.
This possibility removes the need for a few ad-hoc ordering hacks,
and the special parameter for the FreeBSD 4->5 transition that was
one such kludge, -Xf was reimplemented using this functionality. The
compiler has default weights on a per target basis. This mainly means
that libc usually will be somewhere near the end. 

Example: 
\begin{lyxcode}
-XLOc=1050
\end{lyxcode}
puts libc before libraries that don\textquoteright t have a weight
specified in link.res (since the default is 1000) 


\subsection{-XLD \index{-XLD}}

The parameter -XLD simply makes the compiler forget the defaults for
weights and aliases. This can be useful if something changes for a
library that has a hardcoded weight, or when a built-in alias is not
needed anymore.


\subsection{Example: Fixing the FreeBSD GTK breakage with linkordering }

The FreeBSD ports maintainers decided to force large changes related
to linking using libtool on the ports tree in november 2005 (in UPDATING),
but they were not into effect till April 2006. One of sideeffects
of these changes were renaming of the GTK 1 libraries to gtk-12, gdk-12
and glib-12, where they used to be gtk12, gdk12 and glib12. These
changes affected all users that tracked 5 and 6 stable, since they
didn\textquoteright t wait for a major version transition to introduce
this. Ports maintainers also refused to add a few symlinks for a while
to ease the transitions, and pointed to gcc specific tools like gtkconfig
and libtool. (these emit gcc commandlines, and are thus useless in
practice). 

Most users track STABLE by default out of practical purposes, and
changing the FPC binary to call external programs and to parse them,
would only make the whole process more fragile and harder to support.
I myself decided to give up working on FPC ports tree entries because
I really start wondering where I benefited from participating in the
ports tree process. The work is immense, and the uses for the users
are small if such changes break packages so hard and relatively often. 

Since in time, more and more users will use either -STABLE or a release
based on -STABLE after the change, in FPC 2.2.0 I changed the default
name of the GTK libraries to their new names, and introduced linkordering
switches to keep older installations working. So if you have a system
from before this change, and don\textquoteright t track stable, you
can workaroundthis by putting the following in your fpc.cfg or .fpc.cfg: 
\begin{itemize}
\item -XLAglib-12=glib12 
\item -XLAgdk-12=gdk12 
\item -XLAgtk-12=gtk12 
\end{itemize}

\subsection{Example II: FreeBSD 4 vs 5 pthreads:\index{-Xf}-Xf }

Another item is the ppc<x> parameter -Xf, which signals an alternate
pthreads layout. Currently it only exists for FreeBSD. On versions
2.0 and 2.0.2 the parameter signals FreeBSD 5.x libpthread behaviour,
and on 2.0.4 it signals 4.x libc\_r behaviour. In 2.0.4 the parameter
was reimplemented on top of the linkordering routines, so that when
compiling for 4.x libc\_r can be used , \footnote{2.0.4 doesn\textquoteright t provide a out of the box 4.x setup anymore,
though generally the functionality should be preserved. } en when compiling for FreeBSD 5.x libpthread will be linked in. Also
the ordering is fixed using internal equivalents of -XLO, and the
defaults are also overridable with -XLD. 


\part{Glossary\label{par:Glossary}}

Note that this glossary tries to explain compiler and FPC project
specific jargon, not Pascal/Delphi in general. 
\begin{description}
\item [{architecture\index{architecture}}] Roughly the processor family.
Note that for PC\textquoteright s, the x86 architecture (all 80x86
chips) is often misused, where the i386 architecture (80386 and higher)
is meant. The PC version of FPC is i386 architecture, and doesn\textquoteright t
run on older x86 proc essors. Other architectures are PowerPC (which
is subdivided into power32 (=32-bits) and power64 (=64-bit)), m68k
(68030+ in practice), Sparc V7, Sparc V8, Sparc V9 (the latter better
known as Ultra Sparc). ARM versioning is more complex, since those
processors can be built to order, a customer can choose from several
cores, and add modules like FPU, memorysystem (endianness), DSP functionality
etc. 
\item [{AR\index{AR}}] The GNU archiver. Combines .o files into .a files.
.a files are used for smartlinking, though that might change in the
near future. 
\item [{AS\index{AS}}] The GNU assembler. The backend assembler that is
used if FPC needs an external assembler. 
\item [{assembler\index{assembler}}] a textual representation of the binary
machinecode that is fed to the processor. 
\item [{alias\index{alias}}] A function or variable with a name that doesn\textquoteright t
adhere to standard name mangling, usually for internal functions or
foreign language interfacing. 
\item [{binwriter\index{binwriter}}] The part of FPC that directly writes
.a\textquoteright s and .o\textquoteright s. Since using the binwriter
eliminates executing AS (and possibly AR), building is much faster.
The reason why it is not available for each platform is that there
is no universal .o format. Every binary type often has its own .o
variant, and all need special support in FPC. 
\item [{branch\index{branch}(CVS,SVN)}] Normally versions of a file in
CVS are a linear series of updates, a new version after each update.
This can be thought of as the trunk of a tree. However at a certain
point you might want to add an update that might e.g. break backwards
compatibility or that introduces instability for some time. The solution
then is to have two sequences of versions. One with that update (a
development series of update), and one without. These separate series
are the branches of a tree. 
\item [{bootstrapping\index{bootstrapping}}] is the entire process of
creating a compiler starting from another compiler (another version
or a totally different compiler). See also\textbf{ make cycle} 
\item [{Carbon\index{Carbon}}] A Mac OS widgetset/API, which is essentially
the cleansed subset of the classic Mac OS API that works with Mac
OS X. 
\item [{CLX\index{CLX}}] A library from Borland that is a bit more multiplatform
and should have replaced VCL. However users stayed away in droves.
CLX is GPLed, and thus is not very usable for FPC, library wise. 
\item [{COCOA\index{COCOA}}] A Mac OS X widgetset/API written for use
with Objective C. 
\item [{contrib\index{contrib}}] directory A directory in SVN (module
fpcprojects) where some ported Delphi packages are kept (ICS, Abbrevia,
Decal). This directory is a subdirectory of the projects directory. 
\item [{Cross}]~

\begin{description}
\item [{(cross~-compiling\index{crosscompiling},~-linking\index{crosslinking}~and~-assembling\index{crossassembling})}] Generating
binaries or libraries for other operating system and/or processor
than that you are currently working on.
\item [{(crossbinutils\index{crossbinutils})}] binutils (ld,as,ar) that
generate binaries for other operating systems and processors. 
\item [{(crossbindir\index{crossbindir})}] Place where the crossbinutils
can be found. 
\end{description}
\item [{CVS\index{CVS}}] A version management tool used by the FPC tool
to manage the FPC source code before may 2005 
\item [{Cygwin\index{Cygwin}}] \url{www.cygwin.com} A distribution of
unix tools for windows that tries to stay as close to the original
Unix semantics. See also \textbf{mingw}
\item [{dead~code~elimination\index{dead code elimination}}] GCC or
maybe general C jargon for smartlinking. The default dead code elimination
of gcc is not as finely grained as FPC smartlinking though.
\item [{ELF\index{ELF}}] binary format of most modern unices and unix
likes. Except for Mac OS X (see Mach-O) 
\item [{Export\index{Export}}] (libraries) Making symbols (procedures,
variables) available to the outside. (e.g. outside the unit, outside
the library/program) (SVN) 
\item [{FCL\index{FCL}}] Free Component Libraries. Non visual class libraries,
provided for partial Delphi source compatibility, at least at a non
visual/GUI level. See also \textbf{VCL}. 
\item [{FPC\index{FPC}}]~

\begin{enumerate}
\item Free Pascal Compiler abbrev.
\item The fpc compiler frontend binary. 
\end{enumerate}
\item [{FPCMAKE\index{FPCMAKE}}] util to convert Makefile.fpc to Makefile
\item [{FPMAKE\index{FPMAKE}}] The succesor to fpcmake and make/makefiles
in general that is supposed to render the latter obsolete in 2.2.
The main features are a more maintainable and performant build system
(crosscompiling inclusive)
\item [{FPPKG\index{FPPKG}}] Another build tool scheduled for 2.2 which
should allow auto download+compile of packages, a bit like what the
FreeBSD ports tree with a apt-get like cmdline frontend would look
like. (or portupgrade, which is the proper FreeBSD pendant) 
\item [{FPDOC\index{FPDOC}}] A documentation generation system used by
FPC internally, but also usable for external use. fpdoc takes a XML
file generated by makeskel, and postedited with fpde, processes the
file and generates multiple documentation formats from it (html,text,T
E X) 
\item [{GO32v2\index{GO32v2}}] Pure Dos is 16-bit. FPC programs are 32-bit.
The program that hides the 16-bit nature a bit, and does 32-bit DPMI
dos memory management for 32-bits applications is called the Dos-Extender.
FPC uses the GNU Go32 version 2 dos extender. (though others are possible
in theory, like pmode. See manual)
\item [{Inline\index{Inline}}] If procedure X calls procedure Y, and Y
is flagged for inlining, then Y will be totally optimised away, and
in the final code (in the binary), the code of Y will appear to be
in X. If Y is called on two separate places in X, the code will appear
twice in X. While nearly anything can be flagged \textquotedblleft{}
inline;\textquotedblright , some kinds of procedures/methods are excluded
from inlining, like virtual methods.
\item [{Internal~linker\index{Internal linker}}] A linker built in to
the compiler, as opposed to an external linker like GNU LD. FPC uses
an internal linker in FPC 2.2+ for the three windows platforms (win32/win64/wince) 
\item [{Lazarus\index{Lazarus}}] A multi widget GUI RAD for Free Pascal.
Not a blind Delphi drop in replacement, but the support of GTK makes
it useful. At the moment of writing this, Lazarus is developing rather
fast, for up to date information, see their site \href{http://lazarus.freepascal.org}{Lazarus site}
\item [{LCL\index{LCL}}] The set of Visual classes used by Lazarus and
the programs it generates. The LCL is generally independent of platform
or GUI widget library. Starting with 0.9.28 on {*}nix the LCLwill
use GTK2, win32/64/ce on Windows, and Carbon on OS X. A QT based port
is also available for {*}nix.
\item [{LD\index{LD}}] The GNU linker, which is nearly always the one
used by FPC. 
\item [{Mach-O\index{MachO}}] binary format of OS X/Darwin make cycle
A command to rebuild the FPC compiler and core RTL from source. (bootstrap,
building a new compiler from an older, or other compiler) 
\item [{make~all\index{make all}}] A command to rebuild the entire base
FPC sourcecode. This is roughly equivalent to the snapshots. 
\item [{mangling}] see namemangling
\item [{mingw\index{Mingw}}] (mingw32\index{mingw32},mingw64\index{mingw64}
depending on win32 or win64) A distribution of Unix tools for Windows
that adapts more to ``the windows way'' than \textbf{cygwin.}
\item [{Namemangling\index{Namemangling}}] Languages can have different
namespaces that can contain the same name, however on the linker level
there is only one namespace. Namemangling is the process that maps
the multiple language level namespaces onto the single linker level
namespace. An example is e.g. the unitsystem. Units can contain variables
with the same name. Say unit A contains variable \textquotedblleft buildfaq\textquotedblright ,
and unit B does too. Naming both \textquotedblleft buildfaq\textquotedblright{}
would make them clash on the linker level. A solution is to prefix
the variable name with the unitname. So \textquotedblleft buildfaq\textquotedblright{}
in unit A will be called A\_buildfaq, and in unit B B\_buildfaq. Namemangling
is compiler (and -version) specific, and since the namespace rules
vary with the language also somewhat language specific. An exception
is the C (not C++) language which barely has namespaces, and therefore
often has little or no mangling. The C++ namemangling is a notorious
case, since it changes from compiler to compiler and version to version. 
\item [{NEWRA\index{NEWRA}}] The new improved \index{register allocator}register
allocator of the 1.1.x (2.0+) series. The new register allocator should
improve compiler performance and maintainability by automatically
arranging a fairly optimal register usage. Since this removes the
need for manually keeping track of registers in the codegenerator,this
improves maintainability a lot. 
\item [{Packages\index{Packages}}] is a bit of an ambiguous term when
used in the FPC project. (see also http://wiki.freepascal.org/packages
\url{http://wiki.freepascal.org/packages})

\begin{enumerate}
\item Sometimes \textquotedblleft packages\textquotedblright{} refers exclusively
to the separate unit sets in the packages/ directory of the source
tree, 
\item sometimes it also includes the other separately compilable parts of
the project (like compiler, rtl, fcl, ide, fvision, lazarus, installer
and utils), 
\item a third description is the Delphi language feature with the same name,
a more automated form of dynamic libraries. In this document it\textquoteright s
usually the second one. 
\end{enumerate}
\item [{PIC\index{PIC}}] (Position independent Code) a system for Unix
({*}BSD, Linux) that ensures relocatability of shared libraries, and
allows easy minor version upgrades of libc libraries without recompiling
the library.
\item [{Prefix\index{Prefix}}]~

\begin{enumerate}
\item (PREFIX\index{PREFIX@\$PREFIX}) place where the snapshot building
(make all install) will use as root directory for the installation
of the files. (default: \textbackslash{}pp on windows, /usr/local
on most unices) The dollar sign that is sometimes prepended is the
(Unix) notation for environment or makefile variable, a bit like Windows/DOS
\%something\%.
\item (BINUTILSPREFIX\index{BINUTILSPREFIX}) A string that is prefixed
to the binutils when crosscompiling. Usually in the form processor-operatingsystem-(like
\textquotedblleft i686-mingw32-\textquotedblright ) 
\end{enumerate}
\item [{Projects\index{Projects}}] directory a directory in CVS where
experimental and independent projects are stored. Usually Delphi code
ported to FPC (see contrib directory), and Lazarus. 
\item [{Ptrint\index{Ptrint}}] A integer type that has the same size (in
bits) as the pointer type. 
\item [{PtrUint\index{PtrUint}}] is the unsigned form. Register allocator
The engine that tries to make optimal use of the processor registers
to avoid reloading from memory. 
\item [{Register~parameters\index{Register parameters}}] A calling convention
that tries to put parameters to procedures in registers. Delphi has
a register calling convention by default. FPC is slowly starting to
support register parameters now (thanks to NEWRA changes). Most non
PC processor types also use register parameters. Since December 2003,
FPC defaults to this convention on i386 too, for Delphi compatibility.During
the last months of 2006, a bug was found in the Delphi compatibility
of register parameters; when procedures use more than 4 parameters
(one less for methods), the fact that FPC pushes the parameters in
the opposite order of Delphi becomes a problem. This probably will
be tackled in FPC 2.1.1 in spring 2007. 
\item [{Register~variables\index{Register variables}}] An optimization
technique that avoids reloading variables from memory into the main
CPU\textquoteright s registers by trying to keep frequently used variables
in registers as much as possible. FPC 1.0.x had this in a primitive
way based on reserving a few registers for variables. FPC 2.x has
a way more intelligent system as a part of the register allocator 
\item [{RTL\index{RTL}}] RunTime libraries. The base set of libraries
used by FPC. These include e.g. the System unit, the dos unit, the
sysutils unit and a platform dependant unit. The System unit also
contains functions that the compiler calls internally to do more complex
language operations like SET and string handling. 
\item [{shared~linking\index{shared linking}}] Linking with dynamic libraries
(unix: .so shared libraries; win32: .dll shared libraries) 
\item [{smart~linking\index{smart linking}}] essentially avoids linking
of unused code into the final binary. See the separate paragraph (1.8)
elsewhere in this document for more details. 
\item [{static~linking\index{static linking}}] The ordinary way of linking,
producing one standalone binary, though sometimes smartlinking is
also called \textquotedblleft static\textquotedblright{} linking.
This might be true for C, but FPC has two different modes because
with FPC the granularity of smartlinking typically is higher. 
\item [{Starting~compiler\index{starting compiler}}] A compiler that
is used to build a new compiler.
\item [{Subversion\index{Subversion}(SVN\index{SVN})}] The current version
management system.
\item [{tag\index{tag}(CVS,SVN)}] A tag simply identifies a bunch of different
files that belong together. It\textquoteright s commonly used to mark
the set of versions that are released as a formal (pre)release. E.g.
the FPC 1.0.10 release is tagged with RELEASE\_1\_0\_10 etc. 
\item [{target\index{target}}]~

\begin{enumerate}
\item Roughly the operating system and CPU that the binary must run on,
typically in CPU-OS notation (e.g. i386-freebsd) There are exceptions
though, like Dos has a target for each extender, and some compilers
have multiple targets for Windows (gcc: mingw, cygwin) too. Some toolchain
let the CPU reflect the CPU that is optimised for (i386,i486, i586
etc), some not. FPC does not (all i<x>86 platforms, x>=3, are called
i386) 
\item Lazarus adds the widget set too, e.g. x86-win32-win32 (i386+ processor,
win32 OS, and win32 (GDI) widgetset) and x86\_64-win64-win32 (means
64-bit x86 CPU, win64 OS, and win32 widgetset (GDI)).\footnote{The fact that lazarus names the widgetset for win64 ``win32'' doesn't
mean it is some form of 32-bit emulation. The differences were simply
too small to define an additional target}
\end{enumerate}
\item [{VCL\index{VCL}}] Borland\textquoteright s classes libraries. Since
these contain bot win32 GUI and non-GUI classes. the VCL rougly equates
to the non visual FCL classes plus the visual classes in Lazarus\textquoteright{}
LCL. 
\item [{Widgetset\index{Widgetset}}] A library or API for visual output.
(originates on Unix where core drawing, and windowing is separated) 
\item [{win32\index{win32}}]~

\begin{enumerate}
\item The API of Windows 9x and NT,2000,XP that is roughly the same over
all versions. (though newer versions add more calls). A cut down win32
api is available for win3.1x and is called \textquotedblleft win32s\textquotedblright .
FPC doesn\textquoteright t support win32s (actually: it was never
tested is a better description) 
\item The FPC target for this api
\item In Lazarus it is also the designation for the graphical part of the
win32 api (which is actually called GDI, roughly the widgetset). Lazarus
windows binaries for target win32 and win64, have as widget set.
\end{enumerate}
\item [{Win64\index{Win64}}] The 64-bit variant of the win32 API. Very
close to win32.
\item [{wince\index{wince}}] The windows api the mobile Windows versions
(wince/pocketpc/windowsmobile) are based on. Note that nowadays also
\textquotedblleft XP embedded\textquotedblright{} exists which is
win32 based, but based on the NT kernel, so specially with tablet
PCs make sure what you exactly have. 
\item [{winNT}] \index{winNT} The common underpinnings of NT4, windows
2000 (NT5) ,XP (NT5.1) ,2003 (NT5.2),Vista (NT6), 2008 and 7 (NT7)
\item [{windres}] \index{windres} A resourcecompiler used to turn resource
scripts into .res files that can be included by the linker.
\end{description}
\printindex{}
\end{document}