| @@ -0,0 +1,29 @@ | |||
| Error: Unable to find a default toolchain to use for the build | |||
| ############################################################## | |||
| Unlike other build systems, ``dds`` will not attempt to make a "best guess" | |||
| about the local platform and the available build toolchains. Instead, a | |||
| toolchain must be provided for every build. This can be named on the command | |||
| line with ``--toolchain`` or by placing a toolchain file in one of a few | |||
| prescribed locations. | |||
| Solution: Request a built-in toolchain | |||
| ************************************** | |||
| A built-in toolchain can be specified with the ``--toolchain`` (or ``-t``) | |||
| argument. Refer to the :ref:`toolchains.builtin` section for more information. | |||
| Solution: Set up a default toolchain file for the project or for your local user | |||
| ******************************************************************************** | |||
| If no toolchain argument is given when a build is invoked, ``dds`` will search | |||
| a predefined set of filepaths for the existence of a toolchain file to use as | |||
| the "default." Writing a simple toolchain to one of these paths will cause | |||
| ``dds`` to use this toolchain when none was provided. | |||
| .. seealso:: | |||
| For more information, refer to the full documentation page: | |||
| :doc:`/guide/toolchains` | |||
| @@ -88,6 +88,32 @@ The following pseudo-toolchains are also available: | |||
| Sets the C++ version to ``C++UV`` and uses the ``:XYZ`` toolchain. | |||
| .. _toolchains.default: | |||
| Providing a Default Toolchain File | |||
| ********************************** | |||
| If you do not which to provide a new toolchain for every individual project, | |||
| and the built-in toolchains do not suit your needs, you can write a toolchain | |||
| file to one of a few predefined paths, and ``dds`` will find and use it for the | |||
| build. The following paths are searched, in order: | |||
| #. ``$pwd/toolchain.dds`` - If the working directory contains ``toolchain.dds``, | |||
| it will be used as the default. | |||
| #. ``$dds_config_dir/toolchain.dds`` - Searches for a toolchain file in | |||
| ``dds``'s user-local configuration directory (see below). | |||
| #. ``$user_home/toolchain.dds`` - Searches for a toolchain file at the root of | |||
| the current user's home directory. (``$HOME`` on Unix-like systems, and | |||
| ``$PROFILE`` on Windows.) | |||
| The ``$dds_user_config`` directory is the ``dds`` subdirectory of the | |||
| user-local configuration directory. | |||
| The user-local config directory is ``$XDG_CONFIG_DIR`` or ``~/.config`` on | |||
| Linux, ``~/Library/Preferences`` on macOS, and ``~/AppData/Roaming`` on | |||
| Windows. | |||
| Toolchain Definitions | |||
| ********************* | |||
| @@ -31,11 +31,22 @@ struct toolchain_flag : string_flag { | |||
| toolchain_flag(args::Group& grp) | |||
| : string_flag{grp, | |||
| "toolchain_file", | |||
| "Path/ident of the toolchain to use", | |||
| {"toolchain", 't'}, | |||
| (dds::fs::current_path() / "toolchain.dds").string()} {} | |||
| "Path/identifier of the toolchain to use", | |||
| {"toolchain", 't'}} {} | |||
| dds::toolchain get_toolchain() { | |||
| if (*this) { | |||
| return get_arg(); | |||
| } else { | |||
| auto found = dds::toolchain::get_default(); | |||
| if (!found) { | |||
| dds::throw_user_error<dds::errc::no_default_toolchain>(); | |||
| } | |||
| return *found; | |||
| } | |||
| } | |||
| dds::toolchain get_arg() { | |||
| const auto tc_path = this->Get(); | |||
| if (tc_path.find(":") == 0) { | |||
| auto default_tc = tc_path.substr(1); | |||
| @@ -13,6 +13,8 @@ std::string error_url_suffix(dds::errc ec) noexcept { | |||
| switch (ec) { | |||
| case errc::invalid_builtin_toolchain: | |||
| return "invalid-builtin-toolchain.html"; | |||
| case errc::no_default_toolchain: | |||
| return "no-default-toolchain.html"; | |||
| case errc::no_such_catalog_package: | |||
| return "no-such-catalog-package.html"; | |||
| case errc::git_url_ref_mutual_req: | |||
| @@ -84,6 +86,13 @@ toolchain. (Toolchain file paths cannot begin with a leading colon). | |||
| These toolchain names are encoded into the dds executable and cannot be | |||
| modified. | |||
| )"; | |||
| case errc::no_default_toolchain: | |||
| return R"( | |||
| `dds` requires a toolchain to be specified in order to execute the build. `dds` | |||
| will not perform a "best-guess" at a default toolchain. You may either pass the | |||
| name of a built-in toolchain, or write a "default toolchain" file to one of the | |||
| supported filepaths. Refer to the documentation for more information. | |||
| )"; | |||
| case errc::no_such_catalog_package: | |||
| return R"( | |||
| @@ -227,6 +236,8 @@ std::string_view dds::default_error_string(dds::errc ec) noexcept { | |||
| switch (ec) { | |||
| case errc::invalid_builtin_toolchain: | |||
| return "The built-in toolchain name is invalid"; | |||
| case errc::no_default_toolchain: | |||
| return "Unable to find a default toolchain to use for the build"; | |||
| case errc::no_such_catalog_package: | |||
| return "The catalog has no entry for the given package ID"; | |||
| case errc::git_url_ref_mutual_req: | |||
| @@ -10,6 +10,7 @@ namespace dds { | |||
| enum class errc { | |||
| none = 0, | |||
| invalid_builtin_toolchain, | |||
| no_default_toolchain, | |||
| no_such_catalog_package, | |||
| git_url_ref_mutual_req, | |||
| test_failure, | |||
| @@ -3,6 +3,7 @@ | |||
| #include <dds/toolchain/from_dds.hpp> | |||
| #include <dds/toolchain/prep.hpp> | |||
| #include <dds/util/algo.hpp> | |||
| #include <dds/util/paths.hpp> | |||
| #include <dds/util/string.hpp> | |||
| #include <cassert> | |||
| @@ -235,3 +236,17 @@ std::optional<toolchain> toolchain::get_builtin(std::string_view tc_id) noexcept | |||
| tc_content += "Compiler-ID: " + opt_triple->id + "\n"; | |||
| return parse_toolchain_dds(tc_content); | |||
| } | |||
| std::optional<dds::toolchain> dds::toolchain::get_default() { | |||
| auto candidates = { | |||
| fs::current_path() / "toolchain.dds", | |||
| dds_config_dir() / "toolchain.dds", | |||
| user_home_dir() / "toolchain.dds", | |||
| }; | |||
| for (auto&& cand : candidates) { | |||
| if (fs::exists(cand)) { | |||
| return parse_toolchain_dds(slurp_file(cand)); | |||
| } | |||
| } | |||
| return std::nullopt; | |||
| } | |||
| @@ -82,6 +82,7 @@ public: | |||
| std::vector<std::string> create_link_executable_command(const link_exe_spec&) const noexcept; | |||
| static std::optional<toolchain> get_builtin(std::string_view key) noexcept; | |||
| static std::optional<toolchain> get_default(); | |||
| }; | |||
| } // namespace dds | |||