You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@buildr.apache.org by to...@apache.org on 2016/08/16 06:37:14 UTC
buildr git commit: Bring back zinc compiler,
using the latest version and a runner class
Repository: buildr
Updated Branches:
refs/heads/master c0c415558 -> 749acfe1e
Bring back zinc compiler, using the latest version and a runner class
Project: http://git-wip-us.apache.org/repos/asf/buildr/repo
Commit: http://git-wip-us.apache.org/repos/asf/buildr/commit/749acfe1
Tree: http://git-wip-us.apache.org/repos/asf/buildr/tree/749acfe1
Diff: http://git-wip-us.apache.org/repos/asf/buildr/diff/749acfe1
Branch: refs/heads/master
Commit: 749acfe1ec6f24bd4064c4942d0ebcd6394caf89
Parents: c0c4155
Author: Antoine Toulme <an...@lunar-ocean.com>
Authored: Mon Aug 15 23:37:02 2016 -0700
Committer: Antoine Toulme <an...@lunar-ocean.com>
Committed: Mon Aug 15 23:37:02 2016 -0700
----------------------------------------------------------------------
doc/languages.textile | 34 ++++++++++
lib/buildr/scala/compiler.rb | 55 ++++++++++++++--
.../scala/org/apache/buildr/ZincRunner.class | Bin 0 -> 1162 bytes
.../scala/org/apache/buildr/ZincRunner.java | 37 +++++++++++
spec/scala/compiler_spec.rb | 62 ++++++++++++++++++-
5 files changed, 183 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/buildr/blob/749acfe1/doc/languages.textile
----------------------------------------------------------------------
diff --git a/doc/languages.textile b/doc/languages.textile
index ec1b985..09252e2 100644
--- a/doc/languages.textile
+++ b/doc/languages.textile
@@ -238,6 +238,8 @@ h4. Fast Scala Compiler
You may use @fsc@, the Fast Scala Compiler, which submits compilation jobs to a compilation daemon, by setting the environment variable @USE_FSC@ to @yes@. Note that @fsc@ _may_ cache class libraries -- don't forget to run @fsc -reset@ if you upgrade a library.
+(Note @fsc@ is not compatible with @zinc@ incremental compilation.)
+
h4. Rebuild detection
*Scala 2.7*
@@ -268,6 +270,38 @@ To avoid unusual behavior, compiler-level change detection is disabled whenever
*Scala 2.9 and later*
+Starting with Buildr 1.4.8, Buildr integrates with the "Zinc":https://github.com/typesafehub/zinc incremental compilation wrapper for @scalac@. Incremental compilation can be enabled 3 ways,
+
+1) By setting the compiler's option directly,
+
+{% highlight ruby %}
+compile.using :incremental => true
+
+compile.options.incremental = true # same as above
+{% endhighlight %}
+
+Note that this won't enable incremental compilation for both @compile@ and @test.compile@, you would have to set options on both. For this reason, it's recommended that you set the option on the project instead (see below).
+
+2) By setting the project's @scalac_options.incremental@,
+
+{% highlight ruby %}
+project.scalac_options.incremental = true
+{% endhighlight %}
+
+3) By setting the global @scalac.incremental@ option,
+
+in your @buildfile@:
+
+{% highlight ruby %}
+Buildr.settings.build['scalac.incremental'] = true
+{% endhighlight %}
+
+or in your @build.yaml@:
+
+{% highlight yaml %}
+scalac.incremental: true
+{% endhighlight %}
+
h4. Support for different Scala versions
Buildr defaults to the latest stable Scala version available at the time of the release if neither @SCALA_HOME@ nor the @scala.version@ build property are set.
http://git-wip-us.apache.org/repos/asf/buildr/blob/749acfe1/lib/buildr/scala/compiler.rb
----------------------------------------------------------------------
diff --git a/lib/buildr/scala/compiler.rb b/lib/buildr/scala/compiler.rb
index 54bbafe..feb127c 100644
--- a/lib/buildr/scala/compiler.rb
+++ b/lib/buildr/scala/compiler.rb
@@ -87,7 +87,7 @@ module Buildr::Scala
# * :other -- Array of options to pass to the Scalac compiler as is, e.g. -Xprint-types
class Scalac < Buildr::Compiler::Base
- DEFAULT_ZINC_VERSION = '1.0.0-X1'
+ DEFAULT_ZINC_VERSION = '0.3.12'
DEFAULT_SBT_VERSION = '0.13.12'
DEFAULT_JLINE_VERSION = '2.14.2'
@@ -121,7 +121,9 @@ module Buildr::Scala
REQUIRES.artifacts.map(&:to_s)
end
- scala_dependencies.compact
+ zinc_dependencies = ZINC_REQUIRES.artifacts.map(&:to_s)
+
+ (scala_dependencies + zinc_dependencies).compact
end
def use_fsc
@@ -159,8 +161,10 @@ module Buildr::Scala
end
ZINC_REQUIRES = ArtifactNamespace.for(self) do |ns|
+ zinc_version = Buildr.settings.build['zinc.version'] || DEFAULT_ZINC_VERSION
sbt_version = Buildr.settings.build['sbt.version'] || DEFAULT_SBT_VERSION
jline_version = Buildr.settings.build['jline.version'] || DEFAULT_JLINE_VERSION
+ ns.zinc! "com.typesafe.zinc:zinc:jar:>=#{zinc_version}"
ns.sbt_interface! "com.typesafe.sbt:sbt-interface:jar:>=#{sbt_version}"
ns.incremental! "com.typesafe.sbt:incremental-compiler:jar:>=#{sbt_version}"
ns.compiler_interface_sources! "com.typesafe.sbt:compiler-interface:jar:sources:>=#{sbt_version}"
@@ -194,7 +198,11 @@ module Buildr::Scala
end
def compile(sources, target, dependencies) #:nodoc:
- compile_with_scalac(sources, target, dependencies)
+ if zinc?
+ compile_with_zinc(sources, target, dependencies)
+ else
+ compile_with_scalac(sources, target, dependencies)
+ end
end
def compile_with_scalac(sources, target, dependencies) #:nodoc:
@@ -249,6 +257,37 @@ module Buildr::Scala
end
end
+ def compile_with_zinc(sources, target, dependencies) #:nodoc:
+
+ dependencies.unshift target
+
+ cmd_args = []
+ cmd_args << '-sbt-interface' << REQUIRES.sbt_interface.artifact
+ cmd_args << '-compiler-interface' << REQUIRES.compiler_interface_sources.artifact
+ cmd_args << '-scala-library' << dependencies.find { |d| d =~ /scala-library/ }
+ cmd_args << '-scala-compiler' << dependencies.find { |d| d =~ /scala-compiler/ }
+ cmd_args << '-scala-extra' << dependencies.find { |d| d =~ /scala-reflect/ }
+ cmd_args << '-classpath' << (dependencies + [ File.join(File.dirname(__FILE__)) ]).join(File::PATH_SEPARATOR)
+ source_paths = sources.select { |source| File.directory?(source) }
+ cmd_args << '-Ssourcepath' << ("-S" + source_paths.join(File::PATH_SEPARATOR)) unless source_paths.empty?
+ cmd_args << '-d' << File.expand_path(target)
+ cmd_args += scalac_args
+ cmd_args << "-debug" if trace?(:scalac)
+
+ cmd_args.map!(&:to_s)
+
+ cmd_args += files_from_sources(sources)
+
+ unless Buildr.application.options.dryrun
+ trace((['org.apache.buildr.ZincRunner'] + cmd_args).join(' '))
+ begin
+ Java::Commands.java 'org.apache.buildr.ZincRunner', *(cmd_args + [{ :classpath => Scalac.dependencies + [ File.join(File.dirname(__FILE__)) ]}])
+ rescue => e
+ fail "Zinc compiler crashed:\n#{e.inspect}\n#{e.backtrace.join("\n")}"
+ end
+ end
+ end
+
protected
# :nodoc: see Compiler:Base
@@ -293,6 +332,10 @@ module Buildr::Scala
private
+ def zinc?
+ (options[:incremental] || @project.scalac_options.incremental || (Buildr.settings.build['scalac.incremental'].to_s == "true"))
+ end
+
def count(file, pattern)
count = 0
File.open(file, "r") do |infile|
@@ -322,7 +365,11 @@ module Buildr::Scala
args << "-optimise" if options[:optimise]
args << "-target:jvm-" + options[:target].to_s if options[:target]
args += Array(options[:other])
- args
+ if zinc?
+ args.map { |arg| "-S" + arg } + Array(options[:zinc_options])
+ else
+ args
+ end
end
end
http://git-wip-us.apache.org/repos/asf/buildr/blob/749acfe1/lib/buildr/scala/org/apache/buildr/ZincRunner.class
----------------------------------------------------------------------
diff --git a/lib/buildr/scala/org/apache/buildr/ZincRunner.class b/lib/buildr/scala/org/apache/buildr/ZincRunner.class
new file mode 100644
index 0000000..a60c7eb
Binary files /dev/null and b/lib/buildr/scala/org/apache/buildr/ZincRunner.class differ
http://git-wip-us.apache.org/repos/asf/buildr/blob/749acfe1/lib/buildr/scala/org/apache/buildr/ZincRunner.java
----------------------------------------------------------------------
diff --git a/lib/buildr/scala/org/apache/buildr/ZincRunner.java b/lib/buildr/scala/org/apache/buildr/ZincRunner.java
new file mode 100644
index 0000000..e8a6407
--- /dev/null
+++ b/lib/buildr/scala/org/apache/buildr/ZincRunner.java
@@ -0,0 +1,37 @@
+/* Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.buildr;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+
+public class ZincRunner {
+
+ public static void main(String[] args) {
+ try {
+ ClassLoader loader = Thread.currentThread().getContextClassLoader();
+ Class clazz = loader.loadClass("com.typesafe.zinc.Main$");
+ Field singleton = clazz.getField("MODULE$");
+ Object instance = singleton.get(null);
+ Method main = clazz.getMethod("main", String[].class);
+ main.invoke(instance, new Object[] { args });
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/buildr/blob/749acfe1/spec/scala/compiler_spec.rb
----------------------------------------------------------------------
diff --git a/spec/scala/compiler_spec.rb b/spec/scala/compiler_spec.rb
index 2c5206c..f28bbe6 100644
--- a/spec/scala/compiler_spec.rb
+++ b/spec/scala/compiler_spec.rb
@@ -272,7 +272,31 @@ share_as :ScalacCompiler_CommonOptions do
end
end
-describe 'scala compiler options' do
+
+describe 'scala compiler 2.8 options' do
+
+ it_should_behave_like ScalacCompiler_CommonOptions
+
+ def compile_task
+ @compile_task ||= define('foo').compile.using(:scalac)
+ end
+
+ def scalac_args
+ compile_task.instance_eval { @compiler }.send(:scalac_args)
+ end
+
+ it 'should use -g argument when debug option is true' do
+ compile_task.using(:debug=>true)
+ scalac_args.should include('-g')
+ end
+
+ it 'should not use -g argument when debug option is false' do
+ compile_task.using(:debug=>false)
+ scalac_args.should_not include('-g')
+ end
+end if Buildr::Scala.version?(2.8)
+
+describe 'scala compiler 2.9 options' do
it_should_behave_like ScalacCompiler_CommonOptions
@@ -304,5 +328,41 @@ describe 'scala compiler options' do
scalac_args.should_not include('-g')
end
+end if Buildr::Scala.version?(2.9)
+
+describe 'zinc compiler (enabled through Buildr.settings)' do
+ before :each do
+ Buildr.settings.build['scalac.incremental'] = true
+ end
+
+ it 'should compile with zinc' do
+ write 'src/main/scala/com/example/Test.scala', 'package com.example; class Test { val i = 1 }'
+ project = define('foo')
+ compile_task = project.compile.using(:scalac)
+ compiler = compile_task.instance_eval { @compiler }
+ compiler.send(:zinc?).should eql(true)
+ compiler.should_receive(:compile_with_zinc).once
+ compile_task.invoke
+ end
+
+ it_should_behave_like ScalacCompiler
+
+ after :each do
+ Buildr.settings.build['scalac.incremental'] = nil
+ end
+
end
+describe 'zinc compiler (enabled through project.scala_options)' do
+
+ it 'should compile with zinc' do
+ write 'src/main/scala/com/example/Test.scala', 'package com.example; class Test { val i = 1 }'
+ project = define('foo')
+ project.scalac_options.incremental = true
+ compile_task = project.compile.using(:scalac)
+ compiler = compile_task.instance_eval { @compiler }
+ compiler.send(:zinc?).should eql(true)
+ compiler.should_receive(:compile_with_zinc).once
+ compile_task.invoke
+ end
+end
\ No newline at end of file