diff options
author | Ludovic Courtès <ludo@gnu.org> | 2012-12-13 22:14:25 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2012-12-13 22:14:25 +0100 |
commit | 1e9824513c570370638b1bfe33bf1dba1f12be4a (patch) | |
tree | cb7bd7f0bebd42dbeabf2c8f09ae1d5144ac969b /nix | |
parent | 70915c1a2ef72e7350b2a29d1d93e30643bce6f3 (diff) | |
parent | b35c0f866c83288e64dcf5839d908705d416c317 (diff) | |
download | guix-patches-1e9824513c570370638b1bfe33bf1dba1f12be4a.tar guix-patches-1e9824513c570370638b1bfe33bf1dba1f12be4a.tar.gz |
Merge branch 'nix-integration'
Conflicts:
tests/guix-package.sh
Diffstat (limited to 'nix')
-rw-r--r-- | nix/.gitignore | 4 | ||||
-rw-r--r-- | nix/boost/.gitignore | 3 | ||||
-rw-r--r-- | nix/libstore/.gitignore | 3 | ||||
-rw-r--r-- | nix/libutil/.gitignore | 2 | ||||
-rw-r--r-- | nix/libutil/gcrypt-hash.cc | 50 | ||||
-rw-r--r-- | nix/libutil/gcrypt-hash.hh | 39 | ||||
-rw-r--r-- | nix/libutil/md5.h | 35 | ||||
-rw-r--r-- | nix/libutil/sha1.h | 35 | ||||
-rw-r--r-- | nix/libutil/sha256.h | 35 | ||||
-rw-r--r-- | nix/nix-daemon/guix-daemon.cc | 159 | ||||
-rw-r--r-- | nix/nix-daemon/shared.hh | 37 | ||||
-rw-r--r-- | nix/scripts/list-runtime-roots.in | 116 | ||||
-rwxr-xr-x | nix/sync-with-upstream | 68 |
13 files changed, 586 insertions, 0 deletions
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 <ludo@gnu.org> + + 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 <http://www.gnu.org/licenses/>. */ + +#include <config.h> + +#include <gcrypt-hash.hh> +#include <assert.h> + +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 <ludo@gnu.org> + + 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 <http://www.gnu.org/licenses/>. */ + +/* An OpenSSL-like interface to GNU libgcrypt cryptographic hash + functions. */ + +#pragma once +#include <gcrypt.h> +#include <unistd.h> + +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..7fa29087d7 --- /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 <ludo@gnu.org> + + 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 <http://www.gnu.org/licenses/>. */ + +#include <gcrypt-hash.hh> + +#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 (resbuf, ctx, GCRY_MD_MD5); +} diff --git a/nix/libutil/sha1.h b/nix/libutil/sha1.h new file mode 100644 index 0000000000..0eca8e310d --- /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 <ludo@gnu.org> + + 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 <http://www.gnu.org/licenses/>. */ + +#include <gcrypt-hash.hh> + +#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 (resbuf, ctx, GCRY_MD_SHA1); +} diff --git a/nix/libutil/sha256.h b/nix/libutil/sha256.h new file mode 100644 index 0000000000..a91f18f689 --- /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 <ludo@gnu.org> + + 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 <http://www.gnu.org/licenses/>. */ + +#include <gcrypt-hash.hh> + +#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 (resbuf, 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..6bbea52196 --- /dev/null +++ b/nix/nix-daemon/guix-daemon.cc @@ -0,0 +1,159 @@ +/* Guix --- Nix package management from Guile. -*- coding: utf-8 -*- + Copyright (C) 2012 Ludovic Courtès <ludo@gnu.org> + + 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 <http://www.gnu.org/licenses/>. */ + +#include <config.h> + +#include <types.hh> +#include "shared.hh" +#include <globals.hh> + +#include <stdlib.h> +#include <argp.h> + +/* 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_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[] = + { + { "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" +#ifndef HAVE_CHROOT + " (chroots are not supported in this configuration, so " + "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 } + }; + +/* 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 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; + 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; + +#ifdef HAVE_CHROOT + settings.useChroot = true; +#else + settings.useChroot = false; +#endif + + 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 <ludo@gnu.org> + + 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 <http://www.gnu.org/licenses/>. */ + +/* Replacement for Nix's libmain/shared.hh. */ + +#pragma once + +#include <string> + +#include <stdlib.h> +#include <signal.h> + +static inline void +showManPage (const char *name) +{ + /* This idea is evil. Abort. */ + abort (); +} + +extern volatile ::sig_atomic_t blockInt; + +extern char **argvSaved; 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 <ludo@gnu.org> +;;; +;;; 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 <http://www.gnu.org/licenses/>. + +;;; +;;; 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 new file mode 100755 index 0000000000..69bd1fbee7 --- /dev/null +++ b/nix/sync-with-upstream @@ -0,0 +1,68 @@ +#!/bin/sh +# Guix --- Nix package management from Guile. -*- coding: utf-8 -*- +# Copyright (C) 2012 Ludovic Courtès <ludo@gnu.org> +# +# 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 <http://www.gnu.org/licenses/>. + +# +# 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" + +# Substitutions. +sed -i "$top_srcdir/nix/libstore/gc.cc" \ + -e 's|/nix/find-runtime-roots\.pl|/guix/list-runtime-roots|g' |