Жасау (бағдарламалық жасақтама) - Make (software)

Жасаңыз
Парадигмамакро, декларативті
ЖобалағанСтюарт Фельдман
Бірінші пайда болдыСәуір, 1976; 44 жыл бұрын (1976-04)
Іске асыру тіліC
ОЖUnix тәрізді, Тозақ
Файл форматтарыMakefile
Майор іске асыру
BSD, GNU, nmake
Диалектілер
BSD make, GNU make, Microsoft nmake
Әсер етті
Құмырсқа, Рейк, MSBuild, және басқалар

Жылы бағдарламалық жасақтама жасау, Жасаңыз Бұл автоматика құру автоматты түрде жасалатын құрал салады орындалатын бағдарламалар және кітапханалар бастап бастапқы код оқу арқылы файлдар деп аталады Makefiles мақсатты бағдарламаны қалай шығаруға болатындығын көрсетеді. Дегенмен интеграцияланған даму орталары және тіл - ерекше құрастырушы ерекшеліктерін құру процесін басқару үшін де қолдануға болады, жасау кеңінен қолданылады, әсіресе Unix және Unix тәрізді операциялық жүйелер.

Бағдарламаларды жасаумен қатар, Make кейбір файлдар басқалары өзгерген кезде басқаларынан автоматты түрде жаңартылып отыратын кез-келген жобаны басқаруға қолданыла алады.

Шығу тегі

Қазір тәуелділікті қадағалайтын бірқатар утилиталар бар, бірақ Make - ең кең таралған, ең алдымен оның құрамына кіруіне байланысты Unix, бастап басталады PWB / UNIX 1.0, онда бағдарламалық қамтамасыз етуді дамытуға бағытталған әр түрлі құралдар ұсынылды.[1] Ол бастапқыда жасаған Стюарт Фельдман 1976 жылы сәуірде сағ Bell Labs.[2][3][1] Фельдман 2003 ж. Алды ACM Осы кең таралған құралдың авторы үшін Бағдарламалық қамтамасыздандыру жүйесі сыйлығы.[4]

Фельдманға жазушы жазушының кездейсоқ жаңартылмайтын бағдарламасын түзетіп, оның бағдарламасын түкке тұрғысыз жою тәжірибесінен жаса:

Стив Джонсонның (yacc авторы және т.б.) сапарынан, менің кеңсеме басып кіріп, оны таңертең дұрыс бағдарламаны жөндеу кезінде босқа жіберген тағдырларды қарғағаннан (қате жойылды, файл жиналмаған) cc * .o сондықтан әсер етпеді). Алдыңғы кештің бір бөлігін мен жұмыс істеп жатқан жобада сол апатпен күресуге жұмсағандықтан, оны шешетін құрал туралы ой келді. Бұл тәуелділіктің анализаторы туралы терең идеядан басталды, әлдеқайда қарапайым нәрсеге қайнап, сол демалыс күндері Макеге айналды. Әлі суланған құралдарды қолдану мәдениеттің бір бөлігі болды. Makefiles - бұл сиқырлы кодталған екілік файлдар емес, мәтіндік файлдар, өйткені бұл Unix этосы болды: басып шығаруға, жөндеуге болатын, түсінікті материалдар.

— Стюарт Фельдман, Unix бағдарламалау өнері, Эрик С. Реймонд 2003

Make-ді енгізбестен бұрын Unix құрастыру жүйесі көбінесе тұрады операциялық жүйе тәуелді «жасау» және «орнату» қабықша сценарийлері бағдарламаның қайнар көзімен бірге жүреді. Әр түрлі мақсаттарға арналған командаларды бір файлға біріктіре білу және тәуелділікті қадағалау мен мұрағатпен жұмыс жасауды тұжырымдау мүмкіндігі заманауи құрастыру орталары үшін маңызды қадам болды.

Туынды

