source: trunk/dports/_resources/port1.0/group/ruby-1.0.tcl @ 103922

Last change on this file since 103922 was 103922, checked in by kimuraw@…, 6 years ago

_resources/port1.0/group/ruby-1.0.tcl: fix missing global for ruby.prog_suffix

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 18.3 KB
Line 
1# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:ft=tcl:et:sw=4:ts=4:sts=4
2# $Id: ruby-1.0.tcl 103922 2013-03-10 03:03:45Z kimuraw@macports.org $
3#
4# Copyright (c) 2004 Robert Shaw <rshaw@opendarwin.org>
5# Copyright (c) 2002 Apple Computer, Inc.
6# All rights reserved.
7#
8# Redistribution and use in source and binary forms, with or without
9# modification, are permitted provided that the following conditions are
10# met:
11#
12# 1. Redistributions of source code must retain the above copyright
13#    notice, this list of conditions and the following disclaimer.
14# 2. Redistributions in binary form must reproduce the above copyright
15#    notice, this list of conditions and the following disclaimer in the
16#    documentation and/or other materials provided with the distribution.
17# 3. Neither the name of Apple Computer, Inc. nor the names of its
18#    contributors may be used to endorse or promote products derived from
19#    this software without specific prior written permission.
20#
21# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
33# Usage:
34#
35#   1. use ruby.setup
36#
37#     PortGroup        ruby 1.0
38#     ruby.setup       module version type {} ruby19
39#
40#   2. use ruby.branch
41#
42#     PortGroup        ruby 1.0
43#     ruby.branch      1.9
44#     depends_lib      port:ruby${ruby.suffix}
45#     build.cmd        ${ruby.bin}
46
47# options:
48#   ruby.branch: select ruby version. 1.8 or 1.9.
49#   ruby.link_binaries: whether generate suffixed symlink under ${prefix}/bin
50#        or not.
51# values:
52#   ruby.bin, ruby.rdoc, ruby.gem: fullpath to commands for ${ruby.branch}.
53#   ruby.suffix: suffix of portname. port:ruby${ruby.suffix} or
54#        port:rb${ruby.suffix}-foo.
55#   ruby.bindir: install location of commands without suffix from rb-foo.
56#   ruby.gemdir: install location of rubygems.
57#        such as "${prefix}/lib/ruby1.9/gems/1.9.1".
58#   ruby.link_binaries_suffix: suffix of commands from rb-foo under
59#        ${prefix}/bin. such as "-1.8" or "-1.9".
60#   (obsoleted values)
61#   ruby.prog_suffix: use ruby.branch.
62#   ruby.version: use ruby.api_version.
63# values from ruby.setup:
64#   ruby.module: port name without prefix. rb-${ruby.module}.
65#   ruby.project: project name at rubygems, rubyforge or sourceforge.
66
67options ruby.default_branch
68default ruby.default_branch 1.8
69options ruby.branch
70options ruby.bin ruby.rdoc ruby.gem ruby.bindir ruby.gemdir ruby.suffix
71option_proc ruby.branch ruby_set_branch
72proc ruby_set_branch {option action args} {
73    if {$action != "set"} {
74        return
75    }
76    global prefix ruby.branch \
77           ruby.bin ruby.rdoc ruby.gem ruby.bindir ruby.gemdir \
78           ruby.suffix ruby.link_binaries_suffix ruby.api_version \
79           ruby.prog_suffix
80    set ruby.bin            ${prefix}/bin/ruby${ruby.branch}
81    set ruby.rdoc           ${prefix}/bin/rdoc${ruby.branch}
82    set ruby.gem            ${prefix}/bin/gem${ruby.branch}
83    set ruby.bindir         ${prefix}/libexec/ruby${ruby.branch}
84    set ruby.gemdir         ${prefix}/lib/ruby${ruby.branch}/gems/${ruby.api_version}
85    # gem command for 1.8 from port:rb-rubygems
86    if {${ruby.branch} eq "1.8"} {
87        set ruby.gem        ${ruby.bindir}/gem
88        set ruby.gemdir     ${prefix}/lib/ruby/gems/${ruby.api_version}
89    }
90    set ruby.suffix         [join [split ${ruby.branch} .] {}]
91    if {${ruby.branch} eq "1.8"} {
92        set ruby.suffix     ""
93    }
94    set ruby.link_binaries_suffix -${ruby.branch}
95    set ruby.prog_suffix    ${ruby.branch}
96}
97
98proc ruby.extract_config {var {default ""}} {
99    global ruby.bin
100    if {[catch {set val [exec ${ruby.bin} -e "require 'rbconfig';puts RbConfig::CONFIG\[\"${var}\"\]"]}]} {
101        set val ${default}
102    }
103    return $val
104}
105
106options ruby.api_version ruby.lib ruby.archlib
107default ruby.api_version    {[ruby.extract_config ruby_version]}
108default ruby.arch           {[ruby.extract_config arch "${os.arch}-${os.platform}${os.major}"]}
109# define installation libraries as vendor location
110default ruby.lib            {[ruby.extract_config vendorlibdir ${prefix}/lib/ruby/vendor_ruby/${ruby.api_version}]}
111default ruby.archlib        {[ruby.extract_config vendorarchdir ${ruby.lib}/${ruby.arch}]}
112# ruby.version is obsoleted. use ruby.api_version.
113options ruby.version
114default ruby.version        {[ruby.extract_config ruby_version]}
115
116set ruby.module         ""
117set ruby.filename       ""
118set ruby.project        ""
119set ruby.docs           {}
120set ruby.srcdir         ""
121
122options ruby.link_binaries
123default ruby.link_binaries yes
124
125default ruby.branch         ${ruby.default_branch}
126
127# ruby group setup procedure; optional for ruby 1.8 if you want only
128# basic variables, like ruby.lib and ruby.archlib.
129proc ruby.setup {module vers {type "install.rb"} {docs {}} {source "custom"} {implementation "ruby"}} {
130    global destroot prefix worksrcpath os.platform
131    global ruby.bin ruby.rdoc ruby.gem
132    global ruby.api_version ruby.lib ruby.suffix ruby.bindir ruby.gemdir
133    global ruby.module ruby.filename ruby.project ruby.docs ruby.srcdir
134    global ruby.link_binaries_suffix
135    # ruby.version is obsoleted. use ruby.gemdir.
136    global ruby.prog_suffix
137
138    if {${implementation} eq "ruby19"} {
139        ruby.branch 1.9
140        set ruby.prog_suffix 1.9
141    } elseif {${implementation} eq "ruby"} {
142        ruby.branch 1.8
143        set ruby.prog_suffix ""
144    } else {
145        ui_error "ruby.setup: unknown implementation '${implementation}' specified (ruby, ruby19 possible)"
146        return -code error "ruby.setup failed"
147    }
148
149    # define ruby global names and lists
150    # check if module is a list or string
151    if {[llength ${module}] > 1} {
152        # if a list, first item is the module name
153        set ruby.module     [lindex ${module} 0]
154        # second argument is the project & file name
155        set ruby.project    [lindex ${module} 1]
156        set ruby.filename   [lindex ${module} 1]
157    } else {
158        # else, module, project, and file name are the same
159        set ruby.module     ${module}
160        set ruby.project    ${module}
161        set ruby.filename   ${module}
162    }
163    set ruby.docs   ${docs}
164
165    name            rb${ruby.suffix}-[string tolower ${ruby.module}]
166    version         ${vers}
167    categories      ruby
168
169    switch -glob ${source} {
170        rubyforge:*:* {
171            set num [lindex [split ${source} {:}] 1]
172            set ruby.project [string tolower [lindex [split ${source} {:}] 2]]
173            homepage        http://rubyforge.org/projects/${ruby.project}
174            master_sites    http://rubyforge.org/frs/download.php/${num}/
175            livecheck.type  regex
176            livecheck.url   http://rubyforge.org/projects/${ruby.project}
177            livecheck.regex "<strong>${ruby.project}</strong></td><td>(?:REL )?(.*)$"
178        }
179        rubyforge:* {
180            set num [lindex [split ${source} {:}] 1]
181            homepage        http://rubyforge.org/projects/${ruby.project}
182            master_sites    http://rubyforge.org/frs/download.php/${num}/
183            livecheck.type  regex
184            livecheck.url   http://rubyforge.org/projects/${ruby.project}
185            livecheck.regex "<strong>${ruby.project}</strong></td><td>(?:REL )?(.*)$"
186        }
187        rubyforge_gem:* {
188            set ruby.project [lindex [split ${source} {:}] 1]
189            homepage        http://rubyforge.org/projects/${ruby.project}
190            master_sites    http://gems.rubyforge.vm.bytemark.co.uk/gems/ \
191                            http://rubyforge.iasi.roedu.net/gems/
192            livecheck.type  regex
193            livecheck.url   http://rubyforge.org/projects/${ruby.project}
194            livecheck.regex "<strong>${ruby.module}</strong></td><td>(?:REL )?(.*)$"
195        }
196        rubyforge_gem {
197            homepage        http://rubyforge.org/projects/${ruby.project}
198            master_sites    http://gems.rubyforge.vm.bytemark.co.uk/gems/ \
199                            http://rubyforge.iasi.roedu.net/gems/
200            livecheck.type  regex
201            livecheck.url   http://rubyforge.org/projects/${ruby.project}
202            livecheck.regex "<strong>${ruby.module}</strong></td><td>(?:REL )?(.*)$"
203        }
204        rubygems {
205            homepage        http://www.rubygems.org/gems/${ruby.project}
206            master_sites    http://www.rubygems.org/downloads/
207            livecheck.type  regex
208            livecheck.url   http://www.rubygems.org/gems/${ruby.project}
209            livecheck.regex {<h3>(\d|\d[0-9.]*\d)</h3>}
210        }
211        sourceforge:* {
212            set ruby.project [lindex [split ${source} {:}] 1]
213            homepage        http://sourceforge.net/projects/${ruby.project}
214            master_sites    sourceforge:${ruby.project}
215        }
216        sourceforge {
217            homepage        http://sourceforge.net/projects/${ruby.project}
218            master_sites    sourceforge:${ruby.project}
219        }
220    }
221
222    distname        ${ruby.filename}-${vers}
223    dist_subdir     ruby
224
225    depends_lib     port:${implementation}
226
227    post-extract {
228        # Create the work directory for gem-based ruby ports.
229        system "mkdir -p ${worksrcpath}"
230        system "find ${worksrcpath} -type d -name CVS | xargs rm -rf"
231    }
232
233    switch -glob ${type} {
234        basic_install.rb {
235            post-patch {
236                # create destroot setup file
237                set fp [open ${worksrcpath}/destroot.rb w]
238                puts $fp "
239                    require 'rbconfig'
240                    include Config
241                    DESTROOT=ENV\['DESTROOT'\] || ''
242                    CONFIG.keys.find_all { |d|
243                        d.match(/dir\$/) and !d.match(/(src|build|compile)/)
244                    }.each {|confdir|
245                        CONFIG\[confdir\]=DESTROOT+CONFIG\[confdir\]
246                    }
247                    \$:.reverse.each { |d| \$:.unshift(DESTROOT+d) }
248                "
249                close $fp
250                # adjust basic install.rb script
251                reinplace "s|site_ruby|vendor_ruby|" ${worksrcpath}/install.rb
252            }
253
254            use_configure   no
255
256            build           {}
257
258            pre-destroot {
259                xinstall -d -m 0755 ${destroot}${ruby.lib}
260            }
261            destroot.env    DESTROOT=${destroot}
262            destroot.cmd    ${ruby.bin} -rvendor-specific -rdestroot install.rb
263            destroot.target
264            destroot.destdir
265            post-destroot {
266                foreach file [readdir ${destroot}${prefix}/bin] {
267                    move [file join ${destroot}${prefix}/bin $file] ${destroot}${ruby.bindir}
268                }
269            }
270        }
271        copy_install:* {
272            set ruby.srcdir [lindex [split ${type} {:}] 1]
273
274            use_configure   no
275
276            build           {}
277
278            destroot {
279                set root ${worksrcpath}/${ruby.srcdir}
280                xinstall -d -m 0755 ${destroot}${ruby.lib}
281                fs-traverse file $root {
282                    set file [trimroot $root $file]
283                    if {$file ne ""} {
284                        set filepath [file join $root $file]
285                        if {[file isdirectory $filepath]} {
286                            xinstall -d -m 0755 ${destroot}${ruby.lib}/${file}
287                        } else {
288                            xinstall -m 0644 $filepath ${destroot}${ruby.lib}/${file}
289                        }
290                    }
291                }
292            }
293        }
294        install.rb {
295            configure.cmd       ${ruby.bin} -rvendor-specific install.rb
296            configure.pre_args  config --bin-dir=${destroot}${ruby.bindir}
297
298            build.cmd           ${ruby.bin} -rvendor-specific install.rb
299            build.target        setup
300
301            pre-destroot {
302                if {[file isfile ${worksrcpath}/config.save]} {
303                    reinplace "s|^prefix=${prefix}|prefix=${destroot}${prefix}|g" \
304                        ${worksrcpath}/config.save
305                }
306                if {[file isfile ${worksrcpath}/.config]} {
307                    reinplace "s|^prefix=${prefix}|prefix=${destroot}${prefix}|g" \
308                        ${worksrcpath}/.config
309                }
310            }
311            destroot.cmd        ${ruby.bin} -rvendor-specific install.rb
312            destroot.target     install
313            destroot.destdir
314        }
315        setup.rb {
316            configure.cmd       ${ruby.bin} -rvendor-specific setup.rb
317            configure.pre_args  config
318
319            build.cmd           ${ruby.bin} -rvendor-specific setup.rb
320            build.target        setup
321
322            pre-destroot {
323                if {[file isfile ${worksrcpath}/config.save]} {
324                    reinplace "s|${prefix}|${destroot}${prefix}|g" \
325                        ${worksrcpath}/config.save
326                }
327                if {[file isfile ${worksrcpath}/.config]} {
328                    reinplace "s|${prefix}|${destroot}${prefix}|g" \
329                        ${worksrcpath}/.config
330                }
331            }
332            destroot.cmd        ${ruby.bin} -rvendor-specific setup.rb
333            destroot.target     install
334            destroot.destdir
335            post-destroot {
336                foreach file [readdir ${destroot}${prefix}/bin] {
337                    move [file join ${destroot}${prefix}/bin $file] ${destroot}${ruby.bindir}
338                }
339            }
340        }
341        extconf.rb {
342            configure.cmd       ${ruby.bin} -rvendor-specific extconf.rb
343            configure.pre_args
344            configure.args      --prefix=${prefix}
345
346            build.args          RUBY="${ruby.bin} -rvendor-specific"
347
348            destroot.args       RUBY="${ruby.bin} -rvendor-specific"
349            post-destroot {
350                foreach file [readdir ${destroot}${prefix}/bin] {
351                    move [file join ${destroot}${prefix}/bin $file] ${destroot}${ruby.bindir}
352                }
353            }
354        }
355        gnu {
356            build.args          RUBY="${ruby.bin} -rvendor-specific"
357
358            pre-destroot {
359                if {[file isfile ${worksrcpath}/config.save]} {
360                    reinplace "s|${prefix}|${destroot}${prefix}|g" \
361                        ${worksrcpath}/config.save
362                }
363                if {[file isfile ${worksrcpath}/.config]} {
364                    reinplace "s|${prefix}|${destroot}${prefix}|g" \
365                        ${worksrcpath}/.config
366                }
367            }
368            destroot.args       RUBY="${ruby.bin} -rvendor-specific"
369        }
370        gem {
371            use_configure no
372            extract.suffix .gem
373
374            if {${implementation} eq "ruby"} {
375                depends_lib-append  port:rb-rubygems
376            }
377
378            extract {}
379            build {}
380
381            pre-destroot {
382                xinstall -d -m 0755 ${destroot}${ruby.gemdir}
383            }
384
385            destroot {
386                system "cd ${worksrcpath} && ${ruby.gem} install --no-ri --no-rdoc --local --force --install-dir ${destroot}${ruby.gemdir} ${distpath}/${distname}"
387
388                set binDir ${destroot}${ruby.gemdir}/bin
389                if {[file isdirectory $binDir]} {
390                    foreach file [readdir $binDir] {
391                        file copy [file join $binDir $file] ${destroot}${ruby.bindir}
392                    }
393                }
394            }
395        }
396        fetch {
397            # do nothing but fetch and extract - for strange installers
398            build {}
399        }
400        default {
401            ui_error "ruby.setup: unknown setup type '${type}' specified!"
402            return -code error "ruby.setup failed"
403        }
404    }
405
406    if {$type != "gnu"} {
407        configure.universal_args-delete  --disable-dependency-tracking
408    }
409
410    pre-destroot {
411        xinstall -d -m 0755 ${destroot}${ruby.bindir}
412    }
413
414    post-destroot {
415        if {${ruby.link_binaries}} {
416            foreach bin [glob -nocomplain -tails -directory "${destroot}${ruby.bindir}" *] {
417                if {[catch {file type "${destroot}${prefix}/bin/${bin}${ruby.link_binaries_suffix}"}]} {
418                    ln -s "${ruby.bindir}/${bin}" "${destroot}${prefix}/bin/${bin}${ruby.link_binaries_suffix}"
419                }
420            }
421        }
422        # Install documentation files (if specified)
423        if {[llength ${ruby.docs}] > 0} {
424            set docPath ${prefix}/share/doc/${name}
425            xinstall -d -m 0755 ${destroot}${docPath}
426            foreach docitem ${ruby.docs} {
427                set docitem [file join ${worksrcpath} ${docitem}]
428                if {[file isdirectory ${docitem}]} {
429                    set subdir [file tail $docitem]
430                    xinstall -d -m 0755 ${destroot}${docPath}/${subdir}
431                    fs-traverse file $docitem {
432                        set file [trimroot $docitem $file]
433                        if {$file ne ""} {
434                            set filepath [file join $docitem $file]
435                            if {[file isdirectory $filepath]} {
436                                xinstall -d -m 0755 ${destroot}${docPath}/${subdir}/${file}
437                            } else {
438                                xinstall -m 0644 $filepath ${destroot}${docPath}/${subdir}/${file}
439                            }
440                        }
441                    }
442                } else {
443                    xinstall -m 0644 ${docitem} ${destroot}${docPath}
444                }
445            }
446        }
447    }
448}
449
450proc trimroot {root path} {
451    set acc {}
452    set skiproot no
453    foreach rootf [file split $root] pathf [file split $path] {
454        if {$pathf eq ""} {
455            # we've hit the end of the path
456            break
457        } elseif {$skiproot eq "yes" || $rootf eq ""} {
458            lappend acc $pathf
459        } elseif {$rootf ne $pathf} {
460            # diverged from the root
461            lappend acc $pathf
462            set skiproot yes
463        }
464    }
465    if {[llength $acc] == 0} {
466        return ""
467    } else {
468        return [eval [subst -nobackslashes -nocommands {file join $acc}]]
469    }
470}
Note: See TracBrowser for help on using the repository browser.