Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² LinuxΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 103

Автор НСйл ΠœΡΡ‚ΡŒΡŽ

myapp: main.ΠΎ 2.o 3.o

 gcc -ΠΎ myapp main.ΠΎ 2.o 3.o


main.ΠΎ: main.c a.h

 gcc -с main.c


2.о: 2.с a.h b.h

 gcc -с 2.с


3.o: 3.c b.h c.h

 gcc -с 3.c

ЗапуститС ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ make с ΠΎΠΏΡ†ΠΈΠ΅ΠΉ -f, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ваш make-Ρ„Π°ΠΉΠ» Π½Π΅ Π½Π°Π·Π²Π°Π½ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· стандартных ΠΈΠΌΠ΅Π½ makefile ΠΈΠ»ΠΈ Makefile. Если Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅, Π½Π΅ содСрТащСм исходных Ρ„Π°ΠΉΠ»ΠΎΠ², Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ сообщСниС:

$ make -f Makefile1

make: *** No rule to make target 'main.c', needed by 'main.o'. Stop.

$

Команда make ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠ»Π°, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ Π·Π°Π΄Π°Π½ΠΈΠ΅ Π² make-Ρ„Π°ΠΉΠ»Π΅, myapp, β€” это Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ. Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ½Π° просмотрСла ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ зависимости ΠΈ ΠΏΡ€Π΅ΠΆΠ΄Π΅ всСго ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»Π°, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ΅Π½ Ρ„Π°ΠΉΠ», Π½Π°Π·Π²Π°Π½Π½Ρ‹ΠΉ main.c. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Ρ‹ всС Π΅Ρ‰Π΅ Π½Π΅ создали этот Ρ„Π°ΠΉΠ» ΠΈ Π² make-Ρ„Π°ΠΉΠ»Π΅ Π½Π΅ сказано, ΠΊΠ°ΠΊ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ создан, ΠΊΠΎΠΌΠ°Π½Π΄Π° make Π²Ρ‹Π²Π΅Π»Π° сообщСниС ΠΎΠ± ошибкС. Π˜Ρ‚Π°ΠΊ, создайтС исходныС Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ снова. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ нас Π½Π΅ интСрСсуСт, эти Ρ„Π°ΠΉΠ»Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ простыми. Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π½Π° самом Π΄Π΅Π»Π΅ пустыС, поэтому Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ touch:

$ touch a.h

$ touch b.h

$ touch c.h

Π€Π°ΠΉΠ» main.c содСрТит Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ main, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ function_two ΠΈ function_three. Π’ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π΄Π²ΡƒΡ… Ρ„Π°ΠΉΠ»Π°Ρ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ function_two ΠΈ function_three. Π’ исходных Ρ„Π°ΠΉΠ»Π°Ρ… Π΅ΡΡ‚ΡŒ строки #include для ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², поэтому ΠΎΠ½ΠΈ ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ зависимыми ΠΎΡ‚ содСрТимого Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ². Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ назовСшь Π²Ρ‹Π΄Π°ΡŽΡ‰ΠΈΠΌΡΡ, Π½ΠΎ, Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π΄Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ листинги ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ:

/* main.c */

#include <stdlib.h>

#include "a.h"

extern void function_two();

extern void function_three();

int main() {

 function_two();

 function_three();

 exit(EXIT_SUCCESS);

}


/* 2.c */

#include "a.h"

#include "b.h"

void function_two() { }


/* 3.с */

#include "b.h"

#include "c.h"

void function_three() { }

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ make Π΅Ρ‰Π΅ Ρ€Π°Π·:

$ make -f Makefile1

gcc -с main.с gcc -с 2.с

gcc -с 3.с

gcc -ΠΎ myapp main.ΠΎ 2.ΠΎ 3.ΠΎ

$

На этот Ρ€Π°Π· сборка ΠΏΡ€ΠΎΡˆΠ»Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ.

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

Команда make ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π»Π° ΡΠ΅ΠΊΡ†ΠΈΡŽ зависимостСй make-Ρ„Π°ΠΉΠ»Π° ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»Π° Ρ„Π°ΠΉΠ»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ, ΠΈ порядок ΠΈΡ… создания. Π₯отя Π²Ρ‹ сначала описали, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» myapp, ΠΊΠΎΠΌΠ°Π½Π΄Π° make ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»Π° ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ порядок создания Ρ„Π°ΠΉΠ»ΠΎΠ². Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ½Π° запустила ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для создания этих Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π²Π°ΠΌΠΈ Π² сСкции ΠΏΡ€Π°Π²ΠΈΠ». Команда make Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π½Π° экран выполняСмыС Сю ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ваш make-Ρ„Π°ΠΉΠ», Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Π»ΠΈ ΠΎΠ½ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ измСнСния Π² Ρ„Π°ΠΉΠ»Π΅ b.h:

$ touch b.h

$ make -f Makefile1

gcc -c 2.с gcc -с 3.c

