|
|
|
|
|
|
|
|
|
|
|
|
|
|
#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()) { |