Εγκατάσταση λογισμικού από πηγαίο κώδικα στο Unix / Linux

Προσαρμογή από το εγχειρίδιο 'UNIX Tutorial for Beginners' 

M. Stonebank http://www.ee.surrey.ac.uk/Teaching/Unix/

Κ.Γ. Μαργαρίτης

1 Εισαγωγή   

Υπάρχουν πολλά λογισμικά τα οποία διατίθενται μέσω του Διαδικτύου ή σε CD και είναι διαθέσιμα για εγκατάσταση σε περιβάλλον Unix/Linux. Εδώ θεωρούμε οτι αναφερόμαστε σε ελεύθερο λογισμικό ή λογισμικό ανοικτού κώδικα. Σε περίπτωση που δεν είστε σίγουροι για την αδειοδότηση του λογισμικού τότε θα πρέπει να το εξετάσετε πριν από την εγκατάσταση. 

Ανάλογα με τα δικαιώματα που έχουμε σε ένα συγκεκριμένο σύστημα (δηλαδή αν είμαστε προσκεκλημένος, απλός χρήστης ή διαχειριστής) μπορούμε να εγκαταστήσουμε λογισμικό είτε καθόλου, είτε μόνο στο προσωπικό μας κατάλογο είτε στους καταλόγους του συστήματος. Λογισμικά που εγκαθίστανται στους καταλόγους του συστήματος είναι τυπικά διαθέσιμα προς εκτέλεση σε όλους τους χρήστες. Λογισμικά που εγκαθίστανται σε προσωπικούς καταλόγους μπορεί να γίνουν διαθέσμια σε άλλους χρήστες με τροποποίηση των αδειών πρόσβασης των αντίστοιχων αρχείων.

Τα λογισμικά συνήθως διατίθενται σε δύο μορφές. Η πιο συνηθισμένη μορφή είναι λογισμικά έτοιμα προς εγκατάσταση σε συγκεκριμένη αρχιετκτονική ή / και διανομή ή / και έκδοση του Linux (π.χ για Ubuntu Linux 6.06 LTS για 32bit επεξεργαστή Intel). Αυτή είναι η ευχερέστερη περίπτωση και η επιδίωξή μας είναι κατ' αρχήν να εντοπίσουμε μια τέτοια μορφή του λογισμικού που μας ενδιαφέρει. Oι μεγάλες διανομές Linux διατηρούν ειδικές αρχειοθήκες (repositories) που οργανώνουν το διαθέσιμο γι'αυτές λογισμικό. 

Επίσης διαθέτουν και ειδικά λογισμικά ή και περιβάλλοντα που αυτοματοποιούν όλα τα στάδια εγκατάστασης, τους λεγόμενους διαχειριστές πακέτων (package managers). Τέτοιοι διαχειριστές είναι διαθέσιμοι τόσο σε μορφή εντολών (command line) αλλά και σε μορφή γραφικών διεπαφών, κυρίως μέσω των γνωστών διαχειριστών παραθύρων (window managers) Gnome και KDE. 

Σε περίπτωση που το λογισμικό που αναζητούμε δεν βρίσκεται στα επίσημα repositories της διανομής Linux που χρησιμοποιούμε, τότε αναζητούμε το λογισμικό στο διαδίκτυο είτε απευθυνόμενοι στις ευρύτατα γνωστές ιστοθέσεις (όπως για παράδειγμα το sourceforge) ή απλά αναζητούμε στις γνωστές μηχανές αναζήτησης (όπως το Google). Και πάλι αναζητούμε κατ' αρχήν μια έκδοση προετοιμασμένη ειδικά για την διανομή που μας ενδιαφέρει. Επιπλέον υπάρχει και η δυνατότητα της κατα-παραγγελία προετοιμασίας λογισμικού.

