Makefile

от ILuxWiki

Направо към: навигация, търсене

Информация за това какво има в Mаkefile и как се използва

При стартирането си make проверява наколко файла за инструкций, в повечето варианти първия съдържа специфични настройки отнасящи се за система, а Mаkefile съдържа оказанията за свършване на конкретната задача.

Mаkefile-йловете могат да съдържат следните компоменти

  • коментари (comments)
  • зависимости (dependency)
  • редове (lines)
  • команди (directives)
  • макроси (macros)
  • отговорни файлове (response files)
  • правила (rules)
  • shell команди (shell lines)

Продължителни редове - редовете в Mаkefile могат да бъдат доста дълги затова се налага по някога те да бъдат пренесени на нов ред. Това става чрез символа \. Ето пример:

   first_part_of_line second_part_of_line

може да се запише като:

   first_part_of_line \
   second_part_of_line

Съдържание

Коментари

За да запишете коментар във файла е необходимо преди текста да въведете "#". Целия текст след този символ до края на реда ще се игнорира от make. Ето едно интересно използване:

   line_on \
   line_two # more_line_two \
   line_three

се възприема като:

   line_on line_two line_three

Правила

Правилата казват на make едновременно КОГА и КАК да направи файл. За пример, ако се очаква вашия проект да компилира кода от файловете main.c и io.c след което да го свържи и да създаде изпълнимия project.exe. Ето пример от съдържанието на подобен файл:

   project.exe : main.obj io.obj
       tlink c0s main.obj io.obj, project.exe,, cs /Lf:\bc\lib 
   main.obj : main.c
       bcc –ms –c main.c 
   io.obj : io.c
       bcc –ms –c io.c


Този файл съдържа 3 правила: project.exe, main.obj и io.obj. Правилата посочени тук се наричат: ЯСНИ,КАТЕГОРИЧНИ (explicit rules). Съществуват още и подразбиращи се (inference rules) които Mаke създава в процеса на работа.

Зависимости: кога да се направи целта

Редовете с ":" в тях се наричат редове на зависимост(dependency lines). Те определят кога трябва да се направи целта(крайния файл) или дали е необдходимо да се направи наново ако има промяна в някой файл от който тя зависи.

   project.exe : main.obj io.obj
   

В този ред става ясно, че project.exe зависи от main.obj и io.obj. За да определи кой файлове са променени Mаke проверява времето на промяна на всеки файл(т.н. timestamp), като започва от зависимостите. Ако main.obj или файловете от които той зависи са применени се задейства цялата последователност в дълбочина до произвеждането на main.obj и като краен резултат се опреснява и project.exe

Командни редове: Как да създадем ЦЕЛ(краен файл)

Врязаните редове(тези с отстъп от началото на реда) след реда със зависимости се приемат за командни редове(shell lines). Командните редове указват как Mаke да създаде крайния файл.

   project.exe: main.obj io.obj
       tlink c0s main.obj io.obj, project.exe,, cs /Lf:\bc\lib

Макроси

Дефиниране на макроси

Макросите са редове който се дефинират в Mаkefile по следния начин:

   име = стойност

Името е единична дума, която е последствие ако бъде записана в следния формат ${name} или $(name) ще бъде подменена от стойност.

   OBJS = main.obj io.obj
   MODEL = s
   CC = bcc
   CFLAGS = –m$(MODEL) 
   project.exe : $(OBJS)
       tlink c0$(MODEL) $(OBJS), project.exe,, c$(MODEL) /Lf:\bc\lib 
   main.obj : main.c
       $(CC) $(CFLAGS) –c main.c 
   io.obj : io.c
       $(CC) $(CFLAGS) –c io.c 
   $(OBJS) : incl.h

Макроси от команден ред

Макросите могат да се използват още при извикването на make от командния ред. Синтаксиса е следния:

   make CFLAGS=–ms

При стартирането си маке ще има макрос с име CFLAGS и стойност –ms. Ако макроса има повече стойности, той трябва да е затворен с двойни кавички:

   make "CFLAGS=–ms –z –p"


Run-Time Macros

TODO

Macro Modifiers

TODO

Filename Components

TODO

Tokenize

TODO

Other Modifiers

TODO

Inference Rules

TODO

Response Files

TODO

Automatic Response Files

TODO

Inline Response Files

TODO

Makefile Directives

TODO

Източници

  1. http://www.opussoftware.com/tutorial/TutMakefile.htm - превода е направен от този документ, без да се спазва абсолютна точност.