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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C++. Π‘Π±ΠΎΡ€Π½ΠΈΠΊ Ρ€Π΅Ρ†Π΅ΠΏΡ‚ΠΎΠ²Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 21

Автор Π”. БтСфСнс

Из ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ описания слСдуСт, Ρ‡Ρ‚ΠΎ Ρ†Π΅Π»ΡŒ, Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‰Π°Ρ ΠΏΡ€Π΅Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚ΠΎΠ², Π½Π΅ устарСваСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли ΠΎΠ½Π° соотвСтствуСт Ρ„Π°ΠΉΠ»Ρƒ Π² Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ†Π΅Π»ΡŒ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ, всСгда Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ΅ΠΉ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для бСзусловного выполнСния ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠ³ΠΎ сцСнария. Π’Π°ΠΊΠΈΠ΅ Ρ†Π΅Π»ΠΈ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ phony targets (Ρ„ΠΈΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌΠΈ).

ΠŸΠΎΠΌΠ΅Ρ‚ΠΈΠ² Ρ†Π΅Π»ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ .PHONY, ΠΊΠ°ΠΊ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… 1.14 ΠΈ 1.15, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ make, Ρ‡Ρ‚ΠΎ Ρ†Π΅Π»ΡŒ Π½Π΅ соотвСтствуСт Ρ„Π°ΠΉΠ»Ρƒ, ΠΈ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠ½Π° всСгда Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒΡΡ Π·Π°Π½ΠΎΠ²ΠΎ.

И Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, ΠΏΡ€Π΅Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ, Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ устарСваСт ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ этот Ρ„Π°ΠΉΠ» Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ Π² качСствС Ρ†Π΅Π»ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΡ€Π°Π²ΠΈΠ».

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ происходит ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ make-Ρ„Π°ΠΉΠ»Π° ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° 1.14. Ѐиктивная Ρ†Π΅Π»ΡŒ all всСгда ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ°Ρ: СдинствСнная Π΅Π΅ Ρ†Π΅Π»ΡŒ β€” ΡΠΊΠ°Π·Π°Ρ‚ΡŒ make ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ hello.exe. Π’ Ρ‚Π°ΠΊΠΎΠΌ простом make-Ρ„Π°ΠΉΠ»Π΅ Π½Π΅Ρ‚ нСобходимости Π² Ρ†Π΅Π»ΠΈ all, Π½ΠΎ Π² Π±ΠΎΠ»Π΅Π΅ слоТных ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Ρ†Π΅Π»ΡŒ all ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ нСсколько ΠΏΡ€Π΅Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚ΠΎΠ², ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ с Ρ†Π΅Π»ΡŒΡŽ hello Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ make ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ, Ссли трСбуСтся, hello с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ g++. Если ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ тСкущая дирСктория Π½Π΅ содСрТит Π½ΠΈΡ‡Π΅Π³ΠΎ, ΠΊΡ€ΠΎΠΌΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² makefile ΠΈ hello.cpp, Ρ†Π΅Π»ΡŒ hello Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ΅ΠΉ. Однако ΠΏΡ€Π΅Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚ Π½Π΅ устарСл, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ„Π°ΠΉΠ» hello.cpp сущСствуСт ΠΈ Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ hello.cpp Π½Π΅ являСтся Ρ†Π΅Π»ΡŒΡŽ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΡ€Π°Π²ΠΈΠ». Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, make для компиляции ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ hello.cpp Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ g++, гСнСрируя Ρ‚Π΅ΠΌ самым Ρ„Π°ΠΉΠ» hello. ΠŸΡ€Π΅Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚ Ρ†Π΅Π»ΠΈ all обновляСтся, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ make собираСт Ρ†Π΅Π»ΡŒ all β€” исполняя пустой ΠΊΠΎΠΌΠ°Π½Π΄Π½Ρ‹ΠΉ сцСнарий β€” ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚.

ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ make с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ Ρ†Π΅Π»ΠΈ, make пытаСтся ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ эту Ρ†Π΅Π»ΡŒ. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ make install ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄:

mkdir -p binaries

cp -p hello binaries

ΠŸΠ΅Ρ€Π²Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° создаСт, Ссли ΠΎΠ½Π° Π½Π΅ сущСствуСт, Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ binaries, Π° вторая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ Π² эту Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ Ρ„Π°ΠΉΠ» hello. Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ make clean Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ

rm -f hello

которая удаляСт hello.

ΠŸΡ€ΠΈ использовании Windows ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ mkdir, cp ΠΈ rm, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ цСлями install ΠΈ clean, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° инструмСнты GNU, ΠΏΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ Π² составС Cygwin ΠΈΠ»ΠΈ MSYS

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π²Ρ‹ ΠΏΠΎΠΉΠΌΠ΅Ρ‚Π΅, ΠΊΠ°ΠΊ make Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ зависимости, ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 1.14 покаТСтся ΠΎΡ‡Π΅Π½ΡŒ простым. Однако Π½Π° самом Π΄Π΅Π»Π΅ ΠΎΠ½ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ слоТнСС, Ρ‡Π΅ΠΌ трСбуСтся. РассмотрСниС Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π΅Π³ΠΎ упрощСния являСтся Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ способом ΡƒΠ·Π½Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· основ make-Ρ„Π°ΠΉΠ»ΠΎΠ².

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ make

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

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1.16. make-Ρ„Π°ΠΉΠ» для сборки исполняСмого Ρ„Π°ΠΉΠ»Π° hello с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ GCC, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹ΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…

