Compare commits
10 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
a91acf3de7 | ||
|
ddf0c5b7c7 | ||
|
73f676f92c | ||
|
3c1bca535c | ||
|
07fdc6dd9b | ||
|
cc8982dd7e | ||
|
cd3e47c562 | ||
|
102aa3851d | ||
|
30b1aa9be6 | ||
|
813571cb10 |
@@ -1,5 +1,5 @@
|
||||
Name: mkimage-profiles
|
||||
Version: 0.4.2
|
||||
Version: 0.4.3
|
||||
Release: alt1
|
||||
|
||||
Summary: ALT Linux based distribution metaprofile
|
||||
@@ -58,5 +58,11 @@ cp -a * %buildroot%mpdir
|
||||
%doc README QUICKSTART
|
||||
|
||||
%changelog
|
||||
* Mon Nov 07 2011 Michael Shigorin <mike@altlinux.org> 0.4.3-alt1
|
||||
- enhancements to logging
|
||||
- NICE variable: employ nice(1) and ionice(1) if available
|
||||
- features.in/syslinux: banner tweaked to include target name
|
||||
- features.in/live: set up unicode locale/consolefont
|
||||
|
||||
* Wed Nov 02 2011 Michael Shigorin <mike@altlinux.org> 0.4.2-alt1
|
||||
- initial package
|
||||
|
14
Makefile
14
Makefile
@@ -18,6 +18,9 @@ IMAGE_NAME := $(basename $(IMAGE_FILE))# server-base
|
||||
IMAGE_TYPE := $(suffix $(IMAGE_FILE))# .iso (fix this too)
|
||||
IMAGE_TYPE := $(IMAGE_TYPE:.%=%)# iso
|
||||
|
||||
# preferences
|
||||
-include $(HOME)/.mkimage/profiles.mk
|
||||
|
||||
# most of the actual work done elsewhere
|
||||
include lib/*.mk
|
||||
include conf.d/*.mk
|
||||
@@ -42,10 +45,15 @@ help:
|
||||
|
||||
### suboptimal but at least clear, reliable and convenient
|
||||
all:
|
||||
@for i in $(DISTROS); do \
|
||||
echo "** building $$i:"; \
|
||||
$(MAKE) --no-print-directory BUILDDIR=$(BUILDDIR) $$i; \
|
||||
@n=1; sum=$(words $(DISTROS)); \
|
||||
for distro in $(DISTROS); do \
|
||||
echo "** building $$distro:"; \
|
||||
$(MAKE) --no-print-directory \
|
||||
ALL=$$n/$$sum \
|
||||
BUILDDIR=$(BUILDDIR) \
|
||||
$$distro; \
|
||||
echo; \
|
||||
n=$$(($$n+1)); \
|
||||
done
|
||||
|
||||
$(IMAGES): debug \
|
||||
|
@@ -30,4 +30,4 @@ $ make distro/icewm.iso
|
||||
- http://www.altlinux.org/tmpfs
|
||||
- http://www.altlinux.org/hasher
|
||||
- http://www.altlinux.org/mkimage
|
||||
- http://www.altlinux.org/Mkimage/Profiles/next
|
||||
- http://www.altlinux.org/Mkimage/Profiles/m-p
|
||||
|
57
README
57
README
@@ -8,15 +8,16 @@ see doc/profiles.mk.sample and libdistro.mk
|
||||
|
||||
License: GPLv2+, see COPYING.
|
||||
|
||||
Most docs in Russian, welcome to learn it or ask for English.
|
||||
См. тж. http://www.altlinux.org/Mkimage/Profiles/next
|
||||
Most docs are in Russian, welcome to learn it or ask for English.
|
||||
См. тж. http://www.altlinux.org/Mkimage/Profiles/m-p
|
||||
|
||||
Задача:
|
||||
- конфигурирование и создание образов на базе ALT Linux
|
||||
|
||||
Концепция:
|
||||
- конфигурация, как и образ -- объект постадийной сборки
|
||||
- метапрофиль служит репозиторием для построения индивидуального
|
||||
профиля, по которому создаётся итоговый дистрибутив
|
||||
- для одноразовых модификаций можно подправить сгенерированный
|
||||
профиль, для долгосрочной разработки стоит вливать правки
|
||||
в метапрофиль (что требует больше навыков и времени)
|
||||
профиля, по которому создаётся итоговый образ
|
||||
|
||||
Особенности:
|
||||
- метапрофиль может быть полностью read-only при сборке
|
||||
@@ -25,52 +26,36 @@ Most docs in Russian, welcome to learn it or ask for English.
|
||||
он автономен относительно метапрофиля
|
||||
|
||||
Стадии работы:
|
||||
- инициализация дистрибутивного профиля
|
||||
- сборка конфигурации дистрибутива
|
||||
- наполнение дистрибутивного профиля
|
||||
- сборка дистрибутива
|
||||
- инициализация сборочного профиля
|
||||
- сборка конфигурации образа
|
||||
- наполнение сборочного профиля
|
||||
- сборка образа
|
||||
|
||||
Объекты:
|
||||
- виртуальные окружения:
|
||||
+ описываются в lib/ve.mk
|
||||
- дистрибутивы и виртуальные окружения:
|
||||
+ описываются в conf.d/*.mk или соответственно lib/{distro,ve}.mk
|
||||
+ могут основываться одно на другом
|
||||
- дистрибутивы:
|
||||
+ описываются в lib/distro.mk
|
||||
+ могут основываться один на другом
|
||||
+ включают один или более субпрофилей по надобности
|
||||
+ дистрибутивы также:
|
||||
- включают один или более субпрофилей по надобности
|
||||
+ желательно избегать множественного наследования, см. тж. фичи
|
||||
- субпрофили:
|
||||
+ список собирается в $(SUBPROFILES)
|
||||
+ базовые комплекты помещены в подкаталогах под sub.in/;
|
||||
их наборы скриптов могут расширяться фичами
|
||||
- stage1: propagator, ядро инсталятора и initrd в т.ч. с firmware
|
||||
- stage2: базовый live-образ (и модули ядра, соответствующие stage1);
|
||||
используется только с модификаторами (см. соответствующие фичи):
|
||||
+ stage2/install2: инсталятор
|
||||
+ stage2/live: LiveCD
|
||||
+ stage2/rescue: спасательная система
|
||||
- main: пакетная база к инсталяции (обязательная и дополнительная)
|
||||
- фичи:
|
||||
+ список собирается в $(FEATURES)
|
||||
+ законченные блоки функциональности (или наборы таковых)
|
||||
+ описываются в индивидуальных features.in/*/config.mk
|
||||
+ могут требовать другие фичи, а также субпрофили
|
||||
+ при сборке $(BUILDDIR) содержимое указанных в $(FEATURES) фич
|
||||
(подкаталоги, соответствующие входящим в дистрибутив субпрофилям
|
||||
под их итоговыми названиями -- например, live, а не stage2/live)
|
||||
добавляется в профиль; затем выполняются generate.sh, generate.mk
|
||||
- списки пакетов (*_LISTS): просьба по возможности избегать дублирования;
|
||||
NB: перечисленные в этих переменных файлы автоматически копируются
|
||||
в порождаемый профиль => не следует указывать пакаджлисты напрямую
|
||||
- индивидуальные пакеты (*_PACKAGES): следует крайне осторожно пользоваться
|
||||
SYSTEM_PACKAGES -- эти пакеты попадут во все стадии, в том числе в образ
|
||||
чувствительной к объёму install2 (в stage1 -- только в инструментальный
|
||||
чрут); применяйте для того, что обязано быть и в инсталяторе, и в готовой
|
||||
системе -- и не путайте с COMMON_PACKAGES (main, live, rescue)
|
||||
добавляется в профиль с постобработкой (generate.*)
|
||||
- списки пакетов (*_LISTS):
|
||||
+ просьба по возможности избегать дублирования
|
||||
- индивидуальные пакеты (*_PACKAGES): см. тж. conf.d/README
|
||||
|
||||
Результат:
|
||||
- при успешном завершении сборки образ называется сообразно
|
||||
дистрибутиву и укладывается в $(IMAGEDIR):
|
||||
- при успешном завершении сборки образ называется по имени цели
|
||||
и укладывается в $(IMAGEDIR):
|
||||
+ указанный явно,
|
||||
+ либо ~/out/ (если возможно),
|
||||
+ или $(BUILDDIR)/out/ иначе
|
||||
|
@@ -1,17 +1,24 @@
|
||||
Этот каталог содержит включаемые фрагменты конфигурации образов с тем,
|
||||
чтобы было удобнее параллельно разрабатывать специфические дистрибутивы
|
||||
без излишних merge conflict'ов.
|
||||
и VE без излишних merge conflict'ов.
|
||||
|
||||
Следует понимать, что основная цель появления mkimage-profiles на свет
|
||||
-- это уменьшение "форков" внутри семейства дистрибутивных профилей.
|
||||
Поэтому при возможности следует всё-таки работать над общей базовой
|
||||
частью, включая скриптовые хуки и списки пакетов, а также оптимизировать
|
||||
граф зависимостей между дистрибутивными конфигурациями.
|
||||
граф зависимостей между конфигурациями образов.
|
||||
|
||||
Попросту говоря, copy-paste -- тревожный признак.
|
||||
|
||||
NB: по переменным:
|
||||
По переменным:
|
||||
* SYSTEM_PACKAGES стоит применять крайне осторожно -- эти пакеты попадут
|
||||
во все стадии, в том числе в образ чувствительной к объёму install2
|
||||
(в stage1 -- только в инструментальный чрут); применяйте для того,
|
||||
что обязано быть и в инсталяторе, и в готовой системе;
|
||||
* для "обычного общего" (main, live, rescue) есть COMMON_PACKAGES.
|
||||
|
||||
По подстановкам:
|
||||
* $(VAR) подставляются перед их записью в $(CONFIG), который distcfg.mk;
|
||||
* $$(VAR) раскрываются позже, при включении $(CONFIG) и востребовании
|
||||
значений -- таким образом их значения могут изменяться до окончания
|
||||
конфигурации, а также зависеть от значений других переменных.
|
||||
конфигурации, а также зависеть от значений других переменных;
|
||||
|
@@ -9,5 +9,8 @@
|
||||
# spares tmpfs, quite recommended unless you need raw workdir chroots
|
||||
#CLEAN = 1
|
||||
|
||||
# run with lower CPU and I/O priorities
|
||||
#NICE = 1
|
||||
|
||||
# try and draw attention when done (depends on readline/terminal settings)
|
||||
#BELL = 1
|
||||
|
@@ -9,16 +9,16 @@
|
||||
+ см. ../image.in/Makefile, apt.conf.sample
|
||||
|
||||
- ARCH
|
||||
+ определяет целевую архитектуру образа
|
||||
+ задаёт целевую архитектуру образа
|
||||
+ значение: пусто (по умолчанию авто), i586 или x86_64
|
||||
+ см. ../lib/build.mk
|
||||
|
||||
- BELL
|
||||
+ требует подачу сигнала после завершения сборки
|
||||
+ подаёт сигнал после завершения сборки
|
||||
+ см. ../lib/build.mk
|
||||
|
||||
- BUILDDIR
|
||||
+ определяет каталог генерируемого профиля и сборки
|
||||
+ задаёт каталог генерируемого профиля и сборки
|
||||
+ значение: пусто (по умолчанию авто) либо строка
|
||||
+ см. ../lib/profile.mk
|
||||
|
||||
@@ -30,10 +30,15 @@
|
||||
+ см. ../lib/clean.mk
|
||||
|
||||
- DEBUG
|
||||
+ включение средств отладки
|
||||
+ включает средства отладки
|
||||
+ значение: пусто (по умолчанию), 1 или 2
|
||||
+ см. ../lib/log.mk
|
||||
|
||||
- NICE
|
||||
+ понижает нагрузку системы сборочной задачей
|
||||
+ значение: пусто (по умолчанию) либо любая строка
|
||||
+ см. ../lib/build.mk
|
||||
|
||||
пример
|
||||
~~~~~~
|
||||
make DEBUG=1 CLEAN=1 syslinux.iso
|
||||
make DEBUG=1 CLEAN=1 distro/syslinux.iso
|
||||
|
@@ -2,38 +2,34 @@
|
||||
и должен дать представление о том, какой код _может_ быть
|
||||
включён в настоящую фичу: статические файлы, два makefile
|
||||
для создания конфигурации и генерирования части профиля,
|
||||
а также шелл-скрипт для генерирования.
|
||||
а также шелл-скрипт для такого генерирования.
|
||||
|
||||
Вовсе не требуется втягивать всё в свою фичу, лучше постараться
|
||||
Вовсе не требуется втягивать всё в свою фичу: лучше постараться
|
||||
сделать её минимальной, самодостаточной и полезной в качестве
|
||||
"кирпичика".
|
||||
|
||||
Единственной необходимой частью фичи является файл config.mk,
|
||||
Единственной обязательной частью фичи является файл config.mk,
|
||||
который включается в distro.mk верхнего уровня и предоставляет
|
||||
цель вида use/*, специфичную для данной фичи (а также добавляет
|
||||
её в переменную FEATURES -- к сожалению, реализовать добавление
|
||||
автоматом не представляется возможным). Если название фичи не
|
||||
упоминается в списке, содержащемся в этой переменной, то она
|
||||
не задействуется при построении профиля, а только при сборке
|
||||
конфигурации дистрибутива.
|
||||
цель вида use/*, специфичную для данной фичи, а также добавляет
|
||||
её в переменную FEATURES. Если название фичи не упоминается
|
||||
в списке, содержащемся в этой переменной, то она не задействуется
|
||||
при построении профиля, а только при сборке конфигурации.
|
||||
|
||||
Остальное содержимое является дополнительным и используется
|
||||
в таком порядке (см. features.in/Makefile):
|
||||
в таком порядке (см. ../Makefile):
|
||||
|
||||
- сперва в $(BUILDDIR)/image/ копируются все подкаталоги,
|
||||
соответствующие именам субпрофилей, запрошенных для
|
||||
дистрибутивного профиля; при этом они сливаются с деревом,
|
||||
соответствующие итоговым именам субпрофилей, запрошенных
|
||||
для профиля образа; при этом они сливаются с деревом,
|
||||
которое уже сформировано субпрофилями (../sub.in/*) и уже
|
||||
скопированными фичами; если какие-либо файлы перекрылись
|
||||
по именам, rsync должен оставить резервные копии (*~),
|
||||
которые должны просигнализировать о беспорядке;
|
||||
|
||||
- затем запускается generate.sh, если существует и исполнимый;
|
||||
|
||||
- затем используется generate.mk, если существует и непустой.
|
||||
- запускается generate.sh, если существует и исполнимый;
|
||||
- применяется generate.mk, если существует и непустой.
|
||||
|
||||
Например, если используются субпрофили stage1, stage2/install2
|
||||
и main, вы можете решить собрать специфические для фичи скрипты
|
||||
и main, можно решить собрать специфические для фичи скрипты
|
||||
инсталятора в install2/image-scripts.d/ (или необходимые для
|
||||
операций с пакетной базой -- в main/scripts.d/, смотря чего
|
||||
надо добиться; загляните также в документацию mkimage).
|
||||
|
@@ -1,43 +0,0 @@
|
||||
This directory contains phony example feature and should provide
|
||||
you with a minimal idea what code _can_ be included into a real
|
||||
feature: static files, configuration and generation makefiles,
|
||||
and a generation shell script.
|
||||
|
||||
It's not neccessary to toss all of those into your feature,
|
||||
better try to keep it minimalistic, self-contained and useful
|
||||
as a building block.
|
||||
|
||||
The only requisite part of the feature is config.mk which
|
||||
is included in toplevel distro.mk and which provides the
|
||||
use/* target specific for the feature (and also registers
|
||||
it in FEATURES variable -- sorry, it's not feasible to do
|
||||
automatically). If the feature's name isn't mentioned in
|
||||
the list contained in that variable, then it's not examined
|
||||
while building up the profile either.
|
||||
|
||||
The rest of content is optional and used in this order
|
||||
(see features.in/Makefile):
|
||||
|
||||
- first all subdirectories corresponding to subprofile names
|
||||
requested for the distribution profile being made are copied
|
||||
over to $(BUILDDIR)/image/; thus they get merged with the tree
|
||||
which is already formed by subprofiles (../sub.in/*) and preceding
|
||||
features; in case of overlapping files rsync should leave backup
|
||||
copies which are to be treated as a signal of disorder;
|
||||
|
||||
- then generate.sh is run, if found and executable;
|
||||
|
||||
- then generate.mk is used, if found and non-empty.
|
||||
|
||||
e.g., if the distro needs stage1, install2 and main subprofiles,
|
||||
you might want to collect feature-specific scripts for installer
|
||||
into install2/image-scripts.d/ (or main/scripts.d/, depending on
|
||||
what is to be achieved -- see also mkimage docs).
|
||||
|
||||
And if some non-trivial configuration actions are to be done
|
||||
(like syslinux config file being compiled from pieces depending
|
||||
on what bits are present of the functionality asked for...) then
|
||||
you can perform them in generate.* code.
|
||||
|
||||
Please feel free to comment on what's useful here and what's crap
|
||||
to mike@altlinux.
|
@@ -1,15 +1,15 @@
|
||||
Этот каталог содержит т.н. фичи (features, особенности) --
|
||||
каталоги, содержимое каждого из которых реализует одну из
|
||||
подключаемых автономных возможностей дистрибутива.
|
||||
подключаемых автономных возможностей образа.
|
||||
|
||||
Каждая фича должна содержать задействуемый при построении
|
||||
конфигурации будущего образа файл config.mk, включаемый
|
||||
в ../Makefile; он может описывать одну или более целей
|
||||
вида use/*, дополняющих конфигурацию дистрибутива, и при
|
||||
наличии дополнительных хуков для копирования или generate.*
|
||||
вида use/*, дополняющих конфигурацию, и при наличии
|
||||
дополнительных хуков для копирования или generate.*
|
||||
должен добавить имя фичи в $(FEATURES).
|
||||
|
||||
На этапе генерации дистрибутивного профиля фичи рассматриваются
|
||||
На этапе генерации сборочного профиля фичи рассматриваются
|
||||
после инициализации профиля (см. ../image.in/) и копирования
|
||||
субпрофилей (см. ../sub.in/). Для каждой фичи, указанной
|
||||
в $(FEATURES), копируются подкаталоги сообразно субпрофилям,
|
||||
@@ -25,7 +25,13 @@ generate.sh и задействуется generate.mk (при их наличи
|
||||
с именем исходного базового субпрофиля (см. $src, $dst в Makefile).
|
||||
|
||||
Каталог lib/ является специфическим для фич, определяющих
|
||||
построение образа -- см. build-*/.
|
||||
построение конкретного вида образа -- см. build-*/.
|
||||
|
||||
Несложный пример содержится в 00example/, более близкий к жизни
|
||||
и нынешним пределам возможностей метапрофиля -- в syslinux/.
|
||||
|
||||
Основные фичи для построения дистрибутивных образов:
|
||||
- stage1: propagator, ядро инсталятора и initrd в т.ч. с firmware
|
||||
- stage2: базовый live-образ (и модули ядра, соответствующие stage1);
|
||||
используется фичами install2, live, rescue
|
||||
- main: пакетная база
|
||||
|
@@ -6,5 +6,5 @@
|
||||
и требует пакет выбранного загрузчика.
|
||||
|
||||
Реализация экспериментальная (нужно модуляризовать installer-steps),
|
||||
пока завязана на installer-distro-altlinux-generic. Возможно,
|
||||
пока завязана на installer-distro-altlinux-generic (TODO). Возможно,
|
||||
с использованием alterator-lilo связаны проблемы времени установки.
|
||||
|
@@ -4,3 +4,6 @@
|
||||
Для практического применения (в первую очередь это
|
||||
перешивка firmware) требуется сделать подключение
|
||||
CD и/или USB Flash с тем, чтобы класть туда прошивки.
|
||||
|
||||
Спасибо за идею и местами реализацию: Александру Бандуре,
|
||||
Сергею Горенко, Николаю Гречуху и Алексею Фролову.
|
||||
|
@@ -1,4 +1,4 @@
|
||||
Добавление модуля hdt (Hardware Detection Tool COM32 module) к syslinux;
|
||||
Добавление модуля hdt (Hardware Detection Tool) к syslinux;
|
||||
может быть востребовано для инсталяторов, live/rescue.
|
||||
|
||||
Фича не только требует фичу syslinux (и соответствующий пакет,
|
||||
|
12
features.in/live/live/image-scripts.d/20-locale
Executable file
12
features.in/live/live/image-scripts.d/20-locale
Executable file
@@ -0,0 +1,12 @@
|
||||
#!/bin/sh -efu
|
||||
# if no means for locale setup are employed,
|
||||
# it should still be somewhat reasonable
|
||||
# NB: keyboard layout not included!
|
||||
|
||||
mkdir -p /etc/sysconfig
|
||||
cat >> /etc/sysconfig/i18n << _EOF_
|
||||
# mkimage-profiles live 20-locale hook
|
||||
SYSFONT=UniCyr_8x16
|
||||
LANG=en_US.utf8
|
||||
_EOF_
|
||||
:
|
@@ -1,3 +1,3 @@
|
||||
Эта фича определяет формат упаковки создаваемого образа.
|
||||
На данный момент поддерживаются iso (загрузочный ISO9660
|
||||
для дистрибутивов) и tar (виртуальные окружения).
|
||||
для дистрибутивов) и tar/tgz (виртуальные окружения).
|
||||
|
@@ -2,18 +2,14 @@
|
||||
реализуется в рамках stage1.
|
||||
|
||||
Цели config.mk:
|
||||
|
||||
* use/syslinux/ui-% -- конфигурирование интерфейса (см. cfg.in/00*.cfg);
|
||||
при использовании автоматически добавляют syslinux в FEATURES;
|
||||
|
||||
* use/syslinux/%.com, use/syslinux/%.c32 -- подключение одноименных модулей
|
||||
(копирование бинарников и включение кусочков конфигурации; экспериментальное);
|
||||
|
||||
* use/syslinux/%.cfg -- подключение кусочков конфигурации.
|
||||
|
||||
Переменные generate.mk:
|
||||
|
||||
* BOOTLOADER -- isolinux (TODO: добавить поддержку syslinux для флэшек);
|
||||
* BOOTLOADER -- isolinux (реализовано с оглядкой на syslinux/syslinux4);
|
||||
* SYSLINUX_UI -- модуль интерфейса (если не указан, то внутренний prompt);
|
||||
* SYSLINUX_MODULES -- модули .com или .c32 (перечисляются без расширения);
|
||||
* SYSLINUX_CFG -- дополнительные кусочки конфигурации (например, localboot).
|
||||
@@ -23,4 +19,5 @@
|
||||
|
||||
TODO: может потребоваться обобщение механизма генерации с учётом
|
||||
многоуровневых меню и включаемых файлов (которыми лучше не злоупотреблять
|
||||
из соображений скорости инициализации загрузчика).
|
||||
из соображений скорости инициализации загрузчика); требуется обеспечить
|
||||
брендирование заголовков.
|
||||
|
@@ -1,3 +1,3 @@
|
||||
ui gfxboot bootlogo message
|
||||
menu title mkimage-profiles 2.0
|
||||
menu title ALT Linux (@mkimage-profiles@)
|
||||
prompt 0
|
||||
|
@@ -1,3 +1,3 @@
|
||||
ui menu.c32
|
||||
menu title mkimage-profiles 2.0
|
||||
menu title ALT Linux (@mkimage-profiles@)
|
||||
prompt 0
|
||||
|
@@ -1,2 +1,2 @@
|
||||
say mkimage-profiles 2.0
|
||||
say ALT Linux (@mkimage-profiles@)
|
||||
prompt 1
|
||||
|
@@ -1,3 +1,3 @@
|
||||
ui vesamenu
|
||||
menu title mkimage-profiles 2.0
|
||||
menu title ALT Linux (@mkimage-profiles@)
|
||||
prompt 0
|
||||
|
@@ -45,9 +45,11 @@ cfg = $(wildcard cfg.in/??$(1).cfg)
|
||||
#
|
||||
# arguments get evaluated before recipe body execution thus prep
|
||||
all: prep debug
|
||||
cp -pLt $(DSTDIR) -- $(sort \
|
||||
@cp -pLt $(DSTDIR) -- $(sort \
|
||||
$(foreach C,$(SYSLINUX_CFG),$(call cfg,$(C))) \
|
||||
$(foreach M,$(SYSLINUX_MODULES),$(call cfg,$(M))))
|
||||
@### proper text branding should be implemented
|
||||
@sed -i 's,@mkimage-profiles@,$(IMAGE_NAME),' $(DSTDIR)/*.cfg
|
||||
@echo $(SYSLINUX_MODULES) > $(DSTDIR)/modules.list
|
||||
@echo $(SYSLINUX_FILES) > $(DSTDIR)/files.list
|
||||
@echo $(BOOTLOADER) > $(DSTDIR)/bootloader
|
||||
|
@@ -1,14 +1,15 @@
|
||||
# stage 4: dive into mkimage
|
||||
|
||||
GLOBAL_BUILDDIR ?= $(shell pwd)
|
||||
LINKPREFIX := mkimage-profiles
|
||||
CURRENT_LINK := mkimage-profiles
|
||||
OUT_LINK := out
|
||||
|
||||
include distcfg.mk
|
||||
include functions.mk
|
||||
include $(MKIMAGE_PREFIX)/config.mk
|
||||
|
||||
# reconstruct instead of passing yet another variable
|
||||
IMAGE_FILE := $(IMAGE_NAME).$(IMAGE_TYPE)
|
||||
IMAGE_LINK := $(IMAGE_NAME).$(IMAGE_TYPE)
|
||||
IMAGE_OUTFILE := $(IMAGE_NAME)-$(DATE)-$(ARCH).$(IMAGE_TYPE)
|
||||
MKI_PACK_RESULTS = $(IMAGE_PACKTYPE):$(IMAGE_OUTFILE)
|
||||
|
||||
@@ -18,12 +19,7 @@ COPY_TREE = ./files
|
||||
# outdir shouldn't be wiped clean before use
|
||||
CLEANUP_OUTDIR ?=
|
||||
|
||||
APTCONF := $(wildcard $(APTCONF))
|
||||
ifeq (,$(APTCONF))
|
||||
GLOBAL_HSH_APT_CONFIG = /etc/apt/apt.conf
|
||||
else
|
||||
GLOBAL_HSH_APT_CONFIG = $(APTCONF)
|
||||
endif
|
||||
GLOBAL_HSH_APT_CONFIG := $(wildcard $(APTCONF))
|
||||
|
||||
# the lib/build-*.mk comes from features.in/build-*/lib
|
||||
include lib/*.mk
|
||||
@@ -38,10 +34,10 @@ $(IMAGEDIR):
|
||||
|
||||
postprocess:
|
||||
@OUTPATH="$(IMAGEDIR)/$(IMAGE_OUTFILE)"; \
|
||||
echo "** image: $(IMAGE_OUTFILE)" && \
|
||||
ln -sf "$(IMAGE_OUTFILE)" "$(IMAGEDIR)/$(IMAGE_FILE)" && \
|
||||
ln -sf "$(IMAGE_FILE)" "$(IMAGEDIR)/$(LINKPREFIX).$(IMAGE_TYPE)"; \
|
||||
ln -sf "$${OUTPATH#`pwd`/}" "$(IMAGE_FILE)"; \
|
||||
echo "** image: $$OUTPATH" >&2 && \
|
||||
ln -sf "$(IMAGE_OUTFILE)" "$(IMAGEDIR)/$(IMAGE_LINK)" && \
|
||||
ln -sf "$${IMAGEDIR#`pwd`/}" "$(OUT_LINK)"; \
|
||||
ln -sf "$(IMAGE_LINK)" $(OUT_LINK)/"$(CURRENT_LINK).$(IMAGE_TYPE)"; \
|
||||
if [ -n "$(GLOBAL_DEBUG)" ]; then \
|
||||
cp -a build.log "$$OUTPATH.log"; \
|
||||
cp -a distcfg.mk "$$OUTPATH.cfg"; \
|
||||
|
@@ -1,16 +1,15 @@
|
||||
Этот каталог копируется из метапрофиля в профиль "как есть"
|
||||
и формирует "затравку" финальной стадии, собирающей собственно
|
||||
образ из результатов работы индивидуальных субпрофилей.
|
||||
|
||||
Обратите внимание: в зависимости от того, какой образ нужен,
|
||||
требуется или features.in/build-distro (для дистрибутивов),
|
||||
или use/build-ve (для образов виртуальных окружений).
|
||||
|
||||
образ из результатов работы индивидуальных субпрофилей
|
||||
(для distro/*) либо непосредственно "на месте" (для ve/*).
|
||||
Содержимое files/ копируется в корень образа.
|
||||
|
||||
Соответственно для сборки требуется или features.in/build-distro,
|
||||
или use/build-ve.
|
||||
|
||||
Пакетная база рабочего чрута минимальна; apt-utils включены
|
||||
ради genbasedir, который после завершения первоначального
|
||||
наполнения субпрофилей может переехать в ../sub.in/main/.
|
||||
наполнения субпрофилей может переехать в ../sub.in/main/ (TODO).
|
||||
|
||||
Если требуется какая-либо иная обработка чрута, следует
|
||||
предпочитать scripts.d/.
|
||||
|
@@ -1,14 +1,22 @@
|
||||
# dump interesting variables' effective values;
|
||||
# based on http://stackoverflow.com/questions/7117978
|
||||
|
||||
SPAM := $(.VARIABLES) DISTCFG_MK
|
||||
# staged "uninteresting" lists
|
||||
SPAM := SPAM INIT PREFS DISTCFG DISTCFG_MK
|
||||
INIT := $(.VARIABLES)
|
||||
-include $(HOME)/.mkimage/profiles.mk
|
||||
PREFS := $(.VARIABLES)
|
||||
-include distcfg.mk
|
||||
HAM := $(.VARIABLES)
|
||||
DISTCFG := $(.VARIABLES)
|
||||
|
||||
# a separator variable
|
||||
-- := --
|
||||
|
||||
.PHONY: dump-vars
|
||||
|
||||
dump-vars:
|
||||
$(foreach v, \
|
||||
$(filter-out $(SPAM) SPAM,$(sort $(HAM))), \
|
||||
$(filter-out $(SPAM) $(INIT),$(sort $(PREFS))) -- \
|
||||
$(filter-out $(SPAM) $(PREFS),$(sort $(DISTCFG))), \
|
||||
$(info $(v) = $($(v))))
|
||||
@:
|
||||
|
@@ -1,7 +1,7 @@
|
||||
Этот каталог содержит вспомогательные makefiles,
|
||||
обеспечивающие основную функциональность создания
|
||||
конфигурации образа и генерации соответствующего
|
||||
профиля для сборки.
|
||||
профиля для сборки; см. тж. ../conf.d/.
|
||||
|
||||
Следует помнить, что будучи включаемыми в ../Makefile,
|
||||
они работают в каталоге верхнего уровня.
|
||||
|
49
lib/build.mk
49
lib/build.mk
@@ -4,34 +4,49 @@ ifndef MKIMAGE_PROFILES
|
||||
$(error this makefile is designed to be included in toplevel one)
|
||||
endif
|
||||
|
||||
# NB: /usr/bin/{i586,x86_64} are setarch(8) symlinks
|
||||
|
||||
export ARCH ?= $(shell arch | sed 's/i686/i586/')
|
||||
|
||||
# try not to bog down the system, both CPU and I/O wise
|
||||
ifdef NICE
|
||||
START := nice $(shell ionice -c3 echo "ionice -c3" 2>/dev/null)
|
||||
endif
|
||||
|
||||
# in kilobytes (a kilometer is 1024 meters, you know)
|
||||
LOWSPACE = 1024
|
||||
|
||||
# it's also nice to know how long and much it takes
|
||||
START += time -f "%E %PCPU %Mk"
|
||||
|
||||
# /usr/bin/{i586,x86_64} are setarch(8) symlinks
|
||||
START += $(ARCH)
|
||||
|
||||
# to be passed into distcfg.mk
|
||||
IMAGEDIR ?= $(shell [ -d "$$HOME/out" -a -w "$$HOME/out" ] \
|
||||
&& echo "$$HOME/out" \
|
||||
|| echo "$(BUILDDIR)/out" )
|
||||
|
||||
build: profile/populate
|
||||
@echo -n "** starting image build"
|
||||
@echo -n "$(TIME) starting image build"
|
||||
@if [ -n "$(DEBUG)" ]; then \
|
||||
echo ": tail -f $(BUILDLOG)" $(SHORTEN); \
|
||||
else \
|
||||
echo " (coffee time)"; \
|
||||
fi
|
||||
@if time -f "%E %PCPU %Mk" $(ARCH) \
|
||||
$(MAKE) -C $(BUILDDIR)/ $(LOG); \
|
||||
then \
|
||||
echo "** build done (`tail -1 $(BUILDLOG) | cut -f1 -d. \
|
||||
|| echo "no log"`)"; \
|
||||
else \
|
||||
echo "** build failed, see log: $(BUILDLOG)" $(SHORTEN); \
|
||||
if [ -z "$(DEBUG)" ]; then \
|
||||
echo " (you might want to re-run with DEBUG=1)"; \
|
||||
if [ -n "$(ALL)" ]; then \
|
||||
echo " [$(ALL)]"; \
|
||||
else \
|
||||
echo " (coffee time)"; \
|
||||
fi; \
|
||||
tail -100 "$(BUILDLOG)" | egrep "^E:|[Ee]rror|[Ww]arning"; \
|
||||
df -P $(BUILDDIR) | awk 'END { if ($$4 < 1024) \
|
||||
{ print "** NB: low space on "$$6" ("$$5" used)"}}'; \
|
||||
fi
|
||||
@if $(START) $(MAKE) -C $(BUILDDIR)/ $(LOG); then \
|
||||
echo "$(TIME) done (`tail -1 $(BUILDLOG) | cut -f1 -d.`)"; \
|
||||
tail -200 "$(BUILDLOG)" \
|
||||
| grep --color=always '^\*\* image: .*' $(SHORTEN) ||:; \
|
||||
else \
|
||||
echo "$(TIME) failed, see log: $(BUILDLOG)" $(SHORTEN); \
|
||||
if [ -z "$(DEBUG)" ]; then \
|
||||
echo "$(TIME) (you might want to re-run with DEBUG=1)"; \
|
||||
fi; \
|
||||
tail -200 "$(BUILDLOG)" | egrep "^(E:|[Ee]rror|[Ww]arning).*"; \
|
||||
df -P $(BUILDDIR) | awk 'END { if ($$4 < $(LOWSPACE)) \
|
||||
{ print "NB: low space on "$$6" ("$$5" used)"}}'; \
|
||||
fi
|
||||
@if [ -n "$(BELL)" ]; then echo -ne '\a' >&2; fi
|
||||
|
10
lib/clean.mk
10
lib/clean.mk
@@ -8,16 +8,17 @@
|
||||
ifdef CLEAN
|
||||
export GLOBAL_CLEAN_WORKDIR = clean-current
|
||||
ifdef DEBUG
|
||||
WARNING = (both CLEAN and DEBUG defined, debug options will be limited)
|
||||
WARNING = (NB: DEBUG scope is limited when CLEAN is enabled)
|
||||
endif
|
||||
endif
|
||||
|
||||
# ordinary clean: destroys workdirs but not the corresponding results
|
||||
clean:
|
||||
@echo '** cleaning up $(WARNING)'
|
||||
@echo "$(TIME) cleaning up $(WARNING)"
|
||||
@find -name '*~' -delete >&/dev/null ||:
|
||||
@if [ -L build -a -d build/ ]; then \
|
||||
$(MAKE) -C build $@ GLOBAL_BUILDDIR=$(shell readlink build) $(LOG) ||:; \
|
||||
$(MAKE) -C build $@ \
|
||||
GLOBAL_BUILDDIR=$(shell readlink build) $(LOG) ||:; \
|
||||
fi
|
||||
|
||||
# there can be some sense in writing log here even if normally
|
||||
@@ -26,7 +27,8 @@ clean:
|
||||
distclean: clean
|
||||
@if [ -L build -a -d build/ ]; then \
|
||||
rm -rf build/.git; \
|
||||
$(MAKE) -C build $@ GLOBAL_BUILDDIR=$(shell readlink build) $(LOG) || \
|
||||
$(MAKE) -C build $@ \
|
||||
GLOBAL_BUILDDIR=$(shell readlink build) $(LOG) || \
|
||||
rm -rf build/; \
|
||||
rm -rf $(shell readlink build); \
|
||||
fi
|
||||
|
@@ -22,6 +22,8 @@ MAKE += -s
|
||||
LOG = 2>>$(BUILDLOG) >/dev/null
|
||||
endif
|
||||
|
||||
# in build.mk, naive TIME gets expanded a bit too early (no need to export btw)
|
||||
DATE = $(shell date +%Y%m%d)
|
||||
TIME = `date +%H:%M:%S`
|
||||
|
||||
export BUILDLOG DATE DEBUG GLOBAL_DEBUG GLOBAL_VERBOSE LOG MAKE SHELL
|
||||
export BUILDLOG DATE GLOBAL_DEBUG GLOBAL_VERBOSE LOG MAKE SHELL
|
||||
|
@@ -35,7 +35,7 @@ SHORTEN = $(shell \
|
||||
|
||||
# step 1: initialize the off-tree mkimage profile (BUILDDIR)
|
||||
profile/init: distclean
|
||||
@echo -n "** initializing BUILDDIR: "
|
||||
@echo -n "$(TIME) initializing BUILDDIR: "
|
||||
@rsync -qaH --delete image.in/ "$(BUILDDIR)"/
|
||||
@mkdir "$(BUILDDIR)"/.mki # mkimage toplevel marker
|
||||
@$(call put,ifndef DISTCFG_MK)
|
||||
@@ -46,6 +46,16 @@ profile/init: distclean
|
||||
git status -s && \
|
||||
echo; \
|
||||
fi $(LOG); \
|
||||
fi
|
||||
@{ \
|
||||
eval `apt-config shell $${APTCONF:+-c=$(wildcard $(APTCONF))} \
|
||||
SOURCELIST Dir::Etc::sourcelist/f \
|
||||
SOURCEPARTS Dir::Etc::sourceparts/d`; \
|
||||
find "$$SOURCEPARTS" -name '*.list' \
|
||||
| xargs egrep -Rhv '^#|^[[:blank:]]*$$' "$$SOURCELIST" && \
|
||||
echo; \
|
||||
} $(LOG)
|
||||
@if type -t git >&/dev/null; then \
|
||||
if cd $(BUILDDIR); then \
|
||||
git init -q && \
|
||||
git add . && \
|
||||
@@ -61,7 +71,8 @@ profile/init: distclean
|
||||
fi $(SHORTEN)
|
||||
|
||||
profile/bare: profile/init
|
||||
@echo "** preparing distro config$${DEBUG:+: see $(CONFIG)}" \
|
||||
@NOTE="$${GLOBAL_VERBOSE:+: $(CONFIG)}"; \
|
||||
echo "$(TIME) preparing distro config$$NOTE" \
|
||||
$(SHORTEN)
|
||||
@$(call try,MKIMAGE_PREFIX,/usr/share/mkimage)
|
||||
@$(call try,GLOBAL_VERBOSE,)
|
||||
|
@@ -1,7 +1,7 @@
|
||||
Этот каталог содержит субпрофили; содержимое затребованных
|
||||
(названия которых содержатся в значении переменной SUBPROFILES,
|
||||
которую заполняют цели sub/* -- см. ../lib/distro.mk) будет
|
||||
скопировано в каталог $(BUILDDIR)/image/ формируемого профиля.
|
||||
скопировано в корневой каталог формируемого профиля.
|
||||
|
||||
Просьба ответственно относиться к изменению существующих субпрофилей
|
||||
и вдумчиво -- к созданию новых; возможно, достаточно всего лишь
|
||||
|
@@ -1,6 +1,7 @@
|
||||
Этот каталог содержит субпрофиль main, собирающий пакетную базу
|
||||
для локальной инсталяции дистрибутива из полученного образа,
|
||||
включая необязательные пакеты.
|
||||
включая необязательные пакеты; в live-builder применяется как
|
||||
локальный репозиторий для сборки.
|
||||
|
||||
Подбирает:
|
||||
- SYSTEM_PACKAGES, COMMON_PACKAGES, BASE_PACKAGES, BASE_LISTS:
|
||||
|
@@ -13,6 +13,8 @@
|
||||
STAGE1_KMODULES_REGEXP -- будет подмножество модулей
|
||||
из kernel-image (упаковываются в syslinux/alt0/full.cz).
|
||||
|
||||
Требуется для инсталяционных, live- и rescue-образов.
|
||||
Требуется для инсталяционных, live- и rescue-образов,
|
||||
соответствующими фичами подключается автоматически
|
||||
(в силу зависимости stage2 от stage1).
|
||||
|
||||
Результат -- каталог syslinux/ для копирования в образ.
|
||||
|
@@ -2,6 +2,9 @@
|
||||
используемый для сборки образов install2, live, rescue (возможно,
|
||||
нескольких одновременно в составе одного дистрибутива).
|
||||
|
||||
Зависимость на него стоит прописывать в таких фичах;
|
||||
сама по себе (без нужного stage2cfg.mk) смысла не имеет.
|
||||
|
||||
Результат -- соответственно названный файл со squashfs,
|
||||
подлежащий копированию в итоговый образ.
|
||||
|
||||
|
Reference in New Issue
Block a user