CE121 Προγραµµατισµός 2. Εισαγωγή σε Makefiles. CE121 -

Σχετικά έγγραφα
CE121 Προγραµµατισµός 2. Εισαγωγή σε Makefiles. CE121 -

make Προγραμματισμός II 1

Προγραμματισμός Ι. Πολλαπλά Αρχεία. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Μεταγλώττιση και σύνδεση πολλαπλών αρχείων κώδικα. Προγραμματισμός II 1

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

Προεπεξεργαστής C. Προγραμματισμός Ι 1

(programming interfaceή/και application programming interface API).

H ΓΛΩΣΣΑ C. Μάθηµα 1: Το Πρώτο µας Πρόγραµµα σε C. ηµήτρης Ψούνης

Προγραµµατισµός Ι Εισαγωγή Πανεπιστήµιο Πελοποννήσου Τµήµα Πληροφορικής & Τηλεπικοινωνιών Προγραµµατισµός Ι Νικόλαος Δ. Τσελίκας

Ενσωματωμένα Συστήματα

ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΕΣ ΤΕΧΝΙΚΕΣ Σύντομη εισαγωγή στο εργαστήριο

Εργαστήριο Λειτουργικών Συστημάτων. Minix Overview

ΣΕΤ ΑΣΚΗΣΕΩΝ 2. Προθεσµία: 15/11/09, 23:59

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος

ΕΡΓΑΣΤΗΡΙΟ 6: Συναρτήσεις και Αναδρομή

Δομημένος Προγραμματισμός

ΑΣΚΗΣΗ 5: ΠΙΝΑΚΕΣ. Σχήµα 1: H έννοια των πινάκων

Διάλεξη 2η: Αλγόριθμοι και Προγράμματα

Προγραμματισμός Ι. Προεπεξεργαστής. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Διάλεξη 22η: Επιπλέον στοιχεία της C

2.1. Οι λογαριασµοί χρηστών Σύνδεση (login) και αποσύνδεση (logout)

Προγραμματισμός Συστημάτων

2.1 Αντικειµενοστρεφής προγραµµατισµός

Διάλεξη 12: Οργάνωση Προγραμμάτων σε Πολλαπλά Αρχεία ΙΙ

Προγραµµατισµός Ι Εργαστήριο 13ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 13 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

lab13grades 449 PASS 451 PASS PASS FAIL 1900 FAIL Page 1

Διαδικαστικός Προγραμματισμός

ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ, ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΚΑΙ ΔΙΚΤΥΩΝ, ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

Εισαγωγή στην πληροφορική

Ενότητες στην C Τεχνική Υλοποίησης Αφαιρετικών Τύπων Δεδομένων στην C

ΕΡΓΑΣΤΗΡΙΟ 1 ΕΙΣΑΓΩΓΗ ΣΤΗ C. Τµήµα Πληροφορικής και Τηλεπικοινωνιών

Γλώσσα Προγραμματισμού C++ Εισαγωγή - Μια πρώτη ματιά

ΕΡΓΑΣΙΑ ΕΞΑΜΗΝΟΥ - ΜΕΡΟΣ Γ'

ΑΦAΙΡΕΤΙΚΟΣ (ή ΑΦΗΡΗΜΕΝΟΣ) ΤΥΠΟΣ ΔΕΔΟΜΕΝΩΝ (ΑΤΔ) (Abstract Data Type-ADT) - σύνολο δεδομένων (data, objects) - σύνολο πράξεων στα δεδομένα

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ UNIX

Κεφάλαιο 7 : Είδη, Τεχνικές, και Περιβάλλοντα Προγραµµατισµού

Η γλώσσα προγραμματισμού C

ΜΥΥ- 402 Αρχιτεκτονική Υπολογιστών Μεταγλώτιση, σύνδεση

Προγραµµατισµός Ι ΕΡΓΑΣΤΗΡΙΟ 5 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

ΔΗΜΙΟΥΡΓΙΑ & ΧΡΗΣΗ ΒΙΒΛΙΟΘΗΚΩΝ

Διαδικασιακός Προγραμματισμός

Λειτουργικά Συστήματα (ΗΥ-345) Χειμερινό Εξάμηνο

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ. Εισαγωγή στην FORTRAN. Δρ. Ιωάννης Λυχναρόπουλος

Εισαγωγή στο περιβάλλον προγραμματισμού του εργαστηρίου

Α. Ερωτήσεις Ανάπτυξης

Ανάπτυξη και Σχεδίαση Λογισμικού

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

