akmhoque | fa8ee9b | 2014-03-14 09:06:24 -0500 | [diff] [blame^] | 1 | #! /usr/bin/env python |
| 2 | # encoding: utf-8 |
| 3 | # WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file |
| 4 | |
| 5 | import os |
| 6 | from waflib import Task,Options,Utils |
| 7 | from waflib.TaskGen import before_method,feature,after_method,Task,extension |
| 8 | from waflib.Configure import conf |
| 9 | @feature('rubyext') |
| 10 | @before_method('apply_incpaths','apply_lib_vars','apply_bundle','apply_link') |
| 11 | def init_rubyext(self): |
| 12 | self.install_path='${ARCHDIR_RUBY}' |
| 13 | self.uselib=self.to_list(getattr(self,'uselib','')) |
| 14 | if not'RUBY'in self.uselib: |
| 15 | self.uselib.append('RUBY') |
| 16 | if not'RUBYEXT'in self.uselib: |
| 17 | self.uselib.append('RUBYEXT') |
| 18 | @feature('rubyext') |
| 19 | @before_method('apply_link','propagate_uselib') |
| 20 | def apply_ruby_so_name(self): |
| 21 | self.env['cshlib_PATTERN']=self.env['cxxshlib_PATTERN']=self.env['rubyext_PATTERN'] |
| 22 | @conf |
| 23 | def check_ruby_version(self,minver=()): |
| 24 | if Options.options.rubybinary: |
| 25 | self.env.RUBY=Options.options.rubybinary |
| 26 | else: |
| 27 | self.find_program('ruby',var='RUBY') |
| 28 | ruby=self.env.RUBY |
| 29 | try: |
| 30 | version=self.cmd_and_log([ruby,'-e','puts defined?(VERSION) ? VERSION : RUBY_VERSION']).strip() |
| 31 | except Exception: |
| 32 | self.fatal('could not determine ruby version') |
| 33 | self.env.RUBY_VERSION=version |
| 34 | try: |
| 35 | ver=tuple(map(int,version.split("."))) |
| 36 | except Exception: |
| 37 | self.fatal('unsupported ruby version %r'%version) |
| 38 | cver='' |
| 39 | if minver: |
| 40 | if ver<minver: |
| 41 | self.fatal('ruby is too old %r'%ver) |
| 42 | cver='.'.join([str(x)for x in minver]) |
| 43 | else: |
| 44 | cver=ver |
| 45 | self.msg('Checking for ruby version %s'%str(minver or''),cver) |
| 46 | @conf |
| 47 | def check_ruby_ext_devel(self): |
| 48 | if not self.env.RUBY: |
| 49 | self.fatal('ruby detection is required first') |
| 50 | if not self.env.CC_NAME and not self.env.CXX_NAME: |
| 51 | self.fatal('load a c/c++ compiler first') |
| 52 | version=tuple(map(int,self.env.RUBY_VERSION.split("."))) |
| 53 | def read_out(cmd): |
| 54 | return Utils.to_list(self.cmd_and_log([self.env.RUBY,'-rrbconfig','-e',cmd])) |
| 55 | def read_config(key): |
| 56 | return read_out('puts Config::CONFIG[%r]'%key) |
| 57 | ruby=self.env['RUBY'] |
| 58 | archdir=read_config('archdir') |
| 59 | cpppath=archdir |
| 60 | if version>=(1,9,0): |
| 61 | ruby_hdrdir=read_config('rubyhdrdir') |
| 62 | cpppath+=ruby_hdrdir |
| 63 | cpppath+=[os.path.join(ruby_hdrdir[0],read_config('arch')[0])] |
| 64 | self.check(header_name='ruby.h',includes=cpppath,errmsg='could not find ruby header file') |
| 65 | self.env.LIBPATH_RUBYEXT=read_config('libdir') |
| 66 | self.env.LIBPATH_RUBYEXT+=archdir |
| 67 | self.env.INCLUDES_RUBYEXT=cpppath |
| 68 | self.env.CFLAGS_RUBYEXT=read_config('CCDLFLAGS') |
| 69 | self.env.rubyext_PATTERN='%s.'+read_config('DLEXT')[0] |
| 70 | flags=read_config('LDSHARED') |
| 71 | while flags and flags[0][0]!='-': |
| 72 | flags=flags[1:] |
| 73 | if len(flags)>1 and flags[1]=="ppc": |
| 74 | flags=flags[2:] |
| 75 | self.env.LINKFLAGS_RUBYEXT=flags |
| 76 | self.env.LINKFLAGS_RUBYEXT+=read_config('LIBS') |
| 77 | self.env.LINKFLAGS_RUBYEXT+=read_config('LIBRUBYARG_SHARED') |
| 78 | if Options.options.rubyarchdir: |
| 79 | self.env.ARCHDIR_RUBY=Options.options.rubyarchdir |
| 80 | else: |
| 81 | self.env.ARCHDIR_RUBY=read_config('sitearchdir')[0] |
| 82 | if Options.options.rubylibdir: |
| 83 | self.env.LIBDIR_RUBY=Options.options.rubylibdir |
| 84 | else: |
| 85 | self.env.LIBDIR_RUBY=read_config('sitelibdir')[0] |
| 86 | @conf |
| 87 | def check_ruby_module(self,module_name): |
| 88 | self.start_msg('Ruby module %s'%module_name) |
| 89 | try: |
| 90 | self.cmd_and_log([self.env['RUBY'],'-e','require \'%s\';puts 1'%module_name]) |
| 91 | except Exception: |
| 92 | self.end_msg(False) |
| 93 | self.fatal('Could not find the ruby module %r'%module_name) |
| 94 | self.end_msg(True) |
| 95 | @extension('.rb') |
| 96 | def process(self,node): |
| 97 | tsk=self.create_task('run_ruby',node) |
| 98 | class run_ruby(Task.Task): |
| 99 | run_str='${RUBY} ${RBFLAGS} -I ${SRC[0].parent.abspath()} ${SRC}' |
| 100 | def options(opt): |
| 101 | opt.add_option('--with-ruby-archdir',type='string',dest='rubyarchdir',help='Specify directory where to install arch specific files') |
| 102 | opt.add_option('--with-ruby-libdir',type='string',dest='rubylibdir',help='Specify alternate ruby library path') |
| 103 | opt.add_option('--with-ruby-binary',type='string',dest='rubybinary',help='Specify alternate ruby binary') |