Мак бірқатарды басынан өткерді қайта жазады бірдей файл форматы мен негізгі алгоритмдік принциптерді қолданған, сонымен қатар өздерінің стандартты емес жетілдірулерінің бірқатар нұсқаларын ұсынған нөлдік нұсқаларын қоса алғанда. Олардың кейбіреулері:

  • Sun DevPro Make 1986 жылы SunOS-3.2 көмегімен пайда болды. SunOS-3.2 көмегімен ол қосымша бағдарлама ретінде жеткізілді; SunOS-4.0 көмегімен SunPro Make әдепкі Make бағдарламасы болды.[5][жақсы ақпарат көзі қажет ] 2006 жылдың желтоқсанында Sun DevPro Make ашық көзге күш салу шеңберінде ашық көзге айналды Solaris.[6][7]
  • dmake немесе Distributed Make Sun Solaris Studio-мен бірге жасалады, бірақ Solaris амалдық жүйесінде (SunOS) әдепкі емес. Бастапқыда OpenOffice құру қажет болған, бірақ 2009 ж[8] құрастыру жүйесі GNU Make қолдану үшін қайта жазылды. Әзірге Apache OpenOffice әлі де екі құрастыру жүйесінің қоспасын қамтиды,[9] әлдеқайда белсенді дамыған LibreOffice жаңғыртылған «гиблді» қазір ғана қолданады.[8]
  • BSD Жасау (пмэйк,[10] bmake[11] немесе жалған[12]), ол Адам де Бурдың мақсат қоюға қабілетті Make нұсқасы бойынша жұмысынан алынған параллель, және әртүрлі дәрежедегі модификация кезінде өмір сүреді FreeBSD,[11] NetBSD[13] және OpenBSD.[14] Айырмашылығы, оның шартты және қайталанатын циклдары бар, олар талдау кезеңінде қолданылады және шартты және бағдарламалық түрде макияж салу үшін қолданыла алады.[15]оның ішінде жұмыс кезінде мақсатты генерациялау.[дәйексөз қажет ]
  • GNU Жасаңыз (қысқа gmake) - бұл Linux және macOS үшін Make стандартты енгізу.[16] Бұл шартты сияқты бірнеше түпнұсқа Маркаға арналған кеңейтулер ұсынады. Сондай-ақ, ол макияж ережелеріндегі қабықшалар сценарийлерінің қажеттілігін болдырмауға, сондай-ақ файлда орнатылған және қолданылатын айнымалыларды басқаруға арналған көптеген кіріктірілген функцияларды ұсынады.[17] Мысалы, әрқайсысы үшін функциясы берілген каталогтағы барлық файлдардың тізіміне айнымалыны орнатады.[18] GNU Make көптеген бағдарламалық жасақтама жүйелерін құру үшін қажет, соның ішінде GCC (3.4 нұсқасынан бастап)[19]), Linux ядросы,[20][21] Apache OpenOffice,[9] LibreOffice,[8] және Mozilla Firefox.[22]
  • Рокки Бернштейннің қайта құруы[23] - бұл GNU Make шанышқысы және GNU Make-тен жақсы кеңейтімдерді ұсынады, мысалы, орналасу және қателіктер туралы есеп беру, орындау трассировкасы, орындалу профилі және ол түзеткішті қамтиды.
  • Гленн Фаулер nmake[24] сол аттас Microsoft бағдарламасына қатысы жоқ. Оның кірісі Make-ге ұқсас, бірақ үйлесімді емес. Бұл бағдарлама төте жолдар мен кіріктірілген мүмкіндіктерді ұсынады, бұл оның әзірлеушілеріне сәйкес макияж өлшемін 10 есе кішірейтеді.
  • Microsoft nmake, әдетте құрамына кіретін командалық жол құралы Visual Studio.[25] Ол командалық жолда немесе макияжда орнатылған айнымалыларды қолданатын шартты өрнектер сияқты препроцессорлық директиваларды қолдайды.[26][27] Қорытынды ережелері Make-ден өзгеше; мысалы, олар іздеу жолдарын қамтуы мүмкін.[28] Құрал жеткізілген Эмбаркадеро өнімдерде «Microsoft корпорациясының NMAKE-ді имитациялау үшін MAKE тудырады» деген командалық жол бар.[29]
  • Mk ауыстыру Unix зерттеуі, 9-нұсқадан бастап.[30] Bell Labs бағдарламашысы Эндрю Г. Хьюмнің түпнұсқа құралын қайта жасақтауында басқа синтаксис бар. Mk стандартты құрастыру құралы болды Жоспар 9, Bell Labs Unix мұрагері.[31]
  • Кэти - Google-дің GNU Make-ті ауыстыруы Android OS салады. Бұл макияжды аударады ниндзя жылдам өсу үшін.[32]

POSIX Make утилитасының негізгі функциялары мен жұмысын стандарттауды қамтиды және Make-дің Unix негізіндегі нұсқаларында әр түрлі толықтығымен жүзеге асырылады. Жалпы, Make-дің әртүрлі нұсқалары арасында қарапайым макияждарды ақылға қонымды жетістіктермен пайдалануға болады. GNU Make, Makepp және BSD-нің кейбір нұсқалары «GNUmakefile» деп аталатын файлдарды іздеу үшін әдепкі күйге келтіреді,[33] «Makeppfile»[34] және «BSDmakefile»[35] сәйкесінше, бұл жекелеген жерлерде іске асыруға байланысты мінез-құлықты қолданатын макияждар қоюға мүмкіндік береді.

Мінез-құлық

Әдетте жасау үшін қолданылады салу бастапқы кодтан орындалатын бағдарламалар мен кітапханалар. Әдетте, Make бастапқы файлды мақсатты нәтижеге айналдыру үшін кез-келген командаларды орындауды қамтитын кез-келген процеске қолданылады. Мысалы, Make кескін файлына (дереккөзге) енгізілген өзгерісті анықтау үшін қолданылуы мүмкін және түрлендіру әрекеттері файлды белгілі бір форматқа түрлендіру, нәтижені мазмұнды басқару жүйесіне көшіру, содан кейін электрондық пошта жіберу болуы мүмкін. жоғарыда аталған әрекеттердің орындалғанын көрсететін алдын-ала анықталған қолданушылар жиынтығына.

