WhiteLabel/Makefile

Материал из ALT Linux Wiki
48px-Mail-mark-junk red.svg.png
Эта статья конкретно протухла.
Статья уже не подходит под современные реалии, под современные версии Альта или сломана совсем. Возможно, её уже не доработать и не поместить в архив.


Freesource-logo.png Blue Glass Arrow.svg MediaWiki logo.png
Эта страница была перемещена с freesource.info.
Эта страница наверняка требует чистки и улучшения — смело правьте разметку и ссылки.
Просьба по окончанию убрать этот шаблон со страницы.


Внимание! Эта статья устарела, задумки легли в основу 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/ собирать общее