WhiteLabel/Makefile
Внимание! Эта статья устарела, задумки легли в основу mkimage-profiles.
white labeling: makefile
Предлагается прийти примерно к такой компонентной схеме в терминах toplevel Makefile:
lite-cd: base-xfce disk-xfce cd.iso installer cd: base-kde-lite disk-kde-lite cd.iso installer installer: base-icewm mini.iso installer dvd: base-kde disk-kde contrib dvd.iso installer local: dvd disk-wine rescue: base-rescue mini.iso livecd live: base-kde-lite cd.iso livecd live-lite: base-xfce cd.iso livecd lite-edu: addon-edu cd.iso addon
(здесь цели *.iso задают MKI_OUTPUT, цели base-* -- IMAGE_PACKAGES для profiles/base, цели disk-* -- GLOBAL_PKG_GROUPS и GLOBAL_DISK_PACKAGES для profiles/disk, и т.д.)
...и соответственно процедуре генерации, подобной:
include config.mk # better new style ---------------------------------------------------------- .PHONY: rinse kde.cd lite.cd use-kde-lite use-xfce base disk installer cd.iso all: lite.cd rinse: for i in profiles/{,base/,disk/}config.mk; do :>$$i; done rm -f profiles/isofiles/syslinux/isolinux.cfg # distro construction lite.cd: | rinse use-xfce install2 base disk cd.iso mv -f @OUTDIR@/cd.iso \ @OUTDIR@/altlinux-$(INFO_VERSION)-$(DATE)-@THEME@-@ARCH@-@LANGUAGE@-CD.iso kde.cd: | rinse use-kde-lite install2 base disk cd.iso mv -f @OUTDIR@/cd.iso \ @OUTDIR@/altlinux-$(INFO_VERSION)-$(DATE)-@THEME@-@ARCH@-@LANGUAGE@-CD.iso #kde.dvd: | rinse use-kde install2 base disk contrib live rescue dvd.iso kde.dvd: | rinse use-kde install2 base disk rescue dvd.iso mv -f @OUTDIR@/dvd.iso \ @OUTDIR@/altlinux-$(INFO_VERSION)-$(DATE)-@THEME@-@ARCH@-@LANGUAGE@-DVD.iso installer.cd: | rinse install2 base cd.iso mv -f @OUTDIR@/cd.iso \ @OUTDIR@/installer-$(INFO_VERSION)-$(DATE)-@ARCH@.iso rescue.cd: | rinse rescue rescue.iso mv -f @OUTDIR@/rescue.iso \ @OUTDIR@/rescue-$(INFO_VERSION)-$(DATE)-@ARCH@.iso # core/feature packages use-kde: echo GLOBAL_BASE_PACKAGE_LISTS+='kde' >> profiles/base/config.mk echo GLOBAL_DISK_PACKAGE_LISTS+='disk-dvd' >> profiles/disk/config.mk echo GLOBAL_PKG_GROUPS+='docs office edu games graphics \ multimedia network emulators' >> profiles/disk/config.mk use-kde-lite: echo GLOBAL_BASE_PACKAGE_LISTS+='kde-lite' >> profiles/base/config.mk echo GLOBAL_DISK_PACKAGE_LISTS+='disk-cd' >> profiles/disk/config.mk echo GLOBAL_PKG_GROUPS+='office-lite graphics-lite \ multimedia-lite network-lite' >> profiles/disk/config.mk use-xfce: echo GLOBAL_BASE_PACKAGES+='xfce-settings-@THEME@' >> profiles/base/config.mk # LISTS: profiles/packages-lists/ echo GLOBAL_BASE_PACKAGE_LISTS+='xfce' >> profiles/base/config.mk echo GLOBAL_DISK_PACKAGE_LISTS+='disk-cd' >> profiles/disk/config.mk # test #echo GLOBAL_DISK_PACKAGES+='recoll' >> profiles/disk/config.mk # GROUPS: profiles/pkg-groups/lists/ echo GLOBAL_PKG_GROUPS+='xfce-docs xfce-office-lite office-superlite \ xfce-games-lite xfce-graphics-lite xfce-multimedia-lite \ xfce-network-lite' >> profiles/disk/config.mk # components # TODO: SUBDIRS-related stuff asks to be metadescribed :) base: echo SUBDIRS+='base' >> profiles/config.mk disk: echo SUBDIRS+='disk' >> profiles/config.mk install2: echo SUBDIRS+='install2' >> profiles/config.mk contrib: echo SUBDIRS+='contrib' >> profiles/config.mk live: echo SUBDIRS+='live' >> profiles/config.mk rescue: echo SUBDIRS+='rescue' >> profiles/config.mk # build images cd.iso: echo MKI_OUTNAME=cd.iso >> profiles/config.mk setarch @ARCH@ make -C profiles dvd.iso: echo MKI_OUTNAME=dvd.iso >> profiles/config.mk setarch @ARCH@ make -C profiles rescue.iso: echo INFO_THEME='desktop' >> profiles/config.mk echo DESKTOP_FLAVOUR='personal' >> profiles/config.mk echo MKI_OUTNAME=rescue.iso >> profiles/config.mk setarch @ARCH@ make -C profiles
обсуждение
boyarsh@
[13:41:47] <gvy> вообще не даёт покоя мысль о том, что я от make действительно добился странного %) [13:42:35] <gvy> с другой стороны, у нас действительно получается набор данных, который по крайней мере отчасти должен(?) влиять на все компоненты [13:43:16] <gvy> или попробовать собирать base/ в целях base-* и т.д., а потом всё в кучку?.. [13:44:10] <boyarsh> сложно сказать. Я, если честно, не вполне постиг то что ты вчера сделал [13:46:37] <gvy> ну... изврат я сделал: заставил make собирать конфигурацию вместо кода [13:46:48] <gvy> нарушив при этом [http://make.paulandlesley.org/rules.html#rule2 http://make.paulandlesley.org/rules.html#rule2] %) [13:46:59] <gvy> вот думаю, как вернуть на круги своя # ... [13:47:48] <gvy> наверное, то, что надо переключать глобально -- просто всё унести в configure [13:48:33] <gvy> а конфигурацию компонент и сами компоненты не пытаться по отдельности заковыривать-расковыривать, а прям по месту и собирать [13:49:49] <boyarsh> звучит логично [13:50:11] <gvy> собсно я какое-то время бился головой об стенку на тему того, как же ты собираешь desktop _плюс_ lite одним махом, пока не заглянул в твой make-all и не понял, что ошибался :) [13:50:31] <gvy> (и забыл, что там несколько подходов) [13:52:18] <boyarsh> да, одним махом я уже давно не собираю, хотя такое время было [13:54:26] <gvy> <legion> вынесите в configure.ac + autoconfig.mk сделать + в Makefile сделать include "autoconfig.mk" [13:54:34] <gvy> во, кажется, опять вырисовывается :) # ... [14:06:43] <gvy> вот думаю -- а не место ли этим base-xfce: в profiles/[http://freesource.info/wiki/Makefile.in Makefile.in], чтоб через голову (-C profiles/) лишний раз не прыгать [14:07:11] <boyarsh> почему бы и нет.. # ... [14:10:48] <boyarsh> я, наконец, отвязался от точных имён isoшек [14:11:36] <boyarsh> чтоб можно было делать сразу правильное имя, а не переименовывать потом [14:11:44] <gvy> я их, собсно, думаю переделать примерно на: distro-flavour-version-arch.iso [14:11:47] <gvy> ага [14:12:24] <gvy> собсно это были две вещи, которые мне сходу не понравились: зацепление на имя исошки и дизайна слишком многого, что следует не из них, а из того же, что и они
whiteowl@
[11:24:03] <WhiteOwl> обчно композячат переменные с составным именем [11:24:19] <gvy> можешь пример показать? [11:24:28] <WhiteOwl> CD_NAME = Lite [11:24:38] <WhiteOwl> CD_LABEL = Lite [11:24:53] <gvy> а потом $($())? [11:24:59] <WhiteOwl> aha [11:25:04] <gvy> комбинаторный взрыв [11:25:10] <gvy> я как раз от него пытаюсь уйти :) [11:25:34] <WhiteOwl> кому-то взрыв, кому-то - добрая традиция [11:25:37] <WhiteOwl> :)
legion@
[15:45:10] <gvy> ну, получается ли вынести общую часть [15:45:34] <legion> нет ничего невозможного [15:45:44] <gvy> например, "базовые" disk/[http://freesource.info/wiki/Makefile.in Makefile.in] вида e.g. # здесь была общая часть disk-*/[http://freesource.info/wiki/Makefile.in Makefile.in] # [15:46:05] <gvy> (я сейчас с таким пробую lite-cd собрать) [15:50:46] <legion> можно сделать ещё гибче [15:51:29] <legion> советую поглядывать на unstable в mkimage.git [11:14:48] <legion> попробуй сделать модульность через include # ... [11:18:55] <legion> из цели ты уже ничего сделать не сможешь [11:19:35] <legion> конфигурацию нужно формировать до выполнения любых правил # ... [11:22:33] <legion> $(shell cat file1) - это плохая идея [11:22:38] <gvy> ну вот и мне так кажется [13:41:47] <gvy> вообще не даёт покоя мысль о том, что я от make действительно добился странного %) [13:42:35] <gvy> с другой стороны, у нас действительно получается набор данных, который по крайней мере отчасти должен(?) влиять на все компоненты [13:43:16] <gvy> или попробовать собирать base/ в целях base-* и т.д., а потом всё в кучку?.. [13:44:18] <legion> ничего не понял без контекста [13:46:08] <gvy> ну... вместо base-xfce: ::: echo base >> .subdirs ::: echo xfce > .base_package_lists ::: echo xfce-settings-@THEME@ > .base_packages go: [...] ::: GLOBAL_BASE_PACKAGES='$(shell cat .base_packages)' \ ::: GLOBAL_BASE_PACKAGE_LISTS='$(shell cat .base_package_lists)' \ ::: SUBDIRS='$(shell cat .subdirs)' \ ::: INFO_NAME='$(shell cat .info_name)' \ [...] ::::::: setarch @ARCH@ make -C profiles попробовать нечто вроде base-xfce: ::: GLOBAL_BASE_PACKAGE_LISTS='xfce' setarch @ARCH@ make -C profiles/base [13:49:16] <gvy> +то, что надо переключать глобально -- просто всё унести в configure.ac [13:52:28] <legion> вынесите в configure.ac + autoconfig.mk сделать + в Makefile сделать include "autoconfig.mk" [13:52:44] <gvy> ммм... а что в autoconfig.mk ты бы положил? [13:52:50] <legion> и все эти GLOBAL_BASE_PACKAGE_LISTS не нужны будут [13:53:05] <gvy> export'ы? [13:53:20] <legion> глобальные переменные [13:53:27] <legion> SUBDIRS [13:53:50] <gvy> а собсно можно туда же (или в components.mk?) и компоненты упихать, чтоб только правила _дистров_ остались, так? [13:54:01] <legion> + переменные которые будут переключать выполения правил [15:46:45] <gvy> вооон сверху, около "autoconfig.mk" -- думаю унести цели вида base-xfce в profile/Makefile, из верхнего спускать туда стопку глобальных переменных, подставленных из "водопада" дефолтов плюс configure [15:47:44] <legion> что будет делать цель base-xfce ? [15:47:59] <legion> может не стоит делать отдельную цель ? [15:48:52] <gvy> собирать base с указанием дополнительного списка пакетов (packages-lists/xfce) и того дизайна, который вывалился из configure с дефолтами [15:49:04] <gvy> может, и не стоит... [15:49:35] <gvy> просто хочется иметь возможность собрать этот же base и для, скажем, base-kde (в dvd) [15:54:32] <legion> так я старался сделать чтобы это было возможно [15:55:08] <legion> ты можешь передать параметры GLOBAL_* всем Makefile's [15:56:35] <legion> также ты можешь изменить список пакетов [15:57:17] <legion> список этот будет формировать в зависимости от параметров configure [15:57:33] <legion> это же очень просто [15:57:49] <legion> советую глянуть как сделано в mozilla.org [15:57:57] <gvy> понимаешь, тут как... посмотри на ............./make-all [15:58:09] <legion> они пользуются только autoconf + make [15:59:15] <gvy> примерно так: autoconf make distclean ./configure --with-license=desktop --with-theme=desktop make dvd installer rescue live make distclean ./configure --with-license=junior-sl --with-theme=lite-school make lite-cd make distclean ./configure --with-theme=lite make lite-cd live-lite make distclean [15:59:46] <gvy> бишь на один набор переменных а-ля license/design может приходиться несколько исошек, и это разумно [16:00:06] <gvy> (я сперва попытался сделать, чтоб несколько дизайнов сразу можно было собрать, но это бред) [16:00:18] <gvy> (в смысле решается несколькими configure) [16:00:57] <legion> так что ты хочешь сделать-то ? :) [16:02:44] <gvy> чтоб получилось где-то сказать new-lite: installer base-xfce disk-xfce cd.iso #ещё что-то? new-dvd: installer base-kde disk-kde disk-contrib dvd.iso и эти base-* различались пакаджлистами на уровне переменных, а не форкнутыми base-*/ [16:03:20] <gvy> при этом в цели installer у них обоих собирается install2, только с разным тем же дизайном... [16:04:04] <legion> если честно, то не вижу проблемы [16:04:29] <gvy> ну... я тоже, кроме того, что туплю зело :) [16:05:05] <gvy> мож форкнуть себе маленький profiles, поиграться в нём, а то развесистый кромсать сложнее... [16:05:45] <gvy> а! вот проблема: так как бы сделать, чтоб можно было make new-lite new-dvd и каждому свой правильный base собрался? [16:05:48] <legion> так пятница! _ВЫКЛЮЧИ_ телефон и комп и поспи ... а в воскресенье всё будет просто! :) [16:06:02] <gvy> хм... :) [16:06:55] <legion> сделай Makefile так: include "config.mk" include "autoconfig.mk" [16:07:00] <legion> ой [16:07:02] <legion> нее [16:07:05] <legion> сейчас [16:08:40] <legion> сделай Makefile так: include "config.mk" include "autoconfig.mk" <Общие переменнные для N-ой стадии. Такие как PACKAGES и т.д.> include "targets.mk" [16:09:03] <legion> SUBDIRS будут выставляться в autoconfig.mk [16:09:35] <legion> а в autoconfig.mk будет ряд условий выбора [16:09:46] <legion> и разные переменные [16:09:56] <gvy> ты дважды сказал autoconfig.mk? [16:10:09] <legion> [17:08:34] <legion> сделай Makefile так: include "config.mk" include "autoconfig.mk" <Общие переменнные для N-ой стадии. Такие как PACKAGES и т.д.> include "targets.mk" [16:10:12] <gvy> дык SUBDIRS у lite и dvd отличаются :) [16:10:22] <legion> ну и что ? [16:11:18] <legion> autoconfig.mk: ifdef HAVE_LITE SUBDIRS = something one endif ifdef HAVE_DVD SUBDIRS = something two endif [16:12:05] <gvy> ну и как потом их оба состряпать? :) или по configure на каждый? [16:13:04] <legion> configure --with-dvd --with-lite [16:13:32] <gvy> ну и какие будут SUBDIRS? с e.g. contrib или без? :) [16:13:47] <legion> бррррр [16:14:00] <gvy> уф... ладно, пойду ещё думать. или отключусь на полчасика. а то только почём зря тебя отвлекать буду :( [16:14:00] <legion> это же просто [16:14:21] <gvy> да вот чую, что просто, но где -- пока не вижу [16:14:29] <legion> :)))
led@
[21:56:46] <gvy> Витя говорит, что toplevel Makefile в таком применении применён неадекватно, бишь тогда не make надо, а шелл какой или перл [21:57:04] <gvy> в смысле что-то инструментальное, а не task oriented [21:57:59] <gvy> собсно в чём проблема -- тут уже обстоит немаленький кустик флаворов: [[Image:whitelabel.png]] [21:58:37] <gvy> при этом некоторые из них друг от друга мало чем отличаются, но дублирование внутри mkimage-profiles-desktop/profile/*-* и в /Makefile идёт некислое... [22:01:31] <gvy> соответственно хочется (и отчасти сделано): сверху через configure спускать, с каким дизайном/ядром/языком собираем [и что?] посрединке [или в configure же?] накладывать поверх умолчаний то, что сказали, и из более общих вещей выводить более частные (например, из типа дистрибутива -- то, какие фичи в него войдут -- как-то contrib или там wine-local) внизу по возможности скармливать в унифицированные base/, disk/ (вместо base-*/, disk-*/) полученные стопки значений и получать куски нужного, которые потом собирать в исошку [22:02:53] <gvy> пока заткнулся на том, что mkimage хочет получить SUBDIRS (например, base disk install2) и всё собирать одним присестом, отталкиваясь от profiles/Makefile (где к тому же собирается первая стадия с propagator) [22:04:22] <Led> Может шелл-скрипт configure (с параметрами), на выходе получаем какой-то config.mk, а его, в свою очередь, include в основной Makefile? [22:04:55] <gvy> ну вот где-то такое legion@ и предложил [22:05:08] <gvy> у меня просто уже (или ещё?) в голову это всё не влазит [22:05:31] <gvy> надо было взять маленький профилёк и переделать, а я схватился за самый развесистый, хоть и самый нужный :) [22:06:18] <gvy> а! вспомнил, что с configure не так [22:06:53] <gvy> сейчас получается сделать один configure (задав theme там и ещё чего) и собрать пачку исошек -- навроде installer/cd/dvd [22:07:05] <gvy> так придётся переконфигурить на каждом шаге [22:07:13] <gvy> хотя, может, это и не больно... [22:07:36] <gvy> (а придумать, как сделать --with-target=installer,cd,dvd -- мне тоже оказалось слабо :) [22:07:50] <Led> сначала прикинь, что нужно/можно вынести в config.mk, потом попробовать сделать несколько разных config.mk для разных назначений, потом сделать configure, генерящий config.mk [22:08:08] <gvy> тут ещё какая штука: у нас фичи и носитель взаимосвязаны, но сложно сказать, что определяющее [22:08:28] <gvy> бишь "мы лепим dvd, поэтому можно contrib" или "нам нужен contrib, поэтому делаем dvd" [22:08:52] <gvy> хотя "носитель" тут чисто инфомационный суффикс (пока всё равно одни исошки) [22:09:53] <Led> а в чём проблема с --with-target=installer,cd,dvd? [22:10:38] <gvy> я не знаю, как выразить результат: понадобится ведь несколько запусков, поскольку у них общий base [22:10:38] <Led> в Makefile будет что-то типа: all: $(TARGETS) [22:11:13] <gvy> хотя можно, наверное, вернуть кучу base-*, но при этом оставить в них строго разное [22:11:14] <Led> а в config.mk TARGETS=.... [22:11:18] <gvy> а в base/ собирать общее