make: Το εργαλείο του τεμπέλη!


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

#Move all jpg files from the current directory to the resources #directory
gclkaze@tzertzelos:~/Desktop/Tzertzelos$: mv *.jpg resources/


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

#Find 10 biggest files in human readable output in current directory
gclkaze@tzertzelos:~/Desktop/Tzertzelos$: du -hsx * | sort -rh | head -10


Συν τοις άλλοις, υπάρχουν φορές που για να διεκπεραιώσετε μια συγκεκριμένη δουλειά, θα πρέπει να εκτελέσετε πολλές εντολές ακολουθιακά:

# Run in background the following python scripts, their output is written #in the nohup.out file
nohup python demon.py &
nohup python locations_demon.py &
nohup python grades_demon.py &
nohup python demon.py &
nohup python sock.py &
nohup python specific.py &
nohup python today.py &


Θεωρώντας ότι αυτές οι εντολές πρέπει να εκτελούνται συχνά με κάποια συγκεκριμένη προτεραιότητα, ένας προγραμματιστής/system admin θα πρέπει α) είτε να εκτελεί την εντολή history για να ψάξει στο ιστορικό του τερματικού, να βρεί τις εντολές που τον ενδιαφέρουν και έπειτα να κάνει copy paste τις συγκεκριμένες εντολές μία προς μία πίσω στο τερματικό έτσι ώστε να τις εκτελέσει, είτε β) να τις έχει καταγεγραμμένες σε ένα αρχείο από το οποίο θα τις κάνει copy paste στο τερματικό. Οι παραπάνω ενέργειες προυποθέτουν χρόνο από το καθημερινό development και στη τελική είναι βαρετό και εκνευριστικό να γίνεται αυτό σε καθημερινή βαση. Θα μπορούσαμε αυτό το τέταρτο να το αξιοποιήσουμε διαφορετικά και σίγουρα με πιο δημιουργικό τρόπο.


Η απάντηση: Makefiles!


Το πρόγραμμα make & τα Makefiles (πρώτη κυκλοφορία 1977 από τον κ. Stuart Feldman) το χρησιμοποίησα για πρώτη φορά στη σχολή, στο εργαστήρι λογισμικού ως εργαλείο αυτοματοποιημένου executable builder απο source αρχεία γραμμένα σε C.
Γράφαμε αρχεία Makefiles για κάθε project, τα οποία περιείχαν εντολές οι οποίες ευθύνονταν για το compilation process των source files, τη δημιουργία των object files και τη συρραφή τους μέσω του linker σε ενα binary executable αρχείο. Τα Makefiles αποτελούνται απο targets, dependencies και commands, όπου το κάθε command διαφοροποιείται από τα άλλα μέσω tabs (όχι white spaces!).


Ακολούθως παραθέτω ένα παράδειγμα ενός Makefile.

all:
    gcc -g -Wall -Wextra -pedantic -c Warnings.c Warnings.h
    gcc -g -Wall -Wextra -pedantic -c TableUtilities.c TableUtilities.h
    gcc -g -Wall -Wextra -pedantic -c Node.c Node.h
    gcc -g -Wall -Wextra -pedantic -c Algorithms.c Algorithms.h
    gcc -g -Wall -Wextra -pedantic -c NodePoolUtils.c NodePoolUtils.h
    gcc -g -Wall -Wextra -pedantic -c LinkTable.c LinkTable.h
    gcc -g -Wall -Wextra -pedantic -c Visuals.c Visuals.h
    gcc -g -Wall -Wextra -pedantic -c ListUtil.c ListUtil.h Visuals.h LinkTable.h
    gcc -g -Wall -Wextra -pedantic -c StrongConnection.c StrongConnection.h
    gcc -g -Wall -Wextra -pedantic -c HistoryGraph.c ListUtil.h LinkTable.h HistoryGraph.h AlgInspector.h StrongConnectionAPI.h StrongConnection.h
    gcc -g -Wall -Wextra -pedantic -c GarbageCollector.c HistoryGraph.h ListUtil.h LinkTable.h HistoryGraph.h AlgInspector.h
    $(MAKE) -C Automaton
    gcc -g -Wall -Wextra -pedantic -c StrongConnectionAPI.c StrongConnectionAPI.h
    gcc -g -Wall -Wextra -pedantic -c AlgInspector.c AlgInspector.h Algorithms.h Automaton/Automaton.h HistoryGraph.h StrongConnectionAPI.h
    gcc -g -Wall -Wextra -pedantic -c NodePool.c Node.h NodePoolUtils.h HistoryGraph.h NodePoolDef.h Automaton/ClusterAddr.h
    gcc -g -Wall -Wextra -pedantic -c StrUtilities.c StrUtilities.h TableUtilities.h
    gcc -g -Wall -Wextra -pedantic -c Read.c StrUtilities.h TableUtilities.h NodePool.h Node.h Warnings.h
    gcc -g -Wall -Wextra -pedantic -o memxplore Read.o StrUtilities.o TableUtilities.o Node.o NodePool.o NodePoolUtils.o HistoryGraph.o LinkTable.o ListUtil.o Visuals.o Automaton/Automaton.o Automaton/ClusterAddr.o   AlgInspector.o Algorithms.o GarbageCollector.o StrongConnectionAPI.o StrongConnection.o Warnings.o


