Skip to content

Commit 2d1a087

Browse files
committed
Initial self-host.
1 parent 5e7fbc3 commit 2d1a087

16 files changed

Lines changed: 120 additions & 73 deletions

File tree

cppan.yml

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,18 @@ projects:
100100
- pvt.cppan.demo.boost.dll: 1
101101
- pvt.cppan.demo.boost.filesystem: 1
102102

103+
tools.self_builder:
104+
root_directory: src/tools
105+
files: self_builder.cpp
106+
dependencies:
107+
- manager
108+
- name: pvt.egorpugin.primitives.sw.main
109+
version: master
110+
local: primitives.sw.main
111+
- name: pvt.egorpugin.primitives.context
112+
version: master
113+
local: primitives.context
114+
103115
client:
104116
root_directory: src/client
105117
executable_type: win32
@@ -153,6 +165,8 @@ projects:
153165
- builder
154166
- pvt.cppan.demo.boost.assign: 1
155167
private:
168+
- name: tools.self_builder
169+
ref: self_builder
156170
- name: pvt.egorpugin.primitives.context
157171
version: master
158172
local: primitives.context
@@ -183,6 +197,13 @@ projects:
183197
embed(${SDIR}/src/driver/cpp/inserts/inserts.cpp.in ${SDIR}/src/driver/cpp/inserts/cppan.cpp)
184198
set_source_files_properties(${SDIR}/src/driver/cpp/inserts/cppan.cpp PROPERTIES HEADER_FILE_ONLY TRUE)
185199
200+
set(f ${BDIR}/build_self.generated.h)
201+
add_custom_command(OUTPUT ${f}
202+
COMMAND ${self_builder} ${f}
203+
DEPENDS ${self_builder}
204+
)
205+
set(src ${src} ${f})
206+
186207
post_target: |
187208
cppan_flex_bison_internal(src/driver/cpp/bazel/lexer.ll PARSERS src/driver/cpp/bazel/grammar.yy)
188209
@@ -310,7 +331,6 @@ projects:
310331
local: primitives.db.sqlite3
311332
- pvt.cppan.demo.rbock.sqlpp11_connector_sqlite3: 0
312333
- pvt.cppan.demo.boost.variant: 1
313-
- pvt.cppan.demo.apolukhin.stacktrace: master
314334
- name: pvt.egorpugin.primitives.tools.embedder
315335
version: master
316336
ref: embedder

src/driver/cpp/bazel/bazel.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,14 @@ Values File::getFiles(const Name &name, const std::string &bazel_target_function
128128
}
129129
}
130130
}
131-
return values;
131+
Values vls;
132+
for (auto &v : values)
133+
{
134+
auto s = v;
135+
::trimQuotes(s);
136+
vls.insert(s);
137+
}
138+
return vls;
132139
}
133140

134141
File parse(const std::string &s)

src/driver/cpp/bazel/lexer.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#pragma warning(disable: 4005)
33
#include <string>
44

5-
#include "bazel/grammar.hpp"
5+
#include "grammar.yy.hpp"
66

77
#define YY_USER_ACTION loc.columns(yyleng);
88

src/driver/cpp/driver.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ static auto fetch1(const Driver *driver, const path &file_or_dir)
160160
{
161161
LOG_INFO(logger, "Downloading source:\n" << print_source(src));
162162
fs::create_directories(d);
163-
ScopedCurrentPath scp(d);
163+
ScopedCurrentPath scp(d, CurrentPathScope::Thread);
164164
download(src);
165165
}
166166
d = d / findRootDirectory(d); // pass found regex or files for better root dir lookup
@@ -194,7 +194,7 @@ PackageScriptPtr Driver::fetch_and_load(const path &file_or_dir) const
194194
applyVersionToUrl(s2, pkg.version);
195195
auto i = srcs.find(s2);
196196
path rd = i->second / t->RootDirectory;
197-
ScopedCurrentPath scp(rd);
197+
ScopedCurrentPath scp(rd, CurrentPathScope::Thread);
198198

199199
t->SourceDir = rd;
200200
t->prepare();

src/driver/cpp/self/build_self.cpp

Lines changed: 6 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -303,62 +303,18 @@ void build_boost(Solution &s)
303303
post_sources();
304304
}
305305

