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:
parent
720a579690
commit
d5a5941f96
81
Makefile
81
Makefile
@ -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
33
QUICKSTART
Normal 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
22
README
@ -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): следует крайне осторожно пользоваться
|
||||||
|
@ -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 @@
|
|||||||
- 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 @@
|
|||||||
произвести из generate.sh и generate.mk.
|
произвести из generate.sh и generate.mk.
|
||||||
|
|
||||||
Пожалуйста, присылайте отзывы о (бес)полезности кода в этом каталоге
|
Пожалуйста, присылайте отзывы о (бес)полезности кода в этом каталоге
|
||||||
mike@altlinux.
|
mike@altlinux.org.
|
||||||
|
@ -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 @@
|
|||||||
|
|
||||||
Каждая фича должна содержать задействуемый при построении
|
Каждая фича должна содержать задействуемый при построении
|
||||||
конфигурации будущего образа файл 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/.
|
||||||
|
@ -6,4 +6,5 @@
|
|||||||
и требует пакет выбранного загрузчика.
|
и требует пакет выбранного загрузчика.
|
||||||
|
|
||||||
Реализация экспериментальная (нужно модуляризовать installer-steps),
|
Реализация экспериментальная (нужно модуляризовать installer-steps),
|
||||||
пока завязана на installer-distro-altlinux-generic.
|
пока завязана на installer-distro-altlinux-generic. Возможно,
|
||||||
|
с использованием alterator-lilo связаны проблемы времени установки.
|
||||||
|
4
features.in/build-distro/README
Normal file
4
features.in/build-distro/README
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
Эта фича конфигурирует создание образа дистрибутива, включая работу
|
||||||
|
с субпрофилями -- которая сейчас нужна только дистрибутивным целям.
|
||||||
|
|
||||||
|
Дополняет финальную стадию сборки (lib/, scripts.d/).
|
2
features.in/build-distro/config.mk
Normal file
2
features.in/build-distro/config.mk
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
use/build-distro: boot/isolinux
|
||||||
|
@$(call add,FEATURES,build-distro)
|
46
features.in/build-distro/lib/build-distro.mk
Normal file
46
features.in/build-distro/lib/build-distro.mk
Normal 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
|
3
features.in/build-ve/README
Normal file
3
features.in/build-ve/README
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
Эта фича конфигурирует создание образа виртуального окружения (VE).
|
||||||
|
|
||||||
|
Дополняет финальную стадию сборки (lib/, image-scripts.d/).
|
2
features.in/build-ve/config.mk
Normal file
2
features.in/build-ve/config.mk
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
use/build-ve:
|
||||||
|
@$(call add,FEATURES,build-ve)
|
11
features.in/build-ve/image-scripts.d/03services
Executable file
11
features.in/build-ve/image-scripts.d/03services
Executable 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
|
||||||
|
:
|
3
features.in/build-ve/image-scripts.d/04inittab
Executable file
3
features.in/build-ve/image-scripts.d/04inittab
Executable 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
|
3
features.in/build-ve/image-scripts.d/05mtab
Executable file
3
features.in/build-ve/image-scripts.d/05mtab
Executable 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
|
13
features.in/build-ve/image-scripts.d/06syslog
Executable file
13
features.in/build-ve/image-scripts.d/06syslog
Executable 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
|
11
features.in/build-ve/lib/build-ve.mk
Normal file
11
features.in/build-ve/lib/build-ve.mk
Normal 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)
|
@ -1,2 +1,2 @@
|
|||||||
Добавление memtest86+ в загрузку с образа и в устанавливаемую пакетную базу;
|
Добавление memtest86+ в загрузку с образа и в устанавливаемую пакетную базу;
|
||||||
востребовано для для инсталяторов, live/rescue. Интегрируется с syslinux.
|
востребовано для инсталяторов, live/rescue. Интегрируется с syslinux.
|
||||||
|
3
features.in/pack/README
Normal file
3
features.in/pack/README
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
Эта фича определяет формат упаковки создаваемого образа.
|
||||||
|
На данный момент поддерживаются iso (загрузочный ISO9660
|
||||||
|
для дистрибутивов) и tar (виртуальные окружения).
|
18
features.in/pack/config.mk
Normal file
18
features.in/pack/config.mk
Normal 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)
|
@ -1,2 +1,4 @@
|
|||||||
Эта фича конфигурирует поддержку управления кнопкой питания
|
Эта фича конфигурирует поддержку управления кнопкой питания
|
||||||
-- выключение для ACPI, засыпание для APM (не проверялось).
|
-- выключение для ACPI, засыпание для APM (не проверялось).
|
||||||
|
|
||||||
|
TODO: учесть изложенное в https://bugzilla.altlinux.org/25018
|
||||||
|
@ -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: может потребоваться обобщение механизма генерации с учётом
|
||||||
|
многоуровневых меню и включаемых файлов (которыми лучше не злоупотреблять
|
||||||
|
из соображений скорости инициализации загрузчика).
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -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
|
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
Этот каталог копируется из метапрофиля в профиль "как есть"
|
Этот каталог копируется из метапрофиля в профиль "как есть"
|
||||||
и формирует "затравку", собирающую собственно образ из результатов
|
и формирует "затравку" финальной стадии, собирающей собственно
|
||||||
работы индивидуальных субпрофилей (см. ../sub.in/).
|
образ из результатов работы индивидуальных субпрофилей.
|
||||||
|
|
||||||
|
Обратите внимание: в зависимости от того, какой образ нужен,
|
||||||
|
требуется или features.in/build-distro (для дистрибутивов),
|
||||||
|
или use/build-ve (для образов виртуальных окружений).
|
||||||
|
|
||||||
Содержимое files/ копируется в корень образа.
|
Содержимое files/ копируется в корень образа.
|
||||||
|
|
||||||
|
@ -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
0
image.in/image-scripts.d/.gitignore
vendored
Normal file
0
image.in/lib/.gitignore
vendored
Normal file
0
image.in/lib/.gitignore
vendored
Normal file
0
image.in/scripts.d/.gitignore
vendored
Normal file
0
image.in/scripts.d/.gitignore
vendored
Normal file
7
lib/README
Normal file
7
lib/README
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
Этот каталог содержит вспомогательные makefiles,
|
||||||
|
обеспечивающие основную функциональность создания
|
||||||
|
конфигурации образа и генерации соответствующего
|
||||||
|
профиля для сборки.
|
||||||
|
|
||||||
|
Следует помнить, что будучи включаемыми в ../Makefile,
|
||||||
|
они работают в каталоге верхнего уровня.
|
@ -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"`)"; \
|
@ -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
|
@ -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
|
@ -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)))
|
@ -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
|
@ -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
15
lib/sugar.mk
Normal 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
26
lib/ve.mk
Normal 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
|
32
libdistro.mk
32
libdistro.mk
@ -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
|
|
@ -1,3 +1,4 @@
|
|||||||
sudo
|
sudo
|
||||||
su
|
su
|
||||||
passwd
|
passwd
|
||||||
|
syslogd
|
||||||
|
11
pkg.in/lists/tagged/server,openvpn
Normal file
11
pkg.in/lists/tagged/server,openvpn
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
apt
|
||||||
|
basesystem
|
||||||
|
sysklogd
|
||||||
|
etcnet
|
||||||
|
glibc-nss
|
||||||
|
openvpn
|
||||||
|
netlist
|
||||||
|
#alterator-fbi
|
||||||
|
openssh-server
|
||||||
|
passwd
|
||||||
|
less
|
5
pkg.in/lists/tagged/ve+tools
Normal file
5
pkg.in/lists/tagged/ve+tools
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
vim-console
|
||||||
|
screen
|
||||||
|
zsh
|
||||||
|
rsync
|
||||||
|
lftp
|
@ -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-образов,
|
||||||
но может использоваться без добавления таковых в образ,
|
но может использоваться без добавления таковых в образ,
|
||||||
обеспечивая сетевую загрузку второй стадии
|
обеспечивая сетевую загрузку второй стадии
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
Этот каталог содержит субпрофиль 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)
|
|||||||
# 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
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user