Книга: Основы программирования в Linux
Суффиксы и шаблоны правил
Суффиксы и шаблоны правил
Встроенные правила, которые вы видели, действуют, используя суффиксы (подобные расширениям файлов в системах Windows и MS-DOS), поэтому команда make
, получая файл с одним окончанием, знает, какое правило применять для создания файла с другим окончанием. Чаще всего используется правило для создания файла, заканчивающегося .о, из файла с окончанием .c. Это правило для применения компилятора, компилирующего исходный файл, но не компонующего.
Порой возникает потребность в создании новых правил. Авторы приучили себя работать с исходными файлами, которые необходимо компилировать несколькими разными компиляторами: двумя в среде MS-DOS и gcc
в ОС Linux. Для того чтобы осчастливить один из компиляторов MS-DOS, исходные файлы на языке С++, а не С должны иметь расширение cpp. К сожалению, у версии команды make
, применяемой в Linux, в то время не было встроенного правила для компиляции файлов с окончанием .cpp. (Существовало правило для суффикса .cc, более распространенного расширения файла на C++ в среде UNIX.)
Следовательно, нужно было либо задавать правило для каждого отдельного исходного файла, либо научить make
новому правилу для создания объектных файлов из файлов с расширением cpp. Учитывая, что в том проекте было довольно большое количество исходных файлов, определение нового правила сэкономило бы много времени на наборе и существенно облегчило бы добавление новых исходных файлов в проект.
Для вставки правила с новым суффиксом сначала добавьте строку в make-файл, информирующую команду make
о новом суффиксе; далее можно написать правило, используя новый суффикс. Команда make
применяет специальную синтаксическую запись
.<old_suffix>.<new_suffix>:
для определения общего правила создания файлов с новым суффиксом из файлов с тем же основным именем, но старым суффиксом.
Далее приведен фрагмент make-файла с новым общим правилом для компиляции файлов с суффиксом .срр в файлы с суффиксом .о:
.SUFFIXES: .cpp
.cpp.o:
$ (CC) -xc++ $(CFLAGS) -I$(INCLUDE) -с $<
Особая зависимость .cpp.o:
информирует команду make
о том, что следующие правила предназначены для трансляции файла с суффиксом .cpp в файлы с суффиксом .о. При написании этой зависимости применяются имена специальных макросов, поскольку неизвестны реальные имена файлов, которые будут транслироваться. Для того чтобы понять это правило, нужно просто вспомнить, что символы $<
заменяются начальным именем файла (со старым суффиксом). Имейте в виду, что вы сообщили make
только о том, как получить из файла с суффиксом .cpp файл с суффиксом .о; как из объектного файла получить двоичный исполняемый файл, команда make
уже знает.
После запуска команда make
применяет ваше новое правило для получения из файла bar.cpp файла bar.o; далее она использует свои встроенные правила для превращения файла с суффиксом .о в исполняемый файл. Дополнительный флаг -xc++
должен сообщить программе gcc
о том, что она имеет дело с исходным файлом на языке C++.
В наши дни команда make
знает, как работать с исходными файлами на С++ с расширениями cpp, но данный метод полезен для преобразования файла одного типа в файл другого типа.
Самые последние версии команды make включают в себя альтернативную синтаксическую запись для достижения того же эффекта и многое другое. Например, правила с шаблонами используют знак подстановки %
для сопоставления имен файлов и не полагаются на одни лишь расширения этих имен.
Далее приведено правило с шаблоном, эквивалентное предыдущему правилу с суффиксом .cpp:
%.cpp: %o
$(СС) -xc++ $(CFLAGS) -I$(INCLUDE) -с $<
- Встроенные правила
- Правила творческой лени
- Правильная стратегическая последовательность
- Как правильно раздавать и аннулировать права
- Часы в Windows показывают неправильное время
- 1.3. Правила подключения к компьютеру внешних устройств
- Как я нашла «правильных» потребителей, когда искала «неправильных»
- Правила именования файлов
- 3. Null-значения и общее правило вычисления выражений
- 2. Правила вывода Армстронга
- 3. Производные правила вывода
- 4. Полнота системы правил Армстронга