makefile sintaksisi. Mənbə mətnləri olan faylların qovluqlara "paylanması". Bir çox mənbədən tərtib

make proqramların avtomatik qurulması üçün bir yardım proqramıdır. Dəyişiklikləri izləməyə imkan verir mənbə kodu proqramı və bütün layihəni deyil, yalnız dəyişmiş və ya asılı olan faylları tərtib edir dəyişikliklər edilib. Böyük layihələr üçün bu, əhəmiyyətli vaxta qənaət edir.

Bu yazıda sizə makefile yaratmağın yollarını izah etməyə çalışacağam.

Varsayılan olaraq, qurma qaydaları Makefile adlı fayldan oxunur.

Makefile strukturu aşağıdakı kimi təqdim edilə bilər:

MƏQSƏD: ASLILIQ FƏALİYYƏTİ

Ancaq adətən daha çox istifadə olunur mürəkkəb qaydalar, Məsələn:

MƏQSƏD: MƏQSƏD1 MƏQSƏD2 FƏALİYYƏT MƏQSƏD1: AŞILILIQ1 FƏALİYYƏT1 MƏQSƏD2: AŞILILIQ2 FƏALİYYƏT2

MƏQSƏD FƏALİYYƏT nəticəsində əldə etdiyimiz şeydir. Bu, sabit diskdə heç bir obyektlə əlaqəsi olmayan bir fayl, kataloq və ya sadəcə mücərrəd TARGET ola bilər. Hədəf adından sonra iki nöqtə qoyulur. make əmrini parametrlərsiz işlətdikdə tapılan ilk qayda yerinə yetiriləcək. Başqa bir qaydanı yerinə yetirmək üçün onu make əmrinə təyin etməlisiniz

MƏQSƏD 2 edin

AŞILILIQ MƏQSƏDİMİZDƏN asılıdır. Bunlar fayllar, kataloqlar və ya digər HƏDƏFLƏR ola bilər. Make MƏQSƏDİN dəyişmə tarixini və vaxtını və məqsədin asılı olduğu obyektləri müqayisə edir. Məqsədin asılı olduğu obyektlər məqsəd yaradılandan gec dəyişdirilibsə, o zaman AKSİYA yerinə yetiriləcək. TARGET fayl və ya qovluq adı deyilsə, ACTION həmçinin həyata keçirilir.

ƏMƏLİYYAT icra edilməli olan əmrlər toplusudur. Əmrlərdən əvvəl nişan simvolu olmalıdır. Tab simvolu əvəzinə boşluqlar daxil edilərsə, tərtib zamanı səhv mesajı göstərilir:

Makefile:13: *** ayırıcı yoxdur. Dayan.

Makefile:13: *** ayırıcı yoxdur. Dayan.

Makefile nümunəsi:

hamısı: test.elf test.elf: test1.o test2.o gcc -o test.elf test1.o test2.o test1.o test1.c gcc -c test1.c -o test1.o test2.o test2.c gcc -c test2.c -o test2.o

Son misalı nəzərdən keçirək:
Hər şey birinci ona görə icra olunur Makefile-nin başlanğıcındadır. hamısı test.elf-dən asılıdır və hamısı adlı fayl və ya kataloq yoxdur, ona görə də o, həmişə test.elf adlı hədəfi yoxlayacaq.

test.elf test1.o və test2.o-dan asılıdır, ona görə də əvvəlcə hədəf test1.o yoxlanılacaq, sonra test2.o

Hədəf test1.o yoxlanılarkən test1.o və test1.c faylının modifikasiya tarixi və vaxtı müqayisə edilir. Əgər test1.o faylı mövcud deyilsə və ya test1.c faylı test1.o-dan gec dəyişdirilibsə, gcc -c test1.c -o test1.o əmri yerinə yetiriləcək.

Hədəf test2.o eyni şəkildə yoxlanılacaq.

Bundan sonra test.elf faylı ilə test1.o test2.o fayllarının dəyişdirilmə tarixi və vaxtı müqayisə edilir. test1.o və ya test2.o daha yenidirsə, gcc -o test.elf test1.o test2.o əmri yerinə yetiriləcək

Bu yolla test1.c və test2.c fayllarında dəyişikliklər izlənilir.

P/S Ümid edirəm ki, bu qeyd makefile yaradılmasını asanlaşdıracaq, lakin hər hansı bir sualınız olarsa, şərhlərdə yazın, cavab verməyə çalışacağam.

Çox vaxt, asılılıqları və yeniləmələri nəzərə alaraq Linux OS-də bir layihə qurmaq kommunal tərəfindən həyata keçirilir. etmək, bunun üçün əvvəlcədən formatlaşdırılmış qurma skriptindən istifadə edir. Biz əvvəlki məqalələrdə dəfələrlə bu yardım proqramının köməyinə müraciət etmişik və bu məqalə yalnız yardım proqramından istifadə məsələlərinə həsr olunacaqdır. etmək.

faydalılıq etmək

Utility etmək böyük bir layihənin hansı hissələrinin dəyişdiyini və yenidən tərtib edilməli olduğunu avtomatik müəyyən edir və bunun üçün lazım olan hərəkətləri yerinə yetirir. Lakin, əslində, make-in əhatə dairəsi yalnız proqramların qurulması ilə məhdudlaşmır, digər fayllar dəyişdirildikdə bəzi faylların avtomatik olaraq yenilənməsi lazım olan digər problemləri həll etmək üçün də istifadə edilə bilər.

Utility etmək müxtəlif əməliyyat sistemləri üçün mövcuddur və tətbiqetmə xüsusiyyətlərinə görə "doğma" tətbiqlə yanaşı, bir çox əməliyyat sistemləri GNU tətbiqinə malikdir. gmake, və bəzi əməliyyat sistemlərində, məsələn, Solaris-də bu tətbiqlərin davranışı əhəmiyyətli dərəcədə fərqlənə bilər. Buna görə də, quraşdırma skriptlərində xüsusi bir yardım proqramının adını qeyd etmək tövsiyə olunur. Linux ƏS-də bu iki ad aşağıda göstərildiyi kimi simvolik keçid vasitəsilə həyata keçirilən sinonimdir:

