Лабораторна робота № 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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!