<Предыдущая | Содержание: | Следующая>
Построение программы
Большинство программ строятся с помощью простой последовательности из двух команд:
./настроить сделать
./настроить сделать
Команда конфигурировать Программа - это сценарий оболочки, который поставляется вместе с деревом исходных текстов. Его задача - анализировать среда сборки. Большая часть исходного кода предназначена для портативный. То есть он разработан для построения более чем одного типа Unix-подобных систем. Но для этого в исходный код может потребоваться небольшая корректировка во время сборки, чтобы учесть различия между системами. конфигурировать также проверяет, установлены ли необходимые внешние инструменты и компоненты. Давайте работать конфигурировать. С конфигурировать не находится там, где оболочка обычно ожидает размещения программ, мы должны явно указать оболочке его местоположение, добавив к команде префикс ./ чтобы указать, что программа находится в текущем рабочем каталоге:
[me @ linuxbox diction-1.11] $ . / Настроить
[me @ linuxbox diction-1.11] $ . / Настроить
configure будет выводить множество сообщений во время тестирования и настройки сборки. Когда он закончится, он будет выглядеть примерно так:
проверка наличия libintl.h ... да проверка libintl.h ... да
проверка библиотеки, содержащей gettext ... не требуется configure: create ./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: create ./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
Команда сделать программа принимает в качестве входных данных Makefile (который обычно называют Makefile), который описывает отношения и зависимости между компонентами, составляющими законченную программу.
Первая часть make-файла определяет переменные, которые подставляются в последующие разделы make-файла. Например мы видим строку:
CC = gcc
CC = gcc
который определяет компилятор C как GCC. Позже в make-файле мы видим один экземпляр, в котором он используется:
дикция:
diction.o предложение.o разное getopt.o getopt1.o
$ (CC) -o $ @ $ (LDFLAGS) diction.o предложение.o misc.o \ getopt.o getopt1.o $ (LIBS)
дикция:
Здесь выполняется подстановка, и значение $ (CC) заменяется на GCC во время выполнения.
Большая часть make-файла состоит из строк, которые определяют цель, в этом случае исполняемый файл дикция, и файлы, от которых он зависит. Остальные строки описывают команды, необходимые для создания цели из ее компонентов. В этом примере мы видим, что исполняемый файл дикция (один из конечных конечных продуктов) зависит от наличия дикция.o, предложение.o, разное, getopt.o и getopt1.o. Позже, в make-файле, мы видим определения каждого из них как целей:
дикция.o:
getopt.o: getopt1.o: разное.o:
diction.c config.h getopt.h misc.h предложение.h
getopt.c getopt.h getopt_int.h getopt1.c getopt.h getopt_int.h разное.c config.h разное.h
дикция.o:
getopt.o: getopt1.o: разное.o:
предложение о:
стиль.о:
предложение.c config.h misc.h предложение.h
style.c config.h getopt.h misc.h предложение.h
предложение о:
стиль.о:
Однако мы не видим, чтобы для них была указана какая-либо команда. Это обрабатывается общей целью, ранее в файле, которая описывает команду, используемую для компиляции любого .c файл в .o файл:
.co:
$ (CC) -c $ (CPPFLAGS) $ (CFLAGS) $
.co:
$ (CC) -c $ (CPPFLAGS) $ (CFLAGS) $
Все это кажется очень сложным. Почему бы просто не перечислить все шаги по компиляции частей и не покончить с этим? Ответ на этот вопрос станет ясен через мгновение. А пока бегаем сделать и собери наши программы:
[me @ linuxbox diction-1.11] $ сделать
[me @ linuxbox diction-1.11] $ сделать
Команда сделать программа будет работать, используя содержимое Makefile руководить его действиями. Это создаст много сообщений.
Когда он закончится, мы увидим, что все цели теперь присутствуют в нашем каталоге:
[я @ linuxbox | diction-1.11] $ ls | |||
config.угадай | де.по | en | установка-ш | предложение.c |
config.h | дикция | en_GB | Makefile | предложение.h |
config.h.in | дикция.1 | ru_GB.mo | Makefile.in | предложение.o |
config.log | дикция.1.в | ru_GB.po | разное | стиль |
конфиг.статус | дикция.c | getopt1.c | разное.ч | стиль.1 |
config.sub | дикция.o | getopt1.o | разное | стиль.1.в |
конфигурировать | дикция.горшок | getopt.c | НОВОСТИ | стиль.с |
настроить.in | дикция.спецификация | getopt.h | nl | стиль.o |
КОПИРОВАНИЕ | дикция.спец.ин | getopt_int.h | nl.mo | тест |
de | дикция.текси | getopt.o | нл.по | |
де.мо | дикция.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 мне мне 33125 2007 03:30 getopt.c [me @ linuxbox diction-17] $ коснитесь 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 мне мне 33125 2009 03:05 getopt.c [me @ linuxbox diction-06] $ сделать
[me @ linuxbox diction-1.11] $ ls -l словарь getopt.c
-rwxr-xr-x 1 мне мне 37164 2009-03-05 06:14 дикция
-rw-r - r-- 1 мне мне 33125 2007 03:30 getopt.c [me @ linuxbox diction-17] $ коснитесь 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 мне мне 33125 2009 03:05 getopt.c [me @ linuxbox diction-06] $ сделать
После сделать запускается, мы видим, что он восстановил цель до более новой, чем зависимость:
[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 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 getopt.c
Способность сделать разумно создавать только то, что нужно создавать, - большое преимущество для программистов. Хотя в нашем небольшом проекте экономия времени может быть не очень очевидна,
очень важно для более крупных проектов. Помните, что ядро Linux (программа, которая постоянно модифицируется и совершенствуется) содержит несколько миллиона строки кода.