Лабораторна робота № 2. Автоматизація пакетних завдань



 

Мета:Оволодіння технологією розробки складних програм у системі UNIX. Знайомство з поняттям автоматизації компіляції. Оволодіння навичками багатомодульної компіляції та створення make файлів.

 

Завдання для самостійної підготовки:

Вивчити:

− принципи створення багатомодульної програми;

− призначення утіліти make;

− принципи побудови make файлу;

 

Методичні вказівки

 

Компіляція багатомодульною програми

Нехай програма prog складається з пари файлів коду main.c і supp.c й що у кожному з них файлу заголовків defs.h. Відповідно, для створення prog необхідно з пар (main.c defs.h) і (supp.c defs.h) створити об'єктні файли main.o і supp.o, а потім злінкувати їх у prog.

 

gcc-c main.c defs.h ---- main.o

gcc-c supp.c defs.h ---- supp.o

gcc-o prog main.о supp.о

 

Можна поєднати два етапи обробки - компіляцію і компонування - в один загальний етап за допомогою команди:

gcc-o prog main.с supp.с

У результаті отримали виконуваний файл prog.

 

Автоматизація пакетних завдань

MAKE - утиліта, яка автоматизує процес перетворення файлів з однієї форми в іншу і застосовувана для складання програмних проектів.

 

Принципи побудови make-файлу

Всю інформацію про проект make черпає з файлу Makefile, який зазвичай знаходиться в тому ж каталозі, що і вихідні файли проекту. При запуску програма make читає Makefile і, інтерпретуючи його вміст, робить необхідні дії. Файл з описом проекту являє собою текстовий файл, де описані відносини між файлами проекту, і дії, які необхідно виконати для його складання.

Найпростіший Makefile складається із синтаксичних конструкцій всього двох типів:правил та макроозначень.

 

У загальному вигляді правило виглядає так:

<m_1> <m_2> ... <m_n> : <r_1> <r_2> ... <r_n>

   <команда_1>

   <команда_2>

       ...

   <команда_n>

Де m - мета , r – залежність.

Мета- це бажаний результат, спосіб досягнення якого описаний в правилі.

Опис мети складається з двох частин: заголовка і реалізації.

Заголовокскладається з імені мети та списку залежностей, які записуються в один рядок і розділяються двокрапкою

Ім'я мети може бути

- ім'ям файлу. У цьому випадку правило описує, яким чином можна отримати нову версію цього файлу.

          progr: main.o mod1.o mod2.o

  gcc –o progr main.o mod1.o mod2.o

- ім'ям деякого дії (псевдометаабо абтрактна). У такому випадку правило описує, яким чином здійснюється вказане діяння.

   Clean:

         rm *.o progr

Список залежностей - це якісь "вихідні дані", необхідні для досягнення зазначеної в правилі мети. Залежно від типу цілі залежність являє собою список файлів або імен дій. Для виконання мети файли повинні бути попередньо створені, а дії виконані.

Реалізація - це дії, які необхідно виконати для відновлення або досягнення мети. Всі команди починаються з обов'язкового символу табуляції.

 

Приклад Make-файла для компіляції програми prog:

 

prog: main.o supp.o

gcc -o prog main.o

main.o supp.o supp.o : defs.h

У наведеному прикладі можна помітити ряд особливостей: в імені другої мети вказані два файли і для цієї ж мети не вказана команда компіляції, крім того, ніде явно не вказана залежність об'єктних файлів від "*. c"-файлів. Справа в тому, що команда make має вбудовані правила для отримання файлів з певними суфіксами. Так, для цілі - об'єктного файлу (суфікс ". O") при виявленні відповідного файлу з суфіксом ". C", буде викликаний компілятор "сс-с" із зазначенням у параметрах цього ". C"-файла і всіх файлів - залежностей. Більш того, в цьому випадку явно не зазначені ". C"-файли make самостійно внесе до списку залежностей і буде реагувати їх зміну так само, як і для явно зазначених залежностей.

 

