blob: e5f0141887cd72687fd7a07a7641e3ea792e064f [file] [log] [blame]
// 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.analysis.buildinfo;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.ArtifactRoot;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.cmdline.RepositoryName;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
import com.google.devtools.build.lib.vfs.PathFragment;
import java.io.Serializable;
/**
* A factory for language-specific build-info files. Use this to translate the build-info into
* target-independent language-specific files. The generated actions are registered into the action
* graph on every build, but only executed if anything depends on them.
*/
public interface BuildInfoFactory extends Serializable {
/**
* Type of the build-data artifact.
*/
enum BuildInfoType {
/**
* Ignore changes to this file for the purposes of determining whether an action needs to be
* re-executed. I.e., the action is only re-executed if at least one other input has changed.
*/
NO_REBUILD,
/**
* Changes to this file trigger re-execution of actions, similar to source file changes.
*/
FORCE_REBUILD_IF_CHANGED;
}
/**
* Context for the creation of build-info artifacts.
*/
interface BuildInfoContext {
Artifact getBuildInfoArtifact(
PathFragment rootRelativePath, ArtifactRoot root, BuildInfoType type);
}
/**
* Build-info key for lookup from the {@link
* com.google.devtools.build.lib.analysis.AnalysisEnvironment}.
*/
@AutoCodec
final class BuildInfoKey {
private final String name;
public BuildInfoKey(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
@Override
public boolean equals(Object o) {
if (!(o instanceof BuildInfoKey)) {
return false;
}
return name.equals(((BuildInfoKey) o).name);
}
@Override
public int hashCode() {
return name.hashCode();
}
}
/**
* Create actions and artifacts for language-specific build-info files.
*/
BuildInfoCollection create(BuildInfoContext context, BuildConfiguration config,
Artifact buildInfo, Artifact buildChangelist, RepositoryName repositoryName);
/**
* Returns the key for the information created by this factory.
*/
BuildInfoKey getKey();
/**
* Returns false if this build info factory is disabled based on the configuration (usually by
* checking if all required configuration fragments are present).
*/
boolean isEnabled(BuildConfiguration config);
}