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

OSCHINA-MIRROR/lengjingzju-cbuild

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

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

中文版

Разработка новых функций CBuild приостановлена, рекомендуется обновиться до Cbuild-ng. Cbuild-ng и CBuild не являются полностью совместимыми.

Обзор

Система компиляции CBuild является более мощной и гибкой системой сборки, чем Buildroot, и быстрее и компактнее, чем Yocto. Она не имеет крутого наклона кривой обучения и не переопределяет новый язык, общее количество строк кода ядра системы составляет менее 4000, состоящее из скриптов на Python / Shell / Makefile. Она легче понимается и используется, чем Buildroot и Yocto.

Система компиляции CBuild состоит из трех основных частей: инструментов анализа и обработки задач, шаблонов компиляции Makefile и инструментов обработки сети и кэша.
* Инструменты анализа и обработки задач: анализирует все задачи и автоматически генерирует системные Kconfig и Makefile * Все задачи анализируются и собираются Python-скриптом gen_build_chain.py * Автоматически собирает правила и параметры для всех задач, выбирает, какие задачи запускать и настраивает параметры задач через make menuconfig * Каждое правило задачи объявляется с помощью утверждения зависимости, что поддерживает большое количество зависимых правил * Поддерживает автоматическую генерацию реальных правил пакетов для выполнения задач и виртуальных правил пакетов для управления задачами * Поддерживает автоматическую генерацию обычной структуры (config), иерархической структуры (menuconfig), структуры выбора (choice) и т. д. * Поддерживает автоматическую генерацию сильной зависимости (depends on), слабой зависимости (if...endif), сильного выбора (select), слабого выбора (imply), выбора (condA||condB) и т. д. * Файл задачи представляет собой скрипт Makefile, выполняемый make, что поддерживает упаковку исходных скриптов Makefile, CMake, Autotools, Meson, ... для поддержки этих методов компиляции * Поддерживает автоматическую генерацию схемы зависимости задач с полезными свойствами, такими как цвет, чтобы увидеть, выбрана ли задача, и т. д. (gen_depends_image.sh)
* Шаблоны сборки Makefile: Предоставляют шаблоны сборки для драйверов, библиотек и приложений; пользователи только должны заполнить несколько переменных, чтобы завершить скрипт сборки проекта * Поддерживает генерацию последней кросс-сборочной цепочки инструментов (process_machine.sh toolchain/Makefile) * Поддерживает как нативную сборку, так и кросс-сборку в одном Makefile (inc.env.mk) * Поддерживает генерацию нескольких библиотек, исполняемых файлов или драйверов в одном Makefile * Поддерживает как режим обычной сборки (режим разделения исходного кода и выходных данных сборки и режим без разделения), так и режим сборки Yocto * Поддерживает автоматический анализ заголовочных файлов как зависимостей сборки и указывает CFLAGS для исходных файлов отдельно * Предоставляет шаблон для сборки статических библиотек, динамических библиотек и исполняемых файлов, и поддерживает смешанную сборку на C (*.c), C++ (*.cc *.cp *.cxx *.cpp *.CPP *.c++ *.C) и ассемблере (*.S *.s *.asm) (inc.app.mk) * Предоставляет шаблон для сборки драйверов, и поддерживает смешанную сборку на C (*.c) и ассемблере (*.S) (inc.mod.mk) * Предоставляет шаблон для установки, соответствующий стандарту GNUInstallDirs (inc.ins.mk) * Предоставляет шаблон для настройки параметров с помощью Kbuild (inc.conf.mk)
* Инструменты для обработки сети и кэша: Обрабатывает загрузку, исправление, компиляцию и установку сетевых пакетов, а также поддерживает зеркало исходного кода и кэш-зеркало. * Предоставляет удобный и надежный механизм исправления (exec_patch.sh) * Предоставляет автоматический инструмент для загрузки сетевых пакетов (fetch_package.sh) * Поддерживает загрузку пакетов с HTTP (атрибуты: md5), Git (атрибуты: ветка, тег, rev) и SVN (атрибуты: rev) * Поддерживает загрузку пакетов с сервера-зеркала * Предоставляет инструмент кэширования компиляции, повторная компиляция не требует компиляции с исходного кода, а берет результат напрямую из локальной области или сервера-зеркала (process_cache.sh) * Предоставляет удобный шаблон для кэширования компиляции (inc.cache.mk) * Предоставляет обширный слой открытого программного обеспечения (OSS), и количество OSS-пакетов постоянно растет
* Примеры тестовых случаев можно посмотреть в examples.md

Вклад в открытые проекты