Με τη πάροδο του χρόνου και τη διαρκώς εξελισσόμενη αυτοματοποίηση των δημοφιλών εκδόσεων του Linux, οι δυσκολίες εγκατάστασης λογισμικού συνεχώς λιγοστεύουν. Για παράδειγμα ο οδηγός στην ιστοθέση http://www.monkeyblog.org/ubuntu/installing/ δίνει πληροφορίες εγκατάστασης για οτιδήποτε λογισμικό σε Ubuntu 6.06 LTS (Ελληνική μετάφραση στο pdplab.it.uom.gr/teaching/linux/).

Παρακάτω εξετάζουμε τη περίπτωση που το λογισμικό δεν βρέθηκε σε μορφή έτοιμη προς εγκατάσταση για τη διανομή μας. Τα βήματα που ακολουθούμε για την εγκατάσταση λογισμικού σε αυτή τη περίπτωση είναι τα εξής.

Από τα παραπάνω βήματα, συνήθως το πιο δύσκολο είναι αυτό της μεταγλώττισης. 

Μεταγλώττιση του πηγαίου κώδικα

Συνήθως ο πηγαίος κώδικας του προς εγκατάσταση λογισμικού είναι σε γλώσσα C και βρίσκεται σε μια σειρά αρχείων που απαιτούν σύνθετη μεταγλώττιση με συγκεκριμένη σειρά (separate comilation). Στις αντικειμενοστραφείς γλώσσες (όπως C++, Java) τα πράγματα είναι κάπως πιο έυκολα στη σύνθετη μεταγλώττιση, με τη χρήση των projects και packages. Η μεταγλώττιση περιλαμβάνει την παραγωγή ενδιάμεσου κώδικα (object code) ανά αρχείο, την σύνδεση (linking) των ενδιαμέσων κωδίκων όλων των αρχείων, και στη συνέχεια τη σύνδεση με τις προεγκατεστημένες βιβλιοθήκες της γλώσσας (code libraries) για τη παραγωγή του τελικού εκτελέσιμου.

Τα βήματα αυτά διευκολύνονται με τη χρήση μιας σειράς εργαλείων συστήματος που αναπτύχθηκαν γι' αυτό το σκοπό.

Η εντολή make και το Makefile

Η εντολή make επιτρέπει τη διαχείριση της σύνθετης μεταγλώττισης με το χωρισμό ενός κώδικα σε επιμέρους αρχεία και έτσι βοηθά στην ανάπτυξη μεγάλων προγραμμάτων. Μπορεί να ελέγχει ποιά τμήματα του προγράματος έχουν μεταβληθεί, να μεταφράζει μόνο εκείνα και να ανασυνθέτει το συνολικό πρόγραμμα, χρησιμοποιώντας κάθε φορά τις πιο πρόσφατες μεταφράσεις. 

Η εντολή make λαμβάνει πληροφορίες και οδηγίες από ένα αρχείο κειμένου που λέγεται Makefile και βρίσκεται στον ίδιο κατάλογο με τα αρχεία του πηγαίου κώδικα. Περιλαμβάνει πληροφορίες μεταγλώττισης, όπως για παράδειγμα το επίπεδο βελτιστοποίησης (optimization) της μεταγλώττισης ή την ένθεση πληροφοριών εκσφαλμάτωσης (debugging). Επίσης περιλαμβάνει πληροφορίες για τα ονόματα διαδρομής που θα εγκατασταθούν τα τελικά εκτελέσιμα (binaries), οι σελίδες εγχειριδίου και τεκμηρίωσης (manual / documentation pages), τα αρχεία δεδομένων, πού θα βρεθούν οι εξαρτήσεις (dependencies) δηλαδή βιβλιοθήκες (libraries)και άλλα απαραίτητα προγράμματα ή αρχεία διαμορφωσης (configuration files) κλπ.

Αρκετές φορές απαιτείται η τροποποίηση του Makefile από τον χρήστη έτσι ώστε να ενημερωθούν τα ονόματα διαδρομής με βάση το συγκεκριμένο σύστημα, καθώς και άλλες παράμετροι. Πάντοτε κρατούμε ένα αντίγραφο ασφελείας του αρχικού Makefile. Ευτυχώς, πολλά λογισμικά αυτο-ρυθμίζονται με τη βοήθεια του σεναρίου κελύφους (shell script) GNU configure.

