libstore: remove static initializers for Store registrations
Ref #359. Change-Id: Ia45530ddee25fa9fc399ff10738bb0d8bbc8b221
This commit is contained in:
parent
ca08f1217d
commit
4f02255c20
23 changed files with 118 additions and 30 deletions
|
@ -1,3 +1,4 @@
|
||||||
|
#include "dummy-store.hh"
|
||||||
#include "store-api.hh"
|
#include "store-api.hh"
|
||||||
|
|
||||||
namespace nix {
|
namespace nix {
|
||||||
|
@ -73,6 +74,8 @@ struct DummyStore : public virtual DummyStoreConfig, public virtual Store
|
||||||
{ unsupported("getFSAccessor"); }
|
{ unsupported("getFSAccessor"); }
|
||||||
};
|
};
|
||||||
|
|
||||||
static RegisterStoreImplementation<DummyStore, DummyStoreConfig> regDummyStore;
|
void registerDummyStore() {
|
||||||
|
StoreImplementations::add<DummyStore, DummyStoreConfig>();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
8
src/libstore/dummy-store.hh
Normal file
8
src/libstore/dummy-store.hh
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
#pragma once
|
||||||
|
///@file
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
void registerDummyStore();
|
||||||
|
|
||||||
|
}
|
|
@ -33,6 +33,16 @@
|
||||||
#include <sys/sysctl.h>
|
#include <sys/sysctl.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// All built-in store implementations.
|
||||||
|
#include "dummy-store.hh"
|
||||||
|
#include "http-binary-cache-store.hh"
|
||||||
|
#include "legacy-ssh-store.hh"
|
||||||
|
#include "local-binary-cache-store.hh"
|
||||||
|
#include "local-store.hh"
|
||||||
|
#include "s3-binary-cache-store.hh"
|
||||||
|
#include "ssh-store.hh"
|
||||||
|
#include "uds-remote-store.hh"
|
||||||
|
|
||||||
namespace nix {
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
|
@ -396,6 +406,17 @@ static void preloadNSS()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void registerStoreImplementations() {
|
||||||
|
registerDummyStore();
|
||||||
|
registerHttpBinaryCacheStore();
|
||||||
|
registerLegacySSHStore();
|
||||||
|
registerLocalBinaryCacheStore();
|
||||||
|
registerLocalStore();
|
||||||
|
registerS3BinaryCacheStore();
|
||||||
|
registerSSHStore();
|
||||||
|
registerUDSRemoteStore();
|
||||||
|
}
|
||||||
|
|
||||||
static bool initLibStoreDone = false;
|
static bool initLibStoreDone = false;
|
||||||
|
|
||||||
void assertLibStoreInitialized() {
|
void assertLibStoreInitialized() {
|
||||||
|
@ -433,6 +454,8 @@ void initLibStore() {
|
||||||
unsetenv("TMPDIR");
|
unsetenv("TMPDIR");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
registerStoreImplementations();
|
||||||
|
|
||||||
initLibStoreDone = true;
|
initLibStoreDone = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
#include "http-binary-cache-store.hh"
|
||||||
#include "binary-cache-store.hh"
|
#include "binary-cache-store.hh"
|
||||||
#include "filetransfer.hh"
|
#include "filetransfer.hh"
|
||||||
#include "globals.hh"
|
#include "globals.hh"
|
||||||
|
@ -194,6 +195,8 @@ protected:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static RegisterStoreImplementation<HttpBinaryCacheStore, HttpBinaryCacheStoreConfig> regHttpBinaryCacheStore;
|
void registerHttpBinaryCacheStore() {
|
||||||
|
StoreImplementations::add<HttpBinaryCacheStore, HttpBinaryCacheStoreConfig>();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
8
src/libstore/http-binary-cache-store.hh
Normal file
8
src/libstore/http-binary-cache-store.hh
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
#pragma once
|
||||||
|
///@file
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
void registerHttpBinaryCacheStore();
|
||||||
|
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
#include "ssh-store-config.hh"
|
#include "legacy-ssh-store.hh"
|
||||||
#include "archive.hh"
|
#include "archive.hh"
|
||||||
#include "pool.hh"
|
#include "pool.hh"
|
||||||
#include "remote-store.hh"
|
#include "remote-store.hh"
|
||||||
|
@ -8,6 +8,7 @@
|
||||||
#include "store-api.hh"
|
#include "store-api.hh"
|
||||||
#include "path-with-outputs.hh"
|
#include "path-with-outputs.hh"
|
||||||
#include "ssh.hh"
|
#include "ssh.hh"
|
||||||
|
#include "ssh-store.hh"
|
||||||
#include "derivations.hh"
|
#include "derivations.hh"
|
||||||
|
|
||||||
namespace nix {
|
namespace nix {
|
||||||
|
@ -412,6 +413,8 @@ public:
|
||||||
{ unsupported("queryRealisation"); }
|
{ unsupported("queryRealisation"); }
|
||||||
};
|
};
|
||||||
|
|
||||||
static RegisterStoreImplementation<LegacySSHStore, LegacySSHStoreConfig> regLegacySSHStore;
|
void registerLegacySSHStore() {
|
||||||
|
StoreImplementations::add<LegacySSHStore, LegacySSHStoreConfig>();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
8
src/libstore/legacy-ssh-store.hh
Normal file
8
src/libstore/legacy-ssh-store.hh
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
#pragma once
|
||||||
|
///@file
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
void registerLegacySSHStore();
|
||||||
|
|
||||||
|
}
|
|
@ -1,3 +1,4 @@
|
||||||
|
#include "local-binary-cache-store.hh"
|
||||||
#include "binary-cache-store.hh"
|
#include "binary-cache-store.hh"
|
||||||
#include "globals.hh"
|
#include "globals.hh"
|
||||||
#include "nar-info-disk-cache.hh"
|
#include "nar-info-disk-cache.hh"
|
||||||
|
@ -124,6 +125,8 @@ std::set<std::string> LocalBinaryCacheStore::uriSchemes()
|
||||||
return {"file"};
|
return {"file"};
|
||||||
}
|
}
|
||||||
|
|
||||||
static RegisterStoreImplementation<LocalBinaryCacheStore, LocalBinaryCacheStoreConfig> regLocalBinaryCacheStore;
|
void registerLocalBinaryCacheStore() {
|
||||||
|
StoreImplementations::add<LocalBinaryCacheStore, LocalBinaryCacheStoreConfig>();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
8
src/libstore/local-binary-cache-store.hh
Normal file
8
src/libstore/local-binary-cache-store.hh
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
#pragma once
|
||||||
|
///@file
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
void registerLocalBinaryCacheStore();
|
||||||
|
|
||||||
|
}
|
|
@ -421,4 +421,7 @@ void canonicaliseTimestampAndPermissions(const Path & path);
|
||||||
|
|
||||||
MakeError(PathInUse, Error);
|
MakeError(PathInUse, Error);
|
||||||
|
|
||||||
|
// Implemented by the relevant platform/ module being used.
|
||||||
|
void registerLocalStore();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -118,12 +118,16 @@ libstore_headers = files(
|
||||||
'derived-path-map.hh',
|
'derived-path-map.hh',
|
||||||
'derived-path.hh',
|
'derived-path.hh',
|
||||||
'downstream-placeholder.hh',
|
'downstream-placeholder.hh',
|
||||||
|
'dummy-store.hh',
|
||||||
'filetransfer.hh',
|
'filetransfer.hh',
|
||||||
'fs-accessor.hh',
|
'fs-accessor.hh',
|
||||||
'gc-store.hh',
|
'gc-store.hh',
|
||||||
'globals.hh',
|
'globals.hh',
|
||||||
|
'http-binary-cache-store.hh',
|
||||||
'indirect-root-store.hh',
|
'indirect-root-store.hh',
|
||||||
|
'legacy-ssh-store.hh',
|
||||||
'length-prefixed-protocol-helper.hh',
|
'length-prefixed-protocol-helper.hh',
|
||||||
|
'local-binary-cache-store.hh',
|
||||||
'local-fs-store.hh',
|
'local-fs-store.hh',
|
||||||
'local-store.hh',
|
'local-store.hh',
|
||||||
'lock.hh',
|
'lock.hh',
|
||||||
|
@ -152,8 +156,8 @@ libstore_headers = files(
|
||||||
'serve-protocol-impl.hh',
|
'serve-protocol-impl.hh',
|
||||||
'serve-protocol.hh',
|
'serve-protocol.hh',
|
||||||
'sqlite.hh',
|
'sqlite.hh',
|
||||||
'ssh-store-config.hh',
|
|
||||||
'ssh.hh',
|
'ssh.hh',
|
||||||
|
'ssh-store.hh',
|
||||||
'store-api.hh',
|
'store-api.hh',
|
||||||
'store-cast.hh',
|
'store-cast.hh',
|
||||||
'uds-remote-store.hh',
|
'uds-remote-store.hh',
|
||||||
|
|
|
@ -261,4 +261,9 @@ void DarwinLocalDerivationGoal::execBuilder(std::string builder, Strings args, S
|
||||||
|
|
||||||
posix_spawn(nullptr, builder.c_str(), nullptr, &attrp, stringsToCharPtrs(args).data(), stringsToCharPtrs(envStrs).data());
|
posix_spawn(nullptr, builder.c_str(), nullptr, &attrp, stringsToCharPtrs(args).data(), stringsToCharPtrs(envStrs).data());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void registerLocalStore() {
|
||||||
|
StoreImplementations::add<DarwinLocalStore, LocalStoreConfig>();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
#include "platform/fallback.hh"
|
#include "platform/fallback.hh"
|
||||||
|
|
||||||
namespace nix {
|
namespace nix {
|
||||||
static RegisterStoreImplementation<FallbackLocalStore, LocalStoreConfig> regLocalStore;
|
void registerLocalStore() {
|
||||||
|
Implementations::add<FallbackLocalStore, LocalStoreConfig>();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,7 +25,9 @@ namespace {
|
||||||
constexpr const std::string_view nativeSystem = SYSTEM;
|
constexpr const std::string_view nativeSystem = SYSTEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
static RegisterStoreImplementation<LinuxLocalStore, LocalStoreConfig> regLocalStore;
|
void registerLocalStore() {
|
||||||
|
StoreImplementations::add<LinuxLocalStore, LocalStoreConfig>();
|
||||||
|
}
|
||||||
|
|
||||||
static void readProcLink(const std::string & file, UncheckedRoots & roots)
|
static void readProcLink(const std::string & file, UncheckedRoots & roots)
|
||||||
{
|
{
|
||||||
|
|
|
@ -526,8 +526,14 @@ struct S3BinaryCacheStoreImpl : virtual S3BinaryCacheStoreConfig, public virtual
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static RegisterStoreImplementation<S3BinaryCacheStoreImpl, S3BinaryCacheStoreConfig> regS3BinaryCacheStore;
|
void registerS3BinaryCacheStore() {
|
||||||
|
StoreImplementations::add<S3BinaryCacheStoreImpl, S3BinaryCacheStoreConfig>();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
namespace nix {
|
||||||
|
void registerS3BinaryCacheStore() {}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -29,4 +29,6 @@ public:
|
||||||
virtual const Stats & getS3Stats() = 0;
|
virtual const Stats & getS3Stats() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void registerS3BinaryCacheStore();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#include "ssh-store-config.hh"
|
#include "ssh-store.hh"
|
||||||
#include "store-api.hh"
|
#include "store-api.hh"
|
||||||
#include "local-fs-store.hh"
|
#include "local-fs-store.hh"
|
||||||
#include "remote-store.hh"
|
#include "remote-store.hh"
|
||||||
|
@ -110,6 +110,8 @@ ref<RemoteStore::Connection> SSHStore::openConnection()
|
||||||
return conn;
|
return conn;
|
||||||
}
|
}
|
||||||
|
|
||||||
static RegisterStoreImplementation<SSHStore, SSHStoreConfig> regSSHStore;
|
void registerSSHStore() {
|
||||||
|
StoreImplementations::add<SSHStore, SSHStoreConfig>();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,4 +26,6 @@ struct CommonSSHStoreConfig : virtual StoreConfig
|
||||||
)"};
|
)"};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void registerSSHStore();
|
||||||
|
|
||||||
}
|
}
|
|
@ -1472,7 +1472,7 @@ ref<Store> openStore(const std::string & uri_,
|
||||||
parsedUri.authority.value_or("") + parsedUri.path
|
parsedUri.authority.value_or("") + parsedUri.path
|
||||||
);
|
);
|
||||||
|
|
||||||
for (auto implem : *Implementations::registered) {
|
for (auto implem : *StoreImplementations::registered) {
|
||||||
if (implem.uriSchemes.count(parsedUri.scheme)) {
|
if (implem.uriSchemes.count(parsedUri.scheme)) {
|
||||||
auto store = implem.create(parsedUri.scheme, baseURI, params);
|
auto store = implem.create(parsedUri.scheme, baseURI, params);
|
||||||
if (store) {
|
if (store) {
|
||||||
|
@ -1526,6 +1526,6 @@ std::list<ref<Store>> getDefaultSubstituters()
|
||||||
return stores;
|
return stores;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<StoreFactory> * Implementations::registered = 0;
|
std::vector<StoreFactory> * StoreImplementations::registered = 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,11 +50,9 @@ namespace nix {
|
||||||
* that calls `StoreConfig(params)` (otherwise you're gonna encounter an
|
* that calls `StoreConfig(params)` (otherwise you're gonna encounter an
|
||||||
* `assertion failure` when trying to instantiate it).
|
* `assertion failure` when trying to instantiate it).
|
||||||
*
|
*
|
||||||
* You can then register the new store using:
|
* You can then register the new store by defining a registration function
|
||||||
*
|
* (using `StoreImplementations::add`) and calling it in
|
||||||
* ```
|
* `registerStoreImplementations` in `globals.cc`.
|
||||||
* cpp static RegisterStoreImplementation<Foo, FooConfig> regStore;
|
|
||||||
* ```
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
MakeError(SubstError, Error);
|
MakeError(SubstError, Error);
|
||||||
|
@ -1004,7 +1002,7 @@ struct StoreFactory
|
||||||
std::function<std::shared_ptr<StoreConfig> ()> getConfig;
|
std::function<std::shared_ptr<StoreConfig> ()> getConfig;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Implementations
|
struct StoreImplementations
|
||||||
{
|
{
|
||||||
static std::vector<StoreFactory> * registered;
|
static std::vector<StoreFactory> * registered;
|
||||||
|
|
||||||
|
@ -1027,15 +1025,6 @@ struct Implementations
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T, typename TConfig>
|
|
||||||
struct RegisterStoreImplementation
|
|
||||||
{
|
|
||||||
RegisterStoreImplementation()
|
|
||||||
{
|
|
||||||
Implementations::add<T, TConfig>();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Display a set of paths in human-readable form (i.e., between quotes
|
* Display a set of paths in human-readable form (i.e., between quotes
|
||||||
|
|
|
@ -88,6 +88,8 @@ void UDSRemoteStore::addIndirectRoot(const Path & path)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static RegisterStoreImplementation<UDSRemoteStore, UDSRemoteStoreConfig> regUDSRemoteStore;
|
void registerUDSRemoteStore() {
|
||||||
|
StoreImplementations::add<UDSRemoteStore, UDSRemoteStoreConfig>();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,4 +63,6 @@ private:
|
||||||
std::optional<std::string> path;
|
std::optional<std::string> path;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void registerUDSRemoteStore();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -201,7 +201,7 @@ struct NixArgs : virtual MultiCommand, virtual MixCommonArgs, virtual RootArgs
|
||||||
res["args"] = toJSON();
|
res["args"] = toJSON();
|
||||||
|
|
||||||
auto stores = nlohmann::json::object();
|
auto stores = nlohmann::json::object();
|
||||||
for (auto & implem : *Implementations::registered) {
|
for (auto & implem : *StoreImplementations::registered) {
|
||||||
auto storeConfig = implem.getConfig();
|
auto storeConfig = implem.getConfig();
|
||||||
auto storeName = storeConfig->name();
|
auto storeName = storeConfig->name();
|
||||||
auto & j = stores[storeName];
|
auto & j = stores[storeName];
|
||||||
|
|
Loading…
Reference in a new issue