File: Software-Building-HOWTO

package info (click to toggle)
doc-linux-it 2000.01-1
  • links: PTS
  • area: main
  • in suites: woody
  • size: 8,136 kB
  • ctags: 19
  • sloc: perl: 249; makefile: 50; sh: 42
file content (1848 lines) | stat: -rw-r--r-- 60,398 bytes parent folder | download
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
  Building and Installing Software Packages for Linux
  Mendel Cooper <mailto:thegrendel@theriver.com> ---
  http://personal.riverusers.com/~thegrendel/
  v1.91, 27 luglio 1999

  - Compilazione ed installazione di pacchetti software per Linux -
  Questa  un'ampia guida per compilare ed installare "generiche" dis
  tribuzioni di software UNIX sotto Linux. Vengono inoltre discussi i
  formati binari preimpacchettati "rpm" e "deb".  Traduzione di Fabrizio
  Stefani, 23 settembre 1999.

  1.  Introduzione

  Parecchi pacchetti software per i vari dialetti di UNIX e Linux sono
  dati come archivi compressi di file sorgenti. Lo stesso pacchetto pu
  essere "compilato" per girare su differenti macchine fissate, e ci
  risparmia l'autore del software dal dover produrre versioni multiple.
  Una singola versione di un pacchetto software pu cos finire col
  girare, in varie incarnazioni, su una macchina Intel, un DEC Alpha,
  una workstation RISC, o anche un mainframe. Sfortunatamente, questo
  scarica la responsabilit della effettiva "compilazione" ed
  installazione del software sull'utente finale, l'amministratore di
  sistema de facto, il tizio seduto alla tastiera -- voi. Fatevi
  coraggio, comunque, il processo non  poi cos terrificante o
  misterioso come sembra, come dimostrer questa guida.




  2.  Spacchettare i file

  Avete scaricato o vi siete procurati in altro modo un pacchetto
  software.  Molto probabilmente  archiviato (in formato tar) e
  compresso (in formato gzip), e quindi il nome del file terminer con
  .tar.gz o .tgz (N.d.T: Gli archivi tar compressi, in inglese, vengono
  colloquialmente detti "tarball", d'ora in poi ci riferiremo ad essi
  come "pacchetti tar"). Innanzi tutto copiatelo in una directory di
  lavoro. Poi decomprimetelo (con gunzip) e spacchettatelo (con tar). Il
  comando appropriato per farlo  tar xzvf nomefile, dove nomefile  il
  nome del file, ovviamente. Il processo di dearchiviazione generalmente
  installer i file appropriati nelle sottodirectory che avr creato.
  Notate che se il nome del pacchetto ha suffisso .Z, la procedura su
  esposta sar ancora buona, sebbene funzioni anche eseguire uncompress,
  seguito da tar xvf. Potete vedere un'anteprima di tale processo con
  tar tzvf nomefile, che elenca i file contenuti nell'archivio senza in
  effetti estrarli.

  Il suddetto metodo per spacchettare i pacchetti tar  equivalente ad
  uno o l'altro dei seguenti:

    gzip -cd nomefile | tar xvf -

    gunzip -c nomefile | tar xvf -

     (Il '-' forza il comando tar a prendere il suo input dallo stdin.)

  I file sorgenti nel nuovo formato bzip2 (.bz2) possono essere estratti
  con un bzip2 -cd nomefile | tar xvf -, o, pi semplicemente, con un
  tar xyvf nomefile, sempre che tar sia stato opportunamente corretto
  con l'apposita patch (riferirsi al Bzip2.HOWTO ``(tradotto)'' per i
  dettagli).  La distribuzione Linux di Debian usa una diversa patch per
  tar, scritta da Hiroshi Takekawa, che, in quella particolare versione
  di tar, usa le opzioni -I, --bzip2, --bunzip2.

  [Grazie tante a R. Brock Lynn e Fabrizio Stefani per le correzioni e
  gli aggiornamenti sull'informazione sopra citata]
  A volte i file archiviati devono essere estratti, usando tar, ed
  installati dalla home directory dell'utente, o magari in una
  cert'altra directory, tipo /, /usr/src, o /opt, come specificato nelle
  informazioni di configurazione del pacchetto. Qualora si riceva un
  messaggio di errore tentando l'estrazione dall'archivio, questa
  potrebbe esserne la ragione. Leggete i file di documentazione del
  pacchetto, specialmente i file README e/o Install, se presenti, ed
  editate i file di configurazione e/o i Makefile come necessario,
  consistentemente con le istruzioni di installazione. Osservate che di
  solito non si dovrebbe modificare il file Imake, poich ci potrebbe
  avere conseguenze impreviste. La maggior parte dei pacchetti
  permettono di automatizzare questo processo eseguendo make install per
  mettere i binari nelle appropriate aree di sistema.


    Potreste incontrare file shar, o archivi shell, specialmente sui
     newsgroup riguardanti il codice sorgente in Internet.  Questi
     vengono ancora usati perch sono in formato testo, e ci permette
     ai moderatori dei newsgroup di consultarli e respingere quelli
     inadatti. Essi possono essere spacchettati col comando unshar
     nomefile.shar.  Altrimenti la procedura per trattarli  la stessa
     dei pacchetti tar.



    Alcuni archivi sorgente sono stati manipolati usando utilit di
     compressione non standard DOS, Mac o anche Amiga, tipo zip, arc,
     lha, arj, zoo, rar,e shk. Fortunatamente, Sunsite
     <http://metalab.unc.edu> e altri posti hanno delle utilit di
     decompressione per Linux che possono trattare molti o tutti tali
     formati.

  Occasionalmente, potrebbe essere necessario aggiungere delle
  correzioni per dei bug o aggiornare i file sorgenti estratti da un
  archivio usando un file patch o diff che elenca le modifiche. I file
  di documentazione e/o README vi informeranno se ci  necessario. La
  normale sintassi per invocare la potente utilit di patch di Larry
  Wall  patch < patchfile.

  Ora potete procedere alla fase di compilazione del processo.





  3.  Usare make

  Il Makefile  la chiave del processo di compilazione. Nella sua forma
  pi semplice, un Makefile  uno script per la compilazione, o
  building, dei "binari", le parti eseguibili di un pacchetto.  Il
  Makefile pu anche fornire un mezzo per aggiornare un pacchetto
  software senza dover ricompilare ogni singolo file sorgente in esso,
  ma questa  un'altra storia (o un altro articolo).

  Ad un certo punto, il Makefile lancia cc o gcc. Questo in realt  un
  preprocessore, un compilatore C (o C++), ed un linker, invocati in
  quell'ordine. Questo processo converte il sorgente nei binari, i veri
  eseguibili.

  L'invocazione di make di solito richiede solo di battere make. Ci,
  generalmente, serve a compilare tutti i file eseguibili necessari per
  il pacchetto in questione. Tuttavia, make pu svolgere anche altri
  compiti, come installare i file nelle loro directory appropriate (make
  install) e rimuovere i file oggetto stantii (make clean). L'esecuzione
  di make -n permette di vedere un'anteprima del processo di
  compilazione, poich stampa tutti i comandi che sarebbero attivati da
  un make, ma senza in effetti eseguirli.


  Solo i software pi semplici usano un Makefile generico. Le
  installazioni pi complesse richiedono un Makefile su misura secondo
  la posizione delle librerie, dei file include e delle risorse sulla
  vostra specifica macchina. Questo, in particolare,  il caso che si ha
  quando durante il processo di compilazione servono le librerie X11 per
  l'installazione. Imake e xmkmf adempiono questo compito.

  Un Imakefile , per citare la pagina di manuale, un "prototipo" di
  Makefile. L'utilit imake costruisce un Makefile adatto al vostro
  sistema dall'Imakefile. Nella maggior parte dei casi, tuttavia,
  preferirete eseguire xmkmf, uno script shell che invoca imake, un suo
  front end. Controllate il file README o INSTALL incluso nell'archivio
  per istruzioni specifiche (se, dopo aver estratto dall'archivio i file
  sorgenti,  presente un file Imake nella directory base,  un chiaro
  segno che dovrebbe essere eseguito xmkmf). Leggere le pagine di
  manuale di Imake e xmkmf per una pi dettagliata analisi della
  procedura.

   bene essere consapevoli che xmkmf e make potrebbero dover essere
  invocati come root, specialmente nel fare un make install per spostare
  i binari sulle directory /usr/bin o /usr/local/bin. Usare make come
  utente normale, senza privilegi di root, porter probabilmente a dei
  messaggi d'errore tipo write access denied (accesso in scrittura
  negato), perch manca il permesso per la scrittura nelle directory di
  sistema. Controllate anche che i binari creati abbiano i giusti
  permessi di esecuzione per voi ed ogni altro utente appropriato.

  Quando viene invocato, xmkmf usa il file Imake per costruire il
  Makefile appropriato per il vostro sistema. Sarete soliti invocare
  xmkmf con l'argomento -a, per effettuare automaticamente make
  Makefiles, make includes e make depend. Ci imposta le variabili e
  definisce le posizioni delle librerie per il compilatore ed il linker.
  A volte, non ci sar il file Imake, ci sar invece uno script INSTALL
  o configure, che dovrebbe essere invocato come ./configure per
  assicurarsi che venga chiamato il giusto script configure. Nella
  maggior parte dei casi, il file README incluso con la distribuzione
  spiegher la procedura di installazione.

   di solito una buona idea guardare dentro il Makefile che xmkmf, o
  uno degli script di installazione, costruiscono. Il Makefile sar di
  solito adatto per il vostro sistema, ma occasionalmente potrebbe
  essere necessario "ritoccarlo" o correggere manualmente degli errori.


  Per installare i binari appena compilati nelle appropriate directory
  di sistema di solito basta eseguire, come root, make install.
  Solitamente, le directory per i binari del sistema sulle moderne
  distribuzioni Linux sono /usr/bin, /usr/X11R6/bin, e /usr/local/bin.
  La directory da preferire per i nuovi pacchetti  /usr/local/bin,
  poich in tal modo si terranno separati i binari che non fanno parte
  della installazione Linux originale.

  I pacchetti originariamente mirati per versioni commerciali di UNIX
  potrebbero provare ad installarsi in /opt o in un'altra directory
  sconosciuta. Ci, naturalmente, causer un errore di installazione se
  la directory in questione non esiste. Il modo pi semplice per
  risolvere questo problema  quello di creare, come root, una directory
  /opt, lasciare che il pacchetto vi si installi, e poi aggiungere tale
  directory alla variabile d'ambiente PATH. Oppure, potete creare dei
  link simbolici alla directory /usr/local/bin.

  La procedura di installazione generale sar quindi:

    Leggere il file README ed altri file di documentazione appropriati.

    Eseguire xmkmf -a, o lo script INSTALL o configure.

    Controllare il Makefile.

    Se necessario, eseguire make clean, make Makefiles, make includes,
     e make depend.

    Eseguire make.

    Controllare i permessi.

    Se necessario, eseguire make install.


  Note:


    Normalmente non si compilano i pacchetti come root. L'effettuare un
     su a root  necessario solo per installare i binari compilati nelle
     directory di sistema.

    Una volta che avete preso confidenza con make e col suo uso,
     potreste volere che vengano aggiunte nel Makefile standard incluso
     nel  (o creato col) pacchetto che state installando delle opzioni
     di ottimizzazione aggiuntive. Alcune di tali opzioni, le pi usate,
     sono -O2, -fomit-frame-pointer, -funroll-loops e -mpentium (se
     usate un processore Pentium). Siate cauti e fatevi guidare dal buon
     senso quando modificate un Makefile!

    Dopo che make ha creato i binari, potreste voler usare strip su
     essi. Il comando strip elimina dai file binari le informazioni per
     il debugging simbolico e ne riduce la dimensione, spesso
     drasticamente. Ovviamente ci disabiliter il debugging.

    Il Pack Distribution Project <http://sunsite.auc.dk/pack/> utilizza
     un diverso approccio per la creazione di archivi di pacchetti
     software, basato su un insieme di strumenti scritti in Python per
     la gestione di link simbolici a file installati in directory di
     raccolta separate. Questi archivi sono degli ordinari pacchetti
     tar, ma si installano nelle directory /coll e /pack.  Potreste
     dover scaricare il Pack-Collection dal suddetto sito qualora vi
     capiti di imbattervi in una di tali distribuzioni.




  4.  Binari preimpacchettati



  4.1.  Cosa c' che non va negli rpm?


  La compilazione e l'installazione manuale dei pacchetti dal sorgente 
  un compito apparentemente cos spaventoso per alcuni utenti Linux che
  essi hanno abbracciato i popolari formati di pacchetti rpm e deb, o il
  pi recente Stampede slp. Sebbene possa essere vero che
  l'installazione di un rpm di solito procede tanto facilmente e tanto
  velocemente quanto l'installazione del software di un certo altro noto
  sistema operativo,  il caso di spendere qualche parola riguardo gli
  svantaggi della installazione-fai-da-te dei binari preimpacchettati.

  Primo, sappiate che i pacchetti software vengono di solito rilasciati
  inizialmente come pacchetti tar, e i binari preimpacchettati li
  seguono giorni, settimane, persino mesi dopo. Un pacchetto rpm
  corrente  tipicamente almeno un paio di versioni minori indietro
  rispetto all'ultimo pacchetto tar. Quindi, se desiderate stare al
  passo con tutto il software dell'ultima generazione, potreste non
  voler aspettare che appaia un rpm o un deb. Alcuni pacchetti meno
  popolari potrebbero non essere mai convertiti in rpm.

  Secondo, il pacchetto tar potrebbe facilmente essere pi completo,
  avere pi opzioni, e prestarsi meglio ad una personalizzazione ed una
  messa a punto. La versione binaria rpm potrebbe non avere alcune delle
  funzionalit della versione completa. Gli rpm sorgenti contengono il
  codice sorgente completo e sono equivalenti ai corrispondenti
  pacchetti tar, e allo stesso modo necessitano di essere compilati ed
  installati usando l'opzione rpm --recompile nomepacchetto.rpm oppure
  rpm --rebuild nomepacchetto.rpm.

  Terzo, alcuni binari preimpacchettati non si installano bene, e anche
  se si installano, potrebbero piantarsi e fare un core dump. Essi
  potrebbero dipendere da versioni di libreria diverse da quelle
  presenti nel vostro sistema, o potrebbero essere stati preparati
  impropriamente o essere semplicemente difettosi. Ad ogni modo, quando
  installate un rpm o un deb necessariamente fate affidamento sulla
  competenza delle persone che hanno preparato quel pacchetto.

  Infine, aiuta avere il codice sorgente in mano, per poter effettuare
  delle riparazioni ed imparare da esso.  molto pi conveniente avere
  il sorgente nell'archivio da cui si stanno compilando i binari,
  piuttosto che in un differente pacchetto rpm.


  L'installazione di un pacchetto rpm non  necessariamente una
  bazzecola. Se c' un conflitto di dipendenza, l'installazione dell'rpm
  fallir. L'rpm potrebbe richiedere una versione delle librerie diversa
  da quelle presenti sul vostro sistema, l'installazione potrebbe non
  funzionare, anche se create dei link simbolici alle librerie mancanti
  da quelle a posto. Malgrado la loro convenienza, le installazioni
  degli rpm spesso falliscono per le stesse ragioni per cui lo fanno
  quelle dei pacchetti tar.

  Dovete installare gli rpm e i deb come root, per avere i necessari
  permessi di scrittura, e ci apre un buco di sicurezza potenzialmente
  serio, poich potreste inavvertitamente massacrare i binari di sistema
  e le librerie, o anche installare un cavallo di Troia che potrebbe
  liberare il caos sul vostro sistema.  quindi importante ottenere
  pacchetti rpm e deb da una "fonte fidata". In ogni caso, dovreste
  eseguire una 'verifica della firma' (rispetto ad un codice di
  controllo MD5) sul pacchetto, rpm --checksig nomepacchetto.rpm, prima
  di installarlo. Allo stesso modo  fortemente raccomandata
  l'esecuzione di rpm -K --nopgp nomepacchetto.rpm. I comandi
  corrispondenti per i pacchetti deb sono dpkg -I | --info
  nomepacchetto.deb e dpkg -e | --control nomepacchetto.deb.


    rpm --checksig gnucash-1.1.23-4.i386.rpm






  gnucash-1.1.23-4.i386.rpm: size md5 OK


    rpm -K --nopgp gnucash-1.1.23-4.i386.rpm


  gnucash-1.1.23-4.i386.rpm: size md5 OK

  Per i tipi veramente paranoici (e in questo caso ci sarebbe molto da
  dire a proposito di paranoia), ci sono le utilit unrpm e rpmunpack
  disponibili presso la directory utils/package di Sunsite per estrarre
  e controllare i singoli componenti dei pacchetti.

  Klee Diene <mailto:klee@debian.org> ha scritto il pacchetto
  sperimentale dpkgcert, per la verifica dell'integrit dei file .deb
  installati, usando i codici di controllo MD5.   disponibile
  nell'archivio ftp Debian
  <ftp://ftp.debian.org/pub/debian/project/experimental>. L'attuale nome
  / versione  dpkgcert_0.2-4.1_all.deb. Il sito Jim Pick Software
  <http://dpkgcert.jimpick.com> mantiene un server database sperimentale
  per fornire certificati dpkgcert per i pacchetti di una tipica
  installazione Debian.

  Nella loro forma pi semplice, i comandi rpm -i nomepacchetto.rpm e
  dpkg --install nomepacchetto.deb automaticamente aprono il pacchetto
  ed installano il software. Siate cauti, comunque, poich usare tali
  comandi ciecamente pu essere pericoloso per la salute del vostro
  sistema!

  Notate che gli avvertimenti suddetti si applicano anche, sebbene in
  minor misura, all'utilit di installazione pkgtool della Slackware.
  Tutto il software di installazione "automatico" richiede cautela.

  I programmi martian
  <http://www.people.cornell.edu/pages/rc42/program/martian.html> e
  alien <http://kitenet.net/programs/alien/> permettono la conversione
  tra i formati dei pacchetti rpm, deb, Stampede slp e tar.gz.  Ci
  rende questi pacchetti accessibili a tutte le distribuzioni Linux.

  Leggere attentamente le pagine di manuale dei comandi rpm e dpkg, e
  fare riferimento all'RPM HOWTO, alla Quick Guide to Red Hat's Package
  Manager <http://www.tfug.org/helpdesk/linux/rpm.html> del TFUG, e a
  The Debian Package Management Tools
  <http://www.debian.org/doc/FAQ/debian-faq-7.html> per informazioni pi
  dettagliate.


  4.2.  Problemi con gli rpm: un esempio


  Jan Hubicka <mailto:hubicka@paru.cas.cz> ha scritto un bellissimo
  pacchetto per i frattali, chiamato xaos. Sulla sua home page
  <http://www.paru.cas.cz/~hubicka/XaoS> sono disponibili entrambi i
  pacchetti .tar.gz e rpm. In nome della comodit proviamo la versione
  rpm, piuttosto che il pacchetto tar.

  Sfortunatamente, l'rpm di xaos non si installa. Due diverse versioni
  rpm fanno i capricci.

  rpm -i --test XaoS-3.0-1.i386.rpm


       error: failed dependencies:
               libslang.so.0 is needed by XaoS-3.0-1
               libpng.so.0 is needed by XaoS-3.0-1
               libaa.so.1 is needed by XaoS-3.0-1




  rpm -i --test xaos-3.0-8.i386.rpm

  error: failed dependencies:
          libaa.so.1 is needed by xaos-3.0-8




  La cosa strana  che libslang.so.0, libpng.so.0, e libaa.so.1 sono
  tutte presenti nella directory /usr/lib del sistema usato. Gli rpm di
  xaos devono essere stati compilati con delle versioni leggermente
  diverse di quelle librerie, anche se i numeri di versione sono
  identici.

  Come test, proviamo ad installare xaos-3.0-8.i386.rpm con l'opzione
  --nodeps per forzarne l'installazione. Provando ad eseguire xaos si
  pianta.



       xaos: error in loading shared libraries: xaos: undefined symbol: __fabsl




  (errore nel caricamento delle librerie condivise, il simbolo __fabsl
  non  definito)

  Cerchiamo testardamente di andare in fondo alla cosa. Lanciando ldd
  sul binario di xaos, per trovare da quali librerie dipende, vediamo
  che le librerie necessarie ci sono tutte. Lanciando nm sulla libreria
  /usr/lib/libaa.so.1, per vedere i suoi riferimenti simbolici, ci
  accorgiamo che __fabsl manca davvero. Naturalmente il riferimento che
  manca potrebbe non essere presente in una qualsiasi delle altre
  librerie... Non c' niente da fare, salvo rimpiazzare una o pi
  librerie.

  Basta! Scarichiamo il pacchetto tar, XaoS-3.0.tar.gz, disponibile sul
  sito ftp <ftp://ftp.ta.jcu.cz/pub/linux/hubicka/XaoS/3.0> o reperibile
  dalla home page. Proviamo a compilarlo.  L'esecuzione di ./configure,
  make e infine (come root) make install procede senza intoppi.

  Questo  solo uno fra i tanti esempi di binari preimpacchettati che
  portano pi problemi che vantaggi.





  5.  Problemi riguardo termcap e terminfo



  Secondo la pagina di manuale, "terminfo  un database che descrive i
  terminali, usato da programmi orientati-allo-schermo...".  Esso
  definisce un generico insieme di sequenze di controllo (codici di
  escape) usati per mostrare il testo sui terminali, e rende possibile
  il supporto per differenti terminali hardware senza la necessit di
  driver speciali. Le librerie terminfo si trovano in
  /usr/share/terminfo, sulle moderne distribuzioni di Linux.

  Il database terminfo ha ampiamente sostituito il pi vecchio termcap
  ed il completamente obsoleto termlib.  Ci normalmente non ha nessuna
  attinenza con l'installazione dei programmi, eccetto quando si ha a
  che fare con un pacchetto che richiede termcap.

  La maggior parte delle distribuzioni Linux ora usano terminfo, ma
  ancora conservano le librerie termcap per compatibilit con le
  applicazioni legacy (vedere /etc/termcap). A volte c' uno speciale
  pacchetto di compatibilit che  necessario aver installato per
  facilitare l'uso dei binari linkati con termcap. Raramente, potrebbe
  essere necessario togliere il commento da una dichiarazione #define
  termcap in un file sorgente. Controllate i file di documentazione
  appropriati nella vostra distribuzione per informazioni a tal
  riguardo.




  6.  Compatibilit all'indietro con i binari a.out


  In rarissimi casi,  necessario usare binari a.out, o perch il codice
  sorgente non  disponibile o perch, per una qualche ragione, non 
  possibile compilare nuovi binari ELF dal sorgente.

  Come succede, le installazioni ELF hanno quasi sempre un completo
  insieme di librerie a.out nella directory /usr/i486-linuxaout/lib.  Lo
  schema di numerazione delle librerie a.out differisce da quello delle
  ELF, evitando intelligentemente conflitti che potrebbero creare
  confusione. I binari a.out dovrebbero perci essere in grado di
  trovare le giuste librerie in fase di esecuzione, ma ci potrebbe non
  accadere sempre.

  Notate che il kernel necessita di avere il supporto per a.out, o
  direttamente o come modulo caricabile. Potrebbe essere necessario
  ricompilare il kernel per abilitare ci. Inoltre, alcune distribuzioni
  di Linux richiedono l'installazione di uno speciale pacchetto di
  compatibilit, come xcompat di Debian, per eseguire applicazioni X
  a.out.


  6.1.  Un esempio


  Jerry Smith ha scritto il comodissimo programma xrolodex alcuni anni
  fa. Esso usa le librerie Motif, ma fortunatamente  disponibile come
  binario linkato staticamente in formato a.out. Sfortunatamente, il
  sorgente necessita di numerosi aggiustamenti per essere ricompilato
  usando le librerie lesstif. Ancor pi sfortunatamente, il binario
  a.out su di un sistema ELF va in bomba con il seguente messaggio
  d'errore.


       xrolodex: can't load library '//lib/libX11.so.3'
       No such library




  (Traducendo: non  possibile caricare la libreria //lib/libX11.so.3;
  non c' nessuna libreria con quel nome)

  Si d il caso che ci sia una tale libreria, in
  /usr/i486-linuxaout/lib, ma xrolodex  incapace di trovarla in fase di
  esecuzione. La soluzione semplice  di fornire un link simbolico nella
  directory /lib:

  ln -s /usr/i486-linuxaout/lib/X11.so.3.1.0 libX11.so.3


  Ne viene fuori che  necessario fornire link simili per le librerie
  libXt.so.3 e libc.so.4. Ci deve essere fatto come root, naturalmente.
  Notate che dovrete essere assolutamente certi di non sovrascrivere o
  provocare conflitti di versione con librerie preesistenti.
  Fortunatamente, le nuove librerie ELF hanno numeri di versione pi
  alti delle pi vecchie a.out, per prevenire ed impedire proprio tali
  problemi.

  Dopo aver creato i tre link, xrolodex funziona bene.

  Il pacchetto xrolodex era originariamente pubblicato su Spectro
  <http://www.spectro.com/>, ma sembra che sia sparito da l.
  Attualmente pu essere scaricato da Sunsite
  <http://metalab.unc.edu/pub/Linux/apps/reminder/xrolodex.tar.z> come
  file sorgente [512k] in formato tar.Z.




  7.  Risoluzione dei problemi


  Se xmkmf e/o make hanno funzionato senza problemi, potete passare alla
  ``prossima sezione''.  Tuttavia, nella "vita reale", poche cose vanno
  bene al primo tentativo.   in questi casi che la vostra
  intraprendenza viene messa alla prova.


  7.1.  Errori in fase di link


    Supponiamo che make fallisca con un: Link error: -lX11: No such
     file or directory (Nessun file o directory con quel nome), anche
     dopo che xmkmf  stato invocato. Ci potrebbe significare che il
     file Imake non  stato preparato correttamente.  Controllate che
     nella prima parte del Makefile ci siano delle righe tipo:



       LIB=            -L/usr/X11/lib
       INCLUDE=        -I/usr/X11/include/X11
       LIBS=           -lX11 -lc -lm





  Le opzioni -L e -I dicono al compilatore e al linker dove cercare i
  file library e include, rispettivamente.  In questo esempio, le
  librerie di X11 dovrebbero essere nella directory /usr/X11/lib, e i
  file include di X11 dovrebbero essere nella directory
  /usr/X11/include/X11. Se sulla vostra macchina non  cos, apportate i
  cambiamenti necessari al Makefile e riprovate il make.


    Riferimenti non definiti alle funzioni della libreria matematica,
     come il seguente:


                /tmp/cca011551.o(.text+0x11): undefined reference to `cos'





  La soluzione  di linkargli esplicitamente la libreria matematica,
  aggiungendo un -lm al flag LIB o LIBS nel Makefile (vedere esempio
  precedente).

    Ancora un'altra cosa da provare se xmkmf fallisce  lo script
     seguente:


                make -DUseInstalled -I/usr/X386/lib/X11/config




  Che  una specie di xmkmf ridotto all'osso.


    In rarissimi casi, l'esecuzione di ldconfig come root potrebbe
     essere la soluzione:







  # ldconfig aggiorna i link simbolici alla libreria condivisa.  Questo
  potrebbe non essere necessario.


    Alcuni Makefile usano degli alias non riconosciuti per le librerie
     presenti nel vostro sistema. Per esempio, il binario potrebbe
     richiedere libX11.so.6, ma in /usr/X11R6/lib non c' nessun file o
     link con quel nome. Per, c' un libX11.so.6.1. La soluzione  di
     fare un ln -s /usr/X11R6/lib/libX11.so.6.1
     /usr/X11R6/lib/libX11.so.6, come root.  Ci potrebbe dover essere
     seguito da un ldconfig.



    A volte il sorgente necessita delle vecchie librerie nella versione
     X11R5 per essere compilato. Se avete le librerie R5 in
     /usr/X11R6/lib (avete avuto la possibilit di installarle durante
     la prima installazione di Linux), allora dovete solo assicurarvi di
     avere i link di cui il software ha bisogno per la compilazione. Le
     librerie R5 sono chiamate libX11.so.3.1.0, libXaw.so.3.1.0, e
     libXt.so.3.1.0. Di solito vi servono dei link, come libX11.so.3 ->
     libX11.so.3.1.0. Forse il software avr bisogno anche di un link
     del tipo libX11.so -> libX11.so.3.1.0. Naturalmente, per creare un
     link "mancante", usate il comando ln -s libX11.so.3.1.0 libX11.so,
     come root.





    Alcuni pacchetti esigeranno l'installazione di versioni aggiornate
     di una o pi librerie. Per esempio, le versioni 4.x della suite
     StarOffice della StarDivision GmbH erano famose per richiedere libc
     in versione 5.4.4 o successiva. Anche il pi recente StarOffice 5.0
     non girer nemmeno dopo l'installazione con le nuove librerie glibc
     2.1. Fortunatamente, il pi nuovo StarOffice 5.1 risolve tali
     problemi. Se avete una versione di StarOffice pi vecchia, potreste
     dover copiare, da root, una o pi librerie nelle directory
     appropriate, rimuovere le vecchie librerie, poi ripristinare i link
     simbolici (controllate l'ultima versione dello StarOffice miniHOWTO
     ``(tradotto)'' per maggiori informazioni su questo argomento).

     Attenzione: Usate molta cautela nel fare ci, poich potreste
     rendere non funzionante il vostro sistema se combinate dei
     pasticci.
     Potete trovare le librerie pi aggiornate presso Sunsite.


  7.2.  Altri problemi



    Uno script Perl o shell installato vi d un No such file or
     directory come messaggio d'errore. In questo caso, controllate i
     permessi del file per assicurarvi che il file sia eseguibile e
     controllate l'intestazione del file per accertarvi che la shell o
     il programma invocato dallo script sia nel posto specificato.  Per
     esempio, lo script potrebbe iniziare con:


       #!/usr/local/bin/perl




  Se infatti Perl  installato nella vostra directory /usr/bin invece
  che nella /usr/local/bin, allora lo script non funzioner. Ci sono due
  modi per correggere questo problema. L'intestazione del file script
  pu essere cambiata in #!/usr/bin/perl, o si pu aggiungere un link
  simbolico alla giusta directory, ln -s /usr/bin/perl
  /usr/local/bin/perl.


    Alcuni programmi X11 richiedono le librerie Motif per la
     compilazione.  Le distribuzioni Linux standard non hanno le
     librerie Motif installate, e al momento Motif costa 100-200$ extra
     (sebbene in parecchi casi funzioni anche la versione freeware
     Lesstif <http://www.lesstif.org/>). Se vi serve Motif per la
     compilazione di un certo pacchetto, ma vi mancano le librerie
     Motif, pu essere possibile ottenere dei binari linkati
     staticamente. Il linkaggio statico incorpora le routine di libreria
     nei binari stessi. Ci si traduce in file binari pi grandi, ma il
     codice girer sui sistemi in cui mancano le librerie.








  Quando un pacchetto richiede, per la compilazione, delle librerie non
  presenti sul vostro sistema, ci provocher errori in fase di link
  (errori tipo undefined reference - riferimento non definito).  Le
  librerie potrebbero essere del tipo costoso (propriet di qualcuno) o
  difficili da trovare per qualche altra ragione. In tal caso, ottenere
  un binario linkato staticamente dall'autore del pacchetto, o da un
  gruppo utenti Linux, pu essere il modo pi facile per effettuare
  delle riparazioni.



    Eseguendo uno script configure  stato creato uno strano Makefile,
     uno che sembra non avere nulla a che fare col pacchetto che state
     tentando di compilare. Ci significa che  stato eseguito il
     configure sbagliato, uno trovato da qualche altra parte nel path.
     Lanciate sempre configure come ./configure per evitare questo
     problema.



    La maggior parte delle distribuzioni sono passate alle librerie
     libc 6 / glibc 2 dalla pi vecchia libc 5. I binari precompilati
     che funzionavano con la vecchia libreria potrebbero andare in bomba
     se avete aggiornato la libreria. La soluzione  o di ricompilare le
     applicazioni dal sorgente o di ottenere dei nuovi binari
     precompilati. Se state aggiornando il vostro sistema a libc 6 e
     riscontrate dei problemi, fate riferimento al Glibc 2 HOWTO
     ``(tradotto)'' di Eric Green.








  Notate che ci sono delle piccole incompatibilit fra le versioni
  minori di glibc, cos un binario compilato con glibc 2.1 potrebbe non
  funzionare con glibc 2.0 e vice versa.



    A volte  necessario togliere l'opzione -ansi dai flag di
     compilazione nel Makefile. Ci abilita le caratteristiche
     supplementari di gcc, quelle non-ANSI in particolare, e permette la
     compilazione di pacchetti che richiedono tali estensioni. (Grazie a
     Sebastien Blondeel per questa indicazione).


    Alcuni programmi esigono di essere setuid root, per poter essere
     eseguiti con privilegi di root. Il comando per effettuare ci 
     chmod u+s nomefile, come root (osservate che il programma deve gi
     essere di propriet di root). Questo ha l'effetto di impostare il
     bit setuid nei permessi del file. Questo problema viene fuori
     quando il programma accede all'hardware di sistema, come un modem o
     un lettore CD ROM, o quando le librerie SVGA vengono chiamate dal
     modo console, come in un particolare noto pacchetto di emulazione.
     Se un programma funziona quando eseguito da root, ma d messaggi di
     errore tipo access denied (accesso negato) ad un utente normale,
     sospettate che la causa sia questa.



     Avvertimento: Un programma con setuid impostato come root pu porre
     un rischio di sicurezza per il sistema. Il programma gira con
     privilegi di root ed ha cos il potenziale di causare danni
     significativi. Accertatevi di sapere cosa fa il programma,
     guardando il sorgente se possibile, prima di impostare il bit
     setuid.




  7.3.  Ritocchi e messa a punto


  Potreste voler esaminare il Makefile per accertarvi che vengano usate
  le migliori opzioni di compilazione possibili per il vostro sistema.
  Per esempio, impostando il flag -O2 si sceglie il pi alto livello di
  ottimizzazione ed il flag -fomit-frame-pointer provoca la generazione
  di un binario pi piccolo (sebbene il debugging sar cos
  disabilitato). Per non giocherellate con tali opzioni, a meno che non
  sappiate cosa state facendo, e comunque non prima di aver ottenuto un
  binario funzionante.


  7.4.  Dove trovare maggiore aiuto


  Nella mia esperienza, forse il 25% delle applicazioni supera la fase
  di compilazione cos com', senza problemi. Un altro 50%, o gi di l,
  pu essere "persuaso" a farlo con uno sforzo variabile da lieve ad
  erculeo. Questo significa che ancora un numero significativo di
  pacchetti non ce la faranno, non importa cosa si faccia.  In tal caso,
  i binari Intel ELF e/o a.out di questi potrebbero essere trovati
  presso Sunsite o presso TSX-11 archive. Red Hat <http://redhat.com> e
  Debian <http://www.debian.org> hanno vasti archivi di binari
  preimpacchettati della maggior parte dei pi popolari software per
  Linux.  Forse l'autore del software pu fornire i binari compilati per
  il vostro particolare tipo di macchina.


  Notate che se ottenete i binari precompilati, dovrete controllarne la
  compatibilit con il vostro sistema:

    I binari devono girare sul vostro hardware (i.e., Intel x86).

    I binari devono essere compatibili con il vostro kernel (i.e.,
     a.out o ELF).

    Le vostre librerie devono essere aggiornate.

    Il vostro sistema deve avere le appropriate utilit di
     installazione (rpm o deb).

  Se tutto il resto non funziona, potete trovare aiuto nei newsgroup
  appropriati, come comp.os.linux.x o comp.os.linux.development.

  Se non funziona proprio niente, almeno avrete fatto del vostro meglio,
  ed avrete imparato molto.






  8.  Conclusioni

  Leggete la documentazione del pacchetto software per stabilire se
  certe variabili d'ambiente hanno bisogno di impostazioni (in .bashrc o
  .cshrc) e se i file .Xdefaults e .Xresources hanno bisogno di essere
  personalizzati.

  Potrebbe esserci un file di default per l'applicazione, di solito
  chiamato Xprog.ad nella distribuzione Xprog originale. Se  cos,
  editate il file Xprog.ad per adattarlo alla vostra macchina, poi
  cambiategli nome (mv) in Xprog ed installatelo nella directory
  /usr/lib/X11/app-defaults come root. Un insuccesso nel fare ci
  potrebbe far s che il software si comporti stranamente o addirittura
  si rifiuti di girare.

  La maggior parte dei pacchetti software comprendono una o pi pagine
  di manuale preformattate. Come root, copiate il file Xprog.man nella
  directory /usr/man, /usr/local/man, o /usr/X11R6/man appropriata (man1
  - man9), e cambiategli nome come del caso. Per esempio, se Xprog.man
  finisce in /usr/man/man4, dovrebbe essere rinominato Xprog.4 (mv
  Xprog.man Xprog.4).  Per convenzione, i comandi utente vanno in man1,
  i giochi in man6, ed i pacchetti di amministrazione in man8 (vedere la
  documentazione di man per maggiori dettagli).  Naturalmente, se vi va,
  potete discostarvi dalla convenzione, sul vostro sistema.


  Alcuni, pochi, pacchetti non installeranno i binari nelle appropriate
  directory di sistema, cio essi non hanno l'opzione install nel
  Makefile. In tal caso, potete installare manualmente i binari
  copiandoli nell'appropriata directory di sistema, /usr/bin,
  /usr/local/bin o /usr/X11R6/bin, come root, naturalmente. Notate che
  /usr/local/bin  la directory da preferire per i binari che non fanno
  parte della distribuzione di base di Linux.

  Alcune o tutte le suddette procedure ,nella maggior parte dei casi,
  dovrebbero essere effettuate automaticamente con un make install, e
  forse un make install.man o un make install_man. Se  cos, i file di
  documentazione README o INSTALL lo specificheranno.



  9.  Primo esempio: Xscrabble

  L'Xscrabble di Matt Chapman aveva l'aria di essere un programma che
  sarebbe stato interessante avere, poich si d il caso che io sia un
  accanito giocatore di ScrabbleTM. Lo scaricai, decompressi, e lo
  compilai seguendo la procedura nel file README:


            xmkmf
            make Makefiles
            make includes
            make




  Ovviamente non funzion...



       gcc -o xscrab -O2 -O -L/usr/X11R6/lib
       init.o xinit.o misc.o moves.o cmove.o main.o xutils.o mess.o popup.o
       widgets.o display.o user.o CircPerc.o
       -lXaw -lXmu -lXExExt -lXext -lX11 -lXt -lSM -lICE -lXExExt -lXext -lX11
       -lXpm -L../Xc -lXc

       BarGraf.o(.text+0xe7): undefined reference to `XtAddConverter'
       BarGraf.o(.text+0x29a): undefined reference to `XSetClipMask'
       BarGraf.o(.text+0x2ff): undefined reference to `XSetClipRectangles'
       BarGraf.o(.text+0x375): undefined reference to `XDrawString'
       BarGraf.o(.text+0x3e7): undefined reference to `XDrawLine'
       etc.
       etc.
       etc...




  Indagai su ci nel newsgroup comp.os.linux.x, e qualcuno gentilmente
  mi indic che, apparentemente, le librerie Xt, Xaw, Xmu, e X11 non
  erano state trovate nella fase di link. Hmmm...

  C'erano due Makefile principali, e quello nella directory src cattur
  la mia attenzione. Una linea nel Makefile definita LOCAL_LIBS:
  LOCAL_LIBS = $(XAWLIB) $(XMULIB) $(XTOOLLIB) $(XLIB). Qui c'erano i
  riferimenti alle librerie non trovate dal linker.

  Cercando il successivo riferimento a LOCAL_LIBS, vidi alla linea 495
  di quel Makefile:


        $(CCLINK) -o $@ $(LDOPTIONS) $(OBJS) $(LOCAL_LIBS) $(LDLIBS)
  $(EXTRA_LOAD_FLAGS)




  Ora, cos'erano queste LDLIBS?


             LDLIBS = $(LDPOSTLIB) $(THREADS_LIBS) $(SYS_LIBRARIES)
       $(EXTRA_LIBRARIES)




  Le SYS_LIBRARIES erano:


        SYS_LIBRARIES = -lXpm -L../Xc -lXc




  S! Le librerie mancanti erano qui.

   possibile che il linker avesse bisogno di vedere le LDLIBS prima
  delle LOCAL_LIBS...  Cos, la prima cosa da provare era di modificare
  il Makefile invertendo le $(LOCAL_LIBS) e le $(LDLIBS) alla linea 495,
  dunque ora si dovrebbe leggere:


               $(CCLINK) -o $@ $(LDOPTIONS) $(OBJS) $(LDLIBS) $(LOCAL_LIBS)
       $(EXTRA_LOAD_FLAGS)                          ^^^^^^^^^^^^^^^^^^^^^^^




  Provai ad eseguire di nuovo make con i suddetti cambiamenti e, guarda
  un po', stavolta funzion. Xscrabble aveva ancora bisogno di qualche
  aggiustamento ed una messa a punto, ovviamente, come cambiare nome al
  dizionario e togliere il commento da qualche statement assert in uno
  dei file sorgenti, ma da allora mi ha fornito svariate ore di
  divertimento.



  [Notate che ora  disponibile una nuova versione di Xscrabble in
  formato rpm, e questa si installa senza problemi.]




  Potete contattare Matt Chapman <mailto:matt@belgarath.demon.co.uk> via
  e-mail, e scaricare Xscrabble dalla sua home page
  <http://www.belgarath.demon.co.uk/programs/index.html>.






              Scrabble  un marchio registrato dalla Milton Bradley Co., Inc.




  10.  Secondo esempio: Xloadimage

  Questo esempio pone un problema pi facile. Il programma xloadimage
  sembrava un'utile aggiunta alla mia raccolta di attrezzi grafici. Ho
  copiato il file xloadi41.gz direttamente dalla directory sorgente sul
  CD, allegato all'eccellente libro ``X User Tools'', di Mui e Quercia.
  Come c'era da aspettarsi, tar xzvf estrae i file dall'archivio. Il
  make, per, fornisce un antipatico errore e termina.



       gcc -c -O -fstrength-reduce -finline-functions -fforce-mem
       -fforce-addr -DSYSV  -I/usr/X11R6/include
       -DSYSPATHFILE=\"/usr/lib/X11/Xloadimage\" mcidas.c

       In file included from /usr/include/stdlib.h:32,
                        from image.h:23,
                        from xloadimage.h:15,
                        from mcidas.c:7:
       /usr/lib/gcc-lib/i486-linux/2.6.3/include/stddef.h:215:
       conflicting types for `wchar_t'
       /usr/X11R6/include/X11/Xlib.h:74: previous declaration of
       `wchar_t'
       make[1]: *** [mcidas.o] Error 1
       make[1]: Leaving directory
       `/home/thegrendel/tst/xloadimage.4.1'
       make: *** [default] Error 2




  Il messaggio d'errore contiene l'indizio essenziale.

  Guardando il file image.h, linea 23...


              #include <stdlib.h>




  Aha, da qualche parte nel sorgente per xloadimage, wchar_t  stato
  ridefinito in modo diverso da quanto specificato nel file include
  standard, stdlib.h. Proviamo prima a commentare la linea 23 in
  image.h, che forse l'include stdlib.h, dopo tutto, non  necessario.

  A questo punto, la fase di compilazione procede senza nessun errore
  fatale. Il pacchetto xloadimage funziona correttamente ora.





  11.  Terzo esempio: Fortune

  Questo esempio richiede qualche conoscenza di programmazione in C. La
  maggioranza del software UNIX/Linux  scritta in C, e imparare almeno
  un po' di C sarebbe certamente un bene per chiunque sia seriamente
  interessato all'installazione del software.

  Il famoso programma fortune mostra una frase umoristica, un "biscotto
  della fortuna", ad ogni avvio di Linux. Sfortunatamente (il gioco di
  parole  intenzionale), provare a costruir fortuna su una
  distribuzione Red Hat con un kernel 2.0.30 provoca degli errori
  fatali.  (N.d.T: in inglese "build fortune" significa sia "far
  fortuna" che "compilare il programma fortune")
       ~/fortune# make all


       gcc -O2 -Wall -fomit-frame-pointer -pipe   -c fortune.c -o
       fortune.o
       fortune.c: In function `add_dir':
       fortune.c:551: structure has no member named `d_namlen'
       fortune.c:553: structure has no member named `d_namlen'
       make[1]: *** [fortune.o] Error 1
       make[1]: Leaving directory `/home/thegrendel/for/fortune/fortune'
       make: *** [fortune-bin] Error 2







  Guardando fortune.c, le linee pertinenti sono queste.



          if (dirent->d_namlen == 0)
                   continue;
               name = copy(dirent->d_name, dirent->d_namlen);




  Ci serve di trovare la struttura dirent, ma essa non  dichiarata nel
  file fortune.c, e nemmeno un grep dirent la mostra in nessuno dei file
  sorgenti. Tuttavia, all'inizio di fortune.c, c' la seguente linea.



       #include <dirent.h>




  Questo sembra essere un file include per la libreria di sistema,
  perci, il posto pi logico dove cercare dirent.h  in /usr/include.
  Effettivamente esiste un file dirent.h in /usr/include, ma quel file
  non contiene la dichiarazione della struttura dirent. C', per, un
  riferimento ad un altro file dirent.h.



       #include <linux/dirent.h>





  Alla fine, andando in /usr/include/linux/dirent.h, troviamo la
  dichiarazione della struttura che ci serve.










  struct dirent {
          long            d_ino;
          __kernel_off_t  d_off;
          unsigned short  d_reclen;
          char            d_name[256]; /* We must not include
  limits.h! */
  };




  Poco ma sicuro, la dichiarazione della struttura non contiene nessun
  d_namelen, ma ci sono un paio di "candidati" come suo equivalente. Il
  pi probabile di essi  d_reclen, poich questo membro della struttura
  probabilmente rappresenta la lunghezza di qualcosa ed  uno short
  integer. L'altra possibilit, d_ino, potrebbe essere un numero di
  inode, a giudicare dal suo nome e tipo. A quanto pare, stiamo
  probabilmente trattando con una struttura di "registrazione delle
  directory", e questi elementi rappresentano gli attributi di un file,
  il suo nome, il suo inode, e la sua lunghezza (in blocchi).  Ci
  sembrerebbe convalidare la nostra scelta.

  Editiamo il file fortune.c e cambiamo i due riferimenti alle linee 551
  e 553 da d_namelen a d_reclen. Proviamo di nuovo un make all.
  Successo. La compilazione finisce senza errori. Ora possiamo prenderci
  i nostri "brividi a buon mercato" da fortune.



  12.  Quarto esempio: Hearts


  Ecco il vecchio canuto gioco Hearts, scritto per i sistemi UNIX da Bob
  Ankeney negli anni '80, rivisto nel 1992 da Mike Yang, ed attualmente
  mantenuto da Jonathan Badger <mailto:badger@phylo.life.uiuc.edu>. Il
  suo predecessore era un ancor pi vecchio programma Pascal di Don
  Backus della Oregon Software, poi aggiornato da Jeff Hemmerling.
  Originariamente pensato come client per pi giocatori, funziona bene
  anche per un solo giocatore contro avversari gestiti dal computer. La
  grafica  bella, bench il gioco manchi di caratteristiche pi
  sofisticate e i giocatori computerizzati non siano molto forti.
  Nonostante tutto, sembra essere il solo Hearts decente disponibile per
  macchine UNIX e Linux ancora oggi.

  A causa della sua stirpe ed et, questo pacchetto  particolarmente
  difficile da compilare su di un sistema Linux.  Richiede la soluzione
  di una lunga e sconcertante serie di puzzle.   un esercizio di
  pazienza e determinazione.

  Prima di iniziare, accertatevi di avere le librerie motif o le lesstif
  installate.


  

  xmkmf

  make








  client.c: In function `read_card':
  client.c:430: `_tty' undeclared (first use in this function)
  client.c:430: (Each undeclared identifier is reported only once
  client.c:430: for each function it appears in.)
  client.c: In function `scan':
  client.c:685: `_tty' undeclared (first use in this function)
  make: *** [client.o] Error 1





  Questi sono i colpevoli nel file client.c:



       #ifndef SYSV
               (buf[2] != _tty.sg_erase) && (buf[2] != _tty.sg_kill)) {
        #else
               (buf[2] != CERASE) && (buf[2] != CKILL)) {
       #endif








  

     In client.c, aggiungiamo


       #define SYSV




  alla linea 39. Ci bypasser il riferimento a _tty.

  make



       client.c:41: sys/termio.h: No such file or directory
       make: *** [client.o] Error 1






  

  Il file include termio.h  nella directory /usr/include su di un
  sistema Linux, invece che nella /usr/include/sys, come era sulle
  vecchie macchine UNIX. Perci, cambiamo la linea 41 di client.c da


       #include <sys/termio.h>




  a
       #include <termio.h>




  make



       gcc -o hearts -g      -L/usr/X11R6/lib client.o hearts.o select.o connect.o
       sockio.o start_dist.o  -lcurses -ltermlib
       /usr/bin/ld: cannot open -ltermlib: No such file or directory
       collect2: ld returned 1 exit status
       make: *** [hearts] Error 1







  

  Le moderne distribuzioni Linux usano il database terminfo e/o termcap,
  piuttosto che l'obsoleto termlib.

  Editiamo il Makefile.

  Linea 655:


       CURSES_LIBRARIES = -lcurses -ltermlib




  cambiamola in:


       CURSES_LIBRARIES = -lcurses -ltermcap





  make



       gcc -o xmhearts -g      -L/usr/X11R6/lib xmclient.o hearts.o select.o
       connect.o sockio.o start_dist.o gfx.o  -lXm_s -lXt -lSM -lICE -lXext -lX11
       -lPW
       /usr/bin/ld: cannot open -lXm_s: No such file or directory
       collect2: ld returned 1 exit status







  

  La principale libreria lesstif  libXm, piuttosto che libXm_s. Quindi,
  editiamo il Makefile.

  Nella linea 653:


       XMLIB = -lXm_s $(XTOOLLIB) $(XLIB) -lPW




  cambia in:


       XMLIB = -lXm $(XTOOLLIB) $(XLIB) -lPW





  make



       gcc -o xmhearts -g      -L/usr/X11R6/lib xmclient.o hearts.o select.o
       connect.o sockio.o start_dist.o gfx.o  -lXm -lXt -lSM -lICE -lXext -lX11 -lPW
       /usr/bin/ld: cannot open -lPW: No such file or directory
       collect2: ld returned 1 exit status
       make: *** [xmhearts] Error 1







  

  Raduniamo i soliti sospetti.

  Non c' nessuna libreria PW. Editiamo il Makefile.

  Linea 653:


       XMLIB = -lXm $(XTOOLLIB) $(XLIB) -lPW




  cambia in:


       XMLIB = -lXm $(XTOOLLIB) $(XLIB) -lPEX5




  (La libreria PEX5  quella pi simile alla PW.)



  make






  rm -f xmhearts
  gcc -o xmhearts -g      -L/usr/X11R6/lib xmclient.o hearts.o select.o
  connect.o sockio.o start_dist.o gfx.o  -lXm -lXt -lSM -lICE -lXext -lX11 -lPEX5




  Il make finalmente funziona (hurra!)




  

  Installazione:

  Come root,



       [root@localhost hearts]# make install
       install -c -s  hearts /usr/X11R6/bin/hearts
       install -c -s  xmhearts /usr/X11R6/bin/xmhearts
       install -c -s  xawhearts /usr/X11R6/bin/xawhearts
       install in . done









  

  Esecuzione di prova:

  rehash

  (Stiamo eseguendo la shell tcsh.)

  xmhearts



       localhost:~/% xmhearts
       Can't invoke distributor!







  

  Dal file README nel pacchetto hearts:



            Put heartsd, hearts_dist, and hearts.instr in the HEARTSLIB
            directory defined in local.h and make them world-accessible.



  (Traducendo: Mettete Heartsd, hearts_dist, e hearts.instr nella direc
  tory HEARTSLIB definita in local.h e rendeteli accessibili a chiunque)


  Dal file local.h:



       /* where the distributor, dealer and instructions live */

       #define HEARTSLIB "/usr/local/lib/hearts"




  Questo  un classico caso: RTFM (leggete il fottuto manuale).


  Come root,

  cd /usr/local/lib

  mkdir hearts

  cd !$

  Copiamo i file di distributor in questa directory.

  cp /home/username/hearts/heartsd .

  cp /home/username/hearts/hearts_dist .

  cp /home/username/hearts/hearts.instr .




  

  Lanciamo un'altra esecuzione di prova.

  xmhearts

  Qualche volta funziona, ma il pi delle volte si pianta con un
  messaggio dealer died!.




  

  Il "distributor" e il "dealer" esaminano le porte hardware. Dovremmo
  perci sospettare che quei programmi abbiano bisogno dei privilegi di
  root.

  Proviamo, come root,

  chmod u+s /usr/local/lib/heartsd

  chmod u+s /usr/local/lib/hearts_dist

  (Osserviamo che, come discusso precedentemente, i binari suid possono
  creare dei buchi di sicurezza.)

  xmhearts

  Alla fine funziona!


  Hearts  disponibile da Sunsite.



  13.  Quinto esempio: XmDipmon




       Bullwinkle: Hey Rocky, guarda, tiro fuori un coniglio dal cappello.
       Rocky:      Ma quel trucco non funziona mai.
       Bullwinkle: Questa volta s.
                   Voil!
                   Beh, ci sono andato vicino.
       Rocky:      Ed ora  il momento di un altro effetto speciale.
                   --- "Rocky e i suoi amici"




  XmDipmon  un'elegante applicazioncina che mostra un bottone indicante
  lo stato di una connessione Internet. Lampeggia e suona quando la
  connessione si interrompe, come troppo spesso accade nelle linee
  telefoniche di campagna. Sfortunatamente XmDipmon funziona solo con
  dip, il che lo rende inutile per tutti quelli, la maggioranza, che
  usano chat per collegarsi.

  Compilare XmDipmon non  un problema. XmDipmon si linka con le
  librerie Motif, ma pu essere compilato, e funziona bene, anche con le
  Lesstif. La sfida  di modificare il pacchetto per farlo funzionare
  con chat. Ci in pratica richiede di armeggiare con il codice sorgente
  ed  quindi necessario avere delle conoscenze di programmazione.





               "Quando xmdipmon parte, cerca un file chiamato /etc/dip.pid
                (potete fargli cercare un altro file usando l'opzione -pidfile
                dalla riga di comando). Tale file contiente il PID del demone
                dip (dip stesso si pone in modo demone, dopo che ha stabilito
                una connessione)."
                              --- dal file README di XmDipmon






  Usando l'opzione -pidfile, il programma pu essere indotto, al suo
  avvio, a cercare un altro file, uno che esista solo dopo che un login
  con chat  stato effettuato con successo.  Il candidato pi ovvio  il
  file di lock del modem. Potremmo quindi provare a lanciare il
  programma con xmdipmon -pidfile /var/lock/LCK..ttyS3 (assumendo che il
  modem sia sulla porta com numero 4, ttyS3). Comunque cos si risolve
  solo una parte del problema. Il programma osserva continuamente il
  demone dip e dobbiamo invece fare in modo che controlli un processo
  che sia associato a chat o a ppp.

  C' un solo file sorgente e fortunatamente  ben commentato.
  Scorrendo il file xmdipmon.c troviamo la funzione getProcFile, la cui
  descrizione, all'inizio, riporta quanto segue:

       /*****
       * Name:                 getProcFile
       * Return Type:  Boolean
       * Description:  tries to open the /proc entry as read from the dip pid file.
       <snip>
       *****/




  (Traducendo la descrizione: prova ad aprire l'elemento di /proc
  secondo quanto letto dal file pid di dip)

  Siamo sulla pista giusta. Guardando nel corpo della funzione...



                               /* we watch the status of the real dip deamon */
                               sprintf(buf, "/proc/%i/status", pid);
                               procfile = (String)XtMalloc(strlen(buf)*sizeof(char)+1);
                               strcpy(procfile, buf);
                               procfile[strlen(buf)] = '\0';




  Il colpevole  la linea 2383:


                               sprintf(buf, "/proc/%i/status", pid);
                                             ^^^^^^^^^^^^^^^^^^^^^




  Questo controlla se il processo demone dip  in esecuzione. Quindi,
  come possiamo cambiarlo in modo che controlli il demone pppd?

  Guardando sulla pagina di manuale di pppd:


       FILES
            /var/run/pppn.pid (BSD o Linux), /etc/ppp/pppn.pid (altri)
                  Identificatore del processo (Process-ID) di pppd sull'unit
                  d'interfaccia n di ppp.




  Cambiamo la linea 2383 di xmdipmon.c in:


                               sprintf(buf, "/var/run/ppp0.pid" );




  Ricompiliamo il pacchetto cos modificato. Nessun problema con la
  compilazione. Ora proviamolo con il nuovo argomento della riga di
  comando.  Funziona che  un incanto. Il bottoncino blu indica quando 
  stata stabilita una connessione ppp con l'ISP e lampeggia e suona
  quando la connessione si interrompe. Ora abbiamo un monitor per chat
  pienamente funzionante.



  XmDipmon pu essere scaricato da Ripley Linux Tools.




  14.  Dove trovare archivi sorgente

  Ora che siete ansiosi di usare le conoscenze appena acquisite, per
  aggiungere delle utilit ed altre chicche al vostro sistema, potete
  trovarle online alla Linux Applications and Utilities Page
  <http://www.redhat.com/linux-info/linux-app-list/linapps.html>, o in
  una delle raccolte su CD ROM, a prezzo molto ragionevole, di Red Hat
  <http://www.redhat.com/>, InfoMagic <http://www.infomagic.com>, Linux
  Systems Labs <http://www.lsl.com>, Cheap Bytes
  <http://www.cheapbytes.com>, e altri.


  Un vasto magazzino di codice sorgente  comp sources UNIX archive.

  Molto codice sorgente UNIX viene pubblicato nel newsgroup alt.sources.
  Se state cercando particolari pacchetti di codice sorgente, potete
  chiedere sullo specifico newsgroup alt.sources.wanted.  Un altro buon
  posto dove cercare  il newsgroup comp.os.linux.announce.  Per entrare
  nella mailing list Unix sources, mandate alla stessa un messaggio
  subscribe.

  Gli archivi del newsgroup alt.sources si trovano presso i seguenti
  siti ftp:


    ftp.sterling.com/usenet/alt.sources/

    wuarchive.wustl.edu/usenet/alt.sources/articles

    src.doc.ic.ac.uk/usenet/alt.sources/articles




  15.  Conclusioni

  Riassumendo, la perseveranza fa tutta la differenza (e un'alta soglia
  alla frustrazione certamente aiuta). Come in tutti gli sforzi,
  imparare dagli errori  criticamente importante. Ogni passo falso,
  ogni fallimento, contribuisce alla costruzione della conoscenza che
  conduce alla padronanza dell'arte della compilazione del software.



  16.  Riferimenti e ulteriori letture
















  BORLAND C++ TOOLS AND UTILITIES GUIDE, Borland International, 1992,
  pp. 9-42.
  [Uno dei manuali distribuiti col Borland C++, ver. 3.1. D una
  abbastanza buona introduzione alla sintassi e ai concetti di make,
  usando l'implementazione limitata al DOS della Borland.]

  DuBois, Paul: SOFTWARE PORTABILITY WITH IMAKE, O'Reilly and Associates,
  1996, ISBN 1-56592-226-3.
  [ ritenuto il riferimento definitivo per imake, sebbene non lo
  avevo a disposizione durante la scrittura di questo articolo.]

  Frisch, Aeleen: ESSENTIAL SYSTEM ADMINISTRATION (2nd ed.), O'Reilly and
  Associates, 1995, ISBN 1-56592-127-5.
  [Questo, altrimenti ottimo, manuale per amministratori di sistema tratta
  solo in modo sommario la compilazione del software.]

  Hekman, Jessica: LINUX IN A NUTSHELL, O'Reilly and Associates, 1997, ISBN
  1-56592-167-4.
  [Un buon riferimento globale ai comandi di Linux.]

  Lehey, Greg: PORTING UNIX SOFTWARE, O'Reilly and Associates, 1995, ISBN
  1-56592-126-7.

  Mayer, Herbert G.: ADVANCED C PROGRAMMING ON THE IBM PC, Windcrest Books,
  1989, ISBN 0-8306-9363-7.
  [Un libro zeppo di idee per programmatori C medi ed esperti. Superba
  trattazione degli algoritmi, ricercatezza di linguaggio e anche
  divertimento. Sfortunatamente non viene pi stampato.]

  Mui, Linda and Valerie Quercia: X USER TOOLS, O'Reilly and Associates,
  1994, ISBN 1-56592-019-8, pp. 734-760.

  Oram, Andrew and Steve Talbott: MANAGING PROJECTS WITH MAKE, O'Reilly
  and Associates, 1991, ISBN 0-937175-90-0.

  Peek, Jerry and Tim O'Reilly and Mike Loukides: UNIX POWER TOOLS,
  O'Reilly and Associates / Random House, 1997, ISBN 1-56592-260-3.
  [Una meravigliosa fonte di idee, e tonnellate di utilit che potete
  compilare dal codice sorgente, usando i metodi discussi in questo
  articolo.]

  Stallman, Richard M. and Roland McGrath: GNU MAKE, Free Software
  Foundation, 1995, ISBN 1-882114-78-7.
  [Da leggere]

  Waite, Mitchell, Stephen Prata, and Donald Martin: C PRIMER PLUS, Waite Group
  Press, ISBN 0-672-22090-3,.
  [Probabilmente la miglior introduzione alla programmazione in C. Vasta
  copertura per un "primo libro". Sono ora disponibili nuove edizioni.]

  Welsh, Matt and Lar Kaufman: RUNNING LINUX, O'Reilly and Associates,
  1996, ISBN 1-56592-151-8.
  [Tuttora il miglior riferimento globale per Linux, sebbene manchi
  di profondit in alcune aree.]


  Le pagine di manuale di dpkg, gcc, gzip, imake, ldconfig, ldd, make, nm,
  patch, rpm, shar, strip, tar, termcap, terminfo, e xmkmf.


  Il BZIP2 HOWTO (tradotto), di David Fetter.

  Il Glibc2 HOWTO (tradotto), di Eric Green

  Il LINUX ELF HOWTO (tradotto), di Daniel Barlow.

  L'RPM HOWTO, di Donnie Barnes.

  Lo StarOffice miniHOWTO, di Matthew Borowski.




  [Questi HOWTO dovrebbero trovarsi nella directory /usr/doc/HOWTO o
  nella /usr/doc/HOWTO/mini sul vostro sistema. Versioni aggiornate sono
  disponibili in formato testo, HTML e SGML nel sito LDP
  <http://metalab.unc.edu/LDP/HOWTO>, e di solito nei siti dei
  rispettivi autori.]


  __________________

  Traduzioni: Per la versione in italiano degli HOWTO con l'indicazione
  "(tradotto)" vedere: www.pluto.linux.it/ildp/HOWTO/HOWTO-INDEX-3.html.
  Per altra documentazione su Linux in italiano, compresi eventuali
  HOWTO e/o mini-HOWTO citati ma al momento non ancora tradotti, si veda
  il sito ILDP <http://www.pluto.linux.it/ildp/index.html>.



  17.  Crediti


  L'autore di questo HOWTO desidera ringraziare le seguenti persone per
  gli utili suggerimenti, le correzioni e l'incoraggiamento.


    R. Brock Lynn

    Michael Jenner

    Fabrizio Stefani

  Gloria va anche a quelle brave persone che hanno tradotto questo HOWTO
  in italiano e giapponese.

  E naturalmente, ringraziamenti, lodi, benedizioni e osanna a Greg
  Hankins e Tim Bynum del Linux Documentation Project
  <http://metalab.unc.edu/LDP/>.