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

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

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

$(OUTPUTFILE): $(subst .cpp,.o,$(SOURCES))

$(CXX) -shared -fPIC $(LDFLAGS) -ΠΎ [email protected] $^

Π—Π΄Π΅ΡΡŒ $(OUTPUTFILE) раскрываСтся ΠΊΠ°ΠΊ libgeorgeringo.so, Π° Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ $(subst.cpp, .o, $(SOURCES)) раскрываСтся ΠΊΠ°ΠΊ george.ΠΎ, ringo.ΠΎ ΠΈ georgeringo.o, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² Ρ€Π΅Ρ†Π΅ΠΏΡ‚Π΅ 1.16. ΠšΠΎΠΌΠ°Π½Π΄Π½Ρ‹ΠΉ сцСнарий $(CXX) -shared -fPIC $(LDFLAGS) -ΠΎ β€” это адаптация ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки GCC, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π² Ρ‚Π°Π±Π». 1.11.

Π‘ΠΌΠΎΡ‚Ρ€ΠΈ Ρ‚Π°ΠΊΠΆΠ΅

Π Π΅Ρ†Π΅ΠΏΡ‚Ρ‹ 1.4, 1.9, 1.12, 1.19 ΠΈ 1.23.

1.18. Π‘Π±ΠΎΡ€ΠΊΠ° слоТного прилоТСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ GNU make

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°

Π’Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ GNU make для сборки исполняСмого Ρ„Π°ΠΉΠ»Π°, зависящСго ΠΎΡ‚ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… статичСских ΠΈ динамичСских Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.

РСшСниС

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия.

1. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ make-Ρ„Π°ΠΉΠ»Ρ‹ для Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΠΊΠ°ΠΊ описано Π² Ρ€Π΅Ρ†Π΅ΠΏΡ‚Π°Ρ… 1.16 ΠΈ 1.17. Π­Ρ‚ΠΈ make-Ρ„Π°ΠΉΠ»Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… дирСкториях.

2. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ make-Ρ„Π°ΠΉΠ» Π² Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ. Π­Ρ‚ΠΎΡ‚ make-Ρ„Π°ΠΉΠ» Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для сборки прилоТСния, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ make-Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ· шага 1. Π£ΠΊΠ°ΠΆΠΈΡ‚Π΅ Π² этом make-Ρ„Π°ΠΉΠ»Π΅ Ρ„ΠΈΠΊΡ‚ΠΈΠ²Π½ΡƒΡŽ Ρ†Π΅Π»ΡŒ all, Ρ‡ΡŒΠΈΠΌ ΠΏΡ€Π΅Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ²Π»ΡΡ‚ΡŒΡΡ исполняСмый Ρ„Π°ΠΉΠ». ΠžΠ±ΡŠΡΠ²ΠΈΡ‚Π΅ Ρ†Π΅Π»ΡŒ исполняСмого Ρ„Π°ΠΉΠ»Π° с ΠΏΡ€Π΅Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚Π°ΠΌΠΈ, состоящими ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ΡΡ ΠΈΠ· .cpp-Ρ„Π°ΠΉΠ»ΠΎΠ² прилоТСния. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π½Ρ‹ΠΉ сцСнарий для сборки исполняСмого Ρ„Π°ΠΉΠ»Π° ΠΈΠ· Π½Π°Π±ΠΎΡ€Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠ°ΠΊ описано Π² Ρ€Π΅Ρ†Π΅ΠΏΡ‚Π΅ 1.5. Если Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ шаблонноС ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ· .cpp-Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² Ρ€Π΅Ρ†Π΅ΠΏΡ‚Π΅ 1.16. Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Ρ†Π΅Π»ΠΈ install ΠΈ clean, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² Ρ€Π΅Ρ†Π΅ΠΏΡ‚Π΅ 1.15, ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ для автоматичСской Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ зависимостСй исходных Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² Ρ€Π΅Ρ†Π΅ΠΏΡ‚Π΅ 1.16.