Αυτό το Makefile περιγράφει το compilation process και όλα τα αρχεία τα οποία απαιτούνται έτσι ώστε να παραχθεί το εκτελέσιμο μας με όνομα memxplore.
Για να γίνει αυτό, δεδομένου ότι έχουμε όλα τα αρχεία τα οποία αναφέρονται στο Makefile στο current working directory μας (και το πρόγραμμα make εγκατεστημένο), δεν έχουμε παρά να πληκτρολογήσουμε την εντολή make all. Η παράμετρος “all” δεν είναι τίποτα άλλο από το target all στη πρώτη γραμμή του παραδείγματος. Τα targets χρησιμοποιούνται για να διαχωρίσουν διάφορα σέτ εντολών σε ένα Makefile από τα άλλα, θα μπορούσαμε να τα δούμε και σαν μοναδικά ids συνόλων εντολών.

Με τη χρήση Makefile θα μπορούσαμε να ξαναγράψουμε τις παραπάνω εντολές ώς εξής:

big:
    du -hsx * | sort -rh | head -10
mv_pix:
    mv *.jpg resources/
run_daemons:
    nohup python demon.py &
    nohup python locations_demon.py &
    nohup python grades_demon.py &
    nohup python demon.py &
    nohup python sock.py &
    nohup python specific.py &
    nohup python today.py &


Για να εκτελέσουμε τις παραπάνω δουλειές (ταργκετσ–), δεν έχουμε παρά να πληκτρολογήσουμε στο τερματικό:

gclkaze@tzertzelos:~/Desktop/Tzertzelos$: make big
gclkaze@tzertzelos:~/Desktop/Tzertzelos$: $make mv_pix
gclkaze@tzertzelos:~/Desktop/Tzertzelos$: make run_daemons


Ο προγραμματιστής/admin δε θα χρειαστεί να ξαναγράψει καμία από τις προηγούμενες εντολές στο τερματικό, όλες οι δουλειές και οι εντολές που τις απαρτίζουν περιγράφονται τέλεια στο Makefile μας! Φοβερό και απλό!


Προσοχή!


Πρέπει να κάνουμε maintenance του Makefile σε περίπτωση που κάποια directories ή αρχεία που επηρεάζονται απ΄το εκάστοτε Makefile έχουν τροποποιηθεί. Δε θα θέλαμε παραδείγματος χάρη σε περίπτωση renaming κάποιων directory το Makefile μας το οποίο περιέχει “επικίνδυνες” εντολές όπως η rm (remove file or directory) ή η mv (move file or directory to target path) να σβήσει ή να μετακινήσει το περιεχόμενο κάποιων directories τα οποία έχουν αλλάξει όνομα. Σε κάθε περίπτωση, εάν η δομή του project έχει αλλάξει, καλό θα ήταν να ρίξουμε μια ματιά στις εντολές που περιέχονται στο Makefile πρίν το εκτελέσουμε, ελέγχοντας όλες τις παραμέτρους των εντολών που έχουν να κάνουν με αρχεία, φακέλους ή project paths τα οποία πιθανότατα να έχουν τροποποιηθεί.
Επίσης, προσοχή στα typos!


‘Απαξ και μάθετε να το χρησιμοποιείτε, θα γίνει ο καλύτερος σας φίλος!


Το πρόγραμμα make παρατίθεται για Unix και σε Windows με το όνομα cmake.

Advertisements

5 thoughts on “make: Το εργαλείο του τεμπέλη!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s