Subject: pkg/26633: package ABI is often broken on NetBSD due to libtool porting problem
To: None <gnats-bugs@gnats.netbsd.org>
From: Noriyuki Soda <soda@sra.co.jp>
List: pkgsrc-bugs
Date: 08/13/2004 08:50:17
>Number:         26633
>Category:       pkg
>Synopsis:       package ABI is often broken on NetBSD due to libtool porting problem
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    pkg-manager
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Thu Aug 12 23:51:00 UTC 2004
>Closed-Date:
>Last-Modified:
>Originator:     Noriyuki Soda
>Release:        NetBSD 1.6.2
>Organization:
Software Research Associates, Inc.
>Environment:
System: NetBSD boaz 1.6.2 NetBSD 1.6.2 (GENERIC_LAPTOP) #0: Tue Feb 10 22:02:37 UTC 2004 autobuild@tgm.netbsd.org:/autobuild/netbsd-1-6-PATCH002/i386/OBJ/autobuild/netbsd-1-6-PATCH002/src/sys/arch/i386/compile/GENERIC_LAPTOP i386
Architecture: i386
Machine: i386
>Description:
	NetBSD port of libtool doesn't properly implement libtool versioning
	concept.

	Every time a function is added to a third party library,
	major version of the library is needlessly incremented on NetBSD,
	thus, the library ABI is unnecessarily broken on NetBSD.

	In contrast, this problem doesn't happen on Linux, IRIX, OSF
	and Windows, because libtool is properly ported to those 
	platforms, thus adding a new function doesn't change major version
	unless there is real ABI change.

	See "6.2 Libtool's versioning system"
		http://www.gnu.org/software/libtool/manual.html#SEC34
	or "Versioning" section of libtool info page for the detail
	of the libtool versioning concept.
	As you see, library major version must be calculated as
	$CURRENT - $AGE with this concept, but actually major version 
	is just equal to $CURRENT on NetBSD.

>How-To-Repeat:

>Fix:
	Change the following (current) way to calculate shared object
	name in libtool from:
		major=".$current"
		versuffix=".$current.$revision"
	to either this way:
		major=".`expr $curent - $age`"
		versuffix="`expr $age '*' 1000 + $revision`"
	or the following way:
		major=.`expr $current - $age`
		versuffix="$major.$age.$revision"

	Unfortunately, simply doing so breaks nearly all existing 
	binary packages, so, changing LOCALBASE from /usr/pkg to
	something else is needed too. ;-/
	Or, is there any other way to solve this problem?
>Release-Note:
>Audit-Trail:
>Unformatted: