$(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.