| Override the *command template* for the flags to set a preprocessor definition. | Override the *command template* for the flags to set a preprocessor definition. | ||||
| ``tty_flags`` | |||||
| ------------- | |||||
| Supply additional flags when compiling/linking that will only be applied if | |||||
| standard output is an ANSI-capable terminal. (e.g. On GNU and Clang this will | |||||
| be ``-fdiagnostics-color`` by default.) | |||||
| ``obj_prefix``, ``obj_suffix``, ``archive_prefix``, ``archive_suffix``, | ``obj_prefix``, ``obj_suffix``, ``archive_prefix``, ``archive_suffix``, | ||||
| ``exe_prefix``, and ``exe_suffix`` | ``exe_prefix``, and ``exe_suffix`` | ||||
| ---------------------------------- | ---------------------------------- |
| "description": "Set the command template for linking executable binaries", | "description": "Set the command template for linking executable binaries", | ||||
| "$ref": "#/definitions/command_line_flags" | "$ref": "#/definitions/command_line_flags" | ||||
| }, | }, | ||||
| "tty_flags": { | |||||
| "description": "Set command line flags that will be applied only if stdout is an ANSI-capable terminal", | |||||
| "$ref": "#/definitions/command_line_flags" | |||||
| }, | |||||
| "obj_prefix": { | "obj_prefix": { | ||||
| "description": "Set the filename prefix for object files", | "description": "Set the filename prefix for object files", | ||||
| "type": "string" | "type": "string" |
| #include <dds/compdb.hpp> | #include <dds/compdb.hpp> | ||||
| #include <dds/error/errors.hpp> | #include <dds/error/errors.hpp> | ||||
| #include <dds/usage_reqs.hpp> | #include <dds/usage_reqs.hpp> | ||||
| #include <dds/util/output.hpp> | |||||
| #include <dds/util/time.hpp> | #include <dds/util/time.hpp> | ||||
| #include <spdlog/spdlog.h> | #include <spdlog/spdlog.h> | ||||
| state st; | state st; | ||||
| auto plan = prepare_build_plan(st, _sdists); | auto plan = prepare_build_plan(st, _sdists); | ||||
| auto ureqs = prepare_ureqs(plan, params.toolchain, params.out_root); | auto ureqs = prepare_ureqs(plan, params.toolchain, params.out_root); | ||||
| build_env env{params.toolchain, params.out_root, db, ureqs}; | |||||
| build_env env{ | |||||
| params.toolchain, | |||||
| params.out_root, | |||||
| db, | |||||
| toolchain_knobs{ | |||||
| .is_tty = stdout_is_a_tty(), | |||||
| }, | |||||
| ureqs, | |||||
| }; | |||||
| if (st.generate_catch2_main) { | if (st.generate_catch2_main) { | ||||
| auto catch_lib = prepare_test_driver(params, test_lib::catch_main, env); | auto catch_lib = prepare_test_driver(params, test_lib::catch_main, env); |
| archive_spec ar; | archive_spec ar; | ||||
| ar.input_files = std::move(objects); | ar.input_files = std::move(objects); | ||||
| ar.out_path = env.output_root / calc_archive_file_path(env.toolchain); | ar.out_path = env.output_root / calc_archive_file_path(env.toolchain); | ||||
| auto ar_cmd = env.toolchain.create_archive_command(ar); | |||||
| auto ar_cmd = env.toolchain.create_archive_command(ar, env.knobs); | |||||
| // `out_relpath` is purely for the benefit of the user to have a short name | // `out_relpath` is purely for the benefit of the user to have a short name | ||||
| // in the logs | // in the logs |
| fs::path output_root; | fs::path output_root; | ||||
| database& db; | database& db; | ||||
| toolchain_knobs knobs; | |||||
| const usage_requirement_map& ureqs; | const usage_requirement_map& ureqs; | ||||
| }; | }; | ||||
| extend(spec.external_include_dirs, env.ureqs.include_paths(use)); | extend(spec.external_include_dirs, env.ureqs.include_paths(use)); | ||||
| } | } | ||||
| extend(spec.definitions, _rules.defs()); | extend(spec.definitions, _rules.defs()); | ||||
| return env.toolchain.create_compile_command(spec); | |||||
| return env.toolchain.create_compile_command(spec, env.knobs); | |||||
| } | } | ||||
| fs::path compile_file_plan::calc_object_file_path(const build_env& env) const noexcept { | fs::path compile_file_plan::calc_object_file_path(const build_env& env) const noexcept { |
| std::reverse(spec.inputs.begin(), spec.inputs.end()); | std::reverse(spec.inputs.begin(), spec.inputs.end()); | ||||
| // Do it! | // Do it! | ||||
| const auto link_command = env.toolchain.create_link_executable_command(spec); | |||||
| const auto link_command = env.toolchain.create_link_executable_command(spec, env.knobs); | |||||
| fs::create_directories(spec.output.parent_path()); | fs::create_directories(spec.output.parent_path()); | ||||
| auto msg = fmt::format("[{}] Link: {:30}", | auto msg = fmt::format("[{}] Link: {:30}", | ||||
| lib.qualified_name(), | lib.qualified_name(), |
| opt_string_seq cxx_compile_file; | opt_string_seq cxx_compile_file; | ||||
| opt_string_seq create_archive; | opt_string_seq create_archive; | ||||
| opt_string_seq link_executable; | opt_string_seq link_executable; | ||||
| opt_string_seq tty_flags; | |||||
| // For copy-pasting convenience: ‘{}’ | // For copy-pasting convenience: ‘{}’ | ||||
| KEY_EXTEND_FLAGS(cxx_compile_file), | KEY_EXTEND_FLAGS(cxx_compile_file), | ||||
| KEY_EXTEND_FLAGS(create_archive), | KEY_EXTEND_FLAGS(create_archive), | ||||
| KEY_EXTEND_FLAGS(link_executable), | KEY_EXTEND_FLAGS(link_executable), | ||||
| KEY_EXTEND_FLAGS(tty_flags), | |||||
| KEY_STRING(obj_prefix), | KEY_STRING(obj_prefix), | ||||
| KEY_STRING(obj_suffix), | KEY_STRING(obj_suffix), | ||||
| KEY_STRING(archive_prefix), | KEY_STRING(archive_prefix), | ||||
| "archive_suffix", | "archive_suffix", | ||||
| "exe_prefix", | "exe_prefix", | ||||
| "exe_suffix", | "exe_suffix", | ||||
| "tty_flags", | |||||
| }); | }); | ||||
| fail(context, | fail(context, | ||||
| "Unknown toolchain advanced-config key ‘{}’ (Did you mean ‘{}’?)", | "Unknown toolchain advanced-config key ‘{}’ (Did you mean ‘{}’?)", | ||||
| if (do_debug.has_value() && *do_debug) { | if (do_debug.has_value() && *do_debug) { | ||||
| extend(ret, {"-g"}); | extend(ret, {"-g"}); | ||||
| } | } | ||||
| extend(ret, | |||||
| {"-fPIC", | |||||
| "-fdiagnostics-color", | |||||
| "-pthread", | |||||
| "<FLAGS>", | |||||
| "-c", | |||||
| "<IN>", | |||||
| "-o<OUT>"}); | |||||
| extend(ret, {"-fPIC", "-pthread", "<FLAGS>", "-c", "<IN>", "-o<OUT>"}); | |||||
| } | } | ||||
| if (common_flags) { | if (common_flags) { | ||||
| extend(ret, *common_flags); | extend(ret, *common_flags); | ||||
| } else if (is_gnu_like) { | } else if (is_gnu_like) { | ||||
| ret = {get_compiler_executable_path(language::cxx), | ret = {get_compiler_executable_path(language::cxx), | ||||
| "-fPIC", | "-fPIC", | ||||
| "-fdiagnostics-color", | |||||
| "<IN>", | "<IN>", | ||||
| "-pthread", | "-pthread", | ||||
| "-o<OUT>"}; | "-o<OUT>"}; | ||||
| return ret; | return ret; | ||||
| }); | }); | ||||
| tc.tty_flags = read_opt(tty_flags, [&]() -> string_seq { | |||||
| if (!compiler_id) { | |||||
| // Don't deduce any flags. This is a non-error, as these flags should be purely | |||||
| // aesthetic | |||||
| return {}; | |||||
| } | |||||
| if (is_msvc) { | |||||
| // MSVC doesn't have any special TTY flags (yet...) | |||||
| return {}; | |||||
| } else if (is_gnu_like) { | |||||
| return {"-fdiagnostics-color"}; | |||||
| } else { | |||||
| assert(false && "Impossible compiler_id while deducing `tty_flags`"); | |||||
| std::terminate(); | |||||
| } | |||||
| }); | |||||
| return tc.realize(); | return tc.realize(); | ||||
| } | } |
| dds::compile_file_spec cf; | dds::compile_file_spec cf; | ||||
| cf.source_path = "foo.cpp"; | cf.source_path = "foo.cpp"; | ||||
| cf.out_path = "foo.o"; | cf.out_path = "foo.o"; | ||||
| auto cf_cmd = tc.create_compile_command(cf); | |||||
| auto cf_cmd = tc.create_compile_command(cf, dds::toolchain_knobs{}); | |||||
| auto cf_cmd_str = dds::quote_command(cf_cmd.command); | auto cf_cmd_str = dds::quote_command(cf_cmd.command); | ||||
| CHECK(cf_cmd_str == expected_compile); | CHECK(cf_cmd_str == expected_compile); | ||||
| cf.enable_warnings = true; | cf.enable_warnings = true; | ||||
| cf_cmd = tc.create_compile_command(cf); | |||||
| cf_cmd = tc.create_compile_command(cf, dds::toolchain_knobs{}); | |||||
| cf_cmd_str = dds::quote_command(cf_cmd.command); | cf_cmd_str = dds::quote_command(cf_cmd.command); | ||||
| CHECK(cf_cmd_str == expected_compile_warnings); | CHECK(cf_cmd_str == expected_compile_warnings); | ||||
| ar_spec.input_files.push_back("foo.o"); | ar_spec.input_files.push_back("foo.o"); | ||||
| ar_spec.input_files.push_back("bar.o"); | ar_spec.input_files.push_back("bar.o"); | ||||
| ar_spec.out_path = "stuff.a"; | ar_spec.out_path = "stuff.a"; | ||||
| auto ar_cmd = tc.create_archive_command(ar_spec); | |||||
| auto ar_cmd = tc.create_archive_command(ar_spec, dds::toolchain_knobs{}); | |||||
| auto ar_cmd_str = dds::quote_command(ar_cmd); | auto ar_cmd_str = dds::quote_command(ar_cmd); | ||||
| CHECK(ar_cmd_str == expected_ar); | CHECK(ar_cmd_str == expected_ar); | ||||
| exe_spec.inputs.push_back("foo.o"); | exe_spec.inputs.push_back("foo.o"); | ||||
| exe_spec.inputs.push_back("bar.a"); | exe_spec.inputs.push_back("bar.a"); | ||||
| exe_spec.output = "meow.exe"; | exe_spec.output = "meow.exe"; | ||||
| auto exe_cmd = tc.create_link_executable_command(exe_spec); | |||||
| auto exe_cmd = tc.create_link_executable_command(exe_spec, dds::toolchain_knobs{}); | |||||
| auto exe_cmd_str = dds::quote_command(exe_cmd); | auto exe_cmd_str = dds::quote_command(exe_cmd); | ||||
| CHECK(exe_cmd_str == expected_exe); | CHECK(exe_cmd_str == expected_exe); | ||||
| } | } | ||||
| } // namespace | } // namespace | ||||
| TEST_CASE("Generating toolchain commands") { | TEST_CASE("Generating toolchain commands") { | ||||
| check_tc_compile( | |||||
| "{compiler_id: 'gnu'}", | |||||
| "g++ -fPIC -fdiagnostics-color -pthread -MD -MF foo.o.d -MT foo.o -c foo.cpp -ofoo.o", | |||||
| "g++ -fPIC -fdiagnostics-color -pthread -Wall -Wextra -Wpedantic -Wconversion " | |||||
| "-MD -MF foo.o.d -MT foo.o -c foo.cpp -ofoo.o", | |||||
| "ar rcs stuff.a foo.o bar.o", | |||||
| "g++ -fPIC -fdiagnostics-color foo.o bar.a -pthread -omeow.exe"); | |||||
| check_tc_compile( | |||||
| "{compiler_id: 'gnu', debug: true}", | |||||
| "g++ -g -fPIC -fdiagnostics-color -pthread -MD -MF foo.o.d -MT foo.o -c foo.cpp -ofoo.o", | |||||
| "g++ -g -fPIC -fdiagnostics-color -pthread -Wall -Wextra -Wpedantic -Wconversion " | |||||
| "-MD -MF foo.o.d -MT foo.o -c foo.cpp -ofoo.o", | |||||
| "ar rcs stuff.a foo.o bar.o", | |||||
| "g++ -fPIC -fdiagnostics-color foo.o bar.a -pthread -omeow.exe -g"); | |||||
| check_tc_compile( | |||||
| "{compiler_id: 'gnu', debug: true, optimize: true}", | |||||
| "g++ -O2 -g -fPIC -fdiagnostics-color -pthread -MD -MF foo.o.d -MT foo.o -c foo.cpp " | |||||
| "-ofoo.o", | |||||
| "g++ -O2 -g -fPIC -fdiagnostics-color -pthread -Wall -Wextra -Wpedantic -Wconversion " | |||||
| "-MD -MF foo.o.d -MT foo.o -c foo.cpp -ofoo.o", | |||||
| "ar rcs stuff.a foo.o bar.o", | |||||
| "g++ -fPIC -fdiagnostics-color foo.o bar.a -pthread -omeow.exe -O2 -g"); | |||||
| check_tc_compile("{compiler_id: 'gnu'}", | |||||
| "g++ -fPIC -pthread -MD -MF foo.o.d -MT foo.o -c foo.cpp -ofoo.o", | |||||
| "g++ -fPIC -pthread -Wall -Wextra -Wpedantic -Wconversion " | |||||
| "-MD -MF foo.o.d -MT foo.o -c foo.cpp -ofoo.o", | |||||
| "ar rcs stuff.a foo.o bar.o", | |||||
| "g++ -fPIC foo.o bar.a -pthread -omeow.exe"); | |||||
| check_tc_compile("{compiler_id: 'gnu', debug: true}", | |||||
| "g++ -g -fPIC -pthread -MD -MF foo.o.d -MT foo.o -c foo.cpp -ofoo.o", | |||||
| "g++ -g -fPIC -pthread -Wall -Wextra -Wpedantic -Wconversion " | |||||
| "-MD -MF foo.o.d -MT foo.o -c foo.cpp -ofoo.o", | |||||
| "ar rcs stuff.a foo.o bar.o", | |||||
| "g++ -fPIC foo.o bar.a -pthread -omeow.exe -g"); | |||||
| check_tc_compile("{compiler_id: 'gnu', debug: true, optimize: true}", | |||||
| "g++ -O2 -g -fPIC -pthread -MD -MF foo.o.d -MT foo.o -c foo.cpp " | |||||
| "-ofoo.o", | |||||
| "g++ -O2 -g -fPIC -pthread -Wall -Wextra -Wpedantic -Wconversion " | |||||
| "-MD -MF foo.o.d -MT foo.o -c foo.cpp -ofoo.o", | |||||
| "ar rcs stuff.a foo.o bar.o", | |||||
| "g++ -fPIC foo.o bar.a -pthread -omeow.exe -O2 -g"); | |||||
| check_tc_compile("{compiler_id: 'msvc'}", | check_tc_compile("{compiler_id: 'msvc'}", | ||||
| "cl.exe /MT /EHsc /nologo /permissive- /showIncludes /c foo.cpp /Fofoo.o", | "cl.exe /MT /EHsc /nologo /permissive- /showIncludes /c foo.cpp /Fofoo.o", | ||||
| } | } | ||||
| TEST_CASE("Manipulate a toolchain and file compilation") { | TEST_CASE("Manipulate a toolchain and file compilation") { | ||||
| auto tc = dds::parse_toolchain_json5("{compiler_id: 'gnu'}"); | auto tc = dds::parse_toolchain_json5("{compiler_id: 'gnu'}"); | ||||
| dds::compile_file_spec cfs; | dds::compile_file_spec cfs; | ||||
| cfs.source_path = "foo.cpp"; | cfs.source_path = "foo.cpp"; | ||||
| cfs.out_path = "foo.o"; | cfs.out_path = "foo.o"; | ||||
| auto cmd = tc.create_compile_command(cfs); | |||||
| auto cmd = tc.create_compile_command(cfs, dds::toolchain_knobs{}); | |||||
| CHECK(cmd.command | CHECK(cmd.command | ||||
| == std::vector<std::string>{"g++", | == std::vector<std::string>{"g++", | ||||
| "-fPIC", | "-fPIC", | ||||
| "-fdiagnostics-color", | |||||
| "-pthread", | "-pthread", | ||||
| "-MD", | "-MD", | ||||
| "-MF", | "-MF", | ||||
| "-ofoo.o"}); | "-ofoo.o"}); | ||||
| cfs.definitions.push_back("FOO=BAR"); | cfs.definitions.push_back("FOO=BAR"); | ||||
| cmd = tc.create_compile_command(cfs); | |||||
| cmd = tc.create_compile_command(cfs, dds::toolchain_knobs{.is_tty = true}); | |||||
| CHECK(cmd.command | CHECK(cmd.command | ||||
| == std::vector<std::string>{"g++", | == std::vector<std::string>{"g++", | ||||
| "-fPIC", | "-fPIC", | ||||
| "-fdiagnostics-color", | |||||
| "-pthread", | "-pthread", | ||||
| "-fdiagnostics-color", | |||||
| "-D", | "-D", | ||||
| "FOO=BAR", | "FOO=BAR", | ||||
| "-MD", | "-MD", | ||||
| "-ofoo.o"}); | "-ofoo.o"}); | ||||
| cfs.include_dirs.push_back("fake-dir"); | cfs.include_dirs.push_back("fake-dir"); | ||||
| cmd = tc.create_compile_command(cfs); | |||||
| cmd = tc.create_compile_command(cfs, dds::toolchain_knobs{}); | |||||
| CHECK(cmd.command | CHECK(cmd.command | ||||
| == std::vector<std::string>{"g++", | == std::vector<std::string>{"g++", | ||||
| "-fPIC", | "-fPIC", | ||||
| "-fdiagnostics-color", | |||||
| "-pthread", | "-pthread", | ||||
| "-I", | "-I", | ||||
| "fake-dir", | "fake-dir", | ||||
| "-c", | "-c", | ||||
| "foo.cpp", | "foo.cpp", | ||||
| "-ofoo.o"}); | "-ofoo.o"}); | ||||
| } | |||||
| } |
| string_seq link_archive; | string_seq link_archive; | ||||
| string_seq link_exe; | string_seq link_exe; | ||||
| string_seq warning_flags; | string_seq warning_flags; | ||||
| string_seq tty_flags; | |||||
| std::string archive_prefix; | std::string archive_prefix; | ||||
| std::string archive_suffix; | std::string archive_suffix; |
| ret._exe_prefix = prep.exe_prefix; | ret._exe_prefix = prep.exe_prefix; | ||||
| ret._exe_suffix = prep.exe_suffix; | ret._exe_suffix = prep.exe_suffix; | ||||
| ret._deps_mode = prep.deps_mode; | ret._deps_mode = prep.deps_mode; | ||||
| ret._tty_flags = prep.tty_flags; | |||||
| return ret; | return ret; | ||||
| } | } | ||||
| return replace(_def_template, "<DEF>", s); | return replace(_def_template, "<DEF>", s); | ||||
| } | } | ||||
| compile_command_info | |||||
| toolchain::create_compile_command(const compile_file_spec& spec) const noexcept { | |||||
| vector<string> flags; | |||||
| compile_command_info toolchain::create_compile_command(const compile_file_spec& spec, | |||||
| toolchain_knobs knobs) const noexcept { | |||||
| using namespace std::literals; | using namespace std::literals; | ||||
| language lang = spec.lang; | language lang = spec.lang; | ||||
| } | } | ||||
| } | } | ||||
| auto& cmd_template = lang == language::c ? _c_compile : _cxx_compile; | |||||
| vector<string> flags; | |||||
| if (knobs.is_tty) { | |||||
| extend(flags, _tty_flags); | |||||
| } | |||||
| for (auto&& inc_dir : spec.include_dirs) { | for (auto&& inc_dir : spec.include_dirs) { | ||||
| auto inc_args = include_args(inc_dir); | auto inc_args = include_args(inc_dir); | ||||
| } | } | ||||
| vector<string> command; | vector<string> command; | ||||
| auto& cmd_template = lang == language::c ? _c_compile : _cxx_compile; | |||||
| for (auto arg : cmd_template) { | for (auto arg : cmd_template) { | ||||
| if (arg == "<FLAGS>") { | if (arg == "<FLAGS>") { | ||||
| extend(command, flags); | extend(command, flags); | ||||
| return {command, gnu_depfile_path}; | return {command, gnu_depfile_path}; | ||||
| } | } | ||||
| vector<string> toolchain::create_archive_command(const archive_spec& spec) const noexcept { | |||||
| vector<string> toolchain::create_archive_command(const archive_spec& spec, | |||||
| toolchain_knobs) const noexcept { | |||||
| vector<string> cmd; | vector<string> cmd; | ||||
| for (auto& arg : _link_archive) { | for (auto& arg : _link_archive) { | ||||
| if (arg == "<IN>") { | if (arg == "<IN>") { | ||||
| return cmd; | return cmd; | ||||
| } | } | ||||
| vector<string> toolchain::create_link_executable_command(const link_exe_spec& spec) const noexcept { | |||||
| vector<string> toolchain::create_link_executable_command(const link_exe_spec& spec, | |||||
| toolchain_knobs) const noexcept { | |||||
| vector<string> cmd; | vector<string> cmd; | ||||
| for (auto& arg : _link_exe) { | for (auto& arg : _link_exe) { | ||||
| if (arg == "<IN>") { | if (arg == "<IN>") { |
| cxx, | cxx, | ||||
| }; | }; | ||||
| struct toolchain_knobs { | |||||
| bool is_tty = false; | |||||
| }; | |||||
| struct compile_file_spec { | struct compile_file_spec { | ||||
| fs::path source_path; | fs::path source_path; | ||||
| fs::path out_path; | fs::path out_path; | ||||
| string_seq _link_archive; | string_seq _link_archive; | ||||
| string_seq _link_exe; | string_seq _link_exe; | ||||
| string_seq _warning_flags; | string_seq _warning_flags; | ||||
| string_seq _tty_flags; | |||||
| std::string _archive_prefix; | std::string _archive_prefix; | ||||
| std::string _archive_suffix; | std::string _archive_suffix; | ||||
| std::vector<std::string> definition_args(std::string_view s) const noexcept; | 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> include_args(const fs::path& p) const noexcept; | ||||
| std::vector<std::string> external_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; | |||||
| compile_command_info create_compile_command(const compile_file_spec&, | |||||
| toolchain_knobs) const noexcept; | |||||
| std::vector<std::string> create_archive_command(const archive_spec&, | |||||
| toolchain_knobs) const noexcept; | |||||
| std::vector<std::string> create_link_executable_command(const link_exe_spec&, | |||||
| toolchain_knobs) const noexcept; | |||||
| static std::optional<toolchain> get_builtin(std::string_view key) noexcept; | static std::optional<toolchain> get_builtin(std::string_view key) noexcept; | ||||
| static std::optional<toolchain> get_default(); | static std::optional<toolchain> get_default(); |
| #pragma once | |||||
| namespace dds { | |||||
| bool stdout_is_a_tty() noexcept; | |||||
| } // namespace dds |
| #if !_WIN32 | |||||
| #include <dds/util/output.hpp> | |||||
| #include <unistd.h> | |||||
| using namespace dds; | |||||
| bool dds::stdout_is_a_tty() noexcept { return ::isatty(STDOUT_FILENO) != 0; } | |||||
| #endif |
| #if _WIN32 | |||||
| #include <dds/util/output.hpp> | |||||
| bool dds::stdout_is_a_tty() noexcept { | |||||
| // XXX: Newer Windows consoles support ANSI color, so this should be made smarter | |||||
| return false; | |||||
| } | |||||
| #endif |
| Compiler-ID: GNU | Compiler-ID: GNU | ||||
| C++-Version: C++17 | |||||
| C-Compiler: gcc-9 | C-Compiler: gcc-9 | ||||
| C++-Compiler: g++-9 | C++-Compiler: g++-9 | ||||
| # Range-v3 0.10.0 contains an accidental conversion warning | # Range-v3 0.10.0 contains an accidental conversion warning | ||||
| Flags: -D SPDLOG_COMPILED_LIB -Werror=return-type -Wno-conversion | |||||
| C++-Flags: -fconcepts | |||||
| Flags: -D SPDLOG_COMPILED_LIB -Werror=return-type -Wno-sign-compare -Wno-conversion | |||||
| C++-Flags: -fconcepts -std=c++2a | |||||
| # Link-Flags: -static-libgcc -static-libstdc++ | # Link-Flags: -static-libgcc -static-libstdc++ | ||||
| Debug: True | Debug: True | ||||
| #Optimize: True | #Optimize: True |
| "compiler_id": "gnu", | "compiler_id": "gnu", | ||||
| "c_compiler": "gcc-9", | "c_compiler": "gcc-9", | ||||
| "cxx_compiler": "g++-9", | "cxx_compiler": "g++-9", | ||||
| "cxx_version": "c++17", | |||||
| // "cxx_version": "c++17", | |||||
| "flags": [ | "flags": [ | ||||
| "-DSPDLOG_COMPILED_LIB", // Required to use a compiled spdlog | "-DSPDLOG_COMPILED_LIB", // Required to use a compiled spdlog | ||||
| "-Werror=return-type" | |||||
| "-Werror=return-type", | |||||
| ], | ], | ||||
| "cxx_flags": [ | "cxx_flags": [ | ||||
| "-fconcepts" | |||||
| "-fconcepts", | |||||
| "-std=c++2a", | |||||
| ], | ], | ||||
| // "debug": true, | // "debug": true, | ||||
| "optimize": true, | "optimize": true, |