Commit d5a5941f authored by Michael Shigorin's avatar Michael Shigorin

official {distro,ve}/* support

This is quite a large-scale change since mkimage-profiles got used to baking distributions over the last year, and virtual environments are quite different, so e.g. image.in/Makefile had to be split in two with the main part of it moved into features.in/iso/lib/. Short overview: - features.in/Makefile: lib/ support (supporting VE images requires dynamic modifications to image.in/Makefile before starting the build; the most natural way to achieve that seems to use features mechanism along with makefile include dir) - packaging format related part moved into features.in/pack (should be better prepared for diversity either) - features.in/iso renamed to features.in/build-distro - features.in/ve renamed to features.in/build-ve + NB: these could not be merged as e.g. features.in/build due to completely different script hooks - lib/image.mk renamed to lib/build.mk - image, config, log postprocessing moved downstream - added a sort of a topping in the form of lib/sugar.mk - assorted style fixups (like ifeq usage) - clean.mk: reliability fix (the problem was observed by Oleg Ivanov and me too but finally it did get the attention quantum) - reviewed, updated and extended docs + QUICKSTART: should be[come] a step-by-step guide (thanks Leo-sp50 for prodiving feedback)
parent 720a5796
...@@ -2,50 +2,57 @@ ...@@ -2,50 +2,57 @@
# --- here # --- here
# 1. initialize new profile (BUILDDIR) as a copy of image.in/ # 1. initialize new profile (BUILDDIR) as a copy of image.in/
# 2. configure distro # 2. configure distro
# 3. copy subprofiles, script hooks, and package lists/groups # 3. copy the needed bits from metaprofile to a new profile
# from metaprofile to new profile (as needed)
# --- in BUILDDIR # --- in BUILDDIR
# 4. build subprofiles and subsequently the image # 4. build subprofiles and subsequently an image
all help: MKIMAGE_PROFILES = $(dir $(lastword $(MAKEFILE_LIST)))
@echo '** available distribution targets:'
@echo $(IMAGES) | fmt -sw"$$((COLUMNS>>1))" | column -t # only process the first target (inter-target cleanup is tricky)
IMAGE_TARGET := $(firstword $(MAKECMDGOALS))# distro/server-base.iso
IMAGE_CONF := $(basename $(MAKECMDGOALS))# distro/server-base
IMAGE_CLASS := $(dir $(IMAGE_TARGET))# distro/ (let's fix it)
IMAGE_CLASS := $(IMAGE_CLASS:%/=%)# distro
IMAGE_FILE := $(notdir $(IMAGE_TARGET))# server-base.iso
IMAGE_NAME := $(basename $(IMAGE_FILE))# server-base
IMAGE_TYPE := $(suffix $(IMAGE_FILE))# .iso (fix this too)
IMAGE_TYPE := $(IMAGE_TYPE:.%=%)# iso
# most of the actual work done elsewhere # most of the actual work done elsewhere
include clean.mk include lib/*.mk
include profile.mk include features.in/*/config.mk
include distro.mk
include log.mk DISTROS := $(call addsuffices,$(DISTRO_EXTS),$(DISTRO_TARGETS))
include iso.mk VES := $(call addsuffices,$(VE_EXTS),$(VE_TARGETS))
IMAGES := $(DISTROS) $(VES)
.PHONY: $(IMAGES) .PHONY: $(IMAGES)
# we can't use implicit rules for top-level targets, only for prereqs help:
# NB: what about static pattern rules? @echo '** available distribution targets:'
# TODO: move into libdistro? @echo $(DISTROS) | fmt -sw"$$((COLUMNS>>1))" | column -t
DISTROS := $(shell sed -n 's,^distro/\([^:.]\+\):.*$$,\1,p' distro.mk) @echo
IMAGES := $(addsuffix .iso,$(DISTROS)) @echo '** available virtual environment targets:'
@echo $(VES) | fmt -sw"$$((COLUMNS>>1))" | column -t
# to be passed into distcfg.mk
IMAGEDIR ?= $(shell [ -d "$$HOME/out" -a -w "$$HOME/out" ] \ ### suboptimal but at least clear, reliable and convenient
&& echo "$$HOME/out" \ all:
|| echo "$(BUILDDIR)/out" ) @for i in $(DISTROS); do \
IMAGENAME ?= mkimage-profiles-$(ARCH).iso echo "** building $$i:"; \
$(MAKE) --no-print-directory BUILDDIR=$(BUILDDIR) $$i; \
everything: echo; \
@for i in $(IMAGES); do $(MAKE) BUILDDIR=$(BUILDDIR) $$i; done done
$(IMAGES): %.iso: | profile/init distro/% boot/isolinux profile/populate iso $(IMAGES): debug \
@# TODO: run automated tests (e.g. iso size) config/with/$(IMAGE_CONF) \
@OUTNAME="$(@:.iso=)-$(DATE)-$(ARCH).iso"; \ config/like/$(IMAGE_CLASS) \
OUTPATH="$(IMAGEDIR)/$$OUTNAME"; \ config/name/$(IMAGE_NAME) \
mkdir -p "$(IMAGEDIR)" && \ config/pack/$(IMAGE_TYPE) \
test -s "$(IMAGEDIR)/$(IMAGENAME)" && \ build; @:
mv "$(IMAGEDIR)/$(IMAGENAME)" "$$OUTPATH" && \
echo "** image: $$OUTPATH" && \ debug:
ln -sf "$$OUTNAME" "$(IMAGEDIR)/$@" && \ ifeq (2,$(DEBUG))
ln -sf "$@" "$(IMAGEDIR)/mkimage-profiles.iso"; \ @$(foreach v,\
if [ -n "$(DEBUG)" ]; then \ $(filter IMAGE_%,$(sort $(.VARIABLES))),\
cp -a "$(BUILDLOG)" "$$OUTPATH.log"; \ $(warning $v = $($v)))
cp -a "$(CONFIG)" "$$OUTPATH.cfg"; \ endif
fi
требуется
~~~~~~~~~
- ALT Linux 6.0 или выше (возможна адаптация "вниз")
- установленный mkimage (свежий, как и hasher)
- пользователь с правом запуска hasher
полезно
~~~~~~~
- смонтированный tmpfs на несколько гигабайт
+ например, в /tmp или /home/USER/hasher
+ каталог из prefix в /etc/hasher-priv/system
- установленный git-core
- настроенный ~/.gitconfig
команды
~~~~~~~
- от имени root:
# apt-get install hasher git-core
# hasher-useradd USER
- от имени пользователя (после повторного входа):
$ git config --global user.email "my@email"
$ git config --global user.name "My Name"
- тестовая сборка (см. тж. lib/distro.mk, doc/variables.txt):
$ 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
see also http://www.altlinux.org/Mkimage/Profiles/next Welcome to mkimage-profiles!
quickstart: make server-base.iso; English quickstart: make distro/server-base.iso;
see http://en.altlinux.org/Hasher (and a large tmpfs) see http://en.altlinux.org/Hasher (and a large tmpfs).
configurables: ~/.mkimage/profiles.mk; Configurables: ~/.mkimage/profiles.mk;
see doc/profiles.mk.sample and libdistro.mk see doc/profiles.mk.sample and libdistro.mk
license: GPLv2+, see COPYING License: GPLv2+, see COPYING.
most docs in Russian, welcome to learn it or ask for English Most docs in Russian, welcome to learn it or ask for English.
См. тж. http://www.altlinux.org/Mkimage/Profiles/next
Концепция: Концепция:
- метапрофиль служит репозиторием для построения индивидуального - метапрофиль служит репозиторием для построения индивидуального
...@@ -30,8 +31,11 @@ most docs in Russian, welcome to learn it or ask for English ...@@ -30,8 +31,11 @@ most docs in Russian, welcome to learn it or ask for English
- сборка дистрибутива - сборка дистрибутива
Объекты: Объекты:
- виртуальные окружения:
+ описываются в lib/ve.mk
+ могут основываться одно на другом
- дистрибутивы: - дистрибутивы:
+ описываются в distro.mk + описываются в lib/distro.mk
+ могут основываться один на другом + могут основываться один на другом
+ включают один или более субпрофилей по надобности + включают один или более субпрофилей по надобности
+ желательно избегать множественного наследования, см. тж. фичи + желательно избегать множественного наследования, см. тж. фичи
...@@ -50,12 +54,12 @@ most docs in Russian, welcome to learn it or ask for English ...@@ -50,12 +54,12 @@ most docs in Russian, welcome to learn it or ask for English
+ список собирается в $(FEATURES) + список собирается в $(FEATURES)
+ законченные блоки функциональности (или наборы таковых) + законченные блоки функциональности (или наборы таковых)
+ описываются в индивидуальных features.in/*/config.mk + описываются в индивидуальных features.in/*/config.mk
+ могут зависеть друг от друга и требовать субпрофили + могут требовать другие фичи, а также субпрофили
+ при сборке $(BUILDDIR) содержимое указанных в $(FEATURES) фич + при сборке $(BUILDDIR) содержимое указанных в $(FEATURES) фич
(подкаталоги, соответствующие входящим в дистрибутив субпрофилям (подкаталоги, соответствующие входящим в дистрибутив субпрофилям
под их итоговыми названиями -- например, live, а не stage2/live) под их итоговыми названиями -- например, live, а не stage2/live)
добавляется в профиль; затем выполняются generate.sh, generate.mk добавляется в профиль; затем выполняются generate.sh, generate.mk
- списки пакетов (*_LISTS): просьба по возможности избегать дублирования - списки пакетов (*_LISTS): просьба по возможности избегать дублирования;
NB: перечисленные в этих переменных файлы автоматически копируются NB: перечисленные в этих переменных файлы автоматически копируются
в порождаемый профиль => не следует указывать пакаджлисты напрямую в порождаемый профиль => не следует указывать пакаджлисты напрямую
- индивидуальные пакеты (*_PACKAGES): следует крайне осторожно пользоваться - индивидуальные пакеты (*_PACKAGES): следует крайне осторожно пользоваться
......
...@@ -27,3 +27,8 @@ ...@@ -27,3 +27,8 @@
- features.in/syslinux/scripts.d/20-propagator-ramdisk - features.in/syslinux/scripts.d/20-propagator-ramdisk
+ ожидают, что названия squashfs-образов второй стадии инсталятора, + ожидают, что названия squashfs-образов второй стадии инсталятора,
livecd и спасательной системы соответственно altinst, live и rescue livecd и спасательной системы соответственно altinst, live и rescue
- image.in/Makefile
+ ожидает, что конфигурация будет в distcfg.mk (см. тж. lib/profile.mk),
а лог сборки -- в build.log (см. тж. lib/log.mk); альтернативой было
бы пробрасывание переменных с полным путём ради единственного места
...@@ -6,29 +6,29 @@ ...@@ -6,29 +6,29 @@
- APTCONF - APTCONF
+ задаёт путь к требуемому apt.conf + задаёт путь к требуемому apt.conf
+ значение: пусто (по умолчанию системный) либо строка + значение: пусто (по умолчанию системный) либо строка
+ см. image.in/Makefile + см. ../image.in/Makefile
- ARCH - ARCH
+ определяет целевую архитектуру образа + определяет целевую архитектуру образа
+ значение: пусто (по умолчанию авто), i586 или x86_64 + значение: пусто (по умолчанию авто), i586 или x86_64
+ см. iso.mk + см. ../lib/build.mk
- BUILDDIR - BUILDDIR
+ определяет каталог генерируемого профиля и сборки + определяет каталог генерируемого профиля и сборки
+ значение: пусто (по умолчанию авто) либо строка + значение: пусто (по умолчанию авто) либо строка
+ см. profile.mk + см. ../lib/profile.mk
- CLEAN - CLEAN
+ экономия RAM при сборке в tmpfs, иначе места на диске + экономия RAM+swap при сборке в tmpfs, иначе места на диске
+ очистка рабочего каталога после успешной сборки очередной стадии + очистка рабочего каталога после успешной сборки очередной стадии
+ может помешать использовать некоторые варианты отладки + может помешать использовать некоторые варианты отладки
+ значение: любая строка, по умолчанию пусто + значение: любая строка, по умолчанию пусто
+ см. clean.mk + см. ../lib/clean.mk
- DEBUG - DEBUG
+ включение средств отладки + включение средств отладки
+ значение: пусто (по умолчанию), 1 или 2 + значение: пусто (по умолчанию), 1 или 2
+ см. log.mk + см. ../lib/log.mk
пример пример
~~~~~~ ~~~~~~
......
...@@ -44,4 +44,4 @@ ...@@ -44,4 +44,4 @@
произвести из generate.sh и generate.mk. произвести из generate.sh и generate.mk.
Пожалуйста, присылайте отзывы о (бес)полезности кода в этом каталоге Пожалуйста, присылайте отзывы о (бес)полезности кода в этом каталоге
mike@altlinux. mike@altlinux.org.
...@@ -40,17 +40,17 @@ all: ...@@ -40,17 +40,17 @@ all:
dst="$${sub#*/}"; \ dst="$${sub#*/}"; \
if [ -d "$$src" ]; then rsync -qab "$$src/" "$(BUILDDIR)/$$dst/"; fi; \ if [ -d "$$src" ]; then rsync -qab "$$src/" "$(BUILDDIR)/$$dst/"; fi; \
if [ -d "$$dst" ]; then rsync -qab "$$dst/" "$(BUILDDIR)/$$dst/"; fi; \ if [ -d "$$dst" ]; then rsync -qab "$$dst/" "$(BUILDDIR)/$$dst/"; fi; \
for scr in {image-,}scripts.d; do \ for dir in lib {image-,}scripts.d; do \
scriptdir="$(BUILDDIR)/$$dst/$$scr/"; \ destdir="$(BUILDDIR)/$$dst/$$dir/"; \
if [ -d "$$scriptdir" ]; then \ if [ -d "$$destdir" ]; then \
if [ -d "$$scr" ]; then \ if [ -d "$$dir" ]; then \
rsync -qab "$$scr/" "$$scriptdir/"; \ rsync -qab "$$dir/" "$$destdir/"; \
fi; \ fi; \
if [ -d "tagged/$$scr" ]; then \ if [ -d "tagged/$$dir" ]; then \
pushd "tagged/$$scr" && \ pushd "tagged/$$dir" && \
echo "$$feat && ($$src || $$dst)" \ echo "$$feat && ($$src || $$dst)" \
| tags2lists . \ | tags2lists . \
| xargs -r cp -v -pLt "$$scriptdir" --; \ | xargs -r cp -v -pLt "$$destdir" --; \
popd; \ popd; \
fi; \ fi; \
fi; \ fi; \
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
Каждая фича должна содержать задействуемый при построении Каждая фича должна содержать задействуемый при построении
конфигурации будущего образа файл config.mk, включаемый конфигурации будущего образа файл config.mk, включаемый
в ../distro.mk; он может описывать одну или более целей в ../Makefile; он может описывать одну или более целей
вида use/*, дополняющих конфигурацию дистрибутива, и при вида use/*, дополняющих конфигурацию дистрибутива, и при
наличии дополнительных хуков для копирования или generate.* наличии дополнительных хуков для копирования или generate.*
должен добавить имя фичи в $(FEATURES). должен добавить имя фичи в $(FEATURES).
...@@ -24,5 +24,8 @@ generate.sh и задействуется generate.mk (при их наличи ...@@ -24,5 +24,8 @@ generate.sh и задействуется generate.mk (при их наличи
построенных на одном базовом, можно воспользоваться подкаталогом построенных на одном базовом, можно воспользоваться подкаталогом
с именем исходного базового субпрофиля (см. $src, $dst в Makefile). с именем исходного базового субпрофиля (см. $src, $dst в Makefile).
Каталог lib/ является специфическим для фич, определяющих
построение образа -- см. build-*/.
Несложный пример содержится в 00example/, более близкий к жизни Несложный пример содержится в 00example/, более близкий к жизни
и нынешним пределам возможностей метапрофиля -- в syslinux/. и нынешним пределам возможностей метапрофиля -- в syslinux/.
...@@ -6,4 +6,5 @@ ...@@ -6,4 +6,5 @@
и требует пакет выбранного загрузчика. и требует пакет выбранного загрузчика.
Реализация экспериментальная (нужно модуляризовать installer-steps), Реализация экспериментальная (нужно модуляризовать installer-steps),
пока завязана на installer-distro-altlinux-generic. пока завязана на installer-distro-altlinux-generic. Возможно,
с использованием alterator-lilo связаны проблемы времени установки.
Эта фича конфигурирует создание образа дистрибутива, включая работу
с субпрофилями -- которая сейчас нужна только дистрибутивным целям.
Дополняет финальную стадию сборки (lib/, scripts.d/).
use/build-distro: boot/isolinux
@$(call add,FEATURES,build-distro)
# step 4: build the distribution image
# for complex-specified subprofiles like stage2/live,
# take the latter part
SUBDIRS = $(notdir $(SUBPROFILES))
# "main" subprofile needs genbasedir
CHROOT_PACKAGES = apt-utils
BOOT_TYPE = isolinux
# Metadata/ needed only for installers (and not for e.g. syslinux.iso)
# FIXME: installable live needs it too, don't move to install2 feature
ifneq (,$(findstring install2,$(FEATURES)))
METADATA = metadata
endif
all: $(GLOBAL_DEBUG) prep copy-subdirs copy-tree run-scripts pack-image \
postprocess $(GLOBAL_CLEAN_WORKDIR)
prep: $(GLOBAL_DEBUG) dot-disk $(METADATA) $(IMAGEDIR)
metadata: dot-base
@mkdir -p files/Metadata
@rm -f files/Metadata/pkg-groups.tar
# see also alterator-pkg (backend3/pkg-install); we only tar up what's up to it
@tar -cvf files/Metadata/pkg-groups.tar -C $(PKGDIR) \
$$(echo $(call list,$(MAIN_GROUPS) .base) \
$(call group,$(MAIN_GROUPS)) \
| sed 's,$(PKGDIR)/*,,g')
dot-base:
@{ \
echo -e "\n## added by image.in/Makefile"; \
echo "$(call kpackages,$(KMODULES),$(KFLAVOURS))"; \
} >> $(call list,.base)
dot-disk:
@mkdir -p files/.disk
@echo "ALT Linux based" >files/.disk/info
@echo "$(ARCH)" >files/.disk/arch
@echo "$(DATE)" >files/.disk/date
@if type -t git >&/dev/null; then \
( cd $(TOPDIR) && \
git show-ref --head -ds -- HEAD ) \
>files/.disk/commit 2>/dev/null; \
fi
Эта фича конфигурирует создание образа виртуального окружения (VE).
Дополняет финальную стадию сборки (lib/, image-scripts.d/).
use/build-ve:
@$(call add,FEATURES,build-ve)
#!/bin/sh
# VEs typically have no means to communicate with the outer
# world except for networking; still this might need some
# more tweaking for networkless LXC case
# candidates:
# off: keytable
for i in network random syslogd random; do chkconfig $i on; done
for i in fbsetfont netfs rawdevices; do chkconfig $i off; done
:
#!/bin/sh -e
# we don't need no gettys in OpenVZ VEs (might need one in LXC though)
subst 's,^[0-9]\+:[0-9]\+:respawn:/sbin/mingetty.*,#&,' /etc/inittab
#!/bin/sh -e
# should be pretty much obsolete but just in case
[ -L /etc/mtab ] || ln -sf /proc/mounts /etc/mtab
#!/bin/sh -e
# tweak syslog configuration to:
# - avoid logging to a nonexistent tty;
# - avoid hard sync logging (one is better off doing
# remote syslog if you do care for reliable data anyways)
# credits: vvk@, thresh@ (2010)
sed -i \
-e 's,/dev/tty12,/var/log/syslog/console,' \
-e 's,^.*/var/log/syslog/console$,#&,' \
-e 's,-/var/log/,/var/log/,g' \
-e 's,/var/log/,-/var/log/,g' \
/etc/syslog.conf
# step 4: build the virtual environment image
MKI_TAR_COMPRESS = $(IMAGE_COMPRESS)
IMAGE_PACKAGES = $(call list,$(BASE_LISTS)) \
$(SYSTEM_PACKAGES) \
$(COMMON_PACKAGES) \
$(BASE_PACKAGES)
all: $(GLOBAL_DEBUG) build-image copy-tree run-image-scripts pack-image \
postprocess $(GLOBAL_CLEAN_WORKDIR)
Добавление memtest86+ в загрузку с образа и в устанавливаемую пакетную базу; Добавление memtest86+ в загрузку с образа и в устанавливаемую пакетную базу;
востребовано для для инсталяторов, live/rescue. Интегрируется с syslinux. востребовано для инсталяторов, live/rescue. Интегрируется с syslinux.
Эта фича определяет формат упаковки создаваемого образа.
На данный момент поддерживаются iso (загрузочный ISO9660
для дистрибутивов) и tar (виртуальные окружения).
DISTRO_EXTS := .iso
VE_EXTS := .tar .tgz
use/pack:
@$(call add,FEATURES,pack)
use/pack/iso: use/pack boot/isolinux
ifeq (distro,$(IMAGE_CLASS))
@$(call set,IMAGE_PACKTYPE,isoboot)
else
@$(call set,IMAGE_PACKTYPE,isodata)
endif
use/pack/tar: use/pack
@$(call set,IMAGE_PACKTYPE,tar)
use/pack/tgz: use/pack/tar
@$(call set,IMAGE_COMPRESS,gzip)
Эта фича конфигурирует поддержку управления кнопкой питания Эта фича конфигурирует поддержку управления кнопкой питания
-- выключение для ACPI, засыпание для APM (не проверялось). -- выключение для ACPI, засыпание для APM (не проверялось).
TODO: учесть изложенное в https://bugzilla.altlinux.org/25018
Добавление поддержки syslinux; требуется для инсталяторов, live/rescue. Добавление поддержки syslinux; требуется для инсталяторов, live/rescue;
реализуется в рамках stage1.
Цели config.mk: Цели config.mk:
* use/syslinux/ui-% -- конфигурирование интерфейса (см. cfg.in/00*.cfg); * use/syslinux/ui-% -- конфигурирование интерфейса (см. cfg.in/00*.cfg);
при использовании автоматически добавляют syslinux в FEATURES при использовании автоматически добавляют syslinux в FEATURES;
* use/syslinux/%.com, use/syslinux/%.c32 -- подключение одноименных модулей * use/syslinux/%.com, use/syslinux/%.c32 -- подключение одноименных модулей
(копирование бинарников и включение кусочков конфигурации; экспериментальное) (копирование бинарников и включение кусочков конфигурации; экспериментальное);
* use/syslinux/%.cfg -- подключение кусочков конфигурации (используется) * use/syslinux/%.cfg -- подключение кусочков конфигурации.
Переменные generate.mk: Переменные generate.mk:
...@@ -19,3 +20,7 @@ ...@@ -19,3 +20,7 @@
Здесь производится первичная обработка конфигурационных данных, Здесь производится первичная обработка конфигурационных данных,
окончательно проверяемых и используемых уже в инструментальном чруте. окончательно проверяемых и используемых уже в инструментальном чруте.
TODO: может потребоваться обобщение механизма генерации с учётом
многоуровневых меню и включаемых файлов (которыми лучше не злоупотреблять
из соображений скорости инициализации загрузчика).
# default is plain text prompt # default is plain text prompt
use/syslinux: use/syslinux: sub/stage1
@$(call add,FEATURES,syslinux) @$(call add,FEATURES,syslinux)
@$(call add,STAGE1_PACKAGES,syslinux) @$(call add,STAGE1_PACKAGES,syslinux)
......
# step 4: build image (final stage) # stage 4: dive into mkimage
#
# NB: this directory forms the initial BUILDDIR/
ifndef GLOBAL_BUILDDIR GLOBAL_BUILDDIR ?= $(shell pwd)
$(error GLOBAL_BUILDDIR not defined)
endif
include distcfg.mk
include functions.mk include functions.mk
include $(GLOBAL_BUILDDIR)/functions.mk
include $(GLOBAL_BUILDDIR)/distcfg.mk
include $(MKIMAGE_PREFIX)/config.mk include $(MKIMAGE_PREFIX)/config.mk
# for complex-specified subprofiles like stage2/live, # reconstruct instead of passing yet another variable
# take the latter part IMAGE_FILE := $(IMAGE_NAME).$(IMAGE_TYPE)
SUBDIRS = $(notdir $(SUBPROFILES)) IMAGE_OUTFILE := $(IMAGE_NAME)-$(DATE)-$(ARCH).$(IMAGE_TYPE)
MKI_PACK_RESULTS = $(IMAGE_PACKTYPE):$(IMAGE_OUTFILE)
# "main" subprofile needs genbasedir # these get opied over as is
CHROOT_PACKAGES = apt-utils
MKI_PACK_RESULTS = isoboot:$(IMAGENAME)
COPY_TREE = ./files COPY_TREE = ./files
BOOT_TYPE = isolinux
# outdir shouldn't be wiped clean before use # outdir shouldn't be wiped clean before use
CLEANUP_OUTDIR ?= CLEANUP_OUTDIR ?=
APTCONF := $(wildcard $(APTCONF)) APTCONF := $(wildcard $(APTCONF))
ifeq "$(APTCONF)" "" ifeq (,$(APTCONF))
GLOBAL_HSH_APT_CONFIG = /etc/apt/apt.conf GLOBAL_HSH_APT_CONFIG = /etc/apt/apt.conf
else else
GLOBAL_HSH_APT_CONFIG = $(APTCONF) GLOBAL_HSH_APT_CONFIG = $(APTCONF)
endif endif
# Metadata/ needed only for installers (and not for e.g. syslinux.iso) # the lib/build-*.mk comes from features.in/build-*/lib
### what about installable live? include lib/*.mk
ifneq (,$(findstring install2,$(FEATURES)))
METADATA = metadata
endif
include $(MKIMAGE_PREFIX)/targets.mk include $(MKIMAGE_PREFIX)/targets.mk
all: $(GLOBAL_DEBUG) prep copy-subdirs copy-tree run-scripts pack-image \ # specified only for the final image (target-specific)
$(GLOBAL_CLEAN_WORKDIR) pack-image: OUTDIR = $(IMAGEDIR)
pack-image: $(IMAGEDIR)
prep: $(GLOBAL_DEBUG) dot-disk $(METADATA) $(IMAGEDIR)
metadata: dot-base
@mkdir -p files/Metadata
@rm -f files/Metadata/pkg-groups.tar
# see also alterator-pkg (backend3/pkg-install); we only tar up what's up to it
@tar -cvf files/Metadata/pkg-groups.tar -C $(PKGDIR) \
$$(echo $(call list,$(MAIN_GROUPS) .base) \
$(call group,$(MAIN_GROUPS)) \
| sed 's,$(PKGDIR)/*,,g')
dot-base:
@{ \
echo -e "\n## added by image.in/Makefile"; \
echo "$(call kpackages,$(KMODULES),$(KFLAVOURS))"; \
} >> $(call list,.base)
$(IMAGEDIR): $(IMAGEDIR):
@mkdir -p "$(IMAGEDIR)" @mkdir -p "$(IMAGEDIR)"
# specified only for the final image, not for the subparts postprocess:
pack-image: OUTDIR = $(IMAGEDIR) @OUTPATH="$(IMAGEDIR)/$(IMAGE_OUTFILE)"; \
echo "** image: $(IMAGE_OUTFILE)" && \
ln -sf "$(IMAGE_OUTFILE)" "$(IMAGEDIR)/$(IMAGE_FILE)" && \
ln -sf "$(IMAGE_FILE)" "$(IMAGEDIR)/mkimage-profiles.$(IMAGE_TYPE)"; \
if [ -n "$(GLOBAL_DEBUG)" ]; then \
cp -a build.log "$$OUTPATH.log"; \
cp -a distcfg.mk "$$OUTPATH.cfg"; \
fi
debug: debug:
@echo "TOPDIR=$(TOPDIR)" @echo "TOPDIR=$(TOPDIR)"
@echo "ARCH=$(ARCH)" @echo "ARCH=$(ARCH)"
@echo "GLOBAL_HSH_APT_CONFIG=$(GLOBAL_HSH_APT_CONFIG)" @echo "GLOBAL_HSH_APT_CONFIG=$(GLOBAL_HSH_APT_CONFIG)"
dot-disk:
@mkdir -p files/.disk
@echo "ALT Linux based" >files/.disk/info
@echo "$(ARCH)" >files/.disk/arch
@echo "$(DATE)" >files/.disk/date
@if type -t git >&/dev/null; then \
( cd $(TOPDIR) && \
git show-ref --head -ds -- HEAD ) \
>files/.disk/commit 2>/dev/null; \
fi
Этот каталог копируется из метапрофиля в профиль "как есть" Этот каталог копируется из метапрофиля в профиль "как есть"
и формирует "затравку", собирающую собственно образ из результатов и формирует "затравку" финальной стадии, собирающей собственно
работы индивидуальных субпрофилей (см. ../sub.in/). образ из результатов работы индивидуальных субпрофилей.
Обратите внимание: в зависимости от того, какой образ нужен,
требуется или features.in/build-distro (для дистрибутивов),
или use/build-ve (для образов виртуальных окружений).
Содержимое files/ копируется в корень образа. Содержимое files/ копируется в корень образа.
......
PKGDIR=$(GLOBAL_BUILDDIR)/pkg # globals
PKGDIR := $(GLOBAL_BUILDDIR)/pkg
DATE ?= $(shell date +%Y%m%d)
# prefix pkglist name with its directory to form a path # prefix pkglist name with its directory to form a path
list = $(1:%=$(PKGDIR)/lists/%) list = $(1:%=$(PKGDIR)/lists/%)
...@@ -12,6 +14,7 @@ map = $(foreach a,$(2),$(call $(1),$(a))) ...@@ -12,6 +14,7 @@ map = $(foreach a,$(2),$(call $(1),$(a)))
# kernel package list generation; see also #24669 # kernel package list generation; see also #24669
NULL := NULL :=
SPACE := $(NULL) # the officially documented way of getting a space SPACE := $(NULL) # the officially documented way of getting a space
list2re = $(subst $(SPACE),|,$(strip $(1))) list2re = $(subst $(SPACE),|,$(strip $(1)))
# args: KMODULES, KFLAVOURS # args: KMODULES, KFLAVOURS
kpackages = ^kernel-(image|modules-($(call list2re,$(1))))-($(call list2re,$(2)))$$ kpackages = ^kernel-(image|modules-($(call list2re,$(1))))-($(call list2re,$(2)))$$
Этот каталог содержит вспомогательные makefiles,
обеспечивающие основную функциональность создания
конфигурации образа и генерации соответствующего
профиля для сборки.
Следует помнить, что будучи включаемыми в ../Makefile,
они работают в каталоге верхнего уровня.
# this makefile is designed to be included in toplevel one # step 4 is kicked off here but actually done by image.in/Makefile
ifndef BUILDDIR
$(error BUILDDIR not defined) ifndef MKIMAGE_PROFILES
$(error this makefile is designed to be included in toplevel one)
endif endif
# NB: /usr/bin/{i586,x86_64} are setarch(8) symlinks
export ARCH ?= $(shell arch | sed 's/i686/i586/') export ARCH ?= $(shell arch | sed 's/i686/i586/')
# step 4 is kicked off here but actually done by image.in/Makefile # to be passed into distcfg.mk
# IMAGEDIR ?= $(shell [ -d "$$HOME/out" -a -w "$$HOME/out" ] \
# adding boot/isolinux to prereqs is too late here, && echo "$$HOME/out" \
# since profile/populate target is already done by now || echo "$(BUILDDIR)/out" )
#
# NB: /usr/bin/{i586,x86_64} are setarch(8) symlinks
iso: build: profile/populate
@echo -n "** starting image build" @echo -n "** starting image build"
@if [ -n "$(DEBUG)" ]; then \ @if [ -n "$(DEBUG)" ]; then \
echo ": tail -f $(BUILDLOG)" $(SHORTEN); \ echo ": tail -f $(BUILDLOG)" $(SHORTEN); \
...@@ -20,7 +21,7 @@ iso: ...@@ -20,7 +21,7 @@ iso:
echo " (coffee time)"; \ echo " (coffee time)"; \
fi fi
@if time -f "%E %PCPU %Mk" $(ARCH) \ @if time -f "%E %PCPU %Mk" $(ARCH) \
$(MAKE) -C $(BUILDDIR)/ GLOBAL_BUILDDIR=$(BUILDDIR) $(LOG); \ $(MAKE) -C $(BUILDDIR)/ $(LOG); \
then \ then \
echo "** build done (`tail -1 $(BUILDLOG) | cut -f1 -d. \ echo "** build done (`tail -1 $(BUILDLOG) | cut -f1 -d. \
|| echo "no log"`)"; \ || echo "no log"`)"; \
......
...@@ -17,7 +17,7 @@ clean: ...@@ -17,7 +17,7 @@ clean:
@echo '** cleaning up $(WARNING)' @echo '** cleaning up $(WARNING)'
@find -name '*~' -delete >&/dev/null @find -name '*~' -delete >&/dev/null
@if [ -L build -a -d build/ ]; then \ @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 fi
# there can be some sense in writing log here even if normally # there can be some sense in writing log here even if normally
...@@ -26,7 +26,8 @@ clean: ...@@ -26,7 +26,8 @@ clean:
distclean: clean distclean: clean
@if [ -L build -a -d build/ ]; then \ @if [ -L build -a -d build/ ]; then \
rm -rf build/.git; \ 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 -r $(shell readlink build); \ rm -r $(shell readlink build); \
fi fi
@rm -f build @rm -f build
# this makefile is designed to be included in toplevel one # step 2: build up distribution's configuration
ifndef BUILDDIR
$(error BUILDDIR not defined) ifndef MKIMAGE_PROFILES
$(error this makefile is designed to be included in toplevel one)
endif endif
# step 2: build up distribution's configuration # NB: distro/ targets should be defined in this file
DISTRO_TARGETS := $(shell sed -n 's,^\(distro/[^:.]\+\):.*$$,\1,p' \
$(lastword $(MAKEFILE_LIST)) | sort)
ifeq (distro,$(IMAGE_CLASS))
# NB: distro/ targets should be defined in this file, .PHONY: $(DISTRO_TARGETS)
# see toplevel Makefile's $(DISTROS) assignment
CONFIG = $(BUILDDIR)/distcfg.mk
# collect use/% (source initial feature snippets) # request particular image subprofile inclusion
-include features.in/*/config.mk sub/%:
@$(call add,SUBPROFILES,$(@:sub/%=%))
# put(), add(), set(), try(), tags(): # install media bootloader
# package list names are considered relative to pkg/lists/; boot/%: profile/bare use/syslinux
# tags can do boolean expressions: (tag1 && !(tag2 || tag3)) @$(call set,BOOTLOADER,$*)
include functions.mk
# distro/.%, sub/.%, boot/% # fundamental targets
include libdistro.mk
# bootloader test target; requires recent mkimage to build distro/.init: profile/bare
distro/syslinux: distro/.init distro/.branding sub/stage1 \
# NB: the last flavour in KFLAVOURS gets to be the default one;
# the kernel packages regexp evaluation has to take place at build stage
distro/.base: distro/.init use/syslinux/localboot.cfg
@$(call set,KFLAVOURS,std-def)
# bootloader test target
distro/syslinux: distro/.init \
use/syslinux use/syslinux/localboot.cfg \ use/syslinux use/syslinux/localboot.cfg \
use/syslinux/ui-vesamenu use/hdt use/memtest use/dos use/syslinux/ui-vesamenu use/hdt use/memtest
# live images
distro/live: distro/.base use/live use/syslinux/ui-menu
distro/rescue: distro/.base use/rescue use/syslinux/ui-menu
distro/dos: distro/.init use/dos use/syslinux/ui-menu
# $(VAR) will be substituted before writing them to $(CONFIG); # $(VAR) will be substituted before writing them to $(CONFIG);
# $$(VAR) will remain unsubstituted until $(CONFIG) is included # $$(VAR) will remain unsubstituted until $(CONFIG) is included
...@@ -32,12 +48,6 @@ distro/syslinux: distro/.init distro/.branding sub/stage1 \ ...@@ -32,12 +48,6 @@ distro/syslinux: distro/.init distro/.branding sub/stage1 \
# it's actually used); just peek inside $(CONFIG) ;-) # it's actually used); just peek inside $(CONFIG) ;-)
# BASE_PACKAGES, BASE_LISTS, MAIN_PACKAGES, MAIN_LISTS: see sub.in/main/ # BASE_PACKAGES, BASE_LISTS, MAIN_PACKAGES, MAIN_LISTS: see sub.in/main/
# live images
distro/live: distro/.base use/live use/syslinux/ui-menu
distro/rescue: distro/.base use/rescue use/syslinux/ui-menu
distro/dos: sub/stage1 use/dos use/syslinux/ui-menu
# something actually useful (as a network-only installer) # something actually useful (as a network-only installer)
# NB: doesn't carry stage3 thus cannot use/bootloader # NB: doesn't carry stage3 thus cannot use/bootloader
distro/installer: distro/.base use/install2 distro/installer: distro/.base use/install2
...@@ -84,3 +94,4 @@ distro/icewm: distro/desktop-base \ ...@@ -84,3 +94,4 @@ distro/icewm: distro/desktop-base \
@$(call add,BASE_LISTS,$(call tags,icewm desktop)) @$(call add,BASE_LISTS,$(call tags,icewm desktop))
# NB: if there are too many screens above, it might make sense to distro.d/ # NB: if there are too many screens above, it might make sense to distro.d/
endif
...@@ -38,8 +38,13 @@ endef ...@@ -38,8 +38,13 @@ endef
# if the rule being executed isn't logged yet, log it # if the rule being executed isn't logged yet, log it
define log_body define log_body
{ grep -q '^# $@$$' "$(CONFIG)" || printf '# %s\n' '$@' >> "$(CONFIG)"; } { [ -s "$(CONFIG)" ] && \
grep -q '^# $@$$' "$(CONFIG)" || printf '# %s\n' '$@' >> "$(CONFIG)"; }
endef endef
# convert tag list into a list of relative package list paths # convert tag list into a list of relative package list paths
# NB: tags can do boolean expressions: (tag1 && !(tag2 || tag3))
tags = $(and $(strip $(1)),$(addprefix tagged/,$(shell echo "$(1)" | bin/tags2lists pkg.in/lists/tagged))) tags = $(and $(strip $(1)),$(addprefix tagged/,$(shell echo "$(1)" | bin/tags2lists pkg.in/lists/tagged)))
# toplevel Makefile convenience
addsuffices = $(foreach s,$(1),$(call addsuffix,$s,$(2)))
# this makefile is designed to be included in toplevel one
ifndef BUILDDIR
$(error BUILDDIR not defined)
endif
# simple logging switch inspired by netch@'s advice: # simple logging switch inspired by netch@'s advice:
# you can add plain $(LOG) to a rule recipe line to moderate it # you can add plain $(LOG) to a rule recipe line to moderate it
# (logfile is automatically truncated during profile/init) # (logfile is automatically truncated during profile/init)
ifndef MKIMAGE_PROFILES
$(error this makefile is designed to be included in toplevel one)
endif
BUILDLOG ?= $(BUILDDIR)/build.log BUILDLOG ?= $(BUILDDIR)/build.log
# LOG holds a postprocessor # LOG holds a postprocessor
......
# this makefile is designed to be included in toplevel one ifndef MKIMAGE_PROFILES
$(error this makefile is designed to be included in toplevel one)
endif
SYMLINK = build SYMLINK = build
...@@ -19,6 +21,9 @@ PATH := $(CURDIR)/bin:$(PATH) ...@@ -19,6 +21,9 @@ PATH := $(CURDIR)/bin:$(PATH)
export BUILDDIR NO_CACHE PATH export BUILDDIR NO_CACHE PATH
CONFIG := $(BUILDDIR)/distcfg.mk
RC := $(HOME)/.mkimage/profiles.mk
# holds a postprocessor; shell test executes in particular situation # holds a postprocessor; shell test executes in particular situation
# NB: not exported, for toplevel use only # NB: not exported, for toplevel use only
SHORTEN = $(shell [ "$(DEBUG)" != 2 -a -s "$(SYMLINK)" ] \ SHORTEN = $(shell [ "$(DEBUG)" != 2 -a -s "$(SYMLINK)" ] \
...@@ -28,10 +33,8 @@ SHORTEN = $(shell [ "$(DEBUG)" != 2 -a -s "$(SYMLINK)" ] \ ...@@ -28,10 +33,8 @@ SHORTEN = $(shell [ "$(DEBUG)" != 2 -a -s "$(SYMLINK)" ] \
profile/init: distclean profile/init: distclean
@echo -n "** initializing BUILDDIR: " @echo -n "** initializing BUILDDIR: "
@rsync -qaH --delete image.in/ "$(BUILDDIR)"/ @rsync -qaH --delete image.in/ "$(BUILDDIR)"/
@{ \ @$(call put,ifndef DISTCFG_MK)
echo "ifndef DISTCFG_MK"; \ @$(call put,DISTCFG_MK = 1)
echo "DISTCFG_MK = 1"; \
} > "$(BUILDDIR)"/distcfg.mk
@{ \ @{ \
git show-ref --head -d -s -- HEAD && \ git show-ref --head -d -s -- HEAD && \
git status -s && \ git status -s && \
...@@ -51,8 +54,17 @@ profile/init: distclean ...@@ -51,8 +54,17 @@ profile/init: distclean
echo "$(BUILDDIR)/"; \ echo "$(BUILDDIR)/"; \
fi fi
profile/finalize: distro/.rc profile/bare: profile/init
@echo "endif" >> "$(BUILDDIR)"/distcfg.mk @echo "** preparing distro configuration$${DEBUG:+: see $(CONFIG)}" $(SHORTEN)
@$(call try,MKIMAGE_PREFIX,/usr/share/mkimage)
@$(call try,GLOBAL_VERBOSE,)
@$(call try,IMAGEDIR,$(IMAGEDIR))
@$(call try,BRANDING,altlinux-sisyphus)
@$(call set,IMAGE_INIT_LIST,+branding-$$(BRANDING)-release)
profile/finalize:
@if [ -s $(RC) ]; then $(call put,-include $(RC)); fi
@$(call put,endif)
# requires already formed distcfg.mk for useful output # requires already formed distcfg.mk for useful output
profile/dump-vars: profile/dump-vars:
......
# this makefile contains some syntactic sugar for the toplevel one
# strip prefix
config/with/%: %; @:
# just map to specific features
config/like/%: use/build-%; @:
# map and preconfigure
config/pack/%: use/pack/%
@$(call set,IMAGE_TYPE,$*)
# just preconfigure
config/name/%:
@$(call set,IMAGE_NAME,$*)
# step 2: build up virtual environment's configuration
ifndef MKIMAGE_PROFILES
$(error this makefile is designed to be included in toplevel one)
endif
# NB: ve/ targets should be defined in this file
VE_TARGETS := $(shell sed -n 's,^\(ve/[^:.]\+\):.*$$,\1,p' \
$(lastword $(MAKEFILE_LIST)) | sort)
ifeq (ve,$(IMAGE_CLASS))
.PHONY: $(VE_TARGETS)
ve/.bare: profile/bare
@$(call add,BASE_PACKAGES,basesystem)
ve/generic: ve/.bare
@$(call add,BASE_LISTS,\
$(call tags,base && (server || network || security || pkg)))
ve/openvpn: ve/.bare
@$(call add,BASE_LISTS,$(call tags,server openvpn))
# NB: if there are too many screens above, it might make sense to ve.d/
endif
# low-level part of distro.mk
# request particular image subprofile inclusion
sub/%:
@$(call add,SUBPROFILES,$(@:sub/%=%))
# FIXME: maybe syslinux feature belongs to distro/.init?
boot/%: distro/.init use/syslinux
@$(call set,BOOTLOADER,$*)
# initalize config from scratch, put some sane defaults in
distro/.init:
@echo "** preparing distro configuration$${DEBUG:+: see $(CONFIG)}" $(SHORTEN)
@$(call try,MKIMAGE_PREFIX,/usr/share/mkimage)
@$(call try,GLOBAL_VERBOSE,)
@$(call try,IMAGEDIR,$(IMAGEDIR))
@$(call try,IMAGENAME,$(IMAGENAME))
distro/.branding: distro/.init
@$(call try,BRANDING,altlinux-sisyphus)
@$(call set,IMAGE_INIT_LIST,+branding-$$(BRANDING)-release)
# NB: the last flavour in KFLAVOURS gets to be the default one;
# the kernel packages regexp evaluation has to take place at build stage
distro/.base: distro/.branding sub/stage1 use/syslinux use/syslinux/localboot.cfg
@$(call set,KFLAVOURS,std-def)
# pick up release manager's config
distro/.rc:
@if [ -s $(HOME)/.mkimage/profiles.mk ]; then \
$(call put,-include $(HOME)/.mkimage/profiles.mk); \
fi
sudo sudo
su su
passwd passwd
syslogd
apt
basesystem
sysklogd
etcnet
glibc-nss
openvpn
netlist
#alterator-fbi
openssh-server
passwd
less
vim-console
screen
zsh
rsync
lftp
Этот каталог содержит субпрофили; содержимое затребованных Этот каталог содержит субпрофили; содержимое затребованных
(названия которых содержатся в значении переменной SUBPROFILES, (названия которых содержатся в значении переменной SUBPROFILES,
которую заполняют цели sub/* -- см. ../distro.mk) будет которую заполняют цели sub/* -- см. ../lib/distro.mk) будет
скопировано в каталог $(BUILDDIR)/image/ формируемого профиля. скопировано в каталог $(BUILDDIR)/image/ формируемого профиля.
Просьба ответственно относиться к модификации существующих Просьба ответственно относиться к изменению существующих субпрофилей
и вдумчиво -- к созданию новых; возможно, достаточно всего лишь и вдумчиво -- к созданию новых; возможно, достаточно всего лишь
оформить нужное новой фичей (см. ../features.in/). оформить нужное новой фичей (см. ../features.in/).
Обратите внимание: поскольку сборка частей образа и происходит Обратите внимание: поскольку сборка частей дистрибутивного образа
в каталогах субпрофилей, то повторное использование одного простого и происходит в каталогах субпрофилей, то повторное использование
субпрофиля в рамках сгенерированного профиля штатным образом невозможно. одного простого субпрофиля в рамках сгенерированного профиля штатным
Если требуется создать несколько близких по реализации субпрофилей, образом невозможно. Если требуется создать несколько близких по
изучите stage2 и задействующие его фичи. реализации субпрофилей, изучите stage2 и задействующие его фичи.
Краткое описание существующих вариантов: Краткое описание существующих вариантов:
- stage1: propagator и загрузчик (при подключении фичи syslinux); - stage1: propagator и загрузчик (совместно с фичей syslinux);
типично требуется для инсталяторов, live- и rescue-образов, типично требуется для инсталяторов, live- и rescue-образов,
но может использоваться без добавления таковых в образ, но может использоваться без добавления таковых в образ,
обеспечивая сетевую загрузку второй стадии обеспечивая сетевую загрузку второй стадии
......
Этот каталог содержит субпрофиль main, собирающий пакетную базу Этот каталог содержит субпрофиль main, собирающий пакетную базу
для локальной инсталяции системы и возможности установки дополнений. для локальной инсталяции дистрибутива из полученного образа,
включая необязательные пакеты.
Подбирает: Подбирает:
- SYSTEM_PACKAGES, COMMON_PACKAGES, BASE_PACKAGES, BASE_LISTS: - SYSTEM_PACKAGES, COMMON_PACKAGES, BASE_PACKAGES, BASE_LISTS:
......
...@@ -26,7 +26,7 @@ IMAGE_PACKAGES += $(SYSTEM_PACKAGES) ...@@ -26,7 +26,7 @@ IMAGE_PACKAGES += $(SYSTEM_PACKAGES)
# no kernel flavour specified will result in no modules for stage1 vmlinuz # no kernel flavour specified will result in no modules for stage1 vmlinuz
STAGE1_KFLAVOUR ?= $(lastword $(KFLAVOURS)) STAGE1_KFLAVOUR ?= $(lastword $(KFLAVOURS))
ifeq "$(STAGE1_KFLAVOUR)" "" ifeq (,$(STAGE1_KFLAVOUR))
$(error STAGE1_KFLAVOUR is utterly empty; cannot guess either) $(error STAGE1_KFLAVOUR is utterly empty; cannot guess either)
endif endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment