„GNU Make“ yra įrankis, padedantis generuoti vykdomas programas iš šaltinio kodo ir apdoroti kitus ne šaltinio failus iš projekto. „Make“ gauna vykdomųjų failų kūrimo ir kitų šaltinio failų apdorojimo iš failo, vadinamo a logiką makefile arba a „Makefile“.
Kodėl verta?
-
„Make“ yra faktinis įrankis, leidžiantis kurti vykdomąsias programas iš šaltinio kodo atvirojo kodo pasaulyje.
-
„Make“ suteikia galutiniams vartotojams galimybę kurti vykdomąsias programas nežinant techninės informacijos, kaip jas kurti.
-
Visa išsami informacija apie tai, kaip kurti vykdomuosius ir apdoroti ne šaltinio failus, yra išvardyti makefile - taigi procesą gali pakartoti visi žmonės ar sistemos, bandantys sukurti projektą.
-
Jei kodų bazė yra labai didelė, tai užima daug laiko ir sudėtinga sukurti vykdomąjį failą nuo nulio, kai šaltinio kodo pokytis yra labai mažas. Make rūpinasi tuo. Jis seka, kurie failai yra pakeisti, ir atitinkamai išsprendžia priklausomybę, kad būtų galima atkurti konkrečią programos dalį.
-
„Make“ yra programavimo kalbos agnostika. Nesvarbu, kokią programavimo kalbą ar kurią jų dialektą vartojate. „Makefile“ yra apvalkalo komandų tekstinis failas, struktūriškai sutvarkytas su priklausomybe ir kita logika, skirta programai kurti ir kitiems ne šaltinio failams tvarkyti. Kadangi tai yra daugybė „shell“ komandų, ji gali būti vykdoma bet kur, kur vykdoma „shell“ komanda. Pagal numatytuosius nustatymus „Windows“ nevykdo „Linux shell“ komandų, tačiau tai galite padaryti naudodami specializuotą „Windows“ versiją.
-
Kuriant vykdomąsias programas sukuriama daug tarpinių failų, kurių nereikia būti, kai pastatas bus baigtas. „Make“ automatiškai ištrina tuos failus. Tai padeda išlaikyti aplinką švarią ir sutaupo daug brangaus laiko.
„Make“ diegimas
Norint sukurti programas, nepakanka vien gaminti. Norint kurti programas iš šaltinio, jūsų sistemoje turi būti įdiegti kompiliatoriai ir kiti įrankiai. Taigi, mums reikalingas visas kūrimo įrankių rinkinys.
Norėdami kompiliuoti šaltinius „Linux“, Debian'o sistemose yra paketas, vadinamas „build-essential“ (pvz., „Build-essential“).g. „Ubuntu“, „Linux Mint“ ir kt.) Ir „Kūrimo įrankiai“ „Red Hat“ ir „CentOS“.
Norėdami tai įdiegti sistemose „Debian“:
„apt-get install build-essential“
Norėdami tai įdiegti „CentOS“ ir „Red Hat“ paleisti:
yum groupinstall „Kūrimo įrankiai“
Darbo su „Makefile“ pradžia
Pradėkime rašydami a Labas pasauli programa su C programavimo kalba.
Pagrindinė mūsų C programos funkcija bus viduje pragaras.c. Failo turinys turėtų atrodyti taip:
# įtrauktiint main () my_fun (); grąžinti 0;
Šis kodas apima antraštės failą hellofun.h, kuriame yra funkcijos pavadinimu hello_fun () deklaracija. „Hellofun“ turinys.h yra:
anuliuoti my_fun ();
My_fun () apibrėžimas gyvena hellofun viduje.c:
# įtraukti# įtraukti void my_fun () printf ("Sveikas pasaulis!\ n "); grąžinti;
Tai labai paprasta programa, kurią galėtume sukompiliuoti naudodami gcc tik su viena komandų eilute. Tačiau realaus gyvenimo programos nėra tokios paprastos ir tokios mažos. Viskas greitai tampa sudėtinga. Žemiau aš parašysiu reikiamą makefile scenarijų, kad galėčiau sudaryti šią „Hello World“ programą. Kitose dalyse paaiškinsiu skirtingas jo dalis.
hellomain: hellomain.c hellofun.c gcc -o labas hellomain.c pragaras.c-Aš.
Laikykite šį kodą faile, pavadintame makefile (be failo plėtinio). Įdėkite failą į katalogą, kuriame yra C failai. Šiame kataloge nukreipkite komandinę eilutę. Komandinėje eilutėje parašykite „make“ ir paspauskite „Enter“. Dabartiniame kataloge bus sukurtas vykdomasis failas, vadinamas labas. Rezultatą galite patikrinti vykdydami vykdomąjį failą naudodami šią komandą.
./Sveiki
Išėjimai:
Labas pasauli!
Taisyklės, tikslai ir priklausomybės
Makefile scenarijus yra taisyklių rinkinys. Taisyklės nurodo, kaip sukurti tikslą arba išvestį iš šaltinio ar kitų failų. Taisyklė taip pat nurodo taikinio priklausomybę. Pirmiausia reikia vykdyti priklausomybės taisykles, atsižvelgiant į tai, ar tai jau apdorota, žiūrint į laiko žymas. Mūsų pavyzdyje makefile aukščiau, mes turime taisyklę su taikiniu, pavadintu pragaras ir jo priklausomybės. Taikinio vardas yra atskiriamas dvitaškiu iš priklausomybės sąrašo. „Shell“ komandos, kurios bus vykdomos, yra išvardytos šioje eilutėje. Korpuso komandos turi prasidėti tabuliavimo ženklu.
Jei komandoje make nenurodysite jokio parametro, bus įvykdytas pirmasis taikinys. Mūsų pavyzdyje nenurodėme jokio parametro ir turėjome pragaras kaip pirmasis ir vienintelis taikinys.
Kintamieji
Kintamasis yra puikus būdas vieną kartą parašyti vertę ir naudoti jas daugybę kartų, pakartojant vertę dar ne kartą. Tai padeda mums išsaugoti savo kodą DRY (nekartokite savęs). Jei kada nors reikia pakeisti tam tikrą viso scenarijaus vertę, tiesiog reikia pakeisti tai vienoje vietoje, kad atspindėtumėte pokyčius visur, jei naudojate kintamąjį.
Savo pavyzdyje mes panaudojome gcc kaip kompiliatorius, bet mums gali tekti pakeisti kompiliatorių į kažką kitą. Taigi, kompiliatoriaus vardą galime laikyti kintamajame. Be to, kompiliatoriaus vėliavas galime laikyti kitame kintamajame, kad galėtume tai pakartotinai naudoti. Norėdami nustatyti kintamojo vertę, mes naudojame lygybės ženklą (=) ir norėdami perskaityti tą kintamąjį, mes naudojame $ (kintamo_pavadinimas).
CC = gcc CFLAGS = -I. hellomain: hellomain.c hellofun.c $ (CC) -o labas hellomain.c pragaras.c $ (CFLAGS)
Aplinkos valymas
Mums dažnai gali tekti valyti aplinką. Jei norime, kad kiekvienas mūsų projekto kūrinys būtų atstatytas nuo nulio, turime jį išvalyti. Mūsų paprastame pavyzdyje vienintelis sugeneruotas failas yra Sveiki vykdomas. Neištrindami to rankiniu būdu, galime tai ištrinti naudodami „make“. Taigi, mes galime sukurti tam taisyklę ir įvardyti tikslą kaip švarus.
CC = gcc CFLAGS = -I. hellomain: hellomain.c hellofun.c $ (CC) -o labas hellomain.c pragaras.c $ (CFLAGS) švarus: rm labas
„Shell“ komanda „clean target“ yra tik sena „shell“ komanda rm. Dabar iš komandinės eilutės vykdykite:
padaryti švarų
Pažvelkite į dabartinį katalogą, kad pamatytumėte, jog Sveiki vykdomojo failo nebėra.
Išplėsdami mūsų pavyzdį, kad išspręstume daugiau problemų
Savo paprastame „labo pasaulio“ kompiliavimo pavyzdyje turime problemą, kurios dar neišsprendėme. pragaras taikinys žiūri hellomianas.c ir pragaras.c failų laiko žymos, kai kitą kartą bandysite jį sukompiliuoti padaryti arba padaryti pragarą. Taigi, jei pakeisite bet kurį iš šių dviejų failų, jie bus perkompiliuoti. Bet, jei pasikeisite pragaras.h tada jis nebus kompiliuojamas. Tai netikėta!
Vėlgi, mes praleidome tarpinį lygį. Mes negeneravome objekto failų ir tiesiogiai sugeneravome vykdomąjį failą. Tačiau užkulisyje objekto failai sukuriami laikinajame kataloge ir ištrinami. Prieš kurdami vykdomąjį failą, norime sugeneruoti objekto failus. Šį kartą pagrindinį taikinį įvardijame kaip visi
visi: hellomain.o pragaras.o gcc hellomain.o pragaras.o-sveiki hellomainai.o: hellomain.c hellofun.h gcc -I. -c pragaras.c hellofun.o: hellofun.c hellofun.h gcc -I. -c hellofun.c švarus: rm -rf *.o rm labas
Dar kartą paleiskite komandą make, kad sužinotumėte, ar jūsų programa sėkmingai sukurta, ar ne. Norėdami patikrinti rezultatą, paleiskite „Hello“ vykdomąjį failą. Pažvelkite į dabartinį katalogą ir pamatysite, kad objektų failai yra sukurti. Mes pridėjome dar vieną eilutę prie švaraus tikslo, kad išvalytume objektų failus. Šis makefile scenarijus padės iš naujo sukompiliuoti „Hello world“ programą, net jei pragaras.h failas pakeistas.
Išvada
„Make“ yra viena iš svarbiausių „Linux“ vartotojų ir programuotojų priemonių. Jei esate galutinis vartotojas, žinojimas apie „make“ padės jums išspręsti daugelį sugadintų dalykų jūsų „Linux“ pasaulyje. Jei esate programuotojas, tiesiog negalite nueiti rašydami kodą ir leiskite savo vartotojams suprasti, kaip sukompiliuoti tą šaltinio kodą vykdomiesiems failams. Galutiniams vartotojams turite sukurti makefile scenarijų, kad jie nežaistų tam tikro spėjimo žaidimo ir sukompiliuotų jūsų šaltinį į vykdomuosius.
Literatūra
Pagrindinis „GNUMake“ projekto puslapis
GNU Padaryti dokumentaciją