Makefile tai specifinis instrukcijų rinkinys kuris gali pats paleisti kitas instrukcijas ir pats save ir panašiai. Naudojamas automatizuoti programų kūrybą ir gal dar ką nors. Ši žinutė skirta man pačiam, nes atmintis labai blogai dirba. O jei kitiems tiks, ar bus kokių nors patarimų- welcome.
- PROJECT = $(notdir $(CURDIR))
- SRC = $(wildcard *.c)
- BDIR = build
- OBJ = $(patsubst %.c, $(BDIR)/%.o, $(SRC))
- .PHONY: clean all hex
- #phony - komandos (jei netycia sutaptu su failo pavadinimu)
- all:
- @echo "all" $(PROJECT)
- #all pasileidzia kai paleidziamas make be komandu
- levas:
- @echo $(SRC) $(OBJ)
- #pirmas iki: objektas komanda arba failas, antras -kokiems failams galioja
- $(BDIR)/%.o: %.c
- echo $@
- mkdir -p $(BDIR)
- cp $< $@
- objects: $(OBJ)
- elf: $(BDIR)/$(PROJECT).elf
- #sutrumpinta komanda, kad nereiketu ivesti pilno failo pavadinimo
- $(BDIR)/$(PROJECT).elf: $(OBJ)
- cat $(OBJ) > $(BDIR)/$(PROJECT).elf
- clean:
- rm -f $(BDIR)/*.o $(BDIR)/*.hex $(BDIR)/*.bin $(BDIR)/*.elf
Komentarai:
Eilutės 1-4: paprasčiausi kintamieji ir kelios operacijos su jais. 1) kintamasis “PROJECT” pasidaro naudojamo folderio pavadinimu, 2) “SRC” – visų failų su išplėtimu masyvas. 3) paprasčiausias priskyrimas. 4) vieno masyvo konvertavimas į kitokį.
Eilutė 8: make visiškai nesvarbu ar dirbama su failais, komandomis ar “kažkokiais objektais”. Jei folderyje bus failas “clean” ir jis nekis, make pasitikrins tai ir nebevykdys komandos. Phony pasako, kad čia ne failas.
Eilutė 11: “all” pasileidžia, kai make paleidžiamas be parametrų, čia kaip “main()” funkcija.
Eilutė 15: komanda gali vadintis bet kaip. Tik turi užsibaigti dvitaškių. O jos atliekamos komandos turi būti “atitrauktos” per tabą.
Eilutė 20: komanda gali būti failo pavadinimas, kad ir iš komentaro, o antras žodis po dvitaškio kaip ir filtras kokius failus galima naudoti. Čia biški nesuprantu.
Eilutė 25: komanda “daryk objektus” pasiima visus būsimus “O” failus ir generuoja pagal 20 eilutę iš “C” failų. Jei “O” failai jau sugeneruoti ir jų “šaltinis” toks pats, failai ignoruojami.
Eilutė 27: Kad nereikėtų nurodyti kokį “ELF” failą generuojam, čia parašom supaprastinimą.
Eilutė 30: Kai reikia generuoti kokį “ELF“, kad ir iš 27 eilutės, naudojam tokią instrukciją ir gaminam iš “O” failų. Savo ruožtu, jei nėra “O” failų, tai juos generuojam iš “C” failų (20 eilutė). Ir kartu stebim, ar kas nepasikeitė
Eilutė 33: Paprasčiausiai ištrinam viską ką sugeneruojam.
Atrodo viskas siaubingai ir keistai. Ir net nesuprantu kaip tai veikia. Tačiau teisingai parašytas makefile viską labai palengvina, nes nebereikia galvoti, kas ten su kuo jungiasi ir kas iš ko darosi. Iš principo tai gana specifinė “skripto” kalba.
P.S. Jei dirbat su windows ir jus užkniso, kad kiekvieną kartą paspaudus ant “makefile” windows klausia su kokia programa ją atidaryti, darykite taip:
assoc .="No_Extension" ftype "No_Extension"="C:\WinAVR\pn\pn.exe" "%1"
Tiktai “path” iki savo redaktoriaus pasikeiskit.
DIIIIDELIS Ačiū, Levai 🙂
Kažkada ir aš bandžiau nagrinėtis kaip make file veikia. Ir net visokių specifinių modifikacijų buvau prisidaręs, kurių veikimo iki galo taip ir neperpratau 🙂 Paskutiniu metu pagrinde dirbu su STM Cube IDE, tai su make failais terliotis nebereikia. Bet kartas nuo karto dar tenka senuose Atmel projektuose “pasikapstyti”, tai Tavo sukaupta patirtis gali ir praversti.