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

Reply via email to