| #include <dds/build/deps.hpp> | #include <dds/build/deps.hpp> | ||||
| #include <dds/proc.hpp> | #include <dds/proc.hpp> | ||||
| #include <dds/util/string.hpp> | |||||
| #include <dds/util/time.hpp> | #include <dds/util/time.hpp> | ||||
| #include <range/v3/view/filter.hpp> | #include <range/v3/view/filter.hpp> | ||||
| = timed<std::chrono::milliseconds>([&] { return run_proc(cf.cmd_info.command); }); | = timed<std::chrono::milliseconds>([&] { return run_proc(cf.cmd_info.command); }); | ||||
| spdlog::info("{} - {:>7n}ms", msg, dur_ms.count()); | spdlog::info("{} - {:>7n}ms", msg, dur_ms.count()); | ||||
| if (!compile_res.okay()) { | |||||
| spdlog::error("Compilation failed: {}", source_path.string()); | |||||
| spdlog::error("Subcommand FAILED: {}\n{}", | |||||
| quote_command(cf.cmd_info.command), | |||||
| compile_res.output); | |||||
| throw compile_failure(fmt::format("Compilation failed for {}", source_path.string())); | |||||
| } | |||||
| std::optional<deps_info> ret_deps_info; | std::optional<deps_info> ret_deps_info; | ||||
| if (env.toolchain.deps_mode() == deps_mode::gnu) { | if (env.toolchain.deps_mode() == deps_mode::gnu) { | ||||
| dep_info.command_output = compile_res.output; | dep_info.command_output = compile_res.output; | ||||
| ret_deps_info = std::move(dep_info); | ret_deps_info = std::move(dep_info); | ||||
| } | } | ||||
| } else if (env.toolchain.deps_mode() == deps_mode::msvc) { | |||||
| auto msvc_deps = parse_msvc_output_for_deps(compile_res.output, "Note: including file:"); | |||||
| msvc_deps.deps_info.output = cf.object_file_path; | |||||
| msvc_deps.deps_info.command = quote_command(cf.cmd_info.command); | |||||
| msvc_deps.deps_info.command_output = msvc_deps.cleaned_output; | |||||
| ret_deps_info = std::move(msvc_deps.deps_info); | |||||
| compile_res.output = std::move(msvc_deps.cleaned_output); | |||||
| } | } | ||||
| // MSVC prints the filename of the source file. Dunno why, but they do. | // MSVC prints the filename of the source file. Dunno why, but they do. | ||||
| if (compile_res.output.find(source_path.filename().string() + "\r\n") == 0) { | |||||
| compile_res.output.erase(0, source_path.filename().string().length() + 2); | |||||
| if (compile_res.output.find(source_path.filename().string()) == 0) { | |||||
| compile_res.output.erase(0, source_path.filename().string().length()); | |||||
| if (starts_with(compile_res.output, "\r")) { | |||||
| compile_res.output.erase(0, 1); | |||||
| } | |||||
| if (starts_with(compile_res.output, "\n")) { | |||||
| compile_res.output.erase(0, 1); | |||||
| } | |||||
| } | |||||
| if (!compile_res.okay()) { | |||||
| spdlog::error("Compilation failed: {}", source_path.string()); | |||||
| spdlog::error("Subcommand FAILED: {}\n{}", | |||||
| quote_command(cf.cmd_info.command), | |||||
| compile_res.output); | |||||
| throw compile_failure(fmt::format("Compilation failed for {}", source_path.string())); | |||||
| } | } | ||||
| if (!compile_res.output.empty()) { | if (!compile_res.output.empty()) { |