Этот проект внес 2 коммита в сообщество ядра Linux, которые были включены в основное ядро Linux.

  • kconfig: исправление ошибки при генерации auto.conf

    commit 1b9e740a81f91ae338b29ed70455719804957b80
    Author: Jing Leng <jleng@ambarella.com>
    Date:   Fri Feb 11 17:27:36 2022 +0800
    
        kconfig: исправление ошибки при генерации auto.conf
    
        При указании KCONFIG_AUTOCONFIG (например, export \
        KCONFIG_AUTOCONFIG=output/config/auto.conf), директория include/config/ \
        не создается, поэтому kconfig не может создать файлы зависимостей в нем, \
        и auto.conf не может быть сгенерирован.
  • kbuild: исправление пути включения в scripts/Makefile.modpost

    commit 23a0cb8e3225122496bfa79172005c587c2d64bf
    Author: Jing Leng <jleng@ambarella.com>
    Date:   Tue May 17 18:51:28 2022 +0800
    
        kbuild: исправление пути включения в scripts/Makefile.modpost
    
        При сборке внешнего модуля, если пользователи не хотят разделять выход \
        сборки и исходный код, они выполняют следующую команду: "make -C $(LINUX_SRC_DIR) M=$(PWD)". В этом случае, "$(KBUILD_EXTMOD)" \
        и "$(src)" совпадают. Если им нужно разделить их, они запускают "make -C $(KERNEL_SRC_DIR) O=$(KERNEL_OUT_DIR) M=$(OUT_DIR) src=$(PWD)". Перед запуском команды \
        им нужно скопировать "Kbuild" или "Makefile" в "$(OUT_DIR)", чтобы предотвратить ошибку компиляции.
    ```        Таким образом, ядро должно изменить путь включения, чтобы избежать
        операции копирования.

Анализ задачи обработки gen_build_chain.py

Системный фреймework* Обычный фреймворк сборки:

 * Скрипты сборки приложений и драйверов состоят из `Makefile + DEPS-заявления`
 * Цепочка сборки собирается через зависимости, определенные DEPS-заявлениями (зависимости на уровне пакета)
 * DEPS-заявления в основном должны определять зависимости, следуя правилам сборки, определенным CBuild
 * Скрипт анализирует DEPS-заявления всех пакетов и автоматически генерирует цепочку сборки всех пакетов
     * Все пакеты собираются отдельно, и пользователи могут войти в папку пакета и ввести `make` для сборки
 * Поддерживает управляемый Kconfig или управление Kconfig самостоятельно.
     * Управляемый Kconfig должен быть размещен в той же директории, что и файл DEPS-заявления
     * Не требуется вручную указывать родительско-детские отношения включения, скрипт автоматически анализирует и собирает их
  • Фреймворк сборки Yocto:

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

    • Скобки указывают, что это опционально, в противном случае это обязательно
    • Обычная сборка автоматически генерирует Kconfig и Makefile за один шаг
    • Сборка Yocto требует двух шагов для автоматической генерации Kconfig и рецепта изображения соответственно
    # Normal Build
    gen_build_chain.py -m MAKEFILE_OUT -k KCONFIG_OUT [-t TARGET_OUT] [-a DEPENDS_OUT] -d DEP_NAME [-v VIR_NAME] [-c CONF_NAME] -s SEARCH_DIRS [-i IGNORE_DIRS] [-g GO_ON_DIRS] [-l MAX_LAYER_DEPTH] [-w KEYWORDS] [-p PREPEND_FLAG] [-u UNIQUE_PACKAGES]
    
    # Yocto Build Step1
    gen_build_chain.py -k KCONFIG_OUT -t TARGET_OUT [-v VIR_NAME] [-c CONF_NAME] [-i IGNORE_DIRS] [-l MAX_LAYER_DEPTH] [-w KEYWORDS] [-p PREPEND_FLAG] [-u USER_METAS]
    
    # Yocto Build Step2
    gen_build_chain.py -t TARGET_PATH -c DOT_CONFIG_NAME -o RECIPE_IMAGE_NAME [-p PATCH_PKG_PATH] [-i IGNORE_RECIPES]
  • Параметры команды для обычного сборки

    • -m <Путь к файлу Makefile>: Указывает путь к автоматически сгенерированному файлу Makefile
      • Пользователи могут использовать верхнеуровневый файл Makefile для хранения автоматически сгенерированного файла Makefile и установить все цели вызова make $(ENV_BUILD_JOBS) $(ENV_MAKE_FLAGS) MAKEFLAGS= all_targets для многопоточной компиляции всех пакетов
      • Если пакет требует включения многопоточной компиляции внутренне, jobserver должен быть указан в OTHER_TARGETS в DEPS-запросе
      • Время компиляции каждого пакета может быть подсчитано, и пример файла Makefile следующий:
        TIME_FORMAT    := /usr/bin/time -a -o $(OUT_PATH)/time_statistics -f "%e\t\t%U\t\t%S\t\t$@\"            total_time: loadconfig
         	@$(PRECMD)make -s all_targets
         	@echo "Build done! "
         ```            time_statistics:
          	@mkdir -p $(OUT_PATH)
          	@$(if $(findstring dash,$(shell readlink /bin/sh)),echo,echo -e) "real\t\tuser\t\tsys\t\tpackage" > $(OUT_PATH)/$@
          	@make -s PRECMD="$(TIME_FORMAT)" total_time
          ```
      • -k <Путь К Файлу Kconfig>: Указывает путь к автоматически сгенерированному файлу Kconfig
      • -t <Целевой Путь>: Указывает путь к автоматически сгенерированному файлу, который хранит имя пакета и список путей исходных файлов
      • -a <Путь Зависимостей>: Указывает путь к автоматически сгенерированному файлу, который хранит имя пакета и список зависимостей
      • -d <Имя Файла Зависимостей>: Указывает имя файла зависимостей (содержащего DEPS-заявление) для поиска, файл зависимостей может содержать несколько DEPS-заявлений
      • -c <Имя Файла Kconfig>: Указывает имя файла Kconfig (содержащего конфигурацию) для поиска
        • Порядок поиска (в той же директории, что и файл зависимостей):
          • Файл с тем же именем, что и имя пакета, и тем же суффиксом, что и файл Kconfig, в той же директории, что и файл зависимостей
          • Имя файла Kconfig в той же директории, что и файл зависимостей
      • -v <Имя Файла Виртуальных Зависимостей>: Указывает имя файла виртуальных зависимостей (содержащего VDEPS-заявление) для поиска
      • -s <Пути Директорий Для Поиска>: Указывает пути директорий для поиска (содержащих VDEPS-заявления), несколько директорий разделены двоеточием * -i <Игнорировать_Директории>: Указывает имена директорий для игнорирования, несколько директорий разделены двоеточием
      • -g <Продолжать_Поиск_Директорий>: Указывает пути директорий для продолжения поиска, несколько директорий разделены двоеточием
        • Если текущая директория содержит файл зависимостей, и не указано Продолжать_Поиск_Директорий или текущая директория не входит в него, скрипт не будет продолжать поиск поддиректорий текущей директории
      • -l <Максимальная_Глубина_Уровней>: Устанавливает максимальное количество уровней в менюконфиге, 0 для плитки, 1 для двухуровневого, и т. д.
      • -w <Ключевые_Директории>: Устанавливает имена уровней для игнорирования в менюконфиге, несколько имен разделены двоеточием
        • Если имя директории в пути совпадает с установленным значением, уровни этого пути уменьшаются на один
      • -p <Префикс_Флага>: Устанавливает префикс для элемента конфигурации в автоматически сгенерированном файле Kconfig
        • Если пользователи запускают conf / mconf без префикса (CONFIG_=""), этот флаг должен быть установлен в 1
      • -u <Уникальные_пакеты>: Указывает пакеты, которые не имеют нативной компиляции, когда они являются зависимостями нативного пакета, и множественные имена, разделенные двоеточием
    • Параметры командной строки шага сборки Yocto 1 * -k <Путь к файлу Kconfig>: Указывает путь к автоматически сгенерированному файлу Kconfig
      • -t <Путь к целевому файлу>: Указывает путь к автоматически сгенерированному целевому файлу, который хранит имя пакета и список путей к исходным файлам
      • -c <Имя файла Kconfig для поиска>: Указывает имя файла Kconfig (содержащего конфигурацию) для поиска
        • Порядок поиска:
          • Файл с тем же именем, что и имя пакета, и суффиксом .bbconfig в той же директории, что и файл рецепта
          • Файл с тем же именем, что и имя пакета, и тем же суффиксом, что и файл Kconfig, в директории, указанной в рецепте приложения с помощью переменной EXTERNALSRC
          • Имя файла Kconfig в директории, указанной в рецепте приложения с помощью переменной EXTERNALSRC
      • -v <Имя файла зависимости для поиска>: Указывает имя файла зависимости (содержащего утверждение VDEPS) для поиска
      • -i <Игнорируемые директории>: Указывает имена игнорируемых директорий, несколько директорий разделены двоеточием
      • -l <Максимальная глубина уровня меню>: Устанавливает максимальное количество уровней менюconfig, 0 для плитки, 1 для двухуровневого меню, и т. д.
      • -w <Игнорируемые уровни меню>: Устанавливает имена игнорируемых уровней менюconfig, несколько имен разделены двоеточием
        • Если имя директории в пути совпадает с установленным значением, уровни этого пути уменьшаются на один * -p <Предварительное значение флага>: Устанавливает префикс элемента конфигурации в автоматически сгенерированном файле Kconfig.
        • Если пользователи запускают conf / mconf без префикса (опция: CONFIG_=""), этот флаг должен быть установлен в 1.
      • -u <Пользовательские слои>: Указывает пользовательские слои, несколько слоев разделены двоеточием.
        • Анализирует только зависимости пакетов, пакеты в пользовательских слоях будут анализировать зависимости, выбираться по умолчанию, поддерживать специальные зависимости и виртуальные зависимости.
  • Параметры командной строки шага сборки Yocto 2

    • -t <Путь к целевому файлу>: Указывает путь к автоматически сгенерированному целевому файлу, сгенерированному шагом 1.
    • -c <Путь к файлу Kconfig для поиска>: Указывает путь к файлу .config, сгенерированному командой make xxx_config.
    • -o <Путь к файлу рецепта вывода>: Указывает путь к файлу рецепта вывода, который хранит пакеты, установленные в rootfs.
    • -p <Путь к файлу патча/отмены патча>: Указывает путь к файлу патча/отмены патча, который хранит пакеты патча/отмены патча.
    • -i <Игнорируемые рецепты>: Указывает имена игнорируемых рецептов, несколько рецептов разделены двоеточием.

Зависимости обычного сборки

  • Правило зависимости: #DEPS(Makefile_Name) Target_Name(Other_Target_Names): Depend_Names

    Regex зависимости

  • Включённое правило зависимости: #INCDEPS: Subdir_Names ! [Regex включённой зависимости](. /scripts/bin/regex_incdeps. svg)* Описание правила * Makefile_Name: Скрипт Makefile для компиляции (может быть пустым), если он не пустой, make запускает указанный Makefile (make -f Makefile_Name) * Makefile должен содержать три цели all, clean и install * Имя Makefile может включать путь (например, слеш /), что позволяет непосредственно находить подпакеты в подпапках * Например: test1/ test2/wrapper. mk * Пользователи также могут использовать INCDEPS-заявление для продолжения поиска зависимых файлов в подпапках * Например: #INCDEPS: test1 test2/test22 * Подпапки поддерживают замену переменных окружения, например, ${ENV_BUILD_SOC} будет заменено значением переменной окружения ENV_BUILD_SOC * Target_Name: Идентификатор имени пакета * Ключевое слово ignore является специальным идентификатором, указывающим на отсутствие пакета, что используется для игнорирования поиска в текущей директории (#DEPS() ignore():) * Другие_Target_Names: Другие цели текущего пакета, несколько целей разделены пробелом (может быть пустым) * Игнорирует цели all, install, clean в Других_Target_Names * Ключевое слово prepare является специальной реальной целью, указывающей на выполнение make prepare перед make * Обычно используется для загрузки стандартной конфигурации в .config, когда .config отсутствует * Ключевое слово psysroot является специальной реальной целью, указывающей на выполнение make psysroot перед make * Использует sysroot под OUT_PATH вместо ENV_TOP_OUT * Ключевое слово release является специальной реальной целью, указывающей на выполнение make release при установке fakeroot rootfs * Эта цель не требует установки заголовков и статических библиотек * Когда цель release отсутствует, выполняется make install при установке в fakeroot rootfs * Ключевое слово union является специальной виртуальной целью, указывающей на несколько пакетов, использующих один Makefile * В этом случае цели prepare, all, install, clean, release и т.д. должны быть переименованы как <package_name>-xxx * Ключевое слово native является специальной виртуальной целью, указывающей на одновременное определение пакета для кросс-компиляции и пакета для локальной компиляции * Ключевое слово cache является специальной виртуальной целью, указывающей на поддержку механизма кэширования пакетом * Ключевое слово jobserver — это специальный виртуальный целевой объект, который указывает на многопоточное компилирование (ENV_BUILD_JOBS). * Makefile, содержащий команду make, не должен добавлять этот целевой объект, например, в Makefile драйвера. * subtarget1:subtarget2:. . . ::dep1:dep2:. . . — это специальный синтаксис, который явно указывает зависимости для дочерних целей. * Двойные двоеточия разделяют список дочерних целей и список зависимостей. * Одинарное двоеточие разделяет внутренние дочерние цели и внутренние зависимости, а список зависимостей может быть пустым. * Depend_Names: Идентификатор имени пакета зависимости, а несколько зависимостей разделены пробелом (может быть пустым). * Depend_Names поддерживает несколько строк с использованием \ в конце строки. Примечание: Идентификаторы (Target_Name / Depend_Names) могут содержать только строчные буквы, цифры и дефисы; для Other_Target_Names такие ограничения отсутствуют, допускается использование символа шаблона (%)* Команды обычного сборки

    • make <package>: Собирает указанный пакет с предварительной компиляцией зависимых пакетов
    • make <package>_single: Собирает только указанный пакет без предварительной компиляции зависимых пакетов
    • make <package>_<target>: Собирает указанный целевой пакет с предварительной компиляцией зависимых пакетов
    • make <package>_<target>_single: Собирает только указанный целевой пакет без предварительной компиляции зависимых пакетов

Примечание: Команды типа single существуют только в пакетах с зависимостями

Зависимости сборки Yocto

  • Зависимости сборки Yocto определяются в рецепте

    • DEPENDS: компиляционные зависимости
      • Примечание: Yocto использует некоторые команды хоста и может требовать указания native зависимости (<package>-native), например: bash-native
    • RDEPENDS:${PN}: запускаемые зависимости
      • Пакеты зависимостей, которые устанавливают общие библиотеки, должны быть указаны в RDEPENDS, иначе сборка завершится неудачей или зависимые пакеты не будут добавлены в rootfs
    • EXTRADEPS: дополнительные зависимости, экспортированные CBuild
      • Если EXTRADEPS содержит слабые зависимости, рецепт должен наследовать inherit weakdep
        • weakdep.bbclass анализирует .config в ENV_CFG_ROOT, устанавливает DEPENDS и RDEPENDS:${PN} в зависимости от того, выбран ли этот элемент или нет
    • PACKAGECONFIG: Динамически устанавливает зависимости пакетов, которые устанавливают pkg-config (xxx/usr/lib/pkgconfig/xxx.pc)### Виртуальные зависимости обычной/Yocto сборки
  • Правило виртуальной зависимости: #VDEPS(Тип_Виртуальной_Зависимости) Target_Name(Дополнительная_Информация): Depend_Names ! [Регулярное выражение для правила виртуальной зависимости](. /scripts/bin/regex_vdeps. svg)* Virtual_Type : Обязательное поле, тип виртуального пакета, на данный момент существует 4 типа

    • menuconfig : Указывает, что генерируется виртуальный пакет menuconfig, все пакеты в текущей директории (включая поддиректории) сильно зависят от этого пакета
    • config : Указывает, что генерируется виртуальный пакет config
    • menuchoice : Указывает, что генерируется виртуальный пакет choice, все пакеты в текущей директории (включая поддиректории) станут подпунктами этого пакета
    • choice : Указывает, что генерируется виртуальный пакет choice, все пакеты, перечисленные в Other_Infos, станут подпунктами этого пакета
  • Virtual_Name : Обязательное поле, идентификатор имени виртуального пакета

  • Other_Infos : Необязательное поле

    • Для всех типов, опциональный путь, начинающийся с /, указывает, что он действует на указанную поддиректорию вместо текущей директории
      • Входной путь может быть виртуальным, например: /virtual (virtual может быть любым словом), в этом случае, виртуальный элемент появляется в текущей директории вместо верхней директории
    • Для типа choice, пробел-разделенная последовательность пакетов становится подпунктами выбора, и первый пакет по умолчанию отмечен как выбранный
    • Для типа menuchoice, указанный пакет по умолчанию отмечен как выбранный* Depend_Names : Необязательное поле, список зависимостей, аналогичный Depend_Names в DEPS-заявке
    • Depend_Names поддерживает несколько строк с использованием \ в конце строки
    • Например, пользователи могут установить unselect для типов menuconfig и config Примечание: Виртуальные пакеты не участвуют в компиляции, но используются для организации и управления реальными пакетами. Обычная сборка и сборка Yocto имеют одинаковые правила виртуальной зависимости.### Специальная зависимость
  • Виртуальный пакет

    • *depname : Указывает, что этот зависимый пакет является виртуальным пакетом
      • После удаления *, оставшееся имя пакета может содержать специальные символы и будет продолжать разрешаться, например: *&&depname
        * Ключевые слова
    • finally : Указывает, что компиляция этого пакета происходит после всех остальных пакетов, обычно используется для генерации rootfs (Обычная сборка)
    • unselect : Указывает, что этот пакет не компилируется по умолчанию (default n), в противном случае он компилируется по умолчанию (default y)
    • nokconfig : Указывает, что этот пакет не содержит Kconfig
      • Когда в одном и том же каталоге находятся несколько пакетов, и только один из них содержит Kconfig, то этот пакет не должен устанавливать nokconfig, а другие пакеты должны это делать
    • kconfig : Указывает, что несколько пакетов используют один и тот же Kconfig, обычно, кросс-/native компиляционные пакеты одного и того же программного обеспечения используют один и тот же Kconfig
      * Специальный символ
    • ! depname : Указывает, что этот пакет и пакет depname конфликтуют, они не могут быть включены одновременно (depends on ! depname)
    • &depname или &&depname : Указывает, что этот пакет слабо / сильно выбирает пакет depname (imply depname / select depname)
      • & указывает, что при выборе этого пакета, пакет depname также автоматически выбирается, и пакет depname может быть вручную отменен
      • && указывает, что при выборе этого пакета, пакет depname также автоматически выбирается, и пакет depname не может быть вручную отменен
    • ? depname или ? ? depname : Указывает, что этот пакет слабо зависит от пакета depname (if . . endif)
      • ? указывает, что при выборе этого пакета, пакет depname может быть включен, если он доступен, иначе он будет пропущен` указывает, что пакет depname не устанавливает общие библиотеки (зависимости на этапе компиляции)
      • ? ? указывает, что пакет depname устанавливает общие библиотеки или . . . (зависимости на этапе компиляции и выполнения)
      • Слабая зависимость означает, что даже если пакет depname не выбран или не существует, текущий пакет также может быть выбран и скомпилирован
    • depa|depb или depa||depb : Указывает, что этот пакет слабо зависит от пакета depa или depb или . . . (depA||depB)
      • Слабая зависимость означает, что должен быть хотя бы один пакет depx, чтобы текущий пакет мог быть выбран и скомпилирован
      • Пропуск слова перед | неявно выводится с помощью предварительно построенного пакета или исходного пакета
        • Например: ||libtest неявно выводится как prebuild-libtest||libtest
      • Разница между | и || относится к ? * & ? : & можно использовать в сочетании с ? , это не требует определенного порядка комбинации и указывает на выбор и слабую зависимость
      • Например: &&? ? depname или ? ? &&depname указывает на слабую зависимость и сильный выбор, ? ? &depname или &? ? depname указывает на слабую зависимость и слабый выбор
    • & | : & можно использовать в сочетании с |, это указывает на выбор или и слабую зависимость
      • Подходит для выбора одного из предварительно построенных пакетов или исходного пакета с слабой зависимостью * Пропуск слова перед последним | неявно выводится как выбор либо предварительно построенного пакета, либо исходного пакета.
      • Например: &&||libtest неявно выводится как &&*build-libtest||prebuild-libtest||libtest.
        • Это означает, что первый виртуальный пакет выбран сильной зависимостью, а следующие два реальных пакета имеют слабую зависимость.
    • depname@condition или depname@@condition : Если условие установлено на y и depname выбран, этот пакет будет зависеть от пакета depname (обычное построение).
    • Дополнительные примечания :
      • Для обычного построения нет разницы между ? и ??, нет разницы между | и ||, нет разницы между @ и @@.
      • Для построения Yocto ? | @ только устанавливают DEPENDS, ?? || @@ устанавливают как DEPENDS, так и RDEPENDS:${PN}.
        * Переменная окружения
    • ENVNAME=val1,val2 : Указывает, что этот пакет зависит от переменной окружения ENVNAME, значение которой равно val1 или равно val2
    • ENVNAME!=val1,val2 : Указывает, что этот пакет зависит от переменной окружения ENVNAME, значение которой не равно val1 и не равно val2