Макроозначення має вигляд "ЗМІННА = ЗНАЧЕННЯ".

ЗНАЧЕННЯ може бути довільної послідовністю символів, включаючи пробіли і звернення до значень уже визначених змінних.

Звернення до значення змінної виглядає як $ (ЗМІННА)

 

Приклад 1: (змінні можуть бути макросами або текстом)

 var1 = one

 var2 = $(var1) two

 var1 = three

 all:

   @ echo $(var2)

Приклад 2:

OB = main.o supp.o

prog: $(OB)

cc -o prog $(OB)

$(OB): defs.h

Автоматичні змінні - це змінні зі спеціальними іменами, які "автоматично" приймають певні значення перед виконанням описаних у правилі команд. Автоматичні змінні можна використовувати для "спрощення" записи правил.

$@ - Ім'я мети оброблюваного правила

$< - Ім'я першої залежності оброблюваного правила

$^ - Список всіх залежностей оброблюваного правила

 

Таке, наприклад, правило:

   progr: main.o mod1.o

   main.o mod1.o mod2.ogccmod2.o-oprogr

 

з використанням автоматичних змінних можна записати наступним чином:

 

progr: main.o mod1.o mod2.o

   gcc $^ -o $ @

 

Якщо мета старше об'єктних файлів, то ніяких дій проводиться не буде - make вважає, що все вже зроблено.

У разі створення об'єктних файлів $< - посилання на вихідні файли

.co:

gcc -c $<

Говорить про те, що об'єктні файли залежать від відповідних вихідних файлів. Кожна зміна файлу з вихідним текстом буде викликати його перекомпіляцію.

 

Приклад.

Розглянемо make-файл

progr: main.o mod1.o mod2.o

   gcc $^ -o $ @

main.o: main.c

   gcc -c $^

mod1.o: mod1.c

   gcc -c $^

mod2.o : mod2.c

   gcc -c $^

З використанням шаблонних правил, цей приклад можна переписати так:

progr: main.o mod1.o mod2.o

   gcc $^ -o $@

.co:

   gcc -c $^

Внесення додаткових рядків.

Тепер припустимо, що до проекту додався другий заголовний файл supp.h, який включається тільки в mod2.c. Тоді Makefile збільшиться ще на один рядок:

mod2.o: supp.h

Таким чином, один цільовий файл може вказуватися у кількох цілях. При цьому повний список залежностей для файлу буде складено зі списків залежностей всіх цілей, в яких він бере участь, однак створення файлу буде здійснюватися тільки один раз.

 

Додаткові можливості.

Крім компіляції, Makefile може використовуватися і для виконання інших допоміжних дій, безпосередньо не пов'язаних зі створенням будь-яких файлів. До таких дій відноситься очищення проекту від всіх результатів компіляції, або виклик процедури інсталяції проекту в системі.

Для виконання подібних дій у Makefile можуть бути вказані додаткові цілі, звернення до яких буде здійснюватися зазначенням їхніх імен аргументом виклику make (наприклад, "make install") . Подібні допоміжні цілі носять назву фальшивих,що пов'язано з відсутністю в проекті файлів, відповідних їх іменами.

Команда make install інсталює програму в систему, поміщаючи її виконуваний файл у будь-який каталог.

 

Завдання

1. Багатомодульна компіляція. Написати програму-калькулятор для виконання одного з 4-х арифметичних дій. Кожна дія має бути оформлене у вигляді окремої функції в окремому файлі.

2. Автоматизація компіляції. Написати також Makefile, що реалізує наступні завдання:

− компіляцію програми-калькулятора, в результаті якої має бути отримано чотири виконуваних файлу,

− компіляція повинна початися з повідомлення про те, які вихідні файли будуть використані,

− після закінчення компіляції вихідні файли повинні бути видалені,

− запуск утиліти make НЕ використовує ім'я мети.


Дата добавления: 2018-04-05; просмотров: 451; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!