for file in $(CLEANEXTS); do rm -f *.$$file; done
ΠΠ²ΠΎΠΉΠ½ΠΎΠΉ Π·Π½Π°ΠΊ Π΄ΠΎΠ»Π»Π°ΡΠ° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π·Π°ΠΏΡΠ΅ΡΠΈΡΡ make ΡΠ°ΡΠΊΡΡΠ²Π°ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ $$file ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ Π΅Π΅ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠ΅.
Π’ΡΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ ΠΏΡΠ°Π²ΠΈΠ»Π° ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ .cpp Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΈ Π²ΠΊΠ»ΡΡΠ°Π΅ΠΌΡΠΌΠΈ Π² Π½ΠΈΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠΌΠΈ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ. ΠΠ΄Π΅ΡΡ ΡΠΊΠ°Π·Π°Π½ΠΎ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΏΡΠ°Π²ΠΈΠ»Ρ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ .cpp-ΡΠ°ΠΉΠ»Π°. Π¦Π΅Π»ΡΡ ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΏΡΠ°Π²ΠΈΠ»Π° ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΡΠΉ ΡΠ°ΠΉΠ», ΡΠΎΠ±ΠΈΡΠ°Π΅ΠΌΡΠΉ ΠΈΠ· .cpp-ΡΠ°ΠΉΠ»Π°, Π° ΠΏΡΠ΅ΡΠ΅ΠΊΠ²ΠΈΠ·ΠΈΡΠ°ΠΌΠΈ ΡΠ²Π»ΡΡΡΡΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ, ΡΠ²Π½ΠΎ ΠΈΠ»ΠΈ Π½Π΅ΡΠ²Π½ΠΎ Π²ΠΊΠ»ΡΡΠ°Π΅ΠΌΡΠ΅ .cpp-ΡΠ°ΠΉΠ»ΠΎΠΌ.
john.o: john.hpp
paul.o: paul.hpp
johnpaul.o. john.hpp paul.hpp johnpaul.hpp
ΠΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ. ΠΡΠ»ΠΈ .cpp-ΡΠ°ΠΉΠ» ΡΠ²Π½ΠΎ ΠΈΠ»ΠΈ ΠΊΠΎΡΠ²Π΅Π½Π½ΠΎ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠΉ ΡΠ°ΠΉΠ», ΡΠΎ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΏΠ΅ΡΠ΅ΡΠΎΠ±ΡΠ°Π½ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΡΡΠΎΠ³ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°. ΠΠ΄Π½Π°ΠΊΠΎ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ .cpp-ΡΠ°ΠΉΠ» ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΈ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΅Π»ΡΡ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ ΠΏΡΠ°Π²ΠΈΠ»Π°, ΠΎΠ½ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΡΡΡΠ°ΡΠ΅Π²Π°Π΅Ρ, ΠΊΠ°ΠΊ ΠΎΠΏΠΈΡΠ°Π½ΠΎ Π² ΡΠ΅ΡΠ΅ΠΏΡΠ΅ 1.15. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° ΠΏΠ΅ΡΠ΅ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ Π½Π΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ. Π§ΡΠΎΠ±Ρ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΡΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ, ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΎΠ±ΡΡΠ²ΠΈΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΡΠ΄Π΅Π»Π°Π² ΡΡΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΡΠ²Π½ΡΠΌΠΈ; ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΡΡΡ, ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΡΠΉ ΡΠ°ΠΉΠ», ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ .cpp-ΡΠ°ΠΉΠ»Ρ, ΡΡΡΠ°ΡΠ΅Π²Π°Π΅Ρ, ΡΡΠΎ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ ΠΏΠ΅ΡΠ΅ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ .cpp-ΡΠ°ΠΉΠ»Π°.
ΠΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠ΄ΠΎΠ±Π½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΠΎΡΠ΅Π½Ρ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ², ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΡΠ΅Π½Ρ ΡΠ»ΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΡΠ΅Π»Π΅ΠΉ, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡΠΈΡ ΡΠΎΠ±ΠΎΠΉ ΠΈΡΡ ΠΎΠ΄Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ, Π²Ρ ΠΎΠ΄ΡΡΠΈΠ΅ Π² Π±ΠΎΠ»ΡΡΡΡ Π±Π°Π·Ρ ΠΊΠΎΠ΄Π°. Π ΡΡΠ°ΡΡΡΡ, ΠΈΠΌΠ΅Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΡΡΠΈΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΏΡΠΈΠΌΠ΅ΡΠ° 1.20 ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅.
# ΠΠ΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ .cpp-ΡΠ°ΠΉΠ»ΠΎΠ² ΠΎΡ .hpp-ΡΠ°ΠΉΠ»ΠΎΠ²
include john.o paul.o johnpaul.ΠΎ
%.d: %.cpp
$(CC) -M $(CPPFLAGS) $< > [email protected]$$$$; \
sed 's.\($*\)\.o[ :]*.\1.o [email protected] : ,g' < [email protected]$$$$ > [email protected], \
rm -f [email protected]$$$$
ΠΡΠΎΡ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ ΠΊΠΎΠ΄Π° ΠΎΡΠ½ΠΎΠ²Π°Π½ Π½Π° ΠΎΠΏΡΠΈΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ° -M, ΠΊΠΎΡΠΎΡΠ°Ρ Π·Π°ΡΡΠ°Π²Π»ΡΠ΅Ρ GCC Π²ΡΠ²Π΅ΡΡΠΈ Π² make-ΡΠ°ΠΉΠ» ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΡ . ΠΠ° ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΡΠΌ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΌ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, ΠΈ ΠΏΠΎΡΠ΅ΠΌΡ ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ, ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ΡΡ ΠΊ ΠΊΠ½ΠΈΠ³Π΅ Managing Projects with GNU make, Third Edition, Π½Π°ΠΏΠΈΡΠ°Π½Π½ΠΎΠΉ Π ΠΎΠ±Π΅ΡΡΠΎΠΌ ΠΠ΅ΠΊΠ»Π΅Π½Π±ΡΡΠ³ΠΎΠΌ (Robert Mecklenburg) (O'Reilly).
ΠΠΎΠ΄ Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ ΠΏΠΎΠΌΠ΅ΡΠ°ΠΉΡΠ΅ Π² ΠΊΠΎΠ½Π΅Ρ make-ΡΠ°ΠΉΠ»Π°.
Π’Π°ΠΊ ΠΊΠ°ΠΊ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠΎΠ² ΠΈΠΌΠ΅Π΅Ρ ΠΎΠΏΡΠΈΡ, Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΡ ΠΎΠΏΡΠΈΠΈ -Π GCC, ΡΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π°Π΄Π°ΠΏΡΠΈΡΠΎΠ²Π°Π½ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ². ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΎΠ±ΡΡΠ½ΠΎ ΡΡΠ° ΠΎΠΏΡΠΈΡ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ -Π ΠΈΠ»ΠΈ -m. ΠΠ΄Π½Π°ΠΊΠΎ Visual C++ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΠΎΠΏΡΠΈΠΈ Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ Π² make-ΡΠ°ΠΉΠ»Π΅. ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Visual C++ Π΅ΡΡΡ Π΄Π²Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ. ΠΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠΏΡΠΈΡ -Gm ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ Ρ ΠΎΠΏΡΠΈΡΠΌΠΈ -Zi ΠΈΠ»ΠΈ -ZI, ΠΎΠ±ΡΡΠΆΠ΄Π°Π΅ΠΌΡΠΌΠΈ Π² ΡΠ΅ΡΠ΅ΠΏΡΠ΅ 1.21. ΠΠΏΡΠΈΡ -Gm Π³ΠΎΠ²ΠΎΡΠΈΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ ΡΠΎΠ·Π΄Π°ΡΡ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ , ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌΡΡ Π² ΡΠ°ΠΉΠ»Π΅ Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ΠΌ idb, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΌΠΈ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ. Π€Π°ΠΉΠ» .idb ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΠΏΡΠΈ ΠΏΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ ΡΠ°ΠΉΠ»Π° ΠΈΠ»ΠΈ Π½Π°Π±ΠΎΡΠ° ΡΠ°ΠΉΠ»ΠΎΠ² .cpp. ΠΡΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡΡ ΠΏΠ΅ΡΠ΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ ΠΈΡΡ ΠΎΠ΄Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ ΠΈΠ»ΠΈ Π·Π°Π²ΠΈΡΡΡ ΠΎΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ²ΡΠΈΡ ΡΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ².
ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠΏΡΠΈΡ -showIncludes ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ Ρ ΠΎΠΏΡΠΈΠ΅ΠΉ -E. ΠΠΏΡΠΈΡ -showIncludes ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ ΡΠΎΠΌΡ, ΡΡΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ include Π²ΡΠ²ΠΎΠ΄ΠΈΡ Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ ΠΏΠΎΡΠΎΠΊ ΠΎΡΠΈΠ±ΠΎΠΊ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅. ΠΠΏΡΠΈΡ -E Π³ΠΎΠ²ΠΎΡΠΈΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΏΡΠ΅ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ ΠΈ Π²ΡΠΉΡΠΈ, Π½Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ Π½ΠΈΠΊΠ°ΠΊΠΈΡ Π΄Π²ΠΎΠΈΡΠ½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ². Π‘ ΠΏΠΎΠΌΠΎΡΡΡ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΡΡΠ΅Π½Π°ΡΠΈΡ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²ΡΠ²ΠΎΠ΄, ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ -showIncludes; Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ Π² make-ΡΠ°ΠΉΠ»Π΅.
include john.d paul.d johnpaul.d
%d: %.cpp
"$(MSVCDIR)/bin/cl" -E -showIncludes $< 2> [email protected]$$$$ > /dev/null; \
sed -n 's/^Note: including file: *\(.*\)/$*.objβ’$*.d:\1/gp' \
< [email protected]$$$$ | sed "s:\\:/:g:s: :\\ :gp" > [email protected]; \
rm -f [email protected]$$$$
Π ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΡΠΈΠΌΠ²ΠΎΠ» β’ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ Tab.
ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ΄Π΅Π»Π°Π΅ΠΌ Π΅ΡΠ΅ ΠΎΠ΄Π½ΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π΅ ΡΡΠΎΠ²Π΅ΡΡΠ΅Π½ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠ° 1.20. Π Π½Π°ΡΡΠΎΡΡΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ john paul johnpaul ΡΠΎΠ΄Π΅ΡΠΆΠΈΡΡΡ Π² Π΄Π²ΡΡ ΠΌΠ΅ΡΡΠ°Ρ β Π² ΠΏΡΠ΅ΡΠ΅ΠΊΠ²ΠΈΠ·ΠΈΡΠ°Ρ ΠΏΡΠ°Π²ΠΈΠ»Π° Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΈ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Π΅ include, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠΉ Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ. ΠΡΠ»ΠΈ ΡΠΏΠΈΡΠΎΠΊ ΠΈΡΡ ΠΎΠ΄Π½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡΡ, Π²Π°ΠΌ ΠΏΡΠΈΠ΄Π΅ΡΡΡ Π²Π½ΠΎΡΠΈΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² Π΄Π²ΡΡ ΠΌΠ΅ΡΡΠ°Ρ make-ΡΠ°ΠΉΠ»Π°. ΠΠΎΡΠ°Π·Π΄ΠΎ Π»ΡΡΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ SOURCES ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ ΠΎΠ±Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ john paul johnpaul Π½Π° Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠ΅ SOURCES.
SOURCES = john.cpp paul.cpp johnpaul.cpp
...
# Π‘ΠΎΠ±ΠΈΡΠ°Π΅ΠΌ libjohnpaul.a ΠΈΠ· john.ΠΎ, paul.o ΠΈ johnpaul.ΠΎ
$(OUTPUTFILE): $(subst .cpp, .o,$(SOURCES))
ar ru [email protected] $^
ranlib [email protected]
...
# ΠΠ΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ .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]$$$$
ΠΠ΄Π΅ΡΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠ½ΠΊΡΠΈΡ make $(subst x, y, str), ΠΊΠΎΡΠΎΡΠ°Ρ Π·Π°ΠΌΠ΅Π½ΡΠ΅Ρ Π² ΡΡΡΠΎΠΊΠ΅ str Π²ΡΠ΅ Π²Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΡ x Π½Π° y.
GNU make ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π±ΠΎΠ»ΡΡΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΡΡΠΎΠΊ ΠΈ ΠΈΠΌΠ΅Π½ ΡΠ°ΠΉΠ»ΠΎΠ², Π° ΡΠ°ΠΊΠΆΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΈΡ . Π’Π°ΠΊΠΆΠ΅ ΠΎΠ½Π° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ. ΠΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΠΎ, Π·Π° ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΡΠΌ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΌ ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ΡΡ ΠΊ Managing Projects with GNU make, Third Edition Π ΠΎΠ±Π΅ΡΡΠ° ΠΠ΅ΠΊΠ»Π΅Π½Π±ΡΡΠ³Π° (O'Reilly).
Π‘ΠΌΠΎΡΡΠΈ ΡΠ°ΠΊΠΆΠ΅Π Π΅ΡΠ΅ΠΏΡΡ 1.2 ΠΈ 1.7.
1.17. Π‘Π±ΠΎΡΠΊΠ° Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ GNU Make
ΠΡ Ρ ΠΎΡΠΈΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ GNU make Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΈΠ· Π½Π°Π±ΠΎΡΠ° ΠΈΡΡ ΠΎΠ΄Π½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² Π‘++, ΡΠ°ΠΊΠΈΡ ΠΊΠ°ΠΊ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Π½ΡΠ΅ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ 1.2.
Π Π΅ΡΠ΅Π½ΠΈΠ΅ΠΠ½Π°ΡΠ°Π»Π΅ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ, Π³Π΄Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΡΠΎΠ·Π΄Π°Π½Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠ°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°, ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ make-ΡΠ°ΠΉΠ» ΠΈ ΠΎΠ±ΡΡΠ²ΠΈΡΠ΅ ΡΠΈΠΊΡΠΈΠ²Π½ΡΡ ΡΠ΅Π»Ρ all, Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΌ ΠΏΡΠ΅ΡΠ΅ΠΊΠ²ΠΈΠ·ΠΈΡΠΎΠΌ ΠΊΠΎΡΠΎΡΠΎΠΉ Π±ΡΠ΄Π΅Ρ ΡΡΠ° Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠ°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°. ΠΠ°ΡΠ΅ΠΌ ΠΎΠ±ΡΡΠ²ΠΈΡΠ΅ ΡΠ΅Π»Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ. ΠΠ΅ ΠΏΡΠ΅ΡΠ΅ΠΊΠ²ΠΈΠ·ΠΈΡΠ°ΠΌΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ, ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ ΠΎΠ½Π° ΡΠΎΠ±ΠΈΡΠ°Π΅ΡΡΡ, Π° Π΅Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡΠΉ ΡΡΠ΅Π½Π°ΡΠΈΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ ΡΠΎΠ±ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡΡ ΡΡΡΠΎΠΊΡ Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΈΠ· Π½Π°Π±ΠΎΡΠ° ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ², Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡ Π² ΡΠ΅ΡΠ΅ΠΏΡΠ΅ 1.4. ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ GCC ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ° Ρ ΠΏΠΎΡ ΠΎΠΆΠΈΠΌ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠΎΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ Π½Π°ΡΡΡΠΎΠΉΡΠ΅, Π΅ΡΠ»ΠΈ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ, Π½Π΅ΡΠ²Π½ΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ², ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² ΠΎΠ΄Π½Ρ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ CXX, CXXFLAGS ΠΈ Ρ.ΠΏ., ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ Π½Π΅ΡΠ²Π½ΡΡ ΠΏΡΠ°Π²ΠΈΠ» make, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠ΅ΡΠ΅ΠΏΡΠ΅ 1.15. Π ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ ΡΠ°Π±Π»ΠΎΠ½Π½ΡΡ ΠΏΡΠ°Π²ΠΈΠ», ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠΉ Π² ΡΠ΅ΡΠ΅ΠΏΡΠ΅ 1.16, Π½Π°ΠΏΠΈΡΠΈΡΠ΅ ΡΠ°Π±Π»ΠΎΠ½Π½ΠΎΠ΅ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, Π³ΠΎΠ²ΠΎΡΡΡΠ΅Π΅ make, ΠΊΠ°ΠΊ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΠΈΠ· ΡΠ°Π±Π». 1.8 ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡ .cpp-ΡΠ°ΠΉΠ»Ρ Π² ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΡΠ΅. ΠΠ°ΠΊΠΎΠ½Π΅Ρ Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ ΡΠ΅Π»ΠΈ install ΠΈ clean, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠ΅ΡΠ΅ΠΏΡΠ΅ 1.15, ΠΈ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ Π΄Π»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ ΠΈΡΡ ΠΎΠ΄Π½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ², ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠ΅ΡΠ΅ΠΏΡΠ΅ 1.16.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠΎΠ±Ρ ΠΈΠ· ΠΈΡΡ ΠΎΠ΄Π½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ², ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Π½ΡΡ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ 1.2, ΡΠΎΠ±ΡΠ°ΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ GCC Π² Unix, Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ georgeringo ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ make-ΡΠ°ΠΉΠ», ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΡΠΉ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ 1.22.
ΠΡΠΈΠΌΠ΅Ρ 1.22. make-ΡΠ°ΠΉΠ» Π΄Π»Ρ libgeorgeringo.so Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ GCC
# Π£ΠΊΠ°ΠΆΠΈΡΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ², ΡΠ΄Π°Π»ΡΠ΅ΠΌΡΡ ΠΏΡΠΈ ΠΎΡΠΈΡΡΠΊΠ΅
CLEANEXTS = o so
# Π£ΠΊΠ°ΠΆΠΈΡΠ΅ ΠΈΡΡ ΠΎΠ΄Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ, ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΡΠ°ΠΉΠ» ΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ
SOURCES = george.cpp ringo.cpp georgeringo.cpp
OUTPUTFILE = libgeorgeringo.so
INSTALLDIR = ../binaries
.PHONY: all
all: $(OUTPUTFILE)
# Π‘ΠΎΠ±Π΅ΡΠΈΡΠ΅ libgeorgeringo.so ΠΈΠ· george.o, ringo.ΠΎ
# ΠΈ georgeringo.o; subst - ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΠΎΠΈΡΠΊΠ° ΠΈ Π·Π°ΠΌΠ΅Π½Ρ.
# ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Π°Ρ Π² ΡΠ΅ΡΠ΅ΠΏΡΠ΅ 1.16
$(OUTPUTFILE): $(subst .cpp,.o,$(SOURCES))
$(CXX) -shared -fPIC $(LDFLAGS) -ΠΎ
.PHONY: install
install:
mkdir -p $(INSTALLDIR)
cp -p $(OUTPUTFILE) $(INSTALLDIR)
.PHONY: clean
clean:
for file in $(CLEANEXTS); do rm -f *.$$file; done
# Π‘Π³Π΅Π½Π΅ΡΠΈΡΡΠΉΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΡΠ°ΠΉΠ»ΠΎΠ² .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]$$$$
ΠΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅make-ΡΠ°ΠΉΠ» ΠΈΠ· ΠΏΡΠΈΠΌΠ΅ΡΠ° 1.22 β ΡΡΠΎ ΠΏΡΡΠΌΠΎΠ΅ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΈΠ΄Π΅ΠΉ ΠΈΠ· ΡΠ΅ΡΠ΅ΠΏΡΠΎΠ² 1.4, 1.15 ΠΈ 1.16. ΠΠ»Π°Π²Π½ΡΠΌ ΠΎΡΠ»ΠΈΡΠΈΠ΅ΠΌ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ°ΠΌΠΈ 1.22 ΠΈ 1.20 ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ libgeorgeringo.so ΠΈΠ· ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² george.o, ringo.o ΠΈ georgeringo.ΠΎ.
$(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.