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)
This commit is contained in:
Michael Shigorin 2011-10-06 11:46:31 +03:00
parent 720a579690
commit d5a5941f96
49 changed files with 437 additions and 219 deletions

View File

@ -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 ### suboptimal but at least clear, reliable and convenient
IMAGEDIR ?= $(shell [ -d "$$HOME/out" -a -w "$$HOME/out" ] \ all:
&& echo "$$HOME/out" \ @for i in $(DISTROS); do \
|| echo "$(BUILDDIR)/out" ) echo "** building $$i:"; \
IMAGENAME ?= mkimage-profiles-$(ARCH).iso $(MAKE) --no-print-directory BUILDDIR=$(BUILDDIR) $$i; \
echo; \
done
everything: $(IMAGES): debug \
@for i in $(IMAGES); do $(MAKE) BUILDDIR=$(BUILDDIR) $$i; done config/with/$(IMAGE_CONF) \
config/like/$(IMAGE_CLASS) \
config/name/$(IMAGE_NAME) \
config/pack/$(IMAGE_TYPE) \
build; @:
$(IMAGES): %.iso: | profile/init distro/% boot/isolinux profile/populate iso debug:
@# TODO: run automated tests (e.g. iso size) ifeq (2,$(DEBUG))
@OUTNAME="$(@:.iso=)-$(DATE)-$(ARCH).iso"; \ @$(foreach v,\
OUTPATH="$(IMAGEDIR)/$$OUTNAME"; \ $(filter IMAGE_%,$(sort $(.VARIABLES))),\
mkdir -p "$(IMAGEDIR)" && \ $(warning $v = $($v)))
test -s "$(IMAGEDIR)/$(IMAGENAME)" && \ endif
mv "$(IMAGEDIR)/$(IMAGENAME)" "$$OUTPATH" && \
echo "** image: $$OUTPATH" && \
ln -sf "$$OUTNAME" "$(IMAGEDIR)/$@" && \
ln -sf "$@" "$(IMAGEDIR)/mkimage-profiles.iso"; \
if [ -n "$(DEBUG)" ]; then \
cp -a "$(BUILDLOG)" "$$OUTPATH.log"; \
cp -a "$(CONFIG)" "$$OUTPATH.cfg"; \
fi

33
QUICKSTART Normal file
View File

@ -0,0 +1,33 @@
требуется
~~~~~~~~~
- 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

22
README
View File

@ -1,14 +1,15 @@
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
- сборка дистрибутива - сборка дистрибутива
Объекты: Объекты:
- виртуальные окружения:
+ описываются в lib/ve.mk
+ могут основываться одно на другом
- дистрибутивы: - дистрибутивы:
+ описываются в distro.mk + описываются в lib/distro.mk
+ могут основываться один на другом + могут основываться один на другом
+ включают один или более субпрофилей по надобности + включают один или более субпрофилей по надобности
+ желательно избегать множественного наследования, см. тж. фичи + желательно избегать множественного наследования, см. тж. фичи
@ -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): следует крайне осторожно пользоваться

View File

@ -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); альтернативой было
бы пробрасывание переменных с полным путём ради единственного места

View File

@ -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
пример пример
~~~~~~ ~~~~~~

View File

@ -44,4 +44,4 @@
произвести из generate.sh и generate.mk. произвести из generate.sh и generate.mk.
Пожалуйста, присылайте отзывы о (бес)полезности кода в этом каталоге Пожалуйста, присылайте отзывы о (бес)полезности кода в этом каталоге
mike@altlinux. mike@altlinux.org.

View File

@ -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; \

View File

