Понимание роли автоматических переменных в make / makefile

#linux #macos #shell #unix #makefile

#linux #macos #оболочка #unix #makefile

Вопрос:

Недавно я начал изучать make / makefiles и некоторые связанные с ними концепции. К настоящему времени я создал несколько базовых версий с целями, зависимостями, действиями и т. Д. Однако я не смог понять, что такое автоматические переменные в этом контексте, их полезность или как их использовать.

Я провел много исследований по этой теме. Однако я не смог найти ни одного удовлетворительного материала. Кажется, что наиболее авторитетным источником информации является эта страница GNU. Однако я все еще не совсем понимаю, что такое автоматические переменные, какова их полезность или как я могу практически использовать их в своих make-файлах.

Мне интересно узнать, что это такое, какова их полезность и как я могу их практически использовать.

Комментарии:

1. Попробуйте отредактировать свой вопрос, чтобы он был более конкретным и кратким. Я думаю, у вас есть как минимум три вопроса, и каждый из них очень широкий.

2. @Jerry Я просто хочу объяснить, что это такое, какова их полезность и как я могу их практически использовать. Пример поможет проиллюстрировать эти идеи. Я не ищу чего-то очень сложного. Я просто новичок в этой концепции, который ищет разъяснений.

3. Я отредактировал OP с тем, что я указал в своем комментарии выше. Надеюсь, это даст разъяснения и конкретику.

Ответ №1:

Автоматические переменные — это просто переменные, для которых значение генерируется Make, а не должно задаваться явно.

Если вы посмотрите на существующие Make-файлы (выберите свой любимый проект с открытым исходным кодом!), Вы найдете множество практических примеров, которые помогут вам. Обычный выглядит примерно так:

 %.o: %.c
    gcc -c -o $@ $<
  

Это шаблонное правило, которое гласит: «чтобы создать файл с именем <something>.o , которое зависит от <something.c> , используйте команду gcc -c -o $@ $< . $@ это автоматическая переменная, которая вычисляет цель правила, и $< это автоматическая переменная, которая вычисляет первое условие правила. Эти автоматические переменные имеют решающее значение для такого рода шаблонных правил; они позволяют запускать make foo.o или make bar.o и подставлять соответствующие значения в командную строку. Например, если вы введете make foo.o , Make попытается выполнить:

 gcc -c -o foo.o foo.c
  

Или рассмотрим этот пример из git Makefile:

 strip: $(PROGRAMS) git$X
    $(STRIP) $(STRIP_OPTS) $^
  

Это используется для удаления символьной информации из объектных файлов. Он должен работать со всеми необходимыми условиями, поэтому он использует $^ , который вычисляет … разделенный пробелом список всех предварительных условий.