summaryrefslogtreecommitdiff
path: root/doc/src/sgml/installation.sgml
blob: 7353c612b1f6721161c8b7e2c29e4b5955446922 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
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
<!-- doc/src/sgml/installation.sgml -->
<!--

Use </link> not just </> so INSTALL.html can be created without links
to the main documentation.  Don't use <xref>; or if you must, wrap it
in a standalone-ignore clause.

-->

<chapter id="installation">
 <title><![%standalone-include[<productname>PostgreSQL</>]]>
  Installation from Source Code</title>

 <indexterm zone="installation">
  <primary>installation</primary>
 </indexterm>

 <para>
  This <![%standalone-include;[document]]>
  <![%standalone-ignore;[chapter]]> describes the installation of
  <productname>PostgreSQL</productname> using the source code
  distribution.  (If you are installing a pre-packaged distribution,
  such as an RPM or Debian package, ignore this
  <![%standalone-include;[document]]>
  <![%standalone-ignore;[chapter]]>
  and read the packager's instructions instead.)
 </para>

 <sect1 id="install-short">
  <title>Short Version</title>

  <para>
<synopsis>
./configure
make
su
make install
adduser postgres
mkdir /usr/local/pgsql/data
chown postgres /usr/local/pgsql/data
su - postgres
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data &gt;logfile 2&gt;&amp;1 &amp;
/usr/local/pgsql/bin/createdb test
/usr/local/pgsql/bin/psql test
</synopsis>
   The long version is the rest of this
   <![%standalone-include;[document.]]>
   <![%standalone-ignore;[chapter.]]>
  </para>
 </sect1>


 <sect1 id="install-requirements">
  <title>Requirements</title>

  <para>
   In general, a modern Unix-compatible platform should be able to run
   <productname>PostgreSQL</>.
   The platforms that had received specific testing at the
   time of release are listed in <xref linkend="supported-platforms">
   below. In the <filename>doc</> subdirectory of the distribution
   there are several platform-specific <acronym>FAQ</> documents you
   might wish to consult if you are having trouble.
  </para>

  <para>
   The following software packages are required for building
   <productname>PostgreSQL</>:

   <itemizedlist>
    <listitem>
     <para>
      <indexterm>
       <primary>make</primary>
      </indexterm>

      <acronym>GNU</> <application>make</> version 3.80 or newer is required; other
      <application>make</> programs or older <acronym>GNU</> <application>make</> versions will <emphasis>not</> work.
      (<acronym>GNU</> <application>make</> is sometimes installed under
      the name <filename>gmake</filename>.)  To test for <acronym>GNU</acronym>
      <application>make</application> enter:
<screen>
<userinput>make --version</userinput>
</screen>
     </para>
    </listitem>

    <listitem>
     <para>
      You need an <acronym>ISO</>/<acronym>ANSI</> C compiler (at least
      C89-compliant). Recent
      versions of <productname>GCC</> are recommended, but
      <productname>PostgreSQL</> is known to build using a wide variety
      of compilers from different vendors.
     </para>
    </listitem>

    <listitem>
     <para>
      <application>tar</> is required to unpack the source
      distribution, in addition to either
      <application>gzip</> or <application>bzip2</>.
     </para>
    </listitem>

    <listitem>
     <para>
      <indexterm>
       <primary>readline</primary>
      </indexterm>
      <indexterm>
       <primary>libedit</primary>
      </indexterm>

      The <acronym>GNU</> <productname>Readline</> library is used by
      default.  It allows <application>psql</application> (the
      PostgreSQL command line SQL interpreter) to remember each
      command you type, and allows you to use arrow keys to recall and
      edit previous commands.  This is very helpful and is strongly
      recommended.  If you don't want to use it then you must specify
      the <option>--without-readline</option> option to
      <filename>configure</>. As an alternative, you can often use the
      BSD-licensed <filename>libedit</filename> library, originally
      developed on <productname>NetBSD</productname>. The
      <filename>libedit</filename> library is
      GNU <productname>Readline</productname>-compatible and is used if
      <filename>libreadline</filename> is not found, or if
      <option>--with-libedit-preferred</option> is used as an
      option to <filename>configure</>. If you are using a package-based
      Linux distribution, be aware that you need both the
      <literal>readline</> and <literal>readline-devel</> packages, if
      those are separate in your distribution.
     </para>
    </listitem>

    <listitem>
     <para>
      <indexterm>
       <primary>zlib</primary>
      </indexterm>

      The <productname>zlib</productname> compression library is
      used by default. If you don't want to use it then you must
      specify the <option>--without-zlib</option> option to
      <filename>configure</filename>. Using this option disables
      support for compressed archives in <application>pg_dump</> and
      <application>pg_restore</>.
     </para>
    </listitem>
   </itemizedlist>
  </para>

  <para>
   The following packages are optional.  They are not required in the
   default configuration, but they are needed when certain build
   options are enabled, as explained below:

   <itemizedlist>
    <listitem>
     <para>
      To build the server programming language
      <application>PL/Perl</application> you need a full
      <productname>Perl</productname> installation, including the
      <filename>libperl</filename> library and the header files.
      Since <application>PL/Perl</application> will be a shared
      library, the <indexterm><primary>libperl</primary></indexterm>
      <filename>libperl</filename> library must be a shared library
      also on most platforms.  This appears to be the default in
      recent <productname>Perl</productname> versions, but it was not
      in earlier versions, and in any case it is the choice of whomever
      installed Perl at your site.
      If you intend to make more than incidental use of
      <application>PL/Perl</application>, you should ensure that the
      <productname>Perl</productname> installation was built with the
      <literal>usemultiplicity</> option enabled (<literal>perl -V</>
      will show whether this is the case).
     </para>

     <para>
      If you don't have the shared library but you need one, a message
      like this will appear during the <productname>PostgreSQL</>
      build to point out this fact:
<screen>
*** Cannot build PL/Perl because libperl is not a shared library.
*** You might have to rebuild your Perl installation.  Refer to
*** the documentation for details.
</screen>
      (If you don't follow the on-screen output you will merely notice
      that the <application>PL/Perl</application> library object,
      <filename>plperl.so</filename> or similar, will not be
      installed.)  If you see this, you will have to rebuild and
      install <productname>Perl</productname> manually to be able to
      build <application>PL/Perl</application>.  During the
      configuration process for <productname>Perl</productname>,
      request a shared library.
     </para>
    </listitem>

    <listitem>
     <para>
      To build the <application>PL/Python</> server programming
      language, you need a <productname>Python</productname>
      installation with the header files and
      the <application>distutils</application> module.  The minimum
      required version is <productname>Python</productname> 2.3.
      (To work with function arguments of type <type>numeric</>, a 2.3.x
      installation must include the separately-available <filename>cdecimal</>
      module; note the <application>PL/Python</> regression tests
      will not pass if that is missing.)
      <productname>Python 3</productname> is supported if it's
      version 3.1 or later; but see
      <![%standalone-include[the <application>PL/Python</> documentation]]>
      <![%standalone-ignore[<xref linkend="plpython-python23">]]>
      when using Python 3.
     </para>

     <para>
      Since <application>PL/Python</application> will be a shared
      library, the <indexterm><primary>libpython</primary></indexterm>
      <filename>libpython</filename> library must be a shared library
      also on most platforms.  This is not the case in a default
      <productname>Python</productname> installation.  If after
      building and installing <productname>PostgreSQL</> you have a file called
      <filename>plpython.so</filename> (possibly a different
      extension), then everything went well.  Otherwise you should
      have seen a notice like this flying by:
<screen>
*** Cannot build PL/Python because libpython is not a shared library.
*** You might have to rebuild your Python installation.  Refer to
*** the documentation for details.
</screen>
      That means you have to rebuild (part of) your
      <productname>Python</productname> installation to create this
      shared library.
     </para>

     <para>
      If you have problems, run <productname>Python</> 2.3 or later's
      configure using the <literal>--enable-shared</> flag.  On some
      operating systems you don't have to build a shared library, but
      you will have to convince the <productname>PostgreSQL</> build
      system of this.  Consult the <filename>Makefile</filename> in
      the <filename>src/pl/plpython</filename> directory for details.
     </para>
    </listitem>

    <listitem>
     <para>
      To build the <application>PL/Tcl</application>
      procedural language, you of course need a <productname>Tcl</>
      installation.  If you are using a pre-8.4 release of
      <productname>Tcl</>, ensure that it was built without multithreading
      support.
     </para>
    </listitem>

    <listitem>
     <para>
      To enable Native Language Support (<acronym>NLS</acronym>), that
      is, the ability to display a program's messages in a language
      other than English, you need an implementation of the
      <application>Gettext</> <acronym>API</acronym>.  Some operating
      systems have this built-in (e.g., <systemitem
      class="osname">Linux</>, <systemitem class="osname">NetBSD</>,
      <systemitem class="osname">Solaris</>), for other systems you
      can download an add-on package from <ulink
      url="http://www.gnu.org/software/gettext/"></ulink>.
      If you are using the <application>Gettext</> implementation in
      the <acronym>GNU</acronym> C library then you will additionally
      need the <productname>GNU Gettext</productname> package for some
      utility programs.  For any of the other implementations you will
      not need it.
     </para>
    </listitem>

    <listitem>
     <para>
      You need <application>Kerberos</>, <productname>OpenSSL</>,
      <productname>OpenLDAP</>, and/or
      <application>PAM</>, if you want to support authentication or
      encryption using those services.
     </para>
    </listitem>

    <listitem>
     <para>
      To build the <productname>PostgreSQL</productname> documentation,
      there is a separate set of requirements; see
      <![%standalone-ignore;[<xref linkend="docguide-toolsets">.]]>
      <![%standalone-include;[the main documentation's appendix on
      documentation.]]>
     </para>
    </listitem>
   </itemizedlist>
  </para>

  <para>
   If you are building from a <productname>Git</productname> tree instead of
   using a released source package, or if you want to do server development,
   you also need the following packages:

   <itemizedlist>
    <listitem>
     <para>
      <indexterm>
       <primary>flex</primary>
      </indexterm>
      <indexterm>
       <primary>lex</primary>
      </indexterm>
      <indexterm>
       <primary>bison</primary>
      </indexterm>
      <indexterm>
       <primary>yacc</primary>
      </indexterm>

      GNU <application>Flex</> and <application>Bison</>
      are needed to build from a Git checkout, or if you changed the actual
      scanner and parser definition files. If you need them, be sure
      to get <application>Flex</> 2.5.31 or later and
      <application>Bison</> 1.875 or later. Other <application>lex</>
      and <application>yacc</> programs cannot be used.
     </para>
    </listitem>
    <listitem>
     <para>
      <indexterm>
       <primary>perl</primary>
      </indexterm>

      <application>Perl</> 5.8 or later is needed to build from a Git checkout,
      or if you changed the input files for any of the build steps that
      use Perl scripts.  If building on Windows you will need
      <application>Perl</> in any case.  <application>Perl</application> is
      also required to run some test suites.
     </para>
    </listitem>
   </itemizedlist>
  </para>

  <para>
   If you need to get a <acronym>GNU</acronym> package, you can find
   it at your local <acronym>GNU</acronym> mirror site (see <ulink
   url="http://www.gnu.org/order/ftp.html"></>
   for a list) or at <ulink
   url="ftp://ftp.gnu.org/gnu/"></ulink>.
  </para>

  <para>
   Also check that you have sufficient disk space. You will need about
   100 MB for the source tree during compilation and about 20 MB for
   the installation directory. An empty database cluster takes about
   35 MB; databases take about five times the amount of space that a
   flat text file with the same data would take. If you are going to
   run the regression tests you will temporarily need up to an extra
   150 MB. Use the <command>df</command> command to check free disk
   space.
  </para>
 </sect1>

<![%standalone-ignore;[
 <sect1 id="install-getsource">
  <title>Getting The Source</title>

  <para>
   The <productname>PostgreSQL</> &version; sources can be obtained from the
   download section of our
   website: <ulink url="http://www.postgresql.org/download/"></ulink>.  You
   should get a file named <filename>postgresql-&version;.tar.gz</filename>
   or <filename>postgresql-&version;.tar.bz2</filename>. After
   you have obtained the file, unpack it:
<screen>
<userinput>gunzip postgresql-&version;.tar.gz</userinput>
<userinput>tar xf postgresql-&version;.tar</userinput>
</screen>
   (Use <command>bunzip2</command> instead of <command>gunzip</command> if you
   have the <filename>.bz2</filename> file.)
   This will create a directory
   <filename>postgresql-&version;</filename> under the current directory
   with the <productname>PostgreSQL</> sources.
   Change into that directory for the rest
   of the installation procedure.
  </para>

  <para>
   You can also get the source directly from the version control repository, see
   <xref linkend="sourcerepo">.
  </para>
 </sect1>
]]>

 <sect1 id="install-procedure">
  <title>Installation Procedure</title>

  <procedure>

  <step id="configure">
   <title>Configuration</title>

   <indexterm zone="configure">
    <primary>configure</primary>
   </indexterm>

   <para>
    The first step of the installation procedure is to configure the
    source tree for your system and choose the options you would like.
    This is done by running the <filename>configure</> script. For a
    default installation simply enter:
<screen>
<userinput>./configure</userinput>
</screen>
    This script will run a number of tests to determine values for various
    system dependent variables and detect any quirks of your
    operating system, and finally will create several files in the
    build tree to record what it found.  You can also run
    <filename>configure</filename> in a directory outside the source
    tree, if you want to keep the build directory separate.  This
    procedure is also called a
    <indexterm><primary>VPATH</primary></indexterm><firstterm>VPATH</firstterm>
    build.  Here's how:
<screen>
<userinput>mkdir build_dir</userinput>
<userinput>cd build_dir</userinput>
<userinput>/path/to/source/tree/configure [options go here]</userinput>
<userinput>make</userinput>
</screen>
   </para>

   <para>
    The default configuration will build the server and utilities, as
    well as all client applications and interfaces that require only a
    C compiler. All files will be installed under
    <filename>/usr/local/pgsql</> by default.
   </para>

   <para>
    You can customize the build and installation process by supplying one
    or more of the following command line options to
    <filename>configure</filename>:

     <variablelist>
      <varlistentry>
       <term><option>--prefix=<replaceable>PREFIX</></option></term>
       <listitem>
        <para>
         Install all files under the directory <replaceable>PREFIX</>
         instead of <filename>/usr/local/pgsql</filename>. The actual
         files will be installed into various subdirectories; no files
         will ever be installed directly into the
         <replaceable>PREFIX</> directory.
        </para>

        <para>
         If you have special needs, you can also customize the
         individual subdirectories with the following options. However,
         if you leave these with their defaults, the installation will be
         relocatable, meaning you can move the directory after
         installation. (The <literal>man</> and <literal>doc</>
         locations are not affected by this.)
        </para>

        <para>
         For relocatable installs, you might want to use
         <filename>configure</filename>'s <literal>--disable-rpath</>
         option.  Also, you will need to tell the operating system how
         to find the shared libraries.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--exec-prefix=<replaceable>EXEC-PREFIX</></option></term>
       <listitem>
        <para>
         You can install architecture-dependent files under a
         different prefix, <replaceable>EXEC-PREFIX</>, than what
         <replaceable>PREFIX</> was set to. This can be useful to
         share architecture-independent files between hosts. If you
         omit this, then <replaceable>EXEC-PREFIX</> is set equal to
         <replaceable>PREFIX</> and both architecture-dependent and
         independent files will be installed under the same tree,
         which is probably what you want.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--bindir=<replaceable>DIRECTORY</></option></term>
       <listitem>
        <para>
         Specifies the directory for executable programs. The default
         is <filename><replaceable>EXEC-PREFIX</>/bin</>, which
         normally means <filename>/usr/local/pgsql/bin</>.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--sysconfdir=<replaceable>DIRECTORY</></option></term>
       <listitem>
        <para>
         Sets the directory for various configuration files,
         <filename><replaceable>PREFIX</>/etc</> by default.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--libdir=<replaceable>DIRECTORY</></option></term>
       <listitem>
        <para>
         Sets the location to install libraries and dynamically loadable
         modules. The default is
         <filename><replaceable>EXEC-PREFIX</>/lib</>.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--includedir=<replaceable>DIRECTORY</></option></term>
       <listitem>
        <para>
         Sets the directory for installing C and C++ header files. The
         default is <filename><replaceable>PREFIX</>/include</>.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--datarootdir=<replaceable>DIRECTORY</></option></term>
       <listitem>
        <para>
         Sets the root directory for various types of read-only data
         files.  This only sets the default for some of the following
         options.  The default is
         <filename><replaceable>PREFIX</>/share</>.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--datadir=<replaceable>DIRECTORY</></option></term>
       <listitem>
        <para>
         Sets the directory for read-only data files used by the
         installed programs. The default is
         <filename><replaceable>DATAROOTDIR</></>. Note that this has
         nothing to do with where your database files will be placed.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--localedir=<replaceable>DIRECTORY</></option></term>
       <listitem>
        <para>
         Sets the directory for installing locale data, in particular
         message translation catalog files.  The default is
         <filename><replaceable>DATAROOTDIR</>/locale</>.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--mandir=<replaceable>DIRECTORY</></option></term>
       <listitem>
        <para>
         The man pages that come with <productname>PostgreSQL</> will be installed under
         this directory, in their respective
         <filename>man<replaceable>x</></> subdirectories.
         The default is <filename><replaceable>DATAROOTDIR</>/man</>.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--docdir=<replaceable>DIRECTORY</></option></term>
       <listitem>
        <para>
         Sets the root directory for installing documentation files,
         except <quote>man</> pages.  This only sets the default for
         the following options.  The default value for this option is
         <filename><replaceable>DATAROOTDIR</>/doc/postgresql</>.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--htmldir=<replaceable>DIRECTORY</></option></term>
       <listitem>
        <para>
         The HTML-formatted documentation for
         <productname>PostgreSQL</productname> will be installed under
         this directory.  The default is
         <filename><replaceable>DATAROOTDIR</></>.
        </para>
       </listitem>
      </varlistentry>
     </variablelist>

     <note>
      <para>
       Care has been taken to make it possible to install
       <productname>PostgreSQL</> into shared installation locations
       (such as <filename>/usr/local/include</filename>) without
       interfering with the namespace of the rest of the system. First,
       the string <quote><literal>/postgresql</literal></quote> is
       automatically appended to <varname>datadir</varname>,
       <varname>sysconfdir</varname>, and <varname>docdir</varname>,
       unless the fully expanded directory name already contains the
       string <quote><literal>postgres</></quote> or
       <quote><literal>pgsql</></quote>. For example, if you choose
       <filename>/usr/local</filename> as prefix, the documentation will
       be installed in <filename>/usr/local/doc/postgresql</filename>,
       but if the prefix is <filename>/opt/postgres</filename>, then it
       will be in <filename>/opt/postgres/doc</filename>. The public C
       header files of the client interfaces are installed into
       <varname>includedir</varname> and are namespace-clean. The
       internal header files and the server header files are installed
       into private directories under <varname>includedir</varname>. See
       the documentation of each interface for information about how to
       access its header files. Finally, a private subdirectory will
       also be created, if appropriate, under <varname>libdir</varname>
       for dynamically loadable modules.
      </para>
     </note>
    </para>

    <para>
     <variablelist>
      <varlistentry>
       <term><option>--with-extra-version=<replaceable>STRING</></option></term>
       <listitem>
        <para>
         Append <replaceable>STRING</> to the PostgreSQL version number.  You
         can use this, for example, to mark binaries built from unreleased Git
         snapshots or containing custom patches with an extra version string
         such as a <command>git describe</command> identifier or a
         distribution package release number.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--with-includes=<replaceable>DIRECTORIES</></option></term>
       <listitem>
        <para>
         <replaceable>DIRECTORIES</> is a colon-separated list of
         directories that will be added to the list the compiler
         searches for header files. If you have optional packages
         (such as GNU <application>Readline</>) installed in a non-standard
         location,
         you have to use this option and probably also the corresponding
         <option>--with-libraries</> option.
        </para>
        <para>
         Example: <literal>--with-includes=/opt/gnu/include:/usr/sup/include</>.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--with-libraries=<replaceable>DIRECTORIES</></option></term>
       <listitem>
        <para>
         <replaceable>DIRECTORIES</> is a colon-separated list of
         directories to search for libraries. You will probably have
         to use this option (and the corresponding
         <option>--with-includes</> option) if you have packages
         installed in non-standard locations.
        </para>
        <para>
         Example: <literal>--with-libraries=/opt/gnu/lib:/usr/sup/lib</>.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--enable-nls<optional>=<replaceable>LANGUAGES</replaceable></optional></option></term>
       <listitem>
        <para>
         Enables Native Language Support (<acronym>NLS</acronym>),
         that is, the ability to display a program's messages in a
         language other than English.
         <replaceable>LANGUAGES</replaceable> is an optional space-separated
         list of codes of the languages that you want supported, for
         example <literal>--enable-nls='de fr'</>.  (The intersection
         between your list and the set of actually provided
         translations will be computed automatically.)  If you do not
         specify a list, then all available translations are
         installed.
        </para>

        <para>
         To use this option, you will need an implementation of the
         <application>Gettext</> API; see above.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--with-pgport=<replaceable>NUMBER</></option></term>
       <listitem>
        <para>
         Set <replaceable>NUMBER</> as the default port number for
         server and clients. The default is 5432. The port can always
         be changed later on, but if you specify it here then both
         server and clients will have the same default compiled in,
         which can be very convenient.  Usually the only good reason
         to select a non-default value is if you intend to run multiple
         <productname>PostgreSQL</> servers on the same machine.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--with-perl</option></term>
       <listitem>
        <para>
         Build the <application>PL/Perl</> server-side language.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--with-python</option></term>
       <listitem>
        <para>
         Build the <application>PL/Python</> server-side language.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--with-tcl</option></term>
       <listitem>
        <para>
         Build the <application>PL/Tcl</> server-side language.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--with-tclconfig=<replaceable>DIRECTORY</replaceable></option></term>
       <listitem>
        <para>
         Tcl installs the file <filename>tclConfig.sh</filename>, which
         contains configuration information needed to build modules
         interfacing to Tcl. This file is normally found automatically
         at a well-known location, but if you want to use a different
         version of Tcl you can specify the directory in which to look
         for it.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--with-gssapi</option></term>
       <listitem>
        <para>
         Build with support for GSSAPI authentication. On many
         systems, the GSSAPI (usually a part of the Kerberos installation)
         system is not installed in a location
         that is searched by default (e.g., <filename>/usr/include</>,
         <filename>/usr/lib</>), so you must use the options
         <option>--with-includes</> and <option>--with-libraries</> in
         addition to this option.  <filename>configure</> will check
         for the required header files and libraries to make sure that
         your GSSAPI installation is sufficient before proceeding.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--with-krb-srvnam=<replaceable>NAME</></option></term>
       <listitem>
        <para>
         The default name of the Kerberos service principal used
         by GSSAPI.
         <literal>postgres</literal> is the default. There's usually no
         reason to change this unless you have a Windows environment,
         in which case it must be set to upper case
         <literal>POSTGRES</literal>.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--with-openssl</option>
       <indexterm>
        <primary>OpenSSL</primary>
        <seealso>SSL</seealso>
       </indexterm>
       </term>
       <listitem>
        <para>
         Build with support for <acronym>SSL</> (encrypted)
         connections. This requires the <productname>OpenSSL</>
         package to be installed.  <filename>configure</> will check
         for the required header files and libraries to make sure that
         your <productname>OpenSSL</> installation is sufficient
         before proceeding.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--with-pam</option></term>
       <listitem>
        <para>
         Build with <acronym>PAM</><indexterm><primary>PAM</></>
         (Pluggable Authentication Modules) support.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--with-ldap</option></term>
       <listitem>
        <para>
         Build with <acronym>LDAP</><indexterm><primary>LDAP</></>
         support for authentication and connection parameter lookup (see
         <![%standalone-include[the documentation about client authentication
         and libpq]]><![%standalone-ignore[<xref linkend="libpq-ldap"> and
         <xref linkend="auth-ldap">]]> for more information). On Unix,
         this requires the <productname>OpenLDAP</> package to be
         installed. On Windows, the default <productname>WinLDAP</>
         library is used.  <filename>configure</> will check for the required
         header files and libraries to make sure that your
         <productname>OpenLDAP</> installation is sufficient before
         proceeding.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--without-readline</option></term>
       <listitem>
        <para>
         Prevents use of the <application>Readline</> library
         (and <application>libedit</> as well).  This option disables
         command-line editing and history in
         <application>psql</application>, so it is not recommended.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--with-libedit-preferred</option></term>
       <listitem>
        <para>
         Favors the use of the BSD-licensed <application>libedit</> library
         rather than GPL-licensed <application>Readline</>.  This option
         is significant only if you have both libraries installed; the
         default in that case is to use <application>Readline</>.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--with-bonjour</option></term>
       <listitem>
        <para>
         Build with Bonjour support.  This requires Bonjour support
         in your operating system.  Recommended on Mac OS X.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--with-uuid=<replaceable>LIBRARY</replaceable></option></term>
       <listitem>
        <para>
         Build the <![%standalone-include[uuid-ossp]]>
         <![%standalone-ignore[<xref linkend="uuid-ossp">]]> module
         (which provides functions to generate UUIDs), using the specified
         UUID library.<indexterm><primary>UUID</primary></indexterm>
         <replaceable>LIBRARY</replaceable> must be one of:
        </para>
        <itemizedlist>
         <listitem>
          <para>
           <option>bsd</> to use the UUID functions found in FreeBSD, NetBSD,
           and some other BSD-derived systems
          </para>
         </listitem>
         <listitem>
          <para>
           <option>e2fs</> to use the UUID library created by
           the <literal>e2fsprogs</> project; this library is present in most
           Linux systems and in Mac OS X, and can be obtained for other
           platforms as well
          </para>
         </listitem>
         <listitem>
          <para>
           <option>ossp</> to use the <ulink
           url="http://www.ossp.org/pkg/lib/uuid/">OSSP UUID library</ulink>
          </para>
         </listitem>
        </itemizedlist>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--with-ossp-uuid</option></term>
       <listitem>
        <para>
         Obsolete equivalent of <literal>--with-uuid=ossp</literal>.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--with-libxml</option></term>
       <listitem>
        <para>
         Build with libxml (enables SQL/XML support).  Libxml version 2.6.23 or
         later is required for this feature.
        </para>

        <para>
         Libxml installs a program <command>xml2-config</command> that
         can be used to detect the required compiler and linker
         options.  PostgreSQL will use it automatically if found.  To
         specify a libxml installation at an unusual location, you can
         either set the environment variable
         <envar>XML2_CONFIG</envar> to point to the
         <command>xml2-config</command> program belonging to the
         installation, or use the options
         <option>--with-includes</option> and
         <option>--with-libraries</option>.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--with-libxslt</option></term>
       <listitem>
        <para>
         Use libxslt when building the
         <![%standalone-include[xml2]]>
         <![%standalone-ignore[<xref linkend="xml2">]]>
         module.  <application>xml2</> relies on this library
         to perform XSL transformations of XML.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--disable-integer-datetimes</option></term>
       <listitem>
        <para>
         Disable support for 64-bit integer storage for timestamps and
         intervals, and store datetime values as floating-point
         numbers instead. Floating-point datetime storage was the
         default in <productname>PostgreSQL</productname> releases
         prior to 8.4, but it is now deprecated, because it does not
         support microsecond precision for the full range of
         <type>timestamp</type> values. However, integer-based
         datetime storage requires a 64-bit integer type. Therefore,
         this option can be used when no such type is available, or
         for compatibility with applications written for prior
         versions of <productname>PostgreSQL</productname>. See
         <![%standalone-include[the documentation about datetime datatypes]]>
         <![%standalone-ignore[<xref linkend="datatype-datetime">]]>
         for more information.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--disable-float4-byval</option></term>
       <listitem>
        <para>
         Disable passing float4 values <quote>by value</>, causing them
         to be passed <quote>by reference</> instead.  This option costs
         performance, but may be needed for compatibility with old
         user-defined functions that are written in C and use the
         <quote>version 0</> calling convention.  A better long-term
         solution is to update any such functions to use the
         <quote>version 1</> calling convention.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--disable-float8-byval</option></term>
       <listitem>
        <para>
         Disable passing float8 values <quote>by value</>, causing them
         to be passed <quote>by reference</> instead.  This option costs
         performance, but may be needed for compatibility with old
         user-defined functions that are written in C and use the
         <quote>version 0</> calling convention.  A better long-term
         solution is to update any such functions to use the
         <quote>version 1</> calling convention.
         Note that this option affects not only float8, but also int8 and some
         related types such as timestamp.
         On 32-bit platforms, <option>--disable-float8-byval</> is the default
         and it is not allowed to select <option>--enable-float8-byval</>.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--with-segsize=<replaceable>SEGSIZE</replaceable></option></term>
       <listitem>
        <para>
         Set the <firstterm>segment size</>, in gigabytes.  Large tables are
         divided into multiple operating-system files, each of size equal
         to the segment size.  This avoids problems with file size limits
         that exist on many platforms.  The default segment size, 1 gigabyte,
         is safe on all supported platforms.  If your operating system has
         <quote>largefile</> support (which most do, nowadays), you can use
         a larger segment size.  This can be helpful to reduce the number of
         file descriptors consumed when working with very large tables.
         But be careful not to select a value larger than is supported
         by your platform and the file systems you intend to use.  Other
         tools you might wish to use, such as <application>tar</>, could
         also set limits on the usable file size.
         It is recommended, though not absolutely required, that this value
         be a power of 2.
         Note that changing this value requires an initdb.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--with-blocksize=<replaceable>BLOCKSIZE</replaceable></option></term>
       <listitem>
        <para>
         Set the <firstterm>block size</>, in kilobytes.  This is the unit
         of storage and I/O within tables.  The default, 8 kilobytes,
         is suitable for most situations; but other values may be useful
         in special cases.
         The value must be a power of 2 between 1 and 32 (kilobytes).
         Note that changing this value requires an initdb.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--with-wal-segsize=<replaceable>SEGSIZE</replaceable></option></term>
       <listitem>
        <para>
         Set the <firstterm>WAL segment size</>, in megabytes.  This is
         the size of each individual file in the WAL log.  It may be useful
         to adjust this size to control the granularity of WAL log shipping.
         The default size is 16 megabytes.
         The value must be a power of 2 between 1 and 64 (megabytes).
         Note that changing this value requires an initdb.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--with-wal-blocksize=<replaceable>BLOCKSIZE</replaceable></option></term>
       <listitem>
        <para>
         Set the <firstterm>WAL block size</>, in kilobytes.  This is the unit
         of storage and I/O within the WAL log.  The default, 8 kilobytes,
         is suitable for most situations; but other values may be useful
         in special cases.
         The value must be a power of 2 between 1 and 64 (kilobytes).
         Note that changing this value requires an initdb.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--disable-spinlocks</option></term>
       <listitem>
        <para>
         Allow the build to succeed even if <productname>PostgreSQL</>
         has no CPU spinlock support for the platform.  The lack of
         spinlock support will result in poor performance; therefore,
         this option should only be used if the build aborts and
         informs you that the platform lacks spinlock support. If this
         option is required to build <productname>PostgreSQL</> on
         your platform, please report the problem to the
         <productname>PostgreSQL</> developers.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--disable-thread-safety</option></term>
       <listitem>
        <para>
         Disable the thread-safety of client libraries.  This prevents
         concurrent threads in <application>libpq</application> and
         <application>ECPG</application> programs from safely controlling
         their private connection handles.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--with-system-tzdata=<replaceable>DIRECTORY</replaceable></option>
       <indexterm>
        <primary>time zone data</primary>
       </indexterm>
       </term>
       <listitem>
        <para>
         <productname>PostgreSQL</> includes its own time zone database,
         which it requires for date and time operations.  This time zone
         database is in fact compatible with the <quote>zoneinfo</> time zone
         database provided by many operating systems such as FreeBSD,
         Linux, and Solaris, so it would be redundant to install it again.
         When this option is used, the system-supplied time zone database
         in <replaceable>DIRECTORY</replaceable> is used instead of the one
         included in the PostgreSQL source distribution.
         <replaceable>DIRECTORY</replaceable> must be specified as an
         absolute path.  <filename>/usr/share/zoneinfo</filename> is a
         likely directory on some operating systems.  Note that the
         installation routine will not detect mismatching or erroneous time
         zone data.  If you use this option, you are advised to run the
         regression tests to verify that the time zone data you have
         pointed to works correctly with <productname>PostgreSQL</>.
        </para>

        <indexterm><primary>cross compilation</primary></indexterm>

        <para>
         This option is mainly aimed at binary package distributors
         who know their target operating system well.  The main
         advantage of using this option is that the PostgreSQL package
         won't need to be upgraded whenever any of the many local
         daylight-saving time rules change.  Another advantage is that
         PostgreSQL can be cross-compiled more straightforwardly if the
         time zone database files do not need to be built during the
         installation.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--without-zlib</option></term>
       <listitem>
        <para>
         <indexterm>
          <primary>zlib</primary>
         </indexterm>
         Prevents use of the <application>Zlib</> library.  This disables
         support for compressed archives in <application>pg_dump</application>
         and <application>pg_restore</application>.
         This option is only intended for those rare systems where this
         library is not available.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--enable-debug</option></term>
       <listitem>
        <para>
         Compiles all programs and libraries with debugging symbols.
         This means that you can run the programs in a debugger
         to analyze problems. This enlarges the size of the installed
         executables considerably, and on non-GCC compilers it usually
         also disables compiler optimization, causing slowdowns. However,
         having the symbols available is extremely helpful for dealing
         with any problems that might arise.  Currently, this option is
         recommended for production installations only if you use GCC.
         But you should always have it on if you are doing development work
         or running a beta version.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--enable-coverage</option></term>
       <listitem>
        <para>
         If using GCC, all programs and libraries are compiled with
         code coverage testing instrumentation.  When run, they
         generate files in the build directory with code coverage
         metrics.
         <![%standalone-ignore[See <xref linkend="regress-coverage">
         for more information.]]> This option is for use only with GCC
         and when doing development work.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--enable-profiling</option></term>
       <listitem>
        <para>
         If using GCC, all programs and libraries are compiled so they
         can be profiled.  On backend exit, a subdirectory will be created
         that contains the <filename>gmon.out</> file for use in profiling.
         This option is for use only with GCC and when doing development work.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--enable-cassert</option></term>
       <listitem>
        <para>
         Enables <firstterm>assertion</> checks in the server, which test for
         many <quote>cannot happen</> conditions.  This is invaluable for
         code development purposes, but the tests can slow down the
         server significantly.
         Also, having the tests turned on won't necessarily enhance the
         stability of your server!  The assertion checks are not categorized
         for severity, and so what might be a relatively harmless bug will
         still lead to server restarts if it triggers an assertion
         failure.  This option is not recommended for production use, but
         you should have it on for development work or when running a beta
         version.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--enable-depend</option></term>
       <listitem>
        <para>
         Enables automatic dependency tracking.  With this option, the
         makefiles are set up so that all affected object files will
         be rebuilt when any header file is changed.  This is useful
         if you are doing development work, but is just wasted overhead
         if you intend only to compile once and install.  At present,
         this option only works with GCC.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><option>--enable-dtrace</option></term>
       <listitem>
        <para>
         <indexterm>
          <primary>DTrace</primary>
         </indexterm>
         Compiles <productname>PostgreSQL</productname> with support for the
         dynamic tracing tool DTrace.
         <![%standalone-ignore[See <xref linkend="dynamic-trace">
         for more information.]]>
        </para>

        <para>
         To point to the <command>dtrace</command> program, the
         environment variable <envar>DTRACE</envar> can be set.  This
         will often be necessary because <command>dtrace</command> is
         typically installed under <filename>/usr/sbin</filename>,
         which might not be in the path.
        </para>

        <para>
         Extra command-line options for the <command>dtrace</command> program
         can be specified in the environment variable
         <envar>DTRACEFLAGS</envar>.  On Solaris,
         to include DTrace support in a 64-bit binary, you must specify
         <literal>DTRACEFLAGS="-64"</> to configure.  For example,
         using the GCC compiler:
<screen>
./configure CC='gcc -m64' --enable-dtrace DTRACEFLAGS='-64' ...
</screen>
         Using Sun's compiler:
<screen>
./configure CC='/opt/SUNWspro/bin/cc -xtarget=native64' --enable-dtrace DTRACEFLAGS='-64' ...
</screen>
        </para>
       </listitem>
      </varlistentry>

     </variablelist>
    </para>

    <para>
     If you prefer a C compiler different from the one
     <filename>configure</filename> picks, you can set the
     environment variable <envar>CC</> to the program of your choice.
     By default, <filename>configure</filename> will pick
     <filename>gcc</filename> if available, else the platform's
     default (usually <filename>cc</>).  Similarly, you can override the
     default compiler flags if needed with the <envar>CFLAGS</envar> variable.
    </para>

    <para>
     You can specify environment variables on the
     <filename>configure</filename> command line, for example:
<screen>
<userinput>./configure CC=/opt/bin/gcc CFLAGS='-O2 -pipe'</>
</screen>
    </para>

    <para>
     Here is a list of the significant variables that can be set in
     this manner:

     <variablelist>
      <varlistentry>
       <term><envar>BISON</envar></term>
       <listitem>
        <para>
         Bison program
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><envar>CC</envar></term>
       <listitem>
        <para>
         C compiler
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><envar>CFLAGS</envar></term>
       <listitem>
        <para>
         options to pass to the C compiler
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><envar>CPP</envar></term>
       <listitem>
        <para>
         C preprocessor
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><envar>CPPFLAGS</envar></term>
       <listitem>
        <para>
         options to pass to the C preprocessor
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><envar>DTRACE</envar></term>
       <listitem>
        <para>
         location of the <command>dtrace</command> program
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><envar>DTRACEFLAGS</envar></term>
       <listitem>
        <para>
         options to pass to the <command>dtrace</command> program
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><envar>FLEX</envar></term>
       <listitem>
        <para>
         Flex program
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><envar>LDFLAGS</envar></term>
       <listitem>
        <para>
         options to use when linking either executables or shared libraries
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><envar>LDFLAGS_EX</envar></term>
       <listitem>
        <para>
         additional options for linking executables only
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><envar>LDFLAGS_SL</envar></term>
       <listitem>
        <para>
         additional options for linking shared libraries only
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><envar>MSGFMT</envar></term>
       <listitem>
        <para>
         <command>msgfmt</command> program for native language support
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><envar>PERL</envar></term>
       <listitem>
        <para>
         Full path to the Perl interpreter.  This will be used to
         determine the dependencies for building PL/Perl.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><envar>PYTHON</envar></term>
       <listitem>
        <para>
         Full path to the Python interpreter.  This will be used to
         determine the dependencies for building PL/Python.  Also,
         whether Python 2 or 3 is specified here (or otherwise
         implicitly chosen) determines which variant of the PL/Python
         language becomes available.  See
         <![%standalone-include[the <application>PL/Python</>
         documentation]]>
         <![%standalone-ignore[<xref linkend="plpython-python23">]]>
         for more information.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><envar>TCLSH</envar></term>
       <listitem>
        <para>
         Full path to the Tcl interpreter.  This will be used to
         determine the dependencies for building PL/Tcl, and it will
         be substituted into Tcl scripts.
        </para>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term><envar>XML2_CONFIG</envar></term>
       <listitem>
        <para>
         <command>xml2-config</command> program used to locate the
         libxml installation.
        </para>
       </listitem>
      </varlistentry>
     </variablelist>
    </para>

    <note>
     <para>
      When developing code inside the server, it is recommended to
      use the configure options <option>--enable-cassert</> (which
      turns on many run-time error checks) and <option>--enable-debug</>
      (which improves the usefulness of debugging tools).
     </para>

     <para>
      If using GCC, it is best to build with an optimization level of
      at least <option>-O1</>, because using no optimization
      (<option>-O0</>) disables some important compiler warnings (such
      as the use of uninitialized variables).  However, non-zero
      optimization levels can complicate debugging because stepping
      through compiled code will usually not match up one-to-one with
      source code lines.  If you get confused while trying to debug
      optimized code, recompile the specific files of interest with
      <option>-O0</>.  An easy way to do this is by passing an option
      to <application>make</>: <command>make PROFILE=-O0 file.o</>.
     </para>
    </note>
   </step>

  <step id="build">
   <title>Build</title>

   <para>
    To start the build, type:
<screen>
<userinput>make</userinput>
</screen>
    (Remember to use <acronym>GNU</> <application>make</>.) The build
    will take a few minutes depending on your
    hardware. The last line displayed should be:
<screen>
All of PostgreSQL is successfully made. Ready to install.
</screen>
   </para>

  <para>
   If you want to build everything that can be built, including the
   documentation (HTML and man pages), and the additional modules
   (<filename>contrib</filename>), type instead:
<screen>
<userinput>make world</userinput>
</screen>
   The last line displayed should be:
<screen>
PostgreSQL, contrib and HTML documentation successfully made. Ready to install.
</screen>
   </para>
  </step>

  <step>
   <title>Regression Tests</title>

   <indexterm>
    <primary>regression test</primary>
   </indexterm>

   <para>
    If you want to test the newly built server before you install it,
    you can run the regression tests at this point. The regression
    tests are a test suite to verify that <productname>PostgreSQL</>
    runs on your machine in the way the developers expected it
    to. Type:
<screen>
<userinput>make check</userinput>
</screen>
    (This won't work as root; do it as an unprivileged user.)
    <![%standalone-include[The file
    <filename>src/test/regress/README</> and the
    documentation contain]]>
    <![%standalone-ignore[<xref linkend="regress"> contains]]>
    detailed information about interpreting the test results. You can
    repeat this test at any later time by issuing the same command.
   </para>
  </step>

  <step id="install">
   <title>Installing the Files</title>

   <note>
    <para>
     If you are upgrading an existing system be sure to read
     <![%standalone-include[the documentation,]]>
     <![%standalone-ignore[<xref linkend="upgrading">]]>
     which has instructions about upgrading a
     cluster.
    </para>
   </note>

   <para>
    To install <productname>PostgreSQL</> enter:
<screen>
<userinput>make install</userinput>
</screen>
    This will install files into the directories that were specified
    in <xref linkend="configure">. Make sure that you have appropriate
    permissions to write into that area. Normally you need to do this
    step as root. Alternatively, you can create the target
    directories in advance and arrange for appropriate permissions to
    be granted.
   </para>

   <para>
    To install the documentation (HTML and man pages), enter:
<screen>
<userinput>make install-docs</userinput>
</screen>
   </para>

   <para>
    If you built the world above, type instead:
<screen>
<userinput>make install-world</userinput>
</screen>
    This also installs the documentation.
   </para>

   <para>
    You can use <literal>make install-strip</literal> instead of
    <literal>make install</literal> to strip the executable files and
    libraries as they are installed.  This will save some space.  If
    you built with debugging support, stripping will effectively
    remove the debugging support, so it should only be done if
    debugging is no longer needed.  <literal>install-strip</literal>
    tries to do a reasonable job saving space, but it does not have
    perfect knowledge of how to strip every unneeded byte from an
    executable file, so if you want to save all the disk space you
    possibly can, you will have to do manual work.
   </para>

   <para>
    The standard installation provides all the header files needed for client
    application development as well as for server-side program
    development, such as custom functions or data types written in C.
    (Prior to <productname>PostgreSQL</> 8.0, a separate <literal>make
    install-all-headers</> command was needed for the latter, but this
    step has been folded into the standard install.)
   </para>

   <formalpara>
    <title>Client-only installation:</title>
    <para>
     If you want to install only the client applications and
     interface libraries, then you can use these commands:
<screen>
<userinput>make -C src/bin install</>
<userinput>make -C src/include install</>
<userinput>make -C src/interfaces install</>
<userinput>make -C doc install</>
</screen>
    <filename>src/bin</> has a few binaries for server-only use,
    but they are small.
    </para>
   </formalpara>
  </step>
  </procedure>

  <formalpara>
   <title>Uninstallation:</title>
   <para>
    To undo the installation use the command <command>make
    uninstall</>. However, this will not remove any created directories.
   </para>
  </formalpara>

  <formalpara>
   <title>Cleaning:</title>

   <para>
    After the installation you can free disk space by removing the built
    files from the source tree with the command <command>make
    clean</>. This will preserve the files made by the <command>configure</command>
    program, so that you can rebuild everything with <command>make</>
    later on. To reset the source tree to the state in which it was
    distributed, use <command>make distclean</>. If you are going to
    build for several platforms within the same source tree you must do
    this and re-configure for each platform.  (Alternatively, use
    a separate build tree for each platform, so that the source tree
    remains unmodified.)
   </para>
  </formalpara>

  <para>
   If you perform a build and then discover that your <command>configure</>
   options were wrong, or if you change anything that <command>configure</>
   investigates (for example, software upgrades), then it's a good
   idea to do <command>make distclean</> before reconfiguring and
   rebuilding.  Without this, your changes in configuration choices
   might not propagate everywhere they need to.
  </para>
 </sect1>

 <sect1 id="install-post">
  <title>Post-Installation Setup</title>

  <sect2>
   <title>Shared Libraries</title>

   <indexterm>
    <primary>shared library</primary>
   </indexterm>

   <para>
    On some systems with shared libraries
    you need to tell the system how to find the newly installed
    shared libraries.  The systems on which this is
    <emphasis>not</emphasis> necessary include
    <systemitem class="osname">FreeBSD</>,
    <systemitem class="osname">HP-UX</>,
    <systemitem class="osname">Linux</>,
    <systemitem class="osname">NetBSD</>, <systemitem
    class="osname">OpenBSD</>, <systemitem class="osname">Tru64
    UNIX</> (formerly <systemitem class="osname">Digital UNIX</>), and
    <systemitem class="osname">Solaris</>.
   </para>

   <para>
    The method to set the shared library search path varies between
    platforms, but the most widely-used method is to set the
    environment variable <envar>LD_LIBRARY_PATH</> like so: In Bourne
    shells (<command>sh</>, <command>ksh</>, <command>bash</>, <command>zsh</>):
<programlisting>
LD_LIBRARY_PATH=/usr/local/pgsql/lib
export LD_LIBRARY_PATH
</programlisting>
    or in <command>csh</> or <command>tcsh</>:
<programlisting>
setenv LD_LIBRARY_PATH /usr/local/pgsql/lib
</programlisting>
    Replace <literal>/usr/local/pgsql/lib</> with whatever you set
    <option><literal>--libdir</></> to in <xref linkend="configure">.
    You should put these commands into a shell start-up file such as
    <filename>/etc/profile</> or <filename>~/.bash_profile</>.  Some
    good information about the caveats associated with this method can
    be found at <ulink
    url="http://xahlee.org/UnixResource_dir/_/ldpath.html"></ulink>.
   </para>

   <para>
    On some systems it might be preferable to set the environment
    variable <envar>LD_RUN_PATH</envar> <emphasis>before</emphasis>
    building.
   </para>

   <para>
    On <systemitem class="osname">Cygwin</systemitem>, put the library
    directory in the <envar>PATH</envar> or move the
    <filename>.dll</filename> files into the <filename>bin</filename>
    directory.
   </para>

   <para>
    If in doubt, refer to the manual pages of your system (perhaps
    <command>ld.so</command> or <command>rld</command>). If you later
    get a message like:
<screen>
psql: error in loading shared libraries
libpq.so.2.1: cannot open shared object file: No such file or directory
</screen>
    then this step was necessary.  Simply take care of it then.
   </para>

   <para>
    <indexterm>
     <primary>ldconfig</primary>
    </indexterm>
    If you are on <systemitem class="osname">Linux</> and you have root
    access, you can run:
<programlisting>
/sbin/ldconfig /usr/local/pgsql/lib
</programlisting>
    (or equivalent directory) after installation to enable the
    run-time linker to find the shared libraries faster.  Refer to the
    manual page of <command>ldconfig</> for more information.  On
    <systemitem class="osname">FreeBSD</>, <systemitem
    class="osname">NetBSD</>, and <systemitem
    class="osname">OpenBSD</> the command is:
<programlisting>
/sbin/ldconfig -m /usr/local/pgsql/lib
</programlisting>
    instead.  Other systems are not known to have an equivalent
    command.
   </para>
  </sect2>

  <sect2>
   <title>Environment Variables</title>

   <indexterm>
    <primary><envar>PATH</envar></primary>
   </indexterm>

   <para>
    If you installed into <filename>/usr/local/pgsql</> or some other
    location that is not searched for programs by default, you should
    add <filename>/usr/local/pgsql/bin</> (or whatever you set
    <option><literal>--bindir</></> to in <xref linkend="configure">)
    into your <envar>PATH</>.  Strictly speaking, this is not
    necessary, but it will make the use of <productname>PostgreSQL</>
    much more convenient.
   </para>

   <para>
    To do this, add the following to your shell start-up file, such as
    <filename>~/.bash_profile</> (or <filename>/etc/profile</>, if you
    want it to affect all users):
<programlisting>
PATH=/usr/local/pgsql/bin:$PATH
export PATH
</programlisting>
    If you are using <command>csh</> or <command>tcsh</>, then use this command:
<programlisting>
set path = ( /usr/local/pgsql/bin $path )
</programlisting>
   </para>

   <para>
    <indexterm>
     <primary><envar>MANPATH</envar></primary>
    </indexterm>
    To enable your system to find the <application>man</>
    documentation, you need to add lines like the following to a
    shell start-up file unless you installed into a location that is
    searched by default:
<programlisting>
MANPATH=/usr/local/pgsql/man:$MANPATH
export MANPATH
</programlisting>
   </para>

   <para>
    The environment variables <envar>PGHOST</> and <envar>PGPORT</>
    specify to client applications the host and port of the database
    server, overriding the compiled-in defaults. If you are going to
    run client applications remotely then it is convenient if every
    user that plans to use the database sets <envar>PGHOST</>.  This
    is not required, however; the settings can be communicated via command
    line options to most client programs.
   </para>
  </sect2>
 </sect1>


<![%standalone-include;[
 <sect1 id="install-getting-started">
  <title>Getting Started</title>

  <para>
   The following is a quick summary of how to get <productname>PostgreSQL</> up and
   running once installed. The main documentation contains more information.
  </para>

  <procedure>
   <step>
    <para>
     Create a user account for the <productname>PostgreSQL</>
     server. This is the user the server will run as. For production
     use you should create a separate, unprivileged account
     (<quote>postgres</> is commonly used). If you do not have root
     access or just want to play around, your own user account is
     enough, but running the server as root is a security risk and
     will not work.
<screen>
<userinput>adduser postgres</>
</screen>
    </para>
   </step>

   <step>
    <para>
     Create a database installation with the <command>initdb</>
     command. To run <command>initdb</> you must be logged in to your
     <productname>PostgreSQL</> server account. It will not work as
     root.
<screen>
root# <userinput>mkdir /usr/local/pgsql/data</>
root# <userinput>chown postgres /usr/local/pgsql/data</>
root# <userinput>su - postgres</>
postgres$ <userinput>/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data</>
</screen>
    </para>

    <para>
     The <option>-D</> option specifies the location where the data
     will be stored. You can use any path you want, it does not have
     to be under the installation directory. Just make sure that the
     server account can write to the directory (or create it, if it
     doesn't already exist) before starting <command>initdb</>, as
     illustrated here.
    </para>
   </step>

   <step>
    <para>
     At this point, if you did not use the <command>initdb</> <literal>-A</>
     option, you might want to modify <filename>pg_hba.conf</> to control
     local access to the server before you start it.  The default is to
     trust all local users.
    </para>
   </step>

   <step>
    <para>
     The previous <command>initdb</> step should have told you how to
     start up the database server. Do so now. The command should look
     something like:
<programlisting>
/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
</programlisting>
     This will start the server in the foreground. To put the server
     in the background use something like:
<programlisting>
nohup /usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data \
    &lt;/dev/null &gt;&gt;server.log 2&gt;&amp;1 &lt;/dev/null &amp;
</programlisting>
    </para>

    <para>
     To stop a server running in the background you can type:
<programlisting>
kill `cat /usr/local/pgsql/data/postmaster.pid`
</programlisting>
    </para>
   </step>

   <step>
    <para>
     Create a database:
<screen>
<userinput>createdb testdb</>
</screen>
     Then enter:
<screen>
<userinput>psql testdb</>
</screen>
     to connect to that database. At the prompt you can enter SQL
     commands and start experimenting.
    </para>
   </step>
  </procedure>
 </sect1>

 <sect1 id="install-whatnow">
  <title>What Now?</title>

  <para>
   <itemizedlist>
    <listitem>
     <para>
      The <productname>PostgreSQL</> distribution contains a
      comprehensive documentation set, which you should read sometime.
      After installation, the documentation can be accessed by
      pointing your browser to
      <filename>/usr/local/pgsql/doc/html/index.html</>, unless you
      changed the installation directories.
     </para>

     <para>
      The first few chapters of the main documentation are the Tutorial,
      which should be your first reading if you are completely new to
      <acronym>SQL</> databases.  If you are familiar with database
      concepts then you want to proceed with part on server
      administration, which contains information about how to set up
      the database server, database users, and authentication.
     </para>
    </listitem>

    <listitem>
     <para>
      Usually, you will want to modify your computer so that it will
      automatically start the database server whenever it boots. Some
      suggestions for this are in the documentation.
     </para>
    </listitem>

    <listitem>
     <para>
      Run the regression tests against the installed server (using
      <command>make installcheck</command>). If you didn't run the
      tests before installation, you should definitely do it now. This
      is also explained in the documentation.
     </para>
    </listitem>

    <listitem>
     <para>
      By default, <productname>PostgreSQL</> is configured to run on
      minimal hardware.  This allows it to start up with almost any
      hardware configuration. The default configuration is, however,
      not designed for optimum performance. To achieve optimum
      performance, several server parameters must be adjusted, the two
      most common being <varname>shared_buffers</varname> and
      <varname>work_mem</varname>.
      Other parameters mentioned in the documentation also affect
      performance.
     </para>
    </listitem>
   </itemizedlist>
  </para>
 </sect1>
]]>


 <sect1 id="supported-platforms">
  <title>Supported Platforms</title>

  <para>
   A platform (that is, a CPU architecture and operating system combination)
   is considered supported by the <productname>PostgreSQL</> development
   community if the code contains provisions to work on that platform and
   it has recently been verified to build and pass its regression tests
   on that platform.  Currently, most testing of platform compatibility
   is done automatically by test machines in the
   <ulink url="http://buildfarm.postgresql.org/">PostgreSQL Build Farm</ulink>.
   If you are interested in using <productname>PostgreSQL</> on a platform
   that is not represented in the build farm, but on which the code works
   or can be made to work, you are strongly encouraged to set up a build
   farm member machine so that continued compatibility can be assured.
  </para>

  <para>
   In general, <productname>PostgreSQL</> can be expected to work on
   these CPU architectures: x86, x86_64, IA64, PowerPC,
   PowerPC 64, S/390, S/390x, Sparc, Sparc 64, Alpha, ARM, MIPS, MIPSEL, M68K,
   and PA-RISC.  Code support exists for M32R and VAX, but these
   architectures are not known to have been tested recently.  It is often
   possible to build on an unsupported CPU type by configuring with
   <option>--disable-spinlocks</option>, but performance will be poor.
  </para>

  <para>
   <productname>PostgreSQL</> can be expected to work on these operating
   systems: Linux (all recent distributions), Windows (Win2000 SP4 and later),
   FreeBSD, OpenBSD, NetBSD, Mac OS X, AIX, HP/UX, Solaris, Tru64 Unix,
   and UnixWare.  Other Unix-like systems may also work but are not currently
   being tested.  In most cases, all CPU architectures supported by
   a given operating system will work.  Look in
   the <xref linkend="installation-platform-notes"> below to see if
   there is information
   specific to your operating system, particularly if using an older system.
  </para>

  <para>
   If you have installation problems on a platform that is known
   to be supported according to recent build farm results, please report
   it to <email>pgsql-bugs@postgresql.org</email>.  If you are interested
   in porting <productname>PostgreSQL</> to a new platform,
   <email>pgsql-hackers@postgresql.org</email> is the appropriate place
   to discuss that.
  </para>
 </sect1>

 <sect1 id="installation-platform-notes">
  <title>Platform-specific Notes</title>

  <para>
   This section documents additional platform-specific issues
   regarding the installation and setup of PostgreSQL.  Be sure to
   read the installation instructions, and in
   particular <xref linkend="install-requirements"> as well.  Also,
   check <![%standalone-include[the
   file <filename>src/test/regress/README</> and the documentation]]>
   <![%standalone-ignore[<xref linkend="regress">]]> regarding the
   interpretation of regression test results.
  </para>

  <para>
   Platforms that are not covered here have no known platform-specific
   installation issues.
  </para>

  <sect2 id="installation-notes-aix">
   <title>AIX</title>

   <indexterm zone="installation-notes-aix">
    <primary>AIX</primary>
    <secondary>installation on</secondary>
   </indexterm>

   <para>
    PostgreSQL works on AIX, but getting it installed properly can be
    challenging.  AIX versions from 4.3.3 to 6.1 are considered supported.
    You can use GCC or the native IBM compiler <command>xlc</command>.  In
    general, using recent versions of AIX and PostgreSQL helps.  Check
    the build farm for up to date information about which versions of
    AIX are known to work.
   </para>

   <para>
    The minimum recommended fix levels for supported AIX versions are:
   </para>

   <variablelist>
    <varlistentry>
     <term>AIX 4.3.3</term>
     <listitem><para>Maintenance Level 11 + post ML11 bundle</para></listitem>
    </varlistentry>

    <varlistentry>
     <term>AIX 5.1</term>
     <listitem><para>Maintenance Level 9 + post ML9 bundle</para></listitem>
    </varlistentry>

    <varlistentry>
     <term>AIX 5.2</term>
     <listitem><para>Technology Level 10 Service Pack 3</para></listitem>
    </varlistentry>

    <varlistentry>
     <term>AIX 5.3</term>
     <listitem><para>Technology Level 7</para></listitem>
    </varlistentry>

    <varlistentry>
     <term>AIX 6.1</term>
     <listitem><para>Base Level</para></listitem>
    </varlistentry>
   </variablelist>

   <para>
    To check your current fix level, use
    <command>oslevel -r</command> in AIX 4.3.3 to AIX 5.2 ML 7, or
    <command>oslevel -s</command> in later versions.
   </para>

   <para>
    Use the following <command>configure</command> flags in addition
    to your own if you have installed Readline or libz in
    <literal>/usr/local</>:
    <literal>--with-includes=/usr/local/include
    --with-libraries=/usr/local/lib</literal>.
   </para>

   <sect3>
    <title>GCC Issues</title>

    <para>
     On AIX 5.3, there have been some problems getting PostgreSQL to
     compile and run using GCC.
    </para>

    <para>
     You will want to use a version of GCC subsequent to 3.3.2,
     particularly if you use a prepackaged version.  We had good
     success with 4.0.1.  Problems with earlier versions seem to have
     more to do with the way IBM packaged GCC than with actual issues
     with GCC, so that if you compile GCC yourself, you might well
     have success with an earlier version of GCC.
    </para>
   </sect3>

   <sect3>
    <title>Unix-Domain Sockets Broken</title>

    <para>
     AIX 5.3 has a problem
     where <structname>sockaddr_storage</structname> is not defined to
     be large enough.  In version 5.3, IBM increased the size of
     <structname>sockaddr_un</structname>, the address structure for
     Unix-domain sockets, but did not correspondingly increase the
     size of <structname>sockaddr_storage</structname>.  The result of
     this is that attempts to use Unix-domain sockets with PostgreSQL
     lead to libpq overflowing the data structure.  TCP/IP connections
     work OK, but not Unix-domain sockets, which prevents the
     regression tests from working.
    </para>

    <para>
     The problem was reported to IBM, and is recorded as bug report
     PMR29657.  If you upgrade to maintenance level 5300-03 or later,
     that will include this fix.  A quick workaround
     is to alter <symbol>_SS_MAXSIZE</symbol> to 1025 in
     <filename>/usr/include/sys/socket.h</filename>.  In either case,
     recompile PostgreSQL once you have the corrected header file.
    </para>
   </sect3>

   <sect3>
    <title>Internet Address Issues</title>

    <para>
     PostgreSQL relies on the system's <function>getaddrinfo</> function
     to parse IP addresses in <varname>listen_addresses</>,
     <filename>pg_hba.conf</>, etc.  Older versions of AIX have assorted
     bugs in this function.  If you have problems related to these settings,
     updating to the appropriate AIX fix level shown above
     should take care of it.
    </para>

    <!-- http://archives.postgresql.org/message-id/6064jt6cfm.fsf_-_@dba2.int.libertyrms.com -->

    <para>
     One user reports:
    </para>

    <para>
     When implementing PostgreSQL version 8.1 on AIX 5.3, we
     periodically ran into problems where the statistics collector
     would <quote>mysteriously</quote> not come up successfully.  This
     appears to be the result of unexpected behavior in the IPv6
     implementation.  It looks like PostgreSQL and IPv6 do not play
     very well together on AIX 5.3.
    </para>

    <para>
     Any of the following actions <quote>fix</quote> the problem.
     <itemizedlist>
      <listitem>
       <para>
        Delete the IPv6 address for localhost:
<screen>
(as root)
# ifconfig lo0 inet6 ::1/0 delete
</screen>
       </para>
      </listitem>

      <listitem>
       <para>
        Remove IPv6 from net services.  The
        file <filename>/etc/netsvc.conf</filename> on AIX is roughly
        equivalent to <filename>/etc/nsswitch.conf</filename> on
        Solaris/Linux.  The default, on AIX, is thus:
<programlisting>
hosts=local,bind
</programlisting>
        Replace this with:
<programlisting>
hosts=local4,bind4
</programlisting>
        to deactivate searching for IPv6 addresses.
       </para>
      </listitem>
     </itemizedlist>
    </para>

    <warning>
    <para>
     This is really a workaround for problems relating
     to immaturity of IPv6 support, which improved visibly during the
     course of AIX 5.3 releases.  It has worked with AIX version 5.3,
     but does not represent an elegant solution to the problem.  It has
     been reported that this workaround is not only unnecessary, but
     causes problems on AIX 6.1, where IPv6 support has become more mature.
    </para>
    </warning>

   </sect3>

   <sect3>
    <title>Memory Management</title>
    <!-- http://archives.postgresql.org/message-id/603bgqmpl9.fsf@dba2.int.libertyrms.com -->

    <para>
     AIX can be somewhat peculiar with regards to the way it does
     memory management.  You can have a server with many multiples of
     gigabytes of RAM free, but still get out of memory or address
     space errors when running applications.  One example
     is <command>createlang</command> failing with unusual errors.
     For example, running as the owner of the PostgreSQL installation:
<screen>
-bash-3.00$ createlang plperl template1
createlang: language installation failed: ERROR:  could not load library "/opt/dbs/pgsql748/lib/plperl.so": A memory address is not in the address space for the process.
</screen>
    Running as a non-owner in the group possessing the PostgreSQL
    installation:
<screen>
-bash-3.00$ createlang plperl template1
createlang: language installation failed: ERROR:  could not load library "/opt/dbs/pgsql748/lib/plperl.so": Bad address
</screen>
     Another example is out of memory errors in the PostgreSQL server
     logs, with every memory allocation near or greater than 256 MB
     failing.
    </para>

    <para>
     The overall cause of all these problems is the default bittedness
     and memory model used by the server process.  By default, all
     binaries built on AIX are 32-bit.  This does not depend upon
     hardware type or kernel in use.  These 32-bit processes are
     limited to 4 GB of memory laid out in 256 MB segments using one
     of a few models.  The default allows for less than 256 MB in the
     heap as it shares a single segment with the stack.
    </para>

    <para>
     In the case of the <command>createlang</command> example, above,
     check your umask and the permissions of the binaries in your
     PostgreSQL installation.  The binaries involved in that example
     were 32-bit and installed as mode 750 instead of 755.  Due to the
     permissions being set in this fashion, only the owner or a member
     of the possessing group can load the library.  Since it isn't
     world-readable, the loader places the object into the process'
     heap instead of the shared library segments where it would
     otherwise be placed.
    </para>

    <para>
     The <quote>ideal</quote> solution for this is to use a 64-bit
     build of PostgreSQL, but that is not always practical, because
     systems with 32-bit processors can build, but not run, 64-bit
     binaries.
    </para>

    <para>
     If a 32-bit binary is desired, set <symbol>LDR_CNTRL</symbol> to
     <literal>MAXDATA=0x<replaceable>n</replaceable>0000000</literal>,
     where 1 &lt;= n &lt;= 8, before starting the PostgreSQL server,
     and try different values and <filename>postgresql.conf</filename>
     settings to find a configuration that works satisfactorily.  This
     use of <symbol>LDR_CNTRL</symbol> tells AIX that you want the
     server to have <symbol>MAXDATA</symbol> bytes set aside for the
     heap, allocated in 256 MB segments.  When you find a workable
     configuration,
     <command>ldedit</command> can be used to modify the binaries so
     that they default to using the desired heap size.  PostgreSQL can
     also be rebuilt, passing <literal>configure
     LDFLAGS="-Wl,-bmaxdata:0x<replaceable>n</replaceable>0000000"</literal>
     to achieve the same effect.
    </para>

    <para>
     For a 64-bit build, set <envar>OBJECT_MODE</envar> to 64 and
     pass <literal>CC="gcc -maix64"</literal>
     and <literal>LDFLAGS="-Wl,-bbigtoc"</literal>
     to <command>configure</command>.  (Options for
    <command>xlc</command> might differ.)  If you omit the export of
    <envar>OBJECT_MODE</envar>, your build may fail with linker errors.  When
    <envar>OBJECT_MODE</envar> is set, it tells AIX's build utilities
    such as <command>ar</>, <command>as</>, and <command>ld</> what
    type of objects to default to handling.
    </para>

    <para>
     By default, overcommit of paging space can happen.  While we have
     not seen this occur, AIX will kill processes when it runs out of
     memory and the overcommit is accessed.  The closest to this that
     we have seen is fork failing because the system decided that
     there was not enough memory for another process.  Like many other
     parts of AIX, the paging space allocation method and
     out-of-memory kill is configurable on a system- or process-wide
     basis if this becomes a problem.
    </para>

    <bibliography>
     <title>References and Resources</title>

     <biblioentry>
      <biblioset relation="article">
       <title><ulink url="http://publib.boulder.ibm.com/infocenter/pseries/topic/com.ibm.aix.doc/aixprggd/genprogc/lrg_prg_support.htm">Large Program Support</ulink></title>
      </biblioset>
      <biblioset relation="book">
       <title>AIX Documentation: General Programming Concepts: Writing and Debugging Programs</title>
      </biblioset>
     </biblioentry>

     <biblioentry>
      <biblioset relation="article">
       <title><ulink url="http://publib.boulder.ibm.com/infocenter/pseries/topic/com.ibm.aix.doc/aixprggd/genprogc/address_space.htm">Program Address Space Overview</ulink></title>
      </biblioset>
      <biblioset relation="book">
       <title>AIX Documentation: General Programming Concepts: Writing and Debugging Programs</title>
      </biblioset>
     </biblioentry>

     <biblioentry>
      <biblioset relation="article">
       <title><ulink url="http://publib.boulder.ibm.com/infocenter/pseries/v5r3/topic/com.ibm.aix.doc/aixbman/prftungd/resmgmt2.htm">Performance Overview of the Virtual Memory Manager (VMM)</ulink></title>
      </biblioset>
      <biblioset relation="book">
       <title>AIX Documentation: Performance Management Guide</title>
      </biblioset>
     </biblioentry>

     <biblioentry>
      <biblioset relation="article">
       <title><ulink url="http://publib.boulder.ibm.com/infocenter/pseries/v5r3/topic/com.ibm.aix.doc/aixbman/prftungd/memperf7.htm">Page Space Allocation</ulink></title>
      </biblioset>
      <biblioset relation="book">
       <title>AIX Documentation: Performance Management Guide</title>
      </biblioset>
     </biblioentry>

     <biblioentry>
      <biblioset relation="article">
       <title><ulink url="http://publib.boulder.ibm.com/infocenter/pseries/v5r3/topic/com.ibm.aix.doc/aixbman/prftungd/memperf6.htm">Paging-space thresholds tuning</ulink></title>
      </biblioset>
      <biblioset relation="book">
       <title>AIX Documentation: Performance Management Guide</title>
      </biblioset>
     </biblioentry>

     <biblioentry>
       <title><ulink url="http://www.redbooks.ibm.com/abstracts/sg245674.html?Open">Developing and Porting C and C++ Applications on AIX</ulink></title>
       <publisher>
        <publishername>IBM Redbook</publishername>
       </publisher>
     </biblioentry>
    </bibliography>
   </sect3>
  </sect2>

  <sect2 id="installation-notes-cygwin">
   <title>Cygwin</title>

   <indexterm zone="installation-notes-cygwin">
    <primary>Cygwin</primary>
    <secondary>installation on</secondary>
   </indexterm>

   <para>
    PostgreSQL can be built using Cygwin, a Linux-like environment for
    Windows, but that method is inferior to the native Windows build
    <![%standalone-ignore[(see <xref linkend="install-windows">)]]> and
    running a server under Cygwin is no longer recommended.
   </para>

   <para>
    When building from source, proceed according to the normal
    installation procedure (i.e., <literal>./configure;
    make</literal>; etc.), noting the following-Cygwin specific
    differences:

    <itemizedlist>
     <listitem>
      <para>
       Set your path to use the Cygwin bin directory before the
       Windows utilities.  This will help prevent problems with
       compilation.
      </para>
     </listitem>

     <listitem>
      <para>
       The <command>adduser</command> command is not supported; use
       the appropriate user management application on Windows NT,
       2000, or XP.  Otherwise, skip this step.
      </para>
     </listitem>

     <listitem>
      <para>
       The <command>su</command> command is not supported; use ssh to
       simulate su on Windows NT, 2000, or XP. Otherwise, skip this
       step.
      </para>
     </listitem>

     <listitem>
      <para>
       OpenSSL is not supported.
      </para>
     </listitem>

     <listitem>
      <para>
       Start <command>cygserver</command> for shared memory support.
       To do this, enter the command <literal>/usr/sbin/cygserver
       &amp;</literal>.  This program needs to be running anytime you
       start the PostgreSQL server or initialize a database cluster
       (<command>initdb</command>).  The
       default <command>cygserver</command> configuration may need to
       be changed (e.g., increase <symbol>SEMMNS</symbol>) to prevent
       PostgreSQL from failing due to a lack of system resources.
      </para>
     </listitem>

     <listitem>
      <para>
        Building might fail on some systems where a locale other than
        C is in use. To fix this, set the locale to C by doing
        <command>export LANG=C.utf8</command> before building, and then
        setting it back to the previous setting, after you have installed
        PostgreSQL.
      </para>
     </listitem>

     <listitem>
      <para>
       The parallel regression tests (<literal>make check</literal>)
       can generate spurious regression test failures due to
       overflowing the <function>listen()</function> backlog queue
       which causes connection refused errors or hangs.  You can limit
       the number of connections using the make
       variable <varname>MAX_CONNECTIONS</varname> thus:
<programlisting>
make MAX_CONNECTIONS=5 check
</programlisting>
       (On some systems you can have up to about 10 simultaneous
       connections).
      </para>
     </listitem>
    </itemizedlist>
   </para>

   <para>
    It is possible to install <command>cygserver</command> and the
    PostgreSQL server as Windows NT services.  For information on how
    to do this, please refer to the <filename>README</filename>
    document included with the PostgreSQL binary package on Cygwin.
    It is installed in the
    directory <filename>/usr/share/doc/Cygwin</filename>.
   </para>
  </sect2>

  <sect2 id="installation-notes-hpux">
   <title>HP-UX</title>

   <indexterm zone="installation-notes-hpux">
    <primary>HP-UX</primary>
    <secondary>installation on</secondary>
   </indexterm>

   <para>
    PostgreSQL 7.3+ should work on Series 700/800 PA-RISC machines
    running HP-UX 10.X or 11.X, given appropriate system patch levels
    and build tools.  At least one developer routinely tests on HP-UX
    10.20, and we have reports of successful installations on HP-UX
    11.00 and 11.11.
   </para>

   <para>
    Aside from the PostgreSQL source distribution, you will need GNU
    make (HP's make will not do), and either GCC or HP's full ANSI C
    compiler.  If you intend to build from Git sources rather than a
    distribution tarball, you will also need Flex (GNU lex) and Bison
    (GNU yacc).  We also recommend making sure you are fairly
    up-to-date on HP patches.  At a minimum, if you are building 64
    bit binaries on HP-UX 11.11 you may need PHSS_30966 (11.11) or a
    successor patch otherwise <command>initdb</command> may hang:
<literallayout>
PHSS_30966  s700_800 ld(1) and linker tools cumulative patch
</literallayout>

    On general principles you should be current on libc and ld/dld
    patches, as well as compiler patches if you are using HP's C
    compiler.  See HP's support sites such
    as <ulink url="http://itrc.hp.com"></ulink> and
    <ulink url="ftp://us-ffs.external.hp.com/"></ulink> for free
    copies of their latest patches.
   </para>

   <para>
    If you are building on a PA-RISC 2.0 machine and want to have
    64-bit binaries using GCC, you must use GCC 64-bit version. GCC
    binaries for HP-UX PA-RISC and Itanium are available from
    <ulink url="http://www.hp.com/go/gcc"></ulink>.  Don't forget to
    get and install binutils at the same time.
   </para>

   <para>
    If you are building on a PA-RISC 2.0 machine and want the compiled
    binaries to run on PA-RISC 1.1 machines you will need to specify
    <option>+DAportable</option> in <envar>CFLAGS</envar>.
   </para>

   <para>
    If you are building on a HP-UX Itanium machine, you will need the
    latest HP ANSI C compiler with its dependent patch or successor
    patches:
<literallayout>
PHSS_30848  s700_800 HP C Compiler (A.05.57)
PHSS_30849  s700_800 u2comp/be/plugin library Patch
</literallayout>
   </para>

   <para>
    If you have both HP's C compiler and GCC's, then you might want to
    explicitly select the compiler to use when you
    run <command>configure</command>:
<programlisting>
./configure CC=cc
</programlisting>
    for HP's C compiler, or
<programlisting>
./configure CC=gcc
</programlisting>
    for GCC.  If you omit this setting, then configure will
    pick <command>gcc</command> if it has a choice.
   </para>

   <para>
    The default install target location
    is <filename>/usr/local/pgsql</filename>, which you might want to
    change to something under <filename>/opt</filename>.  If so, use
    the
    <option>--prefix</option> switch to <command>configure</command>.
   </para>

   <para>
    In the regression tests, there might be some low-order-digit
    differences in the geometry tests, which vary depending on which
    compiler and math library versions you use.  Any other error is
    cause for suspicion.
   </para>
  </sect2>

  <sect2 id="installation-notes-mingw">
   <title>MinGW/Native Windows</title>

   <indexterm zone="installation-notes-mingw">
    <primary>MinGW</primary>
    <secondary>installation on</secondary>
   </indexterm>

   <para>
    PostgreSQL for Windows can be built using MinGW, a Unix-like build
    environment for Microsoft operating systems, or using
    Microsoft's <productname>Visual C++</productname> compiler suite.
    The MinGW build variant uses the normal build system described in
    this chapter; the Visual C++ build works completely differently
    and is described in <![%standalone-include[the
    documentation]]><![%standalone-ignore[<xref linkend="install-windows">]]>.
    It is a fully native build and uses no additional software like
    MinGW.  A ready-made installer is available on the main
    PostgreSQL web site.
   </para>

   <para>
    The native Windows port requires a 32 or 64-bit version of Windows
    2000 or later. Earlier operating systems do
    not have sufficient infrastructure (but Cygwin may be used on
    those).  MinGW, the Unix-like build tools, and MSYS, a collection
    of Unix tools required to run shell scripts
    like <command>configure</command>, can be downloaded
    from <ulink url="http://www.mingw.org/"></ulink>.  Neither is
    required to run the resulting binaries; they are needed only for
    creating the binaries.
   </para>

   <para>
     To build 64 bit binaries using MinGW, install the 64 bit tool set
     from <ulink url="http://mingw-w64.sourceforge.net/"></ulink>, put its bin
     directory in the <envar>PATH</envar>, and run
     <command>configure</command> with the
     <command>--host=x86_64-w64-mingw</command> option.
   </para>

   <para>
    After you have everything installed, it is suggested that you
    run <application>psql</application>
    under <command>CMD.EXE</command>, as the MSYS console has
    buffering issues.
   </para>

   <sect3 id="windows-crash-dumps">
    <title>Collecting Crash Dumps on Windows</title>

    <para>
     If PostgreSQL on Windows crashes, it has the ability to generate
     <productname>minidumps</> that can be used to track down the cause
     for the crash, similar to core dumps on Unix. These dumps can be
     read using the <productname>Windows Debugger Tools</> or using
     <productname>Visual Studio</>. To enable the generation of dumps
     on Windows, create a subdirectory named <filename>crashdumps</filename>
     inside the cluster data directory. The dumps will then be written
     into this directory with a unique name based on the identifier of
     the crashing process and the current time of the crash.
    </para>
   </sect3>
  </sect2>

  <sect2 id="installation-notes-sco">
   <title>SCO OpenServer and SCO UnixWare</title>

   <indexterm zone="installation-notes-sco">
    <primary>SCO</primary>
    <secondary>installation on</secondary>
   </indexterm>

   <indexterm zone="installation-notes-sco">
    <primary>UnixWare</primary>
    <secondary>installation on</secondary>
   </indexterm>

   <para>
    PostgreSQL can be built on SCO UnixWare 7 and SCO OpenServer 5.
    On OpenServer, you can use either the OpenServer Development Kit
    or the Universal Development Kit.  However, some tweaking may be
    needed, as described below.
   </para>

   <sect3>
    <title>Skunkware</title>

    <para>
     You should locate your copy of the SCO Skunkware CD.  The
     Skunkware CD is included with UnixWare 7 and current versions of
     OpenServer 5.  Skunkware includes ready-to-install versions of
     many popular programs that are available on the Internet.  For
     example, gzip, gunzip, GNU Make, Flex, and Bison are all
     included.  For UnixWare 7.1, this CD is now labeled "Open License
     Software Supplement".  If you do not have this CD, the software
     on it is available
     from <ulink url="http://www.sco.com/skunkware/"></ulink>.
    </para>

    <para>
     Skunkware has different versions for UnixWare and OpenServer.
     Make sure you install the correct version for your operating
     system, except as noted below.
    </para>

    <para>
     On UnixWare 7.1.3 and beyond, the GCC compiler is included on the
     UDK CD as is GNU Make.
    </para>
   </sect3>

   <sect3>
    <title>GNU Make</title>

    <para>
     You need to use the GNU Make program, which is on the Skunkware
     CD.  By default, it installs
     as <filename>/usr/local/bin/make</filename>.
    </para>

    <para>
     As of UnixWare 7.1.3 and above, the GNU Make program is the
     OSTK portion of the UDK CD, and is
     in <filename>/usr/gnu/bin/gmake</filename>.
    </para>
   </sect3>

   <sect3>
    <title>Readline</title>

    <para>
     The Readline library is on the Skunkware CD.  But it is not
     included on the UnixWare 7.1 Skunkware CD.  If you have the
     UnixWare 7.0.0 or 7.0.1 Skunkware CDs, you can install it from
     there.  Otherwise,
     try <ulink url="http://www.sco.com/skunkware/"></ulink>.
    </para>

    <para>
     By default, Readline installs into <filename>/usr/local/lib</> and
     <filename>/usr/local/include</>.  However, the
     PostgreSQL <command>configure</command> program will not find it
     there without help.  If you installed Readline, then use the
     following options to <command>configure</command>:
<programlisting>
./configure --with-libraries=/usr/local/lib --with-includes=/usr/local/include
</programlisting>
    </para>
   </sect3>

   <sect3>
    <title>Using the UDK on OpenServer</title>

    <para>
     If you are using the new Universal Development Kit (UDK) compiler
     on OpenServer, you need to specify the locations of the UDK
     libraries:
<programlisting>
./configure --with-libraries=/udk/usr/lib --with-includes=/udk/usr/include
</programlisting>
     Putting these together with the Readline options from above:
<programlisting>
./configure --with-libraries="/udk/usr/lib /usr/local/lib" --with-includes="/udk/usr/include /usr/local/include"
</programlisting>
    </para>
   </sect3>

   <sect3>
    <title>Reading the PostgreSQL Man Pages</title>

    <para>
     By default, the PostgreSQL man pages are installed into
     <filename>/usr/local/pgsql/man</filename>.  By default, UnixWare
     does not look there for man pages.  To be able to read them you
     need to modify the
     <varname>MANPATH</varname> variable
     in <filename>/etc/default/man</filename>, for example:
<programlisting>
MANPATH=/usr/lib/scohelp/%L/man:/usr/dt/man:/usr/man:/usr/share/man:scohelp:/usr/local/man:/usr/local/pgsql/man
</programlisting>
    </para>

    <para>
     On OpenServer, some extra research needs to be invested to make
     the man pages usable, because the man system is a bit different
     from other platforms.  Currently, PostgreSQL will not install
     them at all.
    </para>
   </sect3>

   <sect3>
    <title>C99 Issues with the 7.1.1b Feature Supplement</title>

    <para>
     For compilers earlier than the one released with OpenUNIX 8.0.0
     (UnixWare 7.1.2), including the 7.1.1b Feature Supplement, you
     may need to specify <option>-Xb</option>
     in <varname>CFLAGS</varname> or the <varname>CC</varname>
     environment variable.  The indication of this is an error in
     compiling <filename>tuplesort.c</filename> referencing inline
     functions.  Apparently there was a change in the 7.1.2(8.0.0)
     compiler and beyond.
    </para>
   </sect3>

   <sect3>
    <title>Threading on UnixWare</title>

    <para>
     For threading, you<emphasis>must</emphasis> use <option>-Kpthread</option>
     on <emphasis>all</emphasis> libpq-using programs.  libpq
     uses <function>pthread_*</function> calls, which are only
     available with the
     <option>-Kpthread</>/<option>-Kthread</> flag.
    </para>
   </sect3>
  </sect2>

  <sect2 id="installation-notes-solaris">
   <title>Solaris</title>

   <indexterm zone="installation-notes-solaris">
    <primary>Solaris</primary>
    <secondary>installation on</secondary>
   </indexterm>

   <para>
    PostgreSQL is well-supported on Solaris.  The more up to date your
    operating system, the fewer issues you will experience; details
    below.
   </para>

   <sect3>
    <title>Required Tools</title>

    <para>
     You can build with either GCC or Sun's compiler suite.  For
     better code optimization, Sun's compiler is strongly recommended
     on the SPARC architecture.  We have heard reports of problems
     when using GCC 2.95.1; GCC 2.95.3 or later is recommended.  If
     you are using Sun's compiler, be careful not to select
     <filename>/usr/ucb/cc</filename>;
     use <filename>/opt/SUNWspro/bin/cc</filename>.
    </para>

    <para>
     You can download Sun Studio
     from <ulink url="http://www.oracle.com/technetwork/server-storage/solarisstudio/downloads/"></ulink>.
     Many of GNU tools are integrated into Solaris 10, or they are
     present on the Solaris companion CD.  If you like packages for
     older version of Solaris, you can find these tools
     at <ulink url="http://www.sunfreeware.com"></ulink>.
     If you prefer
     sources, look
     at <ulink url="http://www.gnu.org/order/ftp.html"></ulink>.
    </para>
   </sect3>

   <sect3>
    <title>Problems with OpenSSL</title>

    <para>
     When you build PostgreSQL with OpenSSL support you might get
     compilation errors in the following files:
     <itemizedlist>
      <listitem><para><filename>src/backend/libpq/crypt.c</filename></para></listitem>
      <listitem><para><filename>src/backend/libpq/password.c</filename></para></listitem>
      <listitem><para><filename>src/interfaces/libpq/fe-auth.c</filename></para></listitem>
      <listitem><para><filename>src/interfaces/libpq/fe-connect.c</filename></para></listitem>
     </itemizedlist>

     This is because of a namespace conflict between the standard
     <filename>/usr/include/crypt.h</filename> header and the header
     files provided by OpenSSL.
    </para>

    <para>
     Upgrading your OpenSSL installation to version 0.9.6a fixes this
     problem.  Solaris 9 and above has a newer version of OpenSSL.
    </para>
   </sect3>

   <sect3>
    <title>configure Complains About a Failed Test Program</title>

    <para>
     If <command>configure</command> complains about a failed test
     program, this is probably a case of the run-time linker being
     unable to find some library, probably libz, libreadline or some
     other non-standard library such as libssl.  To point it to the
     right location, set the <envar>LDFLAGS</envar> environment
     variable on the <command>configure</command> command line, e.g.,
<programlisting>
configure ... LDFLAGS="-R /usr/sfw/lib:/opt/sfw/lib:/usr/local/lib"
</programlisting>
     See
     the <citerefentry><refentrytitle>ld</><manvolnum>1</></citerefentry>
     man page for more information.
    </para>
   </sect3>

   <sect3>
    <title>64-bit Build Sometimes Crashes</title>

    <para>
     On Solaris 7 and older, the 64-bit version of libc has a buggy
     <function>vsnprintf</function> routine, which leads to erratic
     core dumps in PostgreSQL.  The simplest known workaround is to
     force PostgreSQL to use its own version of <function>vsnprintf</function> rather than
     the library copy.  To do this, after you
     run <command>configure</command> edit a file produced by
     <command>configure</command>:
     In <filename>src/Makefile.global</filename>, change the line
<programlisting>
LIBOBJS =
</programlisting>
     to read
<programlisting>
LIBOBJS = snprintf.o
</programlisting>
     (There might be other files already listed in this variable.
     Order does not matter.)  Then build as usual.
    </para>
   </sect3>

   <sect3>
    <title>Compiling for Optimal Performance</title>

    <para>
     On the SPARC architecture, Sun Studio is strongly recommended for
     compilation.  Try using the <option>-xO5</option> optimization
     flag to generate significantly faster binaries.  Do not use any
     flags that modify behavior of floating-point operations
     and <varname>errno</varname> processing (e.g.,
     <option>-fast</option>).  These flags could raise some
     nonstandard PostgreSQL behavior for example in the date/time
     computing.
    </para>

    <para>
     If you do not have a reason to use 64-bit binaries on SPARC,
     prefer the 32-bit version.  The 64-bit operations are slower and
     64-bit binaries are slower than the 32-bit variants.  And on
     other hand, 32-bit code on the AMD64 CPU family is not native,
     and that is why 32-bit code is significant slower on this CPU
     family.
    </para>
   </sect3>

   <sect3>
    <title>Using DTrace for Tracing PostgreSQL</title>

    <para>
     Yes, using DTrace is possible.  See <![%standalone-include[the
     documentation]]>
     <![%standalone-ignore[<xref linkend="dynamic-trace">]]> for further
     information.  You can also find more information in this
     article: <ulink url="https://blogs.oracle.com/robertlor/entry/user_level_dtrace_probes_in"></ulink>.
    </para>

    <para>
     If you see the linking of the <command>postgres</command> executable abort with an
     error message like:
<screen>
Undefined                       first referenced
 symbol                             in file
AbortTransaction                    utils/probes.o
CommitTransaction                   utils/probes.o
ld: fatal: Symbol referencing errors. No output written to postgres
collect2: ld returned 1 exit status
make: *** [postgres] Error 1
</screen>
     your DTrace installation is too old to handle probes in static
     functions.  You need Solaris 10u4 or newer.
    </para>
   </sect3>
  </sect2>
 </sect1>

</chapter>