Make

Извор: ВикиЕТФ

make је услужни програм за аутоматско компајлирање сложених апликација. Он је на вишем нивоу од компајлера зато што он чита правила из Makefile-а и водећи се њима позива компајлер. Такође је довољно паметан да утврди шта је потребно компајлирати а шта не од последње промене, ако су зависности правилно постављене, гледајући време последње промене одредишног фајла и његових зависности.

Садржај

Покретање

Да бисмо рекомпајлирали читав пројекат укуцаћемо једноставну команду make. Та команда тражи да у текућем директоријуму постоји фајл Makefile. Ако он постоји чита списак мета из фајла, и процесира ону која је подразумевана (прва или она коју ми експлицитно одредимо). Make такође може учитавати и друге makefile-ове, ако му то кажемо.

make

Makefile

Makefile ће се састојати од линија следећег облика

    meta... : zavisnosti ...
            komande
            ...
            ...

Напомена: Команде су одвојене <TAB> знаком, make ће се бунити ако их не одвојите и даваће грешке следећег облика.

$ make
Makefile:2: *** missing separator.  Stop.

Мета је обично извршиви или објектни фајл, а зависности су углавном изворни или објектни фајлови. Make само проверава време последње промене мете и да ли је мета старија од својих зависности, када обрађује makefile. Команде које се налазе у makefile-у углавном врше компајлирање. Ако извршавање било које команде у низу врати грешку (резултати команди), make престаје да обрађује makefile.

У наставку следи једноставан пример makefile-а.

    edit : main.o kbd.o command.o display.o \
           insert.o search.o files.o utils.o
            cc -o edit main.o kbd.o command.o display.o \
                       insert.o search.o files.o utils.o
    
    main.o : main.c defs.h
            cc -c main.c
    kbd.o : kbd.c defs.h command.h
            cc -c kbd.c
    command.o : command.c defs.h command.h
            cc -c command.c
    display.o : display.c defs.h buffer.h
            cc -c display.c
    insert.o : insert.c defs.h buffer.h
            cc -c insert.c
    search.o : search.c defs.h buffer.h
            cc -c search.c
    files.o : files.c defs.h buffer.h command.h
            cc -c files.c
    utils.o : utils.c defs.h
            cc -c utils.c
    clean :
            rm edit main.o kbd.o command.o display.o \
               insert.o search.o files.o utils.o

Да би смо поделили једну велику линију на више мањих, додавали смо на крају знак \.

Прва мета edit је подразумевана мета и зависи од свих модула у датом пројекту. Остале мете представљају појединачне модуле који углавном зависе од свог изворног фајла и неких заглавља.

Рекли смо да ако променимо неки фајл, сви фајлови који су зависни од њега се морају поново обрадити. Узмимо на пример да смо променили search.c фајл и додали неке нове опције за тражење у нашем едитору. Ако извршимо само make онда ћемо прво да обрадимо edit мету која је подразумевана, make ће да провери да ли је било промена у његовим зависностима, а пошто смо променили фајл search.c и његово време задње промене је новије него фајла који представља мету, make ће извршити команде које на крају требају да направе нову мету search.o. Мораће такође и да поново изврши команду која задовољава мету edit, и на крају ћемо добити програм edit који је поновно линкован са својим зависностима (објектним фајловима).

На крају имамо и такозвану лажну мету (meta target) која обавља неки користан посао за нас али нема међузависности. Ове мете могу да обављају чишћење старих објектних фајлова, као што је овде случај, деинсталирање или инсталирање програма,... Треба да водимо рачуна јер ако постоји у текућем директоријуму фајл са именом clean команде ове мете се неће никад извршавати. Због ових ствари најправилније је да мету clean дефинишемо да зависи од специјалне мете .PHONY.

    .PHONY : clean
    clean :
            -rm edit $(objects)

На почетку rm команде смо такође ставили "-", то смо урадили због тога да make игнорише повратну вредност коју враћа команда rm. Због тога што make престаје са обрадом makefile-а ако иједна од мета не може правилно да се обради, што је и логично јер како ћемо да повежемо читав програм ако његове међузависности не могу правилно да се обраде.

Ако мењамо више фајлова и имамо грешке у више њих, када касније пробамо да компајлирамо пројекат make ће нам пријавити грешке само за један од њих, који се први обради. Ако желимо да имамо све грешке на гомили, онда можемо да проследимо make програму опцију -k (дужи облик: --keep-going).

Променљиве

Променљивама можемо даље да поједноставимо овај пример.

    objects = main.o kbd.o command.o display.o \
              insert.o search.o files.o utils.o
    
    edit : $(objects)
            cc -o edit $(objects)
    main.o : main.c defs.h
            cc -c main.c
    kbd.o : kbd.c defs.h command.h
            cc -c kbd.c
    command.o : command.c defs.h command.h
            cc -c command.c
    display.o : display.c defs.h buffer.h
            cc -c display.c
    insert.o : insert.c defs.h buffer.h
            cc -c insert.c
    search.o : search.c defs.h buffer.h
            cc -c search.c
    files.o : files.c defs.h buffer.h command.h
            cc -c files.c
    utils.o : utils.c defs.h
            cc -c utils.c
    .PHONY : clean
    clean :
            rm edit $(objects)

Такође постоји специјална променљива .DEFAULT_GOAL са којом експлицитно можемо да кажемо која мета је подразумевана.

.DEFAULT_GOAL = edit

Везе

Спољашње везе

Добављено из „http://wiki.etf.rs/wiki/Make
Личне алатке
Именски простори
Варијанте
Акције
Навигација
Алатке