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"
|
||||
|
||||
namespace nix {
|
||||
|
@ -73,6 +74,8 @@ struct DummyStore : public virtual DummyStoreConfig, public virtual Store
|
|||
{ 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>
|
||||
#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 {
|
||||
|
||||
|
||||
|
@ -396,6 +406,17 @@ static void preloadNSS()
|
|||
});
|
||||
}
|
||||
|
||||
static void registerStoreImplementations() {
|
||||
registerDummyStore();
|
||||
registerHttpBinaryCacheStore();
|
||||
registerLegacySSHStore();
|
||||
registerLocalBinaryCacheStore();
|
||||
registerLocalStore();
|
||||
registerS3BinaryCacheStore();
|
||||
registerSSHStore();
|
||||
registerUDSRemoteStore();
|
||||
}
|
||||
|
||||
static bool initLibStoreDone = false;
|
||||
|
||||
void assertLibStoreInitialized() {
|
||||
|
@ -433,6 +454,8 @@ void initLibStore() {
|
|||
unsetenv("TMPDIR");
|
||||
#endif
|
||||
|
||||
registerStoreImplementations();
|
||||
|
||||
initLibStoreDone = true;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
#include "http-binary-cache-store.hh"
|
||||
#include "binary-cache-store.hh"
|
||||
#include "filetransfer.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 "pool.hh"
|
||||
#include "remote-store.hh"
|
||||
|
@ -8,6 +8,7 @@
|
|||
#include "store-api.hh"
|
||||
#include "path-with-outputs.hh"
|
||||
#include "ssh.hh"
|
||||
#include "ssh-store.hh"
|
||||
#include "derivations.hh"
|
||||
|
||||
namespace nix {
|
||||
|
@ -412,6 +413,8 @@ public:
|
|||
{ 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 "globals.hh"
|
||||
#include "nar-info-disk-cache.hh"
|
||||
|
@ -124,6 +125,8 @@ std::set<std::string> LocalBinaryCacheStore::uriSchemes()
|
|||
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);
|
||||
|
||||
// Implemented by the relevant platform/ module being used.
|
||||
void registerLocalStore();
|
||||
|
||||
}
|
||||
|
|
|
@ -118,12 +118,16 @@ libstore_headers = files(
|
|||
'derived-path-map.hh',
|
||||
'derived-path.hh',
|
||||
'downstream-placeholder.hh',
|
||||
'dummy-store.hh',
|
||||
'filetransfer.hh',
|
||||
'fs-accessor.hh',
|
||||
'gc-store.hh',
|
||||
'globals.hh',
|
||||
'http-binary-cache-store.hh',
|
||||
'indirect-root-store.hh',
|
||||
'legacy-ssh-store.hh',
|
||||
'length-prefixed-protocol-helper.hh',
|
||||
'local-binary-cache-store.hh',
|
||||
'local-fs-store.hh',
|
||||
'local-store.hh',
|
||||
'lock.hh',
|
||||
|
@ -152,8 +156,8 @@ libstore_headers = files(
|
|||
'serve-protocol-impl.hh',
|
||||
'serve-protocol.hh',
|
||||
'sqlite.hh',
|
||||
'ssh-store-config.hh',
|
||||
'ssh.hh',
|
||||
'ssh-store.hh',
|
||||
'store-api.hh',
|
||||
'store-cast.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());
|
||||
}
|
||||
|
||||
void registerLocalStore() {
|
||||
StoreImplementations::add<DarwinLocalStore, LocalStoreConfig>();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
#include "platform/fallback.hh"
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
static RegisterStoreImplementation<LinuxLocalStore, LocalStoreConfig> regLocalStore;
|
||||
void registerLocalStore() {
|
||||
StoreImplementations::add<LinuxLocalStore, LocalStoreConfig>();
|
||||
}
|
||||
|
||||
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
|
||||
|
|
|
@ -29,4 +29,6 @@ public:
|
|||
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 "local-fs-store.hh"
|
||||
#include "remote-store.hh"
|
||||
|
@ -110,6 +110,8 @@ ref<RemoteStore::Connection> SSHStore::openConnection()
|
|||
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
|
||||
);
|
||||
|
||||
for (auto implem : *Implementations::registered) {
|
||||
for (auto implem : *StoreImplementations::registered) {
|
||||
if (implem.uriSchemes.count(parsedUri.scheme)) {
|
||||
auto store = implem.create(parsedUri.scheme, baseURI, params);
|
||||
if (store) {
|
||||
|
@ -1526,6 +1526,6 @@ std::list<ref<Store>> getDefaultSubstituters()
|
|||
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
|
||||
* `assertion failure` when trying to instantiate it).
|
||||
*
|
||||
* You can then register the new store using:
|
||||
*
|
||||
* ```
|
||||
* cpp static RegisterStoreImplementation<Foo, FooConfig> regStore;
|
||||
* ```
|
||||
* You can then register the new store by defining a registration function
|
||||
* (using `StoreImplementations::add`) and calling it in
|
||||
* `registerStoreImplementations` in `globals.cc`.
|
||||
*/
|
||||
|
||||
MakeError(SubstError, Error);
|
||||
|
@ -1004,7 +1002,7 @@ struct StoreFactory
|
|||
std::function<std::shared_ptr<StoreConfig> ()> getConfig;
|
||||
};
|
||||
|
||||
struct Implementations
|
||||
struct StoreImplementations
|
||||
{
|
||||
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
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
void registerUDSRemoteStore();
|
||||
|
||||
}
|
||||
|
|
|
@ -201,7 +201,7 @@ struct NixArgs : virtual MultiCommand, virtual MixCommonArgs, virtual RootArgs
|
|||
res["args"] = toJSON();
|
||||
|
||||
auto stores = nlohmann::json::object();
|
||||
for (auto & implem : *Implementations::registered) {
|
||||
for (auto & implem : *StoreImplementations::registered) {
|
||||
auto storeConfig = implem.getConfig();
|
||||
auto storeName = storeConfig->name();
|
||||
auto & j = stores[storeName];
|
||||
|
|
Loading…
Reference in a new issue