Skip to content

Home Программирование Константы make
Константы make

В make-файлах для параметризации процесса сборки можно использовать константы. Для объявления и инициализации констант предусмотрен следующий шаблон:

NAME=VALUE

Здесь name — это имя константы, value — ее значение. Имя константы не должно начинаться с цифры. Значение может содержать любые символы, включая пробелы. Признак окончания значения константы — символ новой строки. Иначе говоря, любые символы, стоящие между знаком "равно" и символом переноса строки, будут являться значением константы.

Значение константы можно подставить в любую часть make-файла (кроме комментария). Если имя константы состоит из одного символа, то для подстановки достаточно добавить перед именем литеру $ (доллар). Когда имя состоит из нескольких символов, для подстановки применяется следующий шаблон:

$(NAME)

Теперь модернизируем make-файл проекта printup, добавив в него константы.

Файл Makefile_2

CC=gcc
CLEAN=rm -f
PROGRAM_NAME=printup
$(PROGRAM_NAME): print_up.o main.о
$(CC) -o $(PROGRAM_NAME) print_up.o main.о
print_up.о: print_up.с
$(CC) -c print_up.c
main.о: main.с
$(CC) -c main.с
clean:
$(CLEAN) *.o
$(CLEAN) $(PROGRAM_NAME)

Итак, мы заменили имя компилятора, команду удаления и имя конечной программы символическими именами. Теперь можно, например, сменить имя программы, просто изменив значение константы program_name.

Файл print_up.h был исключен из списков зависимостей. При отсутствии заголовочного файла, компилятор всегда сообщает об этом. Таким образом, включение print_up.h в список зависимостей хотя и не ошибочно, но явно избыточно.

Обратите внимание, что константы допустимы при объявлении и инициализации других констант. В результате наш Makefile можно значительно модернизировать

Файл Makefile_3

CC=gcc
CLEAN=rm
CLEAN_FLAGS=-f
CLEAN_COMMAND=$(CLEAN) $(CLEAN_FLAGS)
PROGRAM_NAME=printup
$(PROGRAM_NAME): print_up.o main.о
$(CC) -o $(PROGRAM_NAME) print_up.o main.о
print_up.o: print_up.c
$(CC) -c print_up.c
main.о: main.с
$(CC) -c main.с
clean:
$(CLEAN_COMMAND) *.о
$(CLEAN_COMMAND) $(PROGRAM_NAME)

На самом деле рассматриваемые константы по существу не являются константами, поскольку их можно переопределять, т. е. повторно присваивать им значения. В этом легко убедиться, если слегка изменить наш Makefile

Файл Makefi!e_4

CC=gcc
CLEAN=some_value
PROGRAM_NAME=printup
$(PROGRAM_NAME): print_up.o main.о
$(CC) -o $(PROGRAM_NAME) print_up.o main.о
print_up.о: print_up.с
$(CC) -c print_up.c
main.о: main.с
$(CC) -c main.с
CLEAN=rm -f
clean:
$(CLEAN) *.o
$(CLEAN) $(PROGRAM_NAME)

Из листинга  видно, что константа clean изменяется. Тем не менее, такое переопределение редко встречается на практике, поэтому понятие "константа" вполне пригодно.

Утилита make поддерживает также целый ряд специализированных констант. Две из них используются в целевых связках и представляют особый интерес:

  • $@ — содержит имя текущей цели;
  • $^ — содержит список зависимостей в текущей связке.

Если теперь переписать Makefile, добавив в него эти две константы, то получится довольно симпатичный результат

Файл Makefile_5

СС=gcc
CLEAN=rm -f
PROGRAM_NAME=printup
$(PROGRAM_NAME): print_up.o main.о
$(СС) -О $@ $^
print_up.о: print_up.с $(СС) -с $^
Main.о: main.с
$(СС) -с $^
clean:
$(CLEAN) *.o
$(CLEAN) $(PROGRAM_NAME)

Makefile не только уменьшился в размере, но и стал более гибким. Теперь при изменении целей или списков зависимостей не требуется параллельно изменять инструкции. Итак, имея определенный багаж знаний, можно окончательно модернизировать Makefile для проекта printup

Файл Makefite_6.

CC=gcc
CCFLAGS=-Wall CLEAN=rm -? PROGRAM_NAME=printup OBJECT_FILES=*.о SOURCE_FILES=print_up.c main.с
$(PROGRAM_NAME): $(OBJECT_FILES) $(CC) $(CCFLAGS) -о $@ $^
$(OBJECT_FILES): $(SOURCE_FILES) $(CC) $(CCFLAGS) -с $^
clean:
$(CLEAN) *.0 $(PROGRAM_NAME)

Мы усовершенствовали Makefile др такой степени, что для добавления в проект нового исходного файла достаточно будет дописать его имя в константу source_files. В этой версии make-файла появляется новая константа ccflags с "магическим" значением -wall. Посредством этой константы компилятору могут передаваться какие-то общие опции. В нашем случае опция -wall включает все виды предупреждений (warnings). Таким образом, если компилятор "заподозрит" что-то неладное, то немедленно сообщит об этом.

Комментарии (0)

RSS feed Comments

Написать комментарий

smaller | bigger

busy
 

Регистрация




Top