[devel] лишние зависимости *-devel пакетов (libX11)
Alexey Tourbin
=?iso-8859-1?q?at_=CE=C1_altlinux=2Eru?=
Вт Окт 7 17:21:33 MSD 2008
libX11.spec:
27 BuildRequires: libXdmcp-devel libXau-devel xorg-xtrans-devel xorg-util-macros libxcb-devel
28
29 %description
30 X11 Library
31
32 %package devel
33 Summary: X11 Libraries and Header Files
34 Group: Development/C
35 PreReq: xorg-x11-proto-devel
36 Requires: %name = %version-%release libXdmcp-devel libXau-devel libxcb-devel
37 Conflicts: XFree86-devel < 4.4 xorg-x11-devel <= 6.9.0
38
39 %description devel
40 %name-devel contains the libraries and header files needed to
41 develop programs which make use of %name.
Не следует автоматически переносить зависимости из BuildRequires
в Requires для *-devel пакета. Зависимости на уровне pkgconfig(...)
обычно оказываются более правильными и точными.
$ rpm -qR libX11-devel |grep ^pkgconfig
pkgconfig(kbproto)
pkgconfig(xcb)
pkgconfig(xproto)
$
Две последние pkgconfig(...) зависимости соответствуют пакетам
libxcb-devel и xorg-xproto-devel (явные зависимости добавлены вручную).
Зависимость pkgconfig(kbproto) дополнительно вытягивает xorg-kbproto-devel
(вручную не указан).
Пакеты libXdmcp-devel libXau-devel, указанные вручную, оказываются лишними.
Они используются для сборки libX11 (в BuildRequires), но не требуются
при сборке других пакетов с libX11-devel (в Requires).
Я приложил скрипт cpp.req, который позволяет дополнительно проверить,
какие зависимости требуются для хедеров.
$ rpm -ql libX11-devel |grep /usr/include/ |cpp.req -v |sort -u
cpp.req: /usr/include/X11/XKBlib.h: /usr/include/X11/Xlib.h -> libX11-devel (via rpmdb)
cpp.req: /usr/include/X11/XKBlib.h: /usr/include/X11/extensions/XKBstr.h -> xorg-kbproto-devel (via rpmdb)
cpp.req: /usr/include/X11/Xcms.h: /usr/include/X11/Xlib.h -> libX11-devel (via rpmdb)
cpp.req: /usr/include/X11/Xlib-xcb.h: /usr/include/xcb/xcb.h -> libxcb-devel (via rpmdb)
cpp.req: /usr/include/X11/Xlib-xcb.h: /usr/include/X11/Xlib.h -> libX11-devel (via rpmdb)
cpp.req: /usr/include/X11/Xlib.h: /usr/include/sys/types.h -> glibc-devel (via rpmdb)
cpp.req: /usr/include/X11/Xlib.h: /usr/include/X11/X.h -> xorg-xproto-devel (via rpmdb)
cpp.req: /usr/include/X11/Xlib.h: /usr/include/X11/Xfuncproto.h -> xorg-xproto-devel (via rpmdb)
cpp.req: /usr/include/X11/Xlib.h: /usr/include/X11/Xosdefs.h -> xorg-xproto-devel (via rpmdb)
cpp.req: /usr/include/X11/Xlib.h: /usr/lib64/gcc/x86_64-alt-linux/4.1.2/include/stddef.h -> gcc4.1 (via rpmdb)
cpp.req: /usr/include/X11/Xlibint.h: /usr/include/X11/Xlib.h -> libX11-devel (via rpmdb)
cpp.req: /usr/include/X11/Xlibint.h: /usr/include/X11/Xproto.h -> xorg-xproto-devel (via rpmdb)
cpp.req: /usr/include/X11/Xlibint.h: /usr/include/X11/XlibConf.h -> libX11-devel (via rpmdb)
cpp.req: /usr/include/X11/Xlibint.h: /usr/include/errno.h -> glibc-devel (via rpmdb)
cpp.req: /usr/include/X11/Xlibint.h: /usr/include/X11/Xfuncs.h -> xorg-xproto-devel (via rpmdb)
cpp.req: /usr/include/X11/Xlibint.h: /usr/include/stdlib.h -> glibc-devel (via rpmdb)
cpp.req: /usr/include/X11/Xlibint.h: /usr/lib64/gcc/x86_64-alt-linux/4.1.2/include/stddef.h -> gcc4.1 (via rpmdb)
cpp.req: /usr/include/X11/Xlocale.h: /usr/include/X11/Xfuncproto.h -> xorg-xproto-devel (via rpmdb)
cpp.req: /usr/include/X11/Xlocale.h: /usr/include/X11/Xosdefs.h -> xorg-xproto-devel (via rpmdb)
cpp.req: /usr/include/X11/Xlocale.h: /usr/include/locale.h -> glibc-devel (via rpmdb)
cpp.req: /usr/include/X11/Xresource.h: /usr/include/X11/Xlib.h -> libX11-devel (via rpmdb)
cpp.req: /usr/include/X11/Xutil.h: /usr/include/X11/Xlib.h -> libX11-devel (via rpmdb)
cpp.req: /usr/include/X11/Xutil.h: /usr/include/X11/keysym.h -> xorg-xproto-devel (via rpmdb)
gcc4.1
glibc-devel
libX11-devel
libxcb-devel
xorg-kbproto-devel
xorg-xproto-devel
$
Здесь зависимости gcc4.1 и glibc-devel -- тривиальные, зависимость
libX11-devel сама на себя "не считаетася" (потому дело происходит
в хост-системе, а не в RPM_BUILD_ROOT). Оставшиеся три существенные
зависимости соответствуют уже имеющимся зависимостям pkgconfig(...).
Значит, можно было бы вообще не писать вручную дополнительные
зависимости для libX11-devel.
----------- следующая часть -----------
#!/bin/sh -efu
#
# Copyright (C) 2008 Alexey Tourbin <at на altlinux.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
. /usr/lib/rpm/functions
. /usr/lib/rpm/find-package
[ -n "${RPM_LIBDIR-}" ] || RPM_LIBDIR=`rpm --eval %_libdir`
PKG_CONFIG_PATH=$RPM_LIBDIR/pkgconfig:/usr/share/pkgconfig
[ -z "${RPM_BUILD_ROOT-}" ] ||
PKG_CONFIG_PATH=$RPM_BUILD_ROOT$RPM_LIBDIR/pkgconfig:$RPM_BUILD_ROOT/usr/share/pkgconfig:$PKG_CONFIG_PATH
export PKG_CONFIG_PATH
PkgconfigCflags()
{
local f="$1"; shift
local pc_files
if [ -n "${RPM_BUILD_ROOT-}" ]; then
pc_files=$(set +f; ls "$RPM_BUILD_ROOT$RPM_LIBDIR/pkgconfig"/*.pc 2>/dev/null ||:)
else
pc_files=$(rpmquery -f "$f" --list 2>/dev/null |
egrep "^$RPM_LIBDIR/pkgconfig/[^/]+[.]pc\$" || [ $? = 1 ])
fi
[ -n "$pc_files" ] || return 0
local pc
for pc in $pc_files; do
pkg-config --enable-recursion --cflags "$pc" ||
Fatal "$pc: pkg-config failed"
done
}
Cflags()
{
local f="$1"; shift
local cflags
cflags=$(PkgconfigCflags "$f")
set -- $cflags -I/usr/include -I${f%/*} -I${f%/*/*} -I${f%/*/*/*}
local cf
for cf; do
case $cf in
-D?*) echo $cf ;;
esac
done
for cf; do
[ -n "${RPM_BUILD_ROOT-}" ] || continue
case $cf in
-I/*) echo -I$RPM_BUILD_ROOT${cf#-I} ;;
esac
done
for cf; do
case $cf in
-I/*) echo $cf ;;
esac
done
}
cpp=
IncludedFiles()
{
local f="$1"; shift
if [ -z "$cpp" ]; then
cpp=/usr/bin/${RPM_ARCH:-noarch}-alt-linux-cpp
[ -x "$cpp" ] || cpp=/usr/bin/cpp
[ -z "${GCC_VERSION-}" ] || cpp=$cpp-$GCC_VERSION
Debug "cpp=$cpp"
fi
cflags=$(Cflags "$f")
Debug "$f: cflags:" $cflags
if ! out=$("$cpp" -w -x c++ $cflags "$f"); then
Warning "$f: cpp failed"
return 0
fi
echo "$out" |grep '^#' |awk -v prog="$PROG" -v hdr="$f" '
# info cpp "Preprocessor Output"
BEGIN {
SP = 0
Stack[SP] = hdr
}
function filename(f) {
if (!sub(/^"\//, "/", f) ||
!sub(/"$/, "", f))
printf "%s: %s: bad path %s\n",
prog, hdr, f >"/dev/stderr"
return f
}
function Push(f) {
f=filename(f)
Stack[++SP]=f
if (SP==1)
print f
}
function Pop(f) {
f=filename(f)
if (f != Stack[--SP])
printf "%s: %s: expected pop %s, got pop %s\n",
prog, hdr, Stack[SP], f >"/dev/stderr"
}
$4==1 { Push($3) }
$4==2 { Pop($3) }
END {
if (SP > 0)
printf "%s: %s: non-empty stack, top %s\n",
prog, hdr, Stack[SP] >"/dev/stderr"
}'
}
CppReq()
{
local f="$1"; shift
local files
files=$(IncludedFiles "$f")
[ -n "$files" ] || return 0
local RPM_FINDPACKAGE_HOST_PKG_NAMES=1
local inc
echo "$files" |while read -r inc; do
FindPackage "$f" "${inc#${RPM_BUILD_ROOT-}}"
done
}
ArgvFileAction CppReq "$@"
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип : application/pgp-signature
Размер : 197 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url : <http://lists.altlinux.org/pipermail/devel/attachments/20081007/5fef9c72/attachment-0002.bin>
Подробная информация о списке рассылки Devel