diff --git a/Rakefile b/Rakefile
index 515599247fcd5ed57a0bd4d8aa547d7d64ed6421..34fca0bf4732809cb819ba09dddde8c0fd3a7937 100755
--- a/Rakefile
+++ b/Rakefile
@@ -82,18 +82,6 @@ task :setversions => [ :create_installer_scripts ] do
   setversions("scripts/make-installers.rb")
 end
 
-# Set environment variable SWIG_LIB to
-# c:/ruby-1.8.6-p383-preview2/devkit/msys/1.0.11/usr/local/share/swig/1.3.22
-# before running swig on MinGW.
-desc "Run SWIG to generate the wrapper files."
-task :swig do
-  Dir.chdir "swig-interfaces" do
-    system %{touch dependencies}
-    system %{make depend}
-    system %{make}
-  end
-end
-
 DISTFILES = [
   "ANNOUNCE",
   "LICENSE",
@@ -229,4 +217,94 @@ Rake::ExtensionTask.new("fox16") do |ext|
   ext.config_options << "--with-fox-lib=c:/ruby-1.8.6-p383-preview2/devkit/msys/1.0.11/usr/local/lib"
 end
 
+# Set environment variable SWIG_LIB to
+# c:/ruby-1.8.6-p383-preview2/devkit/msys/1.0.11/usr/local/share/swig/1.3.22
+# before running swig on MinGW.
+namespace :swig do
+  SWIG = "/usr/local/bin/swig"
+  SWIGFLAGS = "-fcompact -noruntime -c++ -ruby -no_default -I../fox-includes"
+  SWIG_LIB = `#{SWIG} -swiglib`.chomp
+  SWIG_MODULES = {
+    "core.i" => "core_wrap.cpp",
+    "dcmodule.i" => "dc_wrap.cpp",
+    "dialogs.i" => "dialogs_wrap.cpp",
+    "framesmodule.i" => "frames_wrap.cpp",
+    "iconlistmodule.i" => "iconlist_wrap.cpp",
+    "icons.i" => "icons_wrap.cpp",
+    "image.i" => "image_wrap.cpp",
+    "labelmodule.i" => "label_wrap.cpp",
+    "layout.i" => "layout_wrap.cpp",
+    "listmodule.i" => "list_wrap.cpp",
+    "mdi.i" => "mdi_wrap.cpp",
+    "menumodule.i" => "menu_wrap.cpp",
+    "fx3d.i" => "fx3d_wrap.cpp",
+    "scintilla.i" => "scintilla_wrap.cpp",
+    "table-module.i" => "table_wrap.cpp",
+    "text-module.i" => "text_wrap.cpp",
+    "treelist-module.i" => "treelist_wrap.cpp",
+    "ui.i" => "ui_wrap.cpp"
+  }
+
+  def wrapper_src_file_path(wrapper_src_file_name)
+    File.join("..", "ext", "fox16", wrapper_src_file_name)
+  end
+  
+  def swig_generate_dependencies(swig_interface_file_name, wrapper_src_file_name)
+    system "#{SWIG} #{SWIGFLAGS} -MM -o #{wrapper_src_file_path(wrapper_src_file_name)} #{swig_interface_file_name} >> dependencies"
+  end
+  
+  def sed(wrapper_src_file_name)
+    results = []
+    IO.readlines(wrapper_src_file_name).each do |line|
+      line.gsub!(/static VALUE mCore;/, "VALUE mCore;")
+      line.gsub!(/mCore = rb_define_module\("Core"\)/, "mFox = rb_define_module(\"Fox\")")
+      line.gsub!(/mCore/, "mFox")
+      next if line =~ /static VALUE m(Dc|Dialogs|Frames|Iconlist|Icons|Image|Label|Layout|List|Mdi|Menu|Fx3d|Scintilla|Table|Text|Treelist|Ui);/
+      next if line =~ /m(Dc|Dialogs|Frames|Iconlist|Icons|Image|Label|Layout|List|Mdi|Menu|Fx3d|Scintilla|Table|Text|Treelist|Ui) = rb_define_module/
+      next if line =~ /rb_require/
+      line.gsub!(/m(Dc|Dialogs|Frames|Iconlist|Icons|Image|Label|Layout|List|Mdi|Menu|Fx3d|Scintilla|Table|Text|Treelist|Ui),/, "mFox,")
+      results << line
+    end
+    File.open(wrapper_src_file_name, "w") do |io|
+      io.write(results.join)
+    end
+  end
+  
+  def swig(swig_interface_file_name, wrapper_src_file_name)
+    system "#{SWIG} #{SWIGFLAGS} -o #{wrapper_src_file_path(wrapper_src_file_name)} #{swig_interface_file_name}"
+    sed wrapper_src_file_path(wrapper_src_file_name)
+  end
+
+  task :swig_dependencies do
+    Dir.chdir "swig-interfaces" do
+      FileUtils.rm_f "dependencies"
+      FileUtils.touch "dependencies"
+      SWIG_MODULES.each do |key, value|
+        swig_generate_dependencies(key, value)
+      end
+    end
+  end
+  
+  task :swig_librb do
+    Dir.chdir "swig-interfaces" do
+      File.open(wrapper_src_file_path("librb.c"), "w") do |io|
+        io.puts "#define SWIG_GLOBAL 1"
+        io.write(IO.read(File.join(SWIG_LIB, "ruby", "precommon.swg")))
+        io.write(IO.read(File.join(SWIG_LIB, "common.swg")))
+        io.write(IO.read(File.join(SWIG_LIB, "ruby", "rubyhead.swg")))
+        io.write(IO.read(File.join(SWIG_LIB, "ruby", "rubydef.swg")))
+      end
+    end
+  end
+
+  desc "Run SWIG to generate the wrapper files."
+  task :swig => [:swig_dependencies, :swig_librb] do
+    Dir.chdir "swig-interfaces" do
+      SWIG_MODULES.each do |key, value|
+        swig(key, value)
+      end
+    end
+  end
+end
+
 task :build => [:configure, :compile]
diff --git a/swig-interfaces/Makefile b/swig-interfaces/Makefile
deleted file mode 100755
index a989672c619b91b05bfe437436af2a63bf5937a9..0000000000000000000000000000000000000000
--- a/swig-interfaces/Makefile
+++ /dev/null
@@ -1,138 +0,0 @@
-#
-# This makefile is used to generate the wrapper code from the
-# SWIG interface files.
-#
-# $Id: Makefile 2827 2008-03-28 16:04:44Z lyle $
-#
-
-.PHONY: clean
-
-SWIG = /usr/local/bin/swig
-SWIGFLAGS = -fcompact -noruntime -c++ -ruby -no_default -I../fox-includes
-SRCDIR = ../ext/fox16
-SED = sed -f swig.sed
-RUBY = ruby
-SWIGLIB := $(shell /usr/local/bin/swig -swiglib)
-
-MODULES = \
-	$(SRCDIR)/core_wrap.cpp \
-	$(SRCDIR)/dc_wrap.cpp \
-	$(SRCDIR)/dialogs_wrap.cpp \
-	$(SRCDIR)/frames_wrap.cpp \
-	$(SRCDIR)/iconlist_wrap.cpp \
-	$(SRCDIR)/icons_wrap.cpp \
-	$(SRCDIR)/image_wrap.cpp \
-	$(SRCDIR)/label_wrap.cpp \
-	$(SRCDIR)/layout_wrap.cpp \
-	$(SRCDIR)/list_wrap.cpp \
-	$(SRCDIR)/mdi_wrap.cpp \
-	$(SRCDIR)/menu_wrap.cpp \
-	$(SRCDIR)/fx3d_wrap.cpp \
-	$(SRCDIR)/scintilla_wrap.cpp \
-	$(SRCDIR)/table_wrap.cpp \
-	$(SRCDIR)/text_wrap.cpp \
-	$(SRCDIR)/treelist_wrap.cpp \
-	$(SRCDIR)/ui_wrap.cpp
-
-all: $(SRCDIR)/librb.c $(MODULES)
-
-$(SRCDIR)/core_wrap.cpp: core.i
-	$(SWIG) $(SWIGFLAGS) -o $(SRCDIR)/core_wrap.cpp core.i
-	$(SED) $(SRCDIR)/core_wrap.cpp > junk; mv junk $(SRCDIR)/core_wrap.cpp
-
-$(SRCDIR)/dc_wrap.cpp: dcmodule.i
-	$(SWIG) $(SWIGFLAGS) -o $(SRCDIR)/dc_wrap.cpp dcmodule.i
-	$(SED) $(SRCDIR)/dc_wrap.cpp > junk; mv junk $(SRCDIR)/dc_wrap.cpp
-
-$(SRCDIR)/dialogs_wrap.cpp: dialogs.i
-	$(SWIG) $(SWIGFLAGS) -o $(SRCDIR)/dialogs_wrap.cpp dialogs.i
-	$(SED) $(SRCDIR)/dialogs_wrap.cpp > junk; mv junk $(SRCDIR)/dialogs_wrap.cpp
-
-$(SRCDIR)/frames_wrap.cpp: framesmodule.i
-	$(SWIG) $(SWIGFLAGS) -o $(SRCDIR)/frames_wrap.cpp framesmodule.i
-	$(SED) $(SRCDIR)/frames_wrap.cpp > junk; mv junk $(SRCDIR)/frames_wrap.cpp
-
-$(SRCDIR)/iconlist_wrap.cpp: iconlistmodule.i
-	$(SWIG) $(SWIGFLAGS) -o $(SRCDIR)/iconlist_wrap.cpp iconlistmodule.i
-	$(SED) $(SRCDIR)/iconlist_wrap.cpp > junk; mv junk $(SRCDIR)/iconlist_wrap.cpp
-
-$(SRCDIR)/icons_wrap.cpp: icons.i
-	$(SWIG) $(SWIGFLAGS) -o $(SRCDIR)/icons_wrap.cpp icons.i
-	$(SED) $(SRCDIR)/icons_wrap.cpp > junk; mv junk $(SRCDIR)/icons_wrap.cpp
-
-$(SRCDIR)/image_wrap.cpp: image.i
-	$(SWIG) $(SWIGFLAGS) -o $(SRCDIR)/image_wrap.cpp image.i
-	$(SED) $(SRCDIR)/image_wrap.cpp > junk; mv junk $(SRCDIR)/image_wrap.cpp
-
-$(SRCDIR)/label_wrap.cpp: labelmodule.i
-	$(SWIG) $(SWIGFLAGS) -o $(SRCDIR)/label_wrap.cpp labelmodule.i
-	$(SED) $(SRCDIR)/label_wrap.cpp > junk; mv junk $(SRCDIR)/label_wrap.cpp
-
-$(SRCDIR)/layout_wrap.cpp: layout.i
-	$(SWIG) $(SWIGFLAGS) -o $(SRCDIR)/layout_wrap.cpp layout.i
-	$(SED) $(SRCDIR)/layout_wrap.cpp > junk; mv junk $(SRCDIR)/layout_wrap.cpp
-
-$(SRCDIR)/list_wrap.cpp: listmodule.i
-	$(SWIG) $(SWIGFLAGS) -o $(SRCDIR)/list_wrap.cpp listmodule.i
-	$(SED) $(SRCDIR)/list_wrap.cpp > junk; mv junk $(SRCDIR)/list_wrap.cpp
-
-$(SRCDIR)/mdi_wrap.cpp: mdi.i
-	$(SWIG) $(SWIGFLAGS) -o $(SRCDIR)/mdi_wrap.cpp mdi.i
-	$(SED) $(SRCDIR)/mdi_wrap.cpp > junk; mv junk $(SRCDIR)/mdi_wrap.cpp
-
-$(SRCDIR)/menu_wrap.cpp: menumodule.i
-	$(SWIG) $(SWIGFLAGS) -o $(SRCDIR)/menu_wrap.cpp menumodule.i
-	$(SED) $(SRCDIR)/menu_wrap.cpp > junk; mv junk $(SRCDIR)/menu_wrap.cpp
-
-$(SRCDIR)/fx3d_wrap.cpp: fx3d.i
-	$(SWIG) $(SWIGFLAGS) -o $(SRCDIR)/fx3d_wrap.cpp fx3d.i
-	$(SED) $(SRCDIR)/fx3d_wrap.cpp > junk; mv junk $(SRCDIR)/fx3d_wrap.cpp
-
-$(SRCDIR)/scintilla_wrap.cpp: scintilla.i
-	$(SWIG) $(SWIGFLAGS) -o $(SRCDIR)/scintilla_wrap.cpp scintilla.i
-	$(SED) $(SRCDIR)/scintilla_wrap.cpp > junk; mv junk $(SRCDIR)/scintilla_wrap.cpp
-
-$(SRCDIR)/table_wrap.cpp: table-module.i
-	$(SWIG) $(SWIGFLAGS) -o $(SRCDIR)/table_wrap.cpp table-module.i
-	$(SED) $(SRCDIR)/table_wrap.cpp > junk; mv junk $(SRCDIR)/table_wrap.cpp
-
-$(SRCDIR)/text_wrap.cpp: text-module.i
-	$(SWIG) $(SWIGFLAGS) -o $(SRCDIR)/text_wrap.cpp text-module.i
-	$(SED) $(SRCDIR)/text_wrap.cpp > junk; mv junk $(SRCDIR)/text_wrap.cpp
-
-$(SRCDIR)/treelist_wrap.cpp: treelist-module.i
-	$(SWIG) $(SWIGFLAGS) -o $(SRCDIR)/treelist_wrap.cpp treelist-module.i
-	$(SED) $(SRCDIR)/treelist_wrap.cpp > junk; mv junk $(SRCDIR)/treelist_wrap.cpp
-
-$(SRCDIR)/ui_wrap.cpp: ui.i
-	$(SWIG) $(SWIGFLAGS) -o $(SRCDIR)/ui_wrap.cpp ui.i
-	$(SED) $(SRCDIR)/ui_wrap.cpp > junk; mv junk $(SRCDIR)/ui_wrap.cpp
-
-$(SRCDIR)/librb.c: $(SWIGLIB)/ruby/precommon.swg $(SWIGLIB)/common.swg $(SWIGLIB)/ruby/rubyhead.swg $(SWIGLIB)/ruby/rubydef.swg
-	@echo "#define SWIG_GLOBAL 1" > $(SRCDIR)/librb.c
-	@cat $(SWIGLIB)/ruby/precommon.swg $(SWIGLIB)/common.swg $(SWIGLIB)/ruby/rubyhead.swg $(SWIGLIB)/ruby/rubydef.swg >> $(SRCDIR)/librb.c
-
-clean:
-	@rm -f $(SRCDIR)/librb.c $(MODULES)
-
-depend:
-	$(SWIG) $(SWIGFLAGS) -MM -o $(SRCDIR)/core_wrap.cpp core.i > dependencies
-	$(SWIG) $(SWIGFLAGS) -MM -o $(SRCDIR)/dc_wrap.cpp dcmodule.i >> dependencies
-	$(SWIG) $(SWIGFLAGS) -MM -o $(SRCDIR)/dialogs_wrap.cpp dialogs.i >> dependencies
-	$(SWIG) $(SWIGFLAGS) -MM -o $(SRCDIR)/frames_wrap.cpp framesmodule.i >> dependencies
-	$(SWIG) $(SWIGFLAGS) -MM -o $(SRCDIR)/iconlist_wrap.cpp iconlistmodule.i >> dependencies
-	$(SWIG) $(SWIGFLAGS) -MM -o $(SRCDIR)/icons_wrap.cpp icons.i >> dependencies
-	$(SWIG) $(SWIGFLAGS) -MM -o $(SRCDIR)/image_wrap.cpp image.i >> dependencies
-	$(SWIG) $(SWIGFLAGS) -MM -o $(SRCDIR)/label_wrap.cpp labelmodule.i >> dependencies
-	$(SWIG) $(SWIGFLAGS) -MM -o $(SRCDIR)/layout_wrap.cpp layout.i >> dependencies
-	$(SWIG) $(SWIGFLAGS) -MM -o $(SRCDIR)/list_wrap.cpp listmodule.i >> dependencies
-	$(SWIG) $(SWIGFLAGS) -MM -o $(SRCDIR)/mdi_wrap.cpp mdi.i >> dependencies
-	$(SWIG) $(SWIGFLAGS) -MM -o $(SRCDIR)/menu_wrap.cpp menumodule.i >> dependencies
-	$(SWIG) $(SWIGFLAGS) -MM -o $(SRCDIR)/fx3d_wrap.cpp fx3d.i >> dependencies
-	$(SWIG) $(SWIGFLAGS) -MM -o $(SRCDIR)/scintilla_wrap.cpp scintilla.i >> dependencies
-	$(SWIG) $(SWIGFLAGS) -MM -o $(SRCDIR)/table_wrap.cpp table-module.i >> dependencies
-	$(SWIG) $(SWIGFLAGS) -MM -o $(SRCDIR)/text_wrap.cpp text-module.i >> dependencies
-	$(SWIG) $(SWIGFLAGS) -MM -o $(SRCDIR)/treelist_wrap.cpp treelist-module.i >> dependencies
-	$(SWIG) $(SWIGFLAGS) -MM -o $(SRCDIR)/ui_wrap.cpp ui.i >> dependencies
-
-include dependencies
diff --git a/swig-interfaces/swig.sed b/swig-interfaces/swig.sed
deleted file mode 100755
index de1b3b727a1300851ef4cd3dc172b662fb65b6ee..0000000000000000000000000000000000000000
--- a/swig-interfaces/swig.sed
+++ /dev/null
@@ -1,55 +0,0 @@
-s/static VALUE mCore;/VALUE mCore;/
-s/mCore = rb_define_module("Core")/mFox = rb_define_module("Fox")/
-s/mCore/mFox/
-/static VALUE mDc;/d
-/mDc = rb_define_module/d
-/static VALUE mDialogs;/d
-/mDialogs = rb_define_module/d
-/static VALUE mFrames;/d
-/mFrames = rb_define_module/d
-/static VALUE mIconlist;/d
-/mIconlist = rb_define_module/d
-/static VALUE mIcons;/d
-/mIcons = rb_define_module/d
-/static VALUE mImage;/d
-/mImage = rb_define_module/d
-/static VALUE mLabel;/d
-/mLabel = rb_define_module/d
-/static VALUE mLayout;/d
-/mLayout = rb_define_module/d
-/static VALUE mList;/d
-/mList = rb_define_module/d
-/static VALUE mMdi;/d
-/mMdi = rb_define_module/d
-/static VALUE mMenu;/d
-/mMenu = rb_define_module/d
-/static VALUE mFx3d;/d
-/mFx3d = rb_define_module/d
-/static VALUE mScintilla;/d
-/mScintilla = rb_define_module/d
-/static VALUE mTable;/d
-/mTable = rb_define_module/d
-/static VALUE mText;/d
-/mText = rb_define_module/d
-/static VALUE mTreelist;/d
-/mTreelist = rb_define_module/d
-/static VALUE mUi;/d
-/mUi = rb_define_module/d
-/rb_require/d
-s/mDc,/mFox,/
-s/mDialogs,/mFox,/
-s/mFrames,/mFox,/
-s/mIconlist,/mFox,/
-s/mIcons,/mFox,/
-s/mImage,/mFox,/
-s/mLabel,/mFox,/
-s/mLayout,/mFox,/
-s/mList,/mFox,/
-s/mMdi,/mFox,/
-s/mMenu,/mFox,/
-s/mFx3d,/mFox,/
-s/mScintilla,/mFox,/
-s/mTable,/mFox,/
-s/mText,/mFox,/
-s/mTreelist,/mFox,/
-s/mUi,/mFox,/