Make файлын мақсатты файл атауларының тізімімен шақыру қажет командалық жол аргументтері:

жасау [МАҚСАТ ...]

Аргументсіз Make өзінің файлында пайда болатын бірінші мақсатты салады, ол дәстүрлі түрде символдық «фони» деп аталады барлық.

Мақсатты қалпына келтіру қажеттілігі туралы файлды өзгерту уақыттарын салыстыру арқылы шешіңіз.[36] Бұл қазірдің өзінде жаңартылған файлдарды құруға жол бермеу мәселесін шешеді, бірақ файл өзгерген кезде сәтсіздікке ұшырайды, бірақ оның өзгеру уақыты өткенде қалады. Мұндай өзгерістер бастапқы файлдың ескі нұсқасын қалпына келтіруден немесе а желілік файлдар жүйесі файлдардың көзі болып табылады және оның сағат немесе уақыт белдеуі Make-пен жұмыс істейтін машинамен синхрондалмайды. Пайдаланушы бұл жағдайды толық құруды мәжбүрлеу арқылы шешуі керек. Керісінше, егер бастапқы файлды өзгерту уақыты болашақта болса, ол қажетсіз қайта құруды тудырады, бұл пайдаланушыларға қолайсыздық тудыруы мүмкін.


Makefiles дәстүрлі түрде кодты (* .c, * .cc, * .C және т.б.) құрастыру үшін қолданылады, бірақ оларды жалпы тапсырмаларды автоматтандыру командаларын беру үшін де қолдануға болады. Осындай макияждың бірі пәрмен жолынан шақырылады:

жасау # Дәлелсіз бірінші TARGET іске қосыладыжасау Көмектесіңдер                   # Қол жетімді МАҚСАТТАРДЫ көрсетудист жасау # Ағымдағы дирден мұрағат жасаңыз

Makefile

Makefile-ді қолданыстағы каталогтан іздеңіз, мысалы. GNU файлдарының бірін іздеу үшін іздеу жасаңыз GNUmakefile, makefile, немесе Makefile содан кейін көрсетілген (немесе әдепкі) мақсатты (-ларды) сол файлдан (тек) іске қосады.

Makefile тілі ұқсас декларативті бағдарламалау.[37][38][39] Қажетті соңғы шарттар сипатталған, бірақ іс-әрекеттердің реті маңызды емес тілдің бұл класы кейде дағдыланған бағдарламашыларды шатастырады императивті бағдарламалау.

Бір мәселе автоматика құру - бұл құрастыру процесін берілгенге сәйкес келтіру платформа. Мысалы, бір платформада қолданылған компилятор екінші бірде қолданылған опцияларды қабылдамауы мүмкін. Мұны Маке жақсы өңдемейді. Бұл мәселе әдетте платформаға арналған құрастыру нұсқауларын жасау арқылы шешіледі, оларды өз кезегінде Make өңдейді. Бұл процестің жалпы құралдары болып табылады Автоконф, CMake немесе GYP (немесе жетілдірілген) NG ).

Ережелер

Makefile мыналардан тұрады ережелер. Әр ереже мәтіннен басталады тәуелділік сызығы анықтайтын а мақсат содан кейін қос нүкте (:) және мақсатқа тәуелді компоненттерді (файлдар немесе басқа мақсаттар) санау қажет. Тәуелділік сызығы мақсат (тоқ ішектің сол қолы) компоненттерге (тоқ ішектің оң қолы) тәуелді болатындай етіп орналастырылған. Мақсаттың алғышарттары ретінде компоненттерге сілтеме жасау әдеттегідей.

мақсат [мақсат ...]: [компонент ...]Tab ↹[команда 1]. . .Tab ↹[пәрмен n]

Әдетте әр ережеде бірнеше мақсат емес, бірегей мақсат болады.

Мысалы, а C .o объектілік файлы .c файлдарынан жасалады, сондықтан .c файлдары бірінші орынға шығады (яғни нақты нысан файлы мақсат C бастапқы файлына және тақырыптық файлдар ). Make-дің өзі әртүрлі файлдарды түсінбейтін, танымайтын немесе ажыратпайтын болғандықтан, бұл адамның қателігіне жол ашады. Ұмытылған немесе қосымша тәуелділік бірден байқалмауы мүмкін және туындаған бағдарламалық жасақтамада ұсақ қателіктерге әкелуі мүмкін. Осы тәуелділікті тудыратын makefiles-ті бөгде құралдарды шақыру арқылы жазуға болады, ал кейбір makefile генераторлары, мысалы Автоматты жасау ұсынған құралдар тізбегі GNU жобасы, автоматты түрде жасай алады.

