ALT Linux Team development discussions
 help / color / mirror / Atom feed
* [devel] лишние зависимости *-devel пакетов (libX11)
@ 2008-10-07 13:21 Alexey Tourbin
    0 siblings, 1 reply; 3+ messages in thread
From: Alexey Tourbin @ 2008-10-07 13:21 UTC (permalink / raw)
  To: devel


[-- Attachment #1.1: Type: text/plain, Size: 4186 bytes --]

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.

[-- Attachment #1.2: cpp.req --]
[-- Type: text/plain, Size: 2885 bytes --]

#!/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 "$@"

[-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [devel] лишние зависимости *-devel пакетов (libX11)
  @ 2008-10-07 16:39   ` Alexey Tourbin
  2008-10-07 17:04     ` Valery V. Inozemtsev
  0 siblings, 1 reply; 3+ messages in thread
From: Alexey Tourbin @ 2008-10-07 16:39 UTC (permalink / raw)
  To: ALT Linux Team development discussions

[-- Attachment #1: Type: text/plain, Size: 1393 bytes --]

On Tue, Oct 07, 2008 at 07:34:42PM +0400, Konstantin Pavlov wrote:
> > Значит, можно было бы вообще не писать вручную дополнительные
> > зависимости для libX11-devel.
> 
> Такое правило хорошо работает только в тех проектах, в которых .pc-файлы
> написаны раз и навсегда и вероятность их изменения равна нулю. Т.е. нигде не
> работает.

Нет, как раз *.pc файлы должны определять зависимости между *-devel
пакетами; и часто они это делают достаточно точно и правильно (как
показывает пример с libX11).

У меня есть возможность ввести новый метод поиска зависимостей -- cpp.req,
зависимости хедеров.  Но этот метод как раз полагается на правильное
указание зависимостей в *.pc файлах, в частности, Cflags вида -I/usr/include/foo.
Это можно объяснить подробнее; но, короче, я думаю, что подпорка cpp.req
для хедеров не нужна, потому что на деле именно *.pc файлы играют роль.

Замечу, что линковочные зависимости "Libs" типа "-lz" и так уже
обрабатываются с помощью pkgconfiglib.req, и иногда подставляют
дополнительные зависимости в *-devel пакеты.

> Предполагаю, что для избавления от гойловной боли при таком случае мантейнер
> libX11 и вписал нужные зависимости руками.

Maintaner libX11 в таком случае поступил правильно, но очень грубо.
Автоматика может давать более тонкий и правильный результат; правда,
время от времени нужно проверять, что именно она дает.

[-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [devel] лишние зависимости *-devel пакетов (libX11)
  2008-10-07 16:39   ` Alexey Tourbin
@ 2008-10-07 17:04     ` Valery V. Inozemtsev
  0 siblings, 0 replies; 3+ messages in thread
From: Valery V. Inozemtsev @ 2008-10-07 17:04 UTC (permalink / raw)
  To: ALT Linux Team development discussions

[-- Attachment #1: Type: text/plain, Size: 448 bytes --]

> > Предполагаю, что для избавления от гойловной боли при таком случае
> > мантейнер libX11 и вписал нужные зависимости руками.
>
> Maintaner libX11 в таком случае поступил правильно, но очень грубо.
> Автоматика может давать более тонкий и правильный результат; правда,
> время от времени нужно проверять, что именно она дает.

это было сделано еще до атоматики, номер бага не помню а искать лень. с тех 
пор так и живет

-- 
Valery V. Inozemtsev

[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 197 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2008-10-07 17:04 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-10-07 13:21 [devel] лишние зависимости *-devel пакетов (libX11) Alexey Tourbin
2008-10-07 16:39   ` Alexey Tourbin
2008-10-07 17:04     ` Valery V. Inozemtsev

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