RPM Package Manager, CVS Repository http://rpm5.org/cvs/ ____________________________________________________________________________
Server: rpm5.org Name: Per Øyvind Karlsen Root: /v/rpm/cvs Email: pkarl...@rpm5.org Module: rpm Date: 10-Apr-2011 15:50:29 Branch: HEAD Handle: 2011041013502801 Added files: rpm/scripts check-multiarch-files mkmultiarch multiarch-dispatch multiarch-dispatch.h multiarch-platform Modified files: rpm CHANGES rpm/macros macros.rpmbuild.in rpm/scripts Makefile.am Log: merge multiarch-utils from mandriva. Summary: Revision Changes Path 1.3610 +1 -0 rpm/CHANGES 1.6 +20 -2 rpm/macros/macros.rpmbuild.in 1.80 +7 -1 rpm/scripts/Makefile.am 1.1 +92 -0 rpm/scripts/check-multiarch-files 1.1 +91 -0 rpm/scripts/mkmultiarch 1.1 +31 -0 rpm/scripts/multiarch-dispatch 1.1 +172 -0 rpm/scripts/multiarch-dispatch.h 1.1 +14 -0 rpm/scripts/multiarch-platform ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/CHANGES ============================================================================ $ cvs diff -u -r1.3609 -r1.3610 CHANGES --- rpm/CHANGES 10 Apr 2011 11:19:24 -0000 1.3609 +++ rpm/CHANGES 10 Apr 2011 13:50:29 -0000 1.3610 @@ -1,4 +1,5 @@ 5.4.0 -> 5.4.1: + - proyvind: merge multiarch-utils from mandriva. - proyvind: macros: sync with updated python macros from mandriva. - proyvind: rpmfc: add internel dep generator helper for kernel modules. - provyind: kmod-deps.sh: add dependency extractor from mandriva. @@ . patch -p0 <<'@@ .' Index: rpm/macros/macros.rpmbuild.in ============================================================================ $ cvs diff -u -r1.5 -r1.6 macros.rpmbuild.in --- rpm/macros/macros.rpmbuild.in 25 Mar 2011 13:17:28 -0000 1.5 +++ rpm/macros/macros.rpmbuild.in 10 Apr 2011 13:50:28 -0000 1.6 @@ -1,7 +1,7 @@ #/*! \page build_macros Default configuration: @USRLIBRPM@/macros.rpmbuild # \verbatim # -# $Id: macros.rpmbuild.in,v 1.5 2011/03/25 13:17:28 devzero2000 Exp $ +# $Id: macros.rpmbuild.in,v 1.6 2011/04/10 13:50:28 pkarlsen Exp $ # # This file contains rpmbuild configuration macros. # @@ -214,9 +214,27 @@ %_filter_GLIBC_PRIVATE 0 # +# multiarch is used to deal with situations where headers that contain +# ie. architecture specific parts to solve file conflicts between +# packages of different archs in multilib environments. +# +# Note: more details at http://wiki.mandriva.com/en/Policies/Multiarch +%multiarch_platform multiarch-%{_arch}-%{_target_os} +%multiarch_bindir %{_bindir}/%{multiarch_platform} +%multiarch_includedir %{_includedir}/%{multiarch_platform} +%multiarch_binaries() %{_rpmhome}/rpm/mkmultiarch binaries %{1} +%multiarch_includes() %{_rpmhome}/rpm/mkmultiarch includes %{1} + +# Check for need of multiarch, terminate build if needed and not used. +# +# Note: The default value should be 0 for legacy compatibility. +# TODO: fix check script and implement support for using +#%_multiarch_required_terminate_build 1 + +# # Path to scripts to autogenerate package dependencies, # -# Note: Used iff _use_internal_dependency_generator is zero. +# Note: Used if _use_internal_dependency_generator is zero. #%__find_provides %{_rpmhome}/rpmdeps --provides #%__find_requires %{_rpmhome}/rpmdeps --requires %__find_provides %{_rpmhome}/find-provides @@ . patch -p0 <<'@@ .' Index: rpm/scripts/Makefile.am ============================================================================ $ cvs diff -u -r1.79 -r1.80 Makefile.am --- rpm/scripts/Makefile.am 10 Apr 2011 10:59:20 -0000 1.79 +++ rpm/scripts/Makefile.am 10 Apr 2011 13:50:28 -0000 1.80 @@ -23,6 +23,8 @@ check-java-closure.sh java.prov.sh java.req.sh \ gstreamer.sh javadeps.sh libtooldeps.sh \ mono-find-provides mono-find-requires \ + check-multiarch-files multiarch-platform multiarch-dispatch + multiarch-dispatch.h mkmultiarch \ nix_meta \ osgideps.pl pkgconfigdeps.sh \ perldeps.pl perl.prov perl.req pythondeps.sh pythoneggs.py \ @@ -43,7 +45,7 @@ all: -bin_SCRIPTS = gendiff +bin_SCRIPTS = gendiff multiarch-dispatch multiarch-platform pkglibdir = @USRLIBRPM@ pkglib_SCRIPTS = \ @@ -56,6 +58,7 @@ find-requires.perl getpo.sh http.req \ javadeps.sh libtooldeps.sh \ mono-find-provides mono-find-requires \ + check-multiarch-files mkmultiarch \ osgideps.pl pkgconfigdeps.sh \ perldeps.pl perl.prov perl.req pythondeps.sh pythoneggs.py \ php.prov php.req \ @@ -86,6 +89,9 @@ pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = rpm.pc +pkgincdir = $(includedir) +pkginc_HEADERS = multiarch-dispatch.h + install-exec-hook: if WITH_PATH_VERSIONED -for p in $(bin_SCRIPTS); do \ @@ . patch -p0 <<'@@ .' Index: rpm/scripts/check-multiarch-files ============================================================================ $ cvs diff -u -r0 -r1.1 check-multiarch-files --- /dev/null 2011-04-10 15:45:30.000000000 +0200 +++ check-multiarch-files 2011-04-10 15:50:28.736402897 +0200 @@ -0,0 +1,92 @@ +#!/usr/bin/perl +#--------------------------------------------------------------- +# Original author: Gwenole Beauchesne <gbeauche...@mandriva.com> +# Created On: Mon Jan 24 18:02:21 CET 2005 +#--------------------------------------------------------------- + +use strict; +use MDK::Common; + +my $RPM_BUILD_ROOT = (shift); + +if (! -d $RPM_BUILD_ROOT ) { + while (<STDIN>) { } # consume all inputs + exit 1 +} + +while (<STDIN>) { + chomp; + + # File must be located in the usual development directories + -f $_ or next; + m,^\Q$RPM_BUILD_ROOT\E/usr(/X11R6)?/(bin|include)/, or next; + m,/multiarch-.+-\w+/, and next; + m,/include/asm, and next; + + my $multiarch = 0; + my $multiarch_type; + + # Heuristics for binary files + if (/bin/) { + my $file_magic = `file $_`; + $multiarch_type = "binary"; + + # check for *-config script files + if (/.+[-_]config/ && $file_magic =~ /shell script/) { + my $options; + foreach (cat_($_)) { + foreach my $opt (qw(cflags libs ldflags cppflags libdir libtool)) { + $options .= " --$opt" if /(\[--$opt\]|--$opt\s+([\#\[]|display|print))/; + } + } + # run the script to find out any libdir dependent flags + if ($options) { + my $output = `$_ $options`; + $multiarch = 1 if ($output =~ /(?<!\/include)\/lib(32|64)?/); + } + } + } + + # Heuristics for include files + elsif (/include/) { + $multiarch_type = "header"; + my %archdefs; + foreach (cat_($_)) { + if (/\#\s*define\s+(\w+)\s+(.+)/) { + my ($def, $val) = ($1, $2); + + # check for typical arch-dependent macro definitions + my @keywords_with_int = qw(SIZEOF_VOID_P SIZEOF_CHAR_P SIZEOF_LONG BYTES_PER_LONG BITS_PER_LONG BITS_PER_WORD); + foreach my $pat (@keywords_with_int) { + if ($def =~ /$pat/ && int($val)) { + $archdefs{$def}++; + last; + } + } + + # check for libdir references, typically plugins dir + # XXX check for /DIR/ in $def ? + if ($val =~ /"\/usr(\/X11R6)?\/lib(32|64)?\/(?!(X11|font)\/).*"/) { + $multiarch = 1; + } + } + } + + # ignore multiple definitions of the same macro, assume + # arch-dependence is handled in that case + if (! $multiarch) { + foreach my $e (keys %archdefs) { + my $val = $archdefs{$e}; + $multiarch = 1 if ($val == 1); + } + } + } + + # Multiarch files detected? + print "$_\n" if $multiarch; +} + +# Local variables: +# tab-width: 4 +# indent-tabs-mode: nil +# End: @@ . patch -p0 <<'@@ .' Index: rpm/scripts/mkmultiarch ============================================================================ $ cvs diff -u -r0 -r1.1 mkmultiarch --- /dev/null 2011-04-10 15:45:30.000000000 +0200 +++ mkmultiarch 2011-04-10 15:50:28.716400737 +0200 @@ -0,0 +1,91 @@ +#!/bin/bash +#--------------------------------------------------------------- +# Original author: Gwenole Beauchesne <gbeauche...@mandriva.com> +# Created On: Wed Jan 12 10:54:10 CET 2005 +#--------------------------------------------------------------- + +usage="Usage: $0 <binaries|includes> <file1> [<file2> ...]" +mplat=`multiarch-platform` +type=$1 +case $type in + binaries|includes) shift;; + *) echo $usage; exit 1;; +esac + +function error() { + echo ${1+"$@"} 1>&2 + exit 1 +} + +# read link on one level only +function read_link_1() { + perl -e 'print readlink(shift)' $1 +} + +function dispatch_binaries() { + local file=$1 + local bindir=`dirname $file` + local archbindir=$bindir/$mplat + [[ -d $archbindir ]] || mkdir -p $archbindir + if [[ -L $file ]]; then + link=`read_link_1 $file` + case $link in + /*) + mv $file $archbindir/ + ;; + ../*) + ln -s ../$link $archbindir/${file##*/} + rm -f $file + ;; + esac + elif [[ -f $file ]]; then + mv $file $archbindir/ + else + error "Unsupported file type for $file" + fi + ln -s `which multiarch-dispatch` $file +} + +function dispatch_includes() { + local file=$1 + local incdir=`dirname $file` + + # handle circular inclusions + local tag=$incdir/.multiarch-processing.${file##*/} + [[ -f "$tag" ]] && return + touch $tag + + # sanity checks, extract path parts + echo $file | grep -q '/include/' || error "Unsupported includedir $incdir" + local prefix=`echo $incdir | sed -n '/\(.*\/include\)\/.*/s//\1/p'` + [[ -z "$prefix" ]] && prefix="$incdir" + local suffix=`echo $incdir | sed -n '/.*\/include\/\(.*\)/s//\1/p'` + [[ -n "$suffix" ]] && suffix="$suffix/" + + # dispatch nested includes expected in local directory + sed -n '/^#[ \t]*include[ \t]*"\([^"][^"]*\)".*/s//\1/p' $file | \ + while read localfile; do + [[ -f "$incdir/$localfile" ]] && dispatch_includes $incdir/$localfile + done + + # dispatch selected include file, provided it's not already dispatched + grep -q _MULTIARCH_HEADER $file || { + local archincdir=$prefix/$mplat/$suffix + [[ -d $archincdir ]] || mkdir -p $archincdir + mv $file $archincdir/ + cat > $file << EOF +#define _MULTIARCH_HEADER $suffix${file##*/} +#include <multiarch-dispatch.h> +EOF + } + + # done with this file + rm -f $tag +} + +while [[ $# -gt 0 ]]; do + file=$1 + shift 1 + [[ -f $file ]] || error "$file does not exist!" + dispatch_$type $file +done @@ . patch -p0 <<'@@ .' Index: rpm/scripts/multiarch-dispatch ============================================================================ $ cvs diff -u -r0 -r1.1 multiarch-dispatch --- /dev/null 2011-04-10 15:45:30.000000000 +0200 +++ multiarch-dispatch 2011-04-10 15:50:28.686398895 +0200 @@ -0,0 +1,31 @@ +#!/bin/sh +#--------------------------------------------------------------- +# Original author: Gwenole Beauchesne <gbeauche...@mandriva.com> +# Created On: Wed Jan 12 12:38:53 EST 2005 +#--------------------------------------------------------------- + +if [[ "$0" = "/usr/bin/multiarch-dispatch" ]]; then + echo "Helper script to dispatch a binary under a specific personality" + exit 0 +fi + +# go through symlinks until multiarch-dispatch leaf is reached +mprog="$0" +mcomp="$mprog" +while [[ -L "$mcomp" ]]; do + mprog="$mcomp" + mcomp=`readlink "$mprog"` + case "$mcomp" in + /*) ;; + *) mcomp=`dirname "$mprog"`/"$mcomp";; + esac +done + +bin=`dirname "$mprog"`/`multiarch-platform`/"${mprog##*/}" + +if [[ ! -x "$bin" ]]; then + echo "Cannot execute $bin" 1>&2 + exit 1 +fi + +exec $bin ${1+"$@"} @@ . patch -p0 <<'@@ .' Index: rpm/scripts/multiarch-dispatch.h ============================================================================ $ cvs diff -u -r0 -r1.1 multiarch-dispatch.h --- /dev/null 2011-04-10 15:45:30.000000000 +0200 +++ multiarch-dispatch.h 2011-04-10 15:50:28.636396570 +0200 @@ -0,0 +1,172 @@ +/* Undefine some built-ins */ +#ifdef linux +#undef linux +#define _multiarch_defined_linux +#endif +#ifdef i386 +#undef i386 +#define _multiarch_defined_i386 +#endif +#ifdef sparc +#undef sparc +#define _multiarch_defined_sparc +#endif +#ifdef mips +#undef mips +#define _multiarch_defined_mips +#endif +#ifdef arm +#undef arm +#define _multiarch_defined_arm +#endif + +/* Undefine some interfering definitions (not built-ins) */ +/* We can only redefine value 1, so we let it fail with other values */ +#if x86_64 == 1 +#define _multiarch_defined_x86_64 +#undef x86_64 +#endif +#if ppc64 == 1 +#define _multiarch_defined_ppc64 +#undef ppc64 +#endif +#if ppc == 1 +#define _multiarch_defined_ppc +#undef ppc +#endif +#if sparc64 == 1 +#define _multiarch_defined_sparc64 +#undef sparc64 +#endif +#if s390x == 1 +#define _multiarch_defined_s390x +#undef s390x +#endif +#if s390 == 1 +#define _multiarch_defined_s390 +#undef s390 +#endif +#if ia64 == 1 +#define _multiarch_defined_ia64 +#undef ia64 +#endif +#if alpha == 1 +#define _multiarch_defined_alpha +#undef alpha +#endif +#if mipsel == 1 +#define _multiarch_defined_mipsel +#undef mipsel +#endif +#if armeb == 1 +#define _multiarch_defined_armeb +#undef armeb +#endif + +/* Dispatch arch dependent header */ +#if defined(__linux__) +#define _MULTIARCH_OS linux +#endif +#define _MULTIARCH_MAKE_HEADER(arch,header) <multiarch-arch-_MULTIARCH_OS/header> +#if defined(__x86_64__) +#include _MULTIARCH_MAKE_HEADER(x86_64,_MULTIARCH_HEADER) +#elif defined(__i386__) +#include _MULTIARCH_MAKE_HEADER(i386,_MULTIARCH_HEADER) +#elif defined(__powerpc64__) +#include _MULTIARCH_MAKE_HEADER(ppc64,_MULTIARCH_HEADER) +#elif defined(__powerpc__) +#include _MULTIARCH_MAKE_HEADER(ppc,_MULTIARCH_HEADER) +#elif defined(__sparc__) && defined(__arch64__) +#include _MULTIARCH_MAKE_HEADER(sparc64,_MULTIARCH_HEADER) +#elif defined(__sparc__) +#include _MULTIARCH_MAKE_HEADER(sparc,_MULTIARCH_HEADER) +#elif defined(__s390x__) +#include _MULTIARCH_MAKE_HEADER(s390x,_MULTIARCH_HEADER) +#elif defined(__s390__) +#include _MULTIARCH_MAKE_HEADER(s390,_MULTIARCH_HEADER) +#elif defined(__ia64__) +#include _MULTIARCH_MAKE_HEADER(ia64,_MULTIARCH_HEADER) +#elif defined(__alpha__) +#include _MULTIARCH_MAKE_HEADER(alpha,_MULTIARCH_HEADER) +#elif defined(__mips__) +#if defined(__BIG_ENDIAN__) +#include _MULTIARCH_MAKE_HEADER(mips,_MULTIARCH_HEADER) +#else +#include _MULTIARCH_MAKE_HEADER(mipsel,_MULTIARCH_HEADER) +#endif +#elif defined(__arm__) +#if defined(__BIG_ENDIAN__) +#include _MULTIARCH_MAKE_HEADER(armeb,_MULTIARCH_HEADER) +#else +#include _MULTIARCH_MAKE_HEADER(arm,_MULTIARCH_HEADER) +#endif +#else +#error "Unknown architecture, please submit bug report" +#endif +#undef _MULTIARCH_MAKE_HEADER +#undef _MULTIARCH_OS +#undef _MULTIARCH_HEADER + +/* Redefine built-ins */ +#ifdef _multiarch_defined_linux +#undef _multiarch_defined_linux +#define linux 1 +#endif +#ifdef _multiarch_defined_i386 +#undef _multiarch_defined_i386 +#define i386 1 +#endif +#ifdef _multiarch_defined_sparc +#undef _multiarch_defined_sparc +#define sparc 1 +#endif +#ifdef _multiarch_defined_mips +#undef _multiarch_defined_mips +#define mips 1 +#endif +#ifdef _multiarch_defined_arm +#undef _multiarch_defined_arm +#define arm 1 +#endif + +/* Redefine interfering defitions */ +#ifdef _multiarch_defined_x86_64 +#undef _multiarch_defined_x86_64 +#define x86_64 1 +#endif +#ifdef _multiarch_defined_ppc64 +#undef _multiarch_defined_ppc64 +#define ppc64 1 +#endif +#ifdef _multiarch_defined_ppc +#undef _multiarch_defined_ppc +#define ppc 1 +#endif +#ifdef _multiarch_defined_sparc64 +#undef _multiarch_defined_sparc64 +#define sparc64 1 +#endif +#ifdef _multiarch_defined_s390x +#undef _multiarch_defined_s390x +#define s390x 1 +#endif +#ifdef _multiarch_defined_s390 +#undef _multiarch_defined_s390 +#define s390 1 +#endif +#ifdef _multiarch_defined_ia64 +#undef _multiarch_defined_ia64 +#define ia64 1 +#endif +#ifdef _multiarch_defined_alpha +#undef _multiarch_defined_alpha +#define alpha 1 +#endif +#ifdef _multiarch_defined_mipsel +#undef _multiarch_defined_mipsel +#define mipsel 1 +#endif +#ifdef _multiarch_defined_armeb +#undef _multiarch_defined_armeb +#define armeb 1 +#endif @@ . patch -p0 <<'@@ .' Index: rpm/scripts/multiarch-platform ============================================================================ $ cvs diff -u -r0 -r1.1 multiarch-platform --- /dev/null 2011-04-10 15:45:30.000000000 +0200 +++ multiarch-platform 2011-04-10 15:50:28.656399847 +0200 @@ -0,0 +1,14 @@ +#!/bin/sh +arch=`uname -m` +`perl -e '$le = unpack("h*", pack("s", 1)) =~ /^1/; exit $le;'` +le=$? +case $arch in +i?86) arch=i386;; +mips*) [ $le -eq 1 ] && arch="$arch"el ;; +arm*) [ $le -eq 0 ] && arch="armeb" || arch="arm" ;; +esac +os=`uname -s` +case $os in +Linux*) os=linux;; +esac +echo multiarch-$arch-$os @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository rpm-cvs@rpm5.org