Πως κάνω compile μια εφαρμογή από τον κώδικά της;

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

Κάποια στιγμή όμως θα χρειαστεί να κάνετε build (ή compile, όπως λέγεται αλλιώς) μια εφαρμογή, δηλαδή να τη μεταγλωττίσετε, από τον πηγαίο κώδικά της. O κώδικας μιας εφαρμογής Linux βρίσκεται συνήθως σε συμπιεσμένα αρχεία που έχουν κατάληξη .tar.bz2 ή .tar.gz, π.χ. wine-049.tar.gz. Αυτά τα αρχεία λέγονται γενικά tarballs.

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

Έστω λοιπόν ότι έχετε το tarball (το συμπιεσμένο αρχείο με τον κώδικα) μιας εφαρμογής π.χ. το foo-1.2.3.tar.gz, στo home φάκελό σας (το προσωπικό κατάλογο σας στο Linux) Ανοίξτε μια κονσόλα (ALT+F2 > konsole ή terminal) και στο νέο παράθυρο γράψτε:

cd ~

για να πάτε στο φάκελο όπου βρίσκεται το foo-1.2.3.tar.gz. Tώρα, πρέπει να αποσυμπιέσετε το tarball με μία από τις παρακάτω εντολές (ανάλογα με την κατάληξη του αρχείου):

tar xvzf foo-1.2.3.tar.gz

ή

tar xvjf foo-1.2.3.tar.bz2

Ο κώδικας αποσυμπιέζεται συνήθως σε ένα νέο φάκελο που έχει παρόμοιο όνομα με το όνομα του συμπιεσμένου tarball. Τότε μπαίνετε στο νέο φάκελο με:

cd foo-1.2.3

Εκεί βρείτε τα αρχεία README ή INSTALL και ρίξτε τους μια ματιά, επειδή συνήθως περιέχουν χρήσιμες πληροφορίες και οδηγίες. Μετά πρέπει, συνήθως, να δώσετε τη λεγόμενη "αγία τριάδα" των εντολών μεταγλώττισης (διαβάστε παρακάτω για επεξήγηση):

./configure
make
su -c 'make install' ή sudo make install (στο Ubuntu)

Χοντρικά, η πρώτη εντολή ελέγχει το σύστημα και επιβεβαιώνει ότι έχετε τις απαραίτητες βιβλιοθήκες και εφαρμογές (οι λεγόμενες εξαρτήσεις) από τις οποίες εξαρτάται το νέο πρόγραμμα. Εάν έχετε διανομή συμβατή με RPM και παραπονεθεί ότι δεν έχετε μια βιβλιοθήκη (ενώ την έχετε), στην πραγματικότητα εννοεί ότι πρέπει να εγκαταστήσετε το πακέτο της με κατάληξη -devel, π.χ. libbar-devel. Στις Debian διανομές, τα πακέτα των βιβλιοθηκών έχουν κατάληξη -dev.

Η δεύτερη εντολή κάνει όλη τη 'δουλειά' μεταγλωττίζοντας τον κώδικα και δημιουργώντας εκτελέσιμα αρχεία στον ίδιο φάκελο. Δεν είναι απαραίτητο να είστε root για τη μεταγλώττιση, αλλά είναι απαραίτητο να είστε root για την τρίτη εντολή που μεταφέρει τα εκτελέσιμα αρχεία στους φακέλους του συστήματος. Γι' αυτό στην τρίτη εντολή δίνουμε πρώτα su -c , ώστε η εντολή που ακολουθεί να τρέξει με προνόμια υπερχρήστη. Εξαίρεση είναι το Ubuntu όπου πρέπει να χρησιμοποιήσετε την sudo make install.

Εκτός κι αν ρυθμίσετε αλλιώς το ./configure, το μεταγλωττισμένο πρόγραμμα θα εγκατασταθεί στο /usr/local/bin. Επομένως, μπορείτε να το τρέξετε δίνοντας

/usr/local/bin/foo

