Μπαλαντέρ και Foreach στο Makefile

Mpalanter Kai Foreach Sto Makefile



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

Μπαλαντέρ στο Makefile

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







Για να χρησιμοποιήσετε έναν χαρακτήρα μπαλαντέρ σε ένα makefile, θα πρέπει να χρησιμοποιήσετε τη λέξη-κλειδί 'μπαλαντέρ' που ακολουθεί τον αστερίσκο '*' ή '?' και την επέκταση αρχείου που είναι συνδεδεμένη μέσω μιας κουκκίδας. Μπορείτε επίσης να χρησιμοποιήσετε το '?' υπογράψτε για να αναζητήσετε έναν μόνο χαρακτήρα και '*' για να ταιριάζει με οποιονδήποτε αριθμό χαρακτήρων. Όλη αυτή η δομή θα πρέπει να χρησιμοποιείται μέσα στις αγκύλες και ένα σύμβολο '$'. Για παράδειγμα, δηλώνουμε τη μεταβλητή 'SRCS' που λαμβάνει το αρχείο αξίας μέσω του χαρακτήρα μπαλαντέρ. Αυτός ο χαρακτήρας μπαλαντέρ αναζητά όλα τα αρχεία με το μοτίβο 'cpp' στο τέλος τους.





Foreach στο Makefile

Η συνάρτηση foreach του makefile λειτουργεί ακριβώς όπως ένας βρόχος foreach σε γλώσσες προγραμματισμού – επαναλάβετε τα στοιχεία σε μια λίστα. Η συνάρτηση foreach στο makefile εκτελεί μια συγκεκριμένη ενέργεια σε κάθε στοιχείο μιας λίστας. Αυτό το στοιχείο μπορεί να είναι μια μεταβλητή ή οποιοδήποτε αρχείο προέλευσης. Για παράδειγμα, επεξεργαζόμαστε τη σύνταξη της συνάρτησης foreach στο makefile μέσω της μεταβλητής SOURCES που περιέχει μια λίστα με τρία αρχεία προέλευσης. Η συνάρτηση foreach χρησιμοποιεί αυτήν τη μεταβλητή SOURCES για να δημιουργήσει το ίδιο όνομα για τρία αρχεία αντικειμένων επαναλαμβάνοντας τη λίστα των αρχείων προέλευσης και αποθηκεύοντάς τα σε μια άλλη μεταβλητή 'OBJECTS'. Οι δύο τελευταίες γραμμές δείχνουν πώς ένας κανόνας makefile μπορεί να χρησιμοποιηθεί για τη δημιουργία ενός αρχείου αντικειμένου για κάθε αρχείο C μετά την επανάληψη.





ΠΗΓΕΣ := file1.c file2.c file3.c
ΑΝΤΙΚΕΙΜΕΝΑ := $ ( foreach src, $ ( ΠΗΓΕΣ ) , $ ( src:.c=.o ) )
$ΑΝΤΙΚΕΙΜΕΝΑ : % .Ο: % .ντο
$ ( CC ) $ ( CFLAGS ) -ντο $ < $ @

Παράδειγμα 1: Χρήση χαρακτήρων μπαλαντέρ

Για να εμφανίσουμε την απεικόνιση και την εργασία των χαρακτήρων μπαλαντέρ και των συναρτήσεων foreach, εισάγουμε ένα αρχείο C++. Αυτό το αρχείο 'salary.cpp' ξεκινά με τη χρήση της κεφαλίδας 'iostream' για την ομαλή χρήση των ροών εισόδου και εξόδου. Η κύρια μέθοδος δηλώνει μια μεταβλητή 's' ακέραιου τύπου και την πρόταση 'cout' για να ζητήσει μια τιμή εισόδου κατά το χρόνο εκτέλεσης. Η τυπική ροή εισόδου 'cin' λαμβάνει την τιμή από έναν χρήστη κατά το χρόνο εκτέλεσης και την αποθηκεύει στη μεταβλητή 's'. Το 'cout' εμφανίζει την τιμή που έχει εισαχθεί από έναν χρήστη στην οθόνη της κονσόλας.

