diff options
| author | Ludovic Courtès <ludo@gnu.org> | 2016-03-19 14:45:58 +0100 |
|---|---|---|
| committer | Ludovic Courtès <ludo@gnu.org> | 2016-03-19 15:07:46 +0100 |
| commit | ef5f5c8659b1ca3999e362dfa33478e0a0150ced (patch) | |
| tree | e2967b666c0434b76e4a16a9346f50fa04067958 | |
| parent | 7c49ab5b1c1aa79a06504456e4decc5112c5b9f9 (diff) | |
build: Protect against misconfiguration of localstatedir.
Suggested by Jookia <166291@gmail.com>.
* m4/guix.m4 (GUIX_CURRENT_LOCALSTATEDIR, GUIX_CHECK_LOCALSTATEDIR): New
macros.
* config-daemon.ac: Use 'GUIX_CHECK_LOCALSTATEDIR'.
* Makefile.am (DISTCHECK_CONFIGURE_FLAGS): Add --localstatedir.
* doc/guix.texi (Requirements): Mention --localstatedir.
(The Store): Mention LOCALSTATEDIR as such.
| -rw-r--r-- | Makefile.am | 4 | ||||
| -rw-r--r-- | config-daemon.ac | 2 | ||||
| -rw-r--r-- | doc/guix.texi | 14 | ||||
| -rw-r--r-- | m4/guix.m4 | 46 |
4 files changed, 63 insertions, 3 deletions
diff --git a/Makefile.am b/Makefile.am index 8a5430794a9..a9c281d4d19 100644 --- a/Makefile.am +++ b/Makefile.am | |||
| @@ -421,7 +421,11 @@ include daemon.am | |||
| 421 | endif BUILD_DAEMON | 421 | endif BUILD_DAEMON |
| 422 | 422 | ||
| 423 | ACLOCAL_AMFLAGS = -I m4 | 423 | ACLOCAL_AMFLAGS = -I m4 |
| 424 | |||
| 425 | # Pass an explicit '--localstatedir' so that configure does not error out if | ||
| 426 | # it finds an existing installation with a different localstatedir. | ||
| 424 | AM_DISTCHECK_CONFIGURE_FLAGS = \ | 427 | AM_DISTCHECK_CONFIGURE_FLAGS = \ |
| 428 | --localstatedir="$$dc_install_base/var" \ | ||
| 425 | --with-libgcrypt-prefix="$(LIBGCRYPT_PREFIX)" \ | 429 | --with-libgcrypt-prefix="$(LIBGCRYPT_PREFIX)" \ |
| 426 | --with-libgcrypt-libdir="$(LIBGCRYPT_LIBDIR)" \ | 430 | --with-libgcrypt-libdir="$(LIBGCRYPT_LIBDIR)" \ |
| 427 | --with-nix-prefix="$(NIX_PREFIX)" \ | 431 | --with-nix-prefix="$(NIX_PREFIX)" \ |
diff --git a/config-daemon.ac b/config-daemon.ac index 63174d62c79..803eb536996 100644 --- a/config-daemon.ac +++ b/config-daemon.ac | |||
| @@ -140,6 +140,8 @@ if test "x$guix_build_daemon" = "xyes"; then | |||
| 140 | GUIX_TEST_ROOT="$ac_cv_guix_test_root" | 140 | GUIX_TEST_ROOT="$ac_cv_guix_test_root" |
| 141 | AC_SUBST([GUIX_TEST_ROOT]) | 141 | AC_SUBST([GUIX_TEST_ROOT]) |
| 142 | 142 | ||
| 143 | GUIX_CHECK_LOCALSTATEDIR | ||
| 144 | |||
| 143 | AC_CONFIG_FILES([nix/scripts/list-runtime-roots], | 145 | AC_CONFIG_FILES([nix/scripts/list-runtime-roots], |
| 144 | [chmod +x nix/scripts/list-runtime-roots]) | 146 | [chmod +x nix/scripts/list-runtime-roots]) |
| 145 | AC_CONFIG_FILES([nix/scripts/substitute], | 147 | AC_CONFIG_FILES([nix/scripts/substitute], |
diff --git a/doc/guix.texi b/doc/guix.texi index b36be056869..868948adfce 100644 --- a/doc/guix.texi +++ b/doc/guix.texi | |||
| @@ -527,6 +527,14 @@ following packages are also needed: | |||
| 527 | C++11 standard. | 527 | C++11 standard. |
| 528 | @end itemize | 528 | @end itemize |
| 529 | 529 | ||
| 530 | When configuring Guix on a system that already has a Guix installation, | ||
| 531 | be sure to specify the same state directory as the existing installation | ||
| 532 | using the @code{--localstatedir} option of the @command{configure} | ||
| 533 | script (@pxref{Directory Variables, @code{localstatedir},, standards, | ||
| 534 | GNU Coding Standards}). The @command{configure} script protects against | ||
| 535 | unintended misconfiguration of @var{localstatedir} so you do not | ||
| 536 | inadvertently corrupt your store (@pxref{The Store}). | ||
| 537 | |||
| 530 | When a working installation of @url{http://nixos.org/nix/, the Nix package | 538 | When a working installation of @url{http://nixos.org/nix/, the Nix package |
| 531 | manager} is available, you | 539 | manager} is available, you |
| 532 | can instead configure Guix with @code{--disable-daemon}. In that case, | 540 | can instead configure Guix with @code{--disable-daemon}. In that case, |
| @@ -2945,9 +2953,9 @@ Sub-directories in the store are referred to as @dfn{store items} or | |||
| 2945 | sometimes @dfn{store paths}. The store has an associated database that | 2953 | sometimes @dfn{store paths}. The store has an associated database that |
| 2946 | contains information such as the store paths referred to by each store | 2954 | contains information such as the store paths referred to by each store |
| 2947 | path, and the list of @emph{valid} store items---results of successful | 2955 | path, and the list of @emph{valid} store items---results of successful |
| 2948 | builds. This database resides in @file{/var/guix/db} (or under whatever | 2956 | builds. This database resides in @file{@var{localstatedir}/guix/db}, |
| 2949 | state directory was specified @i{via} @option{--localstatedir} at | 2957 | where @var{localstatedir} is the state directory specified @i{via} |
| 2950 | configure time). | 2958 | @option{--localstatedir} at configure time, usually @file{/var}. |
| 2951 | 2959 | ||
| 2952 | The store is @emph{always} accessed by the daemon on behalf of its clients | 2960 | The store is @emph{always} accessed by the daemon on behalf of its clients |
| 2953 | (@pxref{Invoking guix-daemon}). To manipulate the store, clients | 2961 | (@pxref{Invoking guix-daemon}). To manipulate the store, clients |
diff --git a/m4/guix.m4 b/m4/guix.m4 index acfc33e170c..2d3dfd282ec 100644 --- a/m4/guix.m4 +++ b/m4/guix.m4 | |||
| @@ -307,3 +307,49 @@ AC_DEFUN([GUIX_LIBGCRYPT_LIBDIR], [ | |||
| 307 | fi]) | 307 | fi]) |
| 308 | $1="$guix_cv_libgcrypt_libdir" | 308 | $1="$guix_cv_libgcrypt_libdir" |
| 309 | ]) | 309 | ]) |
| 310 | |||
| 311 | dnl GUIX_CURRENT_LOCALSTATEDIR | ||
| 312 | dnl | ||
| 313 | dnl Determine the localstatedir of an existing Guix installation and set | ||
| 314 | dnl 'guix_cv_current_localstatedir' accordingly. Set it to "none" if no | ||
| 315 | dnl existing installation was found. | ||
| 316 | AC_DEFUN([GUIX_CURRENT_LOCALSTATEDIR], [ | ||
| 317 | AC_PATH_PROG([GUILE], [guile]) | ||
| 318 | AC_CACHE_CHECK([the current installation's localstatedir], | ||
| 319 | [guix_cv_current_localstatedir], | ||
| 320 | [dnl Call 'dirname' because (guix config) appends "/guix" to LOCALSTATEDIR. | ||
| 321 | guix_cv_current_localstatedir="`"$GUILE" \ | ||
| 322 | -c '(use-modules (guix config)) | ||
| 323 | (when (string=? %store-directory "'$storedir'") | ||
| 324 | (display (dirname %state-directory)))' \ | ||
| 325 | 2>/dev/null`" | ||
| 326 | if test "x$guix_cv_current_localstatedir" = "x"; then | ||
| 327 | guix_cv_current_localstatedir=none | ||
| 328 | fi])]) | ||
| 329 | |||
| 330 | dnl GUIX_CHECK_LOCALSTATEDIR | ||
| 331 | dnl | ||
| 332 | dnl Check that the LOCALSTATEDIR value is consistent with that of the existing | ||
| 333 | dnl Guix installation, if any. Error out or warn if they do not match. | ||
| 334 | AC_DEFUN([GUIX_CHECK_LOCALSTATEDIR], [ | ||
| 335 | AC_REQUIRE([GUIX_CURRENT_LOCALSTATEDIR]) | ||
| 336 | if test "x$guix_cv_current_localstatedir" != "xnone"; then | ||
| 337 | if test "$guix_cv_current_localstatedir" != "$guix_localstatedir"; then | ||
| 338 | case "$localstatedir" in | ||
| 339 | NONE|\${prefix}*) | ||
| 340 | # User kept the default value---i.e., did not pass '--localstatedir'. | ||
| 341 | AC_MSG_ERROR([chosen localstatedir '$guix_localstatedir' does not match \ | ||
| 342 | that of the existing installation '$guix_cv_current_localstatedir' | ||
| 343 | Installing may corrupt $storedir! | ||
| 344 | Use './configure --localstatedir=$guix_cv_current_localstatedir'.]) | ||
| 345 | ;; | ||
| 346 | *) | ||
| 347 | # User passed an explicit '--localstatedir'. Assume they know what | ||
| 348 | # they're doing. | ||
| 349 | AC_MSG_WARN([chosen localstatedir '$guix_localstatedir' does not match \ | ||
| 350 | that of the existing installation '$guix_cv_current_localstatedir']) | ||
| 351 | AC_MSG_WARN([installing may corrupt $storedir!]) | ||
| 352 | ;; | ||
| 353 | esac | ||
| 354 | fi | ||
| 355 | fi]) | ||
