| // Copyright 2014 The Bazel Authors. All rights reserved. |
| // |
| // Licensed 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 com.google.devtools.build.lib.rules.java; |
| |
| import com.google.devtools.build.lib.actions.Artifact; |
| import com.google.devtools.build.lib.collect.nestedset.NestedSet; |
| import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; |
| import com.google.devtools.build.lib.collect.nestedset.Order; |
| |
| /** Represents common aspects of all JVM targeting configured targets. */ |
| public final class ClasspathConfiguredFragment { |
| |
| private final NestedSet<Artifact> runtimeClasspath; |
| private final NestedSet<Artifact> compileTimeClasspath; |
| private final BootClassPathInfo bootClasspath; |
| |
| /** |
| * Initializes the runtime and compile time classpaths for this target. This method should be |
| * called during {@code initializationHook()} once a {@link JavaTargetAttributes} object for this |
| * target is fully initialized. |
| * |
| * @param attributes the processed attributes of this Java target |
| * @param isNeverLink whether to leave runtimeClasspath empty |
| */ |
| public ClasspathConfiguredFragment( |
| JavaCompilationArtifacts javaArtifacts, |
| JavaTargetAttributes attributes, |
| boolean isNeverLink, |
| BootClassPathInfo bootClasspath) { |
| if (!isNeverLink) { |
| runtimeClasspath = getRuntimeClasspathList(attributes, javaArtifacts); |
| } else { |
| runtimeClasspath = NestedSetBuilder.emptySet(Order.NAIVE_LINK_ORDER); |
| } |
| compileTimeClasspath = attributes.getCompileTimeClassPath(); |
| this.bootClasspath = bootClasspath; |
| } |
| |
| public ClasspathConfiguredFragment() { |
| runtimeClasspath = NestedSetBuilder.emptySet(Order.NAIVE_LINK_ORDER); |
| compileTimeClasspath = NestedSetBuilder.emptySet(Order.NAIVE_LINK_ORDER); |
| bootClasspath = BootClassPathInfo.empty(); |
| } |
| |
| /** |
| * Returns the runtime class path. It consists of the concatenation of the instrumentation class |
| * path, output jars and the runtime time class path of the transitive dependencies of this rule. |
| * |
| * @param attributes the processed attributes of this Java target |
| * @return a {@List} of artifacts that comprise the runtime class path. |
| */ |
| private NestedSet<Artifact> getRuntimeClasspathList( |
| JavaTargetAttributes attributes, JavaCompilationArtifacts javaArtifacts) { |
| NestedSetBuilder<Artifact> builder = NestedSetBuilder.naiveLinkOrder(); |
| builder.addAll(javaArtifacts.getRuntimeJars()); |
| builder.addTransitive(attributes.getRuntimeClassPath()); |
| return builder.build(); |
| } |
| |
| /** |
| * Returns the classpath to be passed to the JVM when running a target containing this fragment. |
| */ |
| public NestedSet<Artifact> getRuntimeClasspath() { |
| return runtimeClasspath; |
| } |
| |
| /** |
| * Returns the classpath to be passed to the Java compiler when compiling a target containing this |
| * fragment. |
| */ |
| public NestedSet<Artifact> getCompileTimeClasspath() { |
| return compileTimeClasspath; |
| } |
| |
| /** |
| * Returns the classpath to be passed as a boot classpath to the Java compiler when compiling a |
| * target containing this fragment. |
| */ |
| public BootClassPathInfo getBootClasspath() { |
| return bootClasspath; |
| } |
| } |