Әр тәуелділік жолынан кейін компоненттерді (әдетте бастапқы файлдарды) мақсатқа айналдыру әдісін анықтайтын TAB шегінісі бар командалық жолдар тізбегі келуі мүмкін (әдетте «нәтиже»). Егер қандай-да бір алғышарттар мақсатқа қарағанда жақсырақ өзгертілсе, командалық жолдар іске қосылады. GNU Make құжаттамасы ережеге байланысты командаларға «рецепт» ретінде сілтеме жасайды.

Бірінші команда алғышарттардан кейін сол жолда үтірмен бөлініп шығуы мүмкін,

мақсаттар : алғышарттар ; команда

Мысалға,

Сәлеметсіз бе: ; @жаңғырық "Сәлеметсіз бе"

Неден бастау керектігін шешіңіз топологиялық сұрыптау.

Әр командалық жол а-дан басталуы керек қойынды таңбасы бұйрық ретінде танылуы керек. Қойынды а бос кеңістік сипаты, бірақ кеңістік сипаты бірдей арнайы мағынаға ие емес. Бұл мәселе туындайды, өйткені қойынды мен кеңістіктегі кейіпкерлер қатарының визуалды айырмашылығы болмауы мүмкін. Макфайлдар синтаксисінің бұл жағы жиі сынға ұшырайды; ол сипатталған Эрик С. Реймонд «Unix тарихындағы ең нашар дизайн боттарының бірі» ретінде[40] және Unix-Haters анықтамалығы «қойындыларды синтаксистің бөлігі ретінде пайдалану пунги таяқшаларының бірі сияқты Жасыл береттер Фельдман таңдауды а уақытша шешім тілекпен сақталған іске асырудың қиындықтары үшін кері үйлесімділік алғашқы қолданушылармен:

Неліктен 1-бағандағы қойынды? Як жаңа болды, Лекс жаңа болды. Мен де сынап көрмеппін, сондықтан бұл оқуға жақсы сылтау болар деп ойладым. Lex-тегі алғашқы пышақпен өзімді үрейлендіргеннен кейін, мен жай ғана жаңа сызық-қойындысымен қарапайым нәрсе жасадым. Ол жұмыс істеді, қалды. Содан кейін бірнеше аптадан кейін менің пайдаланушылар саны он шақты болды, олардың көпшілігі достар болды және мен өзімнің кіріктірілген базамды бұзғым келмеді. Қалғаны, өкінішке орай, тарих.

— Стюарт Фельдман[40]

Алайда GNU Make 3.82 нұсқасынан бастап .RECIPEPREFIX арнайы айнымалысының көмегімен рецепт префиксі ретінде кез-келген символды (бір таңбаны) таңдауға мүмкіндік береді, мысалы:

.RECIPEPREFIX := :барлық:: @echo «рецепт префиксінің символы '$ (. RECIPEPREFIX)' ретінде орнатылған»

Әр команда бөлек орындалады қабық немесе командалық аудармашы данасы. Операциялық жүйелер әртүрлі командалық жолдағы интерпретаторларды қолданатындықтан, бұл портативті файлдарға әкелуі мүмкін. Мысалы, GNU Make (барлығы POSIX жасайды) әдепкі бойынша пәрмендерді орындайды / bin / sh, қайда Unix сияқты командалар cp әдетте қолданылады. Одан айырмашылығы, Microsoft корпорациясының nmake cmd.exe көмегімен командаларды орындайды партия сияқты командалар көшірме қол жетімді, бірақ міндетті емес cp.

Ережеде командалық жолдар анықталмауы мүмкін. Тәуелділік сызығы тек мақсатқа қатысты компоненттерден тұруы мүмкін, мысалы:

нақты: таза таза

Ереженің командалық жолдары әдетте мақсатты жасайтындай етіп орналастырылады. Мысал: егер file.html жаңа, ол мәтінге ауыстырылады. Makefile мазмұны:

file.txt: файл.HTMLсілеусін -dump file.html> file.txt

Жоғарыда келтірілген ережелер «file.txt» жасау кезінде іске қосылады. Келесі шақыруда Make осы ережені «file.htxt» жаңа болса, «file.txt» мақсатты жаңарту үшін қолданады.

file.txt жасаңыз

Командалық жолдарда келесі үш префикстің біреуі немесе бірнешеуі болуы мүмкін:

  • а сызықша-минус (-), қателіктер еленбейтінін көрсете отырып
  • ан белгіде (@), пәрмен орындалмас бұрын стандартты нәтижеге басып шығарылмайтындығын көрсетеді
  • а қосу белгісі (+), егер команда «орындамаңыз» режимінде шақырылған болса да, команда орындалады

Қателіктерді елемеу және жаңғырықты өшіруді «.IGNORE» және «.SILENT» арнайы мақсаттары арқылы алуға болады.[41]

Microsoft-тың NMAKE-де осы макияждардан алынып тасталуы мүмкін ережелер бар, мысалы. «c.obj $ (CC) $ (CFLAGS)».

Макростар

Макияж макросының анықтамаларын қамтуы мүмкін. Макростар әдетте деп аталады айнымалылар олар «CC = clang» сияқты қарапайым жол анықтамаларын ұстағанда. Макияждардағы макростарды командалық жол аргументтері Make утилитасына өтті. Қоршаған ортаның айнымалылары макро ретінде қол жетімді.

