From d7e226e74f5c10d64732e1ba16e80a1f55165359 Mon Sep 17 00:00:00 2001
From: Mark Lee <rust.ruby@lazymalevolence.com>
Date: Sun, 9 Apr 2017 23:13:47 -0700
Subject: [PATCH] Add support for prebuilt static tarballs

---
 lib/thermite/config.rb           | 11 ++++++++++-
 test/lib/thermite/config_test.rb | 33 ++++++++++++++++++++++++++++----
 2 files changed, 39 insertions(+), 5 deletions(-)

diff --git a/lib/thermite/config.rb b/lib/thermite/config.rb
index e6c8408..7104bbc 100644
--- a/lib/thermite/config.rb
+++ b/lib/thermite/config.rb
@@ -130,7 +130,9 @@ def shared_library
     # package `version`.
     #
     def tarball_filename(version)
-      "#{library_name}-#{version}-#{ruby_version}-#{target_os}-#{target_arch}.tar.gz"
+      static = static_extension? ? '-static' : ''
+
+      "#{library_name}-#{version}-#{ruby_version}-#{target_os}-#{target_arch}#{static}.tar.gz"
     end
 
     #
@@ -268,6 +270,13 @@ def dynamic_linker_flags
       @dynamic_linker_flags ||= RbConfig::CONFIG['DLDFLAGS'].strip
     end
 
+    #
+    # Whether to use a statically linked extension.
+    #
+    def static_extension?
+      ENV.key?('RUBY_STATIC') || RbConfig::CONFIG['ENABLE_SHARED'] == 'no'
+    end
+
     private
 
     def dlext
diff --git a/test/lib/thermite/config_test.rb b/test/lib/thermite/config_test.rb
index a45c1c5..425ae6f 100644
--- a/test/lib/thermite/config_test.rb
+++ b/test/lib/thermite/config_test.rb
@@ -99,13 +99,15 @@ def test_cargo_shared_library_windows
     end
 
     def test_tarball_filename
-      config.stubs(:library_name).returns('foobar')
-      config.stubs(:ruby_version).returns('ruby12')
-      config.stubs(:target_os).returns('c64')
-      config.stubs(:target_arch).returns('z80')
+      stub_tarball_filename_params(false)
       assert_equal 'foobar-0.1.2-ruby12-c64-z80.tar.gz', config.tarball_filename('0.1.2')
     end
 
+    def test_tarball_filename_with_static_extension
+      stub_tarball_filename_params(true)
+      assert_equal 'foobar-0.1.2-ruby12-c64-z80-static.tar.gz', config.tarball_filename('0.1.2')
+    end
+
     def test_default_ruby_toplevel_dir
       FileUtils.stubs(:pwd).returns('/tmp/foobar')
       assert_equal '/tmp/foobar', config.ruby_toplevel_dir
@@ -194,6 +196,21 @@ def test_toml_config
       assert_equal expected, config(cargo_project_path: fixtures_path('config')).toml_config
     end
 
+    def test_static_extension_sans_env_var
+      ENV.stubs(:key?).with('RUBY_STATIC').returns(false)
+      RbConfig::CONFIG.stubs(:[]).with('ENABLE_SHARED').returns('yes')
+      refute config.static_extension?
+
+      RbConfig::CONFIG.stubs(:[]).with('ENABLE_SHARED').returns('no')
+      assert config.static_extension?
+    end
+
+    def test_static_extension_with_env_var
+      ENV.stubs(:key?).with('RUBY_STATIC').returns(true)
+      RbConfig::CONFIG.stubs(:[]).with('ENABLE_SHARED').returns('yes')
+      assert config.static_extension?
+    end
+
     private
 
     def config(options = {})
@@ -203,5 +220,13 @@ def config(options = {})
     def described_class
       Thermite::Config
     end
+
+    def stub_tarball_filename_params(static_extension)
+      config.stubs(:library_name).returns('foobar')
+      config.stubs(:ruby_version).returns('ruby12')
+      config.stubs(:target_os).returns('c64')
+      config.stubs(:target_arch).returns('z80')
+      config.stubs(:static_extension?).returns(static_extension)
+    end
   end
 end