To script configure

Με την συνεχή άυξηση των εκδόσεων και διανομών Unix / Linux, η σύνθεση μεταγλώττιση προγραμμάτων γινόταv όλο και πιο περίπλοκη αφού έπερε να ληφθούν υπ' όψη περισσότερες εναλλακτικές. Επι πλέον οι διανομές και οι εκδόσεις μεταβάλουν διάφορα χαρακτηριστικά και αυτό σημαίνει αλλαγές στις πληροφορίες μεταγλώττισης. Το σύστημα GNU configure and build απλοποιεί την σύνθεση του λογισμικού που διατίθεται σε μορφή πηγαλιου κώδικα. Όλα τα προγράμματα συντίθενται με τη βοήθεια μιας απλής τυποποιημένης διαδικασίας δύο σταδίων. Δεν απαιτείται η επιπλέον εγκατάσταση νέων εργαλείων λογισμικού.

Το σενάριο κελύφους configure μεταφορτώνεται μαζί με το προς εγκατάσταση λογισμικό και προσπαθεί να αναγνωρίσει το σύστημά μας και να διαμορφώσει τις σωστές τιμές για τις παραμέτρους του Makefile που εξαρτώνται από το σύστημα. Έτσι παράγει ενα δικό του Makefile σε κάθε υπο-κατάλογο του προς εγκατάσταση λογισμικού.

Ο απλουστερος τρόπος σύνθετης μεταγλώττισης είναι ο εξής:

  1. Μεταφερόμαστε με cd στον iκατάλογο που βρίσκεται ο πηγαίος κώδικας.
  2. Στη γραμμή εντολών γράφουμε  ./configure για να γίνει η διαμόρφωση του Makefile.
  3. Γράφουμε  make για την εκτέλεση της σύνθετης μεταγλώττισης.
  4. Προαιρετικά, γράφουμε make check για να εκτελεστούν πιθανοί αυτο-έλεγχοι του λογισμικού.
  5. Γράφουμε make install για την εγκατάσταση του λογισμικού, των αρχέιων δεδομένων και της τεκμηρίωσης. 
  6. Προαιρετικά, γράφουμε make clean για την απομάκρυνση των περιττών αρχείων.

Το configure υποστηρίζει ένα μεγάλο φάσμα επιλογών. Συνήθως μπορούμε να χρησιμοποιήσουμε την επιλογή  configure --help για να ελέγξουμε τις δυνατότητες του συγκεκριμένου σεναρίου. Το GNU project παρέχει τα εργαλεία automake και autoconf που επιτρέπουν στους συγγραφείς λογισμικού την αυτόματη παραγωγή αρχείων Makefile και σεναρίων configure. 

Πιθανότατα οι μόνες επιλογές που θα χρησιμοποιήσετε είναι οι --prefix και --exec-prefix. Αυτές χρησιμοποιούνται για τον καθορισμό των καταλόγων εγκατάστασης.

Ο κατάλογος που δίνεται μετά την επιλογή --prefix θα αποθηκεύσει τα αρχεία που είναι ανεξάρτητα από το σύστημα.

Ο κατάλογος που δίνεται μετά την επιλογή --exec-prefix (και συνήθως είναι υπο-κατάλογος του --prefix καταλόγου) θα αποηθκεύσει τα αρχεία που εξαρτώνται από το σύστημα, όπως τα εκτελέσιμα.

2 Μεταφόρτωση πηγαίου κώδικα

Ως παράδειγμα θα μεταφορτώσουμε ένα λογισμικό που κάνει μετατροπές μεταξύ διαφόρων μονάδων μέτρησης από το πανεπιστήμιο Cornell.

Πρώτα δημιουργούμε ένα κατάλογο μεταφόρτωσης. 

mkdir download

