Fix build on macOS

This commit is contained in:
Eelco Dolstra 2022-11-08 08:00:29 -08:00
parent 2fde7e0108
commit 05d258667d
4 changed files with 28 additions and 12 deletions

View file

@ -659,7 +659,7 @@ void LocalDerivationGoal::startBuilder()
}
#else
if (useUidRange)
if (parsedDrv->useUidRange())
throw Error("feature 'uid-range' is not supported on this platform");
if (useSystemdCgroup)
throw Error("feature 'systemd-cgroup' is not supported on this platform");

View file

@ -46,7 +46,13 @@ struct PluginFilesSetting : public BaseSetting<Paths>
void set(const std::string & str, bool append = false) override;
};
const uint32_t maxIdsPerBuild = 1 << 16;
const uint32_t maxIdsPerBuild =
#if __linux__
1 << 16
#else
1
#endif
;
class Settings : public Config {
@ -277,16 +283,26 @@ public:
multi-user settings with untrusted users.
)"};
#if __linux__
Setting<bool> autoAllocateUids{this, false, "auto-allocate-uids",
"Whether to allocate UIDs for builders automatically."};
Setting<uint32_t> startId{this, 872415232, "start-id",
Setting<uint32_t> startId{this,
#if __linux__
872415232,
#else
56930,
#endif
"start-id",
"The first UID and GID to use for dynamic ID allocation."};
Setting<uint32_t> uidCount{this, maxIdsPerBuild * 128, "id-count",
Setting<uint32_t> uidCount{this,
#if __linux__
maxIdsPerBuild * 128,
#else
128,
#endif
"id-count",
"The number of UIDs/GIDs to use for dynamic ID allocation."};
#endif
Setting<bool> impersonateLinux26{this, false, "impersonate-linux-26",
"Whether to impersonate a Linux 2.6 machine on newer kernels.",

View file

@ -122,15 +122,16 @@ struct AutoUserLock : UserLock
~AutoUserLock()
{
#if __linux__
// Get rid of our cgroup, ignoring errors.
if (cgroup) rmdir(cgroup->c_str());
#endif
}
void kill() override
{
#if __linux__
if (cgroup) {
printError("KILL CGROUP %s", *cgroup);
destroyCgroup(*cgroup);
if (mkdir(cgroup->c_str(), 0755) == -1)
throw SysError("creating cgroup '%s'", *cgroup);
@ -138,7 +139,6 @@ struct AutoUserLock : UserLock
#endif
{
assert(firstUid);
printError("KILL USER %d", firstUid);
killUser(firstUid);
}
}
@ -201,6 +201,7 @@ struct AutoUserLock : UserLock
lock->firstUid = settings.startId + i * maxIdsPerBuild;
lock->nrIds = nrIds;
#if __linux__
if (nrIds > 1) {
auto ourCgroups = getCgroups("/proc/self/cgroup");
auto ourCgroup = ourCgroups[""];
@ -209,20 +210,17 @@ struct AutoUserLock : UserLock
auto ourCgroupPath = canonPath("/sys/fs/cgroup/" + ourCgroup);
printError("PARENT CGROUP = %s", ourCgroupPath);
if (!pathExists(ourCgroupPath))
throw Error("expected cgroup directory '%s'", ourCgroupPath);
lock->cgroup = fmt("%s/nix-build-%d", ourCgroupPath, lock->firstUid);
printError("CHILD CGROUP = %s", *lock->cgroup);
/* Record the cgroup in the lock file. This ensures that
if we subsequently get executed under a different parent
cgroup, we kill the previous cgroup first. */
writeFull(lock->fdUserLock.get(), *lock->cgroup);
}
#endif
return lock;
}

View file

@ -4,6 +4,8 @@
#include <optional>
#include <sys/types.h>
namespace nix {
struct UserLock