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/>.
|