state.common_args.push_back(args[0]); // Compiler
+ optional<Statistic> argument_error;
for (size_t i = 1; i < args.size(); i++) {
- auto error = process_arg(ctx, args, i, state);
- if (error) {
- return *error;
+ const auto error = process_arg(ctx, args, i, state);
+ if (error && !argument_error) {
+ argument_error = error;
}
}
+ // Don't try to second guess the compiler's heuristics for stdout handling.
+ if (args_info.output_obj == "-") {
+ LOG_RAW("Output file is -");
+ return Statistic::output_to_stdout;
+ }
+
+ // Determine output object file.
+ const bool implicit_output_obj = args_info.output_obj.empty();
+ if (implicit_output_obj && !args_info.input_file.empty()) {
+ string_view extension = state.found_S_opt ? ".s" : ".o";
+ args_info.output_obj =
+ Util::change_extension(Util::base_name(args_info.input_file), extension);
+ }
+
+ // On argument processing error, return now since we have determined
+ // args_info.output_obj which is needed to determine the log filename in
+ // CCACHE_DEBUG mode.
+ if (argument_error) {
+ return *argument_error;
+ }
+
if (state.generating_debuginfo_level_3 && !config.run_second_cpp()) {
LOG_RAW("Generating debug info level 3; not compiling preprocessed code");
config.set_run_second_cpp(true);
args_info.actual_language.find("-header") != std::string::npos
|| Util::is_precompiled_header(args_info.output_obj);
+ if (args_info.output_is_precompiled_header && implicit_output_obj) {
+ args_info.output_obj = args_info.input_file + ".gch";
+ }
+
if (args_info.output_is_precompiled_header
&& !(config.sloppiness() & SLOPPY_PCH_DEFINES)) {
LOG_RAW(
config.set_cpp_extension(extension_for_language(p_language).substr(1));
}
- // Don't try to second guess the compilers heuristics for stdout handling.
- if (args_info.output_obj == "-") {
- LOG_RAW("Output file is -");
- return Statistic::output_to_stdout;
- }
-
- if (args_info.output_obj.empty()) {
- if (args_info.output_is_precompiled_header) {
- args_info.output_obj = args_info.input_file + ".gch";
- } else {
- string_view extension = state.found_S_opt ? ".s" : ".o";
- args_info.output_obj = Util::change_extension(
- Util::base_name(args_info.input_file), extension);
- }
- }
-
if (args_info.seen_split_dwarf) {
args_info.output_dwo = Util::change_extension(args_info.output_obj, ".dwo");
}