ή ψάξτε που βρίσκεται το εκτελέσιμο με την εντολή:

locate foo

Λίγα λόγια για το compile (μεταγλώτιση) Όταν γράφουμε ένα πρόγραμμα σε κάποια γλώσσα προγραμματισμού αυτό είναι ένα (ή περισσότερα ανάλογα με την πολυπλοκότητα) απλό text αρχείο.

Για να τρέχει χρειάζεται να το μεταγλωτίσουμε (compile) σε δυαδική (binary) μορφή (στην ουσία οι υπολογιστές καταλαβαίνουν μόνο αυτή τη μορφή). Έτσι μόνο θα είναι εφικτό να "τρέξουμε" το πρόγραμμά μας.

Αυτή τη διαδικασία την κάνει ο μεταγλωτιστής (compiler) της γλώσσας προγραμματισμού. Όμως, ενώ για ένα απλό προγραμματάκι απαιτείται μόνο η εγκατάσταση του κατάλληλου compiler (πχ.της C++), ένα άλλο -πιο πολύπλοκο- κάνει χρήση κι άλλων πολλών, όπως πχ κάποιες βιβλιοθήκες, ή κάποιο άλλο πρόγραμμα ή κάποια headers του kernel. Τα extra αυτά, λέγονται εξαρτήσεις ή dependancies, και θα πρέπει να είναι εγκατεστημένα ήδη στον Η/Υ στον οποίο γίνεται η διαδικασία της μεταγλώττισης. ./configure Είναι ένα script το οποίο τσεκάρει αν υπάρχουν όλα αυτά που χρειάζεται για να μεταγλωτιστεί το πρόγραμμα. Επίσης δίνει τιμές σε κάποιες μεταβλητές του συστήματος και δημιουργέι το αρχείο MAKEFILE. Το τελευταίο χρειάζεται και την μετατροπή σε binary (τη μεταγλώτιση δηλαδή) κι επίσης για την απεγκατάσταση του προγράμματος όταν το αποφασίσουμε αργότερα.

make

Με αυτή την εντολή γίνεται η μεταγλώτιση βάσει του αρχείου MAKEFILE που είδαμε πριν.

make install

Η ανωτέρω εντολή είναι απαραίτητο να δίνεται μόνο από τον υπερχρήστη (super user) και κάνει εγκατάσταση του προγράμματος. Στην ουσία αντιγράφει τα μεταγλωτισμένα binary αρχεία στους υποκαταλόγους που πρέπει ώστε να μπορούν να τα τρέξουν όλοι οι χρήστες του pc μας. make uninstall Όταν θελήσουμε να επεγκαταστήσουμε το πρόγραμμα (αν βέβαια έχουμε καταφέρει να το εγκαταστήσουμε πρώτα Smiling) αρκεί να ξαναπάμε στον υποκατάλογο που κάναμε όλες αυτές τις δουλειές πριν και να δώσουμε την ανωτέρω εντολή ως su.

Δώσε αστέρια!

MO: 3.3 (ψήφοι: 8)

Comments

προσπαθω παλι να κανω compile σε μια εφαρμογη και μου βγαζει τα εξης:
root@sinusoid440Hz:~# cd ~
root@sinusoid440Hz:~# tar xvzf IanniX-0.640b-SRC-LittleEndian.tar.gz
tar: IanniX-0.640b-SRC-LittleEndian.tar.gz: Δεν είναι δυνατή open: No such file or directory
tar: Το σφάλμα δεν είναι επανορθώσιμο: τερματισμός τώρα
tar: Child returned status 2
tar: Καθυστέρησε το σφάλμα εξόδου από προηγούμενα σφάλματα
root@sinusoid440Hz:~#
Ακολουθησα τα βηματα οπως γραφουν οι οδηγιες

dimosfireΠολύ καλός οδηγός για μεταγλώτιση.Επιτέλους κατάλαβα τι είναι και πως γίνεται το compile

Εκτός κι αν ρυθμίσετε αλλιώς το ./configure, το μεταγλωττισμένο πρόγραμμα θα εγκατασταθεί στο /usr/local/bin.

 

 

 

