diff options
author | Yun Peng <pcloudy@google.com> | 2016-06-10 12:45:12 +0000 |
---|---|---|
committer | Dmitry Lomov <dslomov@google.com> | 2016-06-10 13:41:22 +0000 |
commit | 2eda8c13243c4603fbc8d2b6865d672cde4e2024 (patch) | |
tree | 13c5f90878a30423467f5931c72a674ff22da286 /src/main/java/com/google/devtools/build/lib/rules/cpp | |
parent | c72fac6c1fd04840059b563c1ff882205ef9a03d (diff) |
Rollback of commit 0150e7fa5963fa569d9795c02fd3afe3c52ff30c.
*** Reason for rollback ***
--
MOS_MIGRATED_REVID=124553522
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/cpp')
6 files changed, 52 insertions, 17 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 a83f9b85ec..8ccd6e1dea 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 @@ -83,6 +83,7 @@ public final class CcCommon { * Features we request to enable unless a rule explicitly doesn't support them. */ private static final ImmutableSet<String> DEFAULT_FEATURES = ImmutableSet.of( + CppRuleClasses.DEPENDENCY_FILE, CppRuleClasses.COMPILE_ACTION_FLAGS_IN_FLAG_SET, CppRuleClasses.RANDOM_SEED, CppRuleClasses.MODULE_MAPS, diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java index 86ab21f09a..b2ca7a23b7 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java @@ -1340,22 +1340,6 @@ public class CppCompileAction extends AbstractAction } } - // Enable <object>.d file generation. - if (dotdFile != null) { - // Gcc options: - // -MD turns on .d file output as a side-effect (doesn't imply -E) - // -MM[D] enables user includes only, not system includes - // -MF <name> specifies the dotd file name - // Issues: - // -M[M] alone subverts actual .o output (implies -E) - // -M[M]D alone breaks some of the .d naming assumptions - // This combination gets user and system includes with specified name: - // -MD -MF <name> - options.add("-MD"); - options.add("-MF"); - options.add(dotdFile.getSafeExecPath().getPathString()); - } - if (!featureConfiguration.isEnabled("compile_action_flags_in_flag_set")) { if (FileType.contains(outputFile, CppFileTypes.ASSEMBLER, CppFileTypes.PIC_ASSEMBLER)) { options.add("-S"); diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java index 1997dc84a2..015d76d6a9 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java @@ -426,6 +426,10 @@ public class CppCompileActionBuilder { return this; } + public DotdFile getDotdFile() { + return this.dotdFile; + } + public CppCompileActionBuilder setGcnoFile(Artifact gcnoFile) { this.gcnoFile = gcnoFile; return this; 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 07e87246ee..3c4ac5f3c0 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 @@ -692,6 +692,38 @@ public class CppConfiguration extends BuildConfiguration.Fragment { return toolchain; } try { + if (!features.contains("dependency_file")) { + // Gcc options: + // -MD turns on .d file output as a side-effect (doesn't imply -E) + // -MM[D] enables user includes only, not system includes + // -MF <name> specifies the dotd file name + // Issues: + // -M[M] alone subverts actual .o output (implies -E) + // -M[M]D alone breaks some of the .d naming assumptions + // This combination gets user and system includes with specified name: + // -MD -MF <name> + TextFormat.merge("" + + "feature {" + + " name: 'dependency_file'" + + " flag_set {" + + " action: 'assemble'" + + " action: 'preprocess-assemble'" + + " action: 'c-compile'" + + " action: 'c++-compile'" + + " action: 'c++-module-compile'" + + " action: 'objc-compile'" + + " action: 'objc++-compile'" + + " expand_if_all_available: 'dependency_file'" + + " flag_group {" + + " flag: '-MD'" + + " flag: '-MF'" + + " flag: '%{dependency_file}'" + + " }" + + " }" + + "}", + toolchainBuilder); + } + if (!features.contains("random_seed")) { // GCC and Clang give randomized names to symbols which are defined in // an anonymous namespace but have external linkage. To make diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java index 1f2d45f6a2..2569b4d9ea 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java @@ -29,6 +29,7 @@ import com.google.devtools.build.lib.packages.BuildType; import com.google.devtools.build.lib.rules.cpp.CcCompilationOutputs.Builder; import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration; import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.Variables.VariablesExtension; +import com.google.devtools.build.lib.rules.cpp.CppCompileAction.DotdFile; import com.google.devtools.build.lib.rules.cpp.Link.LinkStaticness; import com.google.devtools.build.lib.rules.cpp.Link.LinkTargetType; import com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink; @@ -369,10 +370,11 @@ public final class CppModel { CppCompilationContext builderContext = builder.getContext(); CppModuleMap cppModuleMap = builderContext.getCppModuleMap(); + Artifact sourceFile = builder.getSourceFile(); Artifact outputFile = builder.getOutputFile(); String realOutputFilePath; - buildVariables.addVariable("source_file", builder.getSourceFile().getExecPathString()); + buildVariables.addVariable("source_file", sourceFile.getExecPathString()); buildVariables.addVariable("output_file", outputFile.getExecPathString()); if (fake) { @@ -391,6 +393,13 @@ public final class CppModel { buildVariables.addVariable("output_object_file", realOutputFilePath); } + DotdFile dotdFile = CppFileTypes.mustProduceDotdFile(sourceFile.getPath().toString()) + ? Preconditions.checkNotNull(builder.getDotdFile()) : null; + // Set dependency_file to enable <object>.d file generation. + if (dotdFile != null) { + buildVariables.addVariable("dependency_file", dotdFile.getSafeExecPath().getPathString()); + } + if (featureConfiguration.isEnabled(CppRuleClasses.MODULE_MAPS) && cppModuleMap != null) { // If the feature is enabled and cppModuleMap is null, we are about to fail during analysis // in any case, but don't crash. diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppRuleClasses.java index 3a2add3f32..d8987bb8ec 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppRuleClasses.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppRuleClasses.java @@ -109,6 +109,11 @@ public class CppRuleClasses { public static final String COMPILE_ACTION_FLAGS_IN_FLAG_SET = "compile_action_flags_in_flag_set"; /** + * A string constant for the dependency_file feature. This feature generates the .d file. + */ + public static final String DEPENDENCY_FILE = "dependency_file"; + + /** * A string constant for the module_map_home_cwd feature. */ public static final String MODULE_MAP_HOME_CWD = "module_map_home_cwd"; |