Makefile из xv6
Я читаю код xv6, и мне трудно читать Makefile. Не могли бы вы рассказать мне, как работают следующие утверждения:
1. "CFLAGS += $(shell $(CC) -fno-stack-protector -E -x c /dev/null >/dev/null 2>&1 && echo -fno-stack-protector)"
2. "LDFLAGS += -m $(shell $(LD) -V | grep elf_i386 2>/dev/null)"
3. "xv6.img:
bootblock kernel fs.img
dd if=/dev/zero of=xv6.img count=10000
dd if=bootblock of=xv6.img conv=notrunc
dd if=kernel of=xv6.img seek=1 conv=notrunc"
А как узнать Makefile в деталях? Не могли бы вы порекомендовать несколько хороших книг?
Спасибо!
2 ответа
CFLAGS
варианты (как-fno-stack-protector
-E
и т. д.) вы переходите к компиляторуCC
,$(CC)
будет заменен фактическим компилятором. т.е.CC
перед этим нужно инициализировать чем-то вродеset CC=gcc
,LDFLAGS
варианты (для вашего компоновщикаLD
,+=
так же, как ваш+=
оператор в C. Он обновляет уже существующее значениеCFLAGS
а такжеLDFLAGS
Эта строка означает, что
xv6.img
зависит отbootblock
kernel
fs.img
, То есть мы говоримmake
что для того, чтобы построитьxv6.img
нужно построитьbootblock
kernel
а такжеfs.img
первый
Вы можете узнать о команде dd здесь
Вот полное энциклопедическое руководство по make
а также Makefiles
Чтобы добавить к ответу,
dd
Команда действует как команда копирования, по сути, берет входной файл [if] и копирует его содержимое в выходной файл [of]. Счетчик - это индикатор количества блоков, которые нужно скопировать.
Предоставленный вами код связан со сборкой файла xv6.img, который содержит загрузчик, файловую систему и ядро. По сути, код копирует 10000 блоков нулей из файла / dev / zero в xv6.img. За этим следует копирование из загрузочного блока (созданного bootasm.S и bootmain.c, как его видит цель Makefile) в сектор 0. За этим следует поиск одного сектора и последующее копирование ядра в файл образа.