Δημήτρη; Τι εννοείς ρύθμιση του ./configure  ;  = Πως ο ρυθμίζουμε μα το ./configure κανει απλά εξέταση βιβλιοθηκών και αρχείων όχι κάτι σαν εκτέλεση και αναδιανομή αρχείων έτσι δεν έιναι ; ποιες ειναι οι ρυθμίσεις του ; και πως γίνονται ;

 

Ευχαριστώ

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

./configure --help

Θα λάβεις κάτι σαν και αυτό(είναι μόνο ενδεικτικό.. μπορεί να υπάρχουν πολύ περισσότερες επιλογες). 

 

dimitris@destop:~/src/x264$ ./configure --help

Usage: ./configure [options]


available options:


  --help                   print this message

  --disable-avs-input      disables avisynth input (win32 only)

  --disable-mp4-output     disables mp4 output (using gpac)

  --disable-pthread        disables multithreaded encoding

  --disable-asm            disables assembly optimizations on x86 and arm

  --enable-debug           adds -g, doesn't strip

  --enable-gprof           adds -pg, doesn't strip

  --enable-visualize       enables visualization (X11 only)

  --enable-pic             build position-independent code

  --enable-shared          build libx264.so

  --extra-asflags=EASFLAGS add EASFLAGS to ASFLAGS

  --extra-cflags=ECFLAGS   add ECFLAGS to CFLAGS

  --extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS

  --host=HOST              build programs to run on HOST

  --cross-prefix=PREFIX    use PREFIX for compilation tools


dimitris@destop:~/src/x264$ 

 Υστερα προσθέτεις τις επιλογές που θες έτσι για παράδειγμα

./configure --enable-gprof --disable-mp4-output

Δεν έχω να προσθέσω κάτι παραπάνω, lockheart.

Απλά να υπενθυμίσω ό,τι στο 99% των περιπτώσεων _δεν_ κάνουμε μεταγλώττιση των προγραμμάτων, αλλά τα κατεβάζουμε και τα εγκαθιστούμε απευθείας στη μορφή των "πακέτων" (packages) από διάφορους διαδικτυακούς servers που αποκαλούμε αποθετήρια (repositories). Κάθε διανομή linux έχει τα δικά της αποθετήρια, και προσφέρει κάποια απλή εφαρμογή για εύκολη αναζήτηση και εγκατάσταση πακέτων.

Όμως, δεν υπάρχουν όλα τα προγράμματα στα αποθετήρια της κάθε διανομής και γι'αυτό (και μόνο εδώ ίσως) χρειάζεσαι τo compile από κώδικα. Σημείωσε όμως ότι οι περισσότερες εφαρμογές χρειάζονται συγκεκριμένες βιβλιοθήκες για να τρέξουν, οπότε για να κάνεις compile π.χ. τον Konqueror, πρέπει να έχεις κάνει compile/install και όλες τις βιβλιοθήκες του KDE4! Οπότε για μεγάλα προγράμματα, το compile δεν είναι εύκολη υπόθεση...

Χωρίς να ειμαι 100% σίγουρος, πρεπει να καθορίσεις σωστά τη διαδρομή που βρίσκεται το συμπιεσμενο αρχείο σου.

Μαλλον δεν ορίζεις σωστά τη διαδρομή του αρχείου σου.

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

bash: ./configure: No such file or directory

την επόμενη φορά το πονηρό μυαλό μου σκέφτηκε να γράψει  .\configure  και  .configure  έχοντας την ίδια τύχη...

.configure: command not found

επίσης όταν έγραψα

./configure --help

μου έβγαλε μήνυμα

bash: ./configure: No such file or directory

αφού αποφάσισα να προχωρήσω στο επόμενο βήμα, δηλαδή την εντολή  make ...

make: *** No targets specified and no makefile found.  Stop.

θα μπορούσατε σας παρακλώ να με βοηθήσετε λιγάκι?

 