@ -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 (при их наличи
построенных на одном базовом, можно воспользоваться подкаталогом построенных на одном базовом, можно воспользоваться подкаталогом
с именем исходного базового субпрофиля (см. $src, $dst в Makefile). с именем исходного базового субпрофиля (см. $src, $dst в Makefile).
Каталог lib/ является специфическим для фич, определяющих
построение образа -- см. build-*/.
Несложный пример содержится в 00example/, более близкий к жизни Несложный пример содержится в 00example/, более близкий к жизни
и нынешним пределам возможностей метапрофиля -- в syslinux/. и нынешним пределам возможностей метапрофиля -- в syslinux/.

View File

@ -6,4 +6,5 @@
и требует пакет выбранного загрузчика. и требует пакет выбранного загрузчика.
Реализация экспериментальная (нужно модуляризовать installer-steps), Реализация экспериментальная (нужно модуляризовать installer-steps),
пока завязана на installer-distro-altlinux-generic. пока завязана на installer-distro-altlinux-generic. Возможно,
с использованием alterator-lilo связаны проблемы времени установки.

View File

@ -0,0 +1,4 @@
Эта фича конфигурирует создание образа дистрибутива, включая работу
с субпрофилями -- которая сейчас нужна только дистрибутивным целям.
Дополняет финальную стадию сборки (lib/, scripts.d/).

View File

@ -0,0 +1,2 @@
use/build-distro: boot/isolinux
@$(call add,FEATURES,build-distro)

View File

@ -0,0 +1,46 @@
# 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

View File

@ -0,0 +1,3 @@
Эта фича конфигурирует создание образа виртуального окружения (VE).
Дополняет финальную стадию сборки (lib/, image-scripts.d/).

View File

@ -0,0 +1,2 @@
use/build-ve:
@$(call add,FEATURES,build-ve)

View File

@ -0,0 +1,11 @@
#!/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
:

View File

@ -0,0 +1,3 @@
#!/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

View File

@ -0,0 +1,3 @@
#!/bin/sh -e
# should be pretty much obsolete but just in case
[ -L /etc/mtab ] || ln -sf /proc/mounts /etc/mtab

View File

@ -0,0 +1,13 @@
#!/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

View File

@ -0,0 +1,11 @@
# 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)

View File

@ -1,2 +1,2 @@
Добавление memtest86+ в загрузку с образа и в устанавливаемую пакетную базу; Добавление memtest86+ в загрузку с образа и в устанавливаемую пакетную базу;
востребовано для для инсталяторов, live/rescue. Интегрируется с syslinux. востребовано для инсталяторов, live/rescue. Интегрируется с syslinux.

3
features.in/pack/README Normal file
View File

@ -0,0 +1,3 @@
Эта фича определяет формат упаковки создаваемого образа.
На данный момент поддерживаются iso (загрузочный ISO9660
для дистрибутивов) и tar (виртуальные окружения).

View File

@ -0,0 +1,18 @@
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)

View File

@ -1,2 +1,4 @@
Эта фича конфигурирует поддержку управления кнопкой питания Эта фича конфигурирует поддержку управления кнопкой питания
-- выключение для ACPI, засыпание для APM (не проверялось). -- выключение для ACPI, засыпание для APM (не проверялось).
TODO: учесть изложенное в https://bugzilla.altlinux.org/25018

View File

@ -1,14 +1,15 @@
Добавление поддержки 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 @@
Здесь производится первичная обработка конфигурационных данных, Здесь производится первичная обработка конфигурационных данных,
окончательно проверяемых и используемых уже в инструментальном чруте. окончательно проверяемых и используемых уже в инструментальном чруте.
TODO: может потребоваться обобщение механизма генерации с учётом
многоуровневых меню и включаемых файлов (которыми лучше не злоупотреблять
из соображений скорости инициализации загрузчика).

View File

@ -1,5 +1,5 @@
# 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)

View File

@ -1,82 +1,51 @@
# 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

View File

@ -1,6 +1,10 @@
Этот каталог копируется из метапрофиля в профиль "как есть" Этот каталог копируется из метапрофиля в профиль "как есть"
и формирует "затравку", собирающую собственно образ из результатов и формирует "затравку" финальной стадии, собирающей собственно
работы индивидуальных субпрофилей (см. ../sub.in/). образ из результатов работы индивидуальных субпрофилей.
Обратите внимание: в зависимости от того, какой образ нужен,
требуется или features.in/build-distro (для дистрибутивов),
или use/build-ve (для образов виртуальных окружений).
Содержимое files/ копируется в корень образа. Содержимое files/ копируется в корень образа.

View File

@ -1,4 +1,6 @@
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)))
# 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)))$$