Примечание: Специальные зависимости устанавливаются для Depend_Names в DEPS-выражении при обычном построении, переменная EXTRADEPS в рецепте при построении Yocto, и если EXTRADEPS содержит слабые зависимости, рецепт должен наследовать weakdep класс, и обработка слабых зависимостей зависит от .config в ENV_CFG_ROOT### Диаграмма зависимостей gen_depends_image.sh* Использование * Параметры скрипта: gen_depends_image.sh <package> <store_path> <package_list_file> <config_file> * package : Имя пакета * store_path : Путь к папке, куда будут сохранены сгенерированные изображения * package_list_file : Файл со списком пакетов, сгенерированный gen_build_chain.py (-a для обычного сбора, -t для сбора Yocto) * config_file : Путь к файлу .config * Команда: make <package>-deps* Сгенерированное описание картинки * Обычное построение * Твердая линия : Сильная зависимость * Пунктирная линия : Слабая зависимость * Двойная линия : Предварительное построение и srcbuild либо, либо патч и unpacth либо * Зелёная линия : Пакет выбран в .config * Красная линия : Пакет не выбран в .config * Цвет верхнего уровня пакета * Зелёный квадрат : Пакет выбран в .config * Красный квадрат : Пакет не выбран в .config * Построение Yocto * Зелёный квадрат : Пользовательский пакет, который выбран в .config * Красный квадрат : Пользовательский пакет, который не выбран в .config * Квадрат корзины : Пакет сообщества (слои не указаны в опции -u команды gen_build_chain.py)## Настройка окружения

Инициализация компиляционного окружения

  • Инициализация компиляционного окружения

    lengjing@lengjing:~/data/cbuild$ source scripts/build.env
    ============================================================
    ENV_BUILD_MODE   : внешний
    ENV_BUILD_JOBS   : -j8
    ENV_MAKE_FLAGS   : -s
    ENV_TOP_DIR      : /home/lengjing/data/cbuild
    ENV_MAKE_DIR     : /home/lengjing/data/cbuild/scripts/core
    ENV_TOOL_DIR     : /home/lengjing/data/cbuild/scripts/bin
    ENV_DOWN_DIR     : /home/lengjing/data/cbuild/output/mirror-cache/downloads
    ENV_CACHE_DIR    : /home/lengjing/data/cbuild/output/mirror-cache/build-cache
    ENV_MIRROR_URL   : http://127.0.0.1:8888
    ENV_TOP_OUT      : /home/lengjing/data/cbuild/output/noarch
    ENV_CFG_ROOT     : /home/lengjing/data/cbuild/output/noarch/config
    ENV_OUT_ROOT     : /home/lengjing/data/cbuild/output/noarch/objects
    ENV_INS_ROOT     : /home/lengjing/data/cbuild/output/noarch/sysroot
    ENV_DEP_ROOT     : /home/lengjing/data/cbuild/output/noarch/sysroot
    ENV_TOP_HOST     : /home/lengjing/data/cbuild/output/x86_64-native
    ENV_OUT_HOST     : /home/lengjing/data/cbuild/output/x86_64-native/objects
    ENV_INS_HOST     : /home/lengjing/data/cbuild/output/x86_64-native/sysroot
    ENV_DEP_HOST     : /home/lengjing/data/cbuild/output/x86_64-native/sysroot
    ============================================================
  • Инициализация окружения кросс-компиляции с использованием 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 : Определяет режим сборки: внешний, отдельный исходный код и выход сборки; внутренний, выход сборки в исходный код; yocto, метод сборки Yocto
    • При внешнем режиме выходной каталог сборки заменяет часть ENV_TOP_DIR исходного каталога пакета на ENV_OUT_ROOT / ENV_OUT_HOST
  • ENV_BUILD_SOC : Определяет SOC для кросс-компиляции, система сборки получает серию параметров, связанных с SOC, через скрипт process_machine.sh
  • 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 зеркала для исходного кода и кэша сборки
    • Пользователи могут использовать команду python -m http.server <port> для быстрого создания HTTP-сервера
      * 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 : Корневая глобальная директория зависимостей для нативного пакета

Примечание: bitbake не может напрямую использовать переменные окружения текущего shell в Yocto Build, поэтому пользовательские переменные окружения должны быть экспортированы из рецепта

Шаблон сборки

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

  • inc.env.mk используется как для сборки приложений, так и для сборки драйверов
  • В обычной сборке используется для установки выходной директории сборки, установки и экспорта окружения кросс-компиляции или локальной компиляции
  • В сборке Yocto выходная директория и окружение кросс-компиляции устанавливаются и экспортируются из рецептов

Функции шаблона окружения* $(call safe_copy,<options of cp>,<srcs and dst>) : Использует cp с блокировкой файла для предотвращения ошибок при одновременной установке нескольких целевых процессов в обычной сборке

  • $(call link_hdrs) : Автоматически устанавливает CFLAGS для поиска заголовочных файлов на основе переменной SEARCH_HDRS
  • $(call link_libs) : Автоматически устанавливает CFLAGS для поиска библиотек
  • $(call prepare_sysroot) : Подготавливает зависимое окружение sysroot в директории OUT_PATH в обычной сборке

Шаблон переменных окружения

  • PACKAGE_NAME : Имя пакета (соответствует Target_Name в DEPS-запросе, без -native)
  • PACKAGE_ID : Только для чтения, фактическое имя пакета, значение равно PACKAGE_NAME кросс-компиляционного пакета или $(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 для кросс-компиляции
  • OUT_PATH : Папка выходных данных

    * EXPORT_HOST_ENV : Установите значение в y, если кросс-компиляционный пакет зависит от нативных пакетов
  • BUILD_FOR_HOST : Если установлено значение y, указывает на нативную компиляцию
  • PREPARE_SYSROOT : Если установлено значение y, указывает на подготовку зависимости sysroot в OUT_PATH вместо ENV_TOP_OUT
  • LOGOUTPUT : Если установлено значение пустое, отображаются дополнительные сообщения компиляции, значение по умолчанию равно 1>/dev/null

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

  • inc.ins.mk используется как для компиляции приложений, так и для компиляции драйверов
  • Папки установки в основном соответствуют стандарту GNUInstallDirs
    • base_*dir и hdrdir не входят в стандарт GNUInstallDirs
    • Корневая папка установки равна $(INS_PREFIX)

Функции и цели шаблона установки

  • $(eval $(call install_obj,<ID>,<cp options>)): Генерирует правила Makefile для установки в указанную папку
    • ID: Имя папки без слова dir
    • Цель Makefile: install_<lowercase id>s
    • Переменная для указания файлов / папок для установки: INSTALL_<uppercase 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 |* По умолчанию используются директории
    • При компиляции приложений, исполняемые файлы, сгенерированные компиляцией, добавляются в переменную BIN_TARGETS, значение по умолчанию переменной INSTALL_BINARIES присваивается $(BIN_TARGETS)
    • При компиляции приложений, библиотеки, сгенерированные компиляцией, добавляются в переменную LIB_TARGETS, значение по умолчанию переменной INSTALL_LIBRARIES присваивается $(LIB_TARGETS) ```makefile INSTALL_BASE_BINARIES ?= $(INSTALL_BINARIES) INSTALL_BASE_BINS ?= $(INSTALL_BASE_BINARIES) INSTALL_BINS ?= $(INSTALL_BINARIES) INSTALL_BASE_LIBRARIES ?= $(INSTALL_LIBRARIES) INSTALL_BASE_LIBS ?= $(INSTALL_BASE_LIBRARIES) INSTALL_LIBS ?= $(INSTALL_LIBRARIES) INSTALL_HDRS ?= $(INSTALL_HEADERS)
  • $(eval $(call install_ext,<ID>,<cp options>)): Генерирует правила шаблонов Makefile для установки в указанную поддиректорию в указанной директории
    • ID: Имя директории без слова dir
    • Цель правила шаблона Makefile: install_<lowercase id>s_%, где % соответствует нижнему регистру букв и т.д.
    • Имя переменной для установки: INSTALL_<uppercase ID>S_<xxx>, где xxx совпадает с шаблоном в цели
      • Предыдущие элементы представляют файлы / папки для установки, а последний элемент (должен начинаться со слеша /) представляет место установки* Определенные правила шаблонов Makefile
    • Примечание: Правила шаблонов Makefile install_todir_xxx и install_tofile_xxx не определяются install_ext
      • install_todir_xxx: Устанавливает указанные файлы и папки в указанную поддиректорию в корневой директории установки
      • install_tofile_xxx: Устанавливает указанный файл в указанный файл в корневой директории установки | Имя директории | Директория установки | Имя переменной для установки | Цель паттерна Makefile | | --------------- | ----------------------------------- | ----------------------------- | ------------------------ | | includedir | /usr/include<указанное подпапку> | $(INSTALL_INCLUDES_<xxx>) | install_includes_% | | datadir | /usr/share<указанное подпапку> | $(INSTALL_DATAS_<xxx>) | install_datas_% | | sysconfdir | /etc<указанное подпапку> | $(INSTALL_SYSCONFS_<xxx>) | install_sysconfs_% | | | <указанное подпапку> | $(INSTALL_TODIR_<xxx>) | install_todir_% | | | <указанное файл> | $(INSTALL_TOFILE_<xxx>) | install_tofile_% |
  • Примеры правил шаблонов
    • Создайте 2 пустых файла testa и testb, и содержимое файла Makefile следующее: ```makefile INSTALL_DATAS_test = testa testb /testa/testb INSTALL_TODIR_test = testa testb /usr/local/bin INSTALL_TOFILE_testa = testa /etc/a.conf INSTALL_TOFILE_testb = testa /etc/b.conf

      all: install_datas_test install_todir_test install_tofile_testa install_tofile_testb include $(ENV_MAKE_DIR)/inc.ins.mk

    • Дерево файлов после выполнения make:

      sysroot
      ├── etc
      │   ├── a.conf
      │   └── b.conf
      └── usr
          ├── local
          │   └── bin
          │       ├── testa
          │       └── testb
          └── share
              └── testa
                  └── testb
                      ├── testa
                      └── testb

Шаблон приложения inc.app.mk

  • 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 будет <имя библиотеки>.<основная версия>
      • Soname может быть переопределено с помощью 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_PATH = src1 src2 src3
    • $(SRC_PATH) и $(SRC_PATH)/include также являются директориями заголовков для поиска
  • IGNORE_PATH: Игнорируемые имена директорий при поиске, значение по умолчанию .git scripts output
  • REG_SUFFIX: Расширения файлов исходных кодов для поиска, значение по умолчанию c cpp S
    • Значение может быть выбрано из c, $(CPP_SUFFIX) и $(ASM_SUFFIX)
      • CPP_SUFFIX: Расширения файлов C++ типа, значение по умолчанию cc cp cxx cpp CPP c++ C
      • ASM_SUFFIX: Расширения файлов ассемблерного типа, значение по умолчанию S s asm
    • Пользователи могут добавить поддержку для других расширений, например:
      • Добавить поддержку для cxx (cxx уже добавлен в CPP_SUFFIX)
        REG_SUFFIX = c cpp S cxx
        include $(ENV_MAKE_DIR)/inc.app.mk
      • Добавить поддержку для CXX (CXX не добавлен в CPP_SUFFIX)
        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: Все файлы исходных кодов, значение по умолчанию все файлы с расширением REG_SUFFIX в директории SRC_PATH * Если пользователи указывают SRCS, они также могут задать SRC_PATH, и IGNORE_PATH игнорируется
  • CFLAGS: Устанавливает глобальные флаги компиляции для gcc g++
  • AFLAGS: Устанавливает глобальные флаги ассемблирования для as
  • LDFLAGS: Устанавливает глобальные флаги линковки для gcc g++
  • DEBUG: При установке в y включаются флаги -O0 -g -ggdb### Шаблон для драйвера inc. mod. mk* inc.mod.mk используется для компиляции драйверов (внешних модулей Linux)

Часть Makefile шаблона драйвера (когда KERNELRELEASE пуст)

  • Цели части Makefile
    • modules: Компилирует драйвер
    • modules_clean: Очищает выходные данные компиляции
    • modules_install: Устанавливает модули ядра (*.ko)
      • Цель установки находится в директории $(INS_PREFIX)/lib/modules/<kernel_release>/extra/
    • symvers_install: Устанавливает файл символов Module.symvers, эта цель задана как зависимость для install_hdrs

  • Переменные части Makefile
    • MOD_MAKES: Пользователи могут указать некоторые сведения для компиляции модуля
    • KERNEL_SRC : Путь к исходному коду ядра Linux (обязательно)
    • KERNEL_OUT : Путь к выходным данным компиляции ядра Linux (обязательно при компиляции ядра Linux с make -O $(KERNEL_OUT))

Часть Kbuild шаблона драйвера (когда KERNELRELEASE имеет значение)

  • Цели части Kbuild
    • MOD_NAME: Имена модулей, которые могут быть несколькими именами модулей, разделенными пробелами

  • Переменные части Kbuild
    • IGNORE_PATH: Игнорируемые имена директорий при поиске, по умолчанию это .git scripts output

    • SRCS: Все файлы исходного кода, по умолчанию это все файлы с суффиксом REG_SUFFIX (*.c *.S) в директории $(src)

    • ccflags-y asflags-y ldflags-y: Параметры компиляции модуля ядра, сборки и линковки
      * Функции части Kbuild

    • $(call translate_obj,<source files>): Преобразует имя набора файлов исходного кода в формат, требуемый KBUILD, независимо от того, начинаются ли файлы с .o или нет.

    • $(call set_flags,<Flag Type>,<source files>,<value>): Устанавливает параметры компиляции для указанных файлов исходного кода.* Другие примечания

    • Если MOD_NAME содержит несколько имен модулей, пользователи должны заполнить объекты для каждого модуля, например:

      MOD_NAME = mod1 mod2
      mod1-y = a1.o b1.o c1.o
      mod2-y = a2.o b2.o c2.o
    • При использовании разделения исходного кода и выходных данных компиляции, файл inc.mod.mk должен сначала скопировать Kbuild или Makefile в директорию OUT_PATH.

    • Если следующий патч в scripts/Makefile.modpost ядра Linux применён, операцию копирования можно пропустить.

      • Этот патч был включён в версию linux-5.19 и в самую последнюю версию LTS Linux.
      -include $(if $(wildcard $(KBUILD_EXTMOD)/Kbuild), \
      -             $(KBUILD_EXTMOD)/Kbuild, $(KBUILD_EXTMOD)/Makefile)
      +include $(if $(wildcard $(src)/Kbuild), $(src)/Kbuild, $(src)/Makefile)

Шаблон конфигурации inc.conf.mk

  • inc.conf.mk предоставляет метод конфигурации с использованием Konfig.

Цели шаблона конфигурации* loadconfig: Загружает стандартную конфигурацию, указанную DEF_CONFIG, если файл .config не существует

  • defconfig: Восстанавливает стандартную конфигурацию, указанную DEF_CONFIG

  • menuconfig: Открывает графическое окно конфигурации

  • cleanconfig: Очищает конфигурацию и выходные данные kconfig

  • xxx_config: Загружает специальную конфигурацию xxx_config из CONFIG_SAVE_PATH как текущую конфигурацию

  • xxx_saveconfig: Сохраняет текущую конфигурацию в xxx_config из CONFIG_SAVE_PATH

  • xxx_defconfig: Загружает специальную конфигурацию xxx_defconfig из CONFIG_SAVE_PATH как текущую конфигурацию

  • xxx_savedefconfig: Сохраняет текущую конфигурацию в xxx_defconfig из CONFIG_SAVE_PATH#### Переменные шаблона конфигурации

  • OUT_PATH: Путь вывода конфигурации, оставьте его по умолчанию

  • CONF_SRC: Исходная директория проекта kconfig, её значение по умолчанию $(ENV_TOP_DIR)/scripts/kconfig

  • CONF_PATH: Директория установки инструментов kconfig

  • CONF_PREFIX: Устанавливает переменные, которые используются при выполнении conf/mconf, в основном следующие два параметра:

    • srctree=<path_name> : Относительная директория команды source в файлах Kconfig, если srctree не указан, по умолчанию относительная директория — это директория, где выполняются conf/mconf
    • CONFIG_="<prefix>" : Префикс элементов конфигурации в автоматически сгенерированном .config и config.h, если CONFIG_ не указан, по умолчанию префикс — это CONFIG_; если CONFIG_="", префикс в имени элемента отсутствует.
  • CONF_HEADER: Устанавливает макрос включения #ifndef xxx ... #define xxx ... #endif, используемый в автоматически сгенерированном config.h, значение по умолчанию — __<upper of $(PACKAGE_NAME)>_CONFIG_H__

    • Файл config.h по умолчанию не содержит макрос включения, он добавляется командой sed
  • KCONFIG: Файл параметров конфигурации, значение по умолчанию — Kconfig

  • CONF_SAVE_PATH: Директория, где получается и сохраняется файл конфигурации, значение по умолчанию — директория config в пакете

  • CONF_APPEND_CMD: Добавляет команды для выполнения при изменении конфигурации

Проект scripts/kconfig* Исходный код полностью взят из scripts/kconfig linux-5.18

  • CBuild добавляет дополнительную поддержку CONFIG_PATH AUTOCONFIG_PATH AUTOHEADER_PATH, которые изначально передаются как переменные окружения

Кэш сети и слой OSS

  • Только для обычного сборки

Загрузка fetch_package.sh

  • Использование: fetch_package.sh <метод> <url> <пакет> [outdir] [outname]
    • метод: Метод загрузки, в настоящее время поддерживаются только 4 метода:
      • tar: Пакет загружается с помощью curl и распаковывается с помощью tar, расширение файла пакета может быть tar.gz, tar.bz2, tar.xz, tar и т.д.
      • zip: Пакет загружается с помощью curl и распаковывается с помощью unzip, расширение файла пакета может быть gz, zip и т.д.
      • git: Пакет загружается с помощью git clone
      • svn: Пакет загружается с помощью svn checkout * git: Пакет загружается с помощью curl из файла $package-git-xxx.tar.gz на зеркальном сервере, или загружается с помощью git clone
      • svn: Пакет загружается с помощью curl из файла $package-svn-xxx.tar.gz на зеркальном сервере, или загружается с помощью svn checkout
    • url: URL для загрузки
      • tar/zip: Лучше всего указать md5 одновременно, например:
        • https://xxx/xxx.tar.xz;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
    • пакет: Имя сохраняемого файла для tar / zip, или имя сохраняемой директории для git / svn, и путь сохранения ENV_DOWN_DIR
    • outdir: Путь для распаковки или копирования
    • outname: Имя папки пакета в outdir
    • Примечание: fetch_package.sh предпочитает загружать пакет с помощью зеркального URL, указанного в ENV_MIRROR_URL, вместо оригинального URL
    • Примечание: Когда не указаны outdir и outname, пакет загружается, но не распаковывается или копируется в выходной путьПримечание: fetch_package.sh предпочитает загружать пакет с помощью зеркального URL, указанного в ENV_MIRROR_URL, вместо оригинального URL.

Скрипт исправления exec_patch.sh

  • Использование: exec_patch.sh <метод> <patch_srcs> <patch_dst>

    • метод: Есть только два значения: patch для применения исправлений, unpatch для удаления исправлений
    • patch_srcs: Путь к файлам или директориям с исправлениями
    • patch_dst: Путь к исходному коду для применения исправлений
      * Расширение: Выберите, нужно ли применять патч или нет
    • Создает два новых пакета: патч-пакет (<пакет для патча>-patch-<ID>) и не-патч-пакет (<пакет для патча>-unpatch-<ID>)
    • Исходный пакет слабо зависит от этих двух пакетов, устанавливает xxx-patch-xxx|xxx-unpatch-xxx в Depend_Names для DEPS-заявления для исходного пакета
    • Создает виртуальный пакет #VDEPS(выбор) xxx-patch-xxx-выбор(xxx-unpatch-xxx xxx-patch-xxx):
    • Все патч/не-патч пакеты используют один и тот же файл Makefile следующим образом:
    PATCH_SCRIPT        := $(ENV_TOOL_DIR)/exec_patch.sh
    PATCH_PACKAGE       := xxx  # имя пакета для патча
    PATCH_TOPATH        := xxx  # папка пакета для патча
    
    PATCH_FOLDER        := xxx  # папка патчей, где хранятся патчи
    PATCH_NAME_xxx      := 0001-xxx.patch # ID пакета патчей (xxx)
    PATCH_NAME_yyy      := 0001-yyy.patch 0002-yyy.patch # ID другого пакета патчей (yyy)
    
    $(PATCH_PACKAGE)-unpatch-all:
    	@$(PATCH_SCRIPT) unpatch $(PATCH_FOLDER) $(PATCH_TOPATH)
    	@echo "Unpatch $(PATCH_TOPATH) Done."
    
    $(PATCH_PACKAGE)-patch-%-all:
    	@$(PATCH_SCRIPT) patch "$(patsubst %,$(PATCH_FOLDER)/%,$(PATCH_NAME_$(patsubst $(PATCH_PACKAGE)-patch-%-all,%,$@)))" $(PATCH_TOPATH)
    	@echo "Build $(patsubst %-all,%,$@) Done."
    ```    $(PATCH_PACKAGE)-unpatch-%-all:
    	@$(PATCH_SCRIPT) unpatch "$(patsubst %,$(PATCH_FOLDER)/%,$(PATCH_NAME_$(patsubst $(PATCH_PACKAGE)-unpatch-%-all,%,$@)))" $(PATCH_TOPATH)
    	@echo "Сборка $(patsubst %-all,%,$@) завершена."
    
    %-clean:
    	@
    
    %-install:
    	@

Кэш скрипт process_cache.sh

  • Использование: Запускает process_cache.sh -h

  • Принцип работы кэша

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

Шаблон кэша inc.cache.mk#### Переменные шаблона кэша* Переменные для загрузки и компиляции

* FETCH_METHOD    : Выбранная методом загрузки из `tar` `zip` `git` `svn`, её значение по умолчанию — `tar`
* SRC_URLS        : URL-ы загрузки, они содержат `url` `branch` `rev` `tag` `md5`, значение по умолчанию генерируется в соответствии с следующими переменными:
    * SRC_URL     : чистый URL
    * SRC_BRANCH  : ветка для `git`
    * SRC_TAG     : тег для `git`
    * SRC_REV     : ревизия для `git` или `svn`
    * SRC_MD5     : md5 для `tar` или `zip`
* SRC_PATH        : Путь к исходному коду, значение по умолчанию — `$(OUT_PATH)/$(SRC_DIR)`
* OBJ_PATH        : Путь к выходным файлам компиляции, значение по умолчанию — `$(OUT_PATH)/build`
* INS_PATH        : Корневой путь установки, значение по умолчанию — `$(OUT_PATH)/image`
* INS_SUBDIR      : Подпапка установки, значение по умолчанию — `/usr`, поэтому фактический путь установки — `$(INS_PATH)$(INS_SUBDIR)`
* MAKES           : Команда компиляции, значение по умолчанию — `ninja $(ENV_BUILD_JOBS) $(MAKES_FLAGS)` для meson, `make $(ENV_BUILD_JOBS) $(ENV_MAKE_FLAGS) $(MAKES_FLAGS)` для остальных
    * MAKES_FLAGS : Пользователи могут задать дополнительные флаги компиляции<br>* Переменные для обработки кэша
 * CACHE_SRCFILE   : Имя файла или директории для загрузки пакета, значение по умолчанию — `$(SRC_NAME)`
     * Для локального пакета это значение не нужно устанавливать
     * Если установлены атрибуты загрузки, значение по умолчанию — пустая строка
 * CACHE_OUTPATH   : Корневая директория для вывода, значение по умолчанию — `$(OUT_PATH)`
 * CACHE_INSPATH   : Корневая директория для установки, значение по умолчанию — `$(INS_PATH)`
 * CACHE_GRADE     : Число уровня кэша, которое определяет префикс файла кэша компиляции, значение по умолчанию — 2
     * Обычно существует четыре уровня кэша: `soc_name` `cpu_name` `arch_name` `cpu_family`
         * Например: Если soc — v9 (cortex-a55), то уровни кэша будут `v9 cortex-a55 armv8-a aarch64`
 * CACHE_CHECKSUM  : Дополнительные файлы и директории для проверки, по умолчанию в значение добавляется файл `mk. deps`
     * Директория поддерживает следующий синтаксис: `<поисковые директории>:<поисковые строки>:<игнорируемые директории>:<игнорируемые строки>`, подэлементы могут быть разделены вертикальной чертой `|` :
         * Например: `"srca|srcb:*. c|*. h|Makefile:test:*. o|*. d"`, `"src:*. c|*. h|*. cpp|*. hpp"`
 * CACHE_DEPENDS   : Зависимости пакета, значение по умолчанию — пустая строка (автоматически анализируются зависимости)
     * Если у пакета нет зависимостей, лучше установить значение на `none`
 * CACHE_APPENDS   : Дополнительные строки для проверки, такие как динамические конфигурации    * CACHE_URL       : URL для загрузки, значение по умолчанию — `[$(FETCH_METHOD)]$(SRC_URLS)` при загрузке пакета в скрипте
 * CACHE_VERBOSE   : Генерировать ли файл лога, значение по умолчанию — `1`(генерирует лог), файл лога — `$(CACHE_OUTPATH)/$(CACHE_PACKAGE)-cache.log` #### Функции шаблона кэша
  • do_fetch: Получает пакет из интернета или зеркального сервера, а затем извлекает его в $(OUT_PATH)
  • do_patch: Применяет патч к пакету, переменная PATCH_FOLDER должна быть установлена перед этим
  • do_compile: Выполняет компиляцию
    • Если переменная SRC_URL установлена, задача do_fetch автоматически выполнится
    • Если переменная PATCH_FOLDER установлена, задача do_patch автоматически выполнится
    • Если функция do_prepend установлена, она выполнится перед командой MAKES
    • Если переменная COMPILE_TOOL установлена, она предоставляет следующие методы компиляции:
      • Если значение установлено на configure, выполнится команда configure перед командой MAKES
        • CONFIGURE_FLAGS: Пользователи могут установить дополнительные флаги для команды configure
        • CROSS_CONFIGURE: Только для чтения, флаги кросс-компиляции для команды configure
      • Если значение установлено на cmake, выполнится команда cmake перед командой MAKES
        • CMAKE_FLAGS: Пользователи могут установить дополнительные флаги для команды cmake
        • CROSS_CMAKE: Только для чтения, флаги кросс-компиляции для команды cmake
      • Если значение установлено на meson, выполнится команда meson перед командой MAKES
        • MESON_FLAGS: Пользователи могут установить дополнительные флаги для команды meson
        • do_meson_cfg: Meson использует ini-файл для настройки кросс-компиляции, эта функция изменяет стандартную конфигурацию * MESON_WRAP_MODE: Устанавливает режим обёртки, его стандартное значение --wrap-mode=nodownload (предотвращает загрузку зависимых пакетов Meson).
        • MESON_LIBDIR: Устанавливает libdir, его стандартное значение --libdir=$(INS_PATH)$(INS_SUBDIR)/lib (предотвращает установку библиотек в xxx/lib/x86_64-linux-gnu/).
    • Если функция do_prepend установлена, она выполнится после команды MAKES.
  • do_clean: Выполняет очистку.
  • do_install: Выполняет установку.
    • Если функция do_install_append установлена, она выполнится в конце цели install.
  • do_check: Проверяет, соответствует ли кэш.
    • Если возвращаемая строка содержит MATCH, это означает, что кэш соответствует.
    • Если возвращаемая строка содержит ERROR, это означает, что функция завершилась неудачей.
  • do_pull: Извлекает кэш в $(ENV_CACHE_DIR) и извлекает кэш в $(OUT_PATH), если $(INS_PATH) не существует.
  • do_push: Загружает кэш в $(ENV_CACHE_DIR).
  • do_setforce: Устанавливает флаг принудительной компиляции.
  • do_set1force: Устанавливает флаг одноразовой принудительной компиляции, следующая компиляция будет обычной.
  • do_unsetforce: Удаляет флаг принудительной компиляции.

Цели шаблона кэша

 * all / clean / install: Необходимые цели, предоставляемые шаблоном.
     * Если переменная `USER_DEFINED_TARGET` не установлена в `y`, будет использоваться `all / clean / install` цели, предоставляемые шаблоном.
 * psysroot: Подготавливает зависимый sysroot в `OUT_PATH` вместо `ENV_TOP_OUT`.
 * srcbuild: Компилирует без механизма кэширования.    * cachebuild: Компилирует с использованием механизма кэширования
 * dofetch: Только загружает пакет из интернета или зеркального сервера
 * setforce: Устанавливает флаг принудительной компиляции
 * set1force: Устанавливает одноразовый флаг принудительной компиляции
 * unsetforce: Удаляет флаг принудительной компиляцииПримечание: При компиляции OSS пакетов из исходного кода мы обычно добавляем `cache` `psysroot` в `Other_Target_Names` DEPS-заявления, что означает использование механизма кэширования для ускорения перекомпиляции, а зависимый sysroot находится в `OUT_PATH` вместо `ENV_TOP_OUT` для предотвращения автоматического добавления необъявленных зависимых пакетов.

Компиляция OSS слоя

  • Количество OSS пакетов увеличивается, и в настоящее время их более 50
  • Команды компиляции:
    • make time_statistics: Компилирует все пакеты по одному, и считает время компиляции каждого пакета
      • Каждый OSS пакет в файле статистики времени имеет три строки: первая строка для подготовки sysroot для зависимостей, вторая строка для компиляции, и третья строка для установки в глобальный sysroot
    • make: Многопоточная компиляция всех пакетов
    • make all_fetchs: Только загружает исходный код всех кэшируемых пакетов по одному
    • make all_caches: Загружает и компилирует все кэшируемые пакеты по одному
      * Компилирует кросс-компиляционный инструментарий, например cortex-a53
lengjing@lengjing:~/data/cbuild$ source scripts/build.env cortex-a53
...
lengjing@lengjing:~/data/cbuild$ make -C scripts/toolchain
make: вход в каталог '/home/lengjing/data/cbuild/scripts/toolchain'
make[1]: вход в каталог '/home/lengjing/data/cbuild/scripts/toolchain'
/home/lengjing/data/cbuild/scripts/bin/fetch_package.sh tar "http://ftp.gnu.org/gnu/gmp/gmp-6.2.1.tar.xz" gmp-6.2.1.tar.xz /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs gmp-6.2.1
curl http://ftp.gnu.org/gnu/gmp/gmp-6.2.1.tar.xz to /home/lengjing/data/cbuild/output/mirror-cache/downloads/gmp-6.2.1.tar.xz
untar /home/lengjing/data/cbuild/output/mirror-cache/downloads/gmp-6.2.1.tar.xz to /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs
/home/lengjing/data/cbuild/scripts/bin/fetch_package.sh tar "http://ftp.gnu.org/gnu/mpfr/mpfr-4.1.1.tar.xz" mpfr-4.1.1.tar.xz /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs mpfr-4.1.1
curl http://ftp.gnu.org/gnu/mpfr/mpfr-4.1.1.tar.xz to /home/lengjing/data/cbuild/output/mirror-cache/downloads/mpfr-4.1.1.tar.xz
untar /home/lengjing/data/cbuild/output/mirror-cache/downloads/mpfr-4.1.1.tar.xz to /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs
/home/lengjing/data/cbuild/scripts/bin/fetch_package.sh tar "http://ftp.gnu.org/gnu/mpc/mpc-1.3.1.tar.gz" mpc-1.3.1.tar.gz /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs mpc-1.3.1
curl http://ftp.gnu.org/gnu/mpc/mpc-1.3.1.tar.gz to /home/lengjing/data/cbuild/output/mirror-cache/downloads/mpc-1.3.1.tar.gz
untar /home/lengjing/data/cbuild/output/mirror-cache/downloads/mpc-1.3.1.tar.gz to /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs
/home/lengjing/data/cbuild/scripts/bin/exec_patch.sh patch patch/mpc /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs/mpc-1.3.1
patching file src/mpc.h
Patch patch/mpc/0001-mpc-Fix-configuring-gcc-failed
```патч к /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs/mpc-1. 3. 1 завершен.
     /home/lengjing/data/cbuild/scripts/bin/fetch_package. sh tar "http://libisl. sourceforge. io/isl-0. 25. tar. xz" isl-0. 25. tar. xz /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs isl-0. 25
     ```xz /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs isl-0. 25
      curl http://libisl. sourceforge. io/isl-0. 25. tar. xz к /home/lengjing/data/cbuild/output/mirror-cache/downloads/isl-0. 25. tar. xz
      untar /home/lengjing/data/cbuild/output/mirror-cache/downloads/isl-0. 25. tar. xz к /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs
      /home/lengjing/data/cbuild/scripts/bin/fetch_package. sh tar "http://cdn. kernel. org/pub/linux/kernel/v5. x/linux-5. 15. 88. tar. xz" linux-5. 15. 88. tar. xz /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs linux-5. 15. 88
      curl http://cdn. kernel. org/pub/linux/kernel/v5. x/linux-5. 15. 88. tar. xz к /home/lengjing/data/cbuild/output/mirror-cache/downloads/linux-5. 15. 88. tar. xz
      untar /home/lengjing/data/cbuild/output/mirror-cache/downloads/linux-5. 15. 88. tar. xz к /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs
      /home/lengjing/data/cbuild/scripts/bin/fetch_package. sh tar "http://ftp. gnu. org/gnu/binutils/binutils-2. 40. tar. xz" binutils-2. 40. tar. xz /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs binutils-2. 40
      curl http://ftp. gnu. org/gnu/binutils/binutils-2. 40. tar. xz к /home/lengjing/data/cbuild/output/mirror-cache/downloads/binutils-2. 40. tar. xz
      untar /home/lengjing/data/cbuild/output/mirror-cache/downloads/binutils-2. 40. tar. xz к /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs
      /home/lengjing/data/cbuild/scripts/bin/fetch_package. sh tar "http://ftp. gnu. org/gnu/gcc/gcc-12. 2. 0/gcc-12. 2. 0. tar. xz" gcc-12. 2. 0. tar. xz /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs gcc-12. 2. 0
      curl http://ftp. gnu. org/gnu/gcc/gcc-12. 2. 0/gcc-12. 2. 0. tar. xz к /home/lengjing/data/cbuild/output/mirror-cache/downloads/gcc-12. 2. 0. tar. xz
      untar /home/lengjing/data/cbuild/output/mirror-cache/downloads/gcc-12. 2. 0. tar. xz к /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcsxz to /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs
      sed -i 's@print-multi-os-directory@print-multi-directory@g' \
          `find /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs/gcc-12.2.0 -name configure -o -name configure.ac -o -name Makefile.in | xargs`
      /home/lengjing/data/cbuild/scripts/bin/fetch_package.sh tar "http://ftp.gnu.org/gnu/glibc/glibc-2.36.tar.xz" glibc-2.36.tar.xz /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs glibc-2.36
      curl http://ftp.gnu.org/gnu/glibc/glibc-2.36.tar.xz to /home/lengjing/data/cbuild/output/mirror-cache/downloads/glibc-2.36.tar.xz
      untar /home/lengjing/data/cbuild/output/mirror-cache/downloads/glibc-2.36.tar.xz to /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs
      /home/lengjing/data/cbuild/scripts/bin/fetch_package.sh tar "http://ftp.gnu.org/gnu/gdb/gdb-12.1.tar.xz" gdb-12.1.tar.xz /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs gdb-12.1
      curl http://ftp.gnu.org/gnu/gdb/gdb-12.1.tar.xz to /home/lengjing/data/cbuild/output/mirror-cache/downloads/gdb-12.1.tar.xz
      untar /home/lengjing/data/cbuild/output/mirror-cache/downloads/gdb-12.1.tar.xz to /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs
      . /output/toolchain/cortex-a53-toolchain-gcc12.2.0-linux5.15/bin/aarch64-linux-gnu-gcc -v
     Используемые встроенные спецификации.
     COLLECT_GCC=. /output/toolchain/cortex-a53-toolchain-gcc12.2.0-linux5.15/bin/aarch64-linux-gnu-gcc
     COLLECT_LTO_WRAPPER=/home/lengjing/data/cbuild/output/toolchain/cortex-a53-toolchain-gcc12.2.0-linux5.15/libexec/gcc/aarch64-linux-gnu/12.2.0/lto-wrapper
     Цель: aarch64-linux-gnu
     Конфигурировано с: /home/lengjing/data/cbuild/output/x86_64-native/objects/scripts/toolchain/srcs/gcc-12.2.0/configure --target=aarch64-linux-gnu --prefix=/home/lengjing/data/cbuild/output/toolchain/cortex-a53-toolchain-gcc12.2.0-linux5.15 --with-gmp=/home/lengjing/data/cbuild/output/toolchain/cortex-a53-toolchain-gcc12.2.0-linux5.15/host --with-mpfr=/home/lengjing/data/cbuild/output/toolchain/cortex-a53-toolchain-gcc12.2.0-linux5.15/host --with-mpc=/home/lengjing/data/cbuild/output/toolchain/cortex-a53-toolchain-gcc12.2.0-linux5.15/host15/host --with-isl=/home/lengjing/data/cbuild/output/toolchain/cortex-a53-toolchain-gcc12.2.0-linux5.15/host --with-sysroot=/home/lengjing/data/cbuild/output/toolchain/cortex-a53-toolchain-gcc12.2.0-linux5.15/aarch64-linux-gnu/libc --with-build-sysroot=/home/lengjing/data/cbuild/output/toolchain/cortex-a53-toolchain-gcc12.2.0-linux5.15/aarch64-linux-gnu/libc --with-toolexeclibdir=/home/lengjing/data/cbuild/output/toolchain/cortex-a53-toolchain-gcc12.2.0-linux5.15/aarch64-linux-gnu/libc/lib --enable-languages=c,c++ --enable-shared --enable-threads=posix --enable-checking=release --with-arch=armv8-a --with-cpu=cortex-a53 --disable-bootstrap --disable-multilib --enable-multiarch --enable-nls --without-included-gettext --enable-clocale=gnu --enable-lto --enable-linker-build-id --enable-gnu-unique-object --enable-libstdcxx-debug --enable-libstdcxx-time=yes
     Модель потока: posix
     Поддерживаемые алгоритмы сжатия LTO: zlib zstd
     gcc версии 12.2.0 (GCC)
     lengjing@lengjing:~/data/cbuild$ ls output/mirror-cache/build-cache/
     x86_64--cortex-a53-toolchain-gcc12.2.0-linux5.15-native--8ec20b3593ccaf0a87712ade12d00de6.tar.gz
     ```* После очистки всех загруженных пакетов, подсчитывает время компиляции каждого пакета с выбором следующих пакетов:
     * busybox: Конфигурируется с помощью menuconfig
     * cjson: Компилируется с помощью CMake
     * libpcap: Компилируется с помощью Autotools
     * ljson: Компилируется с помощью пользовательского Makefile
     * lua: Компилируется с применённым патчем
     * ncurses: Компилируется с зависимостью от пакета native-compilation
     * tcpdump: Компилируется с зависимостью от libpcap
     ```sh
     lengjing@lengjing:~/data/cbuild$ rm -rf output/cortex-a53 output/mirror-cache/downloads
     . . .
     lengjing@lengjing:~/data/cbuild$ make test_config
     . . .
     lengjing@lengjing:~/data/cbuild$ make time_statistics
     Generate /home/lengjing/data/cbuild/output/cortex-a53/config/Kconfig OK.
     Generate /home/lengjing/data/cbuild/output/cortex-a53/config/auto.mk OK.
     Generate /home/lengjing/data/cbuild/output/cortex-a53/config/DEPS OK.    curl http://www.busybox.net/downloads/busybox-1.35.0.tar.bz2 to /home/lengjing/data/cbuild/output/mirror-cache/downloads/busybox-1.35.0.tar.bz2
    untar /home/lengjing/data/cbuild/output/mirror-cache/downloads/busybox-1.35.0.tar.bz2 to /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/busybox
    /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/busybox/busybox-1.35.0/applets/usage.c: In function 'main':
    /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/busybox/busybox-1.35.0/applets/usage.c:52:3: warning: ignoring return value of 'write', declared with attribute warn_unused_result [-Wunused-result]
    . . .
    Push busybox Cache to /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
    Build busybox Done.
    Install busybox Done.
    curl http://github.com/DaveGamble/cJSON/archive/refs/tags/v1.7.15.tar.gz to /home/lengjing/data/cbuild/output/mirror-cache/downloads/cJSON-1.7.15.tar.gz
    untar /home/lengjing/data/cbuild/output/mirror-cache/downloads/cJSON-1.7.15.tar.gz to /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/cjson
    Push cjson Cache to /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
    Build cjson Done.
    Install cjson Done.
    curl http://www.tcpdump.org/release/libpcap-1.10.1.tar.gz to /home/lengjing/data/cbuild/output/mirror-cache/downloads/libpcap-1.10.1.tar.gz
    untar /home/lengjing/data/cbuild/output/mirror-cache/downloads/libpcap-1.10.1.tar.gz to /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/libpcap
    Push libpcap Cache to /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
    Build libpcap Done.
    Install libpcap Done.
    git clone https://github.com/lengjingzju/json.git to /home/lengjing/data/cbuild/output/mirror-cache/downloads/ljson
    Cloning into '/home/lengjing/data/cbuild/output/mirror-cache/downloads/ljson'. . .
    remote: Enumerating objects: 39, done.
    remote: Counting objects: 100% (2/2), done.
    remote: Compressing objects: 100% (2/2), done.
    remote: Total 39 (delta 1), reused 0 (delta 0), pack reused 37
    Receiving objects: 100% (39/39), done.     копирование /home/lengjing/data/cbuild/output/mirror-cache/downloads/ljson в /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/ljson
      Перенос кэша ljson в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
      Сборка ljson завершена.
      Установка ljson завершена.
      curl http://www.lua.org/ftp/lua-5.4.4.tar.gz в /home/lengjing/data/cbuild/output/mirror-cache/downloads/lua-5.4.4.tar.gz
      распаковка /home/lengjing/data/cbuild/output/mirror-cache/downloads/lua-5.4.4.tar.gz в /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/lua
      исправление файла Makefile
      исправление файла src/Makefile
      Применение патча /home/lengjing/data/cbuild/oss/lua/patch/0001-lua-Support-dynamic-library-compilation.patch к /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/lua/lua-5.4.4 завершено.
      исправление файла src/lparser.c
      Применение патча /home/lengjing/data/cbuild/oss/lua/patch/CVE-2022-28805.patch к /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/lua/lua-5.4.4 завершено.
      Перенос кэша lua в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
      Сборка lua завершена.
      Установка lua завершена.
      Установка lua завершена.
      распаковка /home/lengjing/data/cbuild/output/mirror-cache/downloads/ncurses-6.3.tar.gz в /home/lengjing/data/cbuild/output/x86_64-native/objects/oss/ncurses
      configure: ВНИМАНИЕ: Это определение применимо только к библиотеке многобайтовых символов
      .  .  .
      Перенос кэша ncurses-native в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
      Сборка ncurses-native завершена.
      Установка ncurses-native завершена.
      Установка ncurses-native завершена.
      распаковка /home/lengjing/data/cbuild/output/mirror-cache/downloads/ncurses-6.3.tar.gz в /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/ncurses
      configure: ВНИМАНИЕ: Если вы хотели установить тип --build, не используйте --host.
      .  .  .     Перенос кэша ncurses в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
      Сборка ncurses завершена.
      Установка ncurses завершена.
      Установка libpcap завершена.
      curl http://www.tcpdump.org/release/tcpdump-4.99.1.tar.gz в /home/lengjing/data/cbuild/output/mirror-cache/downloads/tcpdump-4.99.1.tar.gz
      распаковать /home/lengjing/data/cbuild/output/mirror-cache/downloads/tcpdump-4.99.1.tar.gz в /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/tcpdump
      конфигурация: ВНИМАНИЕ: использование кросс-инструментов, не префиксированных хост-триплетом
      конфигурация: ВНИМАНИЕ: pcap/pcap-inttypes.h: принят компилятором, отклонен препроцессором!
      конфигурация: ВНИМАНИЕ: pcap/pcap-inttypes.h: продолжение работы с результатом компилятора
      Отправить кэш tcpdump в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
      Сборка tcpdump завершена.
      Установка tcpdump завершена.
      Сборка rootfs завершена.
      Установка пакетов из /home/lengjing/data/cbuild/output/cortex-a53/sysroot
      Установка busybox завершена.
      Установка Glibc цели из /home/lengjing/data/cbuild/output/toolchain/cortex-a53-toolchain-gcc12.2.0-linux5.15/aarch64-linux-gnu/libc
      Сборка завершена!
     lengjing@lengjing:~/data/cbuild$ cat output/cortex-a53/config/time_statistics
     real	user	sys	package
     0.04	0.04	0.00	deps
     0.04	0.04	0.01	busybox
     23.77	77.62	16.90	busybox
     0.01	0.00	0.00	busybox
     0.06	0.05	0.01	cjson
     4.92	1.71	0.47	cjson
     0.00	0.00	0.00	cjson
     0.05	0.04	0.01	libpcap
     14.59	8.47	1.15	libpcap
     0.01	0.00	0.00	libpcap
     0.05	0.05	0.00	ljson
     4.23	1.16	0.09	ljson
     0.00	0.00	0.00	ljson
     0.06	0.05	0.00	lua
     7.93	6.59	0.41	lua
     0.00	0.00	0.00	lua
     0.06	0.05	0.01	ncurses-native
     30.24	65.82	12.07	ncurses-native
     0.08	0.01	0.06	ncurses-native
     0.08	0.00	0.07	ncurses-native_install
     0.17		0.08		0.09		ncurses
     31.85		107.68		18.63		ncurses
     0.08		0.01		0.06		ncurses
     0.01		0.00		0.00		libpcap_install
     0.07		0.06		0.01		tcpdump
     13.14		10.84		3.02		tcpdump
     0.01		0.00		0.00		tcpdump
     0.00		0.00		0.00		rootfs
     1.17		0.53		0.44		rootfs
     132.74		281.01		53.54		total_time
     ```* Перекомпиляции, результат получен напрямую из локального кеша, без перекомпиляции из исходного кода
```sh
lengjing@lengjing:~/data/cbuild$ make -C scripts/toolchain
make: Entering directory '/home/lengjing/data/cbuild/scripts/toolchain'
Используется cortex-a53-toolchain-gcc12.2.0-linux5.15. Кэш в '/home/lengjing/data/cbuild/output/mirror-cache/build-cache'.
Сборка cortex-a53-toolchain-gcc12.2.0-linux5.15 завершена.
make: Leaving directory '/home/lengjing/data/cbuild/scripts/toolchain'
lengjing@lengjing:~/data/cbuild$ make time_statistics
Генерация '/home/lengjing/data/cbuild/output/cortex-a53/config/Kconfig' завершена успешно.
Генерация '/home/lengjing/data/cbuild/output/cortex-a53/config/auto.mk' завершена успешно.
Генерация '/home/lengjing/data/cbuild/output/cortex-a53/config/DEPS' завершена успешно.
Используется кэш busybox в '/home/lengjing/data/cbuild/output/mirror-cache/build-cache'.
Сборка busybox завершена.
Установка busybox завершена.
Используется кэш cjson в '/home/lengjing/data/cbuild/output/mirror-cache/build-cache'.
Сборка cjson завершена.
Установка cjson завершена.
Используется кэш libpcap в '/home/lengjing/data/cbuild/output/mirror-cache/build-cache'.
Сборка libpcap завершена.
Установка libpcap завершена.
Используется кэш ljson в '/home/lengjing/data/cbuild/output/mirror-cache/build-cache'.
Сборка ljson завершена.
Установка ljson завершена.
Используется кэш lua в '/home/lengjing/data/cbuild/output/mirror-cache/build-cache'.
Сборка lua завершена.
Установка lua завершена.
Используется кэш ncurses-native в '/home/lengjing/data/cbuild/output/mirror-cache/build-cache'.
Сборка ncurses-native завершена.
Установка ncurses-native завершена.
Используется кэш ncurses в '/home/lengjing/data/cbuild/output/mirror-cache/build-cache'.
Сборка ncurses завершена.
```    Установка ncurses завершена.
     Используется кэш tcpdump в '/home/lengjing/data/cbuild/output/mirror-cache/build-cache'.
     Сборка tcpdump завершена.
     Установка tcpdump завершена.
     Сборка rootfs завершена.
     Установка пакетов из '/home/lengjing/data/cbuild/output/cortex-a53/sysroot'
     Установка busybox завершена.
     Установка Glibc из '/home/lengjing/data/cbuild/output/toolchain/cortex-a53-toolchain-gcc12.2.0-linux5.15/aarch64-linux-gnu/libc'
     Сборка завершена!
     lengjing@lengjing:~/data/cbuild$
     lengjing@lengjing:~/data/cbuild$ cat output/cortex-a53/config/time_statistics
     real	user	sys	package
     0.04	0.03	0.00	deps
     0.04	0.04	0.00	busybox
     0.09	0.08	0.02	busybox
     0.01	0.00	0.00	busybox
     0.05	0.05	0.00	cjson
     0.08	0.07	0.01	cjson
     0.00	0.00	0.00	cjson
     0.04	0.04	0.0001	libpcap
     0.08	0.07	0.01	libpcap
     0.03	0.00	0.01	libpcap
     0.04	0.04	0.00	ljson
     0.08	0.07	0.01	ljson
     0.00	0.00	0.00	ljson
     0.05	0.05	0.00	lua
     0.08	0.08	0.01	lua
     0.00	0.00	0.00	lua
     0.05	0.04	0.01	ncurses-native
     0.08	0.08	0.01	ncurses-native
     0.28	0.01	0.19	ncurses-native
     0.06	0.05	0.01	ncurses
     0.09	0.09	0.01	ncurses
     0.25	0.01	0.18	ncurses
     0.05	0.04	0.01	tcpdump
     0.09	0.08	0.01	tcpdump
     0.00	0.00	0.00	tcpdump
     0.03	0.00	0.02	rootfs
     1.14	0.53	0.44	rootfs
     2.96	1.66	1.09	total_time
     ```* Создает еще одно терминальное окно и запускает сервер-зеркало    ```sh
    lengjing@lengjing:~/data/cbuild$ cd output
    lengjing@lengjing:~/data/cbuild/output$ mv mirror-cache mirror
    lengjing@lengjing:~/data/cbuild/output$ cd mirror
    lengjing@lengjing:~/data/cbuild/output/mirror$ rm -rf downloads/lock
    lengjing@lengjing:~/data/cbuild/output/mirror$ tree
    .
    ├── build-cache
    │   ├── cortex-a53--busybox--b7c40d7a733221bbd8327e487cfee505.tar.gz
    │   ├── cortex-a53--cjson--8167d8f3fd82197b44bb7498b4d97bb0.tar.gz
    │   ├── cortex-a53--libpcap--5db3b7c187d08870a29ee48f725e96bc.tar.gz
    │   ├── cortex-a53--ljson--1cb819ebcb847f1feff24879246c30d5.tar.gz
    │   ├── cortex-a53--lua--370ffcee1a70bc93516df21de9de0634.tar.gz
    │   ├── cortex-a53--ncurses--96424c436be9e0bc02bcdaea10083a8f.tar.gz
    │   ├── cortex-a53--tcpdump--5652e8bf037a2ee5792fcbf02adee2b7.tar.gz
    │   ├── x86_64--cortex-a53-toolchain-gcc12.2.0-linux5.15-native--8ec20b3593ccaf0a87712ade12d00de6.tar.gz
    │   └── x86_64--ncurses-native--54a6ab0af25ad68f24bff08355b59efb.tar.gz
    └── downloads
        ├── busybox-1.35.0.tar.bz2
        ├── busybox-1.35.0.tar.bz2.src.hash
        ├── cJSON-1.7.15.tar.gz
        ├── cJSON-1.7.15.tar.gz.src.hash
        ├── libpcap-1.10.1.tar.gz
        ├── libpcap-1.10.1.tar.gz.src.hash
        ├── ljson
        │   ├── json.c
        │   ├── json.h
        │   ├── json_test.c
        │   ├── json_test.png
        │   ├── LICENSE
        │   └── README.md
        ├── ljson-git-br.-rev.7b2f6ae6cf7011e94682b073669f5ff8f69095cc.tar.gz
        ├── ljson.src.hash
        ├── lua-5.4.4.tar.gz
        ├── lua-5.4.4.tar.gz.src.hash
        ├── ncurses-6.3.tar.gz
        ├── ncurses-6.3.tar.gz.src.hash
        ├── tcpdump-4.99.1.tar.gz
        └── tcpdump-4.99.1.tar.gz.src.hash

    3 директории, 29 файлов
    lengjing@lengjing:~/data/cbuild/output/mirror$ python3 -m http.server 8888
    Serving HTTP on 0.0.0.0 port 8888 (http://0.0.0.0:8888/) ...
    ```* Оригинальное терминальное окно удаляет все выходные данные компиляции и кэш, заново компилирует, результат берется напрямую из кэша сервера-зеркала, без заново компиляции из исходного кода

```sh
lengjing@lengjing:~/data/cbuild$ rm -rf output/cortex-a53 output/mirror-cache output/toolchain
lengjing@lengjing:~/data/cbuild$ make test_config
.  .  .
lengjing@lengjing:~/data/cbuild$ make -C scripts/toolchain
make: Entering directory '/home/lengjing/data/cbuild/scripts/toolchain'
curl http://127.0.0.1:8888/build-cache/x86_64--cortex-a53-toolchain-gcc12.2.0-linux5.15-native--8ec20b3593ccaf0a87712ade12d00de6.tar.gz to /home/lengjing/data/cbuild/output/mirror-cache/build-cache/x86_64--cortex-a53-toolchain-gcc12.2.0-linux5.15-native--8ec20b3593ccaf0a87712ade12d00de6.tar.gz
Используется кэш cortex-a53-toolchain-gcc12.2.0-linux5.15 в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
Сборка cortex-a53-toolchain-gcc12.2.0-linux5.15 завершена.
make: Leaving directory '/home/lengjing/data/cbuild/scripts/toolchain'
lengjing@lengjing:~/data/cbuild$ make time_statistics
Генерация /home/lengjing/data/cbuild/output/cortex-a53/config/Kconfig завершена успешно.
Генерация /home/lengjing/data/cbuild/output/cortex-a53/config/auto.mk завершена успешно.
Генерация /home/lengjing/data/cbuild/output/cortex-a53/config/DEPS завершена успешно.
curl http://127.0.0.1:8888/build-cache/cortex-a53--busybox--b7c40d7a733221bbd8327e487cfee505.tar.gz to /home/lengjing/data/cbuild/output/mirror-cache/build-cache/cortex-a53--busybox--b7c40d7a733221bbd8327e487cfee505.tar.gz
Используется кэш busybox в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
Сборка busybox завершена.
Установка busybox завершена.
curl http://127.0.0.1:8888/build-cache/cortex-a53--cjson--8167d8f3fd82197b44bb7498b4d97bb0.tar.gz to /home/lengjing/data/cbuild/output/mirror-cache/build-cache/cortex-a53--cjson--8167d8f3fd82197b44bb7498b4d97bb0.tar.gz
Используется кэш cjson в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
```    Сборка cjson завершена.
    Установка cjson завершена.
    curl http://127.0.0.1:8888/build-cache/cortex-a53--libpcap--5db3b7c187d08870a29ee48f725e96bc.tar.gz в /home/lengjing/data/cbuild/output/mirror-cache/build-cache/cortex-a53--libpcap--5db3b7c187d08870a29ee48f725e96bc.tar.gz
    Используется кэш libpcap в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
    Сборка libpcap завершена.
    Установка libpcap завершена.
    curl http://127.0.0.1:8888/build-cache/cortex-a53--ljson--1cb819ebcb847f1feff24879246c30d5.tar.gz в /home/lengjing/data/cbuild/output/mirror-cache/build-cache/cortex-a53--ljson--1cb819ebcb847f1feff24879246c30d5.tar.gz
    Используется кэш ljson в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
    Сборка ljson завершена.
    Установка ljson завершена.
    curl http://127.0.0.1:8888/build-cache/cortex-a53--lua--370ffcee1a70bc93516df21de9de0634.tar.gz в /home/lengjing/data/cbuild/output/mirror-cache/build-cache/cortex-a53--lua--370ffcee1a70bc93516df21de9de0634.tar.gz
    Используется кэш lua в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
    Сборка lua завершена.
    Установка lua завершена.
    curl http://127.0.0.1:8888/build-cache/x86_64--ncurses-native--54a6ab0af25ad68f24bff08355b59efb.tar.gz в /home/lengjing/data/cbuild/output/mirror-cache/build-cache/x86_64--ncurses-native--54a6ab0af25ad68f24bff08355b59efb.tar.gz
    Используется кэш ncurses-native в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
    Сборка ncurses-native завершена.
    Установка ncurses-native завершена.
    curl http://127.0.0.1:8888/build-cache/cortex-a53--ncurses--96424c436be9e0bc02bcdaea10083a8f.tar.gz в /home/lengjing/data/cbuild/output/mirror-cache/build-cache/cortex-a53--ncurses--96424c436be9e0bc02bcdaea10083a8f.tar.gz
    Используется кэш ncurses в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
    Сборка ncurses завершена.
    Установка ncurses завершена.
    curl http://127.0.0.1:8888/build-cache/tcpdump--5652e8bf037a2ee5792fcbf02adee2b7.tar.```markdown
gz в /home/lengjing/data/cbuild/output/mirror-cache/build-cache/tcpdump--5652e8bf037a2ee5792fcbf02adee2b7.tar.gz
      Используйте кэш tcpdump в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
      Сборка tcpdump завершена.
      Установка tcpdump завершена.
      Сборка rootfs завершена.
      Установка пакетов из /home/lengjing/data/cbuild/output/cortex-a53/sysroot
      Установка busybox завершена.
      Установка Glibc целевой системы из /home/lengjing/data/cbuild/output/toolchain/cortex-a53-toolchain-gcc12.2.0-linux5.15/aarch64-linux-gnu/libc
      Сборка завершена!

```markdown
lengjing@lengjing:~/data/cbuild$ cat output/cortex-a53/config/time_statistics
real	user	sys	package
0.04	0.03	0.00	deps
0.06	0.05	0.01	busybox
0.12	0.10	0.02	busybox
0.01	0.00	0.00	busybox
0.07	0.06	0.00	cjson
0.08	0.07	0.02	cjson
0.00	0.00	0.00	cjson
0.07	0.06	0.01	libpcap
0.12	0.09	0.03	libpcap
0.01	0.00	0.00	libpcap
0.06	0.05	0.01	ljson
0.11	0.09	0.04	ljson
0.00	0.00	0.00	ljson
0.07	0.06	0.00	lua
0.10	0.10	0.01	lua
0.01	0.01	0.00	lua
0.08	0.05	0.03	ncurses-native
0.21	0.15	0.10	ncurses-native
0.08	0.01	0.07	ncurses-native
0.09	0.08	0.01	ncurses
0.21	0.17	0.07	ncurses
0.09	0.01	0.07	ncurses
0.08	0.06	0.02	tcpdump
0.11	0.11	0.01	tcpdump
0.00	0.00	0.00	tcpdump
0.00	0.00	0.00	rootfs
1.00	0.54	0.45	rootfs
3.00	2.07	1.10	total_time

    ```sh
    lengjing@lengjing:~/data/cbuild$ make lua_setforce
    Установлен флаг принудительной компиляции lua.
    lengjing@lengjing:~/data/cbuild$ make lua
    ПРЕДУПРЕЖДЕНИЕ: Принудительная компиляция lua.
    curl http://127.0.0.1:8888/downloads/lua-5.4.4.tar.gz to /home/lengjing/data/cbuild/output/mirror-cache/downloads/lua-5.4.4.tar.gz
    untar /home/lengjing/data/cbuild/output/mirror-cache/downloads/lua-5.4.4.tar.gz to /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/lua
    patching file Makefile
    patching file src/Makefile
    Patch /home/lengjing/data/cbuild/oss/lua/patch/0001-lua-Support-dynamic-library-compilation.patch to /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/lua/lua-5.4.4 Done.
    patching file src/lparser.c
    Patch /home/lengjing/data/cbuild/oss/lua/patch/CVE-2022-28805.patch to /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/lua/lua-5.4.4 Done.
    Push lua Cache to /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
    Build lua Done.
    Install lua Done.
    lengjing@lengjing:~/data/cbuild$ make lua
    ПРЕДУПРЕЖДЕНИЕ: Принудительная компиляция lua.
    Push lua Cache to /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
    Build lua Done.
    Install lua Done.
    ```* Удаляет флаг принудительной компиляции, результат берётся напрямую из кэша зеркального сервера, без повторной компиляции из исходного кода
``````sh
lengjing@lengjing:~/data/cbuild$ make lua_unsetforce
Отмена lua Force Build.
lengjing@lengjing:~/data/cbuild$ make lua
curl http://127.0.0.1:8888/build-cache/cortex-a53--lua--370ffcee1a70bc93516df21de9de0634.tar.gz to /home/lengjing/data/cbuild/output/mirror-cache/build-cache/cortex-a53--lua--370ffcee1a70bc93516df21de9de0634.tar.gz
Использование lua кеша в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
Сборка lua завершена.
Установка lua завершена.
lengjing@lengjing:~/data/cbuild$ make lua
Использование lua кеша в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
Сборка lua завершена.
Установка lua завершена.
```* Модифицирует файл для проверки, собирает из исходного кода

    ```sh
    lengjing@lengjing:~/data/cbuild$ echo >> oss/ljson/patch/Makefile
    lengjing@lengjing:~/data/cbuild$ make ljson
    curl http://127.0.0.1:8888/downloads/ljson-git-br.-rev.7b2f6ae6cf7011e94682b073669f5ff8f69095cc.tar.gz to /home/lengjing/data/cbuild/output/mirror-cache/downloads/ljson-git-br.-rev.7b2f6ae6cf7011e94682b073669f5ff8f69095cc.tar.gz
    копирование /home/lengjing/data/cbuild/output/mirror-cache/downloads/ljson to /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/ljson
    Загрузка кеша ljson в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
    Сборка ljson завершена.
    Установка ljson завершена.
    lengjing@lengjing:~/data/cbuild$ make ljson
    Использование кеша ljson в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
    Сборка ljson завершена.
    Установка ljson завершена.
    ```

* Модифицирует конфигурацию, устанавливает флаг force compilation и всегда собирает из исходного кода

    ```sh
    lengjing@lengjing:~/data/cbuild$ make busybox_menuconfig
    curl http://127.0.0.1:8888/downloads/busybox-1.35.0.tar.bz2 to /home/lengjing/data/cbuild/output/mirror-cache/downloads/busybox-1.35.0.tar.bz2
    разархивация /home/lengjing/data/cbuild/output/mirror-cache/downloads/busybox-1.35.0.tar.bz2 to /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/busybox
      GEN     /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/busybox/build/Makefile
    #
    # используемые значения по умолчанию из .config
    #    *** Конец конфигурации.
    *** Выполните 'make' для сборки проекта или попробуйте 'make help'.
    ```Установите сборку busybox принудительно.
    lengjing@lengjing:~/data/cbuild$ make busybox
    ПРЕДУПРЕЖДЕНИЕ: принудительная сборка busybox.
    /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/busybox/busybox-1.35.0/applets/usage.c: В функции 'main':
    /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/busybox/busybox-1.35.0/applets/usage.c:52:3: предупреждение: игнорирование значения, возвращаемого 'write', объявленного с атрибутом warn_unused_result [-Wunused-result]
    ...
    Переместить кэш busybox в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
    Сборка busybox завершена.
    Установка busybox завершена.
    ```lengjing@lengjing:~/data/cbuild$ make busybox
    ПРЕДУПРЕЖДЕНИЕ: принудительная сборка busybox.
    Переместить кэш busybox в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
    Сборка busybox завершена.
    Установка busybox завершена.
    ```* Восстанавливает исходную конфигурацию, удаляет флаг принудительной компиляции, результат берётся напрямую из кэша сервера-зеркала, без повторной компиляции из исходного кода    ```sh
    lengjing@lengjing:~/data/cbuild$ make busybox_defconfig
      GEN     /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/busybox/build/Makefile
    *
    * Конфигурация Busybox
    *
    *
    * Настройки
    *
    ...
    Принудительная компиляция busybox отключена.
    lengjing@lengjing:~/data/cbuild$ make busybox
    curl http://127.0.0.1:8888/build-cache/cortex-a53--busybox--b7c40d7a733221bbd8327e487cfee505.tar.gz to /home/lengjing/data/cbuild/output/mirror-cache/build-cache/cortex-a53--busybox--b7c40d7a733221bbd8327e487cfee505.tar.gz
    Используется кэш busybox в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
    Компиляция busybox завершена.
    Установка busybox завершена.
    lengjing@lengjing:~/data/cbuild$ make busybox
    Используется кэш busybox в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
    Компиляция busybox завершена.
    Установка busybox завершена.
    ```

* Модифицирует файл для проверки зависимости, пакета зависимости и компиляции пакета из исходного кода    ```sh
    lengjing@lengjing:~/data/cbuild$ echo >> oss/libpcap/mk.deps
    lengjing@lengjing:~/data/cbuild$ make tcpdump
    curl http://127.0.0.1:8888/downloads/libpcap-1.10.1.tar.gz to /home/lengjing/data/cbuild/output/mirror-cache/downloads/libpcap-1.10.1.tar.gz
    untar /home/lengjing/data/cbuild/output/mirror-cache/downloads/libpcap-1.10.1.tar.gz to /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/libpcap
    Кэш libpcap загружен в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
    Компиляция libpcap завершена.
    Установка libpcap завершена.
    Установка libpcap завершена.
    curl http://127.0.0.1:8888/downloads/tcpdump-4.99.1.tar.gz to /home/lengjing/data/cbuild/output/mirror-cache/downloads/tcpdump-4.99.1.tar.gz
    untar /home/lengjing/data/cbuild/output/mirror-cache/downloads/tcpdump-4.99.1.tar.gz to /home/lengjing/data/cbuild/output/cortex-a53/objects/oss/tcpdump
    configure: WARNING: using cross tools not prefixed with host triplet
    configure: WARNING: pcap/pcap-inttypes.h: accepted by the compiler, rejected by the preprocessor!
    configure: WARNING: pcap/pcap-inttypes.h: proceeding with the compiler's result
    Кэш tcpdump загружен в /home/lengjing/data/cbuild/output/mirror-cache/build-cache.
    Компиляция tcpdump завершена.
    Установка tcpdump завершена.
    ```## Контакты* Телефон: +86 18368887550
* wx/qq: 1083936981
* Электронная почта: lengjingzju@163.com 3090101217@zju.edu.cn

Комментарии ( 0 )

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

Введение

CBuild — более мощная и гибкая система компиляции, чем Buildroot, и более быстрая и лаконичная, чем Yocto. 1. Предоставляет механизмы загрузки по сети, патчей и кэширования компиляции для повторного использования локального или сетевого кэша при повторной компиляции. 2. Предлагает шаблоны для компиляции приложений (C/C++/ассемблер) и шаблоны для... Развернуть Свернуть
C и 6 других языков
MIT
Отмена

Обновления (24)

все

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
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