| #!/usr/bin/env python |
| |
| # |
| # external_runtime.py: Generate external runtime files for SWIG |
| # |
| |
| import sys, os, re, fileinput |
| if __name__ == "__main__": |
| parent_dir = os.path.dirname(os.path.abspath(os.path.dirname(sys.argv[0]))) |
| sys.path[0:0] = [ parent_dir, os.path.dirname(parent_dir) ] |
| import generator.swig |
| import generator.util.executable |
| _exec = generator.util.executable |
| |
| class Generator(generator.swig.Generator): |
| """Generate external runtime files for SWIG""" |
| |
| def write(self): |
| """Generate external runtimes""" |
| for lang in self.langs: |
| self.write_external_runtime(lang) |
| |
| def write_makefile_rules(self, makefile): |
| """Write the makefile rules for generating external runtimes""" |
| makefile.write( |
| 'GEN_SWIG_RUNTIME = cd $(top_srcdir) && $(PYTHON)' + |
| ' build/generator/swig/external_runtime.py build.conf $(SWIG)\n\n' |
| ) |
| for lang in self.langs: |
| out = self._output_file(lang) |
| makefile.write( |
| 'autogen-swig-%s: %s\n' % (self.short[lang], out) + |
| '%s: $(SWIG_CHECKOUT_FILES)\n' % out + |
| '\t$(GEN_SWIG_RUNTIME) %s\n\n' % lang |
| ) |
| makefile.write('\n') |
| |
| def write_external_runtime(self, lang): |
| """Generate external runtime header files for each SWIG language""" |
| |
| # Runtime library names |
| runtime_library = { |
| "python": "pyrun.swg", "perl":"perlrun.swg", "ruby":"rubydef.swg" |
| } |
| |
| # Build runtime files |
| out = self._output_file(lang) |
| if self.version() == 103024: |
| out_file = open(out, "w") |
| out_file.write(open("%s/swigrun.swg" % self.proxy_dir).read()) |
| out_file.write(open("%s/common.swg" % self.proxy_dir).read()) |
| out_file.write( |
| open("%s/%s" % (self.proxy_dir, runtime_library[lang])).read()) |
| if lang != "ruby": |
| out_file.write(open("%s/runtime.swg" % self.proxy_dir).read()) |
| out_file.close() |
| else: |
| _exec.run("%s -%s -external-runtime %s" % (self.swig_path, lang, out)) |
| |
| if lang == "ruby" and self.version() >= 103026 and self.version() < 103028: |
| # SWIG 1.3.26-27 should include rubytracking.swg in their |
| # external runtime, but they don't. |
| runtime = open(out).read() |
| tracking = open("%s/rubytracking.swg" % self.proxy_dir).read(); |
| out_file = open(out, "w") |
| out_file.write(tracking) |
| out_file.write(runtime) |
| out_file.close() |
| |
| # SWIG 1.3.25 and earlier use the wrong number of arguments in calls to |
| # SWIG_GetModule. We fix this below. |
| if self.version() <= 103025: |
| for line in fileinput.input(out, inplace=1): |
| sys.stdout.write( |
| re.sub(r"SWIG_GetModule\(\)", "SWIG_GetModule(NULL)", line) |
| ) |
| def _output_file(self, lang): |
| """Return the output filename of the runtime for the given language""" |
| return '%s/swig_%s_external_runtime.swg' % (self.proxy_dir, lang) |
| |
| |
| if __name__ == "__main__": |
| if len(sys.argv) != 4: |
| print "Usage: %s build.conf swig" |
| print "Generates external runtime files for SWIG" |
| else: |
| gen = Generator(sys.argv[1], sys.argv[2]) |
| gen.write_external_runtime(sys.argv[3]) |