# Π£ΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Ρ„Π°ΠΉΠ» ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ установки

OUTPUTFILE=hello

INSTALLDIR=binaries


# ЦСль ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

.PHONY all

all: $(OUTPUTFILE)


# Π‘ΠΎΠ±Ρ€Π°Ρ‚ΡŒ hello ΠΈΠ· hello.cpp

$(OUTPUTFILE): hello cpp

    g++ -o hello hello.cpp


#Π‘ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ hello Π² ΠΏΠΎΠ΄Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ binaries

.PHONY: install

install:

    mkdir -p $(INSTALLDIR)

    cd -p $(OUTPUTFILE) $(INSTALLDIR)


# Π£Π΄Π°Π»ΠΈΡ‚ΡŒ hello

.PHONY: clean

clean:

    rm -f $(OUTPUTFILE)

Π—Π΄Π΅ΡΡŒ я Π²Π²Π΅Π» Π΄Π²Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ make β€” OUTPUTFILE ΠΈ INSTALLDIR. Как Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ make ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° присвоСния =, ΠΈ ΠΎΠ½ΠΈ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈΡ… Π² ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки с прСфиксом Π² Π²ΠΈΠ΄Π΅ Π·Π½Π°ΠΊΠ° Π΄ΠΎΠ»Π»Π°Ρ€Π°.

Π’Π°ΠΊΠΆΠ΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ make ΠΌΠΎΠΆΠ½ΠΎ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ записи make X=Y. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΡ€ΠΈ запускС make всС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ срСды ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… make с Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΈ значСниями. ЗначСния, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС, ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄ значСниями, унаслСдованными ΠΎΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… срСды. ЗначСния, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π² самом make-Ρ„Π°ΠΉΠ»Π΅, ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄ значСниями, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌΠΈ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС.

Π’Π°ΠΊΠΆΠ΅ GNU make ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ автоматичСскиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ (automatic variables), ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ значСния ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠ³ΠΎ сцСнария. НаиболСС Π²Π°ΠΆΠ½Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ… β€” это пСрСмСнная [email protected], ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ имя Ρ„Π°ΠΉΠ»Π° Ρ†Π΅Π»ΠΈ, пСрСмСнная $<, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ имя Ρ„Π°ΠΉΠ»Π° ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΏΡ€Π΅Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚Π°, ΠΈ пСрСмСнная $^,ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€Π΅Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚ΠΎΠ², Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ эти ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΅Ρ‰Π΅ сильнСС ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ make-Ρ„Π°ΠΉΠ» ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° 1.16, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 1.17.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1.17. make-Ρ„Π°ΠΉΠ» для сборки исполняСмого Ρ„Π°ΠΉΠ»Π° hello с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ GCC, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹ΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ автоматичСских ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…

# Π£ΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Ρ„Π°ΠΉΠ» ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ установки

OUTPUTFILE=hellΠΎ

INSTALLDIR=binaries


# ЦСль ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

.PHONY all

all: $(OUTPUTFILE)


# Π‘ΠΎΠ±Ρ€Π°Ρ‚ΡŒ hello ΠΈΠ· hello.cpp

$(OUTPUTFILE) hello.cpp

    g++ -o [email protected] $<


# Π¦Π΅Π»ΠΈ Install ΠΈ clean ΠΊΠ°ΠΊ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 1 16

Π’ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΌ сцСнарии g++ -o [email protected] $< пСрСмСнная [email protected] раскрываСтся ΠΊΠ°ΠΊ hello, Π° пСрСмСнная $< раскрываСтся ΠΊΠ°ΠΊ hello.cpp. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, make-Ρ„Π°ΠΉΠ» ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° 1.17 эквивалСнтСн Ρ„Π°ΠΉΠ»Ρƒ ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° 1.16, Π½ΠΎ содСрТит мСньшС Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎΡΡ ΠΊΠΎΠ΄Π°.

НСявныС ΠΏΡ€Π°Π²ΠΈΠ»Π°

make-Ρ„Π°ΠΉΠ» Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 1.17 ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΅Ρ‰Π΅ ΠΏΡ€ΠΎΡ‰Π΅. На самом Π΄Π΅Π»Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π½Ρ‹ΠΉ сцСнарий, связанный с Ρ†Π΅Π»ΡŒΡŽ hello, ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π΅Π½, Ρ‡Ρ‚ΠΎ дСмонстрируСтся Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ make-Ρ„Π°ΠΉΠ»Π° ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° 1.18.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1.18. make-Ρ„Π°ΠΉΠ» для сборки исполняСмого Ρ„Π°ΠΉΠ»Π° hello с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ GCC, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹ΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ нСявных ΠΏΡ€Π°Π²ΠΈΠ»

