U-boot, будучи загрузчиком, предназначенным для разных архитектур и SoC, имеет несколько исходных файлов, и только некоторые из них попадают в окончательный исполняемый файл для конкретной платы. Например, в каталоге arch/ есть один каталог для каждой архитектуры. Если сборка предназначена для SoC с архитектурой ARM, только некоторые файлы в arch/arm/ будут скомпилированы в исполняемый файл.
Какой из исходных файлов будет скомпилирован в исполняемый файл, зависит от конфигурации сборки. Эта конфигурация управляется файлом, находящимся в каталоге configs/. В случае BeagleBone Black этот файл называется configs/am335x_boneblack_defconfig. Этот файл определяет несколько переменных, которые используются в файлах Makefile.
Часть configs/am335x_defconfig показана ниже:
CONFIG_ARM=y
CONFIG_ARCH_OMAP2PLUS=y
CONFIG_TI_COMMON_CMD_OPTIONS=y
CONFIG_AM33XX=y
CONFIG_DISTRO_DEFAULTS=y
Переменные, определенные в этих файлах, позже используются в других файлах Makefile. Например, на переменную CONFIG_AM33XX, определенную выше, ссылаются в /arch/arm/mach-omap2/am33xx/Makefile, как показано ниже:
obj-$(CONFIG_AM33XX) += clock_am33xx.o
obj-$(CONFIG_TI814X) += clock_ti814x.o
obj-$(CONFIG_AM43XX) += clock_am43xx.o
ifneq ($(CONFIG_AM43XX)$(CONFIG_AM33XX),)
obj-y += clock.o
endif
Я думаю, при выполнении команды
$ сделать am335x_boneblack_defconfig
значение переменной CONFIG_AM33XX заменяется в некоторой временной копии Makefile, так что содержимое указанного выше makefile заменяется на
obj-y += clock_am33xx.o
Определить, какие исходные файлы включены в окончательный исполняемый файл, просто путем поиска переменных конфигурации во всех файлах Makefile — утомительная задача. Мне нужен способ создать список исходных файлов, который будет компилируется для конкретного файла конфигурации автоматически. Есть ли способ сделать это?