Μεταφορτώνουμε το λογισμικό και το αποθηκεύουμε στον κατάλογο που δημιουργήσαμε.

3 Αποσυμπίεση του πηγαίου κώδικα  

Μεταφερόμαστε στον κατάλογο download και ελέγχουμε τα περιεχόμενά του.

    cd download
    ls -l

Το όνομα του μοναδικού αρχείου καταλήγει σε tar.gz. Η εντολή tar αρχειοθετεί έναν κατάλογο με υπο-καταλόγους και αρχεία σε ενιαία αρχειοθήκη (tar file.) Στην συνέχεια η αρχειοθήκη έχει συμπιεστεί με την εντολή gzip (tar.gz file). 

Σε περίπτωση που συναντήσετε άλλη μέθοδο συμπίεσης ή αρχειθέτησης μπορείτε να συμβουλευτείτε τον window/file manager που χρησιμοποιείτε με τη διανομής σας. Επίσης μπορείτε να αναζητήσετε οδηγίες στο σημείο μεταφόρτωσης.

Πρώτα αποσυμπιέζουμε με την εντολή gunzip. Αυτή δημιουργεί ένα αρχείο .tar. 

    gunzip units-1.74.tar.gz

Στη συνέχεια εξάγουμε τα αρχεία του λογισμικού με τη δομή καταλόγων τους με τη βοήθεια της εντολής tar.

    tar -xvf units-1.74.tar

Ελέγχουμε τα περιεχόμενα του καταλόγου download, και μεταφερόμαστε στον υπο-κατάλογο units-1.74

    cd units-1.74

4 Configure και Makefile  

Πρώτα διαβάζουμε προσεκτικά τα αρχεία κειμένου README και INSTALL (με την εντολή more ή less). Συνήθως σε κάθε πακέτο λογισμικού υπάρχουν κάποια αρχεία κειμένου με αυτά άλλα παρεμφερή ονόματα που δίνουν σχετικές πληροφορίες. Οι βιαστικοί συνήθως δεν διαβάζουν αυτά τα κείμενα και στη συνέχεια μπλέκουν σε περιπέτειες..

Το λογισμικό χρησιμοποιεία το GNU configure για τη σύνθετη μεταγλώττιση του πηγαίου κώδικα. Με τη βοήθεια της more ή less μπορείτε να δείτε τα σενάρια κελύφους και τα αρχεία διαμόρφωσης, όπως τα configure, configure.in, Makefile.in, Makefile.dos κλπ.

Αν δεν ορίσουμε κατάλογο εγκατάστασης το configure θα προσπαθήσει να εγκαταστήσει το λογισμικό στους καταλόγους του συστήματος. Αν δεν έχουμε τα κατάλληλα δικαιώματα διαχειριστή, ή αν θέλουμε να εγκαταστήσουμε το λογισμικό σε προσωπικό μας κατάλογο, τότε πρέπει να ορίσουμε ένα κατάλογο εγκατάστασης.

    mkdir ~/units174

Στη συνέχεια εκτελούμε το configure δίνοντας τον κατάλογο εγκατάστασης. 

     ./configure --prefix=$HOME/units174

Σημείωση: Η μεταβλητή περιβάλλοντος $HOME δίνει το όνομα διαδρομής του οικείου σας καταλόγου. Εσείς μπορείτε απλά να την αντικαταστήσετε με το όνομα διαδρομής του οικείου σας καταλόγου ή με το ~.

Αν το configure εκτελεστεί κανονικά θα δημιουργήσει το Makefile με όλες τις σωστές επιλογές. Μπορείτε να ελέγξετε τα περιεχόμενα του Makefile με την εντολή more ή less και να συγκρίνετε με τα αρχικά διαθέσιμα αρχεία. 

5 Μεταγλώττιση και εγκατάσταση του λογισμικού

Τώρα μπορούμε να προχωρήσουμε στη σύνθετη μεταγλώττιση του πηγαίου κώδικα εκτελώντας την εντολή make. 

    make