306+
#include <build_self.generated.h>
307+
306308
void build_other(Solution &s)
307309
{
308-
auto &zlib = addTarget<LibraryTarget>(s, "pvt.cppan.demo.madler.zlib", "1");
309-
zlib += ".*\\.[hc]"_rr;
310-
zlib += sw::Shared, "ZLIB_DLL"_d;
311-
//auto zlib = "pub.cppan2.demo.madler.zlib"_dep;
310+
build_self_generated(s);
312311

313-
auto &bzip2 = addTarget<LibraryTarget>(s, "pvt.cppan.demo.bzip2", "1");
314-
{
315-
bzip2 +=
316-
"blocksort.c",
317-
"bzlib.[hc]"_r,
318-
"bzlib_private.h",
319-
"compress.c",
320-
"crctable.c",
321-
"decompress.c",
322-
"huffman.c",
323-
"randtable.c"
324-
;
325-
bzip2.Public += sw::Shared, "BZ_SHARED"_d;
326-
bzip2.Interface += sw::Shared, "BZ_IMPORT"_d;
327-
328-
bzip2.replaceInFileOnce("bzlib.h",
329-
"#ifdef _WIN32",
330-
R"(
331-
#ifdef _WIN32
332-
#include <windows.h>
333-
#ifdef small
334-
#undef small
335-
#endif
336-
#endif
337-
#if defined(_WIN32) && defined(BZ_SHARED)
338-
)"
339-
);
340-
bzip2.replaceInFileOnce("bzlib.h",
341-
"# define BZ_API(func) WINAPI func\n# define BZ_EXTERN extern",
342-
"# define BZ_API(func) func\n# define BZ_EXTERN __declspec(dllexport)"
343-
);
344-
bzip2.replaceInFileOnce("bzlib.h",
345-
"# define BZ_API(func) (WINAPI * func)\n# define BZ_EXTERN",
346-
"# define BZ_API(func) func\n# define BZ_EXTERN __declspec(dllimport)"
347-
);
348-
}
312+
auto &zlib = s.getTarget<LibraryTarget>("org.sw.demo.madler.zlib");
313+
auto &bzip2 = s.getTarget<LibraryTarget>("org.sw.demo.bzip2");
314+
auto &sqlite3 = s.getTarget<LibraryTarget>("org.sw.demo.sqlite3");
349315

350316
*boost_targets["iostreams"] += bzip2, zlib;
351317

352-
//
353-
auto &sqlite3 = addTarget<LibraryTarget>(s, "pvt.cppan.demo.sqlite3", "3");
354-
sqlite3.ApiName = "SQLITE_API";
355-
356-
/*auto &nowide = addTarget<LibraryTarget>(s, "pvt.cppan.demo.artyom_beilis.nowide", "master");
357-
addPrivateDefinitions(nowide, "NOWIDE");
358-
addStaticDefinitions(nowide, "NOWIDE");
359-
addSharedDefinitions(nowide, "NOWIDE");
360-
nowide.Public += *boost_targets["locale"], *boost_targets["config"];*/
361-
362318
auto &yaml_cpp = addTarget<StaticLibraryTarget>(s, "pvt.cppan.demo.jbeder.yaml_cpp", "master");
363319
yaml_cpp.Private << sw::Shared << "yaml_cpp_EXPORTS"_d;
364320
yaml_cpp.Public << sw::Shared << "YAML_CPP_DLL"_d;

src/driver/cpp/target.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,7 @@ void TargetBase::fetch()
372372
if (!fs::exists(d))
373373
{
374374
fs::create_directories(d);
375-
ScopedCurrentPath scp(d);
375+
ScopedCurrentPath scp(d, CurrentPathScope::Thread);
376376
applyVersionToUrl(source, pkg.version);
377377
download(source);
378378
}

src/manager/database.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -469,7 +469,7 @@ String ServiceDatabase::getInstalledPackageHash(const PackageId &p) const
469469
return q.front().hash.value();
470470
}
471471