$ ls -l /usr/bin/*make lrwxrwxrwx 1 kök kök 4 28 oktyabr 2008 /usr/bin/gmake -> make -rwxr-xr-x 1 kök kök 162652 25 may 2008 /usr/bin/make ... $ make --versiya GNU Make 3.81 ...

Varsayılan olaraq, qurma skripti faylının adı belədir Makefile. Utility etmək təmin edir tam montaj müəyyən edilmişdir məqsədlər skriptdə mövcuddur, məsələn:

$ etmək $ təmiz etmək

Hədəf açıq şəkildə göstərilməyibsə, o zaman birinci ardıcıl skript faylında hədəf. Siz həmçinin montaj üçün istifadə olunacaq hər hansı digər skript faylını təyin edə bilərsiniz:

$ make -f Makefile.my

Ən sadə fayl Makefile iki növ sintaktik konstruksiyadan ibarətdir: məqsədlər və makrotəriflər. Hədəf təsviri üç hissədən ibarətdir: hədəf adı, asılılıqların siyahısı və hədəfi qurmaq üçün tələb olunan qabıq əmrlərinin siyahısı. Hədəf adı yaradılmalı olan faylların boş olmayan siyahısıdır. Asılılıq siyahısı - hədəfin qurulduğundan asılı olaraq faylların siyahısı. Hədəf adı və asılılıqların siyahısı hədəf başlığını təşkil edir, bir sətirdə yazılır və iki nöqtə (":") ilə ayrılır. Əmrlərin siyahısı buradan yazılır növbəti sətir, və bütün əmrlər başlayır tələb olunan nişan simvolu ilə. Çox mətn redaktorları tab simvollarını boşluqlarla əvəz etmək üçün konfiqurasiya edilə bilər. Bu faktı nəzərə almağa və redaktə etdiyiniz redaktoru yoxlamağa dəyər Makefile, nişanları boşluqlarla əvəz etmir, çünki bu problem olduqca tez-tez baş verir. Əmr siyahısı ardıcıllığında nişanla (başqa bir əmr) və ya " ilə başlamayan istənilən sətir # " (şərh) - cari məqsədin tamamlanması və yenisinin başlanğıcı hesab olunur.

Utility etmək standart dəyərləri olan bir çox daxili parametrlərə malikdir, bunlardan ən vacibi şəkilçilərin işlənməsi qaydaları, həmçinin daxili mühit dəyişənlərinin tərifləridir. Bu verilənlər bazası adlanır etmək və belə baxıla bilər:

$ make -p >make.suffix make: *** Heç bir hədəf göstərilməyib və makefile tapılmadı. Dayan. $ cat make.suffix # GNU Make 3.81 # Müəlliflik hüququ (C) 2006 Pulsuz Proqram təminatı fondu, Inc. ... # Database Make, çap 14 aprel 14:48:51 2011 ... CC = cc LD = ld AR = ar CXX = g++ COMPILE.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $ ( TARGET_ARCH) -c COMPILE.C = $(COMPILE.cc) ... SUFFIXES:= .out .a .ln .o .c .cc .C .cpp .p .f .F .r .y .l .S .mod .sym \ .def .h .info .dvi .tex .texinfo .texi .txinfo .w .ch... # Gizli Qaydalar ... %.o: %.c # icra ediləcək əmrlər (qurulmuşdur) -in): $(COMPILE.c) $(OUTPUT_OPTION) $< ...

Bütün bu dəyişənlərin dəyərləri: CC, LD, AR, EXTRA_CFLAGS, ... skript faylı tərəfindən standart dəyərləri olan gizli təriflər kimi istifadə edilə bilər. Bundan əlavə, özünüz təyin edə bilərsiniz qaydalar seçilmiş üçün standart emal şəkilçilər(fayl adı uzantıları), yuxarıdakı nümunədə göstərildiyi kimi mənbə fayllar C kodu: %.c.

Əksər inteqrasiya edilmiş inkişaf mühitləri (IDE) və ya portativ qurğular yaratmaq üçün paketlər (məsələn, automake və ya autoconf) fayl yaratmaq vəzifəsinə malikdir. Makefile kommunal üçün etmək.

Quraşdırmanı necə sürətləndirmək olar

Məclis sadə layihələr olduqca tez baş verir, lakin inkişaf etdikcə layihənin böyüməsini nəzərə alsaq, əsas hissəsi tərtib etməyə sərf olunan tikinti vaxtı əhəmiyyətli dərəcədə arta bilər. Bu növün məşhur nümunəsi məclisdir Linux nüvələri, bu, avadanlıq növündən asılı olaraq, bir neçə on dəqiqədən bir neçə saata qədər prosessor vaxtını ala bilər. Vəziyyət bir layihə üzərində işləyərkən (kodun dəyişdirilməsi, səhvlərin aradan qaldırılması, səhvlərin tapılması, sınaqdan keçirilməsi və s.) gündə bir neçə onlarla dəfə layihəni yenidən qurmaq lazım ola biləcəyi ilə daha da ağırlaşır. Buna görə də, bu prosesi sürətləndirmək imkanları həqiqətən aktuallaşır.

Bu gün tək prosessorlu (bir nüvəli) sistemlər demək olar ki, çoxnüvəli konfiqurasiyalarla əvəz olunduğundan, bir çox layihələrin yığılması fürsətdən istifadə edərək əhəmiyyətli dərəcədə (çox dəfə) sürətləndirilə bilər. etmək açardan istifadə edərək paralel olaraq birdən çox qurma işini yerinə yetirin –j aşağıdakı kimi:

$ man make ... -j , --jobs[=jobs] Eyni vaxtda yerinə yetiriləcək işlərin (əmrlərin) sayını təyin edir. ...

Gəlin bu funksiyanın təmin etdiyi faydaları yoxlayaq praktik nümunə. Montaj üçün standart olaraq NTP server layihəsini götürək, onun yığılması çox vaxt çəkmir, həm də çox tez deyil:

$ pwd /usr/src/ntp-4.2.6p3

Əvvəlcə montajı 4-də işə salaq nüvə prosessoru Atom (çox sürətli 1.66Ghz modeli deyil), lakin çox sürətli bərk vəziyyətdədir SSD sürücü:

$ cat /proc/cpuinfo | head -n10 prosessor: 0 vendor_id: GenuineIntel cpu ailəsi: 6 model: 28 model adı: Intel(R) Atom(TM) CPU 330 @ 1.60GHz addım: 2 cpu MHz: 1596.331 keş ölçüsü: 512 KB $ təmizləyin # işə salın dörd mövzuda qurmaq $ time make -j4 ... real 1m5.023s user 2m40.270s sys 0m16.809s $ make clean # in the build run standart rejim paralellik olmadan $ vaxt etmək ... real 2m6.534s istifadəçi 1m56.119s sys 0m12.193s $ təmizləmək # avtomatik seçilmiş paralellik səviyyəsi ilə qurmanı işə salmaq $ vaxt etmək -j ... real 1m5.708s istifadəçi 2m43.230s sys 0m16 301s

Gördüyünüz kimi, paralellikdən istifadə (açıq və ya gizli) montajı demək olar ki, iki dəfə sürətləndirməyə imkan verir - 2-yə qarşı 1 dəqiqə. Gəlin eyni layihəni daha sürətli 2 nüvəli prosessor üzərində quraq, lakin olduqca yavaş şərti ilə HDD sürücüsü:

$ cat /proc/cpuinfo | head -n10 prosessor: 0 vendor_id: GenuineIntel cpu ailəsi: 6 model: 23 model adı: Pentium(R) Dual-Core CPU E6600 @ 3.06GHz addım: 10 cpu MHz: 3066.000 cache ölçüsü: 2048 KB ... $ vaxt etmək. .. real 0m31.591s user 0m21.794s sys 0m4.303s $ time make -j2 ... real 0m23.629s user 0m21.013s sys 0m3.278s

Son montaj sürəti 3-4 dəfə artsa da, prosessorların sayında yaxşılaşma cəmi 20% təşkil edir, çünki burada "zəif əlaqə" yavaş sürücüdür, bu da yazarkən gecikməyə imkan verir. çox sayda kiçik .obj layihə faylları.

Qeyd: Xatırlatmaq istərdim ki, hər məclis deyil etmək, bir prosessorda uğurla işləyir (defolt olaraq və ya təyin edərkən olduğu kimi -j1), həmçinin cəlb edilmiş daha çox sayda prosessorla uğurla işləyəcək. Bu, mürəkkəb birləşmələr vəziyyətində əməliyyatların sinxronizasiyasında pozulmalar ilə əlaqədardır. Paralel icra vəziyyətində uğursuz olan belə bir quruluşun ən bariz nümunəsi nüvənin bəzi versiyaları üçün Linux nüvəsinin qurulmasıdır. Paralel icra imkanı etmək yığılan layihə üçün eksperimental olaraq yoxlanılmalıdır. Ancaq əksər hallarda bu xüsusiyyət istifadə edilə bilər və montaj prosesini əhəmiyyətli dərəcədə sürətləndirməyə imkan verir!

Əgər bu üsul qurma prosesinin sürətləndirilməsi, indi sistemlərin böyük əksəriyyətinin çoxprosessorlu (çox nüvəli) olmasına əsaslanır, aşağıdakı üsul RAM yaddaşının miqdarından istifadə edir. müasir kompüterlər(2-4-8 GB) kompilyasiya üçün tələb olunan yaddaş həcmini əhəmiyyətli dərəcədə üstələyir proqram kodu. Bu halda, əsas məhdudiyyəti çoxlu obyekt fayllarının yaradılması olan kompilyasiya xüsusi yaradılmış disk sahəsinə köçürülə bilər ( RAM diski, tmpfs), yaddaşda yerləşir:

$ pulsuz ümumi istifadə edilən pulsuz paylaşılan buferlər keşlənmiş Mem: 4124164 1516980 2607184 0 248060 715964 -/+ buferlər/keş: 552956 3571208 Mübadilə: 4606972 0 76 dm | grep tmp tmpfs 2014 1 2014 1% /dev/shm

İndi yığılmış layihənin fayllarını müvəqqəti olaraq köçürə bilərsiniz tmpfs(biz hələ də əvvəlki nümunədəki NTP serverindən istifadə edirik), qovluğa /dev/shm:

$ pwd /dev/shm/ntp-4.2.6p3 $ make -j ... real 0m4.081s istifadəçi 0m1.710s sys 0m1.149s

IN bu halda Performansı təkmilləşdirməyin hər iki üsulu eyni vaxtda istifadə olunur və orijinal tərtibə nisbətən təkmilləşmə demək olar ki, böyüklük sırasıdır. Düzdür, bu nümunə yavaş HDD ilə bir sistemdə işlədilib, burada paralel montaj praktiki olaraq heç bir qazanc vermədi və təxminən 30 saniyə tələb etdi.

Bu sürətləndirmə metodu Linux nüvəsini qurmaq üçün tətbiq oluna bilər, bunun üçün, artıq qeyd edildiyi kimi, paralel tikinti işləmir. RAM yaddaşından istifadə etmək üçün nüvənin mənbə ağacını qovluğa kopyalayın /dev/shm:

$ pwd /dev/shm/linux-2.6.35.i686 $ time make bzImage ... HOSTCC arch/x86/boot/tools/build BUILD arch/x86/boot/bzImage Kök cihazı (8, 1) Quraşdırma 13052-dir bayt (13312 bayta doldurulmuş). Sistem 3604 kB CRC 418921f4 Kernel: arch/x86/boot/bzImage hazırdır (#1) real 9m23.986s istifadəçi 7m4.826s sys 1m18.529s

Gördüyünüz kimi, Linux nüvəsinin qurulması 10 dəqiqədən az vaxt çəkdi ki, bu da qeyri-adi yaxşı nəticədir.

Nəticə olaraq, bunun üçün istifadə olunan avadanlıq üçün layihənin montaj şərtlərini diqqətlə optimallaşdırmağı məsləhət görə bilərik və sazlama prosesi zamanı montajın yüzlərlə dəfə həyata keçirildiyini nəzərə alsaq, çox vaxta qənaət edə bilərsiniz!

Kernel modullarının qurulması

Tətbiqlərin qurulmasının xüsusi halı Linux nüvə modullarının (sürücülərinin) qurulmasıdır. 2.6 nüvə versiyalarından başlayaraq modul qurmaq üçün, Makefile, makroların istifadəsi əsasında qurulmuşdur və bizə sadəcə yazmaq qalır (öz kodumuz adlı fayl üçün mod_params.c), modulların yığılması üçün aşağıdakı şablon:

Listing 1. Kernel modullarının qurulması üçün Makefile
CURRENT = $(shell unname -r) KDIR = /lib/modules/$(CURRENT)/build PWD = $(shell pwd) TARGET = mod_params obj-m:= $(TARGET).o default: $(MAKE) - C $(KDIR) M=$(PWD) modulları ...$ make make -C /lib/modules/2.6.18-92.el5/build \ M=examples/modules-done_1/hello_printk modulları düzəldin: `/usr/src/kernels/2.6.18-92.el5- kataloquna daxil olun i686" CC [M] /examples/modules-done_1/hello_printk/hello_printk.o Modulların qurulması, mərhələ 2. MODPOST CC /examples/modules-done_1/hello_printk/hello_printk.mod.o LD [M] nümunələri/modullar-bitdi_1/ hello_printk/hello_printk.ko make: Kataloqdan ayrılır `/usr/src/kernels/2.6.18-92.el5-i686" $ ls -l *.o *.ko -rw-rw-r-- 1 olej olej 74391 Mart 19 15:58 hello_printk.ko -rw-rw-r-- 1 olej olej 42180 19 mart 15:58 hello_printk.mod.o -rw-rw-r-- 1 olej 33388 19 mart 15:58 hello_print.o hello_printk.ko hello_printk.ko faylı: ELF 32-bit LSB yeri dəyişdirilə bilər, Intel 80386, versiya 1 (SYSV), silinməyib $ /sbin/modinfo hello_printk.ko fayl adı: hello_printk.ko müəllif: Oleq Tsiliuric lisenziya: GPL srcversion: 83915F228EC39FFCBAF99FD asılıdır: vermagic: 2.6.18-92.el5 SMP mod_unload 686 REGPARM 4KSTACKS gcc-4.1

Nəticə

Məqalədə ədəbiyyatda tez-tez təsvir olunmayan, lakin çox faydalı ola bilən make utiliti ilə işləmək aspektləri müzakirə edildi. praktiki iş. Çatdırılma və montajla bağlı məsələlərin müzakirəsini də başa çatdırdıq proqram təminatı Linux OS-də.

Növbəti məqalədə POSIX sistemlərində mövcud olan API kitabxanaları ilə tanışlığa başlayacağıq.

make yardım proqramı layihələrin qurulmasını avtomatlaşdırmaq üçün nəzərdə tutulmuşdur. Hər hansı bir layihə faylı digər fayllardan yaradıla bilərsə, yardım proqramı quraşdırma prosesini ən çox başa çatdırmağa imkan verir mümkün olan ən yaxşı şəkildə, mümkün olduqda işlənmiş faylların sayını minimuma endirmək.

Tarixən, yardım proqramı C dilində layihələrin qurulması üçün nəzərdə tutulmuşdu əməliyyat sistemi Unix, lakin istənilən layihə ilə işləmək üçün istifadə edilə bilər. Sistemin ilk versiyası 1977-ci ildə yaradılmışdır.

Bu gün ən çox yayılmış üç kommunal seçimdir, birləşdirilmişdir ümumi prinsiplər işləyir, lakin dil sintaksisi və imkanları ilə fərqlənir:

    GNU make ən ümumi və funksional seçimdir

    BSD make (pmake) - BSD layihələrində istifadə olunur, funksionallıq baxımından təxminən GNU make-ə bərabərdir

    nmake (Microsoft make) - Windows altında işləyir, az funksionallığa malikdir, yalnız əsas prinsiplər etmək.

Biz GNU make ilə işləyirik. Aktiv BSD sistemləri(xüsusilə FreeBSD, gmake kimi mövcud ola bilər, Linux-da sadəcə olaraq).

Əsas prinsiplər

make yardım proqramı işləyir qaydalar, xüsusi qeyd edildi konfiqurasiya faylı. Qaydalar müəyyən edir hədəflər, məqsədlər arasında asılılıqlar və hər bir məqsədi tamamlamaq üçün əmrlər toplusu.

Məqsədlər uyğun ola bilər müəyyən fayllar. Bundan əlavə, hədəflər hər hansı bir fayla uyğun olmaya bilər və digər hədəfləri və ya müəyyən əmrlər ardıcıllığını qruplaşdırmaq üçün istifadə edilə bilər. Belə hədəflərə saxta hədəflər deyilir.

Hər bir məqsəd digər məqsədlərin tamamlanmasından asılı ola bilər. Məqsədin yerinə yetirilməsi onun asılı olduğu digər məqsədlərin əvvəlcədən tamamlanmasını tələb edir.

Fayllara uyğun hədəflər arasında asılılıq olduqda, hədəf yalnız asılı olduğu fayllar hədəfə uyğun gələn fayldan daha yeni olduqda yerinə yetirilir. Bu, yalnız dəyişdirilmiş fayllardan asılı olan və potensial olaraq yerinə yetirilməyən faylları bərpa etməyə imkan verir uzun proses bütün layihə fayllarının yenidən qurulması.

Beləliklə, makefile, make yardım proqramının müəyyən bir məqsədi yerinə yetirdiyi, qurma əməliyyatlarının sayını mümkün qədər minimuma endirdiyi asılılıq qrafikini müəyyən edir.

Qaçış etmək

Siz etmək üçün ixtiyari qaydalar faylını təyin edə bildiyinizə baxmayaraq, bir qayda olaraq, onlar istifadə edirlər standart ad Makefile. Bir neçə defolt alternativ ad da dəstəklənir, lakin ən çox yayılmış adlardan istifadə etmək məntiqlidir.

Buna görə də komanda

$ etmək

yerləşən Makefile faylından istifadə edəcək cari kataloq.

make-i işə saldığınız zaman yerinə yetiriləcək hədəfi təyin edə bilərsiniz. Heç bir hədəf göstərilməyibsə, qaydalar faylında ya açıq şəkildə göstərilən standart hədəf istifadə olunur, ya da ilk təyin edilmiş hədəf gizli şəkildə istifadə olunur.

Hədəfin açıq şəkildə təyin edilməsi Makefile-də DEFAULT_GOAL ifadəsi ilə həyata keçirilir:

. DEFAULT_GOAL: hamısı

Məsələn, əmr

$ təmizləyin

təmiz hədəfin cari kataloqda yerləşən Makefile faylını emal etməsinə səbəb olacaq.

Eyni anda bir neçə hədəf təyin edə bilərsiniz.

Məqsədlərin icrası dəyişənlərdən istifadə etməklə konfiqurasiya edilə bilər (aşağıda daha ətraflı). make-i işə saldıqda, dəyişənlərin dəyərlərini təyin edə bilərsiniz:

$ qurmaq PREFIX =/usr/local

PREFIX dəyişəninin dəyəri Makefile qaydalarında mövcud olacaq və qurma zamanı istifadə edilə bilər.

Əmr həmçinin bir sıra əlavə variantları dəstəkləyir, bunlardan ən vacibləri aşağıdakılardır:

    F - qaydalar faylını açıq şəkildə göstərməyə imkan verir

    C - gedir müəyyən kataloq icradan əvvəl, məsələn, layihə qovluğundan kənar bir kataloqdan make-i işə salmaq üçün istifadə edilə bilər

    B - asılı hədəflərin vaxt yoxlanmasını söndürür və onları tamamilə icra etməyə məcbur edir

Əsas düzəltmə sintaksisi

Make fayllarında istifadə olunan əsas konstruksiya aşağıdakı kimidir:

Hədəf: dep1 dep2 ... command1 command2 ...

    hədəf - hədəf

    dep1 , dep2 - hədəfdən asılı olan hədəflər

    command1 , command2 - hədəfə çatmaq üçün yerinə yetirilən əmrlər

Məsələn:

Stil. css: src/ less/ app. az lessc src/ less/ app. az > üslub. css

Bu fraqment müəyyən edir ki, style.css faylı src/less/app.less faylından asılıdır və onu yaratmaq üçün siz lessc src/less/app.less > style.css əmrini işlətməlisiniz. Style.css faylı yalnız src/less/app.less faylı style.css faylından daha yeni olduqda bərpa olunacaq (make işlədərkən -B keçidi göstərilmədiyi halda).

Hədəf təsvirindəki hər bir əmrdən əvvəl nişan simvolu olmalıdır. Prinsipcə, bu konfiqurasiya edilə bilər, lakin ümumi qəbul edilmiş konvensiyalardan istifadə etmək daha yaxşıdır. Nişanlar əvəzinə boşluqlardan istifadə etsəniz, make işləməyəcək.

Shell əmrləri hədəf emal əmrləri kimi istifadə olunur. Əmrin mətni göstərilir ki, onun göstərilməsinin qarşısını almaq üçün əmr @ simvolu ilə başlamalıdır;

Hər bir əmr ayrıca icra olunur qabıq tərcüməçisi, buna görə də əmrlər bir-biri ilə əlaqəli deyil. Başqa sözlə, bir komanda xətti - bir qabıq. Bu davranış xüsusi hədəfdən istifadə etməklə ləğv edilə bilər .ONESHELL .

Əgər əmrin (və ya asılılıqların siyahısının) bir neçə sətirdə yazılması lazımdırsa, \ defis simvolundan istifadə edin.

PHONY hədəfləri

Bir sıra əmrlər və ya qrup asılılıqlarını yerinə yetirmək üçün nəzərdə tutulan qeyri-fayl hədəfləri aşağıdakı kimi elan edilir:

.PHONY: təmiz təmiz: rm *. o temp

Bir neçə bəyannamə ola bilər. PHONY adətən biri müəyyən edilir və bütün müvafiq məqsədlər orada yazılır.

Bizim nümunəmizdə make clean çağırmaq təmiz hədəfi yerinə yetirəcək və bu, mütləq müvəqqəti faylları siləcək.

Saxta hədəfin başqa bir saxta hədəf şəklində asılılığı varsa, o zaman asılılıq asılı hədəfdən əvvəl yerinə yetirilir. Beləliklə, biz alt proqramlara bənzəyən bir mexanizm əldə edirik. Məsələn, biz bütün layihə fayllarını toplayan bütün hədəfi və ayrıca css, js və php hədəflərini müəyyən edə bilərik. css faylları, js faylları və php fayllarının işlənməsi.

Buna görə, Makefile-də yaza bilərik:

.TELEFON: bütün css js php hamısı: css js php css: www/ stil. css ... burada js əmrləri var: www/ js/ app. js ... burada php əmrləri var: ... burada yenə əmrlər

Nəticədə, biz bütün faylları yenidən qurmaq üçün make all-dən istifadə edə bilərik və məsələn, yalnız CSS fayllarını yenidən qurmaq üçün css-dən istifadə edə bilərik.

Dəyişənlər

Siz makefile-də dəyişənlərdən istifadə edə bilərsiniz, baxmayaraq ki, makrolardan istifadə edə biləcəyinizi söyləmək daha doğru olardı.

Dəyişənlər makefile-də təyinatla müəyyən edilir və ya xaricdən ötürülə bilər.

Dəyişənlər makro təriflərdir və dəyişən həmişə əvəzlənmədən əvvəl ən son anda qiymətləndirilir. Makroslar makefile mətninin istənilən yerində istifadə edilə bilər.

CC= gcc IDIR=../ daxildir CFLAGS=- I$ (IDIR) DEPS= hellomake. o salam. p NAME= hellomake $ (NAME ) : $ (DEPS ) $ (CC ) - o $ (NAME ) $ (DEPS )

Əvəzetmə $VAR istifadə edən qabıqdan fərqli olaraq $(VAR) konstruksiyasından istifadə etməklə həyata keçirilir.

Bir qabıq dəyişəni bir qabıq əmrində istifadə olunursa, onu təkrarlamaqla $ işarəsindən sitat gətirməlisiniz, məsələn:

Çap səhifəsi: əks-səda $$HOME

Makro dəyişənlərə əlavə olaraq, dəyərin dərhal təyin olunduğu daha ənənəvi dəyişənlər də var. Onlarla işləmək üçün operatordan istifadə edin:=. Bizim şərtlərimizdə adi dəyişənlərdən istifadə etmək kifayətdir.

Çox vaxt dəyişəni yalnız o zaman təyin etmək istəyirsiniz ki, o, artıq təyin olunmayıb. Bunun üçün ?= operatorundan istifadə edin:

MYSQL_CHARSET ?= UTF8

Buna görə də zəng etsək

verilənlər bazası yaratmaq

UTF8 kodlaşdırması istifadə olunacaq və hər halda

MYSQL_CHARSET= CP1251 verilənlər bazası yaradın

CP1251 istifadə olunacaq.

Dəyişən bir neçə sətirdən ibarətdirsə, siz müəyyən sintaksisdən istifadə edə bilərsiniz:

MYSQL_APP_CONF_TEMPLATE [ mysql] host=$ (MYSQL_SERVER ) port=$ (MYSQL_PORT ) user=$ (MYSQL_USER ) parolunu təyin edin = "$(MYSQL_PASSWORD)" endef

Avtomatik Dəyişənlər

Make yazı qaydalarını asanlaşdıran bir sıra avtomatik dəyişənləri dəstəkləyir. Məsələn, $@ dəyişəni cari hədəfə ( :)-in solunda olan, $^ dəyişəni isə asılılıqlar siyahısına ( :)-nin sağında olan) uyğun gəlir. Beləliklə, məsələn, yaza bilərsiniz:

www/js/script. js: src/js/jquery. js src/ js/ plugin1. js src/ js/ plugin2. js pişiyi $^ > $@

Nəticədə, www/js/script.js üç js faylının birləşdirilməsinin nəticəsi olacaq.

Bu cür dəyişənlərin tam siyahısı sənədlərdə verilmişdir, bizim üçün ən maraqlıları bunlardır:

    $@ - hədəf adı

    $< - имя первой зависимости

    $? - hədəfdən daha yeni olan bütün asılılıqların adları

    $^ - bütün hədəf asılılıqların adları

İLƏ tam siyahı sənədlərdə tapa bilərsiniz: Avtomatik Dəyişənlər.

Şərti icra

Makefile-də şərtlərdən istifadə edə bilərsiniz. Yenə də biz make makro emaldan danışırıq, ona görə də şərtlər komanda səviyyəsində deyil, makefile səviyyəsində işləyir. Tipik olaraq, şərti ifadələr dəyişənlərin dəyərlərindən asılı olaraq müəyyən məqsədləri müəyyən etmək üçün istifadə olunur. Məsələn:

ifdef $ (APP) quraşdırma: ... başqa quraşdırma: @ echo "Xəta, tətbiqlər müəyyən edilməyib" endif

Şərt olaraq, dəyişənin müəyyənliyini, eləcə də dəyərini yoxlaya bilərsiniz:

Foo: $ (obyektlər) ifeq ($ (CC), gcc) $ (CC) - o foo $ (obyektlər) $ (libs_for_gcc) başqa $ (CC) - o foo $ (obyektlər) $ (normal_libs) endif

Şərti ifadələrin tam imkanları sənədlərdə tapıla bilər: Şərti sintaksis.

Şablon qaydaları

Nümunə qaydaları bir faylı digərinə çevirmək üçün onların adları arasındakı asılılıqlara əsaslanaraq qaydanı təyin etməyə imkan verir. Məsələn, C dil faylından obyekt faylı əldə etmək üçün bir qayda təyin edə bilərik:

%. o: %. c$(CC)$< - o $@

% dəyişəninin istifadəsinə diqqət yetirin< , которая в таких правилах используется для получения имени исходного файла.

Şablonların fayl uzantıları ilə məhdudlaşması lazım deyil. Mənbə və çıxış faylları bir-birinə uyğun gəlirsə və onların adlarında hər hansı bir asılılıq varsa, nümunə qaydasından istifadə etmək olar.

O cümlədən digər make faylları

make faylı digər make faylları daxil ifadəsi ilə daxil edə bilər:

make1 daxil edin. mk make2. mk

Beləliklə, fayllardan modul sistem qura bilərsiniz;

Funksiyalar

Make dəyişənlərdə (makroslarda) istifadə edilə bilən böyük funksiyalar toplusunu müəyyən edir. Funksiya çağırışı konstruksiya tərəfindən yerinə yetirilir:

$(funksiya arg1, arg2,... )

Funksiyalar sizə sətirləri, fayl adlarını emal etməyə, bir sıra dəyərlər üzərində döngələri təşkil etməyə, təşkil etməyə imkan verir şərti çağırış digər funksiyalar.

Pətəkdən bəzi nümunələr. alırıq cari vaxt( := istifadəsinə diqqət yetirin:

HIVE_TIME := $ (qabıq tarixi +% Y/% m/% d\ % H:% M:% S)

container.mk faylı yalnız mövcud olduqda daxil olmaqla:

$ daxildir (qabıq tapmaq $ (HIVE_ETC_DIR ) - ad konteyneri. mk)

Adın formalaşması MySQL verilənlər bazası layihə adına görə:

MYSQL_DB ?= $ (alt -, _,$ (HIVE_NAME) _$ (APP))

Fayl adlarına prefiks və şəkilçilərin əlavə edilməsi

$ (addprefix src/ az/,$ (əlavə əlavəsi . az, proqram interfeysi kataloqu) )

Funksiyalar haqqında daha çox Funksiyalar sənədlərində oxuya bilərsiniz.

Öz funksiyaları

Siz keçən arqumentlərə uyğun $1 , $2 , ... xüsusi dəyişənləri ehtiva edən dəyişənləri təyin etməklə öz parametrləşdirilmiş funksiyalarınızı yarada bilərsiniz. Zəng edin xüsusi funksiya xüsusi çağırış makrosu tərəfindən hazırlanmışdır:

$(dəyişən, param, param,... çağırın)

Çox axmaq bir misal:

Hive_red = " \0 33 [Dəyişən="abc"] [Hədəf]

Kvadrat mötərizələr bu hissənin mövcudluğunun isteğe bağlı olduğunu bildirir.
Hədəf- tamamlanacaq məqsədin adı.
Dəyişən = "abc"-dəyişənlərin yenidən təyin edilməsi. Daxil edilmiş dəyişənlərin dəyərləri komanda xətti-dəki təriflərdən daha yüksək prioritetə ​​malikdir makefile.
Seçimlər:
-f faylı- açıq ad qəbulu makefile, tapşırıq buraxılıbsa, o zaman fayllar axtarılır GNUmakefile, makefile və ya Makefile .
-n- real icrası olmayan hərəkətlərin təqlidi, sazlama üçün istifadə olunur.
-t- faktiki həyata keçirmədən məqsədin dəyişdirilməsi vaxtının dəyişdirilməsi.
-q- məqsədi tamamlamadan yeniləmə ehtiyacının yoxlanılması.

MAKE-dən daha təkmil istifadələr

Qaydaların ardıcıllığı əhəmiyyətsizdir. Varsayılan olaraq əsas məqsəd etmək birincidə birinci qaydanın məqsədidir etmək-fayl. Birinci qaydada bir neçə hədəf varsa, defolt hədəf kimi yalnız birinci hədəf götürülür. Nöqtə ilə başlayan hədəf bir və ya daha çox "/" simvolunu ehtiva etmədikdə, standart hədəf kimi istifadə edilmir, yəni. fayla gedən yolu müəyyən edir; Bundan əlavə, şablon qaydalarını müəyyən edən hədəflər standart olaraq istifadə edilmir.
TARGET və ya AŞILILIQ boşluq və ya üslubda nümunə ilə ayrılmış faylların siyahısı ola bilər. qabıq.
Şablonlar dəyişənlərə təyin edilərkən qayda yerinə yetirildikdə şərh edilir, dəyişənlərə faylların siyahısını təyin etmək üçün şablon şərh edilmir; xüsusi funksiya joker simvol.

obyektlər:= $(wildcard *.o
redaktə: *.o
cc -o redaktə *.o

üçün avtomatik nəsil SI dilində başlıq fayllarından asılı olaraq əmrdən istifadə edə bilərsiniz gcc -M fayl.c və ya gcc -MM faylı.c. İkinci seçim sistem başlıq fayllarından asılılıq yaratmır. COMMANDS-də avtomatik dəyişənlərdən istifadə edə bilərsiniz. Bu dəyişənlərdə qaydanın hədəfi və asılılıqları əsasında icra edilən hər bir qayda üçün yenidən hesablanmış dəyərlər var.

Avtomatik dəyişən Məqsəd
$@ Qayda hədəf faylının adı. Çox hədəfi olan şablon qaydasında qayda əmrlərinin yerinə yetirilməsinə səbəb olan hədəfin adı.
$< Birinci asılılığın adı. Hədəf öz əmrlərini gizli qaydadan alırsa, bu, gizli qayda tərəfindən əlavə edilən ilk asılılıq olacaqdır.
$? Hədəfdən daha yeni olan bütün asılılıqların adları, aralarında boşluqlar.
$^ Aralarında boşluq olmaqla bütün asılılıqların adları. Məqsəd üçün eyni asılılığı təkrar-təkrar göstərsəniz, dəyişənin dəyəri " $^ " onun adının yalnız bir nüsxəsini ehtiva edəcək.
$+ Bu dəyişən dəyişənə bənzəyir " $^ ", yalnız göstərilən asılılıqlar göstərilən ardıcıllıqla dəfələrlə təkrarlanır makefile. Bu, ilk növbədə kitabxana adlarının müəyyən ardıcıllıqla təkrarlanmasının vacib olduğu əmrləri əlaqələndirmək üçün faydalıdır
$* Gizli qaydanın uyğunlaşdırıldığı baza (aşağıya bax). Nümunə qaydasında əsas fayl adının simvoluna uyğun gələn hissəsidir " % " hədəf şablonunda. Hədəf fayldırsa " dir/a.foo.b", və hədəf şablon " a.%.b", onda əsas olacaq" dir/foo". Baza qayda ilə əlaqəli fayl adları yaratmaq üçün faydalıdır. Açıq qaydalarda, əgər belə bir genişləndirmə fərqləndirilə bilərsə, baza uzantısız fayl adı kimi müəyyən edilmir. Bu dəyişəni açıq qaydalarda istifadə etmək tövsiyə edilmir.

Gizli qaydalar bir çox proqramlaşdırma dilləri üçün müəyyən edilir və mənbə fayl uzantısına uyğun olaraq tətbiq edilir. Varsayılan olaraq, uzantıların siyahısı aşağıdakı kimidir: .out, .a, .ln, .o, .c, .cc, .C, cpp, .p, .f, .F, .r, .y, .l, .s, .S, .mod, .sym, .def, .h, .info, .dvi, .tex, .texinfo, .texi, .txinfo, .w, .ch, .web, .sh, .elc, .el. Gizli qaydalardan istifadə edərkən dəyişənlər istifadə olunur, onları əvəz etməklə faylın çevrilməsi prosesini idarə edə bilərsiniz, məsələn, qeyri-standart tərtibçini təyin edin və ya ona seçimlər ötürə bilərsiniz.

Misal MakeFile

Makefile nümunəsi

Standart hərəkətlərdən istifadə.

#default target - faylı redaktə etmək
redaktə edin: main.o kbd.o command.o display.o \

cc -o redaktə main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o

main.o: main.c defs.h
cc -c əsas.c
kbd.o: kbd.c defs.h komanda.h
cc -c kbd.c
command.o: command.c defs.h command.h
cc -c əmri.c
display.o: display.c defs.h bufer.h
cc -c displey.c
insert.o: insert.c defs.h bufer.h
cc -c daxil edin.c
search.o: search.c defs.h bufer.h
cc -c axtarış.c
files.o: files.c defs.h bufer.h command.h
cc -c faylları.c
utils.o: utils.c defs.h
cc -c utils.c
təmiz:
rm redaktə edin main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o

Varsayılan olaraq, etmək birinci qayda ilə başlayır (hədəf adları " ilə başlayan qaydaları saymır" . "). Bu əsas default hədəf adlanır. Bizim vəziyyətimizdə bu qaydadır redaktə et. Əgər fayl redaktə et asılı olan obyekt fayllarından daha yenidirsə, heç bir şey olmayacaq. Əks halda, əvvəl etmək bu qaydanı tam emal edə bilsə, o, asılı olduğu fayllar üçün qaydaları rekursiv şəkildə işləməlidir redaktə et. Bu faylların hər biri öz qaydasına uyğun olaraq işlənir. Mənbə faylı və ya asılılıqlar arasında qeyd olunan başlıq fayllarından hər hansı biri obyekt faylından gec yenilənirsə və ya obyekt faylı mövcud deyilsə, təkrar kompilyasiya həyata keçirilməlidir.
Qayda təmiz heç birinə uyğun gəlmir yaradılmış fayl və müvafiq olaraq, təmiz Heç bir şeydən asılı deyil və özü də asılılıqlar siyahısına daxil edilmir. Defolt olaraq işə salındıqda təmizçağırılmayacaq. Onu yerinə yetirmək üçün başlanğıcda hədəfi açıq şəkildə göstərməlisiniz etmək: təmiz etmək
Girişi qısaltmaq üçün dəyişənlər və standart hərəkətlər (örtülü qaydalar) istifadə edilə bilər


insert.o search.o files.o utils.o

redaktə: $(obyektlər)
cc -o redaktə $(obyektlər)
main.o: defs.h
kbd.o: defs.h command.h
command.o: defs.h command.h
display.o: defs.h bufer.h
insert.o: defs.h bufer.h
search.o: defs.h bufer.h
files.o: defs.h buffer.h command.h
utils.o: defs.h
.PHONY: təmiz
təmiz:
-rm redaktə $(obyektlər)

Dəyişən obyektlər obyekt fayllarının bir dəfə yazılmış siyahısından istifadə etməyə icazə verdi və obyekt faylları üçün etmək quraşdırılmış gizli standart qayda

fayl.c: fayl.o cc -c fayl.c

Xüsusi Məqsəd .PHONY içərisində qurulur etmək və onun asılılıqlarını uyğun faylları olmayan hədəf adları kimi müəyyən edir. Əgər bu qayda atlayın, sonra cari qovluqda adı ilə fayl yaradın təmiz icrasına mane olacaq təmiz etmək.
Standart qaydalardan istifadə asılılıq girişlərinin üslubunu dəyişməyə imkan verir:

obyektlər = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o

redaktə: $(obyektlər)
cc -o redaktə $(obyektlər)

$(obyektlər): defs.h
kbd.o command.o files.o: command.h
display.o insert.o search.o files.o: bufer.h

Bu giriş bütün obyekt fayllarının başlıq faylından asılı olduğunu göstərir defs.h, lakin bəziləri üçün əlavə asılılıqlar yoxlanılır.

Bir vaxtlar makiyaj haqqında əsas şeyləri başa düşmək üçün belə bir təlimatı çox qaçırdım. Düşünürəm ki, heç olmasa kiməsə maraqlı olacaq. Bu texnologiya tükənsə də, hələ də bir çox layihələrdə istifadə olunur. “Tərcümələr” mərkəzi üçün kifayət qədər karma yox idi, fürsət yaranan kimi onu da ora əlavə edəcəyəm. Tərcümələrə əlavə edildi. Dizaynda səhvlər varsa, onları qeyd edin. Mən düzəldəcəm.

Məqalə, ilk növbədə, UNIX-ə bənzər sistemlərdə C/C++ dilində proqramlaşdırmanı öyrənənlər üçün maraqlı olacaq. IDE-dən istifadə etməklə.

Layihəni əl ilə tərtib etmək çox yorucu bir işdir, xüsusən birdən çox mənbə faylı olduqda və onların hər biri üçün hər dəfə kompilyasiya və əlaqələndirmə əmrlərini daxil etməlisiniz. Amma hər şey pis deyil. İndi biz Makefiles yaratmağı və istifadə etməyi öyrənəcəyik. Makefile üçün təlimatlar toplusudur proqramlar hazırlayın, bir toxunuşla proqram layihəsini sözün əsl mənasında yığmağa kömək edir.

Təcrübə etmək üçün bir qovluqdakı dörd fayldan mikroskopik bir layihə yaratmalısınız: Hello World:

main.cpp

#daxildir #std ad boşluğundan istifadə edərək "functions.h" daxil edin; int main())( print_salam(); cout<< endl; cout << "The factorial of 5 is " << factorial(5) << endl; return 0; }


salam.cpp

#daxildir #std ad boşluğundan istifadə edərək "functions.h" daxil edin; void print_salam())( cout<< "Hello World!"; }


faktorial.cpp

#include "functions.h" int factorial(int n)( if(n!=1)( return(n * factorial(n-1)); ) else return 1; )


funksiyalar.h

void print_hello(); int faktorial(int n);


Buradan hər şeyi toplu şəkildə yükləyə bilərsiniz
Müəllif bilməsi heç də vacib olmayan C++ dilindən və gcc-dən olan g++ kompilyatorundan istifadə edib. Hər hansı digər kompilyator çox güman ki, işləyəcək. Fayllar bir qədər düzəldilir ki, onlar gcc 4.7.1 ilə tərtib edilir
proqram qurmaq
Əgər qaçsan
etmək
sonra proqram cari qovluqda standart adı Makefile olan faylı tapmağa və ondan təlimatları yerinə yetirməyə çalışacaq. Cari kataloqda bir neçə makefayl varsa, sizə lazım olanı bu şəkildə göstərə bilərsiniz:
make -f MyMakefile
Hələ bizə lazım olmayan bir çox başqa parametrlər var. Onlar haqqında man səhifəsində tapa bilərsiniz.
Quraşdırma prosesi
Kompilyator mənbə kodu fayllarını götürür və onlardan obyekt faylları yaradır. Sonra bağlayıcı obyekt fayllarını götürür və onlardan alır icra edilə bilən fayl. Assambleya = tərtib + əlaqələndirmə.
Əl ilə tərtib
Proqramı qurmağın ən asan yolu:
g++ main.cpp salam.cpp faktorial.cpp -o salam
Bunu hər dəfə yazmaq əlverişsizdir, ona görə də biz onu avtomatlaşdıracağıq.
Ən sadə Makefile
O, aşağıdakı hissələrdən ibarət olmalıdır:
Hədəf: asılılıqlar komandası
Bizim nümunəmiz üçün makefile belə görünəcək:
hamısı: g++ main.cpp salam.cpp faktorial.cpp -o salam
Nəzərə alın ki, komanda xətti nişanla başlamalıdır! Bunu layihə kataloqunuzda Makefile-1 olaraq qeyd edin və make -f Makefile-1 ilə quruluşu işə salın
Birinci misalda hədəf bütün adlanır. Bu makefile üçün standart hədəfdir və başqa heç bir hədəf açıq şəkildə göstərilmədikdə icra ediləcək. Həmçinin, bu nümunədəki bu hədəfin heç bir asılılığı yoxdur, ona görə də make dərhal istədiyiniz əmri yerinə yetirməyə başlayır. Və komanda, öz növbəsində, kompilyatoru işə salır.
Asılılıqlardan istifadə
Bir makefaylda birdən çox hədəfdən istifadə böyük layihələr üçün faydalıdır. Bunun səbəbi, bir faylı dəyişdirsəniz, bütün layihəni yenidən qurmağa ehtiyacınız olmayacaq, ancaq yalnız dəyişdirilmiş hissəni yenidən qurmaqla əldə edə bilərsiniz. Misal:
hamisi: salam salam: main.o faktorial.o salam.o g++ main.o faktorial.o salam.o -o salam main.o: main.cpp g++ -c main.cpp faktorial.o: faktorial.cpp g++ -c factorial.cpp salam.o: salam.cpp g++ -c salam.cpp təmiz: rm -rf *.o salam
Bu, hamısı eyni qovluqda Makefile-2 adı altında saxlanmalıdır

İndi bütün hədəfin yalnız bir asılılığı var, lakin əmr yoxdur. Bu halda, çağırıldıqda make bu hədəf üçün faylda göstərilən bütün asılılıqları ardıcıl olaraq yerinə yetirəcək.
Təmiz bir yeni məqsəd də əlavə edildi. Ənənəvi olaraq layihənin bütün tikinti nəticələrini tez təmizləmək üçün istifadə olunur. Təmizləmə belə başlayır: make -f Makefile-2 clean

Dəyişənlərin və Şərhlərin İstifadəsi
Dəyişənlər makefilesdə geniş istifadə olunur. Məsələn, bu, layihənin fərqli kompilyator və ya müxtəlif variantlarla tərtib olunma ehtimalını nəzərə almaq üçün əlverişli bir yoldur.
# Bu, CC dəyişəninin CC=g++ qurmaq üçün istifadə edilən kompilyatoru təyin etdiyini söyləyən şərhdir # Bu başqa bir şərhdir. O izah edir ki, CFLAGS dəyişəni kompilyatora ötürülən bayraqları ehtiva edir CFLAGS=-c -Wall all: salam salam: main.o factorial.o hello.o $(CC) main.o factorial.o salam.o -o salam main .o: main.cpp $(CC) $(CFLAGS) main.cpp factorial.o: factorial.cpp $(CC) $(CFLAGS) factorial.cpp salam.o: salam.cpp $(CC) $(CFLAGS ) salam.cpp təmiz: rm -rf *.o salam
Bu Makefile-3-dir
Dəyişənlər çox əlverişli bir şeydir. Onlardan istifadə etmək üçün sadəcə istifadə etməzdən əvvəl onlara dəyər təyin etməlisiniz. Bundan sonra onların dəyərini bu şəkildə düzgün yerdə əvəz edə bilərsiniz: $(VAR)
Bundan sonra nə etməli
Bu qısa təlimatdan sonra siz artıq özünüz sadə makefayllar yaratmağa cəhd edə bilərsiniz. Sonra ciddi dərslikləri və dərslikləri oxumaq lazımdır. Son bir akkord olaraq, onu özünüz sökməyə cəhd edə bilərsiniz və iki toxunuşla demək olar ki, hər hansı bir layihəyə uyğunlaşdırıla bilən universal bir makefile həyata keçirə bilərsiniz:
CC=g++ CFLAGS=-c -Divar LDFLAGS= MƏNBƏLƏR=main.cpp hello.cpp factorial.cpp OBJECTS=$(MƏNBƏLƏR:.cpp=.o) EXECUTABLE=hamısına salam: $(MƏNBƏLƏR) $(İCRA EDİLEBİLİR) $(İCRA EDİLEBİLİR ): $(OBYEKTLƏR) $(CC) $(LDFLAGS) $(OBYEKT) -o $@ .cpp.o: $(CC) $(CFLAGS) $< -o $@
Makefile-4
Uğurlar!