@@ -80,6 +80,85 @@ const TargetSettings &SwCoreContext::getHostSettings() const
8080 return host_settings;
8181}
8282
83+ TargetData &SwCoreContext::getTargetData (const PackageId &pkg)
84+ {
85+ return target_data[pkg];
86+ }
87+
88+ const TargetData &SwCoreContext::getTargetData (const PackageId &pkg) const
89+ {
90+ auto i = target_data.find (pkg);
91+ if (i == target_data.end ())
92+ throw SW_RUNTIME_ERROR (" No target data for package: " + pkg.toString ());
93+ return i->second ;
94+ }
95+
96+ void SwCoreContext::loadPackages (TargetMap &targets) const
97+ {
98+ loadPackages (targets, getPredefinedTargets ());
99+ }
100+
101+ void SwCoreContext::loadPackages (TargetMap &targets, const TargetMap &predefined) const
102+ {
103+ // first, we create all package ids with EPs in targets
104+ for (auto &[p, _] : target_data)
105+ targets[p];
106+
107+ // load
108+ while (1 )
109+ {
110+ std::map<TargetSettings, std::pair<PackageId, TargetContainer *>> load;
111+ auto &chld = targets; // take a ref, because it won't be changed in this loop
112+ for (const auto &[pkg, tgts] : chld)
113+ {
114+ for (const auto &tgt : tgts)
115+ {
116+ auto deps = tgt->getDependencies ();
117+ for (auto &d : deps)
118+ {
119+ if (d->isResolved ())
120+ continue ;
121+
122+ auto i = chld.find (d->getUnresolvedPackage ());
123+ if (i == chld.end ())
124+ throw SW_RUNTIME_ERROR (" No target loaded: " + d->getUnresolvedPackage ().toString ());
125+
126+ auto k = i->second .find (d->getSettings ());
127+ if (k != i->second .end ())
128+ {
129+ d->setTarget (**k);
130+ continue ;
131+ }
132+
133+ if (predefined.find (d->getUnresolvedPackage ().ppath ) != predefined.end (d->getUnresolvedPackage ().ppath ))
134+ {
135+ throw SW_LOGIC_ERROR (tgt->getPackage ().toString () + " : predefined target is not resolved: " + d->getUnresolvedPackage ().toString ());
136+ }
137+
138+ load.insert ({ d->getSettings (), { i->first , &i->second } });
139+ }
140+ }
141+ }
142+ if (load.empty ())
143+ break ;
144+ for (auto &[s, d] : load)
145+ {
146+ // empty settings mean we want dependency only to be present
147+ if (s.empty ())
148+ continue ;
149+
150+ getTargetData (d.first ).loadPackages (targets, s, {}/* { d.first }*/ );
151+ auto k = d.second ->find (s);
152+ if (k == d.second ->end ())
153+ {
154+ // throw SW_RUNTIME_ERROR("cannot load package with current settings:\n" + s.toString());
155+ throw SW_RUNTIME_ERROR (" cannot load package " + d.first .toString () + " with current settings\n " + s.toString ());
156+ }
157+ }
158+ }
159+ }
160+
161+
83162SwContext::SwContext (const path &local_storage_root_dir)
84163 : SwCoreContext(local_storage_root_dir)
85164{
@@ -89,7 +168,7 @@ SwContext::~SwContext()
89168{
90169}
91170
92- SwBuild SwContext::createBuild () const
171+ SwBuild SwContext::createBuild ()
93172{
94173 SwBuild b (*this );
95174 b.getTargets () = getPredefinedTargets ();
0 commit comments