ύο βασικές ιδέες Ενότητες Απόκρυψη Πληροφορίας, Αφηρηµένοι Τύποι εδοµένων 1) ιαχώρισε το πρόβληµα σεµικρότερα καλώς καθορισµένα υπο-προβλήµατα

Εξοικείωση με το πρόγραμμα DEV C++ Επικοινωνία Χρήστη - Υπολογιστή

ΥΠΟΛΟΓΙΣΤΕΣ ΙI. Άδειες Χρήσης. Δομή του προγράμματος. Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης

Εισαγωγή στον Προγραµµατισµό. Πανεπιστήµιο Θεσσαλίας Τµήµα Ηλεκτρολόγων Μηχανικών και Μηχανικών Η/Υ

CE121 Προγραµµατισµός ΙΙ. Χρόνος εκτέλεσης. Βάνα Ντουφεξή

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

Shell Scripts: loops / if / test

ΣΕΤ ΑΣΚΗΣΕΩΝ 3. Προθεσµία: 7/1/2014, 22:00

Επεξεργασία Αρχείων Κειµένου

ΙΩΑΝΝΗΣ ΚΩΝΣΤΑΝΤΙΝΟΥ 2ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΠΑΡΑΣΚΕΥΗ 26 ΟΚΤΩΒΡΙΟΥ 2012 ΑΙΘΟΥΣΑ Β4

Προγραµµατισµός Ι Εργαστήριο 13ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 13 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Εργαλεία του JDK. Β.1 Εργαλεία του JDK. Β.2 Μεταγλωττιστής javac. Τα πιο βασικά εργαλεία του JDK είναι τα παρακάτω.

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

ΤΥΠΟΣ ΔΕΔΟΜΕΝΩΝ (ΑΤΔ) (Abstract Data Type-ADT)

double sum(double a, double b) { return(a+b); } double my_avg(double a, double b) { return(sum(a, b)/2.0); }

ΑΣΚΗΣΗ 2: ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ C, ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ ΚΑΙ ΕΞΟΔΟΥ

lab7 PASS -Δεν έχεις καθόλου σχόλια! Διάβασε το φυλλάδιο. PASS -Πολύ καλή εργασία µε σωστά και επεξηγηµατικά σχόλια. -Πρόσεξε την στοίχισή σου!

Sheet3_2. Τα literals (3.0, 1.5, κτλ) πρέπει να ορίζονται ως σταθερές.

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Μεταφραστής (Compiler)

Προγραμματισμός I (Θ)

Ηβασικήσυνάρτηση προγράμματος main()

Λειτουργικά Συστήματα (Λ/Σ)

ΜΕΤΑΓΛΩΤΤΙΣΤΕΣ. Στην εξοικείωση με τη διαδικασία κατασκευής ενός Λεξικού Αναλυτή κάνοντας χρήση του lex.

Εισαγωγή στον Προγραµµατισµό, Αντώνιος Συµβώνης, ΣΕΜΦΕ, ΕΜΠ,, Slide 6

Προγραµµατισµός Ι Εργαστήριο 3ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 3 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ. Μερικές χρήσιμες οδηγίες

Διάλεξη 11: Οργάνωση Προγραμμάτων σε Πολλαπλά Αρχεία

Βαθμός Σχόλια. lab5 PASS PASS PASS PASS PASS. Οριακά PASS - Καλή δουλειά

LAB1 ΛΥΣΗ. Ευρετήριο απαντήσεων ανά τµήµα: Ευρετήριο απαντήσεων ανά µήνυµα λάθους/προειδοποίησης

ΟΔΗΓΙΕΣ ΕΓΚΑΤΑΣΤΑΣΗΣ & ΧΡΗΣΗΣ ΟΛΟΚΛΗΡΩΜΕΝΟΥ ΠΕΡΙΒΑΛΛΟΝΤΟΣ ΑΝΑΠΤΥΞΗΣ BloodShed Dev-C++

Προγραμματισμός Ι (ΗΥ120)

Εισαγωγή στο προγραμματιστικό περιβάλλον ANSI

Κεφάλαιο 8.7. Πίνακες & Συναρτήσεις ( ιάλεξη 17) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Κεφάλαιο Αλφαριθµητικές Σειρές Χαρακτήρων (Strings)

ΣΕΤ ΑΣΚΗΣΕΩΝ 2. Προθεσµία: 15/11/10, 23:59

ΑΣΚΗΣΗ 1: TO ΠΕΡΙΒΑΛΛΟΝ ΕΡΓΑΣΙΑΣ DEV-C++

Περίληψη Φροντιστηρίου. Κατανεμημένα Συστήματα Ι. Το περιβάλλον DAP - Χαρακτηριστικά. Το περιβάλλον DAP Τι είναι.

Ιδιότητες αντικειμένων, συγγραφή κώδικα, συντακτικά λάθη

Βιβλιοθήκες Αφηρημένοι τύποι δεδομένων. Προγραμματισμός II 1

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσµία: 8/1/12, 22:00

ΣΕΤ ΑΣΚΗΣΕΩΝ 1. Προθεσµία: 6/11/11, 22:00

Η βασική συνάρτηση προγράμματος main()

FAIL PASS PASS οριακά

ΗΥ-150. Πίνακες (Arrays)

ΕΙΣΑΓΩΓΗ ΣΤΟN ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ

Προγραµµατισµός Ι ΕΡΓΑΣΤΗΡΙΟ 5 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσµία: 22/12/2016, 21:00

Προγραµµατισµός Ι ΕΡΓΑΣΤΗΡΙΟ 3 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Υλοποίηση ενός προγραμματιστικού κελύφους εργασίας

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

Transcript:

CE121 Προγραµµατισµός 2 Εισαγωγή σε Makefiles 1

Η διαδικασία µεταγλώττισης myprog.c gcc myprog 2

Η διαδικασία µεταγλώττισης myprog.c preprocessor (cc1) /tmp/cczxt.i assembler (as) compiler (cc1) /tmp/cczxt.o /tmp/cczxt.s linker (ld) myprog 3

Η διαδικασία µεταγλώττισης! Δοκιµάστε: gcc -E myprog.c > myprog.i gcc -S myprog.i (παράγει αρχείο.s) gcc -c myprog.s (παράγει αρχείο.o) gcc myprog.o -o myprog 4

Separate compilation! Στις περισσότερες περιπτώσεις, ο κώδικας ενός προγράµµατος είναι µοιρασµένος σε διάφορα αρχεία. Γιατί? Πώς?.h files: ορισµοί τύπων, prototypes συναρτήσεων, καθολικές µεταβλητές.c files: υλοποιήσεις συναρτήσεων Ξεχωριστά γκρουπ από.c/.h αρχεία για ξεχωριστές ενότητες του προγράµµατος. 5

Separate compilation! Τι χρειάζεται να ξέρει ο compiler για να παράγει object code? Ορισµούς τύπων prototypes συναρτήσεων που καλούνται ΔΕ χρειάζεται να ξέρει την υλοποίησή τους!! Άρα: Μπορούµε να κάνουµε compile κάθε ένα από τα αρχεία C ξεχωριστά ώστε να παράγουµε object files και στο τέλος να συνδέσουµε όλα τα object files µαζί για να παράγουµε ένα εκτελέσιµο. 6

Separate compilation! Μια λύση για το hw2 του p1 introglutlib.h : prototypes συναρτήσεων που σχεδιάζουν γραφικά στην οθόνη introglutlib.c : υλοποιήσεις συναρτήσεων του introglutlib.h globals.h : καθολικές µεταβλητές, κάποια #define simulation.h: prototypes συναρτήσεων για την αρχικοποίηση και την εξάπλωση της φωτιάς. simulation.c: υλοποιήσεις συναρτήσεων του simulation.h. userinterface.h: prototypes συναρτήσεων για την αλληλεπίδραση µε το χρήστη userinterface.c: υλοποιήσεις συναρτήσεων του userinterface.h. main.c : main 7

make! Τι είναι το make? Ένα εργαλείο που χρησιµοποιείται για τη διαχείριση εργασιών µε πολλά αρχεία πηγαίου κώδικα. Το make: ελέγχει ποια από τα αρχεία έχουν αλλαχθεί από την τελευταία µεταγλώττιση, και µεταγλωττίζει ξανά µόνο αυτά καθώς και όσα άλλα αρχεία της εργασίας εξαρτώνται από αυτά. Για να λειτουργήσει χρειάζεται ένα Makefile 8

Makefile! Τι είναι Makefile? Ένα αρχείο στο οποίο καταγράφουµε: πληροφορίες για τις σχέσεις εξάρτησης (include) ανάµεσα στα αρχεία της εργασίας µας, και οδηγίες για το πώς θέλουµε να γίνει η µεταγλώττιση (και όχι µόνο) των αρχείων. Το εργαλείο make διαβάζει ένα Makefile και µεταγλωττίζει όσα αρχεία χρειάζεται µε βάση τις πληροφορίες και οδηγίες που βρίσκει σε αυτό. Το Makefile πρέπει να έχει όνοµα είτε makefile είτε Makefile (συνηθέστερο). 9

