From c2033df432af87d0176347858c7d11acfe2ed89f Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Mon, 3 Dec 2012 23:04:47 +0100 Subject: build: Include a copy of Nix's libstore and daemon; build it. * configure.ac: Call `AC_USE_SYSTEM_EXTENSIONS', and `GUIX_SYSTEM_TYPE'. Add `--with-store-dir' option, and substitute `storedir'. Include `config-daemon.ac'. * config-daemon.ac: New file. * Makefile.am [BUILD_DAEMON]: Include `daemon.am'. * daemon.am: New file. * m4/guix.m4 (GUIX_SYSTEM_TYPE): New macro. * nix/libutil/gcrypt-hash.cc, nix/libutil/gcrypt-hash.hh, nix/libutil/md5.h, nix/libutil/sha1.h, nix/libutil/sha256.h, nix/nix-daemon/guix-daemon.cc, nix/nix-daemon/shared.hh: New files. --- nix/.gitignore | 4 ++ nix/boost/.gitignore | 3 ++ nix/libstore/.gitignore | 3 ++ nix/libutil/.gitignore | 2 + nix/libutil/gcrypt-hash.cc | 50 ++++++++++++++++++ nix/libutil/gcrypt-hash.hh | 39 ++++++++++++++ nix/libutil/md5.h | 35 +++++++++++++ nix/libutil/sha1.h | 35 +++++++++++++ nix/libutil/sha256.h | 35 +++++++++++++ nix/nix-daemon/guix-daemon.cc | 115 ++++++++++++++++++++++++++++++++++++++++++ nix/nix-daemon/shared.hh | 37 ++++++++++++++ 11 files changed, 358 insertions(+) create mode 100644 nix/.gitignore create mode 100644 nix/boost/.gitignore create mode 100644 nix/libstore/.gitignore create mode 100644 nix/libutil/.gitignore create mode 100644 nix/libutil/gcrypt-hash.cc create mode 100644 nix/libutil/gcrypt-hash.hh create mode 100644 nix/libutil/md5.h create mode 100644 nix/libutil/sha1.h create mode 100644 nix/libutil/sha256.h create mode 100644 nix/nix-daemon/guix-daemon.cc create mode 100644 nix/nix-daemon/shared.hh (limited to 'nix') diff --git a/nix/.gitignore b/nix/.gitignore new file mode 100644 index 0000000000..92d0520cc7 --- /dev/null +++ b/nix/.gitignore @@ -0,0 +1,4 @@ +*.a +*.o +.deps +.dirstamp diff --git a/nix/boost/.gitignore b/nix/boost/.gitignore new file mode 100644 index 0000000000..1f188e3b65 --- /dev/null +++ b/nix/boost/.gitignore @@ -0,0 +1,3 @@ +*.hpp +*.cpp +*.cc diff --git a/nix/libstore/.gitignore b/nix/libstore/.gitignore new file mode 100644 index 0000000000..512a0d022f --- /dev/null +++ b/nix/libstore/.gitignore @@ -0,0 +1,3 @@ +*.cc +*.hh +/schema.sql diff --git a/nix/libutil/.gitignore b/nix/libutil/.gitignore new file mode 100644 index 0000000000..e539428b1b --- /dev/null +++ b/nix/libutil/.gitignore @@ -0,0 +1,2 @@ +*.cc +*.hh diff --git a/nix/libutil/gcrypt-hash.cc b/nix/libutil/gcrypt-hash.cc new file mode 100644 index 0000000000..de7e5afc1a --- /dev/null +++ b/nix/libutil/gcrypt-hash.cc @@ -0,0 +1,50 @@ +/* Guix --- Nix package management from Guile. -*- coding: utf-8 -*- + Copyright (C) 2012 Ludovic Courtès + + This file is part of Guix. + + Guix is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or (at + your option) any later version. + + Guix is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Guix. If not, see . */ + +#include + +#include +#include + +extern "C" { + +void +guix_hash_init (struct guix_hash_context *ctx, gcry_md_algo_t algo) +{ + gcry_error_t err; + + err = gcry_md_open (&ctx->md_handle, algo, 0); + assert (err == GPG_ERR_NO_ERROR); +} + +void +guix_hash_update (struct guix_hash_context *ctx, const void *buffer, size_t len) +{ + gcry_md_write (ctx->md_handle, buffer, len); +} + +void +guix_hash_final (void *resbuf, struct guix_hash_context *ctx, + gcry_md_algo_t algo) +{ + memcpy (resbuf, gcry_md_read (ctx->md_handle, algo), + gcry_md_get_algo_dlen (algo)); + gcry_md_close (ctx->md_handle); +} + +} diff --git a/nix/libutil/gcrypt-hash.hh b/nix/libutil/gcrypt-hash.hh new file mode 100644 index 0000000000..1e26398540 --- /dev/null +++ b/nix/libutil/gcrypt-hash.hh @@ -0,0 +1,39 @@ +/* Guix --- Nix package management from Guile. -*- coding: utf-8 -*- + Copyright (C) 2012 Ludovic Courtès + + This file is part of Guix. + + Guix is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or (at + your option) any later version. + + Guix is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Guix. If not, see . */ + +/* An OpenSSL-like interface to GNU libgcrypt cryptographic hash + functions. */ + +#pragma once +#include +#include + +extern "C" { + +struct guix_hash_context +{ + gcry_md_hd_t md_handle; +}; + +extern void guix_hash_init (struct guix_hash_context *ctx, gcry_md_algo_t algo); +extern void guix_hash_update (struct guix_hash_context *ctx, const void *buffer, + size_t len); +extern void guix_hash_final (void *resbuf, struct guix_hash_context *ctx, + gcry_md_algo_t algo); + +} diff --git a/nix/libutil/md5.h b/nix/libutil/md5.h new file mode 100644 index 0000000000..c275e381f8 --- /dev/null +++ b/nix/libutil/md5.h @@ -0,0 +1,35 @@ +/* Guix --- Nix package management from Guile. -*- coding: utf-8 -*- + Copyright (C) 2012 Ludovic Courtès + + This file is part of Guix. + + Guix is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or (at + your option) any later version. + + Guix is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Guix. If not, see . */ + +#include + +#define MD5_CTX guix_hash_context + +static inline void +MD5_Init (struct MD5_CTX *ctx) +{ + guix_hash_init (ctx, GCRY_MD_MD5); +} + +#define MD5_Update guix_hash_update + +static inline void +MD5_Final (void *resbuf, struct MD5_CTX *ctx) +{ + guix_hash_final (ctx, ctx, GCRY_MD_MD5); +} diff --git a/nix/libutil/sha1.h b/nix/libutil/sha1.h new file mode 100644 index 0000000000..8af92725ea --- /dev/null +++ b/nix/libutil/sha1.h @@ -0,0 +1,35 @@ +/* Guix --- Nix package management from Guile. -*- coding: utf-8 -*- + Copyright (C) 2012 Ludovic Courtès + + This file is part of Guix. + + Guix is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or (at + your option) any later version. + + Guix is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Guix. If not, see . */ + +#include + +#define SHA_CTX guix_hash_context + +static inline void +SHA1_Init (struct SHA_CTX *ctx) +{ + guix_hash_init (ctx, GCRY_MD_SHA1); +} + +#define SHA1_Update guix_hash_update + +static inline void +SHA1_Final (void *resbuf, struct SHA_CTX *ctx) +{ + guix_hash_final (ctx, ctx, GCRY_MD_SHA1); +} diff --git a/nix/libutil/sha256.h b/nix/libutil/sha256.h new file mode 100644 index 0000000000..c436d6402c --- /dev/null +++ b/nix/libutil/sha256.h @@ -0,0 +1,35 @@ +/* Guix --- Nix package management from Guile. -*- coding: utf-8 -*- + Copyright (C) 2012 Ludovic Courtès + + This file is part of Guix. + + Guix is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or (at + your option) any later version. + + Guix is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Guix. If not, see . */ + +#include + +#define SHA256_CTX guix_hash_context + +static inline void +SHA256_Init (struct SHA256_CTX *ctx) +{ + guix_hash_init (ctx, GCRY_MD_SHA256); +} + +#define SHA256_Update guix_hash_update + +static inline void +SHA256_Final (void *resbuf, struct SHA256_CTX *ctx) +{ + guix_hash_final (ctx, ctx, GCRY_MD_SHA256); +} diff --git a/nix/nix-daemon/guix-daemon.cc b/nix/nix-daemon/guix-daemon.cc new file mode 100644 index 0000000000..43d4113493 --- /dev/null +++ b/nix/nix-daemon/guix-daemon.cc @@ -0,0 +1,115 @@ +/* Guix --- Nix package management from Guile. -*- coding: utf-8 -*- + Copyright (C) 2012 Ludovic Courtès + + This file is part of Guix. + + Guix is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or (at + your option) any later version. + + Guix is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Guix. If not, see . */ + +#include + +#include +#include "shared.hh" +#include + +#include +#include + +/* Variables used by `nix-daemon.cc'. */ +volatile ::sig_atomic_t blockInt; +char **argvSaved; + +using namespace nix; + +/* Entry point in `nix-daemon.cc'. */ +extern void run (Strings args); + + +/* Command-line options. */ + +const char *argp_program_version = + "guix-daemon (" PACKAGE_NAME ") " PACKAGE_VERSION; +const char *argp_program_bug_address = PACKAGE_BUGREPORT; + +static char doc[] = +"guix-daemon -- perform derivation builds and store accesses\ +\v\ +This program is a daemon meant to run in the background. It serves \ +requests sent over a Unix-domain socket. It accesses the store, and \ +builds derivations on behalf of its clients."; + +#define GUIX_OPT_SYSTEM 1 +#define GUIX_OPT_DISABLE_CHROOT 2 +#define GUIX_OPT_DISABLE_LOG_COMPRESSION 3 + +static const struct argp_option options[] = + { + { "system", GUIX_OPT_SYSTEM, "SYSTEM", 0, + "Assume SYSTEM as the current system type" }, + { "build-cores", 'C', "N", 0, + "Use N CPU cores to build each derivation; 0 means as many as available" }, + { "max-jobs", 'M', "N", 0, + "Allow at most N build jobs" }, + { "disable-chroot", GUIX_OPT_DISABLE_CHROOT, 0, 0, + "Disable chroot builds" }, + { "disable-log-compression", GUIX_OPT_DISABLE_LOG_COMPRESSION, 0, 0, + "Disable compression of the build logs" }, + { 0, 0, 0, 0, 0 } + }; + +/* Parse a single option. */ +static error_t +parse_opt (int key, char *arg, struct argp_state *state) +{ + switch (key) + { + case GUIX_OPT_DISABLE_CHROOT: + settings.useChroot = false; + break; + case GUIX_OPT_DISABLE_LOG_COMPRESSION: + settings.compressLog = false; + break; + case 'C': + settings.buildCores = atoi (arg); + break; + case 'M': + settings.maxBuildJobs = atoi (arg); + break; + case GUIX_OPT_SYSTEM: + settings.thisSystem = arg; + break; + default: + return ARGP_ERR_UNKNOWN; + } + + return 0; +} + +/* Argument parsing. */ +static struct argp argp = { options, parse_opt, 0, doc }; + + + +int +main (int argc, char *argv[]) +{ + Strings nothing; + + settings.useChroot = true; + settings.processEnvironment (); + + argp_parse (&argp, argc, argv, 0, 0, 0); + + argvSaved = argv; + run (nothing); +} diff --git a/nix/nix-daemon/shared.hh b/nix/nix-daemon/shared.hh new file mode 100644 index 0000000000..a03c09c036 --- /dev/null +++ b/nix/nix-daemon/shared.hh @@ -0,0 +1,37 @@ +/* Guix --- Nix package management from Guile. -*- coding: utf-8 -*- + Copyright (C) 2012 Ludovic Courtès + + This file is part of Guix. + + Guix is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or (at + your option) any later version. + + Guix is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Guix. If not, see . */ + +/* Replacement for Nix's libmain/shared.hh. */ + +#pragma once + +#include + +#include +#include + +static inline void +showManPage (const char *name) +{ + /* This idea is evil. Abort. */ + abort (); +} + +extern volatile ::sig_atomic_t blockInt; + +extern char **argvSaved; -- cgit 1.4.1 From b49ffe2d678b5df4192fb9be4ad50bed9d6d5b7f Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Mon, 3 Dec 2012 22:43:26 +0100 Subject: build: Add `bootstrap' and `sync-with-upstream' scripts. * bootstrap, nix/sync-with-upstream: New files. * Makefile.am (EXTRA_DIST): Add `bootstrap'. * daemon.am (EXTRA_DIST): Add `nix/sync-with-upstream'. --- Makefile.am | 1 + bootstrap | 16 +++++++++++++ daemon.am | 1 + nix/sync-with-upstream | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 82 insertions(+) create mode 100755 bootstrap create mode 100755 nix/sync-with-upstream (limited to 'nix') diff --git a/Makefile.am b/Makefile.am index 7e5be0be2a..147ba1949e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -194,6 +194,7 @@ EXTRA_DIST = \ srfi/srfi-64.upstream.scm \ tests/test.drv \ build-aux/config.rpath \ + bootstrap \ release.nix \ $(TESTS) diff --git a/bootstrap b/bootstrap new file mode 100755 index 0000000000..e445af2f2c --- /dev/null +++ b/bootstrap @@ -0,0 +1,16 @@ +#!/bin/sh + +# Import missing source files and create the build system. + +set -e -x + +top_srcdir="$PWD" +export top_srcdir + +if [ ! -d nix-upstream ] +then + git submodule init +fi +git submodule update + +exec autoreconf -vfi diff --git a/daemon.am b/daemon.am index e150e54d6b..79e2715c74 100644 --- a/daemon.am +++ b/daemon.am @@ -147,6 +147,7 @@ nix/libstore/schema.sql.hh: nix/libstore/schema.sql (write (get-string-all in) out)))))" EXTRA_DIST += \ + nix/sync-with-upstream \ nix/libstore/schema.sql \ nix/AUTHORS \ nix/COPYING diff --git a/nix/sync-with-upstream b/nix/sync-with-upstream new file mode 100755 index 0000000000..324dcb27c9 --- /dev/null +++ b/nix/sync-with-upstream @@ -0,0 +1,64 @@ +#!/bin/sh +# Guix --- Nix package management from Guile. -*- coding: utf-8 -*- +# Copyright (C) 2012 Ludovic Courtès +# +# This file is part of Guix. +# +# Guix is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or (at +# your option) any later version. +# +# Guix is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Guix. If not, see . + +# +# Update the local copy of Nix source code needed to build the daemon. +# Assume GNU Coreutils and Git are available. +# + +top_srcdir="${top_srcdir:-..}" + +log() +{ + echo "sync-with-upstream: $@" >&2 +} + +# checked_in_p FILE +checked_in_p() +{ + ( cd "$top_srcdir" ; + git ls-tree HEAD -- "nix/$1" | grep "$1" > /dev/null ) +} + +if [ ! -d "$top_srcdir/build-aux" ] +then + log "\`$top_srcdir' is not the valid top-level source directory" + exit 1 +fi + +set -e +for upstream_file in `cd "$top_srcdir/nix-upstream/src" ; + find . -name \*.c -or -name \*.h -or -name \*.cc -or -name \*.hh \ + -or -name \*.cpp -or -name \*.hpp -or -name \*.sql` +do + if grep "$upstream_file" "$top_srcdir/daemon.am" > /dev/null + then + if checked_in_p "$upstream_file" + then + log "skipping \`$upstream_file', which has a checked-in copy" + else + ( cd "$top_srcdir/nix-upstream/src" && \ + cp -v --parents "$upstream_file" ../../nix ) + fi + else + log "skipping \`$upstream_file', which is not used" + fi +done + +cp -v "$top_srcdir/nix-upstream/"{COPYING,AUTHORS} "$top_srcdir/nix" -- cgit 1.4.1 From 0adb527600a40055383970330f572e9f0399cd75 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Tue, 4 Dec 2012 23:10:54 +0100 Subject: daemon: Fix typo in libgcrypt bindings. * nix/libutil/md5.h (MD5_Final): Pass RESBUF as the first argument to `guix_hash_final'. * nix/libutil/sha1.h (SHA1_Final): Likewise. * nix/libutil/sha256.h (SHA256_Final): Likewise. --- nix/libutil/md5.h | 2 +- nix/libutil/sha1.h | 2 +- nix/libutil/sha256.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) (limited to 'nix') diff --git a/nix/libutil/md5.h b/nix/libutil/md5.h index c275e381f8..7fa29087d7 100644 --- a/nix/libutil/md5.h +++ b/nix/libutil/md5.h @@ -31,5 +31,5 @@ MD5_Init (struct MD5_CTX *ctx) static inline void MD5_Final (void *resbuf, struct MD5_CTX *ctx) { - guix_hash_final (ctx, ctx, GCRY_MD_MD5); + guix_hash_final (resbuf, ctx, GCRY_MD_MD5); } diff --git a/nix/libutil/sha1.h b/nix/libutil/sha1.h index 8af92725ea..0eca8e310d 100644 --- a/nix/libutil/sha1.h +++ b/nix/libutil/sha1.h @@ -31,5 +31,5 @@ SHA1_Init (struct SHA_CTX *ctx) static inline void SHA1_Final (void *resbuf, struct SHA_CTX *ctx) { - guix_hash_final (ctx, ctx, GCRY_MD_SHA1); + guix_hash_final (resbuf, ctx, GCRY_MD_SHA1); } diff --git a/nix/libutil/sha256.h b/nix/libutil/sha256.h index c436d6402c..a91f18f689 100644 --- a/nix/libutil/sha256.h +++ b/nix/libutil/sha256.h @@ -31,5 +31,5 @@ SHA256_Init (struct SHA256_CTX *ctx) static inline void SHA256_Final (void *resbuf, struct SHA256_CTX *ctx) { - guix_hash_final (ctx, ctx, GCRY_MD_SHA256); + guix_hash_final (resbuf, ctx, GCRY_MD_SHA256); } -- cgit 1.4.1 From 8b15ac6700f1345e9efa709dea6e4efcbdaf6d7a Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Wed, 5 Dec 2012 15:22:28 +0100 Subject: daemon: Disable use of chroots when support is lacking. * nix/nix-daemon/guix-daemon.cc (options)[!HAVE_CHROOT]: Mention that `--disable-chroot' has no effect. (main)[!HAVE_CHROOT]: Set `useChroot' to false. --- nix/nix-daemon/guix-daemon.cc | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'nix') diff --git a/nix/nix-daemon/guix-daemon.cc b/nix/nix-daemon/guix-daemon.cc index 43d4113493..7a3b178eab 100644 --- a/nix/nix-daemon/guix-daemon.cc +++ b/nix/nix-daemon/guix-daemon.cc @@ -61,7 +61,12 @@ static const struct argp_option options[] = { "max-jobs", 'M', "N", 0, "Allow at most N build jobs" }, { "disable-chroot", GUIX_OPT_DISABLE_CHROOT, 0, 0, - "Disable chroot builds" }, + "Disable chroot builds" +#ifndef HAVE_CHROOT + " (chroots are not supported in this configuration, so " + "this option has no effect)" +#endif + }, { "disable-log-compression", GUIX_OPT_DISABLE_LOG_COMPRESSION, 0, 0, "Disable compression of the build logs" }, { 0, 0, 0, 0, 0 } @@ -105,7 +110,12 @@ main (int argc, char *argv[]) { Strings nothing; +#ifdef HAVE_CHROOT settings.useChroot = true; +#else + settings.useChroot = false; +#endif + settings.processEnvironment (); argp_parse (&argp, argc, argv, 0, 0, 0); -- cgit 1.4.1 From f5c82e15e0e76b855bc4cc88ffb79331b7083f39 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Wed, 5 Dec 2012 16:29:28 +0100 Subject: daemon: Add `list-runtime-roots' script. * nix/scripts/list-runtime-roots.in: New file. * config-daemon.ac: Add `AC_CONFIG_FILES' invocation for it. * daemon.am (nodist_pkglibexec_SCRIPTS): New variable. (AM_TESTS_ENVIRONMENT): Define `top_builddir'. * tests/guix-daemon.sh: Export `NIX_ROOT_FINDER'. * nix/sync-with-upstream: Substitute the path to the root finder in libstore/gc.cc. --- .gitignore | 1 + config-daemon.ac | 3 + daemon.am | 4 ++ nix/scripts/list-runtime-roots.in | 116 ++++++++++++++++++++++++++++++++++++++ nix/sync-with-upstream | 4 ++ tests/guix-daemon.sh | 4 +- 6 files changed, 131 insertions(+), 1 deletion(-) create mode 100644 nix/scripts/list-runtime-roots.in (limited to 'nix') diff --git a/.gitignore b/.gitignore index d39ad6ed96..3ef17152ba 100644 --- a/.gitignore +++ b/.gitignore @@ -61,3 +61,4 @@ stamp-h[0-9] /libutil.a /guix-daemon /test-tmp +/nix/scripts/list-runtime-roots diff --git a/config-daemon.ac b/config-daemon.ac index a10be14632..946f6e453d 100644 --- a/config-daemon.ac +++ b/config-daemon.ac @@ -91,6 +91,9 @@ if test "x$guix_build_daemon" = "xyes"; then dnl Check for (for immutable file support). AC_CHECK_HEADERS([linux/fs.h]) + + AC_CONFIG_FILES([nix/scripts/list-runtime-roots], + [chmod +x nix/scripts/list-runtime-roots]) fi AM_CONDITIONAL([BUILD_DAEMON], [test "x$guix_build_daemon" = "xyes"]) diff --git a/daemon.am b/daemon.am index 48b0871a97..f5d58ea275 100644 --- a/daemon.am +++ b/daemon.am @@ -146,6 +146,9 @@ nix/libstore/schema.sql.hh: nix/libstore/schema.sql (lambda (in) \ (write (get-string-all in) out)))))" +nodist_pkglibexec_SCRIPTS = \ + nix/scripts/list-runtime-roots + EXTRA_DIST += \ nix/sync-with-upstream \ nix/libstore/schema.sql \ @@ -156,6 +159,7 @@ EXTRA_DIST += \ test_root = $(abs_top_builddir)/test-tmp AM_TESTS_ENVIRONMENT += \ + top_builddir="$(abs_top_builddir)" \ TEST_ROOT="$(test_root)" TESTS += \ diff --git a/nix/scripts/list-runtime-roots.in b/nix/scripts/list-runtime-roots.in new file mode 100644 index 0000000000..5c21ae543d --- /dev/null +++ b/nix/scripts/list-runtime-roots.in @@ -0,0 +1,116 @@ +#!@GUILE@ -ds +!# +;;; Guix --- Nix package management from Guile. -*- coding: utf-8 -*- +;;; Copyright (C) 2012 Ludovic Courtès +;;; +;;; This file is part of Guix. +;;; +;;; Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with Guix. If not, see . + +;;; +;;; List files being used at run time; these files are garbage collector +;;; roots. This is equivalent to `find-runtime-roots.pl' in Nix. +;;; + +(use-modules (ice-9 ftw) + (ice-9 regex) + (ice-9 rdelim) + (ice-9 popen) + (srfi srfi-1) + (srfi srfi-26)) + +(define %proc-directory + ;; Mount point of Linuxish /proc file system. + "/proc") + +(define (proc-file-roots dir file) + "Return a one-element list containing the file pointed to by DIR/FILE, +or the empty list." + (or (and=> (false-if-exception (readlink (string-append dir "/" file))) + list) + '())) + +(define proc-exe-roots (cut proc-file-roots <> "exe")) +(define proc-cwd-roots (cut proc-file-roots <> "cwd")) + +(define (proc-fd-roots dir) + "Return the list of store files referenced by DIR, which is a +/proc/XYZ directory." + (let ((dir (string-append dir "/fd"))) + (filter-map (lambda (file) + (let ((target (false-if-exception + (readlink (string-append dir "/" file))))) + (and target + (string-prefix? "/" target) + target))) + (scandir dir string->number)))) + +(define (proc-maps-roots dir) + "Return the list of store files referenced by DIR, which is a +/proc/XYZ directory." + (define %file-mapping-line + (make-regexp "^.*[[:blank:]]+/([^ ]+)$")) + + (call-with-input-file (string-append dir "/maps") + (lambda (maps) + (let loop ((line (read-line maps)) + (roots '())) + (cond ((eof-object? line) + roots) + ((regexp-exec %file-mapping-line line) + => + (lambda (match) + (let ((file (string-append "/" + (match:substring match 1)))) + (loop (read-line maps) + (cons file roots))))) + (else + (loop (read-line maps) roots))))))) + +(define (lsof-roots) + "Return the list of roots as found by calling `lsof'." + (catch 'system + (lambda () + (let ((pipe (open-pipe* OPEN_READ "lsof" "-n" "-w" "-F" "n"))) + (define %file-rx + (make-regexp "^n/(.*)$")) + + (let loop ((line (read-line pipe)) + (roots '())) + (cond ((eof-object? line) + (begin + (close-pipe pipe) + roots)) + ((regexp-exec %file-rx line) + => + (lambda (match) + (loop (read-line pipe) + (cons (string-append "/" + (match:substring match 1)) + roots)))) + (else + (loop (read-line pipe) roots)))))) + (lambda _ + '()))) + +(let ((proc (format #f "~a/~a" %proc-directory (getpid)))) + (for-each (cut simple-format #t "~a~%" <>) + (delete-duplicates + (let ((proc-roots (if (file-exists? proc) + (append (proc-exe-roots proc) + (proc-cwd-roots proc) + (proc-fd-roots proc) + (proc-maps-roots proc)) + '()))) + (append proc-roots (lsof-roots)))))) diff --git a/nix/sync-with-upstream b/nix/sync-with-upstream index 324dcb27c9..69bd1fbee7 100755 --- a/nix/sync-with-upstream +++ b/nix/sync-with-upstream @@ -62,3 +62,7 @@ do done cp -v "$top_srcdir/nix-upstream/"{COPYING,AUTHORS} "$top_srcdir/nix" + +# Substitutions. +sed -i "$top_srcdir/nix/libstore/gc.cc" \ + -e 's|/nix/find-runtime-roots\.pl|/guix/list-runtime-roots|g' diff --git a/tests/guix-daemon.sh b/tests/guix-daemon.sh index d7926b2376..b6b92a78d4 100644 --- a/tests/guix-daemon.sh +++ b/tests/guix-daemon.sh @@ -29,8 +29,10 @@ NIX_LOCALSTATE_DIR="$TEST_ROOT/var" NIX_LOG_DIR="$TEST_ROOT/var/log/nix" NIX_STATE_DIR="$TEST_ROOT/var/nix" NIX_DB_DIR="$TEST_ROOT/db" +NIX_ROOT_FINDER="$top_builddir/nix/scripts/list-runtime-roots" export NIX_SUBSTITUTERS NIX_IGNORE_SYMLINK_STORE NIX_STORE_DIR \ - NIX_LOCALSTATE_DIR NIX_LOG_DIR NIX_STATE_DIR NIX_DB_DIR + NIX_LOCALSTATE_DIR NIX_LOG_DIR NIX_STATE_DIR NIX_DB_DIR \ + NIX_ROOT_FINDER guix-daemon --version guix-build --version -- cgit 1.4.1 From 5c403e351844e5aa07428431c3d15e70431a3807 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Thu, 6 Dec 2012 22:21:45 +0100 Subject: daemon: Add more options. * nix/nix-daemon/guix-daemon.cc (GUIX_OPT_BUILD_USERS_GROUP, GUIX_OPT_CACHE_FAILURES, GUIX_OPT_LOSE_LOGS, GUIX_OPT_DISABLE_STORE_OPTIMIZATION, GUIX_OPT_IMPERSONATE_LINUX_26): New macros. (options)["build-users-group", "cache-failures", "lose-logs", "disable-store-optimization", "impersonate-linux-2.6"]: New options. (parse_opt): Handle them. --- nix/nix-daemon/guix-daemon.cc | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) (limited to 'nix') diff --git a/nix/nix-daemon/guix-daemon.cc b/nix/nix-daemon/guix-daemon.cc index 7a3b178eab..6bbea52196 100644 --- a/nix/nix-daemon/guix-daemon.cc +++ b/nix/nix-daemon/guix-daemon.cc @@ -50,7 +50,12 @@ builds derivations on behalf of its clients."; #define GUIX_OPT_SYSTEM 1 #define GUIX_OPT_DISABLE_CHROOT 2 -#define GUIX_OPT_DISABLE_LOG_COMPRESSION 3 +#define GUIX_OPT_BUILD_USERS_GROUP 3 +#define GUIX_OPT_CACHE_FAILURES 4 +#define GUIX_OPT_LOSE_LOGS 5 +#define GUIX_OPT_DISABLE_LOG_COMPRESSION 6 +#define GUIX_OPT_DISABLE_STORE_OPTIMIZATION 7 +#define GUIX_OPT_IMPERSONATE_LINUX_26 8 static const struct argp_option options[] = { @@ -67,8 +72,22 @@ static const struct argp_option options[] = "this option has no effect)" #endif }, + { "build-users-group", GUIX_OPT_BUILD_USERS_GROUP, "GROUP", 0, + "Perform builds as a user of GROUP" }, + { "cache-failures", GUIX_OPT_CACHE_FAILURES, 0, 0, + "Cache build failures" }, + { "lose-logs", GUIX_OPT_LOSE_LOGS, 0, 0, + "Do not keep build logs" }, { "disable-log-compression", GUIX_OPT_DISABLE_LOG_COMPRESSION, 0, 0, "Disable compression of the build logs" }, + { "disable-store-optimization", GUIX_OPT_DISABLE_STORE_OPTIMIZATION, 0, 0, + "Disable automatic file \"deduplication\" in the store" }, + { "impersonate-linux-2.6", GUIX_OPT_IMPERSONATE_LINUX_26, 0, 0, + "Impersonate Linux 2.6" +#ifndef HAVE_SYS_PERSONALITY_H + " (this option has no effect in this configuration)" +#endif + }, { 0, 0, 0, 0, 0 } }; @@ -84,6 +103,21 @@ parse_opt (int key, char *arg, struct argp_state *state) case GUIX_OPT_DISABLE_LOG_COMPRESSION: settings.compressLog = false; break; + case GUIX_OPT_BUILD_USERS_GROUP: + settings.buildUsersGroup = arg; + break; + case GUIX_OPT_DISABLE_STORE_OPTIMIZATION: + settings.autoOptimiseStore = false; + break; + case GUIX_OPT_CACHE_FAILURES: + settings.cacheFailure = true; + break; + case GUIX_OPT_IMPERSONATE_LINUX_26: + settings.impersonateLinux26 = true; + break; + case GUIX_OPT_LOSE_LOGS: + settings.keepLog = false; + break; case 'C': settings.buildCores = atoi (arg); break; -- cgit 1.4.1