aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2018-06-20 18:30:27 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-06-20 18:32:02 -0700
commitf463dec7a03e5dbf9d40024b90b8620972f44c5f (patch)
treeb60ee0ebe6e8886b108e521ae2ee3ffd05caadd3 /src
parent98c09748044c27c3b6b57edc3f42b2323ead29ec (diff)
Add a minimum_os_version flag that is platform agnostic.
This corresponds to the os version in the clang target triple, though clang does have corresponding os_version_min flags for Apple platforms. Currently, Bazel has --XX_minimum_os flags for XX values corresponding to Apple platforms. This flag is the generic version of that (and can and will be set after the Apple split transition, and will eventually be set in the Android split as well) to support various Android API level improvements for native code. PiperOrigin-RevId: 201453961
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java8
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/cpp/CompileBuildVariablesTest.java25
5 files changed, 51 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
index 097b809f7e..1ddb027b6c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
@@ -81,6 +81,9 @@ public final class CcCommon {
/** Name of the build variable for the path to the input file being processed. */
public static final String INPUT_FILE_VARIABLE_NAME = "input_file";
+ /** Name of the build variable for the minimum_os_version being targeted. */
+ public static final String MINIMUM_OS_VERSION_VARIABLE_NAME = "minimum_os_version";
+
public static final String PIC_CONFIGURATION_ERROR =
"PIC compilation is requested but the toolchain does not support it";
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java
index ffad5c5084..6de5145463 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java
@@ -879,6 +879,13 @@ public class CcToolchain implements RuleConfiguredTargetFactory {
RuleContext ruleContext, PathFragment defaultSysroot) throws RuleErrorException {
CcToolchainVariables.Builder variables = new CcToolchainVariables.Builder();
+ CppConfiguration cppConfiguration =
+ Preconditions.checkNotNull(ruleContext.getFragment(CppConfiguration.class));
+ String minOsVersion = cppConfiguration.getMinimumOsVersion();
+ if (minOsVersion != null) {
+ variables.addStringVariable(CcCommon.MINIMUM_OS_VERSION_VARIABLE_NAME, minOsVersion);
+ }
+
PathFragment sysroot = calculateSysroot(ruleContext, defaultSysroot);
if (sysroot != null) {
variables.addStringVariable(CcCommon.SYSROOT_VARIABLE_NAME, sysroot.getPathString());
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
index d8337f6160..12aa64382d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
@@ -38,6 +38,7 @@ import com.google.devtools.build.lib.rules.cpp.CrosstoolConfigurationLoader.Cros
import com.google.devtools.build.lib.rules.cpp.Link.LinkingMode;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
import com.google.devtools.build.lib.skylarkbuildapi.cpp.CppConfigurationApi;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig;
@@ -757,6 +758,13 @@ public final class CppConfiguration extends BuildConfiguration.Fragment
return ldExecutable != null ? ldExecutable.getPathString() : "";
}
+ @SkylarkCallable(
+ name = "minimum_os_version",
+ doc = "The minimum OS version for C/C++ compilation.")
+ public String getMinimumOsVersion() {
+ return cppOptions.minimumOsVersion;
+ }
+
/** Returns the value of the --dynamic_mode flag. */
public DynamicMode getDynamicModeFlag() {
return cppOptions.dynamicMode;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java
index d06e6a78a5..ac7a1f6e31 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java
@@ -151,6 +151,14 @@ public class CppOptions extends FragmentOptions {
)
public String outputDirectoryTag;
+ @Option(
+ name = "minimum_os_version",
+ defaultValue = "null",
+ documentationCategory = OptionDocumentationCategory.TOOLCHAIN,
+ effectTags = {OptionEffectTag.LOADING_AND_ANALYSIS, OptionEffectTag.AFFECTS_OUTPUTS},
+ help = "The minimum OS version which your compilation targets.")
+ public String minimumOsVersion;
+
// O intrepid reaper of unused options: Be warned that the [no]start_end_lib
// option, however tempting to remove, has a use case. Look in our telemetry data.
@Option(
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CompileBuildVariablesTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CompileBuildVariablesTest.java
index 296a530f45..5e6ded37b1 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CompileBuildVariablesTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CompileBuildVariablesTest.java
@@ -165,4 +165,29 @@ public class CompileBuildVariablesTest extends BuildViewTestCase {
assertThat(variables.getStringVariable(CcCommon.SYSROOT_VARIABLE_NAME))
.isEqualTo("/usr/local/custom-sysroot");
}
+
+ @Test
+ public void testPresenceOfMinOsVersionBuildVariable() throws Exception {
+ AnalysisMock.get()
+ .ccSupport()
+ .setupCrosstool(
+ mockToolsConfig,
+ "feature {"
+ + " name: 'min_os_version_flag'"
+ + " flag_set {"
+ + " action: 'c++-compile'"
+ + " expand_if_all_available: 'minimum_os_version'"
+ + " flag_group {"
+ + " flag: '-DMIN_OS=%{minimum_os_version}'"
+ + " }"
+ + " }"
+ + "}");
+ useConfiguration("--minimum_os_version=6");
+ scratch.file("x/BUILD", "cc_binary(name = 'bin', srcs = ['bin.cc'])");
+ scratch.file("x/bin.cc");
+
+ CcToolchainVariables variables = getCompileBuildVariables("//x:bin", "bin");
+ assertThat(variables.getStringVariable(CcCommon.MINIMUM_OS_VERSION_VARIABLE_NAME))
+ .isEqualTo("6");
+ }
}