Mkimage-profiles/oldpage: различия между версиями
м (→Цели: thx rider) |
(-autoconf) |
||
Строка 4: | Строка 4: | ||
К 2010 году с [[Mkimage/Profiles/Desktop|mkimage-profiles-desktop]] накопились следующие проблемы: | К 2010 году с [[Mkimage/Profiles/Desktop|mkimage-profiles-desktop]] накопились следующие проблемы: | ||
* очень объёмный и сложный профиль, освоение требует значительных сил и времени; | * очень объёмный и сложный профиль, освоение требует значительных сил и времени; | ||
* вследствие недокументированности и отсутствия ясно изложенных и обоснованных предпочтений и | * вследствие недокументированности и отсутствия ясно изложенных и обоснованных предпочтений и практик — смешение стилей; | ||
* перерос возможности | * перерос возможности рефакторинга — изменения либо ломают большую часть описанных дистрибутивов, либо требуют неоправданного объёма работ по выяснению и исправлению последствий. | ||
Поэтому решил попытаться нарисовать новый профиль, который бы также позволял собирать различные десктопные и серверные iso/flash-образы, но также учитывал бы обнаруженные проблемы (в том числе более полно соответствовал [[WhiteLabel|изначальной задумке]]). | Поэтому решил попытаться нарисовать новый профиль, который бы также позволял собирать различные десктопные и серверные iso/flash-образы, но также учитывал бы обнаруженные проблемы (в том числе более полно соответствовал [[WhiteLabel|изначальной задумке]]). | ||
Строка 19: | Строка 19: | ||
=== раздельные стадии конфигурации и сборки === | === раздельные стадии конфигурации и сборки === | ||
Быстро стало ясно, что {{cmd|./configure --with-distro}} | Быстро стало ясно, что {{cmd|./configure --with-distro}} — это не наш путь, поскольку {{cmd|autoconf}} не даёт возможности ''построения'' конфигурации дистрибутива (см. соответствующую простыню с выставлением дефолтов нескольких значений в [http://git.altlinux.org/people/mike/packages/?p=mkimage-profiles-desktop.git;a=blob;f=configure.ac;h=68fe7dc16be30f706c66162522b31bb375dc21d1;hb=refs/heads/p5#l25 configure.ac m-p-d]). | ||
Поэтому: | Поэтому: | ||
Строка 28: | Строка 28: | ||
=== r/o профиль === | === r/o профиль === | ||
Сборка происходит вне собственно профиля (максимум | Сборка происходит вне собственно профиля (максимум модификации — симлинк в сборочный каталог, если он r/w). Этим достигается дистрибутивность дистрибутивного профиля (возможна сборка прямо из {{path|/usr/share}}) и одновременно убирается риск коммитов сборочного мусора (подставленные <tt>.in</tt>-файлы и т. п.). | ||
метапрофиль -> профиль -> образ | метапрофиль -> профиль -> образ | ||
Строка 42: | Строка 42: | ||
=== субпрофили и pkg/* в сборочном каталоге === | === субпрофили и pkg/* в сборочном каталоге === | ||
Из метапрофиля в профиль попадают только нужные каталоги субпрофилей/фич и только нужные | Из метапрофиля в профиль попадают только нужные каталоги субпрофилей/фич и только нужные пакаджлисты — с тем, чтобы избежать возможности неявного использования объектов из «грязной» среды (ср. со сборкой rpm в хост-среде или в hasher chroot). | ||
=== phony targets === | === phony targets === | ||
Сейчас сделан выбор стиля «все цели являются липовыми», то есть им не соответствуют существующие или создаваемые каталоги/файлы. Обоснование: когда неочевидно, что какой-либо цели соответствует объект ФС, отладка может затрудниться тем, что {{cmd|make}} не будет пересоздавать такой объект, если не обновлялись его prerequisites (которые обычно оказываются phony). При этом цена вопроса безусловного пересоздания любой цели на этапе конфигурирования пренебрежимо | Сейчас сделан выбор стиля «все цели являются липовыми», то есть им не соответствуют существующие или создаваемые каталоги/файлы. Обоснование: когда неочевидно, что какой-либо цели соответствует объект ФС, отладка может затрудниться тем, что {{cmd|make}} не будет пересоздавать такой объект, если не обновлялись его prerequisites (которые обычно оказываются phony). При этом цена вопроса безусловного пересоздания любой цели на этапе конфигурирования пренебрежимо мала — максимум единицы секунд. | ||
Когда-то в будущем может возыметь смысл переработка {{pkg|mkimage}} и {{pkg|mkimage-profiles}} с использованием честных файловых зависимостей и более тесной интеграцией, но это вне рамок данного проекта. | Когда-то в будущем может возыметь смысл переработка {{pkg|mkimage}} и {{pkg|mkimage-profiles}} с использованием честных файловых зависимостей и более тесной интеграцией, но это вне рамок данного проекта. | ||
=== propagator+syslinux = stage1 === | === propagator+syslinux = stage1 === | ||
Каждый субпрофиль создаётся, конфигурируется и применяется в явном виде. Так, создан субпрофиль <tt>stage1</tt> (аналогично <tt>install2</tt> и всем им соответствуют подкаталоги {{path|sub.in/*/}}), куда перенесена подготовка {{pkg|propagator}} и {{pkg|syslinux}}; в корне собираемого | Каждый субпрофиль создаётся, конфигурируется и применяется в явном виде. Так, создан субпрофиль <tt>stage1</tt> (аналогично <tt>install2</tt> и всем им соответствуют подкаталоги {{path|sub.in/*/}}), куда перенесена подготовка {{pkg|propagator}} и {{pkg|syslinux}}; в корне собираемого профиля — только сборка образа (сейчас — также <tt>Metadata</tt>, <tt>.disk/*</tt> и индексов репозиториев), см. {{path|image.in/Makefile}}. | ||
=== make+shell vs autoconf === | |||
Выбор: | |||
# '''передавать через переменные {{cmd|make}}''' | |||
# определить, что это переменные времени конфигурирования ''сборочного'' профиля, и заниматься ими в сгенерированном профиле (звучит вроде логично, но красиво реализовать у меня пока не получилось) | |||
сделан в пользу инициализации небольшого количества дефолтов перед сборкой конфигурации и возможности добавления локального {{path|metaconf.mk}} в самом её конце (отчасти уже давно, но финализировано после детального обсуждения с Алексеем Чеусовым). | |||
== Под вопросом == | == Под вопросом == | ||
Строка 57: | Строка 63: | ||
# плоская, как сейчас (при этом тегированные списки отделены namespace’ом _* и не пересекаюся по именам с существующими) | # плоская, как сейчас (при этом тегированные списки отделены namespace’ом _* и не пересекаюся по именам с существующими) | ||
#* довольно просто реализуется и ничто не должно ломаться | #* довольно просто реализуется и ничто не должно ломаться | ||
# | # иерархическая — например, base/server | ||
#* должно быть более масштабируемым даже при переходе многих пакаджлистов на теги | #* должно быть более масштабируемым даже при переходе многих пакаджлистов на теги | ||
=== взаимодействие тегированных списков и pkg/groups === | === взаимодействие тегированных списков и pkg/groups === | ||
Пока совсем неясно, потребуется рассмотрение активными пользователями [[alterator-pkg]]. | Пока совсем неясно, потребуется рассмотрение активными пользователями [[alterator-pkg]]. | ||
== Пожелания к коллегам == | == Пожелания к коллегам == | ||
=== строгое обращение с потоками данных === | === строгое обращение с потоками данных === | ||
Желательно направление движения значений переменных и действий короткими шагами «сверху | Желательно направление движения значений переменных и действий короткими шагами «сверху вниз» — без выдёргивания значений из [http://git.altlinux.org/people/mike/packages/?p=mkimage-profiles-desktop.git;a=blob;f=profiles/scripts.d/03-syslinux;h=640947f18adb189ad97396903ea64087f293d25a;hb=refs/heads/p5#l9 соседних каталогов] или путешествий сверху в самый низ [http://git.altlinux.org/people/mike/packages/?p=mkimage-profiles-desktop.git;a=blob;f=profiles/pkg/lists/kde3-lite.in;h=de04b344aed4b615afe4abc1e2d103608dac9793;hb=refs/heads/p5#l21 различным] [http://git.altlinux.org/people/mike/packages/?p=mkimage-profiles-desktop.git;a=blob;f=use.mk.in;h=26db334ae35398b5eab431b175a87baf83a1b8ab;hb=refs/heads/p5#l237 образом]). | ||
Построение списков пакетов «на лету» обдумывается, но не [http://git.altlinux.org/people/mike/packages/?p=mkimage-profiles-desktop.git;a=blob;f=use.mk.in;h=7741dee9360a40f59c865f24eb09d6e173e9859c;hb=HEAD#l229 подобными хаками], а скорее [http://git.altlinux.org/people/enp/packages/?p=mkimage-profile-live.git;a=blob;f=live/features-setup;h=0d18ea801eb5c9124e1a1aec3a268dbaba769754;hb=refs/heads/autoconf такими] (или по тегам, реализация в процессе). | Построение списков пакетов «на лету» обдумывается, но не [http://git.altlinux.org/people/mike/packages/?p=mkimage-profiles-desktop.git;a=blob;f=use.mk.in;h=7741dee9360a40f59c865f24eb09d6e173e9859c;hb=HEAD#l229 подобными хаками], а скорее [http://git.altlinux.org/people/enp/packages/?p=mkimage-profile-live.git;a=blob;f=live/features-setup;h=0d18ea801eb5c9124e1a1aec3a268dbaba769754;hb=refs/heads/autoconf такими] (или по тегам, реализация в процессе). | ||
=== унификация === | === унификация === | ||
Крайне желательно неразведение зоопарка аналогов (например, методов макроподстановки). Если вводятся новые практики или концепции, лучше предварительно обсудить задумку или реализацию в своём бранче <tt>next</tt> ''до'' того, как на новосделанное будет завязано много ценного. Если возникают конфликты | Крайне желательно неразведение зоопарка аналогов (например, методов макроподстановки). Если вводятся новые практики или концепции, лучше предварительно обсудить задумку или реализацию в своём бранче <tt>next</tt> ''до'' того, как на новосделанное будет завязано много ценного. Если возникают конфликты мнений — давайте постараемся их разрешать, а не плодить форки (как получилось с поддержкой/реализацией {{pkg|branding-*}} в своё время). | ||
=== повторное использование вместо дублирования === | === повторное использование вместо дублирования === | ||
[http://lists.altlinux.org/pipermail/devel-distro/2009-April/000323.html Также и в самих списках сколько | [http://lists.altlinux.org/pipermail/devel-distro/2009-April/000323.html Также и в самих списках сколько получается — давайте стараться избежать дублирования, а вместо мини-форков выделять общее и отделять разное.] | ||
Если совсем какая-то специфика, но может пригодиться и другим <small>(косясь на mithraen@ и asterisk-1.6.[012] в m-p-d)</small> | Если совсем какая-то специфика, но может пригодиться и другим <small>(косясь на mithraen@ и asterisk-1.6.[012] в m-p-d)</small> — может иметь смысл завести «свой» namespace для списков/фич. | ||
== Объекты == | == Объекты == |
Версия от 14:51, 28 сентября 2010
mkimage-profiles.git
К 2010 году с mkimage-profiles-desktop накопились следующие проблемы:
- очень объёмный и сложный профиль, освоение требует значительных сил и времени;
- вследствие недокументированности и отсутствия ясно изложенных и обоснованных предпочтений и практик — смешение стилей;
- перерос возможности рефакторинга — изменения либо ломают большую часть описанных дистрибутивов, либо требуют неоправданного объёма работ по выяснению и исправлению последствий.
Поэтому решил попытаться нарисовать новый профиль, который бы также позволял собирать различные десктопные и серверные iso/flash-образы, но также учитывал бы обнаруженные проблемы (в том числе более полно соответствовал изначальной задумке).
Будет опубликован для обсуждения перед дальнейшими планированием и разработкой, как только станет хоть немного полезен и чуть пыль осядет. В идеале хотелось бы успеть пересадить на него Centaurus.
Цели
- наследственность и для дистрибутивов, а не только использование общих блоков (могущих наследовать друг другу)
- прозрачность и диагностируемость формирования конфигурации
- документированность: изначальная и каждого существенного изменения
Design decisions
раздельные стадии конфигурации и сборки
Быстро стало ясно, что ./configure --with-distro — это не наш путь, поскольку autoconf не даёт возможности построения конфигурации дистрибутива (см. соответствующую простыню с выставлением дефолтов нескольких значений в configure.ac m-p-d).
Поэтому:
- инициализируем среду сборки (BUILDDIR)
- конфигурируем дистрибутив (make в каталоге профиля, пишет в BUILDDIR)
- конфигурируем среду сборки (./configure в BUILDDIR)
- выполняем собственно сборку (make в BUILDDIR)
r/o профиль
Сборка происходит вне собственно профиля (максимум модификации — симлинк в сборочный каталог, если он r/w). Этим достигается дистрибутивность дистрибутивного профиля (возможна сборка прямо из /usr/share) и одновременно убирается риск коммитов сборочного мусора (подставленные .in-файлы и т. п.).
метапрофиль -> профиль -> образ
Желательно, чтобы порождённые профили были полностью самостоятельными.
формирование списков для субпрофилей
Создаётся единый конфигурационный makefile (.config.mk в корне сборочного каталога), в который при конфигурировании дистрибутива добавляются пары переменная-значение. При этом возможно использование немедленных и отложенных подстановок переменных и до сих пор получилось избежать необходимости макроподстановок при помощи autoconf.
В сборочный каталог копируются только необходимые (перечисленные в переменных *_LISTS) пакаджлисты. Субпрофили различаются по префиксам имён переменных, в которые укладываются относящиеся к ним сущности: INSTALL2_PACKAGES, BASE_LISTS… в одном toplevel .config.mk
Списки тегов превращаются в списки пакаджлистов до передачи в BUILDDIR.
субпрофили и pkg/* в сборочном каталоге
Из метапрофиля в профиль попадают только нужные каталоги субпрофилей/фич и только нужные пакаджлисты — с тем, чтобы избежать возможности неявного использования объектов из «грязной» среды (ср. со сборкой rpm в хост-среде или в hasher chroot).
phony targets
Сейчас сделан выбор стиля «все цели являются липовыми», то есть им не соответствуют существующие или создаваемые каталоги/файлы. Обоснование: когда неочевидно, что какой-либо цели соответствует объект ФС, отладка может затрудниться тем, что make не будет пересоздавать такой объект, если не обновлялись его prerequisites (которые обычно оказываются phony). При этом цена вопроса безусловного пересоздания любой цели на этапе конфигурирования пренебрежимо мала — максимум единицы секунд.
Когда-то в будущем может возыметь смысл переработка mkimage и mkimage-profiles с использованием честных файловых зависимостей и более тесной интеграцией, но это вне рамок данного проекта.
propagator+syslinux = stage1
Каждый субпрофиль создаётся, конфигурируется и применяется в явном виде. Так, создан субпрофиль stage1 (аналогично install2 и всем им соответствуют подкаталоги sub.in/*/), куда перенесена подготовка propagator и syslinux; в корне собираемого профиля — только сборка образа (сейчас — также Metadata, .disk/* и индексов репозиториев), см. image.in/Makefile.
make+shell vs autoconf
Выбор:
- передавать через переменные make
- определить, что это переменные времени конфигурирования сборочного профиля, и заниматься ими в сгенерированном профиле (звучит вроде логично, но красиво реализовать у меня пока не получилось)
сделан в пользу инициализации небольшого количества дефолтов перед сборкой конфигурации и возможности добавления локального metaconf.mk в самом её конце (отчасти уже давно, но финализировано после детального обсуждения с Алексеем Чеусовым).
Под вопросом
структура подкаталога lists/
- плоская, как сейчас (при этом тегированные списки отделены namespace’ом _* и не пересекаюся по именам с существующими)
- довольно просто реализуется и ничто не должно ломаться
- иерархическая — например, base/server
- должно быть более масштабируемым даже при переходе многих пакаджлистов на теги
взаимодействие тегированных списков и pkg/groups
Пока совсем неясно, потребуется рассмотрение активными пользователями alterator-pkg.
Пожелания к коллегам
строгое обращение с потоками данных
Желательно направление движения значений переменных и действий короткими шагами «сверху вниз» — без выдёргивания значений из соседних каталогов или путешествий сверху в самый низ различным образом).
Построение списков пакетов «на лету» обдумывается, но не подобными хаками, а скорее такими (или по тегам, реализация в процессе).
унификация
Крайне желательно неразведение зоопарка аналогов (например, методов макроподстановки). Если вводятся новые практики или концепции, лучше предварительно обсудить задумку или реализацию в своём бранче next до того, как на новосделанное будет завязано много ценного. Если возникают конфликты мнений — давайте постараемся их разрешать, а не плодить форки (как получилось с поддержкой/реализацией branding-* в своё время).
повторное использование вместо дублирования
Если совсем какая-то специфика, но может пригодиться и другим (косясь на mithraen@ и asterisk-1.6.[012] в m-p-d) — может иметь смысл завести «свой» namespace для списков/фич.
Объекты
дистрибутив
Цель вида distro/%, выполнение которой приводит к созданию конфигурации дистрибутива, достаточной для построения его образа. Описываются в distro.mk; могут наследовать друг другу. Пример -- distro/server-light.
субпрофиль
Цель вида sub/%, выполнение которой приводит к созданию базовой конфигурации соответствующего цельного блока для укладки в образ (например, sub/rescue). Описаны в distro.mk в общем виде.
фича
Цель вида use/%, снабжённая подкаталогом в features/. В подкаталоге может быть:
- кусочек конфигурации в виде makefile, автоматически включаемый в distro.mk
- подкаталог ..., копируемый ...
пакаджлист
Файл со списком пакетов, размещённый в pkg.in/lists/. Упоминается в генерируемом файле конфигурации дистрибутива (.config.mk) в переменных %_LISTS; перечисленные списки копируются в создаваемый профиль дистрибутива на стадии make config ###.
Состояние
На начало сентября 2010 реализован профиль минималистичного серверного дистрибутива, растущего в сторону server-light.cd, из которого собирается устанавливающийся инсталлер, из которого получается загружающаяся система.
Вокнуты гвозди (то, что в m-p-d на configure):
- arch
- apt-conf
- kernel flavour
- mkimage prefix
Не втянуты pkg/groups (.base заполнен статически).