gcc -o myapp main.ΠΎ 2.ΠΎ 3.o

$

Команда make ΠΏΡ€ΠΎΡ‡Π»Π° ваш make-Ρ„Π°ΠΉΠ», ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ²ΡˆΠΈΠΉ минимальноС количСство ΠΊΠΎΠΌΠ°Π½Π΄, Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Ρ… для ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ построСния myapp, ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»Π° ΠΈΡ… Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ посмотритС, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Ссли Π²Ρ‹ ΡƒΠ΄Π°Π»ΠΈΡ‚Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ»:

$ rm 2.o

$ make -f Makefile1

gcc -с 2.c

gcc -ΠΎ myapp main.ΠΎ 2.ΠΎ 3.ΠΎ

$

И снова ΠΊΠΎΠΌΠ°Π½Π΄Π° make ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ опрСдСляСт Π½ΡƒΠΆΠ½Ρ‹Π΅ дСйствия.

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Π² make-Ρ„Π°ΠΉΠ»Π΅

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ Π² make-Ρ„Π°ΠΉΠ»Π΅ начинаСтся со Π·Π½Π°ΠΊΠ° # ΠΈ продолТаСтся Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° строки. Как ΠΈ Π² исходных Ρ„Π°ΠΉΠ»Π°Ρ… Π½Π° языкС Π‘, ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Π² make-Ρ„Π°ΠΉΠ»Π°Ρ… ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ ΠΊΠ°ΠΊ Π°Π²Ρ‚ΠΎΡ€Ρƒ, Ρ‚Π°ΠΊ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ имСлось Π² Π²ΠΈΠ΄Ρƒ Π²ΠΎ врСмя написания Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°.Sta

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ Π² make-Ρ„Π°ΠΉΠ»Π΅

Π”Π°ΠΆΠ΅ Ссли Π±Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ возмоТности ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ make ΠΈ make-Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π»ΠΈΡΡŒ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΡƒΠΆΠ΅ описано, ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ Π±Ρ‹ ΠΌΠΎΡ‰Π½Ρ‹ΠΌ срСдством управлСния ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌΠΈ с мноТСством исходных Ρ„Π°ΠΉΠ»ΠΎΠ². Но эти срСдства становятся Π³Ρ€ΠΎΠΌΠΎΠ·Π΄ΠΊΠΈΠΌΠΈ ΠΈ Π½Π΅ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π»ΠΈΠ²Ρ‹ΠΌΠΈ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ…, содСрТащих большоС количСство Ρ„Π°ΠΉΠ»ΠΎΠ². ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ make-Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ макросы, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ эти Ρ„Π°ΠΉΠ»Ρ‹ Π² Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅.

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ Π² make-Ρ„Π°ΠΉΠ»Π΅ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π² Π²ΠΈΠ΄Π΅ конструкции MAΠ‘RONAME=Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π·Π°Ρ‚Π΅ΠΌ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ, ΡƒΠΊΠ°Π·Π°Π² $(MACRONAME) ΠΈΠ»ΠΈ ${MACRONAME}. НСкоторыС вСрсии make ΠΌΠΎΠ³ΡƒΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ $MACRONAME. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Π΄Π°Ρ‚ΡŒ пустоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ макроса, оставив пустой Ρ‡Π°ΡΡ‚ΡŒ строки послС Π·Π½Π°ΠΊΠ° =.

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π² make-Ρ„Π°ΠΉΠ»Π°Ρ… для задания ΠΎΠΏΡ†ΠΈΠΉ компилятора. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π²ΠΎ врСмя Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ компилируСтся Π±Π΅Π· ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ с Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠΉ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ. Для ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ вСрсии прилоТСния, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π½ΡƒΠΆΠ½Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ€Π΅ΠΆΠΈΠΌΡ‹: малСнький Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π±Π΅Π· ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ быстрСС.

Π•Ρ‰Π΅ ΠΎΠ΄Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ„Π°ΠΉΠ»Π΅ Makefile1 β€” ТСстко Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ имя компилятора gcc. Π’ Π΄Ρ€ΡƒΠ³ΠΈΡ… UNIX-систСмах Π²Ρ‹, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ cc ΠΈΠ»ΠΈ c89. Если ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π²Ρ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ пСрСнСсти ваш make-Ρ„Π°ΠΉΠ» Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ UNIX ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Π΄Ρ€ΡƒΠ³ΠΎΠΉ компилятор для ΠΈΠΌΠ΅ΡŽΡ‰Π΅ΠΉΡΡ Ρƒ вас систСмы, придСтся ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ нСсколько строк Π² вашСм make-Ρ„Π°ΠΉΠ»Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ β€” Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ способ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ всС эти систСмнозависимыС части ΠΈ Π»Π΅Π³ΠΊΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΡ….

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ макросы ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Π² самом make-Ρ„Π°ΠΉΠ»Π΅, Π½ΠΎ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΈ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ make, Ссли Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ макроса, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, make CC=c89. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ Π΄Π°Π½Π½ΠΎΠΌΡƒ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС, ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ Π² make-Ρ„Π°ΠΉΠ»Π΅ опрСдСлСния. Π—Π°Π΄Π°Π½Π½Ρ‹Π΅ Π²Π½Π΅ make-Ρ„Π°ΠΉΠ»Π° опрСдСлСния макросов Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, поэтому ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹ ΠΈΠ»ΠΈ примСняйтС ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: "CC = с89".

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 9.2.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 9.2. Make-Ρ„Π°ΠΉΠ» с макросом