Μετά από λίγη ώρα και αρκετά μηνύματα, τα εκτελέσιμα αρχεία έχουν δημιουργηθεί. Μπορείτε να ελέγξετε τη λειτουργία τους με την εντολή

    make check

Αν όλα είναι εντάξει, προχωρούμε στην εγκατάσταση.  

    make install

Τα αρχεία θα εγκαταστασθούν στον κατάλογο ~/units174 που δημιουργήσαμε.

6 Εκτέλεση του λογισμικού

Αν όλα πήγαν καλά μπορούμε να εκτελέσουμε το λογισμικό. Πρώτα μεταφερόμαστε στον κατάλογο εγκατάστασης. 

    cd ~/units174

Ο κατάλογος περιέχει τους παρακάτω υπο-καταλόγους.

bin Τα εκτελέσιμα (binarιes)
info Τεκμηρίωση έτοιμη για χρήση με το GNU info
man Σελίδες εγχειριδίου man
share Μοιραζόμενα αρχεία δεδομένων

Για την εκτέλεση μεταφερόμαστε στον υπο-κατάλογο bin και γράφουμε

    ./units

Για παράδειγμα μετατρέπουμε 6 πόδια σε μέτρα. 

You have: 6 feet
You want: metres 

* 1.8288

Αν πάρετε σαν απάντηση το 1.8288, τότε συγχαρητήρια!

Για να δούμε ποιές μετατροπές μπορούν να γίνουν μπορούμε να ελέγξουμε το αρχείο units.dat στον κατάλογο share.

Η τεκμηρίωση υπάρχει σε δύο μορφές. Στον υπο-κατάλογο man υπάρχει τεκμηρίωση που θα μπορούσε να ενσωματωθεί στον man του Unix εάν κάνουμε 'κεντρική' εγκατάσταση ως διαχειριστές συστήματος. Αντίστοιχα στον υπο-κατάλογο info έχουμε τεκμηρίωση σε μορφή κατανοητή για το GNU info. Αυτή μπορεί να διαβαστεί αν μεταφερθούμε στον υποκατάλογο info και γράψουμε

    info --file=units.info

7 Απομάκρυνση περιττού κώδικα

Συνήθως στη φάση ανάπτυξης ενός λογισμικού, οι προγραμματιστές προσθέτουν πληροφορίες εκσφαλμάτωσης που περιλαμβάνονται στο εκτελέσιμο. Με αυτό τον τρόπο μπορούν να ελέγξουν την λειτιυργία του λογισμικού με τη βοήθεια κάποιου ειδικού περιβάλλοντος παρακολούθησης. 

Αυτή η πληροφορία είναι περιττή για τον τελικό χρήστη. Θεωρούμε οτι ως τελικοί χρήστες δεν είναι πιθανό να ασχοληθούμε με τη διόρθωση ενός προγράμματος που είναι πια έτοιμο και διατίθεται δημόσια προς χρήση. Παρ' όλα αυτά, αρκετές φορές όταν εκτελούμε τη διαδικασία της σύνθετης μεταγλώττισης του πηγαίου κώδικα, είναι πιθανό να περιλαμβάνουμε και τις πληροφορίες εκσφαλμάτωσης. Μπορούμε να δοκιμάσουμε να απομακρύνουμε αυτή τη πληροφορία από το τελικό εκτελέσιμο πρόγραμμα. Έτσι το μέγεθος του εκτελέσιμου κώδικα θα είναι μικρότερο και η εκτέλεση λίγο ταχύτερη.

Κατ' αρχή θα διαπιστώσουμε το μέγεθος του εκτελέσιμου πριν και μετά την απομάκρυνση του περιττού κώδικα. Πρώτα μεταφερόμαστε στον υπο-κατάλογο bin του καταλόγου εγκατάστασης. 

    cd ~/units174/bin
    ls -l

