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

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

port1.0/group/ruby-1.0.tcl: let ruby.setup to accept ruby20

  • ruby.branch and ruby.setup supports ruby20
  • ruby.suffix is enable with ruby.branch
  • fix installation of ri and rdoc from ruby.setup gem
  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 18.4 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 103995 2013-03-12 13:29:49Z 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, 1.9 or 2.0.
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    if {${ruby.branch} eq "1.8"} {
97        set ruby.prog_suffix     ""
98    }
99}
100
101proc ruby.extract_config {var {default ""}} {
102    global ruby.bin
103    if {[catch {set val [exec ${ruby.bin} -e "require 'rbconfig';puts RbConfig::CONFIG\[\"${var}\"\]"]}]} {
104        set val ${default}
105    }
106    return $val
107}
108
109options ruby.api_version ruby.lib ruby.archlib
110default ruby.api_version    {[ruby.extract_config ruby_version]}
111default ruby.arch           {[ruby.extract_config arch "${os.arch}-${os.platform}${os.major}"]}
112# define installation libraries as vendor location
113default ruby.lib            {[ruby.extract_config vendorlibdir ${prefix}/lib/ruby/vendor_ruby/${ruby.api_version}]}
114default ruby.archlib        {[ruby.extract_config vendorarchdir ${ruby.lib}/${ruby.arch}]}
115# ruby.version is obsoleted. use ruby.api_version.
116options ruby.version
117default ruby.version        {[ruby.extract_config ruby_version]}
118
119set ruby.module         ""
120set ruby.filename       ""
121set ruby.project        ""
122set ruby.docs           {}
123set ruby.srcdir         ""
124
125options ruby.link_binaries
126default ruby.link_binaries yes
127
128default ruby.branch         ${ruby.default_branch}
129
130# ruby group setup procedure; optional for ruby 1.8 if you want only
131# basic variables, like ruby.lib and ruby.archlib.
132proc ruby.setup {module vers {type "install.rb"} {docs {}} {source "custom"} {implementation "ruby"}} {
133    global destroot prefix worksrcpath os.platform
134    global ruby.bin ruby.rdoc ruby.gem
135    global ruby.api_version ruby.lib ruby.suffix ruby.bindir ruby.gemdir
136    global ruby.module ruby.filename ruby.project ruby.docs ruby.srcdir
137    global ruby.link_binaries_suffix
138    # ruby.version is obsoleted. use ruby.gemdir.
139    global ruby.prog_suffix
140
141    if {${implementation} eq "ruby19"} {
142        ruby.branch 1.9
143    } elseif {${implementation} eq "ruby20"} {
144        ruby.branch 2.0
145    } elseif {${implementation} eq "ruby"} {
146        ruby.branch 1.8
147    } else {
148        ui_error "ruby.setup: unknown implementation '${implementation}' specified (ruby, ruby19, ruby20 possible)"
149        return -code error "ruby.setup failed"
150    }
151
152    # define ruby global names and lists
153    # check if module is a list or string
154    if {[llength ${module}] > 1} {
155        # if a list, first item is the module name
156        set ruby.module     [lindex ${module} 0]
157        # second argument is the project & file name
158        set ruby.project    [lindex ${module} 1]
159        set ruby.filename   [lindex ${module} 1]
160    } else {
161        # else, module, project, and file name are the same
162        set ruby.module     ${module}
163        set ruby.project    ${module}
164        set ruby.filename   ${module}
165    }
166    set ruby.docs   ${docs}
167
168    name            rb${ruby.suffix}-[string tolower ${ruby.module}]
169    version         ${vers}
170    categories      ruby
171
172    switch -glob ${source} {
173        rubyforge:*:* {
174            set num [lindex [split ${source} {:}] 1]
175            set ruby.project [string tolower [lindex [split ${source} {:}] 2]]
176            homepage        http://rubyforge.org/projects/${ruby.project}
177            master_sites    http://rubyforge.org/frs/download.php/${num}/
178            livecheck.type  regex
179            livecheck.url   http://rubyforge.org/projects/${ruby.project}
180            livecheck.regex "<strong>${ruby.project}</strong></td><td>(?:REL )?(.*)$"
181        }
182        rubyforge:* {
183            set num [lindex [split ${source} {:}] 1]
184            homepage        http://rubyforge.org/projects/${ruby.project}
185            master_sites    http://rubyforge.org/frs/download.php/${num}/
186            livecheck.type  regex
187            livecheck.url   http://rubyforge.org/projects/${ruby.project}
188            livecheck.regex "<strong>${ruby.project}</strong></td><td>(?:REL )?(.*)$"
189        }
190        rubyforge_gem:* {
191            set ruby.project [lindex [split ${source} {:}] 1]
192            homepage        http://rubyforge.org/projects/${ruby.project}
193            master_sites    http://gems.rubyforge.vm.bytemark.co.uk/gems/ \
194                            http://rubyforge.iasi.roedu.net/gems/
195            livecheck.type  regex
196            livecheck.url   http://rubyforge.org/projects/${ruby.project}
197            livecheck.regex "<strong>${ruby.module}</strong></td><td>(?:REL )?(.*)$"
198        }
199        rubyforge_gem {
200            homepage        http://rubyforge.org/projects/${ruby.project}
201            master_sites    http://gems.rubyforge.vm.bytemark.co.uk/gems/ \
202                            http://rubyforge.iasi.roedu.net/gems/
203            livecheck.type  regex
204            livecheck.url   http://rubyforge.org/projects/${ruby.project}
205            livecheck.regex "<strong>${ruby.module}</strong></td><td>(?:REL )?(.*)$"
206        }
207        rubygems {
208            homepage        http://www.rubygems.org/gems/${ruby.project}
209            master_sites    http://www.rubygems.org/downloads/
210            livecheck.type  regex
211            livecheck.url   http://www.rubygems.org/gems/${ruby.project}
212            livecheck.regex {<h3>(\d|\d[0-9.]*\d)</h3>}
213        }
214        sourceforge:* {
215            set ruby.project [lindex [split ${source} {:}] 1]
216            homepage        http://sourceforge.net/projects/${ruby.project}
217            master_sites    sourceforge:${ruby.project}
218        }
219        sourceforge {
220            homepage        http://sourceforge.net/projects/${ruby.project}
221            master_sites    sourceforge:${ruby.project}
222        }
223    }
224
225    distname        ${ruby.filename}-${vers}
226    dist_subdir     ruby
227
228    depends_lib     port:${implementation}
229
230    post-extract {
231        # Create the work directory for gem-based ruby ports.
232        system "mkdir -p ${worksrcpath}"
233        system "find ${worksrcpath} -type d -name CVS | xargs rm -rf"
234    }
235
236    switch -glob ${type} {
237        basic_install.rb {
238            post-patch {
239                # create destroot setup file
240                set fp [open ${worksrcpath}/destroot.rb w]
241                puts $fp "
242                    require 'rbconfig'
243                    include Config
244                    DESTROOT=ENV\['DESTROOT'\] || ''
245                    CONFIG.keys.find_all { |d|
246                        d.match(/dir\$/) and !d.match(/(src|build|compile)/)
247                    }.each {|confdir|
248                        CONFIG\[confdir\]=DESTROOT+CONFIG\[confdir\]
249                    }
250                    \$:.reverse.each { |d| \$:.unshift(DESTROOT+d) }
251                "
252                close $fp
253                # adjust basic install.rb script
254                reinplace "s|site_ruby|vendor_ruby|" ${worksrcpath}/install.rb
255            }
256
257            use_configure   no
258
259            build           {}
260
261            pre-destroot {
262                xinstall -d -m 0755 ${destroot}${ruby.lib}
263            }
264            destroot.env    DESTROOT=${destroot}
265            destroot.cmd    ${ruby.bin} -rvendor-specific -rdestroot install.rb
266            destroot.target
267            destroot.destdir
268            post-destroot {
269                foreach file [readdir ${destroot}${prefix}/bin] {
270                    move [file join ${destroot}${prefix}/bin $file] ${destroot}${ruby.bindir}
271                }
272            }
273        }
274        copy_install:* {
275            set ruby.srcdir [lindex [split ${type} {:}] 1]
276
277            use_configure   no
278
279            build           {}
280
281            destroot {
282                set root ${worksrcpath}/${ruby.srcdir}
283                xinstall -d -m 0755 ${destroot}${ruby.lib}
284                fs-traverse file $root {
285                    set file [trimroot $root $file]
286                    if {$file ne ""} {
287                        set filepath [file join $root $file]
288                        if {[file isdirectory $filepath]} {
289                            xinstall -d -m 0755 ${destroot}${ruby.lib}/${file}
290                        } else {
291                            xinstall -m 0644 $filepath ${destroot}${ruby.lib}/${file}
292                        }
293                    }
294                }
295            }
296        }
297        install.rb {
298            configure.cmd       ${ruby.bin} -rvendor-specific install.rb
299            configure.pre_args  config --bin-dir=${destroot}${ruby.bindir}
300
301            build.cmd           ${ruby.bin} -rvendor-specific install.rb
302            build.target        setup
303
304            pre-destroot {
305                if {[file isfile ${worksrcpath}/config.save]} {
306                    reinplace "s|^prefix=${prefix}|prefix=${destroot}${prefix}|g" \
307                        ${worksrcpath}/config.save
308                }
309                if {[file isfile ${worksrcpath}/.config]} {
310                    reinplace "s|^prefix=${prefix}|prefix=${destroot}${prefix}|g" \
311                        ${worksrcpath}/.config
312                }
313            }
314            destroot.cmd        ${ruby.bin} -rvendor-specific install.rb
315            destroot.target     install
316            destroot.destdir
317        }
318        setup.rb {
319            configure.cmd       ${ruby.bin} -rvendor-specific setup.rb
320            configure.pre_args  config
321
322            build.cmd           ${ruby.bin} -rvendor-specific setup.rb
323            build.target        setup
324
325            pre-destroot {
326                if {[file isfile ${worksrcpath}/config.save]} {
327                    reinplace "s|${prefix}|${destroot}${prefix}|g" \
328                        ${worksrcpath}/config.save
329                }
330                if {[file isfile ${worksrcpath}/.config]} {
331                    reinplace "s|${prefix}|${destroot}${prefix}|g" \
332                        ${worksrcpath}/.config
333                }
334            }
335            destroot.cmd        ${ruby.bin} -rvendor-specific setup.rb
336            destroot.target     install
337            destroot.destdir
338            post-destroot {
339                foreach file [readdir ${destroot}${prefix}/bin] {
340                    move [file join ${destroot}${prefix}/bin $file] ${destroot}${ruby.bindir}
341                }
342            }
343        }
344        extconf.rb {
345            configure.cmd       ${ruby.bin} -rvendor-specific extconf.rb
346            configure.pre_args
347            configure.args      --prefix=${prefix}
348
349            build.args          RUBY="${ruby.bin} -rvendor-specific"
350
351            destroot.args       RUBY="${ruby.bin} -rvendor-specific"
352            post-destroot {
353                foreach file [readdir ${destroot}${prefix}/bin] {
354                    move [file join ${destroot}${prefix}/bin $file] ${destroot}${ruby.bindir}
355                }
356            }
357        }
358        gnu {
359            build.args          RUBY="${ruby.bin} -rvendor-specific"
360
361            pre-destroot {
362                if {[file isfile ${worksrcpath}/config.save]} {
363                    reinplace "s|${prefix}|${destroot}${prefix}|g" \
364                        ${worksrcpath}/config.save
365                }
366                if {[file isfile ${worksrcpath}/.config]} {
367                    reinplace "s|${prefix}|${destroot}${prefix}|g" \
368                        ${worksrcpath}/.config
369                }
370            }
371            destroot.args       RUBY="${ruby.bin} -rvendor-specific"
372        }
373        gem {
374            use_configure no
375            extract.suffix .gem
376
377            if {${implementation} eq "ruby"} {
378                depends_lib-append  port:rb-rubygems
379            }
380
381            extract {}
382            build {}
383
384            pre-destroot {
385                xinstall -d -m 0755 ${destroot}${ruby.gemdir}
386            }
387
388            destroot {
389                system "cd ${worksrcpath} && ${ruby.gem} install --local --force --install-dir ${destroot}${ruby.gemdir} ${distpath}/${distname}"
390
391                set binDir ${destroot}${ruby.gemdir}/bin
392                if {[file isdirectory $binDir]} {
393                    foreach file [readdir $binDir] {
394                        file copy [file join $binDir $file] ${destroot}${ruby.bindir}
395                    }
396                }
397            }
398        }
399        fetch {
400            # do nothing but fetch and extract - for strange installers
401            build {}
402        }
403        default {
404            ui_error "ruby.setup: unknown setup type '${type}' specified!"
405            return -code error "ruby.setup failed"
406        }
407    }
408
409    if {$type != "gnu"} {
410        configure.universal_args-delete  --disable-dependency-tracking
411    }
412
413    pre-destroot {
414        xinstall -d -m 0755 ${destroot}${ruby.bindir}
415    }
416
417    post-destroot {
418        if {${ruby.link_binaries}} {
419            foreach bin [glob -nocomplain -tails -directory "${destroot}${ruby.bindir}" *] {
420                if {[catch {file type "${destroot}${prefix}/bin/${bin}${ruby.link_binaries_suffix}"}]} {
421                    ln -s "${ruby.bindir}/${bin}" "${destroot}${prefix}/bin/${bin}${ruby.link_binaries_suffix}"
422                }
423            }
424        }
425        # Install documentation files (if specified)
426        if {[llength ${ruby.docs}] > 0} {
427            set docPath ${prefix}/share/doc/${name}
428            xinstall -d -m 0755 ${destroot}${docPath}
429            foreach docitem ${ruby.docs} {
430                set docitem [file join ${worksrcpath} ${docitem}]
431                if {[file isdirectory ${docitem}]} {
432                    set subdir [file tail $docitem]
433                    xinstall -d -m 0755 ${destroot}${docPath}/${subdir}
434                    fs-traverse file $docitem {
435                        set file [trimroot $docitem $file]
436                        if {$file ne ""} {
437                            set filepath [file join $docitem $file]
438                            if {[file isdirectory $filepath]} {
439                                xinstall -d -m 0755 ${destroot}${docPath}/${subdir}/${file}
440                            } else {
441                                xinstall -m 0644 $filepath ${destroot}${docPath}/${subdir}/${file}
442                            }
443                        }
444                    }
445                } else {
446                    xinstall -m 0644 ${docitem} ${destroot}${docPath}
447                }
448            }
449        }
450    }
451}
452
453proc trimroot {root path} {
454    set acc {}
455    set skiproot no
456    foreach rootf [file split $root] pathf [file split $path] {
457        if {$pathf eq ""} {
458            # we've hit the end of the path
459            break
460        } elseif {$skiproot eq "yes" || $rootf eq ""} {
461            lappend acc $pathf
462        } elseif {$rootf ne $pathf} {
463            # diverged from the root
464            lappend acc $pathf
465            set skiproot yes
466        }
467    }
468    if {[llength $acc] == 0} {
469        return ""
470    } else {
471        return [eval [subst -nobackslashes -nocommands {file join $acc}]]
472    }
473}
Note: See TracBrowser for help on using the repository browser.