* [devel] mono: распил *-sharp пакетов
@ 2007-11-22 6:17 Alexey Tourbin
2007-11-25 14:52 ` Ildar Mulyukov
0 siblings, 1 reply; 3+ messages in thread
From: Alexey Tourbin @ 2007-11-22 6:17 UTC (permalink / raw)
To: devel
[-- Attachment #1: Type: text/plain, Size: 3009 bytes --]
Напоминаю проблему. Крайне нежелательна ситуация, когда в *-devel
пакете лежит всего лишь *.pc файл, и штатное использование *.pc
файла в *-devel пакете не предполагает использование каких-либо
других файлов в этом пакете.
buildreq сейчас игнорирует использование *.pc файлов. Следовательно,
зависимость на такой *-devel пакет, в котором по сути нет ничего кроме
*.pc файла, будет проигнорирована. Это несколько сомнительно, но в этом
есть свой резон, потому что это енфорсит определённую (правильную)
логику распила пакетов.
Правильная логика распила пакетов такова, что штатное использование
*.pc файла должно приводить к использованию других файлов в пакете.
Например, если это сишная библиотека, то использование *.pc файла
должно впоследствии "трогать" *.h и *.so файлы иэ этого пакета.
В соответствии с этим есть два варианта более правильного распила
*-sharp пакетов.
1) Не отпиливать *-devel пакет вообще. В *-devel пакете, как правило,
содержится какая-то "метаинформация", которая не нужна для работы
программ, но нужна для сборки других пакетов. Типичный пример -- *.h
файлы у сишных библиотек. В моне нет никакой внешней метаинформации,
все *.dll файлы самодостаточны как по рантайму, так и по возможности
линковки с ними. Значит, нет резона отпиливать *-devel пакет, в который
можно было бы выносить специальные вещи, которые не нужны для рантайма,
но нужны только для сборки.
2) Сохранить *-devel пакеты. Насколько я понмаю, в моне для линковки
с диелелями есть симлинки которые похожи на *.so симлинки в сишных
*-devel пакетах. Пример.
$ cat test.cs
class A { public static void Main() { }}
$ filereq /dev/stdout mcs -pkg:glib-sharp-2.0 test.cs |grep /usr/lib/mono/
/usr/lib/mono/1.0/I18N.Other.dll
/usr/lib/mono/1.0/I18N.dll
/usr/lib/mono/1.0/System.Xml.dll
/usr/lib/mono/1.0/System.dll
/usr/lib/mono/1.0/mcs.exe
/usr/lib/mono/1.0/mcs.exe.config
/usr/lib/mono/1.0/mscorlib.dll
/usr/lib/mono/gac/glib-sharp/2.10.0.0__35e10195dab3c99f/glib-sharp.dll.config
/usr/lib/mono/gtk-sharp-2.0/glib-sharp.dll
/usr/lib/mono/gac/I18N.Other/1.0.5000.0__0738eb9f132ed756/I18N.Other.dll
/usr/lib/mono/gac/I18N/1.0.5000.0__0738eb9f132ed756/I18N.dll
/usr/lib/mono/gac/System.Xml/1.0.5000.0__b77a5c561934e089/System.Xml.dll
/usr/lib/mono/gac/System/1.0.5000.0__b77a5c561934e089/System.dll
/usr/lib/mono/gac/glib-sharp/2.10.0.0__35e10195dab3c99f/glib-sharp.dll
$
То есть линковка с моновскими диелелями идёт не через /usr/lib/mono/gac/
а через специальные симлинки которые указаны в *.pc файлах. В данном
случае это /usr/lib/mono/gtk-sharp-2.0/glib-sharp.dll.
Поэтому есть возможность переместить эти симлинки в *-devel пакет,
а в основном пакете оставить только GAC ассемблию. То есть распил
получается примерно такой:
%files
/usr/lib/mono/gac/*
%files devel
%dir /usr/lib/mono/gtk-sharp-2.0
/usr/lib/mono/gtk-sharp-2.0/*.dll
Тогда эти симлинки из *-devel пакета будут вылавливаться buildreq'ом при
линковке с диелелями.
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [devel] mono: распил *-sharp пакетов
2007-11-22 6:17 [devel] mono: распил *-sharp пакетов Alexey Tourbin
@ 2007-11-25 14:52 ` Ildar Mulyukov
2007-11-25 16:23 ` Alexey Tourbin
0 siblings, 1 reply; 3+ messages in thread
From: Ildar Mulyukov @ 2007-11-25 14:52 UTC (permalink / raw)
To: devel
[-- Attachment #1: Type: text/plain, Size: 320 bytes --]
не понимаю, почему это письмо не дошло. Ознакомьтесь.
Ильдар
--
Ildar Mulyukov, free SW designer/programmer/packager
=========================================
email: ildar@altlinux.ru
Jabber: ildar@jabber.ru
ICQ: 4334029
ALT Linux Sisyphus http://www.sisyphus.ru
=========================================
[-- Attachment #2: Type: message/rfc822, Size: 9419 bytes --]
From: Ildar Mulyukov <ildar@altlinux.ru>
To: devel@lists.altlinux.org
Subject: Re: [devel] rpm-build-mono 1.2
Date: Tue, 06 Nov 2007 11:57:15 +0600
Message-ID: <1194328635l.9963l.0l@ildar.innovations.kz>
On 06.11.2007 03:28:51, Alexey Tourbin wrote:
> On Sun, Nov 04, 2007 at 05:24:40PM +0300, Alexey Tourbin wrote:
> > > А я ещё ничего и не заливал.
> > Тогда ладно. Пока можно без справки. :)
>
> Как там прогрессирует распил mono?
Мы пока даже не разобрались, кто будет этим заниматься ;)
> У меня готова или почти готова новая версия rpm-build-mono. В ней
> решены почти все проблемы, которые можно решить на данном этапе
> развития относительно доступными средствами.
Прелестно! Сейчас фетчну.
> Тут такая тонкость, что сразу после того, как эта версия
> rpm-build-mono попадёт в сизиф, желательно сразу же собрать с ней
> mono. Раньше этого сборка любого моновского пакета даст анметы
> (которые, впрочем, рассосутся при прохождении нового mono). В
> остальном совместимость сохранена -- то есть не придётся сразу же
> пересобирать все имеющиеся моновские пакеты.
Поправка: перед заливкой пакета нужно залить все пакеты, от которых он
зависит. Математика, Вы же её любите ;)
> По прежнему просьба положить /usr/bin/monodis в какой-нибудь самый
> базовый моновский пакет, а может и отпилить отдельно в пакет с
> нехитрым названием monodis (правда, тогда ещё и придётся отпилить
> libmono).
Учтём.
> Я посмотрел как собраны некоторые моновские пакеты. Есть вот какая
> претензия: не нужно делать отдельно напр. libgtk-sharp2-devel пакета,
> в котором единcтвенное что есть это *.pc файлы. Точнее, не надо
> класть *.pc файлы в отдельный *-devel пакет, если правильное
> использование *.pc файла не дает ГАРАНТИРОВАННОГО использования
> каких-либо ДРУГИХ файлов из этого пакета (типа include'ов и симлинка
> для линковки в более типичном случае).
>
> Иначе buildreq не обнаружит зависимость на такие пакеты, т.к. *.pc
> файлы сами по себе игнорируются buildreq'ом. А если buildreq не
> обнаруживает зависимости то это очень плохо с точки зрения технологии
> разработки.
Это всё очень плохо. Что же делать? Реально для сборки какого-нибудь
пакета нужны %name.dll (бинарь) и %name.pc для вытаскивания других
бинарей по зависимостям.
Можно было бы *.pc класть в основной пакет, но в этом случае при
установке пакета %name будут вытягиваться по зависимости все *-devel, а
это может быть немалый довесок.
> Ещё претензия по сборке mono: убрать всё зависимости, выставленные
> вручную. Например, сейчас mono требует libicu. Я так и не нашёл,
> где там зашита зависимость на libuci. Это наверное просто наколка.
Нет. Раньше libicu использовался для i18n в Моно. Сейчас - не знаю,
надо проверить.
> В общем, лучшее, что может сделать maintainer по части зависимостей
> -- это ПРОСТО запускать buildreq. Всё остальное должно волшебным
> образом получиться автоматически, а если что-то не получается, значит
> надо фиксить сборочную среду/технологию сборки. Таково мое понимание
> технологичности разработки пакетов.
Выглядит заманчиво, но я не поведусь ;) Уж я не знаю, что сделали для
этого за последние полгода - я просто был в оффлайне всё это время. Но:
1. не все используемые внешние библиотеки прописаны в *.dll.config
(были, и, поручусь, ещё есть)2. (Пока) Нет способа полностью
автоматизированно выловить директивы использования внешних библиотек в
коде. (Вам же не приходит в голову прочёсывать C-программу в поисках
dlopen()?)
В конце замечу, что, Алексей, Вы меня несказанно радуете участием в
нашей скорбной участи поддержки mono-пакетов ;-) Большое Вам спасибо!
С уважением, Ильдар.
--
Ildar Mulyukov, free SW designer/programmer/packager
=========================================
email: ildar@altlinux.ru
Jabber: ildar@jabber.ru
ICQ: 4334029
ALT Linux Sisyphus http://www.sisyphus.ru
=========================================
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [devel] mono: распил *-sharp пакетов
2007-11-25 14:52 ` Ildar Mulyukov
@ 2007-11-25 16:23 ` Alexey Tourbin
0 siblings, 0 replies; 3+ messages in thread
From: Alexey Tourbin @ 2007-11-25 16:23 UTC (permalink / raw)
To: devel
[-- Attachment #1: Type: text/plain, Size: 4398 bytes --]
On Sun, Nov 25, 2007 at 08:52:02PM +0600, Ildar Mulyukov wrote:
> >Я посмотрел как собраны некоторые моновские пакеты. Есть вот какая
> >претензия: не нужно делать отдельно напр. libgtk-sharp2-devel пакета,
> >в котором единcтвенное что есть это *.pc файлы. Точнее, не надо
> >класть *.pc файлы в отдельный *-devel пакет, если правильное
> >использование *.pc файла не дает ГАРАНТИРОВАННОГО использования
> >каких-либо ДРУГИХ файлов из этого пакета (типа include'ов и симлинка
> >для линковки в более типичном случае).
> >
> >Иначе buildreq не обнаружит зависимость на такие пакеты, т.к. *.pc
> >файлы сами по себе игнорируются buildreq'ом. А если buildreq не
> >обнаруживает зависимости то это очень плохо с точки зрения технологии
> >разработки.
>
> Это всё очень плохо. Что же делать? Реально для сборки какого-нибудь
> пакета нужны %name.dll (бинарь) и %name.pc для вытаскивания других
> бинарей по зависимостям.
> Можно было бы *.pc класть в основной пакет, но в этом случае при
> установке пакета %name будут вытягиваться по зависимости все *-devel, а
> это может быть немалый довесок.
Для сборки как правило требуется не бинарь под /usr/lib/mono/gac/,
а специальный симлинк где-то приблизительно под /usr/lib/mono/%name.
Поэтому достаточно будет переместить этот каталог в *-devel пакет.
> >Ещё претензия по сборке mono: убрать всё зависимости, выставленные
> >вручную. Например, сейчас mono требует libicu. Я так и не нашёл,
> >где там зашита зависимость на libuci. Это наверное просто наколка.
>
> Нет. Раньше libicu использовался для i18n в Моно. Сейчас - не знаю,
> надо проверить.
Вроде не используется, я грепал и так и сяк. :)
> >В общем, лучшее, что может сделать maintainer по части зависимостей
> >-- это ПРОСТО запускать buildreq. Всё остальное должно волшебным
> >образом получиться автоматически, а если что-то не получается, значит
> >надо фиксить сборочную среду/технологию сборки. Таково мое понимание
> >технологичности разработки пакетов.
>
> Выглядит заманчиво, но я не поведусь ;) Уж я не знаю, что сделали для
> этого за последние полгода - я просто был в оффлайне всё это время. Но:
> 1. не все используемые внешние библиотеки прописаны в *.dll.config
> (были, и, поручусь, ещё есть)2. (Пока) Нет способа полностью
> автоматизированно выловить директивы использования внешних библиотек в
> коде. (Вам же не приходит в голову прочёсывать C-программу в поисках
> dlopen()?)
А какие есть способы "прятать" использование внешних библиотек в коде?
В случае с ELF'ами мы и не вылавливаем dlopen, но мы можем выловить
DT_NEEDED (явные зависимости на разделяемые библиотеки). Так и в случае
с mono, мы должны вылавливать явные зависимости из 'monodis --moduleref'.
Если кто-то "прячет" зависимости в dlopen или куда-то ещё, то он
лишается благ цивилизации.
С неполными или неправильными данными в *.dll.config самая сложная
проблема. Чтобы это более-менее работало нужно сделать как минимум две
нетривиальные вещи:
1) Желательно в rpm-build реализовать новую модульную подсистему fixup,
по аналогии с requires и provides. Типа чтобы можно было сделать скрипт
/usr/lib/rpm/mono.fixup и он автоматически исправлял *.dll.config файлы
в %buildroot.
2) Сейчас нет "системного" способа работы с XML файлами, даже для
чтения, а нужно делать inplace edit. Вот нужно найти такой способ чтобы
было дёшево и сердито. Я склоняюсь к какому-нибудь перловому модулю,
типа perl-XML-Simple, но это нужно пробовать. Несколько неприятно,
что потянутся перловые модули, но если "системного" способа всё равно
нет, то придётся утилизировать какой-то несистемный.
Ну и
3) Нужно понять как сам mono работает когда в *.dll.config неполная
информация, т.е. как он выходит на "настоящую" библиотеку с сонеймом,
и мимикрировать эту логику в mono.fixup.
> В конце замечу, что, Алексей, Вы меня несказанно радуете участием в
> нашей скорбной участи поддержки mono-пакетов ;-) Большое Вам спасибо!
На данном этапе я по минимуму передалал почти всё что хотел, при этом
сломалось минимальное число пакетов. Думаю что теперь Mono Team следует
перепилить *-sharp пакеты как обсужадлось, чтобы работал buildreq.
Лучше это делать в топологическом порядке, т.е. начинать с "наиболее
базовых" пакетов и заканчивая теми, которые уже зависят от базовых.
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2007-11-25 16:23 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-11-22 6:17 [devel] mono: распил *-sharp пакетов Alexey Tourbin
2007-11-25 14:52 ` Ildar Mulyukov
2007-11-25 16:23 ` Alexey Tourbin
ALT Linux Team development discussions
This inbox may be cloned and mirrored by anyone:
git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
public-inbox-index devel
Example config snippet for mirrors.
Newsgroup available over NNTP:
nntp://lore.altlinux.org/org.altlinux.lists.devel
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git