Ticket #581: portrpmpackage.tcl

File portrpmpackage.tcl, 6.0 KB (added by ranger@…, 21 years ago)

minor bugfixes

Line 
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 categories maintainers 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 categories maintainers} {
62        if {![info exists $variable]} {
63            set pkg_$variable ""
64        } else {
65            set pkg_$variable [set $variable]
66        }
67    }
68    set category   [lindex [split $categories " "] 0]
69    set maintainer [join [split $maintainers " "] ", "]
70
71    set dependencies {}
72    # get deplist
73    set deps [make_dependency_list $portname]
74    set deps [lsort -unique $deps]
75    foreach dep $deps {
76        set name [lindex [split $dep /] 0]
77        set vers [lindex [split $dep /] 1]
78        # don't re-package ourself
79        if {$name != $portname} {
80            lappend dependencies "${name} >= ${vers}"
81        }
82    }
83
84    system "rm -f '${workpath}/${portname}.filelist' && touch '${workpath}/${portname}.filelist'"
85    #system "cd '${destpath}' && find . -type d | grep -v -E '^.$' | sed -e 's/\"/\\\"/g' -e 's/^./%dir \"/' -e 's/$/\"/' > '${workpath}/${portname}.filelist'"
86    system "cd '${destpath}' && find . ! -type d | grep -v /etc/ | sed -e 's/\"/\\\"/g' -e 's/^./\"/' -e 's/$/\"/' >> '${workpath}/${portname}.filelist'"
87    system "cd '${destpath}' && find . ! -type d | grep /etc/ | sed -e 's/\"/\\\"/g' -e 's/^./%config \"/' -e 's/$/\"/' >> '${workpath}/${portname}.filelist'"
88    puts "destpath = ${destpath}"
89    write_spec ${specpath} $portname $portversion $portrevision $pkg_description $pkg_long_description $category $maintainer $destpath $dependencies
90    system "rpm -bb -v ${specpath}"
91
92    return 0
93}
94
95proc make_dependency_list {portname} {
96    set result {}
97    if {[catch {set res [dportsearch "^$portname\$"]} error]} {
98        ui_error "port search failed: $error"
99        return 1
100    }
101    foreach {name array} $res {
102        array set portinfo $array
103
104        if {[info exists portinfo(depends_run)] || [info exists portinfo(depends_lib)]} {
105            # get the union of depends_run and depends_lib
106            # xxx: only examines the portfile component of the depspec
107            set depends {}
108            if {[info exists portinfo(depends_run)]} { eval "lappend depends $portinfo(depends_run)" }
109            if {[info exists portinfo(depends_lib)]} { eval "lappend depends $portinfo(depends_lib)" }
110
111            foreach depspec $depends {
112                set dep [lindex [split $depspec :] 2]
113       
114                # xxx: nasty hack
115                if {$dep != "XFree86"} {
116                    eval "lappend result [make_dependency_list $dep]"
117                }
118            }
119        }
120        lappend result $portinfo(name)/$portinfo(version)
121        unset portinfo
122    }
123    ui_debug "dependencies for ${portname}: $result"
124    return $result
125}
126
127proc write_spec {specfile portname portversion portrevision description long_description category maintainer destroot dependencies} {
128    set specfd [open ${specfile} w+]
129    if {[llength ${dependencies}] != 0} {
130       set requires [join ${dependencies} ", "]
131       set requires "Requires: ${requires}"
132    } else {
133       set requires ""
134    }
135    puts $specfd "\#Spec file generated by DarwinPorts
136%define distribution DarwinPorts
137%define vendor OpenDarwin
138%define packager ${maintainer}
139
140Summary: ${description}
141Name: ${portname}
142Version: ${portversion}
143Release: ${portrevision}
144Group: ${category}
145License: Unknown
146BuildRoot: ${destroot}
147Epoch: 1
148${requires}
149
150%description
151${long_description}
152%prep
153%build
154echo \"Go DarwinPorts\"
155%install
156%clean
157%files -f ${destroot}/../${portname}.filelist
158"
159    close $specfd
160}