From d2d6fb04a95eb6ef8cddf5a598523c70b13249a8 Mon Sep 17 00:00:00 2001 From: Gleb Mazovetskiy Date: Sat, 17 Nov 2018 09:52:29 +0000 Subject: [PATCH] Update libsass to master + other fixes Updates libsass to master to incorporate fixes for: 1. The :not selector. Fixes #91. https://github.com/sass/libsass/issues/2697 2. Default precision changed to 10. https://github.com/sass/libsass/issues/2716 3. Now builds with `cc` instead of hard-coding `gcc`. https://github.com/sass/libsass/issues/2707 4. Building on Linux and Solaris. https://github.com/sass/libsass/pull/2720 Also: 1. Adds Windows RubyInstaller compilation support via `rake-compiler`. Fixes #18. 2. Fixes `load_paths` separator on Windows. Fixes #93. 3. Changes the location of `libsass.so` from `ext/` to `lib/`. Fixes #95. --- .gitignore | 1 + .gitmodules | 2 +- README.md | 2 +- Rakefile | 11 ++++++++--- ext/Rakefile | 3 --- ext/extconf.rb | 32 ++++++++++++++++++++++++++++++++ ext/libsass | 2 +- lib/sassc/engine.rb | 2 +- lib/sassc/native.rb | 2 +- lib/tasks/libsass.rb | 33 --------------------------------- sassc.gemspec | 18 +++++++++--------- test/engine_test.rb | 2 +- test/native_test.rb | 2 +- 13 files changed, 57 insertions(+), 55 deletions(-) delete mode 100644 ext/Rakefile create mode 100644 ext/extconf.rb delete mode 100644 lib/tasks/libsass.rb diff --git a/.gitignore b/.gitignore index e97ca2fe..65492a94 100644 --- a/.gitignore +++ b/.gitignore @@ -12,5 +12,6 @@ *.so *.o *.a +*.gem mkmf.log vendor/bundle diff --git a/.gitmodules b/.gitmodules index 1d1b46ab..e762dbbd 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "ext/libsass"] path = ext/libsass - url = git://github.com/sass/libsass.git + url = https://github.com/sass/libsass.git diff --git a/README.md b/README.md index 31083f6b..5830be1e 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ This gem combines the speed of `libsass`, the [Sass C implementation](https://gi ### libsass Version -[3.5.2](https://github.com/sass/libsass/releases/tag/3.5.2) +[d225a09a](https://github.com/sass/libsass/commit/d225a09a152050d569c077f97bb944c8dc819d6f) ## Installation diff --git a/Rakefile b/Rakefile index 13e97e8a..2f6f7522 100644 --- a/Rakefile +++ b/Rakefile @@ -4,12 +4,17 @@ rescue LoadError puts 'Cannot load bundler/gem_tasks' end -require 'tasks/libsass' - task default: :test +require 'rake/extensiontask' +Rake::ExtensionTask.new do |ext| + ext.name = 'libsass' + ext.ext_dir = 'ext' + ext.lib_dir = 'lib/sassc' +end + desc "Run all tests" -task test: 'libsass:compile' do +task test: 'compile:libsass' do $LOAD_PATH.unshift('lib', 'test') Dir.glob('./test/**/*_test.rb') { |f| require f } end diff --git a/ext/Rakefile b/ext/Rakefile deleted file mode 100644 index a8ed3958..00000000 --- a/ext/Rakefile +++ /dev/null @@ -1,3 +0,0 @@ -require_relative '../lib/tasks/libsass' - -task default: 'libsass:compile' diff --git a/ext/extconf.rb b/ext/extconf.rb new file mode 100644 index 00000000..07544c0f --- /dev/null +++ b/ext/extconf.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +gem_root = File.expand_path('..', __dir__) +libsass_dir = File.join(gem_root, 'ext', 'libsass') + +if !File.directory?(libsass_dir) || Dir.empty?(libsass_dir) + Dir.chdir(gem_root) { system('git submodule update --init') } +end + +File.write 'Makefile', <<-MAKEFILE +ifndef DESTDIR + LIBSASS_OUT = #{gem_root}/lib/sassc/libsass.so +else + LIBSASS_OUT = $(DESTDIR)$(PREFIX)/libsass.so +endif + +SUB_DIR := #{libsass_dir} +SUB_TARGET := lib/libsass.so + +libsass.so:#{' clean' if ENV['CLEAN']} + $(MAKE) -C '$(SUB_DIR)' lib/libsass.so + cp '$(SUB_DIR)/lib/libsass.so' libsass.so + +install: libsass.so + cp libsass.so '$(LIBSASS_OUT)' + +clean: + $(MAKE) -C '$(SUB_DIR)' clean + rm -f '$(LIBSASS_OUT)' libsass.so + +.PHONY: clean install +MAKEFILE diff --git a/ext/libsass b/ext/libsass index 9cfe0df9..c51f442c 160000 --- a/ext/libsass +++ b/ext/libsass @@ -1 +1 @@ -Subproject commit 9cfe0df975945325e05d6dd39ee98224898d9a79 +Subproject commit c51f442c8c33d4d171adf6c5875cbfc7a9e1d1eb diff --git a/lib/sassc/engine.rb b/lib/sassc/engine.rb index ea01477e..ea624998 100644 --- a/lib/sassc/engine.rb +++ b/lib/sassc/engine.rb @@ -133,7 +133,7 @@ def output_style def load_paths paths = @options[:load_paths] - paths.join(":") if paths + paths.join(File::PATH_SEPARATOR) if paths end end end diff --git a/lib/sassc/native.rb b/lib/sassc/native.rb index 443dcbe1..74af7864 100644 --- a/lib/sassc/native.rb +++ b/lib/sassc/native.rb @@ -8,7 +8,7 @@ module Native spec = Gem.loaded_specs["sassc"] gem_root = spec.gem_dir - ffi_lib "#{gem_root}/ext/libsass/lib/libsass.so" + ffi_lib "#{gem_root}/lib/sassc/libsass.so" require_relative "native/sass_value" diff --git a/lib/tasks/libsass.rb b/lib/tasks/libsass.rb deleted file mode 100644 index 57ed47bd..00000000 --- a/lib/tasks/libsass.rb +++ /dev/null @@ -1,33 +0,0 @@ -# frozen_string_literal: true - -namespace :libsass do - desc "Compile libsass" - task :compile do - if Dir.pwd.end_with?('/ext') - libsass_path = "libsass" - else - libsass_path = "ext/libsass" - end - - cd libsass_path do - Rake::Task["lib/libsass.so"].invoke - end - end - - file "Makefile" do - sh "git submodule update --init" - end - - file "lib/libsass.so" => "Makefile" do - make_program = ENV['MAKE'] - make_program ||= case RUBY_PLATFORM - when /mswin/ - 'nmake' - when /(bsd|solaris)/ - 'gmake' - else - 'make' - end - sh "#{make_program} lib/libsass.so" - end -end diff --git a/sassc.gemspec b/sassc.gemspec index b92366f1..918d031d 100644 --- a/sassc.gemspec +++ b/sassc.gemspec @@ -23,26 +23,26 @@ Gem::Specification.new do |spec| spec.require_paths = ["lib"] - spec.extensions = ["ext/Rakefile"] + spec.platform = Gem::Platform::RUBY + spec.extensions = ["ext/extconf.rb"] spec.add_development_dependency "minitest", "~> 5.5.1" spec.add_development_dependency "minitest-around" spec.add_development_dependency "test_construct" spec.add_development_dependency "pry" spec.add_development_dependency "bundler" + spec.add_development_dependency "rake-compiler" spec.add_dependency "rake" spec.add_dependency "ffi", "~> 1.9" gem_dir = File.expand_path(File.dirname(__FILE__)) + "/" - `git submodule --quiet foreach pwd`.split($\).each do |submodule_path| - Dir.chdir(submodule_path) do - submodule_relative_path = submodule_path.sub gem_dir, "" - # issue git ls-files in submodule's directory and - # prepend the submodule path to create absolute file paths - `git ls-files`.split($\).each do |filename| - spec.files << "#{submodule_relative_path}/#{filename}" - end + + Dir.chdir(File.join(gem_dir, 'ext', 'libsass')) do + submodule_relative_path = File.join('ext', 'libsass') + `git ls-files`.split($\).each do |filename| + next if filename =~ %r{(^("?test|docs|script)/)|\.md$|\.yml$} + spec.files << File.join(submodule_relative_path, filename) end end diff --git a/test/engine_test.rb b/test/engine_test.rb index 33a1f26f..3225dc28 100644 --- a/test/engine_test.rb +++ b/test/engine_test.rb @@ -88,7 +88,7 @@ def test_precision_not_specified SCSS expected_output = <<-CSS .foo { - baz: 0.33333; } + baz: 0.3333333333; } CSS output = Engine.new(template).render assert_equal expected_output, output diff --git a/test/native_test.rb b/test/native_test.rb index 639e0e7c..0b75edd0 100644 --- a/test/native_test.rb +++ b/test/native_test.rb @@ -11,7 +11,7 @@ module NativeTest class General < MiniTest::Test def test_it_reports_the_libsass_version - assert_equal "3.5.2", Native.version + assert_equal "3.5.2-87-gd225", Native.version end end