Π”Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° пСрСработанная вСрсия make-Ρ„Π°ΠΉΠ»Π° с ΠΈΠΌΠ΅Π½Π΅ΠΌ Makefile2, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ макросы:

all: myapp


# Какой компилятор

Π‘Π‘ = gcc


# Π“Π΄Π΅ хранятся Ρ„Π°ΠΉΠ»Ρ‹ include

INCLUDE = .


# ΠžΠΏΡ†ΠΈΠΈ для процСсса Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ

Π‘FLAGS = -g -Wall -ansi


# ΠžΠΏΡ†ΠΈΠΈ для ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ вСрсии

# БFLAGS = -О -Wall -ansi


myapp: main.ΠΎ 2.o 3.o

 $(CC) -ΠΎ myapp main.ΠΎ 2.o 3.o


main.ΠΎ: main.c a.h

 $(CC) -I$(INCLUDE) $(CFLAGS) -с main.c


2.ΠΎ: 2.c a.h b.h

 $(CC) -I$(INCLUDE) $(CFLAGS) -c 2.c


3.o: 3.c b.h c.h

 $(CC) -I$(INCLUDE) $(CFLAGS) -c 3.c

Если ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΡˆΠ»ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ прилоТСния ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ make-Ρ„Π°ΠΉΠ»Π°, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

$ rm *.ΠΎ myapp

$ make -f Makefile2

gcc -I. -g -Wall -ansi -c main.c

gcc -I. -g -Wall -ansi -c 2.c

gcc -I. -g -Wall -ansi -c 3.c

gcc -o myapp main.ΠΎ 2.o 3.o

$

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° make замСняСт ссылки Π½Π° макросы $(CC), $(CFLAGS) ΠΈ $(INCLUDE) ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ опрСдСлСниями Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ компилятор Π‘ поступаСт с Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°ΠΌΠΈ #define. Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Ссли Π²Ρ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ компиляции, Π²Π°ΠΌ придСтся ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Ρƒ строку make-Ρ„Π°ΠΉΠ»Π°.

Π£ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ make Π΅ΡΡ‚ΡŒ нСсколько ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… макросов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Ρ‰Π΅ Π±ΠΎΠ»Π΅Π΅ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ make-Ρ„Π°ΠΉΠ»Ρ‹. Π’ Ρ‚Π°Π±Π». 9.1 ΠΌΡ‹ пСрСчислили Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΈΠ· Π½ΠΈΡ…; Π² ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΈΡ… Π² дСйствии. ΠŸΠΎΠ΄ΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· этих макросов выполняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π΅Π΄ Π΅Π³ΠΎ использованиСм, поэтому Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ макроса ΠΌΠΎΠΆΠ΅Ρ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ make-Ρ„Π°ΠΉΠ»Π°. На самом Π΄Π΅Π»Π΅ Π² этих макросах Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ°Π»ΠΎ ΠΏΠΎΠ»ΡŒΠ·Ρ‹, Ссли Π±Ρ‹ ΠΎΠ½ΠΈ дСйствовали ΠΈΠ½Π°Ρ‡Π΅.

Π’Π°Π±Π»ΠΈΡ†Π° 9.1

ΠœΠ°ΠΊΡ€ΠΎΡ ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ $? Бписок Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… условий (Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… зависит Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ»), ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹Ρ… ΠΏΠΎΠ·ΠΆΠ΅, Ρ‡Π΅ΠΌ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ» [email protected] Имя Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ задания $< Имя Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Ρ„Π°ΠΉΠ»Π°, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ зависит Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ $* Имя Π±Π΅Π· суффикса Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Ρ„Π°ΠΉΠ»Π°, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ зависит Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ

Π•ΡΡ‚ΡŒ Π΅Ρ‰Π΅ Π΄Π²Π° ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… символа, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ Π² make-Ρ„Π°ΠΉΠ»Π΅:

β–‘ ΡΠΈΠΌΠ²ΠΎΠ» - заставляСт ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ make ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ ошибки. НапримСр, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΈ ΠΏΡ€ΠΈ этом ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ ошибки, скаТСм, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΡƒΠΆΠ΅ сущСствуСт, Π²Ρ‹ просто ставитС Π·Π½Π°ΠΊ "минус" ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ mkdir. Π§ΡƒΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅ Π² этой Π³Π»Π°Π²Π΅ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ символа -;