0
image.in/image-scripts.d/.gitignore vendored Normal file
View File

0
image.in/lib/.gitignore vendored Normal file
View File

0
image.in/scripts.d/.gitignore vendored Normal file
View File

7
lib/README Normal file
View File

@ -0,0 +1,7 @@
Этот каталог содержит вспомогательные makefiles,
обеспечивающие основную функциональность создания
конфигурации образа и генерации соответствующего
профиля для сборки.
Следует помнить, что будучи включаемыми в ../Makefile,
они работают в каталоге верхнего уровня.

View File

@ -1,18 +1,19 @@
# 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:
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"`)"; \

View File

@ -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:
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

View File

@ -1,29 +1,45 @@
# this makefile is designed to be included in toplevel one
ifndef BUILDDIR
$(error BUILDDIR not defined)
endif
# step 2: build up distribution's configuration # step 2: build up distribution's configuration
# NB: distro/ targets should be defined in this file, ifndef MKIMAGE_PROFILES
# see toplevel Makefile's $(DISTROS) assignment $(error this makefile is designed to be included in toplevel one)
CONFIG = $(BUILDDIR)/distcfg.mk endif
# collect use/% (source initial feature snippets) # NB: distro/ targets should be defined in this file
-include features.in/*/config.mk
# put(), add(), set(), try(), tags(): DISTRO_TARGETS := $(shell sed -n 's,^\(distro/[^:.]\+\):.*$$,\1,p' \
# package list names are considered relative to pkg/lists/; $(lastword $(MAKEFILE_LIST)) | sort)
# tags can do boolean expressions: (tag1 && !(tag2 || tag3))
include functions.mk
# distro/.%, sub/.%, boot/% ifeq (distro,$(IMAGE_CLASS))
include libdistro.mk
# bootloader test target; requires recent mkimage to build .PHONY: $(DISTRO_TARGETS)
distro/syslinux: distro/.init distro/.branding sub/stage1 \
# request particular image subprofile inclusion
sub/%:
@$(call add,SUBPROFILES,$(@:sub/%=%))
# install media bootloader
boot/%: profile/bare use/syslinux
@$(call set,BOOTLOADER,$*)
# fundamental targets
distro/.init: profile/bare
# 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 \
# 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 \
@$(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

View File

@ -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)))

View File

@ -1,12 +1,11 @@
# 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

View File

@ -1,4 +1,6 @@
# 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)
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)" ] \
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
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:

15
lib/sugar.mk Normal file
View File

@ -0,0 +1,15 @@
# 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,$*)

26
lib/ve.mk Normal file
View File

@ -0,0 +1,26 @@
# 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

View File

@ -1,32 +0,0 @@
# 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

View File

@ -1,3 +1,4 @@
sudo sudo
su su
passwd passwd
syslogd

View File

@ -0,0 +1,11 @@
apt
basesystem
sysklogd
etcnet
glibc-nss
openvpn
netlist
#alterator-fbi
openssh-server
passwd
less

View File

@ -0,0 +1,5 @@
vim-console
screen
zsh
rsync
lftp

View File

@ -1,21 +1,21 @@
Этот каталог содержит субпрофили; содержимое затребованных Этот каталог содержит субпрофили; содержимое затребованных
(названия которых содержатся в значении переменной 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-образов,
но может использоваться без добавления таковых в образ, но может использоваться без добавления таковых в образ,
обеспечивая сетевую загрузку второй стадии обеспечивая сетевую загрузку второй стадии

View File

@ -1,5 +1,6 @@
Этот каталог содержит субпрофиль main, собирающий пакетную базу Этот каталог содержит субпрофиль main, собирающий пакетную базу
для локальной инсталяции системы и возможности установки дополнений. для локальной инсталяции дистрибутива из полученного образа,
включая необязательные пакеты.
Подбирает: Подбирает:
- SYSTEM_PACKAGES, COMMON_PACKAGES, BASE_PACKAGES, BASE_LISTS: - SYSTEM_PACKAGES, COMMON_PACKAGES, BASE_PACKAGES, BASE_LISTS:

View File

@ -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