1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/lengjingzju-cbuild

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README_zh-cn.md 140 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 23.04.2025 06:49 e17c44f

Система компиляции CBuild

Английская версия

Разработка новых функций в 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, который постоянно пополняется новыми пакетами

  • Примеры тестовых случаев можно посмотреть в examples_zh-cn.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-заявления всех пакетов и автоматически генерирует сборочную цепочку для всех пакетов, каждый пакет собирается отдельно
* Поддерживает управление Kconfig самостоятельно или через хостинг, хостинг Kconfig должен быть размещен в той же директории, что и DEPS-заявление, без необходимости указания родительских и дочерних включений, а только автоматического анализа и сборки скриптом
  • Сборка Yocto состоит из:

    • Скрипты сборки приложений и драйверов состоят из Makefile + Recipe
    • Сборочная цепочка собирается через зависимости, определенные в Recipe (уровень пакета)
    • Собственные рецепты пакетов обычно требуют только определения зависимостей, следуя правилам Yocto
    • Расширенная сборка Yocto, скрипт анализирует все Recipe файлы и собственные Recipe пакетов и автоматически генерирует сборочную цепочку для всех пакетов
    • Расширенная сборка Yocto поддерживает слабые зависимости, которые можно изменить через make menuconfig (добавление пакетов, удаление пакетов, изменение конфигураций и т. д.)### Параметры команды gen_build_chain.py
  • Описание команды

    • В квадратных скобках указываются опциональные параметры, остальные обязательные
    • Для обычной сборки требуется только один шаг для автоматической генерации Kconfig и Makefile
    • Для сборки Yocto требуется два шага для автоматической генерации Kconfig и рецепта образа, автоматический анализ файлов конфигурации 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>: Указывает рецепты, которые нужно игнорировать; несколько рецептов разделяются двоеточием.

Обычное построение (Real зависимости)

  • Формат реальных зависимостей: #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)

Правила реальных зависимостей Yocto Build* Зависимости Yocto Build определяются в рецепте

  • DEPENDS: пакеты, необходимые для компиляции

    • Примечание: Yocto использует некоторые команды хоста, поэтому могут потребоваться зависимости от хостовых пакетов имя_пакета-native, например bash-native
  • RDEPENDS:${PN}: пакеты, необходимые для выполнения

    • Примечание: пакеты с зависимостями динамических библиотек должны быть добавлены в этот параметр, иначе возникнут ошибки компиляции или зависимости не будут установлены в rootfs
  • EXTRADEPS: специальные зависимости для расширения CBuild

    • Если в EXTRADEPS присутствуют слабые зависимости, необходимо наследовать класс 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 Build
    • unselect : указывает, что этот пакет по умолчанию не собирается, то есть 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, используется только в обычном сборке
    • Другие пояснения:
      • Для обычной сборки, ? ? ? не имеют различий, | || не имеют различий, @ @@ не имеют различий
      • Для сборки Yocto ? | @ слабые зависимости устанавливают только DEPENDS, в то время как ? ? || @@ слабые зависимости устанавливают как DEPENDS, так и RDEPENDS:${PN}
    • ENVNAME=val1,val2: указывает, что этот пакет зависит от значения переменной окружения ENVNAME, равного val1 или val2
    • ENVNAME!=val1,val2: указывает, что этот пакет зависит от значения переменной окружения ENVNAME, не равного val1 и val2* Примечание: специальные зависимости для Classic Build устанавливаются с помощью элемента Depend_Names в инструкции #DEPS, а для Yocto Build значения присваиваются переменной EXTRADEPS в рецепте.

