Разработка новых функций CBuild приостановлена, рекомендуется обновиться до Cbuild-ng. Cbuild-ng и CBuild не являются полностью совместимыми.
Система компиляции CBuild является более мощной и гибкой системой сборки, чем Buildroot, и быстрее и компактнее, чем Yocto. Она не имеет крутого наклона кривой обучения и не переопределяет новый язык, общее количество строк кода ядра системы составляет менее 4000, состоящее из скриптов на Python / Shell / Makefile. Она легче понимается и используется, чем Buildroot и Yocto.
Система компиляции CBuild состоит из трех основных частей: инструментов анализа и обработки задач, шаблонов компиляции Makefile и инструментов обработки сети и кэша.
* Инструменты анализа и обработки задач: анализирует все задачи и автоматически генерирует системные Kconfig и Makefile
* Все задачи анализируются и собираются Python-скриптом gen_build_chain.py
* Автоматически собирает правила и параметры для всех задач, выбирает, какие задачи запускать и настраивает параметры задач через make menuconfig
* Каждое правило задачи объявляется с помощью утверждения зависимости, что поддерживает большое количество зависимых правил
* Поддерживает автоматическую генерацию реальных правил пакетов для выполнения задач и виртуальных правил пакетов для управления задачами
* Поддерживает автоматическую генерацию обычной структуры (config), иерархической структуры (menuconfig), структуры выбора (choice) и т. д.
* Поддерживает автоматическую генерацию сильной зависимости (depends on), слабой зависимости (if...endif), сильного выбора (select), слабого выбора (imply), выбора (condA||condB) и т. д.
* Файл задачи представляет собой скрипт Makefile, выполняемый make
, что поддерживает упаковку исходных скриптов Makefile, CMake, Autotools, Meson, ...
для поддержки этих методов компиляции
* Поддерживает автоматическую генерацию схемы зависимости задач с полезными свойствами, такими как цвет, чтобы увидеть, выбрана ли задача, и т. д. (gen_depends_image.sh
)
* Шаблоны сборки Makefile: Предоставляют шаблоны сборки для драйверов, библиотек и приложений; пользователи только должны заполнить несколько переменных, чтобы завершить скрипт сборки проекта
* Поддерживает генерацию последней кросс-сборочной цепочки инструментов (process_machine.sh
toolchain/Makefile
)
* Поддерживает как нативную сборку, так и кросс-сборку в одном Makefile (inc.env.mk
)
* Поддерживает генерацию нескольких библиотек, исполняемых файлов или драйверов в одном Makefile
* Поддерживает как режим обычной сборки (режим разделения исходного кода и выходных данных сборки и режим без разделения), так и режим сборки Yocto
* Поддерживает автоматический анализ заголовочных файлов как зависимостей сборки и указывает CFLAGS для исходных файлов отдельно
* Предоставляет шаблон для сборки статических библиотек, динамических библиотек и исполняемых файлов, и поддерживает смешанную сборку на C (*.c
), C++ (*.cc *.cp *.cxx *.cpp *.CPP *.c++ *.C
) и ассемблере (*.S *.s *.asm
) (inc.app.mk
)
* Предоставляет шаблон для сборки драйверов, и поддерживает смешанную сборку на C (*.c
) и ассемблере (*.S
) (inc.mod.mk
)
* Предоставляет шаблон для установки, соответствующий стандарту GNUInstallDirs (inc.ins.mk
)
* Предоставляет шаблон для настройки параметров с помощью Kbuild (inc.conf.mk
)
* Инструменты для обработки сети и кэша: Обрабатывает загрузку, исправление, компиляцию и установку сетевых пакетов, а также поддерживает зеркало исходного кода и кэш-зеркало.
* Предоставляет удобный и надежный механизм исправления (exec_patch.sh
)
* Предоставляет автоматический инструмент для загрузки сетевых пакетов (fetch_package.sh
)
* Поддерживает загрузку пакетов с HTTP (атрибуты: md5), Git (атрибуты: ветка, тег, rev) и SVN (атрибуты: rev)
* Поддерживает загрузку пакетов с сервера-зеркала
* Предоставляет инструмент кэширования компиляции, повторная компиляция не требует компиляции с исходного кода, а берет результат напрямую из локальной области или сервера-зеркала (process_cache.sh
)
* Предоставляет удобный шаблон для кэширования компиляции (inc.cache.mk
)
* Предоставляет обширный слой открытого программного обеспечения (OSS), и количество OSS-пакетов постоянно растет
* Примеры тестовых случаев можно посмотреть в examples.md
Этот проект внес 2 коммита в сообщество ядра Linux, которые были включены в основное ядро Linux.
kconfig: исправление ошибки при генерации auto.conf
commit 1b9e740a81f91ae338b29ed70455719804957b80
Author: Jing Leng <jleng@ambarella.com>
Date: Fri Feb 11 17:27:36 2022 +0800
kconfig: исправление ошибки при генерации auto.conf
При указании KCONFIG_AUTOCONFIG (например, export \
KCONFIG_AUTOCONFIG=output/config/auto.conf), директория include/config/ \
не создается, поэтому kconfig не может создать файлы зависимостей в нем, \
и auto.conf не может быть сгенерирован.
kbuild: исправление пути включения в scripts/Makefile.modpost
commit 23a0cb8e3225122496bfa79172005c587c2d64bf
Author: Jing Leng <jleng@ambarella.com>
Date: Tue May 17 18:51:28 2022 +0800
kbuild: исправление пути включения в scripts/Makefile.modpost
При сборке внешнего модуля, если пользователи не хотят разделять выход \
сборки и исходный код, они выполняют следующую команду: "make -C $(LINUX_SRC_DIR) M=$(PWD)". В этом случае, "$(KBUILD_EXTMOD)" \
и "$(src)" совпадают. Если им нужно разделить их, они запускают "make -C $(KERNEL_SRC_DIR) O=$(KERNEL_OUT_DIR) M=$(OUT_DIR) src=$(PWD)". Перед запуском команды \
им нужно скопировать "Kbuild" или "Makefile" в "$(OUT_DIR)", чтобы предотвратить ошибку компиляции.
``` Таким образом, ядро должно изменить путь включения, чтобы избежать
операции копирования.
* Скрипты сборки приложений и драйверов состоят из `Makefile + DEPS-заявления`
* Цепочка сборки собирается через зависимости, определенные DEPS-заявлениями (зависимости на уровне пакета)
* DEPS-заявления в основном должны определять зависимости, следуя правилам сборки, определенным CBuild
* Скрипт анализирует DEPS-заявления всех пакетов и автоматически генерирует цепочку сборки всех пакетов
* Все пакеты собираются отдельно, и пользователи могут войти в папку пакета и ввести `make` для сборки
* Поддерживает управляемый Kconfig или управление Kconfig самостоятельно.
* Управляемый Kconfig должен быть размещен в той же директории, что и файл DEPS-заявления
* Не требуется вручную указывать родительско-детские отношения включения, скрипт автоматически анализирует и собирает их
Фреймворк сборки Yocto:
Makefile + Рецепт
DEPENDS
/ RDEPENDS
и расширенными EXTRADEPS
в рецепте (зависимости на уровне пакета)make menuconfig
### Параметры командной строки цепочки сборкиОписание команды
# Normal Build
gen_build_chain.py -m MAKEFILE_OUT -k KCONFIG_OUT [-t TARGET_OUT] [-a DEPENDS_OUT] -d DEP_NAME [-v VIR_NAME] [-c CONF_NAME] -s SEARCH_DIRS [-i IGNORE_DIRS] [-g GO_ON_DIRS] [-l MAX_LAYER_DEPTH] [-w KEYWORDS] [-p PREPEND_FLAG] [-u UNIQUE_PACKAGES]
# Yocto Build Step1
gen_build_chain.py -k KCONFIG_OUT -t TARGET_OUT [-v VIR_NAME] [-c CONF_NAME] [-i IGNORE_DIRS] [-l MAX_LAYER_DEPTH] [-w KEYWORDS] [-p PREPEND_FLAG] [-u USER_METAS]
# Yocto Build Step2
gen_build_chain.py -t TARGET_PATH -c DOT_CONFIG_NAME -o RECIPE_IMAGE_NAME [-p PATCH_PKG_PATH] [-i IGNORE_RECIPES]
Параметры команды для обычного сборки
-m <Путь к файлу Makefile>
: Указывает путь к автоматически сгенерированному файлу Makefile
make $(ENV_BUILD_JOBS) $(ENV_MAKE_FLAGS) MAKEFLAGS= all_targets
для многопоточной компиляции всех пакетовjobserver
должен быть указан в OTHER_TARGETS в DEPS-запросеTIME_FORMAT := /usr/bin/time -a -o $(OUT_PATH)/time_statistics -f "%e\t\t%U\t\t%S\t\t$@\" total_time: loadconfig
@$(PRECMD)make -s all_targets
@echo "Build done! "
``` time_statistics:
@mkdir -p $(OUT_PATH)
@$(if $(findstring dash,$(shell readlink /bin/sh)),echo,echo -e) "real\t\tuser\t\tsys\t\tpackage" > $(OUT_PATH)/$@
@make -s PRECMD="$(TIME_FORMAT)" total_time
```
-k <Путь К Файлу Kconfig>
: Указывает путь к автоматически сгенерированному файлу Kconfig-t <Целевой Путь>
: Указывает путь к автоматически сгенерированному файлу, который хранит имя пакета и список путей исходных файлов-a <Путь Зависимостей>
: Указывает путь к автоматически сгенерированному файлу, который хранит имя пакета и список зависимостей-d <Имя Файла Зависимостей>
: Указывает имя файла зависимостей (содержащего DEPS-заявление) для поиска, файл зависимостей может содержать несколько DEPS-заявлений-c <Имя Файла Kconfig>
: Указывает имя файла Kconfig (содержащего конфигурацию) для поиска
-v <Имя Файла Виртуальных Зависимостей>
: Указывает имя файла виртуальных зависимостей (содержащего VDEPS-заявление) для поиска-s <Пути Директорий Для Поиска>
: Указывает пути директорий для поиска (содержащих VDEPS-заявления), несколько директорий разделены двоеточием * -i <Игнорировать_Директории>
: Указывает имена директорий для игнорирования, несколько директорий разделены двоеточием-g <Продолжать_Поиск_Директорий>
: Указывает пути директорий для продолжения поиска, несколько директорий разделены двоеточием
Продолжать_Поиск_Директорий
или текущая директория не входит в него, скрипт не будет продолжать поиск поддиректорий текущей директории-l <Максимальная_Глубина_Уровней>
: Устанавливает максимальное количество уровней в менюконфиге, 0 для плитки, 1 для двухуровневого, и т. д.-w <Ключевые_Директории>
: Устанавливает имена уровней для игнорирования в менюконфиге, несколько имен разделены двоеточием
-p <Префикс_Флага>
: Устанавливает префикс для элемента конфигурации в автоматически сгенерированном файле Kconfig
conf
/ mconf
без префикса (CONFIG_=""
), этот флаг должен быть установлен в 1-u <Уникальные_пакеты>
: Указывает пакеты, которые не имеют нативной компиляции, когда они являются зависимостями нативного пакета, и множественные имена, разделенные двоеточием-k <Путь к файлу Kconfig>
: Указывает путь к автоматически сгенерированному файлу Kconfig
-t <Путь к целевому файлу>
: Указывает путь к автоматически сгенерированному целевому файлу, который хранит имя пакета и список путей к исходным файлам-c <Имя файла Kconfig для поиска>
: Указывает имя файла Kconfig (содержащего конфигурацию) для поиска
.bbconfig
в той же директории, что и файл рецептаEXTERNALSRC
EXTERNALSRC
-v <Имя файла зависимости для поиска>
: Указывает имя файла зависимости (содержащего утверждение VDEPS) для поиска-i <Игнорируемые директории>
: Указывает имена игнорируемых директорий, несколько директорий разделены двоеточием-l <Максимальная глубина уровня меню>
: Устанавливает максимальное количество уровней менюconfig, 0 для плитки, 1 для двухуровневого меню, и т. д.-w <Игнорируемые уровни меню>
: Устанавливает имена игнорируемых уровней менюconfig, несколько имен разделены двоеточием
-p <Предварительное значение флага>
: Устанавливает префикс элемента конфигурации в автоматически сгенерированном файле Kconfig.conf
/ mconf
без префикса (опция: CONFIG_=""
), этот флаг должен быть установлен в 1.-u <Пользовательские слои>
: Указывает пользовательские слои, несколько слоев разделены двоеточием.
Параметры командной строки шага сборки Yocto 2
-t <Путь к целевому файлу>
: Указывает путь к автоматически сгенерированному целевому файлу, сгенерированному шагом 1.-c <Путь к файлу Kconfig для поиска>
: Указывает путь к файлу .config
, сгенерированному командой make xxx_config
.-o <Путь к файлу рецепта вывода>
: Указывает путь к файлу рецепта вывода, который хранит пакеты, установленные в rootfs.-p <Путь к файлу патча/отмены патча>
: Указывает путь к файлу патча/отмены патча, который хранит пакеты патча/отмены патча.-i <Игнорируемые рецепты>
: Указывает имена игнорируемых рецептов, несколько рецептов разделены двоеточием.Правило зависимости: #DEPS(Makefile_Name) Target_Name(Other_Target_Names): Depend_Names
Включённое правило зависимости: #INCDEPS: Subdir_Names
! [Regex включённой зависимости](. /scripts/bin/regex_incdeps. svg)* Описание правила
* Makefile_Name: Скрипт Makefile для компиляции (может быть пустым), если он не пустой, make запускает указанный Makefile (make -f Makefile_Name
)
* Makefile должен содержать три цели all
, clean
и install
* Имя Makefile может включать путь (например, слеш /
), что позволяет непосредственно находить подпакеты в подпапках
* Например: test1/
test2/wrapper. mk
* Пользователи также могут использовать INCDEPS-заявление для продолжения поиска зависимых файлов в подпапках
* Например: #INCDEPS: test1 test2/test22
* Подпапки поддерживают замену переменных окружения, например, ${ENV_BUILD_SOC}
будет заменено значением переменной окружения ENV_BUILD_SOC
* Target_Name: Идентификатор имени пакета
* Ключевое слово ignore
является специальным идентификатором, указывающим на отсутствие пакета, что используется для игнорирования поиска в текущей директории (#DEPS() ignore():
)
* Другие_Target_Names: Другие цели текущего пакета, несколько целей разделены пробелом (может быть пустым)
* Игнорирует цели all
, install
, clean
в Других_Target_Names
* Ключевое слово prepare
является специальной реальной целью, указывающей на выполнение make prepare
перед make
* Обычно используется для загрузки стандартной конфигурации в .config
, когда .config
отсутствует * Ключевое слово psysroot
является специальной реальной целью, указывающей на выполнение make psysroot
перед make
* Использует sysroot под OUT_PATH вместо ENV_TOP_OUT
* Ключевое слово release
является специальной реальной целью, указывающей на выполнение make release
при установке fakeroot rootfs
* Эта цель не требует установки заголовков и статических библиотек
* Когда цель release отсутствует, выполняется make install
при установке в fakeroot rootfs
* Ключевое слово union
является специальной виртуальной целью, указывающей на несколько пакетов, использующих один Makefile
* В этом случае цели prepare
, all
, install
, clean
, release
и т.д. должны быть переименованы как <package_name>-xxx
* Ключевое слово native
является специальной виртуальной целью, указывающей на одновременное определение пакета для кросс-компиляции и пакета для локальной компиляции
* Ключевое слово cache
является специальной виртуальной целью, указывающей на поддержку механизма кэширования пакетом
* Ключевое слово jobserver
— это специальный виртуальный целевой объект, который указывает на многопоточное компилирование (ENV_BUILD_JOBS
).
* Makefile, содержащий команду make
, не должен добавлять этот целевой объект, например, в Makefile драйвера.
* subtarget1:subtarget2:. . . ::dep1:dep2:. . .
— это специальный синтаксис, который явно указывает зависимости для дочерних целей. * Двойные двоеточия разделяют список дочерних целей и список зависимостей.
* Одинарное двоеточие разделяет внутренние дочерние цели и внутренние зависимости, а список зависимостей может быть пустым.
* Depend_Names: Идентификатор имени пакета зависимости, а несколько зависимостей разделены пробелом (может быть пустым).
* Depend_Names поддерживает несколько строк с использованием \
в конце строки. Примечание: Идентификаторы (Target_Name / Depend_Names) могут содержать только строчные буквы, цифры и дефисы; для Other_Target_Names такие ограничения отсутствуют, допускается использование символа шаблона (%
)* Команды обычного сборки
make <package>
: Собирает указанный пакет с предварительной компиляцией зависимых пакетовmake <package>_single
: Собирает только указанный пакет без предварительной компиляции зависимых пакетовmake <package>_<target>
: Собирает указанный целевой пакет с предварительной компиляцией зависимых пакетовmake <package>_<target>_single
: Собирает только указанный целевой пакет без предварительной компиляции зависимых пакетовПримечание: Команды типа single существуют только в пакетах с зависимостями
Зависимости сборки Yocto определяются в рецепте
DEPENDS
: компиляционные зависимости
<package>-native
), например: bash-native
RDEPENDS:${PN}
: запускаемые зависимости
EXTRADEPS
: дополнительные зависимости, экспортированные CBuild
inherit weakdep
weakdep.bbclass
анализирует .config
в ENV_CFG_ROOT, устанавливает DEPENDS
и RDEPENDS:${PN}
в зависимости от того, выбран ли этот элемент или нетPACKAGECONFIG
: Динамически устанавливает зависимости пакетов, которые устанавливают pkg-config (xxx/usr/lib/pkgconfig/xxx.pc
)### Виртуальные зависимости обычной/Yocto сборкиПравило виртуальной зависимости: #VDEPS(Тип_Виртуальной_Зависимости) Target_Name(Дополнительная_Информация): Depend_Names
! [Регулярное выражение для правила виртуальной зависимости](. /scripts/bin/regex_vdeps. svg)* Virtual_Type : Обязательное поле, тип виртуального пакета, на данный момент существует 4 типа
menuconfig
: Указывает, что генерируется виртуальный пакет menuconfig
, все пакеты в текущей директории (включая поддиректории) сильно зависят от этого пакетаconfig
: Указывает, что генерируется виртуальный пакет config
menuchoice
: Указывает, что генерируется виртуальный пакет choice
, все пакеты в текущей директории (включая поддиректории) станут подпунктами этого пакетаchoice
: Указывает, что генерируется виртуальный пакет choice
, все пакеты, перечисленные в Other_Infos, станут подпунктами этого пакетаVirtual_Name : Обязательное поле, идентификатор имени виртуального пакета
Other_Infos : Необязательное поле
/
, указывает, что он действует на указанную поддиректорию вместо текущей директории
/virtual
(virtual может быть любым словом), в этом случае, виртуальный элемент появляется в текущей директории вместо верхней директорииchoice
, пробел-разделенная последовательность пакетов становится подпунктами выбора, и первый пакет по умолчанию отмечен как выбранныйmenuchoice
, указанный пакет по умолчанию отмечен как выбранный* Depend_Names : Необязательное поле, список зависимостей, аналогичный Depend_Names в DEPS-заявке\
в конце строкиunselect
для типов menuconfig
и config
Примечание: Виртуальные пакеты не участвуют в компиляции, но используются для организации и управления реальными пакетами. Обычная сборка и сборка Yocto имеют одинаковые правила виртуальной зависимости.### Специальная зависимостьВиртуальный пакет
*depname
: Указывает, что этот зависимый пакет является виртуальным пакетом
*
, оставшееся имя пакета может содержать специальные символы и будет продолжать разрешаться, например: *&&depname
finally
: Указывает, что компиляция этого пакета происходит после всех остальных пакетов, обычно используется для генерации rootfs (Обычная сборка)unselect
: Указывает, что этот пакет не компилируется по умолчанию (default n
), в противном случае он компилируется по умолчанию (default y
)nokconfig
: Указывает, что этот пакет не содержит Kconfig
nokconfig
, а другие пакеты должны это делатьkconfig
: Указывает, что несколько пакетов используют один и тот же Kconfig, обычно, кросс-/native компиляционные пакеты одного и того же программного обеспечения используют один и тот же Kconfig
! depname
: Указывает, что этот пакет и пакет depname конфликтуют, они не могут быть включены одновременно (depends on ! depname
)&depname
или &&depname
: Указывает, что этот пакет слабо / сильно выбирает пакет depname (imply depname
/ select depname
)
&
указывает, что при выборе этого пакета, пакет depname также автоматически выбирается, и пакет depname может быть вручную отменен&&
указывает, что при выборе этого пакета, пакет depname также автоматически выбирается, и пакет depname не может быть вручную отменен? depname
или ? ? depname
: Указывает, что этот пакет слабо зависит от пакета depname (if . . endif
)
?
указывает, что при выборе этого пакета, пакет depname может быть включен, если он доступен, иначе он будет пропущен` указывает, что пакет depname не устанавливает общие библиотеки (зависимости на этапе компиляции)? ?
указывает, что пакет depname устанавливает общие библиотеки или . . . (зависимости на этапе компиляции и выполнения)depa|depb
или depa||depb
: Указывает, что этот пакет слабо зависит от пакета depa или depb или . . . (depA||depB
)
|
неявно выводится с помощью предварительно построенного пакета или исходного пакета
||libtest
неявно выводится как prebuild-libtest||libtest
|
и ||
относится к ?
* & ?
: &
можно использовать в сочетании с ?
, это не требует определенного порядка комбинации и указывает на выбор и слабую зависимость&&? ? depname
или ? ? &&depname
указывает на слабую зависимость и сильный выбор, ? ? &depname
или &? ? depname
указывает на слабую зависимость и слабый выбор& |
: &
можно использовать в сочетании с |
, это указывает на выбор или и слабую зависимость
|
неявно выводится как выбор либо предварительно построенного пакета, либо исходного пакета.&&||libtest
неявно выводится как &&*build-libtest||prebuild-libtest||libtest
.
depname@condition
или depname@@condition
: Если условие установлено на y и depname выбран, этот пакет будет зависеть от пакета depname (обычное построение).?
и ??
, нет разницы между |
и ||
, нет разницы между @
и @@
.?
|
@
только устанавливают DEPENDS
, ??
||
@@
устанавливают как DEPENDS
, так и RDEPENDS:${PN}
.
Примечание: Специальные зависимости устанавливаются для Depend_Names
в DEPS-выражении при обычном построении, переменная EXTRADEPS
в рецепте при построении Yocto, и
если EXTRADEPS содержит слабые зависимости, рецепт должен наследовать weakdep
класс, и обработка слабых зависимостей зависит от .config
в ENV_CFG_ROOT### Диаграмма зависимостей gen_depends_image.sh* Использование
* Параметры скрипта: gen_depends_image.sh <package> <store_path> <package_list_file> <config_file>
* package : Имя пакета
* store_path : Путь к папке, куда будут сохранены сгенерированные изображения
* package_list_file : Файл со списком пакетов, сгенерированный gen_build_chain.py (-a
для обычного сбора, -t
для сбора Yocto)
* config_file : Путь к файлу .config
* Команда: make <package>-deps
* Сгенерированное описание картинки
* Обычное построение
* Твердая линия : Сильная зависимость
* Пунктирная линия : Слабая зависимость
* Двойная линия : Предварительное построение и srcbuild либо, либо патч и unpacth либо
* Зелёная линия : Пакет выбран в .config
* Красная линия : Пакет не выбран в .config
* Цвет верхнего уровня пакета
* Зелёный квадрат : Пакет выбран в .config
* Красный квадрат : Пакет не выбран в .config
* Построение Yocto
* Зелёный квадрат : Пользовательский пакет, который выбран в .config
* Красный квадрат : Пользовательский пакет, который не выбран в .config
* Квадрат корзины : Пакет сообщества (слои не указаны в опции -u
команды gen_build_chain.py)## Настройка окружения
Инициализация компиляционного окружения
lengjing@lengjing:~/data/cbuild$ source scripts/build.env
============================================================
ENV_BUILD_MODE : внешний
ENV_BUILD_JOBS : -j8
ENV_MAKE_FLAGS : -s
ENV_TOP_DIR : /home/lengjing/data/cbuild
ENV_MAKE_DIR : /home/lengjing/data/cbuild/scripts/core
ENV_TOOL_DIR : /home/lengjing/data/cbuild/scripts/bin
ENV_DOWN_DIR : /home/lengjing/data/cbuild/output/mirror-cache/downloads
ENV_CACHE_DIR : /home/lengjing/data/cbuild/output/mirror-cache/build-cache
ENV_MIRROR_URL : http://127.0.0.1:8888
ENV_TOP_OUT : /home/lengjing/data/cbuild/output/noarch
ENV_CFG_ROOT : /home/lengjing/data/cbuild/output/noarch/config
ENV_OUT_ROOT : /home/lengjing/data/cbuild/output/noarch/objects
ENV_INS_ROOT : /home/lengjing/data/cbuild/output/noarch/sysroot
ENV_DEP_ROOT : /home/lengjing/data/cbuild/output/noarch/sysroot
ENV_TOP_HOST : /home/lengjing/data/cbuild/output/x86_64-native
ENV_OUT_HOST : /home/lengjing/data/cbuild/output/x86_64-native/objects
ENV_INS_HOST : /home/lengjing/data/cbuild/output/x86_64-native/sysroot
ENV_DEP_HOST : /home/lengjing/data/cbuild/output/x86_64-native/sysroot
============================================================
```sh
lengjing@lengjing:~/data/cbuild$ source scripts/build.env cortex-a53
lengjing@lengjing:~/data/cbuild$ make -C scripts/toolchain
Примечание: Пользователи должны заполнить параметры, связанные с SOC, в файле process_machine.sh
. В настоящее время в этом файле приведены примеры для cortex-a53
и cortex-a9
.
process_machine.sh
make
, её значение по умолчанию -s
export ENV_MAKE_FLAGS=
: При установке значения в пустую строку, сборка будет выводить более подробную информацию
python -m http.server <port>
для быстрого создания HTTP-сервера
Примечание: bitbake не может напрямую использовать переменные окружения текущего shell в Yocto Build, поэтому пользовательские переменные окружения должны быть экспортированы из рецепта
inc.env.mk
используется как для сборки приложений, так и для сборки драйверов$(call safe_copy,<options of cp>,<srcs and dst>)
: Использует cp
с блокировкой файла для предотвращения ошибок при одновременной установке нескольких целевых процессов в обычной сборке$(call link_hdrs)
: Автоматически устанавливает CFLAGS для поиска заголовочных файлов на основе переменной SEARCH_HDRS
$(call link_libs)
: Автоматически устанавливает CFLAGS для поиска библиотек$(call prepare_sysroot)
: Подготавливает зависимое окружение sysroot в директории OUT_PATH
в обычной сборкеTarget_Name
в DEPS-запросе, без -native
)PACKAGE_NAME
кросс-компиляционного пакета или $(PACKAGE_NAME)-native
для нативной компиляцииPACKAGE_NAME
PACKAGE_DEPS
* OUT_PREFIX : Верхнеуровневая папка для выходных данных компиляции, значение по умолчанию равно ENV_OUT_HOST
для нативной компиляции или ENV_OUT_ROOT
для кросс-компиляцииENV_INS_HOST
для нативной компиляции или ENV_INS_ROOT
для кросс-компиляцииENV_DEP_HOST
для нативной компиляции или ENV_DEP_ROOT
для кросс-компиляцииy
, если кросс-компиляционный пакет зависит от нативных пакетовy
, указывает на нативную компиляциюy
, указывает на подготовку зависимости sysroot в OUT_PATH
вместо ENV_TOP_OUT
1>/dev/null
inc.ins.mk
используется как для компиляции приложений, так и для компиляции драйверовbase_*dir
и hdrdir
не входят в стандарт GNUInstallDirs$(INS_PREFIX)
$(eval $(call install_obj,<ID>,<cp options>))
: Генерирует правила Makefile для установки в указанную папку
dir
install_<lowercase id>s
INSTALL_<uppercase ID>S
base_bindir
| /bin
| $(INSTALL_BASE_BINS)
| install_base_bins
|
| base_sbindir
| /sbin
| $(INSTALL_BASE_SBINS)
| install_base_sbins
|
| base_libdir
| /lib
| $(INSTALL_BASE_LIBS)
| install_base_libs
|
| bindir
| /usr/bin
| $(INSTALL_BINS)
| install_bins
|
| sbindir
| /usr/sbin
| $(INSTALL_SBINS)
| install_sbins
|
| libdir
| /usr/lib
| $(INSTALL_LIBS)
| install_libs
|
| libexecdir
| /usr/libexec
| $(INSTALL_LIBEXECS)
| install_libexecs
|
| hdrdir
| /usr/include/$(INSTALL_HDR)
| $(INSTALL_HDRS)
| install_hdrs
|
| includedir
| /usr/include
| $(INSTALL_INCLUDES)
| install_includes
|
| datadir
| /usr/share
| $(INSTALL_DATAS)
| install_datas
|
| infodir
| $(datadir)/info
| $(INSTALL_INFOS)
| install_infos
|
| localedir
| $(datadir)/locale
| $(INSTALL_LOCALES)
| install_locales
|
| mandir
| $(datadir)/man
| $(INSTALL_MANS)
| install_mans
|
| docdir
| $(datadir)/doc
| $(INSTALL_DOCS)
| install_docs
|
| sysconfdir
| /etc
| $(INSTALL_SYSCONFS)
| install_sysconfs
|
| servicedir
| /srv
| $(INSTALL_SERVICES)
| install_services
|
| sharedstatedir
| /com
| $(INSTALL_SHAREDSTATES)
| install_sharedstates
|
| localstatedir
| /var
| $(INSTALL_LOCALSTATES)
| install_localstates
| | runstatedir
| /run
| $(INSTALL_RUNSTATES)
| install_runstates
|* По умолчанию используются директорииBIN_TARGETS
, значение по умолчанию переменной INSTALL_BINARIES
присваивается $(BIN_TARGETS)
LIB_TARGETS
, значение по умолчанию переменной INSTALL_LIBRARIES
присваивается $(LIB_TARGETS)
```makefile
INSTALL_BASE_BINARIES ?= $(INSTALL_BINARIES)
INSTALL_BASE_BINS ?= $(INSTALL_BASE_BINARIES)
INSTALL_BINS ?= $(INSTALL_BINARIES)
INSTALL_BASE_LIBRARIES ?= $(INSTALL_LIBRARIES)
INSTALL_BASE_LIBS ?= $(INSTALL_BASE_LIBRARIES)
INSTALL_LIBS ?= $(INSTALL_LIBRARIES)
INSTALL_HDRS ?= $(INSTALL_HEADERS)
$(eval $(call install_ext,<ID>,<cp options>))
: Генерирует правила шаблонов Makefile для установки в указанную поддиректорию в указанной директории
dir
install_<lowercase id>s_%
, где %
соответствует нижнему регистру букв и т.д.INSTALL_<uppercase ID>S_<xxx>
, где xxx совпадает с шаблоном в цели
/
) представляет место установки* Определенные правила шаблонов Makefileinstall_todir_xxx
и install_tofile_xxx
не определяются install_ext
install_todir_xxx
: Устанавливает указанные файлы и папки в указанную поддиректорию в корневой директории установкиinstall_tofile_xxx
: Устанавливает указанный файл в указанный файл в корневой директории установки
| Имя директории | Директория установки | Имя переменной для установки | Цель паттерна Makefile |
| --------------- | ----------------------------------- | ----------------------------- | ------------------------ |
| includedir
| /usr/include<указанное подпапку>
| $(INSTALL_INCLUDES_<xxx>)
| install_includes_%
|
| datadir
| /usr/share<указанное подпапку>
| $(INSTALL_DATAS_<xxx>)
| install_datas_%
|
| sysconfdir
| /etc<указанное подпапку>
| $(INSTALL_SYSCONFS_<xxx>)
| install_sysconfs_%
|
|
| <указанное подпапку>
| $(INSTALL_TODIR_<xxx>)
| install_todir_%
|
|
| <указанное файл>
| $(INSTALL_TOFILE_<xxx>)
| install_tofile_%
|Создайте 2 пустых файла testa и testb, и содержимое файла Makefile следующее: ```makefile INSTALL_DATAS_test = testa testb /testa/testb INSTALL_TODIR_test = testa testb /usr/local/bin INSTALL_TOFILE_testa = testa /etc/a.conf INSTALL_TOFILE_testb = testa /etc/b.conf
all: install_datas_test install_todir_test install_tofile_testa install_tofile_testb include $(ENV_MAKE_DIR)/inc.ins.mk
Дерево файлов после выполнения make
:
sysroot
├── etc
│ ├── a.conf
│ └── b.conf
└── usr
├── local
│ └── bin
│ ├── testa
│ └── testb
└── share
└── testa
└── testb
├── testa
└── testb
inc.app.mk
используется для компиляции общедоступных библиотек, статических библиотек и исполняемых файлов#### Цели шаблона приложенияLIB_TARGETS
LIBSO_NAME
может быть задано в формате <имя библиотеки> <основная версия> <минорная версия> <патч версия>
, например:
LIBSO_NAME = libtest.so 1 2 3
: сгенерированная библиотека будет libtest.so.1.2.3
, а символические ссылки будут libtest.so
и libtest.so.1
LIBSO_NAME = libtest.so 1 2
: сгенерированная библиотека будет libtest.so.1.2
, а символические ссылки будут libtest.so
и libtest.so.1
LIBSO_NAME = libtest.so 1
: сгенерированная библиотека будет libtest.so.1
, а символическая ссылка будет libtest.so
LIBSO_NAME = libtest.so
: сгенерированная библиотека будет libtest.so
, а символических ссылок не будетLIBSO_NAME
содержит номера версий, то по умолчанию soname будет <имя библиотеки>.<основная версия>
LDFLAGS += -Wl,-soname=libxxxx.so
LIB_TARGETS
BIN_TARGETS
#### Функции шаблона приложения* $(eval $(call add-liba-build,<имя статической библиотеки>,<источники файлов>))
: Создает правило для компиляции статической библиотеки$(eval $(call add-libso-build,<имя динамической библиотеки>,<источники файлов>))
: Создает правило для компиляции динамической библиотеки
<имя динамической библиотеки>
может быть задано в формате <имя библиотеки> <основная версия> <минорная версия> <патч версия>
, см. LIBSO_NAME
$(eval $(call add-libso-build,<имя динамической библиотеки>,<источники файлов>,<параметры линковки>))
: Создает правило для компиляции динамической библиотеки
$(eval $(call add-libso-build,<имя динамической библиотеки>,<источники файлов>,-Wl$(comma)-soname=libxxxx.so))
$(eval $(call add-bin-build,<имя исполняемого файла>,<источники файлов>))
: Создает правило для компиляции исполняемого файла$(eval $(call add-bin-build,<имя исполняемого файла>,<источники файлов>,<параметры линковки>))
: Создает правило для компиляции исполняемого файла$(call set_flags,<тип флага>,<источники файлов>,<значение>)
: Устанавливает флаги компиляции для указанных исходных файлов
$(call set_flags,CFLAGS,main.c src/read.c src/write.c,-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE)
Примечание: Причина предоставления вышеуказанных функций заключается в том, что в одном файле Makefile можно компилировать несколько библиотек или исполняемых файлов #### Переменные шаблона приложения
.
SRC_PATH = src1 src2 src3
.git scripts output
c cpp S
c
, $(CPP_SUFFIX)
и $(ASM_SUFFIX)
cc cp cxx cpp CPP c++ C
S s asm
REG_SUFFIX = c cpp S cxx
include $(ENV_MAKE_DIR)/inc.app.mk
REG_SUFFIX = c cpp S CXX
CPP_SUFFIX = cc cp cxx cpp CPP c++ C CXX
include $(ENV_MAKE_DIR)/inc.app.mk
$(eval $(call compile_obj,CXX,$(CXX)))
*.c
с помощью компилятора CXXREG_SUFFIX
в директории SRC_PATH
* Если пользователи указывают SRCS
, они также могут задать SRC_PATH
, и IGNORE_PATH
игнорируетсяgcc g++
as
gcc g++
y
включаются флаги -O0 -g -ggdb
### Шаблон для драйвера inc. mod. mk* inc.mod.mk
используется для компиляции драйверов (внешних модулей Linux)*.ko
)
$(INS_PREFIX)/lib/modules/<kernel_release>/extra/
Module.symvers
, эта цель задана как зависимость для install_hdrs
make -O $(KERNEL_OUT)
)IGNORE_PATH: Игнорируемые имена директорий при поиске, по умолчанию это .git scripts output
SRCS: Все файлы исходного кода, по умолчанию это все файлы с суффиксом REG_SUFFIX
(*.c
*.S
) в директории $(src)
ccflags-y
asflags-y
ldflags-y
: Параметры компиляции модуля ядра, сборки и линковки
* Функции части Kbuild
$(call translate_obj,<source files>)
: Преобразует имя набора файлов исходного кода в формат, требуемый KBUILD, независимо от того, начинаются ли файлы с .o или нет.
$(call set_flags,<Flag Type>,<source files>,<value>)
: Устанавливает параметры компиляции для указанных файлов исходного кода.* Другие примечания
Если MOD_NAME
содержит несколько имен модулей, пользователи должны заполнить объекты для каждого модуля, например:
MOD_NAME = mod1 mod2
mod1-y = a1.o b1.o c1.o
mod2-y = a2.o b2.o c2.o
При использовании разделения исходного кода и выходных данных компиляции, файл inc.mod.mk
должен сначала скопировать Kbuild или Makefile в директорию OUT_PATH
.
Если следующий патч в scripts/Makefile.modpost
ядра Linux применён, операцию копирования можно пропустить.
-include $(if $(wildcard $(KBUILD_EXTMOD)/Kbuild), \
- $(KBUILD_EXTMOD)/Kbuild, $(KBUILD_EXTMOD)/Makefile)
+include $(if $(wildcard $(src)/Kbuild), $(src)/Kbuild, $(src)/Makefile)
inc.conf.mk
предоставляет метод конфигурации с использованием Konfig.DEF_CONFIG
, если файл .config
не существуетdefconfig: Восстанавливает стандартную конфигурацию, указанную DEF_CONFIG
menuconfig: Открывает графическое окно конфигурации
cleanconfig: Очищает конфигурацию и выходные данные kconfig
xxx_config: Загружает специальную конфигурацию xxx_config
из CONFIG_SAVE_PATH
как текущую конфигурацию
xxx_saveconfig: Сохраняет текущую конфигурацию в xxx_config
из CONFIG_SAVE_PATH
xxx_defconfig: Загружает специальную конфигурацию xxx_defconfig
из CONFIG_SAVE_PATH
как текущую конфигурацию
xxx_savedefconfig: Сохраняет текущую конфигурацию в xxx_defconfig
из CONFIG_SAVE_PATH
#### Переменные шаблона конфигурации
OUT_PATH: Путь вывода конфигурации, оставьте его по умолчанию
CONF_SRC: Исходная директория проекта kconfig, её значение по умолчанию $(ENV_TOP_DIR)/scripts/kconfig
CONF_PATH: Директория установки инструментов kconfig
CONF_PREFIX: Устанавливает переменные, которые используются при выполнении conf
/mconf
, в основном следующие два параметра:
srctree=<path_name>
: Относительная директория команды source
в файлах Kconfig, если srctree
не указан, по умолчанию относительная директория — это директория, где выполняются conf
/mconf
CONFIG_="<prefix>"
: Префикс элементов конфигурации в автоматически сгенерированном .config
и config.h
, если CONFIG_
не указан, по умолчанию префикс — это CONFIG_
; если CONFIG_=""
, префикс в имени элемента отсутствует.CONF_HEADER: Устанавливает макрос включения #ifndef xxx ... #define xxx ... #endif
, используемый в автоматически сгенерированном config.h
, значение по умолчанию — __<upper of $(PACKAGE_NAME)>_CONFIG_H__
config.h
по умолчанию не содержит макрос включения, он добавляется командой sed
KCONFIG: Файл параметров конфигурации, значение по умолчанию — Kconfig
CONF_SAVE_PATH: Директория, где получается и сохраняется файл конфигурации, значение по умолчанию — директория config
в пакете
CONF_APPEND_CMD: Добавляет команды для выполнения при изменении конфигурации
scripts/kconfig
linux-5.18CONFIG_PATH
AUTOCONFIG_PATH
AUTOHEADER_PATH
, которые изначально передаются как переменные окруженияfetch_package.sh <метод> <url> <пакет> [outdir] [outname]
curl
и распаковывается с помощью tar
, расширение файла пакета может быть tar.gz
, tar.bz2
, tar.xz
, tar
и т.д.curl
и распаковывается с помощью unzip
, расширение файла пакета может быть gz
, zip
и т.д.git clone
svn checkout
* git: Пакет загружается с помощью curl
из файла $package-git-xxx.tar.gz
на зеркальном сервере, или загружается с помощью git clone
curl
из файла $package-svn-xxx.tar.gz
на зеркальном сервере, или загружается с помощью svn checkout
md5
одновременно, например:
https://xxx/xxx.tar.xz;md5=yyy
branch
/ tag
/ rev
(ревизия) одновременно (tag
и rev
не должны указываться одновременно), например:
https://xxx/xxx.git;branch=xxx;tag=yyy
https://xxx/xxx.git;branch=xxx;rev=yyy
https://xxx/xxx.git;tag=yyy
https://xxx/xxx.git;rev=yyy
rev
одновременно, например:
https://xxx/xxx;rev=yyy
tar
/ zip
, или имя сохраняемой директории для git
/ svn
, и путь сохранения ENV_DOWN_DIR
outdir
fetch_package.sh
предпочитает загружать пакет с помощью зеркального URL, указанного в ENV_MIRROR_URL
, вместо оригинального URLfetch_package.sh
предпочитает загружать пакет с помощью зеркального URL, указанного в ENV_MIRROR_URL
, вместо оригинального URL.Использование: exec_patch.sh <метод> <patch_srcs> <patch_dst>
patch
для применения исправлений, unpatch
для удаления исправлений<пакет для патча>-patch-<ID>
) и не-патч-пакет (<пакет для патча>-unpatch-<ID>
)xxx-patch-xxx|xxx-unpatch-xxx
в Depend_Names
для DEPS-заявления для исходного пакета#VDEPS(выбор) xxx-patch-xxx-выбор(xxx-unpatch-xxx xxx-patch-xxx):
PATCH_SCRIPT := $(ENV_TOOL_DIR)/exec_patch.sh
PATCH_PACKAGE := xxx # имя пакета для патча
PATCH_TOPATH := xxx # папка пакета для патча
PATCH_FOLDER := xxx # папка патчей, где хранятся патчи
PATCH_NAME_xxx := 0001-xxx.patch # ID пакета патчей (xxx)
PATCH_NAME_yyy := 0001-yyy.patch 0002-yyy.patch # ID другого пакета патчей (yyy)
$(PATCH_PACKAGE)-unpatch-all:
@$(PATCH_SCRIPT) unpatch $(PATCH_FOLDER) $(PATCH_TOPATH)
@echo "Unpatch $(PATCH_TOPATH) Done."
$(PATCH_PACKAGE)-patch-%-all:
@$(PATCH_SCRIPT) patch "$(patsubst %,$(PATCH_FOLDER)/%,$(PATCH_NAME_$(patsubst $(PATCH_PACKAGE)-patch-%-all,%,$@)))" $(PATCH_TOPATH)
@echo "Build $(patsubst %-all,%,$@) Done."
``` $(PATCH_PACKAGE)-unpatch-%-all:
@$(PATCH_SCRIPT) unpatch "$(patsubst %,$(PATCH_FOLDER)/%,$(PATCH_NAME_$(patsubst $(PATCH_PACKAGE)-unpatch-%-all,%,$@)))" $(PATCH_TOPATH)
@echo "Сборка $(patsubst %-all,%,$@) завершена."
%-clean:
@
%-install:
@
Использование: Запускает process_cache.sh -h
Принцип работы кэша
* FETCH_METHOD : Выбранная методом загрузки из `tar` `zip` `git` `svn`, её значение по умолчанию — `tar`
* SRC_URLS : URL-ы загрузки, они содержат `url` `branch` `rev` `tag` `md5`, значение по умолчанию генерируется в соответствии с следующими переменными:
* SRC_URL : чистый URL
* SRC_BRANCH : ветка для `git`
* SRC_TAG : тег для `git`
* SRC_REV : ревизия для `git` или `svn`
* SRC_MD5 : md5 для `tar` или `zip`
* SRC_PATH : Путь к исходному коду, значение по умолчанию — `$(OUT_PATH)/$(SRC_DIR)`
* OBJ_PATH : Путь к выходным файлам компиляции, значение по умолчанию — `$(OUT_PATH)/build`
* INS_PATH : Корневой путь установки, значение по умолчанию — `$(OUT_PATH)/image`
* INS_SUBDIR : Подпапка установки, значение по умолчанию — `/usr`, поэтому фактический путь установки — `$(INS_PATH)$(INS_SUBDIR)`
* MAKES : Команда компиляции, значение по умолчанию — `ninja $(ENV_BUILD_JOBS) $(MAKES_FLAGS)` для meson, `make $(ENV_BUILD_JOBS) $(ENV_MAKE_FLAGS) $(MAKES_FLAGS)` для остальных
* MAKES_FLAGS : Пользователи могут задать дополнительные флаги компиляции<br>* Переменные для обработки кэша
* CACHE_SRCFILE : Имя файла или директории для загрузки пакета, значение по умолчанию — `$(SRC_NAME)`
* Для локального пакета это значение не нужно устанавливать
* Если установлены атрибуты загрузки, значение по умолчанию — пустая строка
* CACHE_OUTPATH : Корневая директория для вывода, значение по умолчанию — `$(OUT_PATH)`
* CACHE_INSPATH : Корневая директория для установки, значение по умолчанию — `$(INS_PATH)`
* CACHE_GRADE : Число уровня кэша, которое определяет префикс файла кэша компиляции, значение по умолчанию — 2
* Обычно существует четыре уровня кэша: `soc_name` `cpu_name` `arch_name` `cpu_family`
* Например: Если soc — v9 (cortex-a55), то уровни кэша будут `v9 cortex-a55 armv8-a aarch64`
* CACHE_CHECKSUM : Дополнительные файлы и директории для проверки, по умолчанию в значение добавляется файл `mk. deps`
* Директория поддерживает следующий синтаксис: `<поисковые директории>:<поисковые строки>:<игнорируемые директории>:<игнорируемые строки>`, подэлементы могут быть разделены вертикальной чертой `|` :
* Например: `"srca|srcb:*. c|*. h|Makefile:test:*. o|*. d"`, `"src:*. c|*. h|*. cpp|*. hpp"`
* CACHE_DEPENDS : Зависимости пакета, значение по умолчанию — пустая строка (автоматически анализируются зависимости)
* Если у пакета нет зависимостей, лучше установить значение на `none`
* CACHE_APPENDS : Дополнительные строки для проверки, такие как динамические конфигурации * CACHE_URL : URL для загрузки, значение по умолчанию — `[$(FETCH_METHOD)]$(SRC_URLS)` при загрузке пакета в скрипте
* CACHE_VERBOSE : Генерировать ли файл лога, значение по умолчанию — `1`(генерирует лог), файл лога — `$(CACHE_OUTPATH)/$(CACHE_PACKAGE)-cache.log` #### Функции шаблона кэша
$(OUT_PATH)
PATCH_FOLDER
должна быть установлена перед этимSRC_URL
установлена, задача do_fetch
автоматически выполнитсяPATCH_FOLDER
установлена, задача do_patch
автоматически выполнитсяdo_prepend
установлена, она выполнится перед командой MAKES
COMPILE_TOOL
установлена, она предоставляет следующие методы компиляции:
configure
, выполнится команда configure
перед командой MAKES
configure
configure
cmake
, выполнится команда cmake
перед командой MAKES
cmake
cmake
meson
, выполнится команда meson
перед командой MAKES
meson
--wrap-mode=nodownload
(предотвращает загрузку зависимых пакетов Meson).--libdir=$(INS_PATH)$(INS_SUBDIR)/lib
(предотвращает установку библиотек в xxx/lib/x86_64-linux-gnu/
).do_prepend
установлена, она выполнится после команды MAKES
.do_install_append
установлена, она выполнится в конце цели install
.MATCH
, это означает, что кэш соответствует.ERROR
, это означает, что функция завершилась неудачей.$(ENV_CACHE_DIR)
и извлекает кэш в $(OUT_PATH)
, если $(INS_PATH)
не существует.$(ENV_CACHE_DIR)
. * all / clean / install: Необходимые цели, предоставляемые шаблоном.
* Если переменная `USER_DEFINED_TARGET` не установлена в `y`, будет использоваться `all / clean / install` цели, предоставляемые шаблоном.
* psysroot: Подготавливает зависимый sysroot в `OUT_PATH` вместо `ENV_TOP_OUT`.
* srcbuild: Компилирует без механизма кэширования. * cachebuild: Компилирует с использованием механизма кэширования
* dofetch: Только загружает пакет из интернета или зеркального сервера
* setforce: Устанавливает флаг принудительной компиляции
* set1force: Устанавливает одноразовый флаг принудительной компиляции
* unsetforce: Удаляет флаг принудительной компиляцииПримечание: При компиляции OSS пакетов из исходного кода мы обычно добавляем `cache` `psysroot` в `Other_Target_Names` DEPS-заявления, что означает использование механизма кэширования для ускорения перекомпиляции, а зависимый sysroot находится в `OUT_PATH` вместо `ENV_TOP_OUT` для предотвращения автоматического добавления необъявленных зависимых пакетов.
make time_statistics
: Компилирует все пакеты по одному, и считает время компиляции каждого пакета
make
: Многопоточная компиляция всех пакетовmake all_fetchs
: Только загружает исходный код всех кэшируемых пакетов по одномуmake all_caches
: Загружает и компилирует все кэшируемые пакеты по одному
lengjing@lengjing:~/data/cbuild$ source scripts/build.env cortex-a53
...
lengjing@lengjing:~/data/cbuild$ make -C scripts/toolchain
make: вход в каталог '/home/lengjing/data/cbuild/scripts/toolchain'
make[1]: вход в каталог '/home/lengjing/data/cbuild/scripts/toolchain'
/home/lengjing/data/cbuild/scripts/bin/fetch_package.sh tar "http://ftp.gnu.org/gnu/gmp/gmp-6.2.1.tar.xz" gmp-6.2.1.tar.xz /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs gmp-6.2.1
curl http://ftp.gnu.org/gnu/gmp/gmp-6.2.1.tar.xz to /home/lengjing/data/cbuild/output/mirror-cache/downloads/gmp-6.2.1.tar.xz
untar /home/lengjing/data/cbuild/output/mirror-cache/downloads/gmp-6.2.1.tar.xz to /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs
/home/lengjing/data/cbuild/scripts/bin/fetch_package.sh tar "http://ftp.gnu.org/gnu/mpfr/mpfr-4.1.1.tar.xz" mpfr-4.1.1.tar.xz /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs mpfr-4.1.1
curl http://ftp.gnu.org/gnu/mpfr/mpfr-4.1.1.tar.xz to /home/lengjing/data/cbuild/output/mirror-cache/downloads/mpfr-4.1.1.tar.xz
untar /home/lengjing/data/cbuild/output/mirror-cache/downloads/mpfr-4.1.1.tar.xz to /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs
/home/lengjing/data/cbuild/scripts/bin/fetch_package.sh tar "http://ftp.gnu.org/gnu/mpc/mpc-1.3.1.tar.gz" mpc-1.3.1.tar.gz /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs mpc-1.3.1
curl http://ftp.gnu.org/gnu/mpc/mpc-1.3.1.tar.gz to /home/lengjing/data/cbuild/output/mirror-cache/downloads/mpc-1.3.1.tar.gz
untar /home/lengjing/data/cbuild/output/mirror-cache/downloads/mpc-1.3.1.tar.gz to /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs
/home/lengjing/data/cbuild/scripts/bin/exec_patch.sh patch patch/mpc /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs/mpc-1.3.1
patching file src/mpc.h
Patch patch/mpc/0001-mpc-Fix-configuring-gcc-failed
```патч к /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs/mpc-1. 3. 1 завершен.
/home/lengjing/data/cbuild/scripts/bin/fetch_package. sh tar "http://libisl. sourceforge. io/isl-0. 25. tar. xz" isl-0. 25. tar. xz /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs isl-0. 25
```xz /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs isl-0. 25
curl http://libisl. sourceforge. io/isl-0. 25. tar. xz к /home/lengjing/data/cbuild/output/mirror-cache/downloads/isl-0. 25. tar. xz
untar /home/lengjing/data/cbuild/output/mirror-cache/downloads/isl-0. 25. tar. xz к /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs
/home/lengjing/data/cbuild/scripts/bin/fetch_package. sh tar "http://cdn. kernel. org/pub/linux/kernel/v5. x/linux-5. 15. 88. tar. xz" linux-5. 15. 88. tar. xz /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs linux-5. 15. 88
curl http://cdn. kernel. org/pub/linux/kernel/v5. x/linux-5. 15. 88. tar. xz к /home/lengjing/data/cbuild/output/mirror-cache/downloads/linux-5. 15. 88. tar. xz
untar /home/lengjing/data/cbuild/output/mirror-cache/downloads/linux-5. 15. 88. tar. xz к /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs
/home/lengjing/data/cbuild/scripts/bin/fetch_package. sh tar "http://ftp. gnu. org/gnu/binutils/binutils-2. 40. tar. xz" binutils-2. 40. tar. xz /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs binutils-2. 40
curl http://ftp. gnu. org/gnu/binutils/binutils-2. 40. tar. xz к /home/lengjing/data/cbuild/output/mirror-cache/downloads/binutils-2. 40. tar. xz
untar /home/lengjing/data/cbuild/output/mirror-cache/downloads/binutils-2. 40. tar. xz к /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs
/home/lengjing/data/cbuild/scripts/bin/fetch_package. sh tar "http://ftp. gnu. org/gnu/gcc/gcc-12. 2. 0/gcc-12. 2. 0. tar. xz" gcc-12. 2. 0. tar. xz /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs gcc-12. 2. 0
curl http://ftp. gnu. org/gnu/gcc/gcc-12. 2. 0/gcc-12. 2. 0. tar. xz к /home/lengjing/data/cbuild/output/mirror-cache/downloads/gcc-12. 2. 0. tar. xz
untar /home/lengjing/data/cbuild/output/mirror-cache/downloads/gcc-12. 2. 0. tar. xz к /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcsxz to /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs
sed -i 's@print-multi-os-directory@print-multi-directory@g' \
`find /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs/gcc-12.2.0 -name configure -o -name configure.ac -o -name Makefile.in | xargs`
/home/lengjing/data/cbuild/scripts/bin/fetch_package.sh tar "http://ftp.gnu.org/gnu/glibc/glibc-2.36.tar.xz" glibc-2.36.tar.xz /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs glibc-2.36
curl http://ftp.gnu.org/gnu/glibc/glibc-2.36.tar.xz to /home/lengjing/data/cbuild/output/mirror-cache/downloads/glibc-2.36.tar.xz
untar /home/lengjing/data/cbuild/output/mirror-cache/downloads/glibc-2.36.tar.xz to /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs
/home/lengjing/data/cbuild/scripts/bin/fetch_package.sh tar "http://ftp.gnu.org/gnu/gdb/gdb-12.1.tar.xz" gdb-12.1.tar.xz /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs gdb-12.1
curl http://ftp.gnu.org/gnu/gdb/gdb-12.1.tar.xz to /home/lengjing/data/cbuild/output/mirror-cache/downloads/gdb-12.1.tar.xz
untar /home/lengjing/data/cbuild/output/mirror-cache/downloads/gdb-12.1.tar.xz to /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs
. /output/toolchain/cortex-a53-toolchain-gcc12.2.0-linux5.15/bin/aarch64-linux-gnu-gcc -v
Используемые встроенные спецификации.
COLLECT_GCC=. /output/toolchain/cortex-a53-toolchain-gcc12.2.0-linux5.15/bin/aarch64-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/home/lengjing/data/cbuild/output/toolchain/cortex-a53-toolchain-gcc12.2.0-linux5.15/libexec/gcc/aarch64-linux-gnu/12.2.0/lto-wrapper
Цель: aarch64-linux-gnu
Конфигурировано с: /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs/gcc-12.2.0/configure --target=aarch64-linux-gnu --prefix=/home/lengjing/data/cbuild/output/toolchain/cortex-a53-toolchain-gcc12.2.0-linux5.15 --with-gmp=/home/lengjing/data/cbuild/output/toolchain/cortex-a53-toolchain-gcc12.2.0-linux5.15/host --with-mpfr=/home/lengjing/data/cbuild/output/toolchain/cortex-a53-toolchain-gcc12.2.0-linux5.15/host --with-mpc=/home/lengjing/data/cbuild/output/toolchain/cortex-a53-toolchain-gcc12.2.0-linux5.15/host15/host --with-isl=/home/lengjing/data/cbuild/output/toolchain/cortex-a53-toolchain-gcc12.2.0-linux5.15/host --with-sysroot=/home/lengjing/data/cbuild/output/toolchain/cortex-a53-toolchain-gcc12.2.0-linux5.15/aarch64-linux-gnu/libc --with-build-sysroot=/home/lengjing/data/cbuild/output/toolchain/cortex-a53-toolchain-gcc12.2.0-linux5.15/aarch64-linux-gnu/libc --with-toolexeclibdir=/home/lengjing/data/cbuild/output/toolchain/cortex-a53-toolchain-gcc12.2.0-linux5.15/aarch64-linux-gnu/libc/lib --enable-languages=c,c++ --enable-shared --enable-threads=posix --enable-checking=release --with-arch=armv8-a --with-cpu=cortex-a53 --disable-bootstrap --disable-multilib --enable-multiarch --enable-nls --without-included-gettext --enable-clocale=gnu --enable-lto --enable-linker-build-id --enable-gnu-unique-object --enable-libstdcxx-debug --enable-libstdcxx-time=yes
Модель потока: posix
Поддерживаемые алгоритмы сжатия LTO: zlib zstd
gcc версии 12.2.0 (GCC)
lengjing@lengjing:~/data/cbuild$ ls output/mirror-cache/build-cache/
x86_64--cortex-a53-toolchain-gcc12.2.0-linux5.15-native--8ec20b3593ccaf0a87712ade12d00de6.tar.gz
```* После очистки всех загруженных пакетов, подсчитывает время компиляции каждого пакета с выбором следующих пакетов:
* busybox: Конфигурируется с помощью menuconfig
* cjson: Компилируется с помощью CMake
* libpcap: Компилируется с помощью Autotools
* ljson: Компилируется с помощью пользовательского Makefile
* lua: Компилируется с применённым патчем
* ncurses: Компилируется с зависимостью от пакета native-compilation
* tcpdump: Компилируется с зависимостью от libpcap
```sh
lengjing@lengjing:~/data/cbuild$ rm -rf output/cortex-a53 output/mirror-cache/downloads
. . .
lengjing@lengjing:~/data/cbuild$ make test_config
. . .
lengjing@lengjing:~/data/cbuild$ make time_statistics
Generate /home/lengjing/data/cbuild/output/cortex-a53/config/Kconfig OK.
Generate /home/lengjing/data/cbuild/output/cortex-a53/config/auto.mk OK.
Generate /home/lengjing/data/cbuild/output/cortex-a53/config/DEPS OK. curl http://www.busybox.net/downloads/busybox-1.35.0.tar.bz2 to /home/lengjing/data/cbuild/output/mirror-cache/downloads/busybox-1.35.0.tar.bz2
untar /home/lengjing/data/cbuild/output/mirror-cache/downloads/busybox-1.35.0.tar.bz2 to /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/busybox
/home/lengjing/data/cbuild/output/cortex-a53/objects/oss/busybox/busybox-1.35.0/applets/usage.c: In function 'main':
/home/lengjing/data/cbuild/output/cortex-a53/objects/oss/busybox/busybox-1.35.0/applets/usage.c:52:3: warning: ignoring return value of 'write', declared with attribute warn_unused_result [-Wunused-result]
. . .
Push busybox Cache to /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
Build busybox Done.
Install busybox Done.
curl http://github.com/DaveGamble/cJSON/archive/refs/tags/v1.7.15.tar.gz to /home/lengjing/data/cbuild/output/mirror-cache/downloads/cJSON-1.7.15.tar.gz
untar /home/lengjing/data/cbuild/output/mirror-cache/downloads/cJSON-1.7.15.tar.gz to /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/cjson
Push cjson Cache to /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
Build cjson Done.
Install cjson Done.
curl http://www.tcpdump.org/release/libpcap-1.10.1.tar.gz to /home/lengjing/data/cbuild/output/mirror-cache/downloads/libpcap-1.10.1.tar.gz
untar /home/lengjing/data/cbuild/output/mirror-cache/downloads/libpcap-1.10.1.tar.gz to /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/libpcap
Push libpcap Cache to /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
Build libpcap Done.
Install libpcap Done.
git clone https://github.com/lengjingzju/json.git to /home/lengjing/data/cbuild/output/mirror-cache/downloads/ljson
Cloning into '/home/lengjing/data/cbuild/output/mirror-cache/downloads/ljson'. . .
remote: Enumerating objects: 39, done.
remote: Counting objects: 100% (2/2), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 39 (delta 1), reused 0 (delta 0), pack reused 37
Receiving objects: 100% (39/39), done. копирование /home/lengjing/data/cbuild/output/mirror-cache/downloads/ljson в /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/ljson
Перенос кэша ljson в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
Сборка ljson завершена.
Установка ljson завершена.
curl http://www.lua.org/ftp/lua-5.4.4.tar.gz в /home/lengjing/data/cbuild/output/mirror-cache/downloads/lua-5.4.4.tar.gz
распаковка /home/lengjing/data/cbuild/output/mirror-cache/downloads/lua-5.4.4.tar.gz в /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/lua
исправление файла Makefile
исправление файла src/Makefile
Применение патча /home/lengjing/data/cbuild/oss/lua/patch/0001-lua-Support-dynamic-library-compilation.patch к /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/lua/lua-5.4.4 завершено.
исправление файла src/lparser.c
Применение патча /home/lengjing/data/cbuild/oss/lua/patch/CVE-2022-28805.patch к /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/lua/lua-5.4.4 завершено.
Перенос кэша lua в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
Сборка lua завершена.
Установка lua завершена.
Установка lua завершена.
распаковка /home/lengjing/data/cbuild/output/mirror-cache/downloads/ncurses-6.3.tar.gz в /home/lengjing/data/cbuild/output/x86_64-native/objects/oss/ncurses
configure: ВНИМАНИЕ: Это определение применимо только к библиотеке многобайтовых символов
. . .
Перенос кэша ncurses-native в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
Сборка ncurses-native завершена.
Установка ncurses-native завершена.
Установка ncurses-native завершена.
распаковка /home/lengjing/data/cbuild/output/mirror-cache/downloads/ncurses-6.3.tar.gz в /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/ncurses
configure: ВНИМАНИЕ: Если вы хотели установить тип --build, не используйте --host.
. . . Перенос кэша ncurses в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
Сборка ncurses завершена.
Установка ncurses завершена.
Установка libpcap завершена.
curl http://www.tcpdump.org/release/tcpdump-4.99.1.tar.gz в /home/lengjing/data/cbuild/output/mirror-cache/downloads/tcpdump-4.99.1.tar.gz
распаковать /home/lengjing/data/cbuild/output/mirror-cache/downloads/tcpdump-4.99.1.tar.gz в /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/tcpdump
конфигурация: ВНИМАНИЕ: использование кросс-инструментов, не префиксированных хост-триплетом
конфигурация: ВНИМАНИЕ: pcap/pcap-inttypes.h: принят компилятором, отклонен препроцессором!
конфигурация: ВНИМАНИЕ: pcap/pcap-inttypes.h: продолжение работы с результатом компилятора
Отправить кэш tcpdump в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
Сборка tcpdump завершена.
Установка tcpdump завершена.
Сборка rootfs завершена.
Установка пакетов из /home/lengjing/data/cbuild/output/cortex-a53/sysroot
Установка busybox завершена.
Установка Glibc цели из /home/lengjing/data/cbuild/output/toolchain/cortex-a53-toolchain-gcc12.2.0-linux5.15/aarch64-linux-gnu/libc
Сборка завершена!
lengjing@lengjing:~/data/cbuild$ cat output/cortex-a53/config/time_statistics
real user sys package
0.04 0.04 0.00 deps
0.04 0.04 0.01 busybox
23.77 77.62 16.90 busybox
0.01 0.00 0.00 busybox
0.06 0.05 0.01 cjson
4.92 1.71 0.47 cjson
0.00 0.00 0.00 cjson
0.05 0.04 0.01 libpcap
14.59 8.47 1.15 libpcap
0.01 0.00 0.00 libpcap
0.05 0.05 0.00 ljson
4.23 1.16 0.09 ljson
0.00 0.00 0.00 ljson
0.06 0.05 0.00 lua
7.93 6.59 0.41 lua
0.00 0.00 0.00 lua
0.06 0.05 0.01 ncurses-native
30.24 65.82 12.07 ncurses-native
0.08 0.01 0.06 ncurses-native
0.08 0.00 0.07 ncurses-native_install
0.17 0.08 0.09 ncurses
31.85 107.68 18.63 ncurses
0.08 0.01 0.06 ncurses
0.01 0.00 0.00 libpcap_install
0.07 0.06 0.01 tcpdump
13.14 10.84 3.02 tcpdump
0.01 0.00 0.00 tcpdump
0.00 0.00 0.00 rootfs
1.17 0.53 0.44 rootfs
132.74 281.01 53.54 total_time
```* Перекомпиляции, результат получен напрямую из локального кеша, без перекомпиляции из исходного кода
```sh
lengjing@lengjing:~/data/cbuild$ make -C scripts/toolchain
make: Entering directory '/home/lengjing/data/cbuild/scripts/toolchain'
Используется cortex-a53-toolchain-gcc12.2.0-linux5.15. Кэш в '/home/lengjing/data/cbuild/output/mirror-cache/build-cache'.
Сборка cortex-a53-toolchain-gcc12.2.0-linux5.15 завершена.
make: Leaving directory '/home/lengjing/data/cbuild/scripts/toolchain'
lengjing@lengjing:~/data/cbuild$ make time_statistics
Генерация '/home/lengjing/data/cbuild/output/cortex-a53/config/Kconfig' завершена успешно.
Генерация '/home/lengjing/data/cbuild/output/cortex-a53/config/auto.mk' завершена успешно.
Генерация '/home/lengjing/data/cbuild/output/cortex-a53/config/DEPS' завершена успешно.
Используется кэш busybox в '/home/lengjing/data/cbuild/output/mirror-cache/build-cache'.
Сборка busybox завершена.
Установка busybox завершена.
Используется кэш cjson в '/home/lengjing/data/cbuild/output/mirror-cache/build-cache'.
Сборка cjson завершена.
Установка cjson завершена.
Используется кэш libpcap в '/home/lengjing/data/cbuild/output/mirror-cache/build-cache'.
Сборка libpcap завершена.
Установка libpcap завершена.
Используется кэш ljson в '/home/lengjing/data/cbuild/output/mirror-cache/build-cache'.
Сборка ljson завершена.
Установка ljson завершена.
Используется кэш lua в '/home/lengjing/data/cbuild/output/mirror-cache/build-cache'.
Сборка lua завершена.
Установка lua завершена.
Используется кэш ncurses-native в '/home/lengjing/data/cbuild/output/mirror-cache/build-cache'.
Сборка ncurses-native завершена.
Установка ncurses-native завершена.
Используется кэш ncurses в '/home/lengjing/data/cbuild/output/mirror-cache/build-cache'.
Сборка ncurses завершена.
``` Установка ncurses завершена.
Используется кэш tcpdump в '/home/lengjing/data/cbuild/output/mirror-cache/build-cache'.
Сборка tcpdump завершена.
Установка tcpdump завершена.
Сборка rootfs завершена.
Установка пакетов из '/home/lengjing/data/cbuild/output/cortex-a53/sysroot'
Установка busybox завершена.
Установка Glibc из '/home/lengjing/data/cbuild/output/toolchain/cortex-a53-toolchain-gcc12.2.0-linux5.15/aarch64-linux-gnu/libc'
Сборка завершена!
lengjing@lengjing:~/data/cbuild$
lengjing@lengjing:~/data/cbuild$ cat output/cortex-a53/config/time_statistics
real user sys package
0.04 0.03 0.00 deps
0.04 0.04 0.00 busybox
0.09 0.08 0.02 busybox
0.01 0.00 0.00 busybox
0.05 0.05 0.00 cjson
0.08 0.07 0.01 cjson
0.00 0.00 0.00 cjson
0.04 0.04 0.0001 libpcap
0.08 0.07 0.01 libpcap
0.03 0.00 0.01 libpcap
0.04 0.04 0.00 ljson
0.08 0.07 0.01 ljson
0.00 0.00 0.00 ljson
0.05 0.05 0.00 lua
0.08 0.08 0.01 lua
0.00 0.00 0.00 lua
0.05 0.04 0.01 ncurses-native
0.08 0.08 0.01 ncurses-native
0.28 0.01 0.19 ncurses-native
0.06 0.05 0.01 ncurses
0.09 0.09 0.01 ncurses
0.25 0.01 0.18 ncurses
0.05 0.04 0.01 tcpdump
0.09 0.08 0.01 tcpdump
0.00 0.00 0.00 tcpdump
0.03 0.00 0.02 rootfs
1.14 0.53 0.44 rootfs
2.96 1.66 1.09 total_time
```* Создает еще одно терминальное окно и запускает сервер-зеркало ```sh
lengjing@lengjing:~/data/cbuild$ cd output
lengjing@lengjing:~/data/cbuild/output$ mv mirror-cache mirror
lengjing@lengjing:~/data/cbuild/output$ cd mirror
lengjing@lengjing:~/data/cbuild/output/mirror$ rm -rf downloads/lock
lengjing@lengjing:~/data/cbuild/output/mirror$ tree
.
├── build-cache
│ ├── cortex-a53--busybox--b7c40d7a733221bbd8327e487cfee505.tar.gz
│ ├── cortex-a53--cjson--8167d8f3fd82197b44bb7498b4d97bb0.tar.gz
│ ├── cortex-a53--libpcap--5db3b7c187d08870a29ee48f725e96bc.tar.gz
│ ├── cortex-a53--ljson--1cb819ebcb847f1feff24879246c30d5.tar.gz
│ ├── cortex-a53--lua--370ffcee1a70bc93516df21de9de0634.tar.gz
│ ├── cortex-a53--ncurses--96424c436be9e0bc02bcdaea10083a8f.tar.gz
│ ├── cortex-a53--tcpdump--5652e8bf037a2ee5792fcbf02adee2b7.tar.gz
│ ├── x86_64--cortex-a53-toolchain-gcc12.2.0-linux5.15-native--8ec20b3593ccaf0a87712ade12d00de6.tar.gz
│ └── x86_64--ncurses-native--54a6ab0af25ad68f24bff08355b59efb.tar.gz
└── downloads
├── busybox-1.35.0.tar.bz2
├── busybox-1.35.0.tar.bz2.src.hash
├── cJSON-1.7.15.tar.gz
├── cJSON-1.7.15.tar.gz.src.hash
├── libpcap-1.10.1.tar.gz
├── libpcap-1.10.1.tar.gz.src.hash
├── ljson
│ ├── json.c
│ ├── json.h
│ ├── json_test.c
│ ├── json_test.png
│ ├── LICENSE
│ └── README.md
├── ljson-git-br.-rev.7b2f6ae6cf7011e94682b073669f5ff8f69095cc.tar.gz
├── ljson.src.hash
├── lua-5.4.4.tar.gz
├── lua-5.4.4.tar.gz.src.hash
├── ncurses-6.3.tar.gz
├── ncurses-6.3.tar.gz.src.hash
├── tcpdump-4.99.1.tar.gz
└── tcpdump-4.99.1.tar.gz.src.hash
3 директории, 29 файлов
lengjing@lengjing:~/data/cbuild/output/mirror$ python3 -m http.server 8888
Serving HTTP on 0.0.0.0 port 8888 (http://0.0.0.0:8888/) ...
```* Оригинальное терминальное окно удаляет все выходные данные компиляции и кэш, заново компилирует, результат берется напрямую из кэша сервера-зеркала, без заново компиляции из исходного кода
```sh
lengjing@lengjing:~/data/cbuild$ rm -rf output/cortex-a53 output/mirror-cache output/toolchain
lengjing@lengjing:~/data/cbuild$ make test_config
. . .
lengjing@lengjing:~/data/cbuild$ make -C scripts/toolchain
make: Entering directory '/home/lengjing/data/cbuild/scripts/toolchain'
curl http://127.0.0.1:8888/build-cache/x86_64--cortex-a53-toolchain-gcc12.2.0-linux5.15-native--8ec20b3593ccaf0a87712ade12d00de6.tar.gz to /home/lengjing/data/cbuild/output/mirror-cache/build-cache/x86_64--cortex-a53-toolchain-gcc12.2.0-linux5.15-native--8ec20b3593ccaf0a87712ade12d00de6.tar.gz
Используется кэш cortex-a53-toolchain-gcc12.2.0-linux5.15 в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
Сборка cortex-a53-toolchain-gcc12.2.0-linux5.15 завершена.
make: Leaving directory '/home/lengjing/data/cbuild/scripts/toolchain'
lengjing@lengjing:~/data/cbuild$ make time_statistics
Генерация /home/lengjing/data/cbuild/output/cortex-a53/config/Kconfig завершена успешно.
Генерация /home/lengjing/data/cbuild/output/cortex-a53/config/auto.mk завершена успешно.
Генерация /home/lengjing/data/cbuild/output/cortex-a53/config/DEPS завершена успешно.
curl http://127.0.0.1:8888/build-cache/cortex-a53--busybox--b7c40d7a733221bbd8327e487cfee505.tar.gz to /home/lengjing/data/cbuild/output/mirror-cache/build-cache/cortex-a53--busybox--b7c40d7a733221bbd8327e487cfee505.tar.gz
Используется кэш busybox в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
Сборка busybox завершена.
Установка busybox завершена.
curl http://127.0.0.1:8888/build-cache/cortex-a53--cjson--8167d8f3fd82197b44bb7498b4d97bb0.tar.gz to /home/lengjing/data/cbuild/output/mirror-cache/build-cache/cortex-a53--cjson--8167d8f3fd82197b44bb7498b4d97bb0.tar.gz
Используется кэш cjson в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
``` Сборка cjson завершена.
Установка cjson завершена.
curl http://127.0.0.1:8888/build-cache/cortex-a53--libpcap--5db3b7c187d08870a29ee48f725e96bc.tar.gz в /home/lengjing/data/cbuild/output/mirror-cache/build-cache/cortex-a53--libpcap--5db3b7c187d08870a29ee48f725e96bc.tar.gz
Используется кэш libpcap в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
Сборка libpcap завершена.
Установка libpcap завершена.
curl http://127.0.0.1:8888/build-cache/cortex-a53--ljson--1cb819ebcb847f1feff24879246c30d5.tar.gz в /home/lengjing/data/cbuild/output/mirror-cache/build-cache/cortex-a53--ljson--1cb819ebcb847f1feff24879246c30d5.tar.gz
Используется кэш ljson в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
Сборка ljson завершена.
Установка ljson завершена.
curl http://127.0.0.1:8888/build-cache/cortex-a53--lua--370ffcee1a70bc93516df21de9de0634.tar.gz в /home/lengjing/data/cbuild/output/mirror-cache/build-cache/cortex-a53--lua--370ffcee1a70bc93516df21de9de0634.tar.gz
Используется кэш lua в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
Сборка lua завершена.
Установка lua завершена.
curl http://127.0.0.1:8888/build-cache/x86_64--ncurses-native--54a6ab0af25ad68f24bff08355b59efb.tar.gz в /home/lengjing/data/cbuild/output/mirror-cache/build-cache/x86_64--ncurses-native--54a6ab0af25ad68f24bff08355b59efb.tar.gz
Используется кэш ncurses-native в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
Сборка ncurses-native завершена.
Установка ncurses-native завершена.
curl http://127.0.0.1:8888/build-cache/cortex-a53--ncurses--96424c436be9e0bc02bcdaea10083a8f.tar.gz в /home/lengjing/data/cbuild/output/mirror-cache/build-cache/cortex-a53--ncurses--96424c436be9e0bc02bcdaea10083a8f.tar.gz
Используется кэш ncurses в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
Сборка ncurses завершена.
Установка ncurses завершена.
curl http://127.0.0.1:8888/build-cache/tcpdump--5652e8bf037a2ee5792fcbf02adee2b7.tar.```markdown
gz в /home/lengjing/data/cbuild/output/mirror-cache/build-cache/tcpdump--5652e8bf037a2ee5792fcbf02adee2b7.tar.gz
Используйте кэш tcpdump в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
Сборка tcpdump завершена.
Установка tcpdump завершена.
Сборка rootfs завершена.
Установка пакетов из /home/lengjing/data/cbuild/output/cortex-a53/sysroot
Установка busybox завершена.
Установка Glibc целевой системы из /home/lengjing/data/cbuild/output/toolchain/cortex-a53-toolchain-gcc12.2.0-linux5.15/aarch64-linux-gnu/libc
Сборка завершена!
```markdown
lengjing@lengjing:~/data/cbuild$ cat output/cortex-a53/config/time_statistics
real user sys package
0.04 0.03 0.00 deps
0.06 0.05 0.01 busybox
0.12 0.10 0.02 busybox
0.01 0.00 0.00 busybox
0.07 0.06 0.00 cjson
0.08 0.07 0.02 cjson
0.00 0.00 0.00 cjson
0.07 0.06 0.01 libpcap
0.12 0.09 0.03 libpcap
0.01 0.00 0.00 libpcap
0.06 0.05 0.01 ljson
0.11 0.09 0.04 ljson
0.00 0.00 0.00 ljson
0.07 0.06 0.00 lua
0.10 0.10 0.01 lua
0.01 0.01 0.00 lua
0.08 0.05 0.03 ncurses-native
0.21 0.15 0.10 ncurses-native
0.08 0.01 0.07 ncurses-native
0.09 0.08 0.01 ncurses
0.21 0.17 0.07 ncurses
0.09 0.01 0.07 ncurses
0.08 0.06 0.02 tcpdump
0.11 0.11 0.01 tcpdump
0.00 0.00 0.00 tcpdump
0.00 0.00 0.00 rootfs
1.00 0.54 0.45 rootfs
3.00 2.07 1.10 total_time
```sh
lengjing@lengjing:~/data/cbuild$ make lua_setforce
Установлен флаг принудительной компиляции lua.
lengjing@lengjing:~/data/cbuild$ make lua
ПРЕДУПРЕЖДЕНИЕ: Принудительная компиляция lua.
curl http://127.0.0.1:8888/downloads/lua-5.4.4.tar.gz to /home/lengjing/data/cbuild/output/mirror-cache/downloads/lua-5.4.4.tar.gz
untar /home/lengjing/data/cbuild/output/mirror-cache/downloads/lua-5.4.4.tar.gz to /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/lua
patching file Makefile
patching file src/Makefile
Patch /home/lengjing/data/cbuild/oss/lua/patch/0001-lua-Support-dynamic-library-compilation.patch to /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/lua/lua-5.4.4 Done.
patching file src/lparser.c
Patch /home/lengjing/data/cbuild/oss/lua/patch/CVE-2022-28805.patch to /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/lua/lua-5.4.4 Done.
Push lua Cache to /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
Build lua Done.
Install lua Done.
lengjing@lengjing:~/data/cbuild$ make lua
ПРЕДУПРЕЖДЕНИЕ: Принудительная компиляция lua.
Push lua Cache to /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
Build lua Done.
Install lua Done.
```* Удаляет флаг принудительной компиляции, результат берётся напрямую из кэша зеркального сервера, без повторной компиляции из исходного кода
``````sh
lengjing@lengjing:~/data/cbuild$ make lua_unsetforce
Отмена lua Force Build.
lengjing@lengjing:~/data/cbuild$ make lua
curl http://127.0.0.1:8888/build-cache/cortex-a53--lua--370ffcee1a70bc93516df21de9de0634.tar.gz to /home/lengjing/data/cbuild/output/mirror-cache/build-cache/cortex-a53--lua--370ffcee1a70bc93516df21de9de0634.tar.gz
Использование lua кеша в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
Сборка lua завершена.
Установка lua завершена.
lengjing@lengjing:~/data/cbuild$ make lua
Использование lua кеша в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
Сборка lua завершена.
Установка lua завершена.
```* Модифицирует файл для проверки, собирает из исходного кода
```sh
lengjing@lengjing:~/data/cbuild$ echo >> oss/ljson/patch/Makefile
lengjing@lengjing:~/data/cbuild$ make ljson
curl http://127.0.0.1:8888/downloads/ljson-git-br.-rev.7b2f6ae6cf7011e94682b073669f5ff8f69095cc.tar.gz to /home/lengjing/data/cbuild/output/mirror-cache/downloads/ljson-git-br.-rev.7b2f6ae6cf7011e94682b073669f5ff8f69095cc.tar.gz
копирование /home/lengjing/data/cbuild/output/mirror-cache/downloads/ljson to /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/ljson
Загрузка кеша ljson в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
Сборка ljson завершена.
Установка ljson завершена.
lengjing@lengjing:~/data/cbuild$ make ljson
Использование кеша ljson в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
Сборка ljson завершена.
Установка ljson завершена.
```
* Модифицирует конфигурацию, устанавливает флаг force compilation и всегда собирает из исходного кода
```sh
lengjing@lengjing:~/data/cbuild$ make busybox_menuconfig
curl http://127.0.0.1:8888/downloads/busybox-1.35.0.tar.bz2 to /home/lengjing/data/cbuild/output/mirror-cache/downloads/busybox-1.35.0.tar.bz2
разархивация /home/lengjing/data/cbuild/output/mirror-cache/downloads/busybox-1.35.0.tar.bz2 to /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/busybox
GEN /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/busybox/build/Makefile
#
# используемые значения по умолчанию из .config
# *** Конец конфигурации.
*** Выполните 'make' для сборки проекта или попробуйте 'make help'.
```Установите сборку busybox принудительно.
lengjing@lengjing:~/data/cbuild$ make busybox
ПРЕДУПРЕЖДЕНИЕ: принудительная сборка busybox.
/home/lengjing/data/cbuild/output/cortex-a53/objects/oss/busybox/busybox-1.35.0/applets/usage.c: В функции 'main':
/home/lengjing/data/cbuild/output/cortex-a53/objects/oss/busybox/busybox-1.35.0/applets/usage.c:52:3: предупреждение: игнорирование значения, возвращаемого 'write', объявленного с атрибутом warn_unused_result [-Wunused-result]
...
Переместить кэш busybox в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
Сборка busybox завершена.
Установка busybox завершена.
```lengjing@lengjing:~/data/cbuild$ make busybox
ПРЕДУПРЕЖДЕНИЕ: принудительная сборка busybox.
Переместить кэш busybox в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
Сборка busybox завершена.
Установка busybox завершена.
```* Восстанавливает исходную конфигурацию, удаляет флаг принудительной компиляции, результат берётся напрямую из кэша сервера-зеркала, без повторной компиляции из исходного кода ```sh
lengjing@lengjing:~/data/cbuild$ make busybox_defconfig
GEN /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/busybox/build/Makefile
*
* Конфигурация Busybox
*
*
* Настройки
*
...
Принудительная компиляция busybox отключена.
lengjing@lengjing:~/data/cbuild$ make busybox
curl http://127.0.0.1:8888/build-cache/cortex-a53--busybox--b7c40d7a733221bbd8327e487cfee505.tar.gz to /home/lengjing/data/cbuild/output/mirror-cache/build-cache/cortex-a53--busybox--b7c40d7a733221bbd8327e487cfee505.tar.gz
Используется кэш busybox в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
Компиляция busybox завершена.
Установка busybox завершена.
lengjing@lengjing:~/data/cbuild$ make busybox
Используется кэш busybox в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
Компиляция busybox завершена.
Установка busybox завершена.
```
* Модифицирует файл для проверки зависимости, пакета зависимости и компиляции пакета из исходного кода ```sh
lengjing@lengjing:~/data/cbuild$ echo >> oss/libpcap/mk.deps
lengjing@lengjing:~/data/cbuild$ make tcpdump
curl http://127.0.0.1:8888/downloads/libpcap-1.10.1.tar.gz to /home/lengjing/data/cbuild/output/mirror-cache/downloads/libpcap-1.10.1.tar.gz
untar /home/lengjing/data/cbuild/output/mirror-cache/downloads/libpcap-1.10.1.tar.gz to /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/libpcap
Кэш libpcap загружен в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
Компиляция libpcap завершена.
Установка libpcap завершена.
Установка libpcap завершена.
curl http://127.0.0.1:8888/downloads/tcpdump-4.99.1.tar.gz to /home/lengjing/data/cbuild/output/mirror-cache/downloads/tcpdump-4.99.1.tar.gz
untar /home/lengjing/data/cbuild/output/mirror-cache/downloads/tcpdump-4.99.1.tar.gz to /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/tcpdump
configure: WARNING: using cross tools not prefixed with host triplet
configure: WARNING: pcap/pcap-inttypes.h: accepted by the compiler, rejected by the preprocessor!
configure: WARNING: pcap/pcap-inttypes.h: proceeding with the compiler's result
Кэш tcpdump загружен в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
Компиляция tcpdump завершена.
Установка tcpdump завершена.
```## Контакты* Телефон: +86 18368887550
* wx/qq: 1083936981
* Электронная почта: lengjingzju@163.com 3090101217@zju.edu.cn
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )