Ticket #581: rpm-port.patch

File rpm-port.patch, 7.4 KB (added by ranger@…, 21 years ago)

v2 patch + dependency support

  • Makefile

    RCS file: /Volumes/src/cvs/od/proj/darwinports/base/src/port1.0/Makefile,v
    retrieving revision 1.27
    diff -u -b -u -r1.27 Makefile
     
    11INSTALLDIR=     ${DESTDIR}${datadir}/darwinports/Tcl/port1.0
    22
    3 SRCS=           port.tcl portchecksum.tcl portconfigure.tcl portextract.tcl portfetch.tcl portmain.tcl portbuild.tcl portpatch.tcl portutil.tcl portinstall.tcl portdepends.tcl portinstall.tcl portuninstall.tcl portdepends.tcl portclean.tcl portpackage.tcl portcontents.tcl portmpkg.tcl
     3SRCS= port.tcl portchecksum.tcl portconfigure.tcl portextract.tcl           \
     4        portfetch.tcl portmain.tcl portbuild.tcl portpatch.tcl portutil.tcl \
     5        portinstall.tcl portdepends.tcl portinstall.tcl portuninstall.tcl   \
     6        portdepends.tcl portclean.tcl portpackage.tcl portcontents.tcl      \
     7        portmpkg.tcl portrpmpackage.tcl
    48
    59SUBDIR=         resources
    610
  • port.tcl

    RCS file: /Volumes/src/cvs/od/proj/darwinports/base/src/port1.0/port.tcl,v
    retrieving revision 1.20
    diff -u -b -u -r1.20 port.tcl
     
    4343package require portuninstall 1.0
    4444package require portclean 1.0
    4545package require portpackage 1.0
     46package require portrpmpackage 1.0
    4647package require portcontents 1.0
    4748package require portmpkg 1.0
  • new file portrpmpackage.tcl

    RCS file: portrpmpackage.tcl
    diff -N portrpmpackage.tcl
    - +  
     1# et:ts=4
     2# portrpmpackage.tcl
     3#
     4# Copyright (c) 2002 - 2003 Apple Computer, Inc.
     5# All rights reserved.
     6#
     7# Redistribution and use in source and binary forms, with or without
     8# modification, are permitted provided that the following conditions
     9# are met:
     10# 1. Redistributions of source code must retain the above copyright
     11#    notice, this list of conditions and the following disclaimer.
     12# 2. Redistributions in binary form must reproduce the above copyright
     13#    notice, this list of conditions and the following disclaimer in the
     14#    documentation and/or other materials provided with the distribution.
     15# 3. Neither the name of Apple Computer, Inc. nor the names of its contributors
     16#    may be used to endorse or promote products derived from this software
     17#    without specific prior written permission.
     18#
     19# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     20# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     21# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     22# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
     23# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29# POSSIBILITY OF SUCH DAMAGE.
     30#
     31
     32package provide portrpmpackage 1.0
     33package require portutil 1.0
     34
     35set com.apple.rpmpackage [target_new com.apple.rpmpackage rpmpackage_main]
     36target_runtype ${com.apple.rpmpackage} always
     37target_provides ${com.apple.rpmpackage} rpmpackage
     38target_requires ${com.apple.rpmpackage} install
     39
     40# define options
     41options rpmpackage.type rpmpackage.destpath
     42
     43# Set defaults
     44default rpmpackage.destpath {${workpath}/destroot}
     45
     46set UI_PREFIX "---> "
     47
     48proc rpmpackage_main {args} {
     49    global portname portversion portrevision rpmpackage.type rpmpackage.destpath UI_PREFIX
     50
     51    ui_msg "$UI_PREFIX [format [msgcat::mc "Creating RPM package for %s-%s"] ${portname} ${portversion}]"
     52
     53    return [rpmpackage_pkg $portname $portversion $portrevision]
     54}
     55
     56proc rpmpackage_pkg {portname portversion portrevision} {
     57    global portdbpath destpath workpath prefix portresourcepath description rpmpackage.destpath long_description homepage
     58
     59    set specpath ${workpath}/${portname}.spec
     60    # long_description, description, or homepage may not exist
     61    foreach variable {long_description description homepage} {
     62        if {![info exists $variable]} {
     63            set pkg_$variable ""
     64        } else {
     65            set pkg_$variable [set $variable]
     66        }
     67    }
     68
     69    set dependencies {}
     70    # get deplist
     71    set deps [make_dependency_list $portname]
     72    set deps [lsort -unique $deps]
     73    foreach dep $deps {
     74        set name [lindex [split $dep /] 0]
     75        set vers [lindex [split $dep /] 1]
     76        # don't re-package ourself
     77        if {$name != $portname} {
     78            lappend dependencies "${name} >= ${vers}"
     79        }
     80    }
     81
     82    system "cd '${destpath}' && find . ! -type d | sed -e 's/^.//' > '${workpath}/${portname}.filelist'"
     83    puts "destpath = ${destpath}"
     84    write_spec ${specpath} $portname $portversion $portrevision $pkg_description $pkg_long_description $destpath $dependencies
     85    system "mkdir -p '${workpath}/rpmbuild/RPMS/i386'"
     86    system "mkdir -p '${workpath}/rpmbuild/RPMS/ppc'"
     87    system "mkdir -p '${workpath}/rpmbuild/RPMS/ppc64'"
     88    system "mkdir -p '${workpath}/rpmbuild/RPMS/noarch'"
     89    system "mkdir -p '${workpath}/rpmbuild/BUILD'"
     90    system "mkdir -p '${workpath}/rpmbuild/SRPMS'"
     91    system "rpm -bb -v --define '_tmppath ${workpath}' --define '_topdir ${workpath}/rpmbuild' ${specpath}"
     92
     93    return 0
     94}
     95
     96proc make_dependency_list {portname} {
     97    set result {}
     98    if {[catch {set res [dportsearch "^$portname\$"]} error]} {
     99        ui_error "port search failed: $error"
     100        return 1
     101    }
     102    foreach {name array} $res {
     103        array set portinfo $array
     104
     105        if {[info exists portinfo(depends_run)] || [info exists portinfo(depends_lib)]} {
     106            # get the union of depends_run and depends_lib
     107            # xxx: only examines the portfile component of the depspec
     108            set depends {}
     109            if {[info exists portinfo(depends_run)]} { eval "lappend depends $portinfo(depends_run)" }
     110            if {[info exists portinfo(depends_lib)]} { eval "lappend depends $portinfo(depends_lib)" }
     111
     112            foreach depspec $depends {
     113                set dep [lindex [split $depspec :] 2]
     114       
     115                # xxx: nasty hack
     116                if {$dep != "XFree86"} {
     117                    eval "lappend result [make_dependency_list $dep]"
     118                }
     119            }
     120        }
     121        lappend result $portinfo(name)/$portinfo(version)
     122        unset portinfo
     123    }
     124    ui_debug "dependencies for ${portname}: $result"
     125    return $result
     126}
     127
     128proc write_spec {specfile portname portversion portrevision description long_description destroot dependencies} {
     129    set specfd [open ${specfile} w+]
     130    set deplist [join ${dependencies} ", "]
     131    puts $specfd "\#Spec file generated by DarwinPorts
     132Summary: ${description}
     133Name: ${portname}
     134Version: ${portversion}
     135Release: ${portrevision}
     136Group: darwinports
     137License: Unknown
     138BuildRoot: ${destroot}
     139Requires: ${deplist}
     140
     141%description
     142${long_description}
     143%prep
     144%build
     145echo \"Go DarwinPorts\"
     146%install
     147%clean
     148%files -f ${destroot}/../${portname}.filelist
     149"
     150    close $specfd
     151}