This shows you the differences between two versions of the page.
uso:laboratoare:laborator-06:make-simple-automation [2021/11/09 12:18] liza_elena.babu |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Introducere în utilitarul Make și fișiere Makefile ====== | ||
- | |||
- | În secțiunile anterioare, am compilat fișiere cod sursă C folosind compilatorul GCC. Dezvoltarea unui program este un proces //continuu//, nu scriem tot codul dintr-o singură iterație și de multe ori ajungem să îl modificăm pe parcurs. Vrem să testăm schimbările aduse în program. Pentru aceasta trebuie să //recompilăm// fișierele pe care le-am modificat și să creăm un nou executabil. | ||
- | |||
- | Automatizarea procesului de compilare ne ajută să fim eficienți atunci când dezvoltăm un proiect: * În loc să dăm de fiecare dată toate comenzile pentru recompilarea fișierelor, putem să dăm o singură comandă care să le facă pe toate. * Putem să evităm compilarea unor fișiere pe care nu le-am modificat de la ultima compilare, astfel salvând mult timp. Acest proces se numește //build automation//. Există mai multe soluții de build automation((Exemple de soluții de build automation sunt [[https://maven.apache.org|Maven]], [[https://ant.apache.org|Ant]], [[https://gradle.org|Gradle]]. | ||
- | |||
- | https://en.wikipedia.org/wiki/Build_automation | ||
- | |||
- | https://www.softwaretestinghelp.com/best-build-automation-software-tools/ | ||
- | )). În aceast laborator vom folosi utilitarul [[https://linux.die.net/man/1/make|Make]] împreună cu fișiere [[https://www.gnu.org/software/make/manual/make.html#Makefiles|Makefile]] ca să automatizăm procesul de compilare. | ||
- | |||
- | În secțiunile următoare vom vedea cum funcționează utilitarul ''%%make%%'' și cum arată un fișier Makefile. După, vom crea un fișier Makefile pentru un proiect dat. | ||
- | |||
- | ===== Folosirea unui Makefile existent ===== | ||
- | |||
- | În această secțiune vom compila programul [[https://rextester.com/WYT71966|Hangman]] folosind un fișier Makefile. | ||
- | |||
- | Întrăm în directorul ''%%~/uso-lab/labs/04-appdev/support/simple-make%%'' folosind comanda ''%%cd%%'': | ||
- | |||
- | <code bash> | ||
- | student@uso:~$ cd ~/uso-lab/labs/04-appdev/support/simple-make | ||
- | student@uso:~/.../04-appdev/support/simple-make$ ls | ||
- | hangman.c Makefile | ||
- | </code> | ||
- | Avem în director un fișier cod sursă C, ''%%hangman.c%%'', și un fișier Makefile existent, astfel că putem utiliza comanda ''%%make%%''. Aceasta va rula scriptul scris în Makefile, care, în cazul nostru, urmărește compilarea fișierului hangman.c. | ||
- | |||
- | <code bash> | ||
- | student@uso:~/.../04-appdev/support/simple-make$ make | ||
- | gcc -c hangman.c | ||
- | gcc -o hangman hangman.o | ||
- | student@uso:~/.../04-appdev/support/simple-make$ ls | ||
- | hangman hangman.c hangman.o Makefile | ||
- | </code> | ||
- | Comanda ''%%make%%'' a rulat, de fapt, 2 comenzi: | ||
- | |||
- | - De //compilare//: ''%%gcc -c hangman.c%%'', comandă prin care am creat fișierul obiect ''%%hangman.o%%'' | ||
- | - De //legare//: ''%%gcc -o hangman hangman.o%%'', comandă prin care am creat executabilul ''%%hangman%%''. | ||
- | |||
- | Practic, scriind doar comanda ''%%make%%'', am trecut fișierul ''%%hangman.c%%'' prin toate etapele compilării și am obținut executabilul final. | ||
- | |||
- | Rulăm executabilul ''%%hangman%%'' ca să vedem că funcționează, ca în imaginea de mai jos: | ||
- | |||
- | {{:uso:laboratoare:laborator-04:run-hangman.gif?700}} | ||
- | |||
- | ===== Înțelegerea formatului Makefile ===== | ||
- | |||
- | În secțiunea anterioară, ''%%Folosirea unui Makefile existent%%'', am folosit fișierul ''%%Makefile%%'' ca să compilăm programul Hangman. Ca să putem crea un Makefile pentru un proiect al nostru, trebuie să înțelegem formatul fișierului Makefile. În această secțiune vom folosi fișierul Makefile pe care l-am folosit anterior ca suport. | ||
- | |||
- | Fișierul ''%%Makefile%%'' folosit la programul Hangman are următorul conținut: | ||
- | |||
- | <code > | ||
- | all: hangman | ||
- | |||
- | hangman: hangman.o | ||
- | gcc -o hangman hangman.o | ||
- | |||
- | hangman.o: hangman.c | ||
- | gcc -c hangman.c | ||
- | |||
- | clean: | ||
- | rm -rf *.o hangman | ||
- | </code> | ||
- | Liniile din fișier sunt de două tipuri: | ||
- | |||
- | 1. **Regulă**, care are formatul ''%%regulă: <dependență>%%'' (''%%all: hangman%%'' sau ''%%clean:%%''). Regula trebuie să existe, dependența este opțională. O //regulă// din fișierul Makefile este, de fapt, un nume asociat unui unei comenzi. | ||
- | |||
- | <code bash> | ||
- | student@uso:~/support/simple-make$ make clean | ||
- | rm *.o hangman | ||
- | student@uso:~/support/simple-make$ ls | ||
- | hangman.c Makefile | ||
- | </code> | ||
- | 2. Observăm deci că putem rula ''%%make + <nume regulă>%%'', dar și ''%%make%%'' simplu. Utilizând prima formă, din fișierul Makefile se va executa doar regula dorită, în cazul nostru fiind codul specific regulii 'clean'. Utilizând a doua formă, simplă, se va apela implicit prima regulă găsită din fișierul Makefile, în cazul nostru regula 'all'. Aceasta la rândul ei poate trimite către una sau mai multe reguli care să fie executate în succesiune, în cazul nostru urmând regula 'hangman'. | ||