|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Утилита make
Очень часто приходится работать с программами, включающими несколько файлов исходного кода. При разработке и модификации исходного кода приходится вновь и вновь компилировать программу. Однако на самом деле в компиляции нуждаются лишь те файлы, которые были изменены. Затем редактор связей связывает только что созданные файлы объектного кода с ранее созданными и формирует новый исполняемый файл. Благодаря тому что компилируются заново только некоторые из файлов исходного кода, резко сокращается время выполнения компилятора. При создании очередной версии исполняемой программы не требуется заново компилировать все файлы исходного кода. В большой программе, включающей множество файлов исходного кода, очень трудно отследить, какие файлы были изменены и нуждаются в компиляции, а какие достаточно обработать редактором связей. Утилита make выполняет эти операции автоматически. Она предназначена для среды разработки, в которой различные файлы исходного кода, составляющие программу, постоянно изменяются. Утилита make отслеживает, какие файлы исходного кода были изменены, а какие — нет. Затем она компилирует только те из них, в которые были внесены изменения, связывает их с остальными файлами, содержащими объектный код, и создает новый исполняемый файл. В следующем примере программист вводит команду make в командной строке для вызова утилиты make. После этого компилируются измененные файлы, затем создается новый исполняемый файл. При этом утилита make отображает все выполняемые команды Linux. $ make gcc -с main.с gcc -с io.c gcc main.о io.o С целью лучшего понимания принципов функционирования утилиты make представьте себе, что она использует отметки времени, соответствующие каждому файлу исходного кода. При создании или обновлении файла исходного кода операционная система Linux устанавливает новое значение отметки времени. Если файл был создан в 1:00, то отметка времени имеет значение 1:00. Если затем файл был изменен в 6:00, то в отметке времени записывается новое значение, 6:00. При компиляции программы повторно нужно компилировать только те файлы, которые были изменены. Поскольку изменения в любом файле связаны с обновлением отметок времени, то значения этих отметок могут быть использованы для определения того, какие файлы должны быть откомпилированы. В результате утилита make может определить, какие файлы должны быть откомпилированы, и выбрать для компиляции только эти файлы. Строка зависимостей указывает отношения между файлами (утилита make оперирует в терминах зависимостей). Файл исходного кода используется для создания файла объектного кода, который в дальнейшем применяется для создания выполняемой программы. Очевидно, что программа зависит от файла объектного кода, который, в свою очередь, зависит от файла исходного кода. В строке зависимостей необходимо указать отношения зависимости между файлом исходного кода и файлом объектного кода. В другой строке зависимостей необходимо указать отношения зависимостей между исполняемым файлом и всеми файлами объектных кодов, которые используются при его создании. Строку зависимостей можно рассматривать как своего рода логический оператор. Отношение зависимости в этом случае является условным выражением. Если некоторый файл объектного кода зависит от файла исходного кода, а последний файл был недавно был изменен, то условие проверки истинно, и такой файл будет компилироваться. Но синтаксис строки зависимостей более сложен, чем обычное условное выражение. Строка зависимостей состоит из трех частей: целевой файл, список зависимых файлов и команда Linux. Если какой-то из файлов изменен раньше, чем целевой файл, то выполняется команда Linux. Целевой файл и файлы, от которых он зависит, записываются в одной строке и разделяются двоеточием. Команду Linux можно либо поместить в той же строке, отделив ее от перечня файлов с помощью точки с запятой, либо указать ее в следующей строке после символа табуляции. В одной строке может быть введено несколько команд Linux. В этом случае между ними нужно ставить точки с запятой. При вводе команды с новой строки в начале последней должен находиться символ табуляции. Об окончании строки зависимостей свидетельствует следующая за ней пустая строка. В указанных ниже примерах производится вызов компилятора gcc, выполняется компиляция файлов исходного кода или компоновка файлов объектного кода. Синтаксис строки зависимостей выглядит следующим образом: целевой файл: зависимые файлы; команда Linux пустая строка целевой файл: зависимые файлы tab команда Linux пустая строка В следующем файле makefile будут записаны строки зависимостей для программы на языке С, состоящей из двух файлов исходного кода, main.c и io.c. В подобной программе, состоящей из двух файлов, на самом деле нужно обрабатывать пять файлов. Для каждого файла.с существует соответствующий ему файл.о. Кроме того, существует исполняемый файл a.out. Строки зависимостей для файла makefile описывают зависимости для каждого из имеющихся файлов. Файлы объектного кода (.о) зависят от файлов исходного кода (.с). Исполняемый файл a.out зависит от нескольких файлов объектного кода (.о). В этом примере исполняемый файл a.out зависит от двух файлов объектного кода — main. о и io.o. Каждый файл с объектного кода зависит, в свою очередь, от соответствующего файла исходного кода: main.o — от main.c, a io.o — от io.c. В файле makefile необходимо указать три строки зависимостей, для файлов a.out, main.o и io.o соответственно. Заметьте, что операции связывания и компиляции программы разнесены по разным строкам зависимостей. Команда Linux для целевого файла a.out связывает два файла объектного кода с целью создания нового исполняемого файла. В результате вызывается компилятор gcc совместно с файлами объектного кода (.о), а запускается исключительно редактор связей. Команды Linux для целевых файлов main.o и io.o выполняют только компиляцию, в результате чего создаются файлы исходного кода (.о). Параметр -с, используемый совместно с компилятором gcc, определяет, что компоновку выполнять не требуется. В этом случае достаточно ограничиться только компиляцией и созданием файлов объектного кода для указанных файлов исходного кода. makefile a.out: main.o io.o gcc main.o io.o main.o: main.c gcc -c main.c io.o: io.с gcc -c io.c Можно также создать строку зависимостей для выполнения специальных операций, таких как печать файлов или инсталляция, приложения. Многие из программных пакетов, создаваемых пользователем с помощью утилиты make, предназначаются для установки прикладных программ на компьютере пользователя. $ make install Система контроля версий: RCS При работе над большим проектом приходится постоянно корректировать исходные коды программ. При этом выполняется обнаружение ошибок, добавляются новые возможности. Но иногда внесенные изменения приводят к возникновению новых ошибок. Регистрация всех выполняемых изменений могла бы быть полезной для отслеживания сбоев и выяснения причин возникающих ошибок. Система контроля версий RCS (Revision Control System) — утилита Linux, отслеживающая все изменения, которые делаются в программе. Практически RCS поддерживает множество последовательных версий программы. Каждую из них можно просмотреть, а также проверить изменения, внесенные на очередном шаге. Утилита RCS особенно полезна в том случае, если в разработке программы участвует большой коллектив разработчиков. Каждый из программистов может внести изменения в программу в любое время. При этом RCS регистрирует каждое из изменений, а также время выполнения изменений. В этом случае могут быть сохранены заметки о проведенном изменении. Утилита RCS сохраняет исходную версию файла, и затем фиксирует все изменения, внесенные в этот файл. Используя эту информацию, можно восстановить любую из версий данного файла. На самом деле различные полнофункциональные версии файла не сохраняются. Вместо этого RCS использует исходный файл и информацию об изменениях для создания полного варианта требуемой версии файла. Команды, с помощью которых RCS управляет файлами, перечислены в табл. 3. Таблица 3. Утилита RCS Команда Описание RCS Утилита Revision Control System (RCS) позволяет пользователю контролировать раз- работку программ. С помощью RCS можно устанавливать различные версии программы по мере выполнения изменений. Можно выбирать различные версии программ либо получать записи о том, как были разработаны программы. Файл RCS создается с помощью команды ci, а его обработка может выполняться с помощью команды rcs. Версии выбираются с помощью команды со, а их удаление осуществляется с помощью команды rcs -о ci Команда ci обновляет файл RCS, создавая новые версии. Если файл RCS не был создан ранее, команда ci делает это, используя расширение v. Команда ci обычно применяется для сохранения измененной копии файла, который был ранее выбран с помощью команды со, примененной вместе с опцией -1. Сохранение измененной копии приведет к созданию новой версии файла внутри файла RCS $ ci main.с Опции rверсия Эта опция позволяет указывать номер выпуска и версии, с которого ведется отсчет (начиная с момента создания новой версии) $ ci -r5.2 main.с со Команда со применяется для выборки версии файла RCS. При использовании без опций она выполняет выборку версии кода, предназначенной только для чтения. Если версия не указана, выполняется выборка последней версии Опции -1 Эта опция позволяет выполнить выборку редактируемой версии файла RCS. При этом файл блокируется, в результате чего предотвращается возможность его изменения со стороны других пользователей. Файл остается заблокированным до вызова на выполнения утилиты ci $ со -е main.с гсs Команда гcs применяется для управления файлами RCS, а также пригодна для управления доступом к файлу RCS со стороны других толкователей Опции - a имя_ Эта опция позволяет добавлять имя пользователя в перечень пользова- - e имя_ Эта опция удаляет параметр имя пользователя из перечня пользовате- - 1 выпуск Эта опция блокирует указанный выпуск от доступа со стороны каких-либо пользователей, исключая создателя файла $ rcs -12 main.с - u выпуск Эта опция отменяет блокировку указанного выпуска $ rcs -u2 main.с - L выпуск Эта опция блокирует доступ к файлу со стороны любых пользователей, включая создателя файла $ rcs -L2 main.с - o выпуск Эта опция разблокирует доступ к указанному выпуску со стороны любого пользователя, включая создателя файла $ rcs -U2 main.с - о выпуск Эта опция позволяет удалить выпуск из файла RCS $ rcs -o2.3 main.с rlog Команда rlog выводит информацию о различных выпусках и версиях, находя- щихся в файле RCS. Используемая без параметра, данная команда выводит суммарную информацию относительно каждой версии Опции - r версия Эта опция предназначена для вывода информации об указанной версии $ rlog -r2 main.с - d дата Эта опция выводит информацию о версиях, созданных в указанное время. Формат даты, применяемый в этом случае, имеет вид год/месяц/ день, а также час:минута:секунда. Все параметры, за исключением года, являются необязательными для ввода $ rlog -d93/04/12 main.с -d< Завершаемая знаком «меньше», эта опция выводит сведения о выпус- ках, которые были созданы ранее указанной даты $ rlog -d<93/04/12 main.с ->d Используемая вместе с ведущим знаком «больше», эта опция выводит сведения о выпусках, которые были созданы позднее указанной даты $ rlog ->d93/04/12 main.с Очередной набор изменений, внесенных в файл, называется версией. Каждая версия имеет свой номер, который состоит из нескольких компонентов. Первые два компонента означают номер выпуска и номер варианта. По умолчанию первой версии присваивается номер выпуска 1 и номер варианта 1. Для ссылки на версию необходимо указать номер ее выпуска и варианта. Первая версия называется версией 1.1 или версией дельта 1.1. Последующие версии имеют тот же номер выпуска, но больший на единицу номер варианта. Следующая версия будет иметь номер 1.2, затем 1.3 и т. д. Номер выпуска может быть изменен вручную. Перед созданием файла RCS необходимо создать каталог RCS. В этом каталоге размещаются файлы RCS для пользовательских программ. Затем с помощью команды ci создается файл RCS. Команда ci (которая начинает проверку) имеет один параметр (название исходного файла). Файл RCS будет создан в каталоге RCS с расширением,v. Файлу main.с соответствует файл RCS main.c,v в каталоге RCS. Если программа пользователя изначально состоит из нескольких файлов исходного кода, необходимо создать файлы RCS для каждого из этих файлов, включив в название соответствующий суффикс. В следующем примере программист создает файл RCS для программы main.с. $ ci main.с RCS/main.c,v main.с enter description, terminated with single '.' or end of file: NOTE: This is NOT the log message! >> Bookrecs main program >>. initial revision: 1.1 done При редактировании файла исходного кода с применением RCS эта утилита вначале создает копию файла исходного кода. Она именуется так же, как и файл RCS, но без использования суффикса,v. Для файла main.c,v RCS создает файл main.с. С целью сохранения копии программы после завершения редактирования происходит регистрация изменений в файле RCS. Команда RCS со (выполняющая проверку) создает копию файла исходного кода. Эта команда имеет несколько параметров. Команда со без параметров просто создает копию файла исходного кода, которому присвоен атрибут «только для чтения». При использовании параметра -1 создается копия файла исходного кода, которую можно редактировать. Этот параметр используется для предотвращения доступа к файлу. Механизм блокировки в RCS разрешает одновременную работу с файлом лишь одному программисту. После завершения выполнения изменений происходит проверка программного кода, выполняется регистрация изменений, а также разблокировка файла для остальных пользователей. В следующем примере команда со создает редактируемую копию файла с исходным кодом main.c,v. $ со -l main.с RCS/main.c,v --> main.с revision 1.1 (locked) done После завершения редактирования исходного кода программы применяется команда ci с целью регистрации выполненных изменений. Для этого требуется ввести команду ci и название файла RCS. Затем последует приглашение ввести комментарий. По сути, при редактировании копии файла, созданного с помощью команды со, генерируется новая версия файла исходного кода, новый набор изменений, определяющих новую версию. В результате отображается новый номер версии (1.2). В следующем примере программист сохраняет изменения в файл main.с, причем создается новая версия программы 1.2. $ ci main.с RCS/main.c,v main.с new revision: 1.2; previous revision: 1.1 enter log message, terminated with single '.' or end of file: >> Added prompts ». done
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.009 сек.) |