#include
χρησιμοποιώντας namespace std?
int main ( ) {
int s;
cout << 'Εισάγετε μισθό:' ;
τρώει >> μικρό;
cout << ' \n Μισθός: ' << μικρό << endl;
ΕΠΙΣΤΡΟΦΗ 0 ;
}



Ξεκινάμε το makefile με τη μεταβλητή “CXX” που ορίζει τον μεταγλωττιστή για C++ και η μεταβλητή CXXFLAGS κρατά τις σημαίες για τον μεταγλωττιστή C++. Η μεταβλητή EXECUTABLE περιέχει το όνομα ενός εκτελέσιμου αρχείου 'hello' που δημιουργείται μετά την εκτέλεση ενός makefile. Η μεταβλητή SRCS λαμβάνει όλα τα αρχεία C++ από έναν τρέχοντα κατάλογο χρησιμοποιώντας τον χαρακτήρα μπαλαντέρ '*' για αναζήτηση οποιουδήποτε μοτίβου τελειώνει με '.cpp'. Η μεταβλητή OBJS διατηρεί τα ονόματα των αρχείων αντικειμένων που θα δημιουργηθούν χρησιμοποιώντας τη μεταβλητή SRCS, αντικαθιστώντας την επέκταση 'cpp' με 'o'. Ο προεπιλεγμένος στόχος 'όλα' δημιουργεί το makefile και εξαρτάται από τη μεταβλητή EXECUTABLE.

Ο πρώτος κανόνας δημιουργεί το αρχείο προορισμού 'hello' που εξαρτάται από το αρχείο αντικειμένου της μεταβλητής OBJS (ονόματα αρχείων αντικειμένων) χρησιμοποιώντας τα ονόματα αρχείων που δημιουργούνται μέσω της μεταβλητής 'OBJS'. Ο δεύτερος κανόνας makefile δημιουργεί το αρχείο αντικειμένου με την επέκταση “.o” που εξαρτάται από το αρχείο C++ μετά τη μεταγλώττιση του αρχείου κώδικα C++. Εδώ, το '%' είναι ένας χαρακτήρας μπαλαντέρ για την αναζήτηση των ονομάτων αρχείων οποιουδήποτε μοτίβου που τελειώνει με 'cpp'. Στο τέλος, ο καθαρός στόχος χρησιμοποιεί την εντολή «rm» για να καθαρίσει με δύναμη τα εκτελέσιμα αρχεία και τα αρχεία αντικειμένων που δημιουργήθηκαν πρόσφατα από έναν κατάλογο χρησιμοποιώντας τη σημαία «-f».

CXX = g++
CXXFLAGS = -Τείχος -στδ =c++ έντεκα
EXECUTABLE = γεια
SRCS = $ ( μπαλαντέρ * .cpp )
OBJS = $ ( SRCS:.cpp=.o )
όλα: $ ( ΕΚΤΕΛΕΣΤΙΚΟ )
$ ( ΕΚΤΕΛΕΣΤΙΚΟ ) : $ ( ΑΝΤΙΚΕΙΜΕΝΑ )
$ ( CXX ) $ ( CXXFLAGS ) $ @ $ ( ΑΝΤΙΚΕΙΜΕΝΑ )
% .Ο: % .cpp
$ ( CXX ) $ ( CXXFLAGS ) -ντο $ < $ @
ΚΑΘΑΡΗ:
rm -φά $ ( ΕΚΤΕΛΕΣΤΙΚΟ ) $ ( ΑΝΤΙΚΕΙΜΕΝΑ )

Με την εκτέλεση της εντολής 'make', δημιουργήθηκαν τόσο τα αρχεία στόχου όσο και τα αρχεία αντικειμένου. Μετά την εκτέλεση του εκτελέσιμου αρχείου «γεια», ζητείται από τον χρήστη να εισάγει μισθό και προσθέτουμε «67000». Στο τέλος επιστρέφεται ο μισθός.

φτιαχνω, κανω

Παράδειγμα 2: Χρήση Foreach

