| @@ -17,7 +17,7 @@ compile_command_info compile_file_plan::generate_compile_command(build_env_ref e | |||
| spec.enable_warnings = _rules.enable_warnings(); | |||
| extend(spec.include_dirs, _rules.include_dirs()); | |||
| for (const auto& use : _rules.uses()) { | |||
| extend(spec.include_dirs, env.ureqs.include_paths(use)); | |||
| extend(spec.external_include_dirs, env.ureqs.include_paths(use)); | |||
| } | |||
| extend(spec.definitions, _rules.defs()); | |||
| return env.toolchain.create_compile_command(spec); | |||
| @@ -95,6 +95,7 @@ toolchain dds::parse_toolchain_dds(const lm::pair_list& pairs, strv context) { | |||
| optional<bool> do_debug; | |||
| optional<bool> do_optimize; | |||
| opt_str_seq include_template; | |||
| opt_str_seq external_include_template; | |||
| opt_str_seq define_template; | |||
| opt_str_seq warning_flags; | |||
| opt_str_seq flags; | |||
| @@ -118,6 +119,7 @@ toolchain dds::parse_toolchain_dds(const lm::pair_list& pairs, strv context) { | |||
| lm::read_opt("C++-Version", cxx_version), | |||
| // Flag templates | |||
| read_argv{"Include-Template", include_template}, | |||
| read_argv{"External-Include-Template", include_template}, | |||
| read_argv{"Define-Template", define_template}, | |||
| // Flags | |||
| read_argv_acc{"Warning-Flags", warning_flags}, | |||
| @@ -440,6 +442,21 @@ toolchain dds::parse_toolchain_dds(const lm::pair_list& pairs, strv context) { | |||
| std::terminate(); | |||
| }); | |||
| tc.external_include_template = read_opt(external_include_template, [&]() -> string_seq { | |||
| if (!compiler_id) { | |||
| // Just reuse the include template for regular files | |||
| return tc.include_template; | |||
| } | |||
| if (is_gnu_like) { | |||
| return {"-isystem", "<PATH>"}; | |||
| } else if (is_msvc) { | |||
| // MSVC has external-header support inbound, but it is not fully ready yet | |||
| return {"/I", "<PATH>"}; | |||
| } | |||
| assert(false && "External-Include-Template deduction failed"); | |||
| std::terminate(); | |||
| }); | |||
| tc.define_template = read_opt(define_template, [&]() -> string_seq { | |||
| if (!compiler_id) { | |||
| fail(context, "Cannot deduce 'Define-Template' without 'Compiler-ID'"); | |||
| @@ -14,6 +14,7 @@ struct toolchain_prep { | |||
| string_seq c_compile; | |||
| string_seq cxx_compile; | |||
| string_seq include_template; | |||
| string_seq external_include_template; | |||
| string_seq define_template; | |||
| string_seq link_archive; | |||
| string_seq link_exe; | |||
| @@ -20,20 +20,21 @@ using opt_string = optional<string>; | |||
| toolchain toolchain::realize(const toolchain_prep& prep) { | |||
| toolchain ret; | |||
| ret._c_compile = prep.c_compile; | |||
| ret._cxx_compile = prep.cxx_compile; | |||
| ret._inc_template = prep.include_template; | |||
| ret._def_template = prep.define_template; | |||
| ret._link_archive = prep.link_archive; | |||
| ret._link_exe = prep.link_exe; | |||
| ret._warning_flags = prep.warning_flags; | |||
| ret._archive_prefix = prep.archive_prefix; | |||
| ret._archive_suffix = prep.archive_suffix; | |||
| ret._object_prefix = prep.object_prefix; | |||
| ret._object_suffix = prep.object_suffix; | |||
| ret._exe_prefix = prep.exe_prefix; | |||
| ret._exe_suffix = prep.exe_suffix; | |||
| ret._deps_mode = prep.deps_mode; | |||
| ret._c_compile = prep.c_compile; | |||
| ret._cxx_compile = prep.cxx_compile; | |||
| ret._inc_template = prep.include_template; | |||
| ret._extern_inc_template = prep.external_include_template; | |||
| ret._def_template = prep.define_template; | |||
| ret._link_archive = prep.link_archive; | |||
| ret._link_exe = prep.link_exe; | |||
| ret._warning_flags = prep.warning_flags; | |||
| ret._archive_prefix = prep.archive_prefix; | |||
| ret._archive_suffix = prep.archive_suffix; | |||
| ret._object_prefix = prep.object_prefix; | |||
| ret._object_suffix = prep.object_suffix; | |||
| ret._exe_prefix = prep.exe_prefix; | |||
| ret._exe_suffix = prep.exe_suffix; | |||
| ret._deps_mode = prep.deps_mode; | |||
| return ret; | |||
| } | |||
| @@ -41,6 +42,10 @@ vector<string> toolchain::include_args(const fs::path& p) const noexcept { | |||
| return replace(_inc_template, "<PATH>", p.string()); | |||
| } | |||
| vector<string> toolchain::external_include_args(const fs::path& p) const noexcept { | |||
| return replace(_extern_inc_template, "<PATH>", p.string()); | |||
| } | |||
| vector<string> toolchain::definition_args(std::string_view s) const noexcept { | |||
| return replace(_def_template, "<DEF>", s); | |||
| } | |||
| @@ -67,6 +72,11 @@ toolchain::create_compile_command(const compile_file_spec& spec) const noexcept | |||
| extend(flags, inc_args); | |||
| } | |||
| for (auto&& ext_inc_dir : spec.external_include_dirs) { | |||
| auto inc_args = external_include_args(ext_inc_dir); | |||
| extend(flags, inc_args); | |||
| } | |||
| for (auto&& def : spec.definitions) { | |||
| auto def_args = definition_args(def); | |||
| extend(flags, def_args); | |||
| @@ -21,7 +21,8 @@ struct compile_file_spec { | |||
| fs::path out_path; | |||
| std::vector<std::string> definitions = {}; | |||
| std::vector<fs::path> include_dirs = {}; | |||
| language lang = language::automatic; | |||
| std::vector<fs::path> external_include_dirs = {}; | |||
| language lang = language::automatic; | |||
| bool enable_warnings = false; | |||
| }; | |||
| @@ -48,6 +49,7 @@ class toolchain { | |||
| string_seq _c_compile; | |||
| string_seq _cxx_compile; | |||
| string_seq _inc_template; | |||
| string_seq _extern_inc_template; | |||
| string_seq _def_template; | |||
| string_seq _link_archive; | |||
| string_seq _link_exe; | |||
| @@ -74,6 +76,7 @@ public: | |||
| std::vector<std::string> definition_args(std::string_view s) const noexcept; | |||
| std::vector<std::string> include_args(const fs::path& p) const noexcept; | |||
| std::vector<std::string> external_include_args(const fs::path& p) const noexcept; | |||
| compile_command_info create_compile_command(const compile_file_spec&) const noexcept; | |||
| std::vector<std::string> create_archive_command(const archive_spec&) const noexcept; | |||
| std::vector<std::string> create_link_executable_command(const link_exe_spec&) const noexcept; | |||