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

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

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

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.