Βλέπουμε οτι το μέγεθος του αρχείου είναι πάνω από 100 kbytes. Μπορούμε να πάρουμε περισσότερες πληροφορίες για τον τύπο του αρχείου με την εντολή file

    file units

units: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.0, dynamically linked (uses shared libs), for GNU/Linux 2.2.0, not stripped

Για να απομακρύνουμε τον περιττό κώδικα χρησιμοποιούμε τη εντολή strip.

    strip units
    ls -l

Όπως βλέπουμε το μέγεθος του αρχείου είναι λίγο πάνω από 30 kbytes - το ένα τρίτο του αρχικού μεγέθους. Τα δύο τρίτα ήταν πληροφορίες εκσφαλμάτωσης!

Ελέγχουμε τις πληροφορίες του αρχείου πάλι. 

    file units

units: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.0, dynamically linked (uses shared libs), for GNU/Linux 2.2.0, stripped

Μερικές φορές είναι δυνατό να χρησιμοποιήσουμε την εντολή make για την απευθείας εγκατάσταση 'καθαρισμένου' εκτελέσιμου προγράμματος. Αντί να γράψουμε  make install, μπορούμε να γράψουμε make install-strip.

8 Παρατηρήσεις

Παρατήρηση 1: ΠΡΟΣΟΧΗ! Αν βρίσκεστε σε νέα εγκατάσταση Ubuntu και δεν έχετε κάνει άλλη φορά εγκατάσταση απο αρχεία tarbals (τύπου tar.gz ) πρέπει πρώτα να εγκαταστήσετε τα απαραίτητα εργαλεία (compilers, make utility) με τη εντολή:

    sudo apt-get install build-essential

Παρατήρηση 2:
Στις προηγούμενες παραγράφους υποτίθεται οτι κάνουμε εγκατάσταση ως απλός χρήστης, δηλαδή σε περιοχή του συστήματος που έχουμε δικαιώματα εγγραφής. Στη γενική περίπτωση, ή όταν κάνουμε εγκατάσταση ως διαχειριστής στο Ubuntu τότε στις εντολές που σχετίζονται με την εγκατάσταση προφανώς θα πρέπει να γίνεται χρήση του sudo.

Παρατήρηση 3: Αν στο διαχειριστή πακέτων Synaptic του Ubuntu βρείτε κάποια πακέτα με το ίδιο όνομα με αυτά που θέλετε να εγκαταστήσετε αλλά  με επάκταση -dev, τότε εγκαταστήστε πρώτα αυτά τα πακέτα. Είναι πακέτα ανάπτυξης που είναι χρήσιμα στη μεταγλώττιση. 

Παρατήρηση 4: Για την απομάκρυνση των προσωρινών αρχείων (αν υπάρχουν) δοκιμάζουμε

    make clean

Για την απεγκατάσταση δοκιμάζουμε

    make uninstall

Αυτές οι δύο επιλογές δεν δουλεύουν πάντα, εξαρτάται από τους προγραμματιστές του πακέτου αν τις έχουν ενεργοπιήσει.

Παρατήρηση 5: Χρήση Checkinstall. Αν θέλετε μια πιο ελεγχόμενη εγκατάσταση με ενημέρωση του διαχειριστή πακέτων Synaptic του Ubuntu, τότε πρώτα πρέπει πρώτα να εγκαταστήσετε το πακέτο checkinstall. Αυτό γίνεται με  την εντολή

    sudo apt-get install checkinstall

Στη συνέχεια, επιστρέφοντας στη παράγραφο 5, αφού τελειώσουμε με το make, αντί να εκτελέσουμε το make install εκτελούμε

   sudo -d checkinstall make install

Αυτή η εντολή δημιουργεί αρχεία πακέτου λογισμικού τύπου .dev, τα οποία μπορούμε να διαχειριστούμε κανονικά από τον διαχειριστή πακέτων Synaptic. Για περισσότερες πληροφορίες δείτε το

    info checkinstall

 ή την ιστοσελίδα http://www.falkotimme.com/howtos/checkinstall/index.php.