Генерация диаграммы зависимостей gen_depends_image.sh

  • Параметры команды scripts/bin/gen_depends_image.sh
    • Параметр 1: имя пакета
    • Параметр 2: путь к папке для хранения изображения
    • Параметр 3: список имен пакетов и т.д.
      • Normal Build: путь к файлу, содержащему имя пакета и список зависимостей (путь, указанный опцией -a в gen_build_chain.py)
      • Yocto Build: путь к файлу, содержащему имя пакета и путь к исходному коду (путь, указанный опцией -t в gen_build_chain.py)
    • Параметр 4: путь к файлу конфигурации .config* Описание генерации изображения
    • Использование команды make имя_пакета-deps
    • Normal Build
      • Толстая линия: сильная зависимость
      • Тонкая линия: слабая зависимость
      • Двойная линия: prebuild или srcbuild, или patch или unpatch
      • Зелёная линия: пакет выбран в конфигурационном файле .config
      • Красная линия: пакет не выбран в конфигурационном файле .config
      • Цвет рамки верхнего уровня пакета
        • Зелёная рамка: пакет выбран в конфигурационном файле .config
        • Красная рамка: пакет не выбран в конфигурационном файле .config
    • Yocto Build
      • Зелёная рамка: пользовательский пакет, выбранный в конфигурационном файле .config
      • Красная рамка: пользовательский пакет, не выбранный в конфигурационном файле .config
      • Синяя рамка: пакеты из сообщества Yocto и т.д. (не находящиеся в слое, указанном опцией -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
    ============================================================
  • Также можно экспортировать среду кросс-компиляции по имени soc ```sh lengjing@lengjing:~/data/cbuild$ source scripts/build.env cortex-a53

    ENV_BUILD_MODE : внешний ENV_BUILD_SOC : cortex-a53 ENV_BUILD_ARCH : arm64 ENV_BUILD_TOOL : /output/toolchain/cortex-a53-toolchain-gcc12.2.0-linux5.15/bin/aarch64-linux-gnu- ENV_BUILD_JOBS : -j8 ENV_MAKE_FLAGS : -s KERNEL_VER : 5.15.88 KERNEL_SRC : /home/lengjing/data/cbuild/output/kernel/linux-5.15.88 KERNEL_OUT : /home/lengjing/data/cbuild/output/cortex-a53/objects/linux-5.15.88 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/cortex-a53 ENV_CFG_ROOT : /home/lengjing/data/cbuild/output/cortex-a53/config ENV_OUT_ROOT : /home/lengjing/data/cbuild/output/cortex-a53/objects ENV_INS_ROOT : /home/lengjing/data/cbuild/output/cortex-a53/sysroot ENV_DEP_ROOT : /home/lengjing/data/cbuild/output/cortex-a53/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.

Описание переменных окружения

  • ENV_BUILD_MODE: Устанавливает режим сборки: external, когда исходный код и результаты сборки разделены; internal, когда результаты сборки находятся в исходном коде; yocto, для сборки с использованием Yocto.
    • при external, каталог результатов сборки заменяет часть ENV_TOP_DIR пути исходного кода на ENV_OUT_ROOT / ENV_OUT_HOST.
  • ENV_BUILD_SOC: Указывает SoC для кросс-компиляции, из которого с помощью скрипта process_machine.sh получают набор параметров, связанных с SoC.
  • ENV_BUILD_ARCH: Указывает архитектуру ARCH для кросс-компиляции модулей Linux.
  • ENV_BUILD_TOOL: Указывает префикс для кросс-компилятора.
  • ENV_BUILD_JOBS: Указывает количество потоков для сборки.
  • ENV_MAKE_FLAGS: Устанавливает глобальные параметры для команды make, по умолчанию установлено -s.
    • export ENV_MAKE_FLAGS=: при установке в пустое значение будет выводиться подробная информация о процессе сборки.

* KERNEL_VER: Версия ядра Linux. * KERNEL_SRC: Путь к распакованному каталогу ядра Linux. * KERNEL_OUT: Путь к каталогу вывода сборки ядра Linux.
* ENV_TOP_DIR: Корневой каталог проекта * ENV_MAKE_DIR: Каталог шаблонов сборки проекта * ENV_TOOL_DIR: Каталог скриптов инструментов проекта * ENV_DOWN_DIR: Путь к сохранению загружаемых пакетов * ENV_CACHE_DIR: Путь к сохранению кэша сборки пакетов * ENV_MIRROR_URL: URL-адрес для загрузки пакетов, можно быстро создать HTTP-сервер командой `python -m http.server порт`
  • ENV_TOP_OUT: Корневой каталог вывода проекта, где определены каталоги для сборки, установки файлов, создания образов и т. д.
  • ENV_CFG_ROOT: Путь к сохранению автоматически сгенерированных файлов проекта, таких как глобальный Kconfig и Makefile, различные файлы статистики и т. д.
  • ENV_OUT_ROOT: Корневой каталог вывода сборки, когда исходный код и результаты сборки разделены
  • ENV_INS_ROOT: Корневой каталог установочных файлов проекта
  • ENV_DEP_ROOT: Корневой каталог поиска библиотек и заголовочных файлов проекта

  • ENV_TOP_HOST: Корневой каталог локальных пакетов проекта, где определены каталоги для сборки, установки файлов и т. д.
  • ENV_OUT_HOST: Корневой каталог вывода локальной сборки, когда исходный код и результаты сборки разделены
  • ENV_INS_HOST: Корневой каталог установочных файлов локальной сборки
  • ENV_DEP_HOST: Корневой каталог поиска библиотек и заголовочных файлов локальной сборкиПримечание: При сборке Yocto Build, поскольку задачи BitBake не могут напрямую использовать переменные окружения текущей оболочки, пользовательские переменные окружения должны быть экспортированы из файлов рецептов, без необходимости запуска этого скрипта окружения командой source.## Шаблоны сборки

Шаблон окружения inc.env.mk

  • Шаблон окружения используется для сборки и сборки модулей ядра
  • При обычной сборке (обычная сборка) этот шаблон устанавливает каталог вывода OUT_PATH, устанавливает и экспортирует окружение кросс-сборки или локальной сборки
  • При сборке Yocto Build каталог вывода и окружение кросс-сборки устанавливаются и экспортируются BitBake

Функции шаблона окружения

  • $(call safe_copy,опции_cp,источник_и_цель): При обычной сборке используется cp с блокировкой файла, чтобы предотвратить ошибки при одновременной установке каталога несколькими процессами
  • $(call link_hdrs): Генерирует CFLAGS для поиска заголовочных файлов в зависимости от значения переменной SEARCH_HDRS
  • $(call link_libs): Генерирует LDFLAGS для поиска библиотек
  • $(call prepare_sysroot): При обычной сборке готовит sysroot в каталоге OUT_PATH#### Переменные шаблона окружения
  • PACKAGE_NAME: Название пакета (должно совпадать с названием пакета в DEPS-записи, для локальной компиляции суффикс -native добавлять не нужно)
  • PACKAGE_ID: Только для чтения, фактическое название пакета, при кросс-компиляции равно значению PACKAGE_NAME, при локальной компиляции добавляется суффикс -native
  • INSTALL_HDR: Подпапка для установки заголовочных файлов, по умолчанию равна значению PACKAGE_NAME
  • PACKAGE_DEPS: Список зависимостей пакета, в будущем может быть удалён
  • SEARCH_HDRS: Список подпапок для поиска заголовочных файлов, по умолчанию равен значению PACKAGE_DEPS


* 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) выводится больше информации

Шаблон установки inc.ins.mk

  • Шаблон установки используется как для локальной сборки, так и для сборки модулей ядра
  • Каталог установки шаблона соответствует стандарту GNUInstallDirs
    • base_*dir и hdrdir не входят в стандарт GNUInstallDirs
    • Корневой каталог установки — $(INS_PREFIX)

Описание целей и переменных шаблона установки

  • $(eval $(call install_obj,<ID_имя>,<cp_опции>)): Создаёт правило установки в указанный каталог в файле Makefile

    • ID_имя: Имя каталога без слова dir
    • Цель правила Makefile: 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 для установки в определённую директорию

    • ID名: Имя директории без префикса dir
    • Цель правила Makefile: 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 для установки в определённый файл корневой директории, используется для установки файлов и переименования

Исправленный текст:

  • $(eval $(call install_ext,<ID名>,<cp 选项>)): Генерирует правило Makefile для установки в определённую директорию

    • ID名: Имя директории без префикса dir
    • Цель правила Makefile: 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

Применение шаблона inc.app.mk

  • Шаблон используется для компиляции динамических библиотек, статических библиотек и исполняемых файлов

Описание целей шаблона* LIBA_NAME: При компиляции одной статической библиотеки необходимо задать имя библиотеки

* Сгенерированный путь к статической библиотеке добавляется в переменную `LIB_TARGETS`
  • LIBSO_NAME: При компиляции одной динамической библиотеки необходимо задать имя библиотеки
    • 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 в формате libxxxx.so.x, который можно переопределить через LDFLAGS
      • Например LDFLAGS += -Wl,-soname=libxxxx.so
    • Сгенерированный путь к динамической библиотеке и символические ссылки добавляются в переменную LIB_TARGETS
  • BIN_NAME: При компиляции одного исполняемого файла необходимо задать имя исполняемого файла
    • Сгенерированный исполняемый файл добавляется в переменную 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
  • IGNORE_PATH: набор каталогов, которые будут игнорироваться при поиске исходных файлов, по умолчанию игнорируются каталоги . git scripts output
  • REG_SUFFIX: поддерживаемые расширения файлов исходного кода, по умолчанию ищутся файлы с расширениями c cpp S
    • можно изменить на другие типы файлов, выбирая из определенных типов в CPP_SUFFIX / ASM_SUFFIX
      • CPP_SUFFIX: расширения файлов для C++-типов, по умолчанию определены как cc cp cxx cpp CPP c++ C
      • ASM_SUFFIX: расширения файлов для ассемблерных типов, по умолчанию определены как S s asm
    • если требуется поддержка типов файлов, отличных от стандартных CPP_SUFFIX / ASM_SUFFIX, достаточно изменить REG_SUFFIX и CPP_SUFFIX / ASM_SUFFIX, а также определить соответствующие функции
    • например, добавление поддержки типа cxx (CPP_SUFFIX уже содержит cxx):
      REG_SUFFIX = c cpp S cxx
      include $(ENV_MAKE_DIR)/inc. app. mk
    • например, добавление поддержки типа CXX (CPP_SUFFIX еще не содержит CXX):
      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)))
  • USING_CXX_BUILD_C: если установлено в y, то файлы *.c будут компилироваться с помощью CXX
  • SRCS: все исходные файлы по умолчанию — это все файлы *.c *.cpp *.S в каталоге SRC_PATH
    • если пользователь указывает SRCS, можно также задать SRC_PATH, чтобы добавить SRC_PATH и include каталоги SRC_PATH в список каталогов для поиска заголовочных файлов
    • если пользователь указывает SRCS, IGNORE_PATH игнорируется
  • CFLAGS: пользователь может задать собственные глобальные флаги компиляции для пакета (используются для команд gcc g++)
  • AFLAGS: пользователь может задать собственные глобальные флаги компиляции для ассемблерных файлов (используются для команды as)
  • LDFLAGS: пользователь может задать собственные глобальные флаги линковки
  • CFLAGS_xxx.o: пользователь может задать отдельные флаги компиляции для конкретного исходного файла xxx.c / xxx.cpp / ... / xxx.S
  • AFLAGS_xxx.o: пользователь может задать отдельные флаги компиляции для конкретного ассемблерного файла xxx.s / xxx.asm
  • DEBUG: если установлено в y, то компиляция будет выполняться с флагами -O0 -g -ggdb### Конфигурационный шаблон inc. conf. mk* Конфигурационный шаблон предоставляет параметры конфигурации для Kongfig.

Описание целей конфигурационного шаблона

  • loadconfig: Если .config не существует, загружает заданный параметром DEF_CONFIG по умолчанию.
  • defconfig: Восстанавливает текущую конфигурацию до заданной по умолчанию DEF_CONFIG.
  • menuconfig: Графический инструмент конфигурации.
  • cleanconfig: Очищает файлы конфигурации.
  • xxx_config: Использует xxx_config из CONF_SAVE_PATH в качестве текущей конфигурации.
  • xxx_saveconfig: Сохраняет текущую конфигурацию в xxx_config в CONF_SAVE_PATH.
  • xxx_defconfig: Использует xxx_defconfig из CONF_SAVE_PATH в качестве текущей конфигурации.
  • xxx_savedefconfig: Сохраняет текущую конфигурацию в xxx_defconfig в CONF_SAVE_PATH.

Описание настраиваемых переменных* OUT_PATH: Путь к выходным файлам компиляции, лучше оставить по умолчанию.

  • CONF_SRC: Путь к исходным файлам kconfig, по умолчанию это $(ENV_TOP_DIR)/scripts/kconfig.
  • CONF_PATH: Путь к установке kconfig, лучше оставить по умолчанию.
  • CONF_PREFIX: Переменные для запуска conf, в основном это два параметра:
    • srctree=path_name: Относительный путь к файлам конфигурации, указанным в Kconfig, по умолчанию это путь к текущему каталогу.
    • CONFIG_="": Префикс для опций в .config и config.h, по умолчанию это CONFIG_, в данном примере префикс не используется.
  • CONF_HEADER: Макрорасширение для config.h, по умолчанию это __UPPERCASE_PACKAGE_NAME_CONFIG_H__.
    • Головные файлы, сгенерированные kconfig, не содержат макрорасширений #ifndef xxx ... #define xxx ... #endif, в данном шаблоне они добавляются с помощью команды sed.
  • KCONFIG: Файл параметров конфигурации, по умолчанию это Kconfig в текущем пакете.
  • CONF_SAVE_PATH: Путь к сохранению и загрузке конфигурационных файлов, по умолчанию это каталог config в текущем пакете.
  • CONF_APPEND_CMD: Команда, которая будет выполнена при изменении конфигурации.Примечание: Файл Kconfig в каталоге также описывает, как писать параметры конфигурации.

Описание проекта scripts/kconfig

  • Исходный код полностью взят из ядра Linux 5.18 scripts/kconfig.
  • На основе исходного кода добавлены параметры командной строки CONFIG_PATH AUTOCONFIG_PATH AUTOHEADER_PATH, ранее эти параметры передавались как переменные окружения.
  • Makefile полностью переписан.

Шаблон драйвера inc.mod.mk

  • Шаблон драйвера используется для компиляции внешних модулей ядра.

Описание части Makefile для шаблона драйвера (при отсутствии KERNELRELEASE)

  • Поддерживаемые цели
    • modules: сборка драйвера
    • modules_clean: очистка выходных данных сборки модуля ядра
    • modules_install: установка модуля ядра
      • По умолчанию драйвер устанавливается в путь $(INS_PREFIX)/lib/modules/<kernel_release>/extra/
    • symvers_install: установка файла символов Module.symvers в указанное место (установлена как зависимость для цели install_hdrs)

  • Настройка переменных
    • MOD_MAKES: пользователь может указать некоторые собственные параметры модуля, например XXXX=xxxx
    • KERNEL_SRC: каталог исходного кода ядра Linux (обязательно)
    • KERNEL_OUT: каталог выходных данных сборки ядра Linux (обязательно при использовании make -O $(KERNEL_OUT) для сборки ядра)

Описание части Kbuild для шаблона драйвера (при наличии значения KERNELRELEASE)

  • Поддерживаемые цели

    • MOD_NAME: имя модуля, может быть несколько имен модулей, разделённых пробелами
  • Настройка переменных

    • IGNORE_PATH: список имен каталогов, которые будут игнорироваться при поиске исходных файлов (по умолчанию игнорируются каталоги .git scripts output)
    • SRCS: все C и ассемблерные исходные файлы (по умолчанию это все файлы *.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* Использование 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>
    • method: только два значения: patch — применение патча, unpatch — удаление патча
    • patch_srcs: путь к файлу патча или к папке, содержащей патчи, может быть несколько проектов
    • patch_dst: путь к исходному коду, к которому применяется патч
      * Пример: Выбор метода для применения патчей
    • Для каждой категории патчей создаются два пакета: пакет с патчем и пакет без патча. Формат имени пакета должен быть имя_источника_пакета-patch-номер_патча и имя_источника_пакета-unpatch-номер_патча
    • Исходный пакет слабо зависит от этих двух пакетов. В #DEPS исходного пакета добавьте xxx-patch-xxx|xxx-unpatch-xxx
    • Создайте виртуальное правило зависимости #VDEPS(выбор) xxx-patch-xxx-выбор(xxx-unpatch-xxx xxx-patch-xxx):
    • Все пакеты с патчами для исходного пакета используют один и тот же файл Makefile. Пример:
      • PATCH_PACKAGE : имя исходного пакета
      • PATCH_TOPATH : путь к исходному пакету
      • PATCH_FOLDER : путь к папке с патчами
      • PATCH_NAME_номер_патча : имя патча, может быть несколько патчей```makefile PATCH_SCRIPT := $(ENV_TOOL_DIR)/exec_patch.sh PATCH_PACKAGE := xxx PATCH_TOPATH := 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

  • process_cache.sh -h Просмотр справки по команде
  • Принцип работы
    • Использует элементы, влияющие на компиляцию пакета, как часть имени кеш-файла
    • Элементы, влияющие на компиляцию пакета: скрипты компиляции, патчи, выходные данные зависимых пакетов, архивы пакетов или локальные файлы исходного кода
    • Необходимо избегать добавления выходных файлов после компиляции в проверку

Шаблон кеша inc.cache.mk

$(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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/lengjingzju-cbuild.git
git@api.gitlife.ru:oschina-mirror/lengjingzju-cbuild.git
oschina-mirror
lengjingzju-cbuild
lengjingzju-cbuild
main