<Попередній | зміст | Наступна>
Побудова програми
Більшість програм будуються за допомогою простої послідовності з двох команд:
./налаштувати make
./налаштувати make
Команда конфігурувати Програма являє собою сценарій оболонки, який постачається з вихідним деревом. Його завдання – аналізувати побудувати середовище. Більшість вихідних кодів розроблено так портативний. Тобто він розроблений для побудови більш ніж одного типу Unix-подібних систем. Але для цього вихідний код може знадобитися зазнати невеликих коригувань під час збірки, щоб врахувати відмінності між системами. конфігурувати також перевіряє, чи встановлено необхідні зовнішні інструменти та компоненти. Давайте бігти конфігурувати, так як конфігурувати якщо оболонка не розташована там, де оболонка зазвичай очікує розташування програм, ми повинні явно вказати оболонці її розташування, додавши до команди префікс ./ щоб вказати, що програма розташована в поточному робочому каталозі:
[me@linuxbox diction-1.11]$ . / Налаштувати
[me@linuxbox diction-1.11]$ . / Налаштувати
configure виведе багато повідомлень під час тестування та налаштування збірки. Коли він закінчиться, це буде виглядати приблизно так:
перевірка наявності libintl.h... так перевірка наявності libintl.h... так
перевірка бібліотеки, що містить gettext... не потрібно configure: створення ./config.status
config.status: створення Makefile config.status: створення diction.1 config.status: створення diction.texi config.status: створення diction.spec config.status: створення style.1 config.status: створення test/rundiction config.status: створення config.h [me@linuxbox diction-1.11]$
перевірка наявності libintl.h... так перевірка наявності libintl.h... так
перевірка бібліотеки, що містить gettext... не потрібно configure: створення ./config.status
config.status: створення Makefile config.status: створення diction.1 config.status: створення diction.texi config.status: створення diction.spec config.status: створення style.1 config.status: створення test/rundiction config.status: створення config.h [me@linuxbox diction-1.11]$
Тут важливо, щоб не було повідомлень про помилки. Якщо вони були, конфігурація не вдалася, і програма не збиратиметься, доки помилки не будуть виправлені.
Ми бачимо конфігурувати створив кілька нових файлів у нашому вихідному каталозі. Найважливішим є Makefile. Makefile є конфігураційним файлом, який вказує на зробити програму, як саме побудувати програму. Без цього, зробити відмовиться бігти. Makefile це звичайний текстовий файл, тому ми можемо його переглянути:
[me@linuxbox diction-1.11]$ менше Makefile
[me@linuxbox diction-1.11]$ менше Makefile
Команда зробити програма приймає як вхідні дані a makefile (який зазвичай називається Makefile), що описує взаємозв’язки та залежності між компонентами, які входять до складу готової програми.
Перша частина make-файлу визначає змінні, які замінюються в наступних розділах make-файлу. Наприклад, ми бачимо рядок:
CC=gcc
CC=gcc
який визначає компілятор C як ПКУ. Пізніше у make-файлі ми бачимо один екземпляр, де він використовується:
дикція:
diction.o sentence.o misc.o getopt.o getopt1.o
$(CC) -o $@ $(LDFLAGS) diction.o sentence.o misc.o \ getopt.o getopt1.o $(LIBS)
дикція:
Тут виконується підстановка і значення $(CC) замінюється на ПКУ під час виконання.
Більша частина make-файлу складається з рядків, які визначають a мета, у цьому випадку виконуваний файл дикція, і файли, від яких він залежить. Решта рядків описують команду(и), необхідні для створення цілі з її компонентів. У цьому прикладі ми бачимо, що виконуваний файл дикція (один з кінцевих кінцевих продуктів) залежить від існування дикція.о, речення.о, інше, getopt.o та getopt1.o. Пізніше, у make-файлі, ми бачимо визначення кожного з них як цілі:
diction.o:
getopt.o: getopt1.o: різне.o:
diction.c config.h getopt.h misc.h sentence.h
getopt.c getopt.h getopt_int.h getopt1.c getopt.h getopt_int.h misc.c config.h misc.h
diction.o:
getopt.o: getopt1.o: різне.o:
речення.о:
style.o:
sent.c config.h misc.h sentence.h
style.c config.h getopt.h misc.h sentence.h
речення.о:
style.o:
Однак ми не бачимо жодної команди, зазначеної для них. Цим займається загальна ціль, наведена раніше у файлі, яка описує команду, яка використовується для компіляції будь-якого .c файл у .o Файл:
.co:
$(CC) -c $(CPPFLAGS) $(CFLAGS) $
.co:
$(CC) -c $(CPPFLAGS) $(CFLAGS) $
Все це здається дуже складним. Чому б просто не перерахувати всі кроки для компіляції частин і не завершити їх? Відповідь на це стане зрозумілою за мить. А поки бігаємо зробити і створювати наші програми:
[me@linuxbox diction-1.11]$ зробити
[me@linuxbox diction-1.11]$ зробити
Команда зробити програма буде запущена, використовуючи вміст Makefile керувати своїми діями. Це створить багато повідомлень.
Коли він закінчиться, ми побачимо, що всі цілі тепер присутні в нашому каталозі:
[me@linuxbox | дикція-1.11]$ ls | |||
config.guess | де.по | en | встановити-ш | речення.в |
config.h | дикція | en_GB | Makefile | речення.ч |
config.h.in | дикція.1 | en_GB.mo | Makefile.in | речення.о |
config.log | дикція.1.в | en_GB.po | різне | стиль |
config.status | дикція.c | getopt1.c | різне | стиль.1 |
config.sub | дикція.о | getopt1.o | інше | стиль.1.в |
конфігурувати | дикція.горщик | getopt.c | НОВИНИ | style.c |
configure.in | дикція.спец | getopt.h | nl | style.o |
КОПІЮВАННЯ | дикція.спец.ін | getopt_int.h | nl.mo | тест |
de | дикція.texi | getopt.o | nl.po | |
де.мо | diction.texi.in | ВСТАНОВИТИ | README |
Серед файлів ми бачимо дикція та стиль, програми, які ми збиралися створити. Привітання в порядку! Ми щойно зібрали наші перші програми з вихідного коду!
Але просто з цікавості давайте бігти зробити знову:
[me@linuxbox diction-1.11]$ зробити
make: нічого не можна робити для `всіх'.
[me@linuxbox diction-1.11]$ зробити
make: нічого не можна робити для `всіх'.
Це створює лише дивне повідомлення. Що відбувається? Чому він не створив програму знову? Ах, це магія зробити. Замість того, щоб просто будувати все заново, зробити будує лише те, що потребує будівництва. При наявності всіх цілей, зробити вирішив, що робити нічого. Ми можемо продемонструвати це, видаливши одну з цілей і знову запустивши make, щоб побачити, що вона робить. Давайте позбудемося однієї з проміжних цілей:
[me@linuxbox diction-1.11]$ rm getopt.o
[me@linuxbox diction-1.11]$ зробити
[me@linuxbox diction-1.11]$ rm getopt.o
[me@linuxbox diction-1.11]$ зробити
Ми це бачимо зробити відновлює його та повторно зв’язує файл дикція та стиль програми, оскільки вони залежать від відсутнього модуля. Така поведінка також вказує на ще одну важливу особливість зробити: підтримує цілі в актуальному стані. зробити наполягає на тому, щоб цілі були новішими, ніж їхні залежності. Це цілком зрозуміло, оскільки програміст часто оновлює частину вихідного коду, а потім використовує зробити побудувати нову версію готового продукту. зробити гарантує, що все, що потребує побудови на основі оновленого коду, буде побудовано. Якщо ми використовуємо торкатися програму для «оновлення» одного з файлів вихідного коду, ми бачимо, що це відбувається:
[me@linuxbox diction-1.11]$ ls -l дикція getopt.c
-rwxr-xr-x 1 я я 37164 2009-03-05 06:14 дикція
-rw-r--r-- 1 me me 33125 2007-03-30 17:45 getopt.c [me@linuxbox diction-1.11]$ торкніться getopt.c
[me@linuxbox diction-1.11]$ ls -l дикція getopt.c
-rwxr-xr-x 1 я я 37164 2009-03-05 06:14 дикція
-rw-r--r-- 1 me me 33125 2009-03-05 06:23 getopt.c [me@linuxbox diction-1.11]$ зробити
[me@linuxbox diction-1.11]$ ls -l дикція getopt.c
-rwxr-xr-x 1 я я 37164 2009-03-05 06:14 дикція
-rw-r--r-- 1 me me 33125 2007-03-30 17:45 getopt.c [me@linuxbox diction-1.11]$ торкніться getopt.c
[me@linuxbox diction-1.11]$ ls -l дикція getopt.c
-rwxr-xr-x 1 я я 37164 2009-03-05 06:14 дикція
-rw-r--r-- 1 me me 33125 2009-03-05 06:23 getopt.c [me@linuxbox diction-1.11]$ зробити
після зробити запускається, ми бачимо, що він відновив ціль, щоб вона була новішою, ніж залежність:
[me@linuxbox diction-1.11]$ ls -l дикція getopt.c
-rwxr-xr-x 1 я я 37164 2009-03-05 06:24 дикція
-rw-r--r-- 1 я я 33125 2009-03-05 06:23 getopt.c
[me@linuxbox diction-1.11]$ ls -l дикція getopt.c
-rwxr-xr-x 1 я я 37164 2009-03-05 06:24 дикція
-rw-r--r-- 1 я я 33125 2009-03-05 06:23 getopt.c
Здатність Росії зробити Розумно створювати лише те, що потребує побудови, є великою перевагою для програмістів. Хоча економія часу може бути не дуже очевидною з нашим невеликим проектом, це
це дуже важливо для великих проектів. Пам’ятайте, що ядро Linux (програма, яка постійно модифікується та вдосконалюється) містить декілька мільйона рядки коду.