diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationIdentifier.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationIdentifier.java | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationIdentifier.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationIdentifier.java new file mode 100644 index 0000000000..1111189101 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationIdentifier.java @@ -0,0 +1,132 @@ +// Copyright 2014 Google Inc. 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.cpp; + +import com.google.devtools.build.lib.analysis.config.BuildConfiguration; +import com.google.devtools.build.lib.analysis.config.BuildOptions; +import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig; +import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CToolchain; + +import java.util.Objects; + +/** + * Contains parameters which uniquely describe a crosstool configuration + * and methods for comparing two crosstools against each other. + * + * <p>Two crosstools which contain equivalent values of these parameters are + * considered equal. + */ +public final class CrosstoolConfigurationIdentifier implements CrosstoolConfigurationOptions { + + /** The CPU associated with this crosstool configuration. */ + private final String cpu; + + /** The compiler (e.g. gcc) associated with this crosstool configuration. */ + private final String compiler; + + /** The version of libc (e.g. glibc-2.11) associated with this crosstool configuration. */ + private final String libc; + + private CrosstoolConfigurationIdentifier(String cpu, String compiler, String libc) { + this.cpu = cpu; + this.compiler = compiler; + this.libc = libc; + } + + /** + * Creates a new crosstool configuration from the given crosstool release and + * configuration options. + */ + public static CrosstoolConfigurationIdentifier fromReleaseAndCrosstoolConfiguration( + CrosstoolConfig.CrosstoolRelease release, BuildOptions buildOptions) { + String cpu = buildOptions.get(BuildConfiguration.Options.class).getCpu(); + if (cpu == null) { + cpu = release.getDefaultTargetCpu(); + } + CppOptions cppOptions = buildOptions.get(CppOptions.class); + return new CrosstoolConfigurationIdentifier(cpu, cppOptions.cppCompiler, cppOptions.glibc); + } + + public static CrosstoolConfigurationIdentifier fromToolchain(CToolchain toolchain) { + return new CrosstoolConfigurationIdentifier( + toolchain.getTargetCpu(), toolchain.getCompiler(), toolchain.getTargetLibc()); + } + + @Override + public boolean equals(Object other) { + if (!(other instanceof CrosstoolConfigurationIdentifier)) { + return false; + } + CrosstoolConfigurationIdentifier otherCrosstool = (CrosstoolConfigurationIdentifier) other; + return Objects.equals(cpu, otherCrosstool.cpu) + && Objects.equals(compiler, otherCrosstool.compiler) + && Objects.equals(libc, otherCrosstool.libc); + } + + @Override + public int hashCode() { + return Objects.hash(cpu, compiler, libc); + } + + + /** + * Returns a series of command line flags which specify the configuration options. + * Any of these options may be null, in which case its flag is omitted. + * + * <p>The appended string will be along the lines of + * " --cpu='cpu' --compiler='compiler' --glibc='libc'". + */ + public String describeFlags() { + StringBuilder message = new StringBuilder(); + if (getCpu() != null) { + message.append(" --cpu='").append(getCpu()).append("'"); + } + if (getCompiler() != null) { + message.append(" --compiler='").append(getCompiler()).append("'"); + } + if (getLibc() != null) { + message.append(" --glibc='").append(getLibc()).append("'"); + } + return message.toString(); + } + + /** Returns true if the specified toolchain is a candidate for use with this crosstool. */ + public boolean isCandidateToolchain(CToolchain toolchain) { + return (toolchain.getTargetCpu().equals(getCpu()) + && (getLibc() == null || toolchain.getTargetLibc().equals(getLibc())) + && (getCompiler() == null || toolchain.getCompiler().equals( + getCompiler()))); + } + + @Override + public String toString() { + return describeFlags(); + } + + @Override + public String getCpu() { + return cpu; + } + + @Override + public String getCompiler() { + return compiler; + } + + @Override + public String getLibc() { + return libc; + } +} |