diff options
6 files changed, 55 insertions, 15 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 a7b1c3f64b..a83f9b85ec 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.COMPILE_ACTION_FLAGS_IN_FLAG_SET, CppRuleClasses.RANDOM_SEED, CppRuleClasses.MODULE_MAPS, CppRuleClasses.MODULE_MAP_HOME_CWD, 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 27c8d7099a..86ab21f09a 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 @@ -1285,13 +1285,15 @@ public class CppCompileAction extends AbstractAction // second: The compiler options. commandLine.addAll(getCompilerOptions()); - // third: The file to compile! - commandLine.add("-c"); - commandLine.add(sourceFile.getExecPathString()); - - // finally: The output file. (Prefixed with -o). - commandLine.add("-o"); - commandLine.add(outputFile.getPathString()); + if (!featureConfiguration.isEnabled("compile_action_flags_in_flag_set")) { + // third: The file to compile! + commandLine.add("-c"); + commandLine.add(sourceFile.getExecPathString()); + + // finally: The output file. (Prefixed with -o). + commandLine.add("-o"); + commandLine.add(outputFile.getPathString()); + } return commandLine; } @@ -1354,12 +1356,14 @@ public class CppCompileAction extends AbstractAction options.add(dotdFile.getSafeExecPath().getPathString()); } - if (FileType.contains(outputFile, CppFileTypes.ASSEMBLER, CppFileTypes.PIC_ASSEMBLER)) { - options.add("-S"); - } else if (FileType.contains(outputFile, CppFileTypes.PREPROCESSED_C, - CppFileTypes.PREPROCESSED_CPP, CppFileTypes.PIC_PREPROCESSED_C, - CppFileTypes.PIC_PREPROCESSED_CPP)) { - options.add("-E"); + if (!featureConfiguration.isEnabled("compile_action_flags_in_flag_set")) { + if (FileType.contains(outputFile, CppFileTypes.ASSEMBLER, CppFileTypes.PIC_ASSEMBLER)) { + options.add("-S"); + } else if (FileType.contains(outputFile, CppFileTypes.PREPROCESSED_C, + CppFileTypes.PREPROCESSED_CPP, CppFileTypes.PIC_PREPROCESSED_C, + CppFileTypes.PIC_PREPROCESSED_CPP)) { + options.add("-E"); + } } return options; 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 2304de349f..1f2d45f6a2 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 @@ -32,6 +32,7 @@ import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.Variables.Var 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; +import com.google.devtools.build.lib.util.FileType; import com.google.devtools.build.lib.util.Pair; import com.google.devtools.build.lib.util.Preconditions; import com.google.devtools.build.lib.util.RegexFilter; @@ -368,7 +369,27 @@ public final class CppModel { CppCompilationContext builderContext = builder.getContext(); CppModuleMap cppModuleMap = builderContext.getCppModuleMap(); - buildVariables.addVariable("output_file", builder.getOutputFile().getExecPathString()); + Artifact outputFile = builder.getOutputFile(); + String realOutputFilePath; + + buildVariables.addVariable("source_file", builder.getSourceFile().getExecPathString()); + buildVariables.addVariable("output_file", outputFile.getExecPathString()); + + if (fake) { + realOutputFilePath = builder.getTempOutputFile().getPathString(); + } else { + realOutputFilePath = builder.getOutputFile().getExecPathString(); + } + + if (FileType.contains(outputFile, CppFileTypes.ASSEMBLER, CppFileTypes.PIC_ASSEMBLER)) { + buildVariables.addVariable("output_assembly_file", realOutputFilePath); + } else if (FileType.contains(outputFile, CppFileTypes.PREPROCESSED_C, + CppFileTypes.PREPROCESSED_CPP, CppFileTypes.PIC_PREPROCESSED_C, + CppFileTypes.PIC_PREPROCESSED_CPP)) { + buildVariables.addVariable("output_preprocess_file", realOutputFilePath); + } else { + buildVariables.addVariable("output_object_file", realOutputFilePath); + } if (featureConfiguration.isEnabled(CppRuleClasses.MODULE_MAPS) && cppModuleMap != null) { // If the feature is enabled and cppModuleMap is null, we are about to fail during analysis 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 2d3d0b5c4a..3a2add3f32 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 @@ -102,6 +102,13 @@ public class CppRuleClasses { public static final String RANDOM_SEED = "random_seed"; /** + * A string constant for the compile_action_flags_in_flag_set feature. This feature is just a + * transitional feature which helps telling whether -c and -o options are already in flag_set of + * action_config in CROSSTOOL file. Once the transition is done, it should be removed. + */ + public static final String COMPILE_ACTION_FLAGS_IN_FLAG_SET = "compile_action_flags_in_flag_set"; + + /** * A string constant for the module_map_home_cwd feature. */ public static final String MODULE_MAP_HOME_CWD = "module_map_home_cwd"; diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/FakeCppCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/FakeCppCompileAction.java index a548ca30de..874f1fd608 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/FakeCppCompileAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/FakeCppCompileAction.java @@ -183,9 +183,15 @@ public class FakeCppCompileAction extends CppCompileAction { @Override public String apply(String input) { String result = ShellEscaper.escapeString(input); + // Once -c and -o options are added into action_config, the argument of + // getArgv(outputFile.getExecPath()) won't be used anymore. There will always be + // -c <tempOutputFile>, but here it has to be outputFile, so we replace it. + if (input.equals(tempOutputFile.getPathString())) { + result = outputPrefix + ShellEscaper.escapeString(outputFile.getExecPathString()); + } if (input.equals(outputFile.getExecPathString()) || input.equals(getDotdFile().getSafeExecPath().getPathString())) { - result = outputPrefix + result; + result = outputPrefix + ShellEscaper.escapeString(input); } return result; } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalObjcLibrary.java index 83c1ede36b..deee358f1f 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalObjcLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalObjcLibrary.java @@ -168,6 +168,7 @@ public class ExperimentalObjcLibrary implements RuleConfiguredTargetFactory { // We create a module map by default to allow for swift interop. activatedCrosstoolSelectables.add(CppRuleClasses.MODULE_MAPS); + activatedCrosstoolSelectables.add(CppRuleClasses.COMPILE_ACTION_FLAGS_IN_FLAG_SET); return toolchain.getFeatures().getFeatureConfiguration(activatedCrosstoolSelectables.build()); } |