blob: 1d9b30ba1faf1cc2cd8e323193363e87a01ffe35 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
/*
*/
#include "manifest.h"
#include <vector>
#include <algorithm>
struct BuildList
{
struct BuildEnt {
const PackageManifest* package;
unsigned level;
};
::std::vector<BuildEnt> m_list;
void add_package(const PackageManifest& p, unsigned level);
void sort_list();
struct Iter {
const BuildList& l;
size_t i;
const PackageManifest& operator*() const {
return *this->l.m_list[this->l.m_list.size() - this->i - 1].package;
}
void operator++() {
this->i++;
}
bool operator!=(const Iter& x) const {
return this->i != x.i;
}
Iter begin() const {
return *this;
}
Iter end() {
return Iter{ this->l, this->l.m_list.size() };
}
};
Iter iter() const {
return Iter { *this, 0 };
}
};
void MiniCargo_Build(const PackageManifest& manifest)
{
BuildList list;
// Generate sorted dependency list
for (const auto& dep : manifest.dependencies())
{
list.add_package(dep.get_package(), 1);
}
// Build dependencies
for(const auto& p : list.iter())
{
if( ! p.build_lib() )
return ;
}
if( ! manifest.build_lib() )
return ;
// TODO: If the manifest doesn't have a library, build the binary
}
void BuildList::add_package(const PackageManifest& p, unsigned level)
{
for(auto& ent : m_list)
{
if(ent.package == &p)
{
ent.level = level;
return ;
}
}
m_list.push_back({ &p, level });
for (const auto& dep : p.dependencies())
{
add_package(dep.get_package(), level+1);
}
}
void BuildList::sort_list()
{
::std::sort(m_list.begin(), m_list.end(), [](const auto& a, const auto& b){ return a.level < b.level; });
}
|