make |
Το make είναι ένα εργαλείο για την αυτόματη δημιουργία προγραμμάτων. Το προεπιλεγμένο αρχείο εισόδου είναι το Makefile, οπότε με την εκτέλεση της εντολής make θα ψάξει το πρόγραμμα για το αρχείο Makefile και αν δε το βρει θα βγάλει μήνυμα λάθους. Ένα απλό Makefile περιλαμβάνει τα εξής:
# Αυτό είναι σχόλιο
COM=myexe
OBJ=file1.o file2.o file3.o
LDR=gcc
$(COM): $(OBJ)
$(LDR) -o $(COM) $(OBJ)
# Τα κενά στην αρχή της παραπάνω γραμμής είναι σημαντικό να είναι tab.
clean:
rm $(OBJ)
# Ομοίως το κενό πρέπει να είναι tab.Στα Makefiles υπάρχει η "παραξενιά" να χρησιμοποιείται το tab. Πρέπει απλώς κανείς να το συνηθισει. Αλλά ας πάρουμε το αρχείο από την αρχή. COM=myexe δινει στη μεταβλητή COM την τιμή myexe, η οποία θα είναι το όνομα του εκτελέσιμου. OBJ=file1.o file2.o file3.o λέει στο make ότι τα αντικείμενα που χρειάζονται είναι τα file1.o file2.o file3.o. LDR=gcc ορίζει το πρόγραμμα που θα συνδέσει τα αντικείμενα, θα μπορούσε να ήταν και το ld.
H επόμενη γραμμή λέει ότι το εκτελέσιμο $(COM) εξαρτάται από τα αντικείμενα $(OBJ). Για να δημιουργηθεί δηλαδή το αρχείο myexe πρέπει πρώτα να δημιουργηθούν τα εξαρτόμενα αντικείμενα. Ας υποθέσουμε τώρα ότι τα file1.c και file2.c είναι αρχεία C, ενώ το file3.f είναι αρχείο fortran. Aυτό δε φαίνεται πουθενά στο Makefile, παρόλ' αυτά το make θα καλέσει τους κατάλληλους μεταγλωττιστές, κι αν δεν υπάρχουν θα βγάλει μήνυμα λάθους. Aν πληκτρολογήσουμε make, θα προσπαθήσει να εκτελέσει τις εντολές:
gcc -c file1.c gcc -c file2.c g77 -c file3.f
Έπειτα θα τα συνδέσει με την εντολή
gcc -o myexe file1.o file2.o file3.o
Tελος η εντολή rm $(OBJ) δε θα εκτελεσθεί. Αυτό συμβαίνει γιατί υπάρχουν στο συγκεκριμενο αρχείο 2 στόχοι (targets), ο $(COM) και ο clean. Aν κατα την εκτέλεση της εντολής δε εχουμε δώσει κάποιο στόχο τότε ο προεπιλεγμένος είναι ο ανώτερος, δηλαδή σε αυτή την περίπτωση ο $(COM). Αν πληκτρολογήσουμε
make clean
τότε θα πάει στη γραμμή
clean:
όπου δε θα δει καμία εξάρτηση και μετά θα εκτελέσει την εντολή rm $(OBJ).
Όλες οι παραπάνω εντολές και επιλόγες των εντολών που παρουσιασθηκαν παραπάνω, μπορούν με μεγάλη ευκολία να χρησιμοποιηθούν σε ένα Makefile.