3. Π’ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ, Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ дирСкториям, содСрТащим всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ make-Ρ„Π°ΠΉΠ»Ρ‹, создайтС Π½ΠΎΠ²Ρ‹ΠΉ make-Ρ„Π°ΠΉΠ» β€” Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π³Π»Π°Π²Π½Ρ‹ΠΌ (top-level) make-Ρ„Π°ΠΉΠ»ΠΎΠΌ, Π° всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ β€” ΠΏΠΎΠ΄Ρ‡ΠΈΠ½Π΅Π½Π½Ρ‹ΠΌΠΈ. ΠžΠ±ΡŠΡΠ²ΠΈΡ‚Π΅ Ρ†Π΅Π»ΡŒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ all с ΠΏΡ€Π΅Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚Π°ΠΌΠΈ Π² Π²ΠΈΠ΄Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ, содСрТащСй make Ρ„Π°ΠΉΠ», созданный Π½Π° шагС 2. ΠžΠ±ΡŠΡΠ²ΠΈΡ‚Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Ρ‡ΡŒΠΈ Ρ†Π΅Π»ΠΈ состоят ΠΈΠ· Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΉ, содСрТащих ΠΏΠΎΠ΄Ρ‡ΠΈΠ½Π΅Π½Π½Ρ‹Π΅ make-Ρ„Π°ΠΉΠ»Ρ‹, Π° ΠΊΠΎΠΌΠ°Π½Π΄Π½Ρ‹ΠΉ сцСнарий Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ make Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ для Ρ†Π΅Π»ΠΈ, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π² Π²ΠΈΠ΄Π΅ значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ TARGET. НаконСц, ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅ Ρ†Π΅Π»ΠΈ, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ зависимости ΠΌΠ΅ΠΆΠ΄Ρƒ цСлями ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΠΎΠ΄Ρ‡ΠΈΠ½Π΅Π½Π½Ρ‹Ρ… make-Ρ„Π°ΠΉΠ»ΠΎΠ².

НапримСр, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ· исходных Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° 1.3 ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ исполняСмый Ρ„Π°ΠΉΠ» с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ GCC Π² Unix, создайтС Ρ‚Π°ΠΊΠΎΠΉ make-Ρ„Π°ΠΉΠ», ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 1.23.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1.23. make Ρ„Π°ΠΉΠ» для hellobeatles.exe с использованиСм GCC

# Π£ΠΊΠ°ΠΆΠΈΡ‚Π΅ исходныС Ρ„Π°ΠΉΠ»Ρ‹, Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Ρ„Π°ΠΉΠ», Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ сборки

# ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ установки

SOURCES = hellobeatles.cpp

OUTPUTFILE = hellobeatles

LIBJOHNPAUL = libjohnpaul.a

LIBGEORGERINGO = libgeorgeringo.so

JOHNPAULDIR = ../johnpaul

GEORGERINGODIR = ../georgeringo

INSTALLDIR = ../binaries


#

# Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² ΠΏΡƒΡ‚ΡŒ поиска Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΡƒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ

#

CPPFLAGS += -I..


#

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

#

.PHONY: all

all: $(HELLOBEATLES)


#

# ЦСль для сборки исполняСмого Ρ„Π°ΠΉΠ»Π°.

#

$(OUTPUTFILE): $(subst .cpp,.ΠΎ,$(SOURCES)) \

 $(JOHNPAULDIR)/$(LIBJOHNPAUL) \

 $(GEORGERINGODIR)/$(LIBGEORGERINGO)

    $(CXX) $(LDFLAGS) -o [email protected] $^


.PHONY: install

install:

    mkdir -p $(INSTALLDIR)

    cp -p $(OUTPUTFILE) $(INSTALLDIR)


.PHONY: clean

clean:

    rm -f *.o

    rm -f $(OUTPUTFILE)


#Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠΉΡ‚Π΅ зависимости .cpp-Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΎΡ‚ .hpp-Ρ„Π°ΠΉΠ»ΠΎΠ²

include $(subst .cpp,.d,$(SOURCES))


%.d: %.cpp

    $(CC) -M $(CPPFLAGS) $< > [email protected]$$$$; \

    sed 's,\($*\)\.o[ :]*,\1.o [email protected] : ,g' < [email protected]$$$$ > [email protected]; \

    rm -f [email protected]$$$$

Π”Π°Π»Π΅Π΅ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ, содСрТащСй johnpaul, georgeringo, hellobeatles ΠΈ binaries, создайтС Π³Π»Π°Π²Π½Ρ‹ΠΉ make-Ρ„Π°ΠΉΠ», ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 1.24.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1.24. Π“Π»Π°Π²Π½Ρ‹ΠΉ make-Ρ„Π°ΠΉΠ» для исходного ΠΊΠΎΠ΄Π° ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² 1.1, 1.2 ΠΈ 1.3

