WhiteLabel/Makefile

Материал из ALT Linux Wiki
< WhiteLabel
Версия от 14:51, 5 августа 2008; MikhailGusarov (обсуждение | вклад) (Новая: {{Викифицировать}} {{MovedFromFreesourceInfo|TZ/AltLinux/WhiteLabel}} == white labeling: makefile == Предлагается прийти ''примерно'' к так...)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
42px-Wikitext-ru.svg.png
Эту статью следует викифицировать.
Freesource-logo.png Blue Glass Arrow.svg MediaWiki logo.png
Эта страница была перемещена с freesource.info.
Эта страница наверняка требует чистки и улучшения — смело правьте разметку и ссылки.
Просьба по окончанию убрать этот шаблон со страницы.


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 %) [13:46:59] <gvy> вот думаю, как вернуть на круги своя

  1. ...

[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> во, кажется, опять вырисовывается :)

  1. ...

[14:06:43] <gvy> вот думаю -- а не место ли этим base-xfce: в profiles/Makefile.in, чтоб через голову (-C profiles/) лишний раз не прыгать [14:07:11] <boyarsh> почему бы и нет..

  1. ...

[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/Makefile.in вида e.g.

  1. здесь была общая часть disk-*/Makefile.in #

[15:46:05] <gvy> (я сейчас с таким пробую lite-cd собрать) [15:50:46] <legion> можно сделать ещё гибче [15:51:29] <legion> советую поглядывать на unstable в mkimage.git


[11:14:48] <legion> попробуй сделать модульность через include

  1. ...

[11:18:55] <legion> из цели ты уже ничего сделать не сможешь [11:19:35] <legion> конфигурацию нужно формировать до выполнения любых правил

  1. ...

[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> собсно в чём проблема -- тут уже обстоит немаленький кустик флаворов: 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/ собирать общее