Разработка новых функций в CBuild приостановлена, рекомендуется обновиться до Cbuild-ng, Cbuild-ng и CBuild не полностью совместимы.
Система компиляции CBuild представляет собой более мощную и гибкую альтернативу Buildroot и более быструю и компактную альтернативу Yocto. Она не имеет крутой обучения кривой и не определяет новых языков, что делает её более понятной и удобной для использования по сравнению с Buildroot и Yocto.
Система компиляции CBuild состоит из трёх основных частей: инструментов анализа задач, шаблонов компиляции Makefile и инструментов сетевого и кэшированного обработки.
* Инструменты анализа задач: анализ всех задач и автоматическое создание общего конфигурационного файла Kconfig и файла скриптов Makefile
* Все задачи анализируются и собираются Python-скриптом gen_build_chain.py
* Автоматически собираются правила и параметры всех задач, через make menuconfig
выбираются задачи для выполнения и настраиваются параметры
* Каждая задача определяется зависимостью, поддерживаются многочисленные правила зависимостей
* Поддерживается автоматическое создание реальных и виртуальных пакетов для выполнения и управления задачами
* Поддерживается автоматическое создание структур конфигурации (config), меню для конфигурации (menuconfig) и структуры выбора (choice)
* Поддерживается автоматическое создание сильных зависимостей (depends on), слабых зависимостей (if...endif), сильных выборов (select), слабых выборов (imply) и правил "или" (||)
* Задачи представляют собой скрипты Makefile, которые выполняются с помощью make, Makefile поддерживают упаковку оригинальных скриптов Makefile
, CMake
, Autotools
, Meson
* Поддерживается создание изображений зависимостей задач и просмотр задач с помощью цветов и других атрибутов gen_depends_image.sh
* Шаблон Makefile: шаблон для компиляции драйверов, библиотек и приложений, требует заполнения только нескольких переменных для создания Makefile для крупного проекта * Поддерживает сборку последней кросс-компиляторной инструментальной цепочки process_machine.sh
toolchain/Makefile
* Один Makefile поддерживает как локальную, так и кросс-компиляцию inc.env.mk
* Один Makefile поддерживает создание нескольких библиотек, исполняемых файлов или драйверов
* Один Makefile поддерживает режимы компиляции Normal Build (разделение исходного кода и выходных данных и их объединение) и Yocto Build
* Поддерживает автоматический анализ заголовочных файлов как зависимостей компиляции, поддерживает отдельное указание CFLAGS для каждого исходного файла
* Предоставляет шаблоны для компиляции статических библиотек, динамических библиотек и исполняемых файлов inc.app.mk
, поддерживает смешанную компиляцию на C(*.c
), C++(*.cc *.cp *.cxx *.cpp *.CPP *.c++ *.C
) и ассемблере(*.S *.s *.asm
)
* Предоставляет шаблоны для компиляции драйверов inc.mod.mk
, поддерживает смешанную компиляцию на C(*.c
) и ассемблере(*.S
)
* Предоставляет шаблоны для установки в соответствии со стандартом GNUInstallDirs inc.ins.mk
* Предоставляет шаблоны для параметров конфигурации Kconfig inc.conf.mk
* Инструменты для работы с сетью и кэшированием: обработка загрузки сетевых пакетов, применения патчей, компиляции и установки, поддержка зеркальных копий исходного кода и кэширования.
* Предоставляет надежную систему применения патчей exec_patch.sh
* Предоставляет автоматическую систему загрузки сетевых пакетов, поддерживающую загрузку с http (с поддержкой md5), git (с поддержкой веток, тегов и ревизий) или svn (с поддержкой ревизий), поддерживает зеркальную загрузку fetch_package.sh
* Предоставляет инструменты кэширования компиляций, позволяющие повторно компилировать без перекомпиляции исходного кода, а вместо этого загружать из локального кэша или сетевого кэша process_cache.sh
* Предоставляет удобные шаблоны кэширования компиляций inc.cache.mk
* Предоставляет обширный слой открытых исходных кодов OSS, который постоянно пополняется новыми пакетами
В этом проекте уже было сделано 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-заявления всех пакетов и автоматически генерирует сборочную цепочку для всех пакетов, каждый пакет собирается отдельно
* Поддерживает управление Kconfig самостоятельно или через хостинг, хостинг Kconfig должен быть размещен в той же директории, что и DEPS-заявление, без необходимости указания родительских и дочерних включений, а только автоматического анализа и сборки скриптом
Сборка Yocto состоит из:
make menuconfig
(добавление пакетов, удаление пакетов, изменение конфигураций и т. д.)### Параметры команды gen_build_chain.pyОписание команды
conf/local.conf
conf/bblayers.conf
и рецептов слоев# Обычная сборка
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]
```* Опции команды Normal Build
* `-m <Путь к файлу Makefile>`: Указывает путь к автоматически сгенерированному файлу Makefile.
* Можно использовать верхнеуровневый файл Makefile для включения автоматически сгенерированного файла Makefile. Цель all вызывает `make $(ENV_BUILD_JOBS) $(ENV_MAKE_FLAGS) MAKEFLAGS= all_targets` для многопоточной компиляции всех пакетов.
* Если для какого-либо пакета требуется включить многопоточную компиляцию, необходимо указать `jobserver` в других целях этого пакета, см. описание ниже.
* Можно подсчитать время компиляции каждого пакета с помощью `make time_statistics`.
* `-k <Путь к файлу Kconfig>`: Указывает путь к автоматически сгенерированному файлу Kconfig.
* `-t <Путь к файлу с именами пакетов и путями к исходным файлам>`: Указывает путь к автоматически сгенерированному файлу, содержащему имена пакетов и пути к исходным файлам.
* `-a <Путь к файлу с именами пакетов и списками зависимостей>`: Указывает путь к автоматически сгенерированному файлу, содержащему имена пакетов и списки зависимостей.
* `-d <Имя файла зависимостей для поиска>`: Указывает имя файла зависимостей (содержащего правила зависимостей). В файле зависимостей могут быть указаны несколько зависимостей.
* `-c <Имя файла Kconfig для поиска>`: Указывает имя файла Kconfig (содержащего конфигурационные данные). * Поиск конфигурационного файла в той же директории, что и файл зависимостей, приоритетное поиска файла с тем же именем, но с суффиксом, соответствующим имени пакета, если файл не найден, то ищется указанный конфигурационный файл.
* `-v <Имя файла виртуальных зависимостей для поиска>`: Указывает имя файла виртуальных зависимостей (содержащего правила виртуальных зависимостей).
* `-s <Пути к директориям для поиска>`: Указывает пути к директориям для поиска, несколько директорий разделяются двоеточием.
* `-i <Игнорируемые директории>`: Указывает директории, которые будут игнорироваться при поиске, несколько директорий разделяются двоеточием.
* `-g <Директории для продолжения поиска>`: Указывает директории для продолжения поиска, несколько директорий разделяются двоеточием.
* Если в текущей директории найден файл `<Имя файла зависимостей для поиска>`, и директория не указана в `<Директории для продолжения поиска>` или текущая директория не входит в указанные директории, поиск не продолжается в поддиректориях текущей директории.
* `-l <Максимальная глубина меню>`: Устанавливает максимальную глубину меню menuconfig, 0 означает плоское меню, 1 означает двухуровневое меню, и т. д. * `-w <Игнорируемые уровни меню>`: Устанавливает имена уровней меню, которые будут игнорироваться, если директория в пути соответствует указанному значению, глубина этого пути уменьшается на 1, несколько директорий разделяются двоеточием.
* `-p <Предварительный флаг>`: Устанавливает предварительный флаг для конфигурационных параметров в сгенерированном файле Kconfig. Если пользователь запускает `conf/mconf` с параметром `CONFIG_=""`, то при запуске этого скрипта необходимо установить этот флаг в 1.
* `-u <Уникальные пакеты>`: Указывает уникальные пакеты (то есть, когда этот пакет является зависимостью для native пакета, форма пакета остается без native). Обычно это пакеты, не зависящие от архитектуры, имена нескольких пакетов разделены двоеточием.
* Параметры команды Yocto Build Step1
* `-k <Путь к файлу Kconfig>`: Указывает путь к автоматически сгенерированному файлу Kconfig.
* `-t <Путь к целевому файлу>`: Указывает путь к файлу, который содержит список пакетов и путей исходного кода.
* `-c <Имя конфигурационного файла Kconfig>`: Указывает имя конфигурационного файла Kconfig для поиска (содержит конфигурационные данные).
* Сначала ищет файл `recipe.bbconfig` в текущей директории, если не найден, то ищет в директории, указанной переменной `EXTERNALSRC` в файле `bbappend`. Приоритет отдается файлам с одинаковым расширением, как у конфигурационного файла, и именем пакета. Если файл не найден, то ищет указанный конфигурационный файл. * `-v <Search Virtual Depend Name>`: Указывает имя файла с виртуальными зависимостями для поиска (содержит правила виртуальных зависимостей).
* `-i <Ignore Directories>`: Указывает директории, которые нужно игнорировать при поиске зависимостей. Несколько директорий разделяются двоеточием.
* `-l <Max Layer Depth>`: Устанавливает максимальную глубину меню menuconfig. 0 означает плоское меню, 1 означает двухуровневое меню и т. д.
* `-w <Keyword Directories>`: Устанавливает ключевые директории для игнорирования уровня меню menuconfig. Если путь содержит указанные директории, уровень уменьшается на 1. Ключевые директории разделяются двоеточием.
* `-p <Prepend Flag>`: Устанавливает флаг для добавления префикса в конфигурационные параметры Kconfig. Если пользователь установил `CONFIG_=""` при запуске conf/mconf, то при запуске этого скрипта флаг должен быть установлен в 1.
* `-u <User Metas>`: Указывает пользовательские метаданные. Несколько метаданных разделяются двоеточием. Только пакеты из пользовательских метаданных анализируются на зависимости, по умолчанию выбираются, управляются Kconfig и поддерживают специальные зависимости `EXTRADEPS` и виртуальные зависимости.<br>
Параметры команды Yocto Build Step2
-t <Target Path>
: Указывает путь к файлу, сгенерированному на шаге 1, который содержит список пакетов и путей исходного кода.-c <Search Kconfig Path>
: Указывает путь к конфигурационному файлу .config.-o <Output Recipe Path>
: Указывает путь к файлу, который содержит список пакетов rootfs.-p <Output patch/unpatch Path>
: Указывает путь к файлу, который содержит список пакетов для применения/отмены патчей; файл prepare-patch
включает этот файл.-i <Ignore Recipes>
: Указывает рецепты, которые нужно игнорировать; несколько рецептов разделяются двоеточием.Формат реальных зависимостей: #DEPS(Имя_makefile) Имя_цели(Другие_имена_целей): Имена_зависимостей
Формат включения подпапок: #INCDEPS: Имена_Подпапок
! Регулярное выражение для включения подпапок* Формат описания
* Makefile_Name: имя Makefile, который будет запущен командой make (может быть пустым). Если имя указано, make запустит указанный Makefile (make -f Makefile_Name
).
* В Makefile должны быть определены три цели: all, clean и install. По умолчанию в Makefile добавляются правила для целей all и install, а также для clean.
* Имя Makefile может содержать пути (символы /
), что позволяет искать подпапки в подкаталогах.
* Например, test1/
или test2/wrapper.mk
.
* Также можно использовать INCDEPS-заявление для поиска зависимых файлов в подкаталогах, поддерживается рекурсивный поиск.
* Например, #INCDEPS: test1 test2/test22
, что позволяет найти подпакеты через зависимые файлы в подкаталогах.
* Имена подкаталогов поддерживают замену переменными окружения, например, ${ENV_BUILD_SOC}
будет заменено значением переменной окружения ENV_BUILD_SOC.
* Target_Name: уникальное имя текущего пакета.
* Ключевое слово ignore
является специальным идентификатором, указывающим, что текущий пакет не является пакетом и используется для исключения текущего каталога из поиска. Обычно записывается как #DEPS() ignore():
.
* Other_Target_Names: другие цели текущего пакета, разделенные пробелами (может быть пустым).
* Цели all, install и clean в Other_Target_Names игнорируются. * Ключевое слово prepare
является специальной реальной целью, указывающей на выполнение make prepare
перед запуском make
. Обычно используется для загрузки по умолчанию в .config
, если .config
отсутствует.
* Ключевое слово psysroot
является специальной реальной целью, указывающей на использование sysroot
из OUT_PATH
вместо sysroot
из ENV_TOP_OUT
или sysroot-native
.
* Ключевое слово release
является специальной реальной целью, указывающей на выполнение make release
при установке в fakeroot rootfs
. Эта цель не требует установки заголовочных файлов и статических библиотек.
* Если цель release
отсутствует, при установке в fakeroot rootfs
выполняется make install
.
* Ключевое слово union
является специальной виртуальной целью, используемой для совместного использования одного Makefile
несколькими пакетами.
* В этом случае имена целей prepare
, all
, install
, clean
и release
изменяются на Target_Name-prepare
, Target_Name-all
, Target_Name-install
, Target_Name-clean
и Target_Name-release
.
* Ключевое слово native
является специальной виртуальной целью, указывающей на одновременное определение кросс-компилятора и локального компилятора для пакета.
* Ключевое слово cache
является специальной виртуальной целью, указывающей на поддержку механизма кэширования пакетом.
* Ключевое слово jobserver
является специальной виртуальной целью, указывающей на добавление $(ENV_BUILD_JOBS)
после выполнения make
.Пользователь должен экспортировать export ENV_BUILD_JOBS=-jn
, чтобы запустить многопоточное компилирование.
* Для некоторых пакетов, у которых в Makefile присутствуют команды make, не следует добавлять цель jobserver, например, при компиляции драйверов.
* subtarget1:subtarget2:. . . ::dep1:dep2:. . .
является специальным синтаксисом для явного указания зависимостей подцели
* Двойные двоеточия разделяют список подцелей и список зависимостей, между подцелями и зависимостями используются одинарные двоеточия, список зависимостей может быть пустым
* Depend_Names: Имена (ID) других пакетов, на которые зависит текущий пакет, несколько зависимостей разделены пробелами (может быть пустым)
* Depend_Names поддерживает многострочный формат, строка продолжается символом \
в конце строки
* В случае циклической зависимости или неопределенной зависимости, парсинг завершится неудачей, неудачные элементы будут выведены на экран
* При наличии циклической зависимости, выводится "ERROR: circular deps! "
Примечание: Идентификатор пакета (Target_Name Depend_Names) состоит только из строчных букв, цифр и дефисов; для Other_Target_Names такие ограничения не применяются, допускается использование %
в качестве шаблона.* Описание команды Normal Build
make имя_пакета
для компиляции зависимых пакетов (если они есть) и затем компиляции самого пакетаmake имя_пакета_single
для компиляции только самого пакета (только если есть зависимости)make имя_пакета_имя_цели
для компиляции зависимых пакетов (если они есть) и затем компиляции определенной цели пакета (имя цели должно быть определено в Other_Target_Names)make имя_пакета_имя_цели_single
для компиляции только определенной цели пакета (только если есть зависимости, и имя цели должно быть определено в Other_Target_Names)DEPENDS
: пакеты, необходимые для компиляции
имя_пакета-native
, например bash-native
RDEPENDS:${PN}
: пакеты, необходимые для выполнения
EXTRADEPS
: специальные зависимости для расширения CBuild
inherit weakdep
weakdep
анализирует файл .config
в директории ENV_CFG_ROOT и устанавливает DEPENDS
и RDEPENDS:${PN}
в зависимости от того, выбрана ли опцияPACKAGECONFIG
: динамическое определение зависимости от установки пакета xxx/usr/lib/pkgconfig/xxx.pc
### Правила виртуальных зависимостей для Normal/Yocto Build
Формат виртуальных зависимостей #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 : Обязательное поле для типа choice
, для других типов — необязательное.
/
(необязательное), указывающий на применение к указанному подкаталогу, а не к текущему каталогу.
config
и choice
путь может указывать на виртуальный путь, например /virtual
(где virtual
может быть любым словом), в этом случае виртуальный пакет будет отображаться в текущем каталоге (а не в верхнем).choice
список пакетов, разделенных пробелами, будет являться подпунктами выбора, где первый пакет будет выбран по умолчанию. * Для типа menuchoice
можно указать пакет, выбранный по умолчанию.Depend_Names : Необязательное поле, указывающее список зависимостей, используемый похожим образом, как и директива #DEPS
. Например, можно установить unselect
. Типы choice
и menuchoice
не поддерживают select
и imply
.
Depend_Names
поддерживает многострочные значения, где конец строки может быть продолжен символом \
. ### Особые зависимости* Виртуальные зависимости (виртуальные пакеты)*depname
: обозначает, что этот пакет является виртуальным пакетом depname; после удаления *
имя depname может содержать специальные символы, которые будут распознаны, например *&&depname
* Ключевые зависимостиfinally
: указывает, что этот пакет должен быть собран последним по отношению к другим пакетам, обычно используется для создания файловой системы и системного образа в конце процесса сборки, используется только в сильных зависимостях для Normal Buildunselect
: указывает, что этот пакет по умолчанию не собирается, то есть default n
, если этот флаг не указан, пакет собирается по умолчанию, то есть default y
nokconfig
: указывает, что этот пакет не содержит Kconfig конфигурации. Если в одной директории есть несколько пакетов, этот пакет не должен иметь флаг nokconfig
, а другие пакеты могут иметь конфигурацию, которую можно задать как имя пакета.расширение конфигурации, в противном случае нужно задать флаг nokconfig
kconfig
: указывает, что несколько пакетов используют одинаковую Kconfig конфигурацию, обычно это кросс-компиляция и локальная компиляция одного и того же программного обеспечения
! depname
: обозначает конфликт между пакетом и пакетом depname, то есть depends on ! depname
&depname
или &&depname
: обозначает слабую/сильную зависимость от пакета depname, то есть imply depname
/ select depname
&
) указывает, что при выборе данного пакета, пакет depname также будет автоматически выбран, но может быть отменен вручную * Двойной амперсанд (&&
) указывает, что при выборе данного пакета, пакет depname
также будет автоматически выбран, но не может быть отменен.? depname
или ? ? depname
: Обозначает слабую зависимость от пакета depname
, то есть if . . endif
.
depname
не выбран или не существует.?
) указывает на зависимость при компиляции (например, отсутствие динамической библиотеки).? ?
) указывает на зависимость при компиляции и выполнении (например, наличие динамической библиотеки).depa|depb
или depa||depb
: Обозначает слабую зависимость от пакетов depa
, depb
и т. д.
depx
для успешного выбора и компиляции зависимого пакета.|
) указывает на зависимость при компиляции.||
) указывает на зависимость при компиляции и выполнении.|
или ||
будет неявно заменено на предварительно скомпилированный пакет или исходный код пакета, например, ||libtest
будет неявно заменено на prebuild-libtest||libtest
.& ?
: &
может использоваться вместе с ?
, порядок не важен, указывает на выбор и слабую зависимость.
&&? ? depname
или ? ?
.&&depnameуказывают на сильную зависимость и слабую зависимость,
? ? &depnameили
&? ? depname` указывают на слабую зависимость и слабую зависимость& |
: &
может использоваться вместе с |
, указывает на выбор одного из пакетов и слабую зависимость всех остальных пакетов
|
или ||
будет неявно заменено на триплет *build-имя пакета prebuild-имя пакета имя пакета
&&||libtest
будет неявно заменено на &&*build-libtest||prebuild-libtest||libtest
&&*build-libtest||prebuild-libtest||libtest
указывает на сильную зависимость от первого существующего пакета из трех и слабую зависимость от двух остальных пакетовdepname@условие
или depname@@условие
: условие должно быть y
, и только тогда пакет будет зависеть от пакета depname, используется только в обычном сборке?
? ?
не имеют различий, |
||
не имеют различий, @
@@
не имеют различий?
|
@
слабые зависимости устанавливают только DEPENDS
, в то время как ? ?
||
@@
слабые зависимости устанавливают как DEPENDS
, так и RDEPENDS:${PN}
Depend_Names
в инструкции #DEPS
, а для Yocto Build значения присваиваются переменной EXTRADEPS
в рецепте.scripts/bin/gen_depends_image.sh
-a
в gen_build_chain.py)-t
в gen_build_chain.py)make имя_пакета-deps
-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.
-s
.
export ENV_MAKE_FLAGS=
: при установке в пустое значение будет выводиться подробная информация о процессе сборки.source
.## Шаблоны сборкиOUT_PATH
, устанавливает и экспортирует окружение кросс-сборки или локальной сборки$(call safe_copy,опции_cp,источник_и_цель)
: При обычной сборке используется cp с блокировкой файла, чтобы предотвратить ошибки при одновременной установке каталога несколькими процессами$(call link_hdrs)
: Генерирует CFLAGS для поиска заголовочных файлов в зависимости от значения переменной SEARCH_HDRS$(call link_libs)
: Генерирует LDFLAGS для поиска библиотек$(call prepare_sysroot)
: При обычной сборке готовит sysroot в каталоге OUT_PATH#### Переменные шаблона окружения-native
добавлять не нужно)-native
* OUT_PREFIX: Верхний каталог вывода сборки, для локальной сборки берётся значение ENV_OUT_HOST, для кросс-сборки — ENV_OUT_ROOT
INS_PREFIX: Верхний каталог установки сборки, для локальной сборки берётся значение ENV_INS_HOST, для кросс-сборки — ENV_INS_ROOT
DEP_PREFIX: Верхний каталог поиска зависимостей, для локальной сборки берётся значение ENV_DEP_HOST, для кросс-сборки — ENV_DEP_ROOT
PATH_PREFIX: Верхний каталог поиска локальных инструментов
OUT_PATH: Каталог вывода
EXPORT_HOST_ENV: При кросс-сборке, если сборка зависит от собственных локальных пакетов, значение должно быть установлено в y
BUILD_FOR_HOST: При установке значения в y указывает на локальную сборку (native-compilation)
PREPARE_SYSROOT: При установке значения в y указывает на использование sysroot из каталога OUT_PATH для Normal Build вместо sysroot из ENV_TOP_OUT или sysroot-native
LOGOUTPUT: По умолчанию значение равно 1>/dev/null, при установке пустого значения, при компиляции приложений (include inc.app.mk) и исходных текстов OSS (include inc.cache.mk) выводится больше информации
base_*dir
и hdrdir
не входят в стандарт GNUInstallDirs$(INS_PREFIX)
$(eval $(call install_obj,<ID_имя>,<cp_опции>))
: Создаёт правило установки в указанный каталог в файле Makefile
dir
install_<заглавные буквы id_имени>s
INSTALL_<заглавные буквы ID_имени>S
* Определённые правила Makefile | Название каталога | Определение каталога (целевой каталог) | Набор исходных файлов для установки | Цель правила Makefile |
| ------------------ | --------------------------------------- | ------------------------------------ | --------------------- |
| 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
|* Определение переменных по умолчаниюinc. app. mk
, компилируемые исполняемые файлы добавляются в переменную BIN_TARGETS
, а переменная INSTALL_BINARIES
по умолчанию принимает значение $(BIN_TARGETS)
inc. app. mk
, компилируемые библиотечные файлы добавляются в переменную 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 选项>))
: Генерирует правило Makefile для установки в определённую директорию
dir
install_<заглавные буквы id>с
, %
соответствует последовательности маленьких буквINSTALL_<заглавные буквы ID>S_xxx
, xxx
соответствует строке, совпадающей с частью шаблона цели
/
Уже определённые правила Makefile
install_todir_xxx
и install_tofile_xxx
не определены с помощью install_ext
install_todir_xxx
: Правило Makefile для установки в определённую поддиректорию корневой директорииinstall_tofile_xxx
: Правило Makefile для установки в определённый файл корневой директории, используется для установки файлов и переименованияИсправленный текст:
$(eval $(call install_ext,<ID名>,<cp 选项>))
: Генерирует правило Makefile для установки в определённую директорию
dir
install_<заглавные_буквы_id>с
, %
соответствует последовательности маленьких буквINSTALL_<заглавные_буквы_ID>S_xxx
, xxx
соответствует строке, совпадающей с частью шаблона цели
/
Уже определённые правила Makefile
Правила Makefile install_todir_xxx
и install_tofile_xxx
не определены с помощью install_ext
install_todir_xxx
: Правило Makefile для установки в определённую поддиректорию корневой директорииinstall_tofile_xxx
: Правило Makefile для установки в определённый файл корневой директории, используется для установки файлов и переименования | Директория | Целевая директория | Переменная установки | Целевой шаблон правила 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_%
|Пример правил для режима
Создайте два пустых файла 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 = testb /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
* Сгенерированный путь к статической библиотеке добавляется в переменную `LIB_TARGETS`
имя_библиотеки основной_версии дополнительной_версии исправления
, например
LIBSO_NAME = libtest.so 1 2 3
компилирует динамическую библиотеку libtest.so.1.2.3 и создает символические ссылки libtest.so и libtest.so.1LIBSO_NAME = libtest.so 1 2
компилирует динамическую библиотеку libtest.so.1.2 и создает символические ссылки libtest.so и libtest.so.1LIBSO_NAME = libtest.so 1
компилирует динамическую библиотеку libtest.so.1 и создает символическую ссылку libtest.soLIBSO_NAME = libtest.so
компилирует динамическую библиотеку libtest.solibxxxx.so.x
, который можно переопределить через LDFLAGS
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: каталог, содержащий исходный код в пакете, по умолчанию (.
) указывает на корневой каталог пакета, но некоторые пакеты могут хранить исходный код в каталоге src.SRC_PATH = src1 src2 src3
. git scripts output
c cpp S
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
будут компилироваться с помощью CXX*.c *.cpp *.S
в каталоге SRC_PATH
gcc g++
)as
)xxx.c / xxx.cpp / ... / xxx.S
xxx.s / xxx.asm
-O0 -g -ggdb
### Конфигурационный шаблон inc. conf. mk* Конфигурационный шаблон предоставляет параметры конфигурации для Kongfig.$(ENV_TOP_DIR)/scripts/kconfig
.srctree=path_name
: Относительный путь к файлам конфигурации, указанным в Kconfig, по умолчанию это путь к текущему каталогу.CONFIG_=""
: Префикс для опций в .config и config.h, по умолчанию это CONFIG_
, в данном примере префикс не используется.__UPPERCASE_PACKAGE_NAME_CONFIG_H__
.
#ifndef xxx ... #define xxx ... #endif
, в данном шаблоне они добавляются с помощью команды sed.scripts/kconfig
.CONFIG_PATH
AUTOCONFIG_PATH
AUTOHEADER_PATH
, ранее эти параметры передавались как переменные окружения.$(INS_PREFIX)/lib/modules/<kernel_release>/extra/
install_hdrs
)make -O $(KERNEL_OUT)
для сборки ядра)Поддерживаемые цели
Настройка переменных
.git scripts output
)*.c *.S
в текущем каталоге)ccflags-y
asflags-y
ldflags-y
: параметры компиляции, ассемблирования и линковки модуля ядра$(call translate_obj,набор_исходных_файлов)
: преобразует набор имен исходных файлов в формат *.o
, требуемый KBUILD, независимо от того, начинаются ли исходные файлы с $(src)/
$(call set_flags,метка_название,набор_исходных_файлов,метка_значение)
: отдельная настройка меток компиляции для указанного набора исходных файлов, см. описание в inc.app.mkЕсли MOD_NAME содержит несколько имен модулей, пользователю необходимо самостоятельно указать объекты для каждого модуля, например
MOD_NAME = mod1 mod2
mod1-y = a1.o b1.o c1.o
mod2-y = a2.o b2.o c2.o
При использовании разделения исходного кода и выходных данных сборки, необходимо сначала скопировать Kbuild или Makefile в каталог OUT_PATH, если копирование не требуется, необходимо изменить исходный код ядра в scripts/Makefile.modpost
, в ядрах Linux 5.19 и последних LTS версиях этот патч уже включен ```makefile
-include $(if $(wildcard $(KBUILD_EXTMOD)/Kbuild), \
$(KBUILD_EXTMOD)/Kbuild, $(KBUILD_EXTMOD)/Makefile)
+include $(if $(wildcard $(src)/Kbuild), $(src)/Kbuild, $(src)/Makefile)
fetch_package.sh <method> <urls> <package> [outdir] [outname]
* method: метод загрузки пакета, поддерживается 4 метода
* tar: пакет, который можно распаковать с помощью команды `tar`, загружается с помощью `curl`, расширения могут быть `tar.gz`, `tar.bz2`, `tar.xz`, `tar` и т. д.
* zip: пакет, который можно распаковать с помощью команды `unzip`, загружается с помощью `curl`, расширения могут быть `gz`, `zip` и т. д.
* git: пакет, который загружается с помощью команды `git clone`
* svn: пакет, который загружается с помощью команды `svn checkout`
* urls: ссылки для загрузки
* tar/zip: рекомендуется указывать md5, например:
* `https://xxx/xxx.tar.xz;md5=yyy`
* `https://xxx/xxx.gz;md5=yyy`
* git: рекомендуется указывать 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`
* svn: рекомендуется указывать rev, например:
* `https://xxx/xxx;rev=yyy`
* package: tar zip — это имя файла для сохранения, git svn — это имя папки для сохранения, папка сохранения — `ENV_DOWN_DIR`
* outdir: папка для распаковки или копирования, используемая для сборки
* outname: имя папки пакета в outdir
* Примечание: при загрузке пакета сначала пытается загрузить его с помощью зеркального URL, указанного в `ENV_MIRROR_URL`, только при неудачной загрузке пакет загружается с исходного URL * Примечание: если outdir и outname не указаны, пакет загружается, но не распаковывается или не копируется в выходные данные.### Применение патчей exec_patch.sh
exec_patch.sh <method> <patch_srcs> <patch_dst>
имя_источника_пакета-patch-номер_патча
и имя_источника_пакета-unpatch-номер_патча
#DEPS
исходного пакета добавьте xxx-patch-xxx|xxx-unpatch-xxx
#VDEPS(выбор) xxx-patch-xxx-выбор(xxx-unpatch-xxx xxx-patch-xxx):
PATCH_FOLDER := xxx PATCH_NAME_xxx := 0001-xxx.patch PATCH_NAME_yyy := 0001-yyy.patch 0002-yyy.patch
$(PATCH_PACKAGE)-unpatch-all: @$(PATCH_SCRIPT) unpatch $(PATCH_FOLDER) $(PATCH_TOPATH) @echo "Удаление патчей $(PATCH_TOPATH) завершено."
$(PATCH_PACKAGE)-patch-%-all: @$(PATCH_SCRIPT) patch "$(patsubst %,$(PATCH_FOLDER)/%,$(PATCH_NAME_$(patsubst $(PATCH_PACKAGE)-patch-%-all,%,$@)))" $(PATCH_TOPATH) @echo "Применение патчей $(patsubst %-all,%,$@) завершено."``````markdown
process_cache.sh -h
Просмотр справки по команде$(PATCH_PACKAGE)-unpatch-%-all:
@$(PATCH_SCRIPT) unpatch "$(patsubst %,$(PATCH_FOLDER)/%,$(PATCH_NAME_$(patsubst $(PATCH_PACKAGE)-unpatch-%-all,%,$@)))" $(PATCH_TOPATH)
@echo "Построение $(patsubst %-all,%,$@) завершено."
%-clean:
@
%-install:
@
```* Скачивание и компиляция переменных
* FETCH_METHOD : Метод загрузки пакета, может быть выбран один из `tar zip git svn`, значение по умолчанию — tar
* SRC_URLS : URL-ы для загрузки пакета, включают информацию о ветке / ревизии / теге / 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 : Значение команды make, значение по умолчанию — `make $(ENV_BUILD_JOBS) $(ENV_MAKE_FLAGS) $(MAKES_FLAGS)`, пользователь может задать дополнительные параметры `MAKES_FLAGS`
* Для компиляции с помощью meson значение по умолчанию — `ninja $(ENV_BUILD_JOBS) $(MAKES_FLAGS)`, пользователь может задать дополнительные параметры `MAKES_FLAGS`
<br>* Переменные для обработки кэша
* CACHE_SRCFILE : Имя файла или имя директории, в которые сохраняются скачанные файлы по умолчанию берётся из переменной `$(SRC_NAME)`
``` * Указание этой переменной автоматически включает проверку скачанных файлов, локальный код не должен указывать эту переменную.
* CACHE_OUTPATH : Директория вывода пакета, в которой создаются файлы проверки и логи. По умолчанию берётся из переменной `$(OUT_PATH)`.
* CACHE_INSPATH : Директория установки пакета. По умолчанию берётся из переменной `$(INS_PATH)`.
* CACHE_GRADE : Уровень кэша по умолчанию равен 2, что определяет префикс кэшированных файлов.
* Обычно кэширование имеет 4 уровня: `soc_name` `cpu_name` `arch_name` `cpu_family`.
* Например: У меня есть процессор cortex-a55 с именем soc v9, то массив уровней кэширования будет `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`.
* Если зависимость не указана, она автоматически анализируется из `${ENV_CFG_ROOT}` DEPS и . config файлов. * CACHE_APPENDS : Добавление дополнительных строк проверки, например, динамически изменяющихся конфигураций
* CACHE_URL : Указание URL для скачивания, если задано SRC_URLS, по умолчанию берётся из переменной `[$(FETCH_METHOD)]$(SRC_URLS)`
* Формат должен быть `[download_method]urls`, например `[tar]urls`, `[zip]urls`, `[git]urls`, `[svn]urls`
* CACHE_VERBOSE : Создание лог-файла, по умолчанию равно 1, путь к лог-файлу `$(CACHE_OUTPATH)/$(CACHE_PACKAGE)-cache.log` #### Функции, предоставляемые шаблоном кэша
* do_fetch: Автоматически загружает код из сети и распаковывает в выходную директорию
* do_patch: Применяет патч, пользователь должен настроить папку с патчами `PATCH_FOLDER`
* do_compile: Если пользователь не настроил этот функционал, будет использоваться шаблонный `do_compile` функционал
* Если пользователь настроил переменную `SRC_URL`, будет автоматически добавлена загрузка кода
* Если пользователь настроил переменную `PATCH_FOLDER`, будет автоматически добавлено применение патчей
* Если пользователь настроил функцию `do_prepend`, она будет выполнена перед командой `make`
* Если пользователь настроил переменную `COMPILE_TOOL`, будет поддерживаться следующие варианты компиляции:
* Если значение `COMPILE_TOOL` равно `configure`, перед командой `make` будет выполнена команда `configure`, дополнительные параметры команды можно передать через переменную `CONFIGURE_FLAGS`
* CROSS_CONFIGURE: параметры конфигурации для кросс-компиляции
* Если значение `COMPILE_TOOL` равно `cmake`, перед командой `make` будет выполнена команда `cmake`, дополнительные параметры команды можно передать через переменную `CMAKE_FLAGS`
* CROSS_CMAKE: параметры конфигурации для кросс-компиляции
* Если значение `COMPILE_TOOL` равно `meson`, перед командой `ninja` будет выполнена команда конфигурации `meson`, дополнительные параметры команды можно передать через переменную `MESON_FLAGS` * Meson использует ini-файлы для конфигурации кросс-компиляции, пользователь может определить функцию `do_meson_cfg` для добавления или изменения стандартных настроек
* `MESON_WRAP_MODE` по умолчанию равно `--wrap-mode=nodownload`, что запрещает Meson загружать зависимости
* `MESON_LIBDIR` по умолчанию равно `--libdir=$(INS_PATH)$(INS_SUBDIR)/lib`, что устанавливает путь к библиотекам, иначе они будут установлены в `lib/x86_64-linux-gnu` при локальной компиляции
* Если пользователь настроил функцию `do_append`, она будет выполнена после команды `make`
* `do_clean`: Если пользователь не настроил этот функционал, будет использоваться шаблонный `do_clean` функционал
* `do_install`: Если пользователь не настроил этот функционал, будет использоваться шаблонный `do_install` функционал
* Если пользователь настроил функцию `do_install_append`, она будет выполнена в конце цели `install`
* `do_check`: Проверяет соответствие кэша, возвращаемая строка содержит `MATCH`, если соответствует, и `ERROR`, если есть ошибка
* `do_pull`: Если директория `INS_PATH` не существует, будет распакован кэш в выходную директорию
* `do_push`: Кэш будет добавлен в глобальный кэш
* `do_setforce`: Устанавливает принудительную компиляцию, пользователь может использовать эту функцию после выполнения некоторых действий, например, после изменения конфигурации
* `do_set1force`: Устанавливает принудительную компиляцию один раз, следующая компиляция будет обычной* do_unsetforce: Отменяет принудительную компиляцию, например, после восстановления стандартной конфигурации
#### Кэширование шаблонов целей* all / clean / install: Необходимые цели пакета
* Если пользователь не установил `USER_DEFINED_TARGET` в y, используются по умолчанию шаблонные цели `all clean install`
* psysroot: Подготовка sysroot в директории OUT_PATH
* srcbuild: Компиляция без использования кэша
* cachebuild: Компиляция с использованием кэша
* dofetch: Только загрузка исходного кода
* setforce: Установка принудительной компиляции
* set1force: Установка принудительной компиляции один раз
* unsetforce: Отмена принудительной компиляции
Примечание: При компиляции OSS пакетов из исходного кода, обычно в цели DEPS добавляется cache psysroot, чтобы использовать кэширование для ускорения повторной компиляции и подготовки sysroot в OUT_PATH для предотвращения добавления неявных зависимостей, что может привести к ошибкам компиляции.
### Компиляция OSS слоя* Количество пакетов в OSS слое постоянно растет, на данный момент уже более 50 пакетов.
* Демонстрация компиляции с кэшированием [cache_demo](https://www.bilibili.com/video/BV15R4y1C7e6)
* Команды компиляции
* `make time_statistics` выполняет компиляцию каждого пакета по отдельности (внутри пакета может быть многопоточная компиляция), собирая время компиляции каждого пакета
* Каждый OSS пакет имеет три строки: первая строка — подготовка зависимого sysroot, вторая строка — компиляция, третья строка — установка в глобальный sysroot
* `make` выполняет многопоточную компиляцию внутри пакета и одновременную компиляцию нескольких пакетов, не собирая время компиляции
* `make all_fetchs` загружает исходный код всех выбранных пакетов, поддерживающих кэширование
*
Примечание: Перед первой компиляцией рекомендуется загрузить исходный код всех выбранных пакетов, поддерживающих кэширование, с помощью `make all_fetchs`, чтобы избежать проблем, связанных с неудачной загрузкой исходного кода.* Компиляция кросс-компилятора, пример cortex-a53
```sh
lengjing@lengjing:~/data/cbuild$ source scripts/build.env cortex-a53
. . .
lengjing@lengjing:~/data/cbuild$ make -C scripts/toolchain
make: Entering directory '/home/lengjing/data/cbuild/scripts/toolchain'
make[1]: Entering directory '/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.patch to /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs/mpc-1.3.1 Done.
``` /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 to /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 to /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 to /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 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/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 to /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 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/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 to /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 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
После очистки загруженных данных, проведите подсчет времени компиляции для каждого пакета и выберите следующие представительные пакеты для тестирования:
* busybox: настройте параметры с помощью menuconfig
* cjson: скомпилируйте с помощью CMake
* libpcap: скомпилируйте с помощью Autotools
* ljson: скомпилируйте с помощью пользовательского Makefile
* lua: примените патч к исходному коду
* ncurses: используйте инструменты, собранные из собственного native пакета
* tcpdump: используйте библиотеку libpcap```markdown
. /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/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
``` ```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: Всего 39 (разница 1), переиспользовано 0 (разница 0), переиспользовано пакетов 37
Распаковка объектов: 100% (39/39), завершено.
копирование /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.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
реальное время пользовательское время системное время пакет
0.04 0.03 0.00 зависимости
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.
Перекомпиляция lua завершена.
Установка lua завершена.
lengjing@lengjing:~/data/cbuild$ make lua
ПРЕДУПРЕЖДЕНИЕ: Принудительное перекомпилярование lua.
Push lua Cache to /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
Перекомпиляция lua завершена.
Установка lua завершена.
```* Отмена принудительного перекомпилярования, при следующей перекомпиляции используется кэш, без перекомпиляции из исходного кода (если нет сетевого кэша, требуется перекомпиляция из исходного кода один раз)
```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 завершена.
```
* Изменение конфигурации кода, установка обязательной сборки, всегда собирается из исходного кода
```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 Configuration
*
*
* Settings
*
...
Отключил принудительное перекомпилярование 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
Распаковал /home/lengjing/data/cbuild/output/mirror-cache/downloads/libpcap-1.10.1.tar.gz в /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
Распаковал /home/lengjing/data/cbuild/output/mirror-cache/downloads/tcpdump-4.99.1.tar.gz в /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/tcpdump
configure: WARNING: использую кросс-инструменты, не префиксированные хост-триплетом
configure: WARNING: pcap/pcap-inttypes.h: принят компилятором, отклонён препроцессором!
configure: WARNING: pcap/pcap-inttypes.h: продолжаю работу с результатом компилятора
Передал кэш 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 )