Γιατί χρησιµοποιούµε Makefiles?! Κάθε φορά που αλλάζει ένα αρχείο, δε χρειάζεται να µεταγλωττίζονται όλα.! Πιο εύκολο να γράψουµε make αντί να µεταγλωττίζουµε ένα-ένα αρχείο χωριστά. Ειδικά αν υπάρχουν πολλαπλά flags! Το Makefile µπορεί να περιέχει επιπλέον εντολές που θέλουµε να εκτελούνται κάθε φορά (πχ. να σβήνει κάποιο αρχείο) 10

Στοιχεία ενός Makefile! Μεταβλητές Για ονόµατα αρχείων, προγραµµάτων, flags κτλ. που εµφανίζονται σε πολλά σηµεία! Κανόνες Αποτελούνται από το όνοµα ενός στόχου (τι θέλουµε να δηµιουργήσουµε) και σχετικές εντολές (πώς να το δηµιουργήσουµε) Οι εντολές είναι εντολές κελύφους (shell commands)! Σχόλια! και πολλά άλλα. Δείτε το manual. 11

Χρήση makefile! Σύνταξη: make < όνομα στόχου> Το εργαλείο make ψάχνει στο τρέχον directory να βρει ένα αρχείο µε όνοµα Makefile (ή makefile) και εκτελεί τις εντολές για το συγκεκριµένο στόχο (αφού πρώτα εκτελέσει ότι εντολές αντιστοιχούν σε προαπαιτούµενους στόχους)! Σύνταξη: make Οµοίως µε πριν, αλλά εκτελεί τις εντολές για τον πρώτο στόχο που εµφανίζεται στο Makefile, εφόσον δεν έχουµε προσδιορίσει κάποιον. 12

Κανόνες <target>: <dependencies> <command1> <command2>...! target (στόχος): Αρχείο προς κατασκευή (συνήθως κάποιο εκτελέσιµο) ή ενέργεια προς ολοκλήρωση! dependencies (εξαρτήσεις): ένα ή περισσότερα αρχεία ή ενέργειες από τις οποίες εξαρτάται ο στόχος! commands: εντολές που το make στέλνει προς το shell και θα έχουν ως αποτέλεσµα το να δηµιουργηθεί ο στόχος. Το σύνολο των εντολών για ένα στόχο λέγεται και συνταγή. ΠΡΟΣΟΧΗ: Πρέπει να υπάρχει ένα tab πριν κάθε εντολή Εντολές µεγάλου µήκους µπορούν να συνεχίσουν στην επόµενη γραµµή αν η προηγούµενη τελειώνει σε \ 13

Παράδειγµα #include "parse.h" int main () { main.c #ifndef PARSE_H #define PARSE_H void parse(); parse.h parse.c #include "parse.h" #include<stdio.h> compile και link στην κονσόλα: > gcc -Wall -c parse.c > gcc -Wall -c main.c > gcc main.o parse.o -o all void parse () { 14

Παράδειγµα #include "parse.h" int main () { εκτελέσιµο (τελικός στόχος) all main.c #ifndef PARSE_H #define PARSE_H void parse(); parse.h parse.c #include "parse.h" #include<stdio.h> main.o parse.o εξαρτήσεις αρχείων void parse () { main.c parse.c parse.h 15

Παράδειγµα all main.o parse.o main.c parse.c parse.h Makefile all: main.o parse.o gcc main.o parse.o -o all main.o: main.c parse.h gcc -Wall -c main.c parse.o: parce.c parse.h gcc -Wall -c parse.c 16

Μεταβλητές <name> = <value>! name (όνοµα): Το όνοµα της µεταβλητής! value (τιµή): ένα ή περισσότερα αρχεία ή ενέργειες από τις οποίες εξαρτάται ο στόχος! Το όνοµα χρησιµοποιείται ως συντοµογραφία για την τιµή! Για να χρησιµοποιηθεί το όνοµα, περικλείεται σε $( ) 17

Παράδειγµα CC = gcc CFLAGS = -Wall -g OBJ = main.o parse.o Makefile all: $(OBJ) $(CC) main.o parse.o -o all main.o: main.c parse.h $(CC) $(CFLAGS) -c main.c parse.o: parce.c parse.h $(CC) $(CFLAGS) -c parse.c 18

Σχόλια! Ξεκινούν από # και τελειώνουν στο τέλος της γραµµής! Μπορούν να τοποθετηθούν (σχεδόν) οπουδήποτε 19

Παράδειγµα CC = gcc CFLAGS = -Wall -g OBJ = main.o parse.o #all object files #rule to create everything all: $(OBJ) $(CC) $(OBJ) -o all main.o: main.c parse.h $(CC) $(CFLAGS) -c main.c parse.o: parce.c parse.h $(CC) $(CFLAGS) -c parse.c Makefile 20

Patterns και αυτόµατες µεταβλητές! Το σύµβολο % µπορεί να χρησιµοποιηθεί στο στόχο ή/και στις εξαρτήσεις) για να αναπαραστήσει µέρος του ονόµατος ενός αρχείου.! Το σύµβολο $* αναπαριστά το κοµµάτι του ονόµατος που αντιστοιχεί στο %! Το σύµβολο $< αναπαριστά το πρώτο αρχείο στη λίστα εξαρτήσεων.! Το σύµβολο $@ αναπαριστά το όνοµα του στόχου. CC = gcc OBJ = foo.o bar.o all: $(OBJ) $(CC) $(OBJ) -o all foo.o: foo.c foo.h $(CC) -c foo.c CC = gcc OBJ = foo.o bar.o all: $(OBJ) $(CC) $(OBJ) -o $@ %.o: %.c %.h $(CC) -c $< bar.o: bar.c bar.h $(CC) -c bar.c 21

Στόχοι που δεν είναι αρχεία! Μπορούµε να δηµιουργήσουµε ένα κανόνα που δεν έχει ως αποτέλεσµα τη µεταγλώττιση αρχείων, αλλά κάποια άλλη πράξη.! Σε αυτή την περίπτωση, ο στόχος δεν είναι όνοµα αρχείου.! Συνήθως χρησιµοποιούµε το χαρακτηρισµό.phony για να αποφύγουµε "συγκρούσεις" µε αρχεία που πιθανώς έχουν ίδιο όνοµα µε το στόχο.! Τυπική εφαρµογή: κανόνας για το σβήσιµο περιττών αρχείων µετά την ολοκλήρωση της µεταγλώττισης..phony: clean clean: rm -rf *.o *.dsym 22

Κανόνες χωρίς εντολές! Ένας κανόνας µπορεί να αποτελείται µόνο από το στόχο και τις εξαρτήσεις. test.%s: test.% a.out./a.out test.$* test: test.1s test.2s test.3s test.4s 23

Σειρά εκτέλεσης all: target1 @echo zero target1: target2 target3 @echo one target2: @echo two Με ποια σειρά θα εµφανιστούν τα µηνύµατα? Οι στόχοι target2 και target3 πρέπει να χτιστούν πριν τον στόχο target1 και ο target1 πριν τον all target3: @echo three ΠΡΟΣΟΧΗ: Δεν υπάρχει κάποιος κανόνας για τη σειρά µε την οποία θα χτιστούν τα target2, target3 24

Παράδειγµα all: target1 @echo zero target1: target2 target3 @echo one Πιθανή έξοδος : two target2: @echo two target3: @echo three 25

Παράδειγµα all: target1 @echo zero target1: target2 target3 @echo one Πιθανή έξοδος: two three target2: @echo two target3: @echo three 26

Παράδειγµα all: target1 @echo zero target1: target2 target3 @echo one Πιθανή έξοδος: two three one target2: @echo two target3: @echo three 27

Παράδειγµα all: target1 @echo zero target1: target2 target3 @echo one target2: @echo two target3: @echo three Πιθανή έξοδος: two three one zero Εναλλακτική έξοδος: three two one zero 28

Εύρεση εξαρτήσεων! gcc -MM <αρχεία> Επιστρέφει µια λίστα εξαρτήσεων για τα δεδοµένα αρχεία, χωρίς να περιλαµβάνονται system headers Χρησιµοποιήστε -Μ για να συµπεριληφθούν system headers 29

Συχνά λάθη! Δεν υπάρχει tab στην αρχή εντολής (ελέγξτε µήπως βάλατε κενά κατά λάθος ή µήπως ο editor που χρησιµοποιείτε αντικατέστησε το tab µε κενά): Makefile:4: *** missing separator. Stop.! Δεν υπάρχει κάποιος στόχος: make: *** No rule to make target 'all'. Stop. 30

Συχνά λάθη! Πολλαπλές "συνταγές" για τον ίδιο στόχο: Makefile:7: warning: overriding commands for target `test1' Makefile:4: warning: ignoring old commands for target `test1' Σε αυτή την περίπτωση εκτελείται όποια συνταγή είναι τελευταία. Σηµείωση: Επιτρέπεται να υπάρχουν πολλαπλοί κανόνες για τον ίδιο στόχο (µε εξαρτήσεις µόνο) Δείτε το manual για περισσότερες πληροφορίες. 31