blob: 70fe4e0ee56bc1a3aefe7ca9d21a80fed5a21359 [file] [log] [blame]
// Copyright 2016 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;
import static com.google.common.truth.Truth.assertThat;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.TemplateVariableInfo;
import com.google.devtools.build.lib.analysis.ToolchainContext.ResolvedToolchainProviders;
import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
import com.google.devtools.build.lib.analysis.util.ScratchAttributeWriter;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.packages.util.MockPlatformSupport;
import com.google.devtools.build.lib.rules.cpp.CcToolchainProvider;
import com.google.devtools.build.lib.rules.cpp.CppCompileAction;
import com.google.devtools.build.lib.testutil.TestConstants;
import java.util.Map;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/** Unit tests for the {@code toolchain_type} rule. */
@RunWith(JUnit4.class)
public class ToolchainTypeTest extends BuildViewTestCase {
@Test
public void testSmoke() throws Exception {
ConfiguredTarget cc =
getConfiguredTarget(TestConstants.TOOLS_REPOSITORY + "//tools/cpp:toolchain_type");
assertThat(cc.get(TemplateVariableInfo.PROVIDER).getVariables())
.containsKey("TARGET_CPU");
}
@Test
public void testCcToolchainDoesNotProvideJavaMakeVariables() throws Exception {
ConfiguredTarget cc =
getConfiguredTarget(TestConstants.TOOLS_REPOSITORY + "//tools/cpp:toolchain_type");
assertThat(cc.get(TemplateVariableInfo.PROVIDER).getVariables()).doesNotContainKey("JAVABASE");
}
@Test
public void testMakeVariablesFromToolchain() throws Exception {
MockPlatformSupport.addMockPiiiPlatform(
mockToolsConfig, analysisMock.ccSupport().getMockCrosstoolLabel());
useConfiguration(
"--enabled_toolchain_types="
+ TestConstants.TOOLS_REPOSITORY
+ "//tools/cpp:toolchain_type",
"--experimental_platforms=//mock_platform:mock-piii-platform",
"--extra_toolchains=//mock_platform:toolchain_cc-compiler-piii",
"--make_variables_source=toolchain");
ConfiguredTarget cc =
getConfiguredTarget(TestConstants.TOOLS_REPOSITORY + "//tools/cpp:toolchain_type");
assertThat(cc.get(TemplateVariableInfo.PROVIDER).getVariables())
.containsEntry("TARGET_CPU", "piii");
}
@Test
public void testGlibcVersionSetInEnv() throws Exception {
MockPlatformSupport.addMockPiiiPlatform(
mockToolsConfig, analysisMock.ccSupport().getMockCrosstoolLabel());
useConfiguration(
"--enabled_toolchain_types="
+ TestConstants.TOOLS_REPOSITORY
+ "//tools/cpp:toolchain_type",
"--experimental_platforms=//mock_platform:mock-piii-platform",
"--extra_toolchains=//mock_platform:toolchain_cc-compiler-piii",
"--make_variables_source=toolchain");
ConfiguredTarget toolchainType =
getConfiguredTarget(TestConstants.TOOLS_REPOSITORY + "//tools/cpp:toolchain_type");
Map<String, String> makeVariables =
toolchainType.get(TemplateVariableInfo.PROVIDER).getVariables();
ConfiguredTarget target =
ScratchAttributeWriter.fromLabelString(this, "cc_library", "//lib")
.setList("srcs", "a.cc")
.write();
ResolvedToolchainProviders providers =
(ResolvedToolchainProviders)
getRuleContext(target).getToolchainContext().getResolvedToolchainProviders();
CcToolchainProvider toolchainProvider =
(CcToolchainProvider)
providers.getForToolchainType(
Label.parseAbsolute(TestConstants.TOOLS_REPOSITORY + "//tools/cpp:toolchain_type"));
String targetLibc = toolchainProvider.getTargetLibc();
String glibcVersion = makeVariables.get("GLIBC_VERSION");
assertThat(glibcVersion).isNotNull();
if (targetLibc.startsWith("glibc-")) {
assertThat(glibcVersion).isEqualTo(targetLibc.substring("glibc-".length()));
} else {
assertThat(glibcVersion).isEqualTo(targetLibc);
}
}
@Test
public void testCcTargetsDependOnCcToolchainAutomatically() throws Exception {
MockPlatformSupport.addMockPiiiPlatform(
mockToolsConfig, analysisMock.ccSupport().getMockCrosstoolLabel());
useConfiguration(
"--enabled_toolchain_types="
+ TestConstants.TOOLS_REPOSITORY
+ "//tools/cpp:toolchain_type",
"--experimental_platforms=//mock_platform:mock-piii-platform",
"--extra_toolchains=//mock_platform:toolchain_cc-compiler-piii",
"--make_variables_source=toolchain");
// for cc_library, cc_binary, and cc_test, we check that $(TARGET_CPU) is a valid Make variable
ConfiguredTarget cclibrary =
ScratchAttributeWriter.fromLabelString(this, "cc_library", "//cclib")
.setList("srcs", "a.cc")
.setList("copts", "foobar$(TARGET_CPU)")
.write();
CppCompileAction compileAction =
(CppCompileAction) getGeneratingAction(getBinArtifact("_objs/cclib/cclib/a.o", cclibrary));
assertThat(compileAction.getArguments()).contains("foobarpiii");
ConfiguredTarget ccbinary =
ScratchAttributeWriter.fromLabelString(this, "cc_binary", "//ccbin")
.setList("srcs", "a.cc")
.setList("copts", "foobar$(TARGET_CPU)")
.write();
compileAction =
(CppCompileAction) getGeneratingAction(getBinArtifact("_objs/ccbin/ccbin/a.o", ccbinary));
assertThat(compileAction.getArguments()).contains("foobarpiii");
ConfiguredTarget cctest =
ScratchAttributeWriter.fromLabelString(this, "cc_test", "//cctest")
.setList("srcs", "a.cc")
.setList("copts", "foobar$(TARGET_CPU)")
.write();
compileAction =
(CppCompileAction) getGeneratingAction(getBinArtifact("_objs/cctest/cctest/a.o", cctest));
assertThat(compileAction.getArguments()).contains("foobarpiii");
}
}