Μετά τη χρήση χαρακτήρων μπαλαντέρ, ήρθε η ώρα να χρησιμοποιήσετε τη συνάρτηση foreach στο makefile. Ο υπόλοιπος κώδικας του makefile είναι ο ίδιος. Στη γραμμή 6, αρχικοποιούμε μια άλλη μεταβλητή που είναι 'NAMES' με μια λίστα τριών τιμών - Kate, Kim, Tim. Ο προεπιλεγμένος στόχος 'όλα' εξαρτάται από τη μεταβλητή EXECUTABLE (όνομα αρχείου στόχου 'hello') και από τη δήλωση foreach. Η συνάρτηση 'addprefix' επαναλαμβάνει τη μεταβλητή 'NAMES' για να δημιουργήσει δυναμικά τα ονόματα στόχων βάζοντας πρόθεμα 'run_' στην αρχή κάθε ονόματος στη λίστα 'NAMES'.

Ο κανόνας στη γραμμή οκτώ υποδεικνύει ότι ένα εκτελέσιμο αρχείο προορισμού εξόδου, δηλ. hello, εξαρτάται από το 'OBJS'. Η σημαία '-o' δημιουργεί το αρχείο εξόδου στόχου χρησιμοποιώντας το OBJS. Ο κανόνας στη δέκατη γραμμή δημιουργεί το αρχείο αντικειμένου στόχου χρησιμοποιώντας τα αρχεία προέλευσης με την επέκταση 'cpp'. Για να γίνει αυτό, η σημαία «-c» χρησιμοποιείται για τη μεταγλώττιση ενός αρχείου προέλευσης και τη δημιουργία του σχετικού αρχείου αντικειμένου που είναι απαραίτητο για τη δημιουργία προορισμού. Στη δέκατη τρίτη γραμμή, χρησιμοποιούμε τη μεταβλητή EXECUTABLE για να δημιουργήσουμε την έξοδο με διαφορετικά ονόματα που ξεκινούν με το 'run_' ως πρόθεμα. Στο τέλος, ο καθαρός στόχος και οι στόχοι Phony θα αφαιρέσουν και θα καθαρίσουν το αντικείμενο και τα αρχεία προορισμού.

CXX = g++
CXXFLAGS = -Τείχος -στδ =c++ έντεκα
# εκτελέσιμο αρχείο προορισμού
EXECUTABLE = γεια
SRCS = $ ( μπαλαντέρ * .cpp )
OBJS = $ ( SRCS:.cpp=.o )
# Λίστα ονομάτων
ΟΝΟΜΑΤΑ = Κέιτ Κιμ Τιμ
#Στόχοι
όλα: $ ( ΕΚΤΕΛΕΣΤΙΚΟ ) $ ( addprefix run_, $ ( ΟΝΟΜΑΤΑ ) )
$ ( ΕΚΤΕΛΕΣΤΙΚΟ ) : $ ( ΑΝΤΙΚΕΙΜΕΝΑ )
$ ( CXX ) $ ( CXXFLAGS ) $ @ $ ( ΑΝΤΙΚΕΙΜΕΝΑ )
% .Ο: % .cpp
$ ( CXX ) $ ( CXXFLAGS ) -ντο $ < $ @
# Δημιουργήστε στόχους για κάθε όνομα
τρέξιμο_ % : $ ( ΕΚΤΕΛΕΣΤΙΚΟ )
. / $ ( ΕΚΤΕΛΕΣΤΙΚΟ ) $*
ΚΑΘΑΡΗ:
rm -φά $ ( ΕΚΤΕΛΕΣΤΙΚΟ ) $ ( ΑΝΤΙΚΕΙΜΕΝΑ )
# Ψεύτικοι στόχοι
.PHONY: όλα καθαρά

Η χρήση της εντολής 'make' δημιουργεί τον εκτελέσιμο στόχο 'hello' και εκτελεί το πρόγραμμα για κάθε όνομα που καθορίζεται στη μεταβλητή 'NAMES'.

φτιαχνω, κανω

Μπορείτε επίσης να τροποποιήσετε την έξοδο σας χρησιμοποιώντας το όνομα από μια λίστα με το πρόθεμα 'run_'.

Κάντε run_Kim

συμπέρασμα

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