# Π£ΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Ρ„Π°ΠΉΠ» ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ установки

OUTPUTFILE=hello

INSTALLDIR=binaries


# ЦСль ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

.PHONY: all

all: $(OUTPUTFILE)


# Π“ΠΎΠ²ΠΎΡ€ΠΈΠΌ make ΠΏΠ΅Ρ€Π΅ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ hello Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° измСняСтся hello.cpp

$(OUTPUTFILE): hello.cpp


# Π¦Π΅Π»ΠΈ Install ΠΈ clean ΠΊΠ°ΠΊ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 1.16

ΠžΡ‚ΠΊΡƒΠ΄Π° make Π·Π½Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ исполняСмый Ρ„Π°ΠΉΠ» hello ΠΈΠ· исходного Ρ„Π°ΠΉΠ»Π° hello.cpp, Π±Π΅Π· явного указания? ΠžΡ‚Π²Π΅Ρ‚ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ make содСрТит Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… нСявных ΠΏΡ€Π°Π²ΠΈΠ», ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, часто выполняСмыС ΠΏΡ€ΠΈ сборкС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, написанных Π½Π° Π‘ ΠΈ Π‘++. НапримСр, нСявноС ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ исполняСмого Ρ„Π°ΠΉΠ»Π° ΠΈΠ· Ρ„Π°ΠΉΠ»Π° .cpp выглядит Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 1.19.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1.19. Π¨Π°Π±Π»ΠΎΠ½ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΈΠ· Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… make

%: %.cpp

# исполняСмыС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ (встроСнныС):

    $(LINK.cpp) $(LOADLIBS) $(LDLIBS) -ΠΎ [email protected]

ΠŸΡ€Π°Π²ΠΈΠ»Π°, ΠΏΠ΅Ρ€Π²Ρ‹Π΅ строки ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠΌΠ΅ΡŽΡ‚ Π²ΠΈΠ΄ %xxx:%yyy, извСстны ΠΊΠ°ΠΊ ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° (pattern rules), Π° символ % дСйствуСт ΠΊΠ°ΠΊ подстановочный Π·Π½Π°ΠΊ (wildcard). Когда ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ΅ΠΌΡƒ ΠΏΡ€Π΅Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚Ρƒ Π½Π΅ соотвСтствуСт Π½ΠΈ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΏΡ€Π°Π²ΠΈΠ», make ΠΈΡ‰Π΅Ρ‚ доступныС ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ шаблонного ΠΏΡ€Π°Π²ΠΈΠ»Π° make пытаСтся Π½Π°ΠΉΡ‚ΠΈ строку, которая ΠΏΡ€ΠΈ подстановкС подстановочного Π·Π½Π°ΠΊΠ° Π² Ρ†Π΅Π»Π΅Π²ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»Π° даст искомый ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΉ ΠΏΡ€Π΅Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚. Если make Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ Ρ‚Π°ΠΊΡƒΡŽ строку, make замСняСт подстановочныС Π·Π½Π°ΠΊΠΈ для Ρ†Π΅Π»ΠΈ ΠΈ ΠΏΡ€Π΅Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚ΠΎΠ² шаблонного ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΈ создаСт Π½ΠΎΠ²ΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ. Π—Π°Ρ‚Π΅ΠΌ make пытаСтся ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΉ ΠΏΡ€Π΅Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этого Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π°.

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… нСявных ΠΏΡ€Π°Π²ΠΈΠ» GNU make, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ make -p.

НапримСр, ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ make-Ρ„Π°ΠΉΠ»Π° ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° 1.18 ΠΏΡ€Π΅Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚ hello Ρ†Π΅Π»ΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ all являСтся ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΌ. Π₯отя hello Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠ°ΠΊ Ρ†Π΅Π»ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»Π° $(OUTPUTFILE): hello.cpp, это ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Π½Π΅ содСрТит ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠ³ΠΎ сцСнария, ΠΈ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠ½ΠΎ бСсполСзно для сборки Ρ„Π°ΠΉΠ»Π° hello. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, make выполняСт поиск Π² своСй Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 1.19. ΠŸΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΡ Π² ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° 1.19 вмСсто подстановочного Π·Π½Π°ΠΊΠ° строку hello, make Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ с hello Π² качСствС Ρ†Π΅Π»ΠΈ.

hello: hello.cpp

    $(LINK.cpp) $(LOADLIBS) $(LDLIBS) -o [email protected]

Пока всС Ρ…ΠΎΡ€ΠΎΡˆΠΎ, Π½ΠΎ Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΊΠΎΠ΅-Ρ‡Ρ‚ΠΎ. ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹ΠΉ взгляд Π½Π° Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… make ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ пСрСмСнная LINK.cpp ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ раскрываСтся ΠΊΠ°ΠΊ $(LINK.cc). Π’ свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ LINK.cc ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ раскрываСтся ΠΊΠ°ΠΊ