Макростар пайдаланушыларға құрастыру процесінде шақырылған бағдарламаларды және басқа да реттелетін әрекеттерді анықтауға мүмкіндік береді. Мысалы, макрофильмдерде макрофильмдер «а» орналасуына сілтеме жасау үшін жиі қолданылады C компилятор, ал пайдаланушы нақты компиляторды пайдалану үшін көрсеткісі келуі мүмкін.

Жаңа макростар (немесе қарапайым «айнымалылар») дәстүрлі түрде бас әріптермен анықталады:

МАКРО = анықтама

Макросты кеңейту арқылы қолданылады. Дәстүр бойынша бұл оның атауын ішіне енгізу арқылы жасалады $(). (Жақшаны алып тастағаннан кейін келесі әріпті интерпретациялауға әкеледі $ бүкіл айнымалы атауы ретінде.) эквивалентті формада жақшалар емес, бұйра жақшалар қолданылады, яғни. ${}, бұл қолданылған стиль BSD.

NEW_MACRO = $(МАКРО)-$(MACRO2)

Макростарды пайдалану арқылы қабықша командаларынан тұруға болады команданы ауыстыру деп белгіленген оператор артқа шегіністер (`).

YYYYMMDD  = ` күн `

Анықтаманың мазмұны «сол күйінде» сақталады. Жалқау бағалау макростар әдетте кеңейту қажет болған жағдайда ғана кеңейтілетіндігін білдіреді, мысалы, ереженің командалық жолдарында қолданылған кезде. Кеңейтілген мысал:

ПАКЕТ   = пакетНҰСҚА   = ` күн +«% Y.% m% d» `МҰРАҒАТ   = $(ПАКЕТ)-$(НҰСҚА)дист:# Қабықша интерпретациялау үшін қазір ғана макростар кеңейтілгеніне назар аударыңыз:# tar -cf пакеті-`күні + «% Y% m% d» «.tartar -cf $(МҰРАҒАТ).tar.

Пәрмен жолында макростарды анықтауға арналған жалпы синтаксис:

жасау МАКРО=«мән» [МАКРО=«мән» ...] МАҚСАТ [МАҚСАТ ...]

Makefiles алдын ала анықталған кез келген кез келгеніне қол жеткізе алады ішкі макростар, «?» және '@' ең көп таралған.

мақсат: компонент1 компонент2# құрамында назар аударуды қажет ететін компоненттер бар (яғни олар қазіргі МАҚСАТТАН гөрі ЖАС).	жаңғырық $? # ішектің сол жақ бөлігінің ішіндегі ағымдағы TARGET атауын бағалайды.	жаңғырық $@

Синтаксистің кеңейтілген кеңеюі - қолдану +=, ?=, және != теңдік белгісінің орнына. Ол BSD-де жұмыс істейді және GNU бірдей.[42]

Суффикс ережелері

Суффикстің ережелерінде нысандарда аты-жөндері көрсетілген «нысандар» бар .FROM.TO және файл кеңейтуіне негізделген әрекеттерді бастау үшін қолданылады. Суффикс ережелерінің командалық жолдарында POSIX анықтайды[43] ішкі макро $< бірінші алғышартқа жатады және $@ мақсатқа сілтеме жасайды. Бұл мысалда кез-келген HTML файлын мәтінге түрлендіретін қабықты қайта бағыттау белгісі > командалық жолдың бөлігі болып табылады, ал $< HTML файлына қатысты макро:

.ҚОСЫМШАЛАР: .жазу .HTML# .Html-ден .txt-ке дейін.html.txt:сілеусін -dump $ <> $@

Пәрмен жолынан шақырылған кезде жоғарыдағы мысал кеңейеді.

$ make -n file.txtlynx -dump file.html> file.txt

Үлгі ережелері

Суффикс ережелерінің өзіндік алғышарттары болуы мүмкін емес.[44] Егер олар бар болса, олар жұрнақ ережелері ретінде емес, әдеттен тыс атаулары бар кәдімгі файлдар ретінде қарастырылады. GNU Make ескі файлдармен үйлесімділік үшін суффикс ережелерін қолдайды, бірақ басқаша қолдануға ынталандырады өрнек ережелері.[45]

Үлгі ережесі кәдімгі ережеге ұқсайды, тек оның мақсатында '%' символы бар. Мақсат файл атауларын сәйкестендіруге арналған үлгі ретінде қарастырылады: '%' нөлдік немесе одан көп таңбалардың кез келген ішкі тізбегіне сәйкес келеді,[46] ал басқа кейіпкерлер тек өздеріне сәйкес келеді. Алғышарттар олардың атауларының мақсатты атпен байланыстылығын көрсету үшін '%' таңбасын қолданады.

Жоғарыда көрсетілген жұрнақ ережесінің мысалы келесі үлгі ережесіне ұқсайды:

#% .Html-ден% .txt-ке дейін%.жазу : %.HTML сілеусін -dump $ <> $@

Басқа элементтер

Бір жол түсініктемелер басталады хэш белгісі (#).

Макияждағы кейбір директивалар мүмкін қосу басқа макияждар.

Сызықтың жалғасы кері сызықпен көрсетілген \ жолдың соңындағы таңба.

   мақсат: компонент  компонент Tab ↹команда;  Tab ↹пәрмен |  Tab ↹пәрмен


Мысал файлдары

Макияж:

ПАКЕТ	 = пакетНҰСҚА	 = ` күн «+% Y.% m% d%» `RELEASE_DIR  = ..RELEASE_FILE = $(ПАКЕТ)-$(НҰСҚА)# LOGNAME айнымалысы қоршаған ортадан шыққанына назар аударыңыз# POSIX қабығы.## мақсат: барлығы - Әдепкі мақсат. Ештеңе жасамайды.барлық:	жаңғырық «Сәлеметсіз бе $(ЖҮЙЕ), әдепкі бойынша ештеңе істемейді «# кейде: echo «Сәлем $ {LOGNAME}, әдепкі бойынша ештеңе істеуге болмайды»	жаңғырық «Көмектесіп көріңіз» «# мақсат: анықтама - Шақырылатын мақсатты көрсету.Көмектесіңдер:egrep «^ # мақсат:» [Мм]akefile# мақсат: тізім - бастапқы файлдардың тізімітізім:# Жұмыс істемейді. Әр команда бөлек қабықта орналасқан	CD src ls# Дәл сол қабықтың жалғасы, жалғасы	CD src; \лс# target: dist - Шығарылым жасаңыз.дист:tar -cf $(RELEASE_DIR)/$(RELEASE_FILE) && \gzip -9 $(RELEASE_DIR)/$(RELEASE_FILE).tar

Төменде әдепкі бойынша (алдымен «барлығы» ережесі тізімделеді) жүйенің C компиляторы көмегімен «helloworld.c» деп аталатын бастапқы файлды құрастыратын өте қарапайым макияж және сонымен қатар егер пайдаланушы құрылған файлдарды жою үшін «таза» мақсатты ұсынса қайта бастағысы келеді. The $@ және $< ішкі макростардың екеуі (автоматты айнымалылар деп те аталады) және сәйкесінше мақсатты атау мен «жасырын» көзді білдіреді. Төмендегі мысалда, $^ алғышарттардың бос орынмен бөлінген тізіміне дейін кеңейеді. Басқа бірқатар ішкі макростар бар.[43][47]

CFLAGS ?=барлық: Сәлем ӘлемСәлем Әлем: Сәлем Әлем.o# Командалар бос орын емес TAB басталады	$(CC) $(LDFLAGS)$@ $^helloworld.o: Сәлем Әлем.c	$(CC) $(CFLAGS) -c -o $@ $<таза: FRCrm -f helloworld helloworld.o# Бұл жалған мақсат FRC-ге тәуелді барлық мақсаттарды тудырады# мақсатты атауы бар файл болған жағдайда да қалпына келтіру керек.# Бұл кез-келген жүзеге асырумен жұмыс істейді деген болжаммен жұмыс істейді# ағымдағы каталогта FRC файлы жоқ.FRC:

Көптеген жүйелер файл суффиксі негізінде компиляция сияқты жалпы міндеттерді белгілеу үшін алдын ала анықталған ережелер мен макростармен келеді. Бұл пайдаланушыларға көзден (көздерден) мақсатты қалай жасау керектігі туралы нақты (көбінесе дәлелденбейтін) нұсқауларды жіберіп алуға мүмкіндік береді. Мұндай жүйеде жоғарыдағы макияжды келесідей өзгертуге болады:

барлық: Сәлем ӘлемСәлем Әлем: Сәлем Әлем.o	$(CC) $(CFLAGS) $(LDFLAGS)$@ $^таза: FRCrm -f helloworld helloworld.o# Бұл нақты суффикс ережесі. Ол жүйелерде алынып тасталуы мүмкіносындай қарапайым ережелерді автоматты түрде басқаратын #..c.o:	$(CC) $(CFLAGS) -c $ <FRC:.ҚОСЫМШАЛАР: .c


Бұл «helloworld.o» «helloworld.c» -ке тәуелді болады, оны автоматты түрде Make басқарады. Мұнда келтірілген қарапайым мысалда бұл өте маңызды, бірақ суффикстер ережелерінің нақты күші бағдарламалық жасақтама жобасындағы бастапқы файлдар саны көбейе бастағанда айқын болады. Байланыстыру қадамына ереже жазып, объектілік файлдарды алғышарт ретінде жариялау керек. Содан кейін Make барлық нысандық файлдарды қалай жасау керектігін анықтайды және барлық бастапқы файлдардағы өзгерістерді іздейді.

Қарапайым суффикстер ережелері бастапқы файлдар бір-біріне және тақырыптық файлдар сияқты басқа файлдарға тәуелді болмайынша жақсы жұмыс істейді. Құрастыру процесін жеңілдетудің тағы бір жолы - компилятордың көмегімен тәуелділікті генерациялаумен үйлесетін өрнектерді сәйкестендіру ережелерін пайдалану. Gcc компиляторы мен GNU Make-ті талап ететін соңғы мысал ретінде міне, жалпы C файлын папкадағы барлық нысан файлдарын сәйкес объектілік файлдарға жинап, содан кейін оларды түпкілікті орындалатын файлға байланыстыратын жалпылама файл құрайды. Компиляция жасалмас бұрын, тәуелділіктер файлға ыңғайлы форматта жасырылған «.depend» файлына жинақталады, содан кейін файлға қосылады. Портативті бағдарламалар төменде келтірілген конструкциялардан аулақ болу керек.

# Жалпы GNUMakefile# Басқа make (1) командаларының орындалуын тоқтату үшін үзінді# бұл жолдарды түсінбейтінifneq (,)Бұл makefile талап етеді GNU Жасаңыз.endifБАҒДАРЛАМА = ақымақC_FILES := $(қойылмалы таңба * .c)OBJS := $(patsubst% .c,% .o, $(C_FILES))CC = ccCFLAGS = -Қабырға -педантикалықLDFLAGS =LDLIBS = -lmбарлық: $(БАҒДАРЛАМА)$ (БАҒДАРЛАМА): .тәуелді $(OBJS)	$(CC) $(CFLAGS) $(OBJS) $(LDFLAGS)$(БАҒДАРЛАМА) $(LDLIBS)тәуелді: .тәуелді.тәуелді: cmd = gcc -ММ -MF тәуелді $(var); мысық тәуелді >> .тәуелді;.тәуелді:@echo «Тәуелділіктер жасалуда ...»	@$(foreach var, $(C_FILES), $(cmd))@rm -f тәуелдітәуелді# Бұл үлгілерді сәйкестендіру ережелері. Автоматтан басқаМұнда # айнымалы қолданылады, $ * дегенге сәйкес келетін айнымалы# ерекше жағдайларда пайдалы болуы мүмкін.% .o: %.c	$(CC) $(CFLAGS) -c $ <-o $@%: %.o	$(CC) $(CFLAGS)$@ $<таза:тәуелді $(OBJS).ФОНИЯ: таза тәуелді

Сондай-ақ қараңыз

Әдебиеттер тізімі

  1. ^ а б Томпсон, Т. Дж. (Қараша 1980). «Дизайнердің жұмыс үстелі: өндірістік ортаны қамтамасыз ету». Bell System техникалық журналы. 59 (9): 1811–1825. дои:10.1002 / j.1538-7305.1980.tb03063.x. S2CID  27213583. DWB-ге жалпы техникалық қызмет көрсетуде біз Source Code Control жүйесін қолдандық және PWB / UNIX * интерактивті операциялық жүйесі ұсынған утилитаны қолданамыз.
  2. ^ «V7 / usr / src / cmd / make / ident.c». tuhs.org. 1 қыркүйек 2013. мұрағатталған түпнұсқа 2013 жылдың 1 қыркүйегінде. Алынған 18 наурыз 2018.
  3. ^ Фельдман, С. И. (сәуір, 1979). «Make --- Компьютерлік бағдарламаларға қызмет көрсетуге арналған бағдарлама». Бағдарламалық жасақтама: тәжірибе және тәжірибе. 9 (4): 255–265. CiteSeerX  10.1.1.39.7058. дои:10.1002 / спе.4380090402.
  4. ^ Мэттью Доар (2005). Практикалық даму орталары. O'Reilly Media. б. 94. ISBN  978-0-596-00796-6.
  5. ^ «Google Groups». arquivo.pt. Түпнұсқадан мұрағатталған 22 қаңтар 2011 ж. Алынған 18 наурыз 2018.CS1 maint: BOT: түпнұсқа-url күйі белгісіз (сілтеме)
  6. ^ «OpenSolaris at Two (Джим Гризанцио)». 12 желтоқсан 2013. мұрағатталған түпнұсқа 12 желтоқсан 2013 ж. Алынған 18 наурыз 2018.
  7. ^ Гризанцио, Джим. OpenSolaris тарихы.
  8. ^ а б c «Даму / Gbuild - Құжат қоры Wiki». wiki.documentfoundation.org. Алынған 18 наурыз 2018.
  9. ^ а б «Apache OpenOffice құру жөніндегі нұсқаулық - Apache OpenOffice Wiki». wiki.openoffice.org. Алынған 18 наурыз 2018.
  10. ^ FreeBSD 2.0.5 Бастапқы кодты жасаңыз, 1993
  11. ^ а б https://www.freebsd.org/cgi/man.cgi?query=bmake&sektion=1
  12. ^ https://manpages.debian.org/jessie/freebsd-buildutils/fmake.1
  13. ^ «жасау». NetBSD нұсқаулық беттері. Алынған 9 шілде 2020.
  14. ^ «make (1) - OpenBSD нұсқаулық беттері». man.openbsd.org. Алынған 18 наурыз 2018.
  15. ^ «жасау». FreeBSD. Алынған 9 шілде 2020. Makefile қосылуы, шартты құрылымдары және C бағдарламалау тілін еске түсіретін циклдар маркада келтірілген.
  16. ^ Арнольд Роббинс (2005), Unix in the Nutshell, төртінші басылым, О'Рейли
  17. ^ «8. Мәтінді түрлендіру функциялары», GNU маркасы, Free Software Foundation, 2013 ж
  18. ^ «8.5 Алдыңғы функция», GNU маркасы, Free Software Foundation, 2013 ж
  19. ^ «GCC 3.4 сериялы өзгерістер, жаңа мүмкіндіктер және түзетулер». Тегін бағдарламалық қамтамасыз ету қоры. 2006 ж.
  20. ^ Хавьер Мартинес Каниллас (2012 жылғы 26 желтоқсан). «Kbuild: Linux Kernel Build жүйесі». Linux журналы.
  21. ^ Грег Кроах-Хартман (2006), Қысқаша мазмұндағы Linux ядросы, О'Рейли
  22. ^ «Құрылыс нұсқаулары».
  23. ^ Рокки Бернштейн. «Remake - түсінікті трекингпен және түзеткішпен GNU жасаңыз».
  24. ^ Гленн Фаулер (2012 жылғы 4 қаңтар). «nmake шолу». Ақпараттық және бағдарламалық қамтамасыз ету жүйелерін зерттеу, AT&T Labs зерттеуі. Архивтелген түпнұсқа 2015 жылдың 2 қыркүйегінде. Алынған 26 мамыр, 2014.
  25. ^ «NMAKE Reference Visual Studio 2015». Microsoft. 2015 ж.
  26. ^ «Makefile алдын-ала өңдеу директивалары». 2014.
  27. ^ «Makefile алдын-ала өңдеу операторлары». Microsoft. 2014 жыл.
  28. ^ «Ережелердегі жолдарды іздеу». Microsoft. 2014 жыл.
  29. ^ «ЖАСАУ». CodeGear (TM). 2008 ж.
  30. ^ McIlroy, M. D. (1987). Unix оқырманы: бағдарламашының нұсқаулығынан түсіндірме алынған үзінділер, 1971–1986 жж (PDF) (Техникалық есеп). Bell Labs. CSTR 139
  31. ^ Хьюм, Эндрю Г .; Фландрена, Боб (2002). «Mk көмегімен 9-жоспардағы файлдарды жүргізу». 9 бағдарламашының нұсқаулығы. AT&T Bell зертханалары. Мұрағатталды түпнұсқадан 2015 жылғы 11 шілдеде.
  32. ^ «google / kati: эксперименттік GNU клон жасайды». GitHub. 30 қараша 2020.
  33. ^ «GNU» жасайды'". Тегін бағдарламалық қамтамасыз ету қоры.
  34. ^ «Makepp».
  35. ^ «Тегін BSD маркасы».
  36. ^ Linux ls командалық файлының шығуын қалай сұрыптауға болады Мұрағатталды 2016 жылғы 13 қыркүйек, сағ Wayback Machine
  37. ^ dsls туралы шолу Мұрағатталды 23 қазан 2007 ж Wayback Machine, 2007/02/27, феникс вики
  38. ^ Re: хореография және REST Мұрағатталды 2016 жылғы 12 қыркүйек, сағ Wayback Machine, Кристофер Б Ферристен 2002-08-09
  39. ^ Мақсатты Junior Makefiles Мұрағатталды 7 қаңтар, 2010 ж Wayback Machine, Эндрю В. Фицгиббон ​​және Уильям А. Гофман
  40. ^ а б «15-тарау. Құралдар: жасау: сіздің рецепттеріңізді автоматтандыру», Unix бағдарламалау өнері, Эрик С. Реймонд 2003
  41. ^ жасау - Пәрмендер мен утилиталар туралы анықтама, Бірыңғай UNIX спецификациясы, 7 шығарылым Ашық топ
  42. ^ жасау (1) – FreeBSD Жалпы командалар Қолмен
  43. ^ а б «жасау». www.opengroup.org. Алынған 18 наурыз 2018.
  44. ^ «GNU нұсқаулық жасайды: суффикстер туралы ережелер». Тегін бағдарламалық қамтамасыз ету қоры.
  45. ^ «GNU нұсқаулық жасайды: үлгі ережелері». Тегін бағдарламалық қамтамасыз ету қоры.
  46. ^ Бөлімді қараңыз Үлгіні сәйкестендіру ережелері SunPro man парағында Мұрағатталды 29 мамыр 2014 ж., Сағ Wayback Machine
  47. ^ Автоматты айнымалылар Мұрағатталды 2016 жылғы 25 сәуір, сағ Wayback Machine GNU «жасау»

Сыртқы сілтемелер