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

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

group/ruby-1.0.tcl: add support for port:ruby21

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