Για να μπορείς να τρέξεις το configure, πρέπει να υπάρχει σαν αρχείο στο φάκελο που βρίσκεσαι. Αν δεν υπάρχει, παίζουν 4 ενδεχόμενα:

1) Το πρόγραμμα είναι πολύ απλό κ προσπερνά το στάδιο του configure, οπότε κ πας απ'ευθείας σε make (θα πρέπει όμως να υπάρχει ένα αρχείο με όνομα "Makefile" για να δουλέψει το make).

2) Το πρόγραμμα χρησιμοποιεί autoconf/automake. Σε αυτή την περίπτωση θα δεις ένα αρχείο με όνομα "autogen.sh" το οποίο κ τρέχεις πρώτα (./autogen.sh). Το autogen θα δημιουργήσει τα αρχεία configure κ το Makefile, ώστε μετά να μπορείς μετά να δώσεις ./configure κ make.

3) Το πρόγραμμα χρησιμοποιεί κάποιο άλλο σύστημα για να κάνει compile (πχ scons αντί για make).

4) Το πρόγραμμα έχει ένα δικό του τρόπο που κάνει compile, κ συνήθως υπάρχει ένα script αρχείο που τρέχεις κ τα κάνει όλα.

Σε κάθε περίπτωση, είτε μέσα στα README/INSTALL αρχεία που συνοδεύουν το πρόγραμμα, ή στη σελίδα του στο internet, πρέπει να υπάρχουν σαφείς οδηγίες για το πώς κάνεις compile το πρόγραμμα.

-- gnu_labis

Το Linux ΔΕΝ είναι Windows!!!

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

Άς πούμε το bespin από τον κώδικά του , θέλει    ./configure help για να τρέξει αφού σε ρωτήσει κάτι πρώτα. Γι' αυτό το λέω, σαν παράδειγμα.

 

~~~~~~~~~~~~~~~~~~

1ον να ευχαριστήσω για την άμεση ανταπόκριση

2ον το αρχείο που ήθελα να εγκαταστήσω είναι το VMwareTools-8.2.1.4-227600.tar.gz

3ον το αρχείο το εγκατέστησα αλλά τρέχοντας ένα πρόγραμμα (vmware-install.pl) με άδεια υπερ χρήστη όπως έλεγε το INSTALL

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

4ον αφού αποσυμπίεσα με το tar xvzf ... στον φάκελο που δημιουργήθηκε δεν υπήρχε κανένα αρχείο με τα παραπάνω ονόματα

δηλαδή το vmware-install.pl είναι το script που τα κάνει όλα όπως λές gnu_labis?

επίσης το ./configure help μου βγάζει

bash: ./configure: No such file or directory

δηλαδή το αν θα χρησιμοποιήσεις ./configure εξαρτάται από το package που θες να εγκαταστήσεις?

αν θυμάμαι αυτό είναι αρχείο για εικονικές μηχανές ...vmware ...

 

εγώ θα σου πω έναν  λίγο απλό τρόπο να το εγκαταστήσεις αυτό:

κάνεις copy paste το αρχείο στον φάκελο /tmp

το αποσυμπιέζεις εκεί :    δεξί κλικ και από συμπιέση εδώ 

μετά πας στην κονσόλα και με δικαιώματα υπεχρήστη  δίνεις:

cd /tmp/vmware-tools-distrib

./vmware-install.pl

 

και άν όλα έχουνε πάει καλά και απαντώντας σε κάποιες ερωτήσεις τις πιο πολλές με yes 

θα έχεις εγκαταστήσεις to vmware-tools ...

 

μόνο σε ένα σημείο πρέπει να να προσέξεις στο σημείο που σου γράφει ότι το gcc δεν έιναι έγκυρο ή κάπως έτσι 

εκεί που σε ρωτάει would you like to change it?

πάτα  no ...

 

υ.γ vmware σε mac ...?

windows XP

την εγκατάσταση την έκανα απλώς δεν μετέφερα τα αρχεία στον tmp