|
|
@@ -28,6 +28,8 @@ toolchain dds::parse_toolchain_dds(strv str, strv context) { |
|
|
|
return parse_toolchain_dds(kvs, context); |
|
|
|
} |
|
|
|
|
|
|
|
namespace { |
|
|
|
|
|
|
|
struct read_argv_acc { |
|
|
|
strv my_key; |
|
|
|
opt_str_seq& out; |
|
|
@@ -70,6 +72,13 @@ T read_opt(const std::optional<T>& what, Func&& fn) { |
|
|
|
return *what; |
|
|
|
} |
|
|
|
|
|
|
|
template <typename... Args> |
|
|
|
[[noreturn]] void fail(strv context, strv message, Args&&... args) { |
|
|
|
throw std::runtime_error( |
|
|
|
format("{} - Failed to read toolchain file: {}", context, message, args...)); |
|
|
|
} |
|
|
|
} // namespace |
|
|
|
|
|
|
|
toolchain dds::parse_toolchain_dds(const lm::pair_list& pairs, strv context) { |
|
|
|
opt_string compiler_id; |
|
|
|
opt_string c_compiler_fpath; |
|
|
@@ -135,11 +144,6 @@ toolchain dds::parse_toolchain_dds(const lm::pair_list& pairs, strv context) { |
|
|
|
|
|
|
|
toolchain_prep tc; |
|
|
|
|
|
|
|
auto fail = [&](auto msg, auto... args)[[noreturn]]->void { |
|
|
|
throw std::runtime_error( |
|
|
|
format("{}: Failed to generate toolchain: {}", context, msg, args...)); |
|
|
|
}; |
|
|
|
|
|
|
|
enum compiler_id_e_t { |
|
|
|
no_comp_id, |
|
|
|
msvc, |
|
|
@@ -156,7 +160,7 @@ toolchain dds::parse_toolchain_dds(const lm::pair_list& pairs, strv context) { |
|
|
|
} else if (compiler_id == "Clang") { |
|
|
|
return clang; |
|
|
|
} else { |
|
|
|
fail("Unknown Compiler-ID '{}'", *compiler_id); |
|
|
|
fail(context, "Unknown Compiler-ID '{}'", *compiler_id); |
|
|
|
} |
|
|
|
}(); |
|
|
|
|
|
|
@@ -174,7 +178,7 @@ toolchain dds::parse_toolchain_dds(const lm::pair_list& pairs, strv context) { |
|
|
|
return *c_compiler_fpath; |
|
|
|
} |
|
|
|
if (!compiler_id.has_value()) { |
|
|
|
fail("Unable to determine what compiler to use."); |
|
|
|
fail(context, "Unable to determine what compiler to use."); |
|
|
|
} |
|
|
|
if (is_gnu) { |
|
|
|
return is_cxx ? "g++" : "gcc"; |
|
|
@@ -208,7 +212,7 @@ toolchain dds::parse_toolchain_dds(const lm::pair_list& pairs, strv context) { |
|
|
|
} else if (c_version == "c18") { |
|
|
|
return c18; |
|
|
|
} else { |
|
|
|
fail("Unknown C-Version '{}'", *c_version); |
|
|
|
fail(context, "Unknown C-Version '{}'", *c_version); |
|
|
|
} |
|
|
|
}(); |
|
|
|
|
|
|
@@ -237,7 +241,7 @@ toolchain dds::parse_toolchain_dds(const lm::pair_list& pairs, strv context) { |
|
|
|
} else if (cxx_version == "c++20") { |
|
|
|
return cxx20; |
|
|
|
} else { |
|
|
|
fail("Unknown C++-Version '{}'", *cxx_version); |
|
|
|
fail(context, "Unknown C++-Version '{}'", *cxx_version); |
|
|
|
} |
|
|
|
}(); |
|
|
|
|
|
|
@@ -261,7 +265,7 @@ toolchain dds::parse_toolchain_dds(const lm::pair_list& pairs, strv context) { |
|
|
|
|
|
|
|
auto get_c_version_flags = [&]() -> string_seq { |
|
|
|
if (!compiler_id.has_value()) { |
|
|
|
fail("Unable to deduce flags for 'C-Version' without setting 'Compiler-ID'"); |
|
|
|
fail(context, "Unable to deduce flags for 'C-Version' without setting 'Compiler-ID'"); |
|
|
|
} |
|
|
|
auto c_ver_iter = c_version_flag_table.find({compiler_id_e, c_version_e}); |
|
|
|
assert(c_ver_iter != c_version_flag_table.end()); |
|
|
@@ -294,7 +298,7 @@ toolchain dds::parse_toolchain_dds(const lm::pair_list& pairs, strv context) { |
|
|
|
|
|
|
|
auto get_cxx_version_flags = [&]() -> string_seq { |
|
|
|
if (!compiler_id.has_value()) { |
|
|
|
fail("Unable to deduce flags for 'C++-Version' without setting 'Compiler-ID'"); |
|
|
|
fail(context, "Unable to deduce flags for 'C++-Version' without setting 'Compiler-ID'"); |
|
|
|
} |
|
|
|
auto cxx_ver_iter = cxx_version_flag_table.find({compiler_id_e, cxx_version_e}); |
|
|
|
assert(cxx_ver_iter != cxx_version_flag_table.end()); |
|
|
@@ -373,7 +377,7 @@ toolchain dds::parse_toolchain_dds(const lm::pair_list& pairs, strv context) { |
|
|
|
|
|
|
|
tc.include_template = read_opt(include_template, [&]() -> string_seq { |
|
|
|
if (!compiler_id) { |
|
|
|
fail("Cannot deduce 'Include-Template' without 'Compiler-ID'"); |
|
|
|
fail(context, "Cannot deduce 'Include-Template' without 'Compiler-ID'"); |
|
|
|
} |
|
|
|
if (is_gnu_like) { |
|
|
|
return {"-I", "<PATH>"}; |
|
|
@@ -386,7 +390,7 @@ toolchain dds::parse_toolchain_dds(const lm::pair_list& pairs, strv context) { |
|
|
|
|
|
|
|
tc.define_template = read_opt(define_template, [&]() -> string_seq { |
|
|
|
if (!compiler_id) { |
|
|
|
fail("Cannot deduce 'Define-Template' without 'Compiler-ID'"); |
|
|
|
fail(context, "Cannot deduce 'Define-Template' without 'Compiler-ID'"); |
|
|
|
} |
|
|
|
if (is_gnu_like) { |
|
|
|
return {"-D", "<DEF>"}; |
|
|
@@ -400,7 +404,7 @@ toolchain dds::parse_toolchain_dds(const lm::pair_list& pairs, strv context) { |
|
|
|
tc.archive_prefix = archive_prefix.value_or("lib"); |
|
|
|
tc.archive_suffix = read_opt(archive_suffix, [&] { |
|
|
|
if (!compiler_id) { |
|
|
|
fail("Cannot deduce library file extension without Compiler-ID"); |
|
|
|
fail(context, "Cannot deduce library file extension without Compiler-ID"); |
|
|
|
} |
|
|
|
if (is_gnu) { |
|
|
|
return ".a"; |
|
|
@@ -414,7 +418,7 @@ toolchain dds::parse_toolchain_dds(const lm::pair_list& pairs, strv context) { |
|
|
|
tc.object_prefix = obj_prefix.value_or(""); |
|
|
|
tc.object_suffix = read_opt(obj_suffix, [&] { |
|
|
|
if (!compiler_id) { |
|
|
|
fail("Cannot deduce object file extension without Compiler-ID"); |
|
|
|
fail(context, "Cannot deduce object file extension without Compiler-ID"); |
|
|
|
} |
|
|
|
if (is_gnu) { |
|
|
|
return ".o"; |
|
|
@@ -450,7 +454,7 @@ toolchain dds::parse_toolchain_dds(const lm::pair_list& pairs, strv context) { |
|
|
|
|
|
|
|
tc.link_archive = read_opt(create_archive, [&]() -> string_seq { |
|
|
|
if (!compiler_id) { |
|
|
|
fail("Unable to deduce archive creation rules without a Compiler-ID"); |
|
|
|
fail(context, "Unable to deduce archive creation rules without a Compiler-ID"); |
|
|
|
} |
|
|
|
if (is_msvc) { |
|
|
|
return {"lib", "/nologo", "/OUT:<OUT>", "<IN>"}; |
|
|
@@ -463,7 +467,7 @@ toolchain dds::parse_toolchain_dds(const lm::pair_list& pairs, strv context) { |
|
|
|
|
|
|
|
tc.link_exe = read_opt(link_executable, [&]() -> string_seq { |
|
|
|
if (!compiler_id) { |
|
|
|
fail("Unable to deduce how to link executables without a Compiler-ID"); |
|
|
|
fail(context, "Unable to deduce how to link executables without a Compiler-ID"); |
|
|
|
} |
|
|
|
if (is_msvc) { |
|
|
|
return {get_compiler(true), "/nologo", "/EHsc", "<IN>", "/Fe<OUT>"}; |