diff options
-rw-r--r-- | bpkg/cfg-create.cxx | 2 | ||||
-rw-r--r-- | bpkg/database.cxx | 77 | ||||
-rw-r--r-- | bpkg/database.hxx | 36 | ||||
-rw-r--r-- | bpkg/package.cxx | 2 | ||||
-rw-r--r-- | bpkg/pkg-build.cxx | 13 |
5 files changed, 102 insertions, 28 deletions
diff --git a/bpkg/cfg-create.cxx b/bpkg/cfg-create.cxx index 98d6aea..42c7cea 100644 --- a/bpkg/cfg-create.cxx +++ b/bpkg/cfg-create.cxx @@ -54,7 +54,7 @@ namespace bpkg hc = normalize (*host_config, "host configuration"); database db (hc, trace, false /* pre_attach */); - if (db.type != "host") + if (db.type != host_config_type) fail << "host configuration " << hc << " is of '" << db.type << "' type"; } diff --git a/bpkg/database.cxx b/bpkg/database.cxx index 1b7612f..40110e6 100644 --- a/bpkg/database.cxx +++ b/bpkg/database.cxx @@ -20,6 +20,10 @@ namespace bpkg { namespace sqlite = odb::sqlite; + const string target_config_type ("target"); + const string host_config_type ("host"); + const string build2_config_type ("build2"); + // Register the data migration functions. // // NOTE: remember to qualify table names with \"main\". if using native @@ -47,7 +51,7 @@ namespace bpkg // Add the unnamed self-association of the target type. // shared_ptr<configuration> sc ( - make_shared<configuration> (optional<string> (), "target")); + make_shared<configuration> (optional<string> (), target_config_type)); db.persist (sc); db.execute ("UPDATE selected_package_prerequisites SET configuration = '" + @@ -621,25 +625,54 @@ namespace bpkg } associated_databases database:: - dependency_configs (optional<bool> buildtime) + dependency_configs (optional<bool> buildtime, const std::string& type) { + if (buildtime) + assert (!*buildtime || + type == host_config_type || + type == build2_config_type); + else + assert (type.empty ()); + associated_databases r; + // Allow dependency configurations of the dependent configuration own type + // if all or runtime dependency configurations are requested. + // bool allow_own_type (!buildtime || !*buildtime); - bool allow_host_type (!buildtime || *buildtime); + + // Allow dependency configurations of the host type if all or regular + // builtime dependency configurations are requested. + // + bool allow_host_type (!buildtime || + (*buildtime && type == host_config_type)); + + // Allow dependency configurations of the build2 type if all or build2 + // system module dependency configurations are requested. + // + bool allow_build2_type (!buildtime || + (*buildtime && type == build2_config_type)); // Add the associated database to the resulting list if it is of the - // associating database type and allow_own_type is true or if it is of the - // host type and allow_host_type is true. Call itself recursively for the - // explicitly associated configurations. + // associating database type and allow_own_type is true, or it is of the + // host type and allow_host_type is true, or it is of the build2 type and + // allow_build2_type is true. Call itself recursively for the explicitly + // associated configurations. // // Note that the associated database of the associating database type is // not added if allow_own_type is false but its own associated databases - // of the host type are added, if allow_host_type is true. + // of the host/build2 type are added, if allow_host_type/allow_build2_type + // is true. // associated_databases descended; // Note: we may not add but still descend. - auto add = [&r, allow_own_type, allow_host_type, &descended] - (database& db, const std::string& t, const auto& add) + auto add = [&r, + allow_own_type, + allow_host_type, + allow_build2_type, + &descended] + (database& db, + const std::string& t, + const auto& add) { if (std::find (descended.begin (), descended.end (), db) != descended.end ()) @@ -647,13 +680,16 @@ namespace bpkg descended.push_back (db); - bool own (db.type == t); - bool host (db.type == "host"); + bool own (db.type == t); + bool host (db.type == host_config_type); + bool build2 (db.type == build2_config_type); - if (!own && !(allow_host_type && host)) + if (!own && !(allow_host_type && host) && !(allow_build2_type && build2)) return; - if ((allow_own_type && own) || (allow_host_type && host)) + if ((allow_own_type && own) || + (allow_host_type && host) || + (allow_build2_type && build2)) r.push_back (db); const associated_configs& acs (db.explicit_associations ()); @@ -668,6 +704,21 @@ namespace bpkg return r; } + associated_databases database:: + dependency_configs (const package_name& n, bool buildtime) + { + return dependency_configs (buildtime, + buildtime + ? buildtime_dependency_config_type (n) + : empty_string); + } + + associated_databases database:: + dependency_configs () + { + return dependency_configs (nullopt, empty_string); + } + database& database:: find_attached (uint64_t id) { diff --git a/bpkg/database.hxx b/bpkg/database.hxx index 8367ed7..d42b254 100644 --- a/bpkg/database.hxx +++ b/bpkg/database.hxx @@ -161,6 +161,8 @@ namespace bpkg associated_databases& implicit_associations (bool attach = true, bool sys_rep = false); + // @@ AC Update + // // Return configurations of potential dependencies of packages selected in // the current configuration. // @@ -197,7 +199,10 @@ namespace bpkg // included. // associated_databases - dependency_configs (optional<bool> buildtime = nullopt); + dependency_configs (const package_name& n, bool buildtime); + + associated_databases + dependency_configs (); // Return configurations of potential dependents of packages selected in // the current configuration. @@ -346,6 +351,11 @@ namespace bpkg void add_env (bool reset = false) const; + // @@ AC Describe. + // + associated_databases + dependency_configs (optional<bool> buildtime, const std::string& type); + impl* impl_; associated_configs explicit_associations_; @@ -392,16 +402,30 @@ namespace bpkg return os; } - inline string + // The predefined configuration types. + // + extern const string target_config_type; + extern const string host_config_type; + extern const string build2_config_type; + + // Return the configuration type suitable for building a build-time + // dependency. + // + inline const string& buildtime_dependency_config_type (const package_name& nm) { - return nm.string ().compare (0, 10, "libbuild2-") == 0 ? "build2" : "host"; + return nm.string ().compare (0, 10, "libbuild2-") == 0 + ? build2_config_type + : host_config_type; } - inline string - dependency_config_type (database& db, const package_name& nm, bool buildtime) + // Return the configuration type suitable for building a dependency of the + // dependent in the specified configuration. + // + inline const string& + dependency_config_type (database& db, const package_name& n, bool buildtime) { - return buildtime ? buildtime_dependency_config_type (nm) : db.type; + return buildtime ? buildtime_dependency_config_type (n) : db.type; } // Transaction wrapper that allow the creation of dummy transactions (start diff --git a/bpkg/package.cxx b/bpkg/package.cxx index abfcd55..5c2235d 100644 --- a/bpkg/package.cxx +++ b/bpkg/package.cxx @@ -554,7 +554,7 @@ namespace bpkg { pair<shared_ptr<selected_package>, database*> r; - for (database& adb: db.dependency_configs (buildtime)) + for (database& adb: db.dependency_configs (pn, buildtime)) { shared_ptr<selected_package> p (adb.find<selected_package> (pn)); diff --git a/bpkg/pkg-build.cxx b/bpkg/pkg-build.cxx index 37bd99f..ff26b41 100644 --- a/bpkg/pkg-build.cxx +++ b/bpkg/pkg-build.cxx @@ -1089,8 +1089,8 @@ namespace bpkg } // If this is a build-time dependency and we build it for the first - // time, then we need to find a suitable configuration (of the - // respective type) to build it in. + // time, then we need to find a suitable configuration (of the host or + // build2 type) to build it in. // // If the current configuration (ddb) is of the required type, then we // use that. Otherwise, we go through its immediate explicit @@ -1106,7 +1106,7 @@ namespace bpkg if (da.buildtime && dsp == nullptr) { database* db (nullptr); - string type (buildtime_dependency_config_type (dn)); + const string& type (buildtime_dependency_config_type (dn)); // Note that the first returned association is for ddb itself. // @@ -2200,7 +2200,7 @@ namespace bpkg { iterator r (end ()); - associated_databases adbs (db.dependency_configs (buildtime)); + associated_databases adbs (db.dependency_configs (pn, buildtime)); for (database& adb: adbs) { @@ -4571,9 +4571,8 @@ namespace bpkg return i.name == nm; })); - const char* tp (buildtime ? "host" : db.type.c_str ()); - - if (i != conf_pkgs.end () && i->db.type == tp) + if (i != conf_pkgs.end () && + i->db.type == dependency_config_type (db, nm, buildtime)) return &i->db; } |