| // Copyright 2017 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.config; |
| |
| import com.google.devtools.build.lib.util.CPU; |
| import com.google.devtools.build.lib.util.OS; |
| import com.google.devtools.build.lib.util.Pair; |
| import com.google.devtools.common.options.Converter; |
| import com.google.devtools.common.options.OptionsParsingException; |
| |
| /** |
| * Converter to auto-detect the cpu of the machine on which Bazel runs. |
| * |
| * <p>If the compilation happens remotely then the cpu of the remote machine might be different from |
| * the auto-detected one and the --cpu and --host_cpu options must be set explicitly. |
| */ |
| public class AutoCpuConverter implements Converter<String> { |
| @Override |
| public String convert(String input) throws OptionsParsingException { |
| if (input.isEmpty()) { |
| // TODO(philwo) - replace these deprecated names with more logical ones (e.g. k8 becomes |
| // linux-x86_64, darwin includes the CPU architecture, ...). |
| switch (OS.getCurrent()) { |
| case DARWIN: |
| switch (CPU.getCurrent()) { |
| case X86_64: |
| return "darwin"; |
| case AARCH64: |
| return "darwin_arm64"; |
| default: |
| return "unknown"; |
| } |
| case FREEBSD: |
| return "freebsd"; |
| case OPENBSD: |
| return "openbsd"; |
| case WINDOWS: |
| switch (CPU.getCurrent()) { |
| case X86_64: |
| return "x64_windows"; |
| case AARCH64: |
| return "arm64_windows"; |
| default: |
| // We only support x64 and arm64 Windows for now. |
| return "unknown"; |
| } |
| case LINUX: |
| switch (CPU.getCurrent()) { |
| case X86_32: |
| return "piii"; |
| case X86_64: |
| return "k8"; |
| case PPC: |
| return "ppc"; |
| case ARM: |
| return "arm"; |
| case AARCH64: |
| return "aarch64"; |
| case S390X: |
| return "s390x"; |
| case MIPS64: |
| return "mips64"; |
| case RISCV64: |
| return "riscv64"; |
| default: |
| return "unknown"; |
| } |
| default: |
| return "unknown"; |
| } |
| } |
| return input; |
| } |
| |
| /** Reverses the conversion performed by {@link #convert} to return the matching OS, CPU pair. */ |
| public static Pair<CPU, OS> reverse(String input) { |
| if (input == null || input.length() == 0 || "unknown".equals(input)) { |
| // Use the auto-detected values. |
| return Pair.of(CPU.getCurrent(), OS.getCurrent()); |
| } |
| |
| // Handle the easy cases. |
| if (input.startsWith("darwin")) { |
| return Pair.of(CPU.getCurrent(), OS.DARWIN); |
| } else if (input.startsWith("freebsd")) { |
| return Pair.of(CPU.getCurrent(), OS.FREEBSD); |
| } else if (input.startsWith("openbsd")) { |
| return Pair.of(CPU.getCurrent(), OS.OPENBSD); |
| } else if (input.startsWith("x64_windows")) { |
| return Pair.of(CPU.getCurrent(), OS.WINDOWS); |
| } |
| |
| // Handle the Linux cases. |
| switch (input) { |
| case "piii": |
| return Pair.of(CPU.X86_32, OS.LINUX); |
| case "k8": |
| return Pair.of(CPU.X86_64, OS.LINUX); |
| case "ppc": |
| return Pair.of(CPU.PPC, OS.LINUX); |
| case "arm": |
| return Pair.of(CPU.ARM, OS.LINUX); |
| case "s390x": |
| return Pair.of(CPU.S390X, OS.LINUX); |
| case "mips64": |
| return Pair.of(CPU.MIPS64, OS.LINUX); |
| case "riscv64": |
| return Pair.of(CPU.RISCV64, OS.LINUX); |
| default: |
| // fall through |
| } |
| |
| // Use the auto-detected values. |
| return Pair.of(CPU.getCurrent(), OS.getCurrent()); |
| } |
| |
| @Override |
| public String getTypeDescription() { |
| return "a string"; |
| } |
| } |