472-
int ServiceDatabase::getInstalledPackageId(const PackageId &p) const
472+
int64_t ServiceDatabase::getInstalledPackageId(const PackageId &p) const
473473
{
474474
const auto ipkgs = db::service::InstalledPackage{};
475475
auto q = (*db)(select(ipkgs.installedPackageId).from(ipkgs).where(ipkgs.path == p.ppath.toString() and ipkgs.version == p.version.toString()));
@@ -480,7 +480,7 @@ int ServiceDatabase::getInstalledPackageId(const PackageId &p) const
480480

481481
int ServiceDatabase::getInstalledPackageConfigId(const PackageId &p, const String &config) const
482482
{
483-
int pid = getInstalledPackageId(p);
483+
auto pid = getInstalledPackageId(p);
484484
if (pid == 0)
485485
{
486486
LOG_DEBUG(logger, "PackageId is not installed: " + p.target_name);
@@ -804,11 +804,10 @@ IdDependencies PackagesDatabase::findDependencies(const UnresolvedPackages &deps
804804

805805
project.id = q.front().packageId.value();
806806

807+
project.id = getExactProjectVersionId(project, project.version, project.flags, project.hash, project.group_number, project.prefix);
807808
project.flags.set(pfDirectDependency);
808-
project.id = getExactProjectVersionId(project, project.version, project.flags, project.hash, project.group_number);
809809
all_deps[project] = project; // assign first, deps assign second
810810
all_deps[project].db_dependencies = getProjectDependencies(project.id, all_deps);
811-
812811
}
813812

814813
// make id deps
@@ -839,7 +838,7 @@ void check_version_age(const std::string &created)
839838
throw std::runtime_error("One of the queried packages is 'young'. Young packages must be retrieved from server.");
840839
}
841840

842-
db::PackageVersionId PackagesDatabase::getExactProjectVersionId(const DownloadDependency &project, Version &version, SomeFlags &flags, String &hash, PackageVersionGroupNumber &gn) const
841+
db::PackageVersionId PackagesDatabase::getExactProjectVersionId(const DownloadDependency &project, Version &version, SomeFlags &flags, String &hash, PackageVersionGroupNumber &gn, int &prefix) const
843842
{
844843
auto err = [](const auto &p, const auto &r)
845844
{
@@ -866,7 +865,7 @@ db::PackageVersionId PackagesDatabase::getExactProjectVersionId(const DownloadDe
866865

867866
id = version_ids[v.value()];
868867
auto q = (*db)(
869-
select(pkg_ver.hash, pkg_ver.flags, pkg_ver.updated, pkg_ver.groupNumber)
868+
select(pkg_ver.hash, pkg_ver.flags, pkg_ver.updated, pkg_ver.groupNumber, pkg_ver.prefix)
870869
.from(pkg_ver)
871870
.where(pkg_ver.packageVersionId == id));
872871
auto &row = q.front();
@@ -875,6 +874,7 @@ db::PackageVersionId PackagesDatabase::getExactProjectVersionId(const DownloadDe
875874
flags = row.flags.value();
876875
check_version_age(row.updated.value());
877876
gn = row.groupNumber.value();
877+
prefix = row.prefix.value();
878878

879879
return id;
880880
}
@@ -896,7 +896,7 @@ PackagesDatabase::Dependencies PackagesDatabase::getProjectDependencies(db::Pack
896896
dependency.id = row.packageId.value();
897897
dependency.ppath = row.path.value();
898898
dependency.range = row.versionRange.value();
899-
dependency.id = getExactProjectVersionId(dependency, dependency.version, dependency.flags, dependency.hash, dependency.group_number);
899+
dependency.id = getExactProjectVersionId(dependency, dependency.version, dependency.flags, dependency.hash, dependency.group_number, dependency.prefix);
900900
auto i = dm.find(dependency);
901901
if (i == dm.end())
902902
{
@@ -940,7 +940,8 @@ Version PackagesDatabase::getExactVersionForPackage(const PackageId &p) const
940940
SomeFlags f;
941941
String h;
942942
PackageVersionGroupNumber gn;
943-
getExactProjectVersionId(d, v, f, h, gn);
943+
int prefix;
944+
getExactProjectVersionId(d, v, f, h, gn, prefix);
944945
return v;
945946
}
946947

src/manager/database.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ struct SW_MANAGER_API ServiceDatabase : public Database
102102
void addInstalledPackage(const PackageId &p, PackageVersionGroupNumber group_number) const;
103103
void removeInstalledPackage(const PackageId &p) const;
104104
String getInstalledPackageHash(const PackageId &p) const;
105-
int getInstalledPackageId(const PackageId &p) const;
105+
int64_t getInstalledPackageId(const PackageId &p) const;
106106
int getInstalledPackageConfigId(const PackageId &p, const String &config) const;
107107
SomeFlags getInstalledPackageFlags(const PackageId &p, const String &config) const;
108108
void setInstalledPackageFlags(const PackageId &p, const String &config, const SomeFlags &f) const;
@@ -144,7 +144,7 @@ class SW_MANAGER_API PackagesDatabase : public Database
144144

145145
bool isCurrentDbOld() const;
146146

147-
db::PackageVersionId getExactProjectVersionId(const DownloadDependency &project, Version &version, SomeFlags &flags, String &hash, PackageVersionGroupNumber &gn) const;
147+
db::PackageVersionId getExactProjectVersionId(const DownloadDependency &project, Version &version, SomeFlags &flags, String &hash, PackageVersionGroupNumber &gn, int &prefix) const;
148148
Dependencies getProjectDependencies(db::PackageVersionId project_version_id, DependenciesMap &dm) const;
149149
};
150150

src/manager/dependency.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ struct ExtendedPackageData : Package
1818
db::PackageVersionId id = 0;
1919
String hash;
2020
PackageVersionGroupNumber group_number = 0;
21+
int prefix = 2;
2122
const Remote *remote = nullptr;
2223
};
2324

src/manager/inserts/packages_db_schema.sql

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ CREATE TABLE package_version (
4343

4444
-- packages have same group_number when they are came from the same build script
4545
group_number INTEGER NOT NULL,
46+
prefix INTEGER NOT NULL DEFAULT 2,
4647
updated TEXT NOT NULL,
4748
hash TEXT NOT NULL
4849
);
@@ -71,6 +72,14 @@ CREATE TABLE package_version_dependency (
7172
--
7273
--------------------------------------------------------------------------------
7374

75+
--------------------------------------------------------------------------------
76+
-- %split
77+
--------------------------------------------------------------------------------
78+
79+
alter table package_version
80+
add column
81+
prefix int NOT NULL DEFAULT 2;
82+
7483
--------------------------------------------------------------------------------
7584
-- % split - merge '%' and 'split' together when patches are available
7685
--------------------------------------------------------------------------------

0 commit comments

Comments
 (0)