make
make â ÑÑилиÑа, авÑомаÑизиÑÑÑÑÐ°Ñ Ð¿ÑоÑеÑÑ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñайлов из одной ÑоÑÐ¼Ñ Ð² дÑÑгÑÑ. ЧаÑе вÑего ÑÑо компилÑÑÐ¸Ñ Ð¸ÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ кода в обÑекÑнÑе ÑÐ°Ð¹Ð»Ñ Ð¸ поÑледÑÑÑÐ°Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½Ð¾Ð²ÐºÐ° в иÑполнÑемÑе ÑÐ°Ð¹Ð»Ñ Ð¸Ð»Ð¸ библиоÑеки.
УÑилиÑа иÑполÑзÑÐµÑ ÑпеÑиалÑнÑе make-ÑайлÑ, в коÑоÑÑÑ ÑÐºÐ°Ð·Ð°Ð½Ñ Ð·Ð°Ð²Ð¸ÑимоÑÑи Ñайлов дÑÑг Ð¾Ñ Ð´ÑÑга и пÑавила Ð´Ð»Ñ Ð¸Ñ ÑдовлеÑвоÑениÑ. Ðа оÑнове инÑоÑмаÑии о вÑемени поÑледнего Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñайла make опÑеделÑÐµÑ Ð¸ запÑÑÐºÐ°ÐµÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ñе пÑогÑаммÑ.
СодеÑжание |
[пÑавиÑÑ] ÐÑоиÑÑ Ð¾Ð¶Ð´ÐµÐ½Ð¸Ðµ
Ðо ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ make ÑиÑÑÐµÐ¼Ñ ÑбоÑки (компилÑÑии) ÐÐ Unix обÑÑно ÑоÑÑоÑли из shell-ÑкÑипÑов ÑбоÑки, ÑопÑовождавÑÐ¸Ñ Ð¸ÑÑ Ð¾Ð´Ð½Ñй код пÑогÑамм.
make бÑла Ñоздана СÑÑаÑÑом ФелÑдманом (Stuart Feldman) в 1977 Ð³Ð¾Ð´Ñ Ð² Bell Labs.
РнаÑÑоÑÑее вÑÐµÐ¼Ñ ÑÑÑеÑÑвÑÐµÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво ÑÑÐ¸Ð»Ð¸Ñ Ð´Ð»Ñ Ð¾ÑÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð²Ð¸ÑимоÑÑей, но make â одна из ÑамÑÑ ÑиÑоко ÑаÑпÑоÑÑÑанÑннÑÑ , в пеÑвÑÑ Ð¾ÑеÑÐµÐ´Ñ Ð±Ð»Ð°Ð³Ð¾Ð´Ð°ÑÑ ÑомÑ, ÑÑо она вклÑÑена в Unix, наÑÐ¸Ð½Ð°Ñ Ñ Ð²ÐµÑÑии PWB/UNIX (for Programmerâs Workbench), коÑоÑÐ°Ñ ÑодеÑжала инÑÑÑÑменÑÑ Ð´Ð»Ñ ÑазÑабоÑки пÑогÑаммного обеÑпеÑениÑ.
[пÑавиÑÑ] СовÑеменнÑе веÑÑии
СÑÑеÑÑвÑÐµÑ Ð½ÐµÑколÑко веÑÑий make, оÑнованнÑÑ Ð½Ð° оÑигиналÑной make или напиÑаннÑÑ Ñ Ð½ÑлÑ, иÑполÑзÑÑÑÐ¸Ñ Ñе же ÑамÑе ÑоÑмаÑÑ Ñайлов и базовÑе пÑинÑÐ¸Ð¿Ñ Ð¸ алгоÑиÑмÑ, а Ñакже ÑодеÑжаÑие некоÑоÑÑе ÑлÑÑÑÐµÐ½Ð¸Ñ Ð¸ ÑаÑÑиÑениÑ. ÐапÑимеÑ:
- BSD make, оÑÐ½Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð½Ð° ÑабоÑе Ðдама де ÐÑÑа (Adam de Boor) над веÑÑией make, Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑÑ Ð¿Ð°ÑаллелÑной ÑбоÑки; в Ñой или иной ÑоÑме пеÑеÑла в FreeBSD, NetBSD и OpenBSD.
- GNU make â Ð²Ñ Ð¾Ð´Ð¸Ñ Ð² болÑÑинÑÑво диÑÑÑибÑÑивов GNU/Linux и ÑаÑÑо иÑполÑзÑеÑÑÑ Ð² ÑоÑеÑании Ñ GNU build system.
POSIX вклÑÑÐ°ÐµÑ Ð² ÑÐµÐ±Ñ ÑÑандаÑÑ Ð¾ÑновнÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑей ÑÑилиÑÑ make, Ñ Ñой или иной ÑÑепенÑÑ ÑовмеÑÑимоÑÑи ÑеализованнÑй в ÑазлиÑнÑÑ Ð²ÐµÑÑиÑÑ make. Ðак пÑавило, пÑоÑÑÑе make-ÑÐ°Ð¹Ð»Ñ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ ÑÑпеÑно иÑполÑÐ·Ð¾Ð²Ð°Ð½Ñ ÑазлиÑнÑми веÑÑиÑми make.
[пÑавиÑÑ] ÐÑполÑзование
make [ -f make-Ñайл ] [ ÑÐµÐ»Ñ ] ...
Цели:
- fetch â загÑÑзиÑÑ ÑÐ°Ð¹Ð»Ñ Ð¿Ð°ÐºÐµÑа(Ð¸Ð¼ÐµÐµÑ ÑмÑÑл ÑказÑваÑÑ ÑолÑко еÑли нÑжно лиÑÑ Ð·Ð°Ð³ÑÑзиÑÑ)
- checksum - пÑовеÑиÑÑ Ð·Ð°Ð³ÑÑженнÑе ÑÐ°Ð¹Ð»Ñ Ð½Ð° оÑибки
- install â ÑÑÑановиÑÑ(еÑли еÑе не вÑполненÑ, Ñо вÑполнÑÑÑÑÑ Ð¾Ð¿ÐµÑаÑии fetch и make)
- deinstall â ÑдалиÑÑ Ð¿Ð°ÐºÐµÑ(как пÑавило, ÑдалÑÐµÑ Ð¸ вÑе завиÑимоÑÑи Ð¾Ñ Ð½ÐµÐ³Ð¾)
- reinstall â в ÑлÑÑае, когда Ð¿Ð°ÐºÐµÑ Ð±Ñл Ñанее ÑдалÑн, ÑекомендÑеÑÑÑ Ð¿Ñи поÑледÑÑÑей ÑÑÑановке ÑказÑваÑÑ ÑÑÑ ÑелÑ
- clean â оÑиÑÑиÑÑ Ð²Ñе ÑозданнÑе пÑи компилÑÑии ÑайлÑ
ÐÑли опÑÐ¸Ñ -f не Ñказана, иÑполÑзÑеÑÑÑ Ð¸Ð¼Ñ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ make-Ñайла â Makefile (однако, в ÑазнÑÑ ÑеализаÑиÑÑ make кÑоме ÑÑого могÑÑ Ð¿ÑовеÑÑÑÑÑÑ Ð¸ дÑÑгие ÑайлÑ, напÑÐ¸Ð¼ÐµÑ GNUmakefile).
make оÑкÑÑÐ²Ð°ÐµÑ make-Ñайл, ÑÑиÑÑÐ²Ð°ÐµÑ Ð¿Ñавила и вÑполнÑÐµÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ñе Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñказанной Ñели.
ÐаÑÑ Ð°Ð»Ñное ÑйÑо во FreeBSD
$ make love Not war. $ uname -r 7.1-RELEASE-p3
[пÑавиÑÑ] Make-Ñайл
ÐÑогÑамма make вÑполнÑÐµÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ÑоглаÑно пÑавилам в ÑпеÑиалÑном Ñайле. ÐÑÐ¾Ñ Ñайл назÑваеÑÑÑ make-Ñайл (makefile, мейкÑайл). Ðак пÑавило, make-Ñайл опиÑÑваеÑ, каким обÑазом нÑжно компилиÑоваÑÑ Ð¸ компоноваÑÑ Ð¿ÑогÑаммÑ.
make-Ñайл ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· пÑавил и пеÑеменнÑÑ . ÐÑавила имеÑÑ ÑледÑÑÑий ÑинÑакÑиÑ:
ÑелÑ1 ÑелÑ2 ...: ÑеквизиÑ1 ÑеквизиÑ2 ...
команда1
команда2
...
ÐÑавило пÑедÑÑавлÑÐµÑ Ñобой Ð½Ð°Ð±Ð¾Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´, вÑполнение коÑоÑÑÑ Ð¿ÑиведÑÑ Ðº ÑбоÑке Ñайлов-Ñелей из Ñайлов-ÑеквизиÑа.
ÐÑавило ÑообÑÐ°ÐµÑ make, ÑÑо ÑайлÑ, полÑÑаемÑе в ÑезÑлÑÑаÑе ÑабоÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´ (Ñели) ÑвлÑÑÑÑÑ Ð·Ð°Ð²Ð¸ÑимÑми Ð¾Ñ ÑооÑвеÑÑÑвÑÑÑÐ¸Ñ Ñайлов-ÑеквизиÑа. make никак не пÑовеÑÑÐµÑ Ð¸ не иÑполÑзÑÐµÑ ÑодеÑжимое Ñайлов-ÑеквизиÑа, однако, Ñказание ÑпиÑка Ñайлов-ÑеквизиÑа ÑÑебÑеÑÑÑ ÑолÑко Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ make ÑбедилаÑÑ Ð² налиÑии ÑÑÐ¸Ñ Ñайлов пеÑед наÑалом вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ и Ð´Ð»Ñ Ð¾ÑÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð²Ð¸ÑимоÑÑей Ð¼ÐµÐ¶Ð´Ñ Ñайлами.
ÐбÑÑно ÑÐµÐ»Ñ Ð¿ÑедÑÑавлÑÐµÑ Ñобой Ð¸Ð¼Ñ Ñайла, коÑоÑÑй генеÑиÑÑеÑÑÑ Ð² ÑезÑлÑÑаÑе ÑабоÑÑ ÑказаннÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´. ЦелÑÑ Ñакже Ð¼Ð¾Ð¶ÐµÑ ÑлÑжиÑÑ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ некоÑоÑого дейÑÑвиÑ, коÑоÑое бÑÐ´ÐµÑ Ð²Ñполнено в ÑезÑлÑÑаÑе вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ (напÑимеÑ, ÑÐµÐ»Ñ clean в make-ÑÐ°Ð¹Ð»Ð°Ñ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑии пÑогÑамм обÑÑно ÑдалÑÐµÑ Ð²Ñе ÑайлÑ, ÑозданнÑе в пÑоÑеÑÑе компилÑÑии).
СÑÑоки, в коÑоÑÑÑ Ð·Ð°Ð¿Ð¸ÑÐ°Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð½Ð°ÑинаÑÑÑÑ Ñ Ñимвола ÑабÑлÑÑии.
РаÑÑмоÑÑим неÑложнÑÑ Ð¿ÑогÑÐ°Ð¼Ð¼Ñ Ð½Ð° Си. ÐÑÑÑÑ Ð¿ÑогÑамма program ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· паÑÑ Ñайлов кода â main.c и lib.c, а Ñакже из одного заголовоÑного Ñайла â defines.h, коÑоÑÑй подклÑÑÑн в оба Ñайла кода. ÐоÑÑомÑ, Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ program Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ из Ð¿Ð°Ñ (main.c defines.h) и (lib.c defines.h) ÑоздаÑÑ Ð¾Ð±ÑекÑнÑе ÑÐ°Ð¹Ð»Ñ main.o и lib.o, а заÑем ÑлинковаÑÑ Ð¸Ñ Ð² program. ÐÑи ÑбоÑке вÑÑÑнÑÑ ÑÑебÑеÑÑÑ Ð´Ð°ÑÑ ÑледÑÑÑие командÑ:
cc -c main.c defines.h cc -c lib.c defines.h cc -o program main.o lib.o
ÐÑли в пÑоÑеÑÑе ÑазÑабоÑки пÑогÑÐ°Ð¼Ð¼Ñ Ð² Ñайл defines.h бÑдÑÑ Ð²Ð½ÐµÑÐµÐ½Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ, поÑÑебÑеÑÑÑ Ð¿ÐµÑекомпилÑÑÐ¸Ñ Ð¾Ð±Ð¾Ð¸Ñ Ñайлов и линковка, а еÑли изменим lib.c, Ñо повÑоÑнÑÑ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑÐ¸Ñ main.о можно не вÑполнÑÑÑ.
Таким обÑазом, Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñайла, коÑоÑÑй Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð² пÑоÑеÑÑе компилÑÑии нÑжно ÑказаÑÑ, на оÑнове ÐºÐ°ÐºÐ¸Ñ Ñайлов и Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ°ÐºÐ¾Ð¹ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¾Ð½ ÑоздаÑÑÑÑ. ÐÑогÑамма make на оÑнове ÑÑÐ¸Ñ Ð´Ð°Ð½Ð½ÑÑ Ð²ÑполнÑÐµÑ ÑледÑÑÑее:
- ÑобиÑÐ°ÐµÑ Ð¸Ð· ÑÑой инÑоÑмаÑии пÑавилÑнÑÑ Ð¿Ð¾ÑледоваÑелÑноÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ ÑÑебÑемÑÑ ÑезÑлÑÑиÑÑÑÑÐ¸Ñ Ñайлов;
- и иниÑииÑÑÐµÑ Ñоздание ÑÑебÑемого Ñайла ÑолÑко в ÑлÑÑае, еÑли Ñакого Ñайла не ÑÑÑеÑÑвÑеÑ, или он ÑÑаÑÑе, Ñем ÑÐ°Ð¹Ð»Ñ Ð¾Ñ ÐºÐ¾ÑоÑÑÑ Ð¾Ð½ завиÑиÑ.
ÐÑли пÑи запÑÑке make Ñвно не ÑказаÑÑ ÑелÑ, Ñо бÑÐ´ÐµÑ Ð¾Ð±ÑабаÑÑваÑÑÑÑ Ð¿ÐµÑÐ²Ð°Ñ ÑÐµÐ»Ñ Ð² make-Ñайле, Ð¸Ð¼Ñ ÐºÐ¾ÑоÑой не наÑинаеÑÑÑ Ñ Ñимвола «.».
ÐÐ»Ñ Ð¿ÑогÑÐ°Ð¼Ð¼Ñ program доÑÑаÑоÑно напиÑаÑÑ ÑледÑÑÑий make-Ñайл:
program: main.o lib.o
cc -o program main.o lib.o
main.o lib.o: defines.h
СÑÐ¾Ð¸Ñ Ð¾ÑмеÑиÑÑ ÑÑд оÑобенноÑÑей. Римени вÑоÑой Ñели ÑÐºÐ°Ð·Ð°Ð½Ñ Ð´Ð²Ð° Ñайла и Ð´Ð»Ñ ÑÑой же Ñели не Ñказана команда компилÑÑии. ÐÑоме Ñого, нигде Ñвно не Ñказана завиÑимоÑÑÑ Ð¾Ð±ÑекÑнÑÑ Ñайлов Ð¾Ñ Â«*.c»-Ñайлов. Ðело в Ñом, ÑÑо пÑогÑамма make Ð¸Ð¼ÐµÐµÑ Ð¿ÑедопÑеделÑннÑе пÑавила Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ñайлов Ñ Ð¾Ð¿ÑеделÑннÑми ÑаÑÑиÑениÑми. Так, Ð´Ð»Ñ Ñели-обÑекÑного Ñайла (ÑаÑÑиÑение «.o») пÑи обнаÑÑжении ÑооÑвеÑÑÑвÑÑÑего Ñайла Ñ ÑаÑÑиÑением «.c» бÑÐ´ÐµÑ Ð²Ñзван компилÑÑÐ¾Ñ Â«ÑÑ -Ñ» Ñ Ñказанием в паÑамеÑÑÐ°Ñ ÑÑого «.c»-Ñайла и вÑÐµÑ Ñайлов-завиÑимоÑÑей.
СинÑакÑÐ¸Ñ Ð´Ð»Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿ÐµÑеменнÑÑ :
пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ = знаÑение
ÐнаÑением Ð¼Ð¾Ð¶ÐµÑ ÑвлÑÑÑÑÑ Ð¿ÑоизволÑÐ½Ð°Ñ Ð¿Ð¾ÑледоваÑелÑноÑÑÑ Ñимволов, вклÑÑÐ°Ñ Ð¿ÑÐ¾Ð±ÐµÐ»Ñ Ð¸ обÑаÑÐµÐ½Ð¸Ñ Ðº знаÑениÑм дÑÑÐ³Ð¸Ñ Ð¿ÐµÑеменнÑÑ . С ÑÑÑÑом Ñказанного, можно модиÑиÑиÑоваÑÑ Ð½Ð°Ñ make-Ñайл ÑледÑÑÑим обÑазом:
OBJ = main.o lib.o
program: $(OBJ)
cc -o program $(OBJ)
$(OBJ): defines.h
ÐÑжно оÑмеÑиÑÑ, ÑÑо вÑÑиÑление знаÑение пеÑеменнÑÑ Ð¿ÑоиÑÑ Ð¾Ð´Ð¸Ñ ÑолÑко в Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ (иÑполÑзÑеÑÑÑ Ñак назÑваемое ленивое вÑÑиÑление). ÐапÑимеÑ, пÑи ÑбоÑке Ñели all из ÑледÑÑÑего make-Ñайла на ÑкÑан бÑÐ´ÐµÑ Ð²Ñведена ÑÑÑока «Huh?».
foo = $(bar)
bar = $(ugh)
ugh = Huh?
all:
echo $(foo)
ÐÑедположим, ÑÑо к пÑоекÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸Ð»ÑÑ Ð²ÑоÑой заголовоÑнÑй Ñайл lib.h, коÑоÑÑй вклÑÑаеÑÑÑ ÑолÑко в lib.c. Тогда make-Ñайл ÑвелиÑиÑÑÑ ÐµÑÑ Ð½Ð° Ð¾Ð´Ð½Ñ ÑÑÑоÑкÑ:
lib.o: lib.h
Таким обÑазом, один Ñелевой Ñайл Ð¼Ð¾Ð¶ÐµÑ ÑказÑваÑÑÑÑ Ð² неÑколÑÐºÐ¸Ñ ÑелÑÑ . ÐÑи ÑÑом полнÑй ÑпиÑок завиÑимоÑÑей Ð´Ð»Ñ Ñайла бÑÐ´ÐµÑ ÑоÑÑавлен из ÑпиÑков завиÑимоÑÑей вÑÐµÑ Ñелей, в коÑоÑÑÑ Ð¾Ð½ ÑÑаÑÑвÑеÑ, Ñоздание Ñайла бÑÐ´ÐµÑ Ð¿ÑоизводиÑÑÑÑ ÑолÑко один Ñаз.
[пÑавиÑÑ] См. Ñакже
[пÑавиÑÑ] СÑÑлки
- Ð ÑководÑÑво по GNU make на gnu.org(англ.)
- Ð ÑководÑÑво по GNU make (веÑÑÐ¸Ñ 3.79)(ÑÑÑ.)
- Ð ÑководÑÑво по FreeBSD make(англ.)
- РеÑение пÑоблем, возникаÑÑиÑ
пÑи вÑполнении команд
./configure,makeиmake install - ÐÑименение GNU make(ÑÑÑ.)
- ÐÑÑекÑивное иÑполÑзование GNU Make(ÑÑÑ.)
- СпÑавка по ÑоÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Makefile(ÑÑÑ.)

