de Alex Nadalin

Makefiles 101: cum se utilizează make ca instrument de automatizare a sarcinilor

Makefiles 101 cum se utilizeaza make ca instrument de automatizare
Fotografie de Agto Nugroho pe Unsplash

Se pare că dezvoltatorii se tem să le folosească make pe măsură ce o asociază cu experiența dureroasă a compilării lucrurilor de la zero – temutul ./configure && make && make install.

O parte din această frică se datorează descrierii a ceea ce face (1) face:

Scopul utilitarului make este de a determina automat ce piese ale unui program mare trebuie recompilate și de a emite comenzile pentru a le recompila.

Free Software Foundation Paginile Man Linux

Nu toată lumea știe că marca poate fi ușor utilizată pentru a gestiona sarcinile din proiectele dvs. În acest articol, aș dori să împărtășesc o scurtă introducere despre cum Makefiles mă ajută să automatizez unele sarcini în activitățile mele de zi cu zi. Acest scurt ghid se va concentra pe utilizarea make-ului ca instrument de automatizare pentru sarcini, mai degrabă decât un instrument pentru compilarea codului.

Executarea sarcinilor

Să începem prin a crea pur și simplu un Makefileși definirea unei sarcini de executat:

task:  date

Dacă alergi make task veți întâlni următoarea eroare:

/tmp ᐅ make taskMakefile:2: *** missing separator.  Stop.

Și asta pentru că Makefiles utilizează file pentru a indenta codul. Să ne actualizăm exemplul folosind file mai degrabă decât spații și … Voilà.

/tmp ᐅ make taskdateFri Jun 15 08:34:15 +04 2018

Ce fel de vrăjitorie este asta? Bine, make ați înțeles că doriți să rulați secțiunea task din makefile dvs. și a rulat codul (date) în secțiunea respectivă într-un shell, scoțând atât comanda, cât și ieșirea acesteia. Dacă doriți să omiteți ieșirea comenzii care se execută, puteți pur și simplu să o prefixați cu un @ semn:

task:  @date

Rularea comenzii make din nou:

/tmp ᐅ make taskFri Jun 15 08:34:15 +04 2018

Prima sarcină dintr-un Makefile este Mod implicit una, adică putem fugi make fără niciun argument:

/tmp ᐅ make       Fri Jun 15 08:37:11 +04 2018

Rularea sarcinilor suplimentare

Puteți adăuga sarcini suplimentare în Makefile și să le cheme cu make $TASK:

task:  @datesome:  sleep 1  echo "Slept"thing:  cal

Rularea comenzii make din nou:

/tmp ᐅ make thingcal     June 2018        Su Mo Tu We Th Fr Sa                  1  2   3  4  5  6  7  8  9  10 11 12 13 14 15 16  17 18 19 20 21 22 23  24 25 26 27 28 29 30

Executarea sarcinilor într-o anumită ordine

De multe ori veți dori să executați o sarcină înainte de cea curentă. Gândiți-vă la asta ca la before sau after cârlige în testele dvs. automate. Acest lucru se poate face prin specificarea unei liste de sarcini imediat după numele sarcinii dvs.:

task: thing some  @date...

Rularea comenzii make din nou:

/tmp ᐅ make taskcal     June 2018        Su Mo Tu We Th Fr Sa                  1  2   3  4  5  6  7  8  9  10 11 12 13 14 15 16  17 18 19 20 21 22 23  24 25 26 27 28 29 30
sleep 1echo "Slept"SleptFri Jun 15 08:40:23 +04 2018

Utilizarea variabilelor cu marca

Definirea și utilizarea variabilelor este destul de simplă:

VAR=123
print_var:        echo ${VAR}...

Rularea comenzii make din nou:

/tmp ᐅ make print_var    echo 123123

Dar atenție, deoarece variabilele dvs. shell nu vor funcționa din cutie:

print_user:        echo $USER

Rularea comenzii make din nou:

/tmp ᐅ make print_user   echo SERSER

Va trebui să le scapi cu oricare ${VAR} sau $$VAR.

Trecerea steagurilor este, de asemenea, puțin diferită de ceea ce ați putea fi obișnuit. Sunt poziționate ca steaguri, dar utilizează aceeași sintaxă ca variabilele de mediu:

print_foo:  echo $$FOO

Rularea comenzii make din nou:

/tmp ᐅ make print_fooecho $FOO
/tmp ᐅ make print_foo FOO=barecho $FOObar

Faceți și coaja

5.3.1 Choosing the Shell------------------------
The program used as the shell is taken from the variable `SHELL'.  If this variable is not set in your makefile, the program `/bin/sh' is used as the shell.

Make va folosi sh pentru a executa cod într-o sarcină. Aceasta înseamnă că unele lucruri s-ar putea să nu funcționeze, deoarece probabil că utilizați o sintaxă specifică bash-ului. Pentru a comuta, puteți specifica pur și simplu SHELL variabil. În cazul nostru, am vrea să folosim SHELL:=/bin/bash.

După cum s-a văzut mai înainte, uneori va trebui să utilizați o sintaxă personalizată ciudată pentru a obține o comandă shell obișnuită make. La fel ca variabilele care trebuie evitate cu un $$ sau ${...}, va trebui să utilizați shell atunci când se utilizează substituirea comenzii:

subshell:  echo $(shell echo ${USER})

Rularea comenzii make din nou:

/tmp ᐅ make subshellecho alexalex

Nu mă crede? Încercați să eliminați shell instrucțiune. Iată ce veți obține:

/tmp ᐅ make subshellecho

Concluzie

Mai sunt multe make poate face și atât de multe lucruri ciudate pe care ar trebui să le aflați pentru a reduce WPS (WTF pe secundă) atunci când lucrați cu acesta. ?

Asta nu neagă faptul că make este un instrument extrem de util care ne permite să automatizăm fluxurile de lucru cu ușurință (fără a fi nevoie să configurați conducte foarte complicate) prin scrierea liniilor separate de tab-uri cu o grămadă de comenzi shell.

Publicat inițial la odino.org (15 iunie 2018).
Poți să mă urmărești mai departe Stare de nervozitate – ranturile sunt binevenite! ?