# ВсС Ρ†Π΅Π»ΠΈ Π² этом make-Ρ„Π°ΠΉΠ»Π΅ β€” Ρ„ΠΈΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅

PHONY: all johnpaul georgeringo hellobeatles


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

all: hellobeatles


# Π¦Π΅Π»ΠΈ johnpaul, georgeringo ΠΈ hellobeatles ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚

# Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ, ΠΊΠΎΠΌΠ°Π½Π΄Π½Ρ‹ΠΉ сцСнарий Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ make Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ…

johnpaul georgeringo hellobeatles

$(MAKE) [email protected] $(TARGET)


# Π­Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ‡Ρ‚ΠΎ Ρ†Π΅Π»ΡŒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ make-Ρ„Π°ΠΉΠ»Π°

# Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ hellobeatles зависит ΠΎΡ‚ Ρ†Π΅Π»Π΅ΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

# make-Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ· Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΉ johnpaul ΠΈ georgeringo

.PHONY: hellobeatles

hellobeatles: johnpaul georgeringo

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ hellobeatles, ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ Π³Π»Π°Π²Π½Ρ‹ΠΉ make-Ρ„Π°ΠΉΠ», ΠΈ Π²Π²Π΅Π΄ΠΈΡ‚Π΅ make. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ libjohnpaul.a, libgeorgeringo.so ΠΈ hellobeatles Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ binaries, Π²Π²Π΅Π΄ΠΈΡ‚Π΅ make TARGET=install. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Π²Π²Π΅Π΄ΠΈΡ‚Π΅ make TARGET=clean.

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡŽ слоТными ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌΠΈ, продСмонстрированный Π² этом Ρ€Π΅Ρ†Π΅ΠΏΡ‚Π΅, извСстСн ΠΊΠ°ΠΊ рСкурсивный make (recursive make). Он позволяСт ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π² Π²ΠΈΠ΄Π΅ Π½Π°Π±ΠΎΡ€Π° ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ со своим собствСнным make-Ρ„Π°ΠΉΠ»ΠΎΠΌ, ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ зависимости ΠΌΠ΅ΠΆΠ΄Ρƒ этими модулями. Он Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ ΠΎΠ΄Π½ΠΈΠΌ Π³Π»Π°Π²Π½Ρ‹ΠΌ make-Ρ„Π°ΠΉΠ»ΠΎΠΌ с Π½Π°Π±ΠΎΡ€ΠΎΠΌ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… make-Ρ„Π°ΠΉΠ»ΠΎΠ²: эта ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Ρ… Π΄Ρ€Π΅Π²ΠΎΠ²ΠΈΠ΄Π½Ρ‹Ρ… структур. Π’ Ρ‚ΠΎ врСмя, ΠΏΠΎΠΊΠ° рСкурсивный make Π±Ρ‹Π» стандартной ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠΎΠΉ управлСния большими ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ make, появились Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ Π±ΠΎΠ»Π΅Π΅ качСствСнныС. Π—Π° подробностями снова ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ Managing Projects with GNU make, Third Edition Π ΠΎΠ±Π΅Ρ€Ρ‚Π° ΠœΠ΅ΠΊΠ»Π΅Π½Π±ΡƒΡ€Π³Π° (O'Reilly).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1.23 β€” это прямоС ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊ, продСмонстрированных Π² Ρ€Π΅Ρ†Π΅ΠΏΡ‚Π°Ρ… 1.15, 1,16 ΠΈ 1.17. Π’ Π½Π΅ΠΌ Π΅ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΎΡ‡Π΅Π½ΡŒ интСрСсный ΠΌΠΎΠΌΠ΅Π½Ρ‚. Как ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² Ρ€Π΅Ρ†Π΅ΠΏΡ‚Π΅ 1.15, ΠΏΡ€ΠΈ компиляции hellobeatles.cpp ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ†ΠΈΡŽ -I.., Π³ΠΎΠ²ΠΎΡ€ΡΡ‰ΡƒΡŽ компилятору, Π³Π΄Π΅ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ johnpaul.hpp ΠΈ georgeringo.hpp. Одним ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ являСтся написаниС явного ΠΏΡ€Π°Π²ΠΈΠ»Π° сборки hellobeatles.o с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠ³ΠΎ сцСнария, содСрТащСго ΠΎΠΏΡ†ΠΈΡŽ -I.. ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ этому.

hellobeatles.o: hellobeatles.cpp

g++ -с -I.. -о hellobeatles.o hellobeatles.cpp

ВмСсто этого я использовал Ρ‚ΠΎΡ‡ΠΊΡƒ настройки CPPFLAGS, ΠΎΠΏΠΈΡΠ°Π½Π½ΡƒΡŽ Π² Ρ€Π΅Ρ†Π΅ΠΏΡ‚Π΅ 1.15, ΠΈ ΡƒΠΊΠ°Π·Π°Π», Ρ‡Ρ‚ΠΎ всСгда, ΠΊΠΎΠ³Π΄Π° происходит компиляция ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΈΠ· Ρ„Π°ΠΉΠ»Π° .cpp, Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡƒΡŽ строку Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° опция -I..:

CPPFLAGS += -I..

ВмСсто ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° присвоСния = я использовал +=, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒΡΡ ΠΊ Ρ‚ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ CPPFLAGS, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠ³Π»ΠΎ Π±Ρ‹Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС ΠΈΠ»ΠΈ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ срСды.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° Ρ‚ΠΎ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 1.24. НаиболСС Π²Π°ΠΆΠ½Ρ‹ΠΌ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎΠΌ являСтся Ρ‚ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ заставляСт make Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΉ johnpaul, georgeringo ΠΈ hellobeatles.

johnpaul georgeringo hellobeatles:

$(MAKE) [email protected] $(TARGET)

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ это ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π½Π°Ρ‚ΡŒ Ρ‚Ρ€ΠΈ Π²Π΅Ρ‰ΠΈ. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, пСрСмСнная MAKE раскрываСтся ΠΊΠ°ΠΊ имя Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ экзСмпляра make. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ это Π±ΡƒΠ΄Π΅Ρ‚ make, Π½ΠΎ Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… систСмах это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ gmake. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, опция ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки --directory=<path> заставляСт make Π²Ρ‹Π·Π²Π°Ρ‚ΡŒΡΡ с <path> Π² качСствС Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ. Π’-Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈΡ…, ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ с нСсколькими цСлями эквивалСнтно Π½Π°Π±ΠΎΡ€Ρƒ ΠΏΡ€Π°Π²ΠΈΠ», ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ Ρ†Π΅Π»ΠΈ ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ содСрТат ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π½Ρ‹Π΅ сцСнарии. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ эквивалСнтно ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ.

johnpaul:

    $(MAKE) [email protected] $(TARGET)


georgeringo:

    $(MAKE) [email protected] $(TARGET)


hellobeatles:

    $(MAKE) [email protected] $(TARGET)

Π’ свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ это эквивалСнтно:

johnpaul:

    $(MAKE) --directory=johnpaul $(TARGET)


georgeringo:

    $(MAKE) --directory=georgeringo $(TARGET)


hellobeatles:

    $(MAKE) -directory=hellobeatles $(TARGET)

Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, эффСкт ΠΎΡ‚ этого ΠΏΡ€Π°Π²ΠΈΠ»Π° состоит Π² Π²Ρ‹Π·ΠΎΠ²Π΅ make-Ρ„Π°ΠΉΠ»ΠΎΠ² Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΉ johnpaul, georgeringo ΠΈ hellobeatles, Π° Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС пСрСдаётся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ TARGET. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ для сборки Ρ†Π΅Π»ΠΈ xxx Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· ΠΏΠΎΠ΄Ρ‡ΠΈΠ½Π΅Π½Π½Ρ‹Ρ… make-Ρ„Π°ΠΉΠ»ΠΎΠ² трСбуСтся Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π³Π»Π°Π²Π½Ρ‹ΠΉ make-Ρ„Π°ΠΉΠ» с ΠΎΠΏΡ†ΠΈΠ΅ΠΉ TARGET=xxx.

ПослСднСС ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ make-Ρ„Π°ΠΉΠ»Π° Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄Ρ‡ΠΈΠ½Π΅Π½Π½Ρ‹Π΅ make-Ρ„Π°ΠΉΠ»Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ порядкС; ΠΎΠ½ΠΎ просто ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ Ρ†Π΅Π»ΡŒ hellobeatles, Π·Π°Π²ΠΈΡΡΡ‰ΡƒΡŽ ΠΎΡ‚ Ρ†Π΅Π»Π΅ΠΉ johnpaul ΠΈ georgeringo.