[devel] [spec-lynch]
Damir Shayhutdinov
damir at altlinux.org
Sat Oct 10 10:29:33 UTC 2009
9 октября 2009 г. 20:03 пользователь Евгений Ростовцев
<real.altlinux.org> написал:
> http://git.altlinux.org/people/real/packages/trilinos.git?p=trilinos.git;a=blob_plain;f=trilinos.spec;hb=HEAD
>
> Спек ужасен по объёму, так что на быстрый ответ не расчитываю. Просто,
> надеюсь, разбор пройдёт относительно бесконфликтно (т.е. без личных
> претензий, сугубо в рабочем режиме). Причины тех или иных мест в спеке
> поясню в процессе обсуждения, а вот на полную вычистку спека до сих
> пор не могу себя простимулировать (очень долго получилось бы), но в
> случае обсуждения надеюсь заняться.
Привет!
Присланная ссылка со спеком не очень удобна для разбора, поэтому я ее
заменил на такую:
http://git.altlinux.org/people/real/packages/trilinos.git?p=trilinos.git;a=blob;f=trilinos.spec;hb=HEAD
Там удобнее ссылаться на строчки.
17 Source: http://trilinos.sandia.gov/download/files/trilinos-9.0.3.tar.gz
Скорее всего имеет смысл заменить trilinos-9.0.3 на %name-%version,
меньше будет измененных строчек при обновлении.
В спеке длиной 3600 строчек тяжело разбираться. В принципе, длину
спека можно было бы немного уменьшить, увеличив читабельность, если
общие 6 строчек (45-50), которые появляются в каждом %description,
оформить в виде макроса. А вообще нужны эти 6 строчек в каждом
описании каждого подпакета?
90 %package -n lib%name-devel
.......
105 Conflicts: lib%name-devel < %version-%release
106 Obsoletes: lib%name-devel < %version-%release
Непонятно, что делает такая структура, для чего нужна. Раньше были
пакеты с другим именем, которые Provides: lib%name-devel? Иначе, при
отсутствии AllowDuplicates, эти Conflicts и Obsoletes на тот же пакет,
но меньшей версии не нужны. И так кстати почти во всех девел-пакетах.
В libisorropia-devel наблюдается следующее:
151 %package -n libisorropia-devel
....
155 Requires: lib%name-devel = %version-%release
.....
159 Conflicts: lib%name-devel < %version-%release
160 Obsoletes: lib%name-devel < %version-%release
Нет ли ошибки в строчках 159-160? Не подразумевался ли там
libisorropia-devel вместо lib%name-devel?
По идее, при Requires с жесткой версией, Conflicts и Obsoletes не
нужны (если не брать в рассчет AllowDuplicates, но это для
-devel-пакетов в основном бессмысленно)
То же самое касается строчек 176 и 177. В строчке 176 делается жесткий
Requires, поэтому в 177 строчке конфликт не нужен.
Аналогичные замечания по всем остальным пакетам пропущены
Теперь по сборке.
Строчки 2495-2521 видимо нужны, потому что ./configure не справляется
с автоопределением местоположения заголовков и библиотек? Возможно,
правильнее будет доработать ./configure и отослать патч в апстрим, а
не делать костыли в спеке, тем более что их там так много.
В идеале секция %build должна состоять из %configure (возможно,
большого, так как присутствует очень много опций), с вариациям по
%with/%enable.
2674 %if_with petsc
2675 pushd packages/epetraext
2676 sed -i 's|^clean::|clean2:|' petscconf
2677 popd
2678 sed -i '162s|#||' packages/PyTrilinos/shared/setup.py
2679 %endif
Зачем pushd/popd в строчках 2675/2677? Можно было бы просто написать
sed -i <....> packages/epetraext/petscconf
Строчка
2678 sed -i '162s|#||' packages/PyTrilinos/shared/setup.py
содержит четкое указание на номер строки (162), и поэтому особенно
уязвима перед изменениями исходников.
Предлагаю оформить эти sed-ы в виде патча, который будет применяться,
если собирается с petsc, еще на этапе %prep, после %setup. Так будет
гораздо проще, и в спеке будет меньше мусора.
Вообще, по-хорошему, секция %build не должна менять исходники, для
этого есть секция %prep. Если запустить отдельно секцию %build (через
--short-circuit), то сборка должна проходить с одними и теми же
исходниками.
2693 pushd packages/zoltan/siMPI
2694 %make_build
2695 popd
Можно было бы заменить на
%make_build -C packages/zoltan/siMPI
То же самое в 2740-2742, 2802-2804,
Вообще спек в этом месте до ужаса напоминает Makefile. 2697-2735 уж
точно должны быть в каком-нибудь Makefile, а вовсе не в спеке.
Воспользуйтесь возможностями гита, поместите это в нужные Makefile, а
патч можно будет потом отослать в upstream.
Смущает также строчка 2717 и --no-as-needed в ней. Без такого костыля
сборка не удается?
Секция %install тоже выглядит как Makefile и просто напрашивается на
перенос в исходники проекта.
2828 pushd %buildroot%_libdir
2829 for i in $(ls *.so); do
2830 mv $i $i.%sover
2831 ln -s $i.%sover $i
2832 done
2833 popd
Это - пример непонимания, как работает soname. Soname нужен на этапе
компиляции, а не на этапе установки. Когда линкер линкует библиотеку к
другой библиотеке, или к исполняемому файлу, он смотрет, задан ли
SONAME. Если задан, то линкер использует этот SONAME вместо имени
библиотеки (которое тут равно libfoo.so). Это позволяет получить
конечный бинарник, в котором зависимости идут по libfoo.so.%sover, а
не на libfoo.so, как это бывает в случае без soname.
В данном случае, если компиляция библиотек производилась без заданий
SONAME, создание таких "сонейм-симлинков" бессмысленно. Карго-soname
не помогут, а только запутают пользователей. Проще не переименовывать
библиотеки, а в devel-пакеты включать только заголовочные файлы.
Если интересно - посмотрите на пакет libnss и libnss-devel
2862 pushd packages/zoltan/siMPI
2863 %makeinstall_std
2864 popd
Тут опять, можно было воспользоваться ключом -C у make.
Резюме:
В общем и целом, спек представляет собой попытку исправить сборочную и
установочную обвязку апстрима. Выглядит это некрасиво. Если не бояться
патчей, то спек скорее всего удастся причесать к стандартному
%prep
%setup
%patchN...
%if_with foo
%patchM
%endif
%build
%configure [куча параметров]
%make_build
%install
%makeinstall_std
Думаю, мантейнеры других дистрибутивов тоже будут рады, если подобный
патч уйдет в upstream.
> Я, например, подумываю о том, чтобы все хедеры засунуть в один пакет,
> отдельный, типа trilinos-headers, без всяких .so. Сейчас просто из-за
> того, что в некоторых хедерах есть директивы включения из других
> пакетов, зависимости получились такими жёсткими, что устанавливаются
> вообще почти все devel-пакеты, что нежелательно...
Это было бы правильным решением, так как .so в девел-пакетах просто не
нужны, при таком способе формирования карго-сонеймов. Но тогда
соответствующие девел-пакеты окажутся пустыми, виртуальными пакетами,
в которых не будет ни .so, ни заголовочных файлов. Там могли бы быть
pkg-config файлы, но их там нет.
Главное, что нужно обеспечить при таком засовывании заголовочных
файлов в один пакет - чтобы софт, который будет собираться с этими
библиотеками, мог указывать BuildRequires: libfoo-devel, без знаний, в
каком пакете лежат заголовочные файлы. То есть libfoo-devel должен
Requires: trilnos-headers и libfoo.
More information about the Devel
mailing list