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.
This commit is contained in:
Ludovic Courtès 2016-03-19 14:45:58 +01:00
parent 7c49ab5b1c
commit ef5f5c8659
4 changed files with 63 additions and 3 deletions

View File

@ -421,7 +421,11 @@ include daemon.am
endif BUILD_DAEMON endif BUILD_DAEMON
ACLOCAL_AMFLAGS = -I m4 ACLOCAL_AMFLAGS = -I m4
# Pass an explicit '--localstatedir' so that configure does not error out if
# it finds an existing installation with a different localstatedir.
AM_DISTCHECK_CONFIGURE_FLAGS = \ AM_DISTCHECK_CONFIGURE_FLAGS = \
--localstatedir="$$dc_install_base/var" \
--with-libgcrypt-prefix="$(LIBGCRYPT_PREFIX)" \ --with-libgcrypt-prefix="$(LIBGCRYPT_PREFIX)" \
--with-libgcrypt-libdir="$(LIBGCRYPT_LIBDIR)" \ --with-libgcrypt-libdir="$(LIBGCRYPT_LIBDIR)" \
--with-nix-prefix="$(NIX_PREFIX)" \ --with-nix-prefix="$(NIX_PREFIX)" \

View File

@ -140,6 +140,8 @@ if test "x$guix_build_daemon" = "xyes"; then
GUIX_TEST_ROOT="$ac_cv_guix_test_root" GUIX_TEST_ROOT="$ac_cv_guix_test_root"
AC_SUBST([GUIX_TEST_ROOT]) AC_SUBST([GUIX_TEST_ROOT])
GUIX_CHECK_LOCALSTATEDIR
AC_CONFIG_FILES([nix/scripts/list-runtime-roots], AC_CONFIG_FILES([nix/scripts/list-runtime-roots],
[chmod +x nix/scripts/list-runtime-roots]) [chmod +x nix/scripts/list-runtime-roots])
AC_CONFIG_FILES([nix/scripts/substitute], AC_CONFIG_FILES([nix/scripts/substitute],

View File

@ -527,6 +527,14 @@ following packages are also needed:
C++11 standard. C++11 standard.
@end itemize @end itemize
When configuring Guix on a system that already has a Guix installation,
be sure to specify the same state directory as the existing installation
using the @code{--localstatedir} option of the @command{configure}
script (@pxref{Directory Variables, @code{localstatedir},, standards,
GNU Coding Standards}). The @command{configure} script protects against
unintended misconfiguration of @var{localstatedir} so you do not
inadvertently corrupt your store (@pxref{The Store}).
When a working installation of @url{http://nixos.org/nix/, the Nix package When a working installation of @url{http://nixos.org/nix/, the Nix package
manager} is available, you manager} is available, you
can instead configure Guix with @code{--disable-daemon}. In that case, 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
sometimes @dfn{store paths}. The store has an associated database that sometimes @dfn{store paths}. The store has an associated database that
contains information such as the store paths referred to by each store contains information such as the store paths referred to by each store
path, and the list of @emph{valid} store items---results of successful path, and the list of @emph{valid} store items---results of successful
builds. This database resides in @file{/var/guix/db} (or under whatever builds. This database resides in @file{@var{localstatedir}/guix/db},
state directory was specified @i{via} @option{--localstatedir} at where @var{localstatedir} is the state directory specified @i{via}
configure time). @option{--localstatedir} at configure time, usually @file{/var}.
The store is @emph{always} accessed by the daemon on behalf of its clients The store is @emph{always} accessed by the daemon on behalf of its clients
(@pxref{Invoking guix-daemon}). To manipulate the store, clients (@pxref{Invoking guix-daemon}). To manipulate the store, clients

View File

@ -307,3 +307,49 @@ AC_DEFUN([GUIX_LIBGCRYPT_LIBDIR], [
fi]) fi])
$1="$guix_cv_libgcrypt_libdir" $1="$guix_cv_libgcrypt_libdir"
]) ])
dnl GUIX_CURRENT_LOCALSTATEDIR
dnl
dnl Determine the localstatedir of an existing Guix installation and set
dnl 'guix_cv_current_localstatedir' accordingly. Set it to "none" if no
dnl existing installation was found.
AC_DEFUN([GUIX_CURRENT_LOCALSTATEDIR], [
AC_PATH_PROG([GUILE], [guile])
AC_CACHE_CHECK([the current installation's localstatedir],
[guix_cv_current_localstatedir],
[dnl Call 'dirname' because (guix config) appends "/guix" to LOCALSTATEDIR.
guix_cv_current_localstatedir="`"$GUILE" \
-c '(use-modules (guix config))
(when (string=? %store-directory "'$storedir'")
(display (dirname %state-directory)))' \
2>/dev/null`"
if test "x$guix_cv_current_localstatedir" = "x"; then
guix_cv_current_localstatedir=none
fi])])
dnl GUIX_CHECK_LOCALSTATEDIR
dnl
dnl Check that the LOCALSTATEDIR value is consistent with that of the existing
dnl Guix installation, if any. Error out or warn if they do not match.
AC_DEFUN([GUIX_CHECK_LOCALSTATEDIR], [
AC_REQUIRE([GUIX_CURRENT_LOCALSTATEDIR])
if test "x$guix_cv_current_localstatedir" != "xnone"; then
if test "$guix_cv_current_localstatedir" != "$guix_localstatedir"; then
case "$localstatedir" in
NONE|\${prefix}*)
# User kept the default value---i.e., did not pass '--localstatedir'.
AC_MSG_ERROR([chosen localstatedir '$guix_localstatedir' does not match \
that of the existing installation '$guix_cv_current_localstatedir'
Installing may corrupt $storedir!
Use './configure --localstatedir=$guix_cv_current_localstatedir'.])
;;
*)
# User passed an explicit '--localstatedir'. Assume they know what
# they're doing.
AC_MSG_WARN([chosen localstatedir '$guix_localstatedir' does not match \
that of the existing installation '$guix_cv_current_localstatedir'])
AC_MSG_WARN([installing may corrupt $storedir!])
;;
esac
fi
fi])