* [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