1 dnl GNU Guix --- Functional package management for GNU
2 dnl Copyright © 2012, 2013, 2014, 2015, 2016, 2018 Ludovic Courtès <ludo@gnu.org>
3 dnl Copyright © 2014 Mark H Weaver <mhw@netris.org>
4 dnl Copyright © 2017 Efraim Flashner <efraim@flashner.co.il>
6 dnl This file is part of GNU Guix.
8 dnl GNU Guix is free software; you can redistribute it and/or modify it
9 dnl under the terms of the GNU General Public License as published by
10 dnl the Free Software Foundation; either version 3 of the License, or (at
11 dnl your option) any later version.
13 dnl GNU Guix is distributed in the hope that it will be useful, but
14 dnl WITHOUT ANY WARRANTY; without even the implied warranty of
15 dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 dnl GNU General Public License for more details.
18 dnl You should have received a copy of the GNU General Public License
19 dnl along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
21 dnl GUIX_ASSERT_LIBGCRYPT_USABLE
23 dnl Assert that GNU libgcrypt is usable from Guile.
24 AC_DEFUN([GUIX_ASSERT_LIBGCRYPT_USABLE],
25 [AC_CACHE_CHECK([whether $LIBGCRYPT can be dynamically loaded],
26 [guix_cv_libgcrypt_usable_p],
27 [GUILE_CHECK([retval],
28 [(dynamic-func \"gcry_md_hash_buffer\" (dynamic-link \"$LIBGCRYPT\"))])
29 if test "$retval" = 0; then
30 guix_cv_libgcrypt_usable_p="yes"
32 guix_cv_libgcrypt_usable_p="no"
35 if test "x$guix_cv_libgcrypt_usable_p" != "xyes"; then
36 AC_MSG_ERROR([GNU libgcrypt does not appear to be usable; see `--with-libgcrypt-prefix' and `README'.])
41 dnl Determine the Guix host system type, and store it in the
42 dnl `guix_system' variable.
43 AC_DEFUN([GUIX_SYSTEM_TYPE], [
44 AC_REQUIRE([AC_CANONICAL_HOST])
45 AC_PATH_PROG([SED], [sed])
47 AC_ARG_WITH(system, AC_HELP_STRING([--with-system=SYSTEM],
48 [Platform identifier (e.g., `i686-linux').]),
49 [guix_system="$withval"],
54 machine_name="x86_64";;
56 # Here we want to exclude CPUs such as "armv6l". On ARMv7
57 # machines, we normally get "armv7l". However, in Guix, we
58 # configure with --build=arm-unknown-linux-gnueabihf, leading
59 # to just "arm", so we also have to allow it.
61 # TODO: If not cross-compiling, add a sanity check to make
62 # sure this build machine has the needed features to
63 # support executables compiled using our armhf gcc,
68 # --with-fpu=vfpv3-d16
69 machine_name="armhf";;
71 machine_name="$host_cpu";;
76 # For backward compatibility, strip the `-gnu' part.
77 guix_system="$machine_name-linux";;
79 # Always use i586 for GNU/Hurd.
80 guix_system="i586-gnu";;
82 # Strip the version number from names such as `gnu0.3',
83 # `darwin10.2.0', etc.
84 guix_system="$machine_name-`echo $host_os | "$SED" -e's/[0-9.]*$//g'`";;
87 AC_MSG_CHECKING([for the Guix system type])
88 AC_MSG_RESULT([$guix_system])
90 AC_SUBST([guix_system])
93 dnl GUIX_ASSERT_SUPPORTED_SYSTEM
95 dnl Assert that this is a system to which the distro is ported.
96 AC_DEFUN([GUIX_ASSERT_SUPPORTED_SYSTEM], [
97 AC_REQUIRE([GUIX_SYSTEM_TYPE])
99 AC_ARG_WITH([courage], [AC_HELP_STRING([--with-courage],
100 [Assert that even if this platform is unsupported, you will be
101 courageous and port the GNU System distribution to it (see
102 "GNU Distribution" in the manual.)])],
103 [guix_courageous="$withval"],
104 [guix_courageous="no"])
106 # Currently only Linux-based systems are supported, and only on some
108 case "$guix_system" in
109 x86_64-linux|i686-linux|armhf-linux|aarch64-linux|mips64el-linux)
112 if test "x$guix_courageous" = "xyes"; then
113 AC_MSG_WARN([building Guix on `$guix_system', which is not supported])
115 AC_MSG_ERROR([`$guix_system' is not a supported platform.
116 See "GNU Distribution" in the manual, or try `--with-courage'.])
122 dnl GUIX_ASSERT_GUILE_FEATURES FEATURES
124 dnl Assert that FEATURES are provided by $GUILE.
125 AC_DEFUN([GUIX_ASSERT_GUILE_FEATURES], [
126 for guix_guile_feature in $1
128 AC_MSG_CHECKING([whether $GUILE provides feature '$guix_guile_feature'])
129 if "$GUILE" -c "(exit (provided? '$guix_guile_feature))"
134 AC_MSG_ERROR([$GUILE does not support feature '$guix_guile_feature', which is required.])
139 dnl GUIX_ASSERT_SYNTAX_OBJECT_EQUAL
141 dnl Guile 2.2.1 was a brown-paper-bag release where 'equal?' wouldn't work
142 dnl for syntax objects, which broke gexps. Unfortunately Fedora 25 provides it.
144 AC_DEFUN([GUIX_ASSERT_SYNTAX_OBJECT_EQUAL], [
145 AC_CACHE_CHECK([whether 'equal?' works for syntax objects],
146 [ac_cv_guix_syntax_object_equal],
147 [if "$GUILE" -c '(exit (equal? (syntax x) (syntax x)))'
149 ac_cv_guix_syntax_object_equal=yes
151 ac_cv_guix_syntax_object_equal=no
153 if test "x$ac_cv_guix_syntax_object_equal" != xyes; then
154 # This bug was present in Guile 2.2.1 only.
155 AC_MSG_ERROR(['equal?' does not work for syntax object; upgrade to Guile 2.2.2 or later.])
159 dnl GUIX_CHECK_GUILE_SSH
161 dnl Check whether a recent-enough Guile-SSH is available.
162 AC_DEFUN([GUIX_CHECK_GUILE_SSH], [
163 dnl Check whether 'channel-send-eof' (introduced in 0.10.2) is present.
164 AC_CACHE_CHECK([whether Guile-SSH is available and recent enough],
165 [guix_cv_have_recent_guile_ssh],
166 [GUILE_CHECK([retval],
167 [(and (@ (ssh channel) channel-send-eof)
168 (@ (ssh popen) open-remote-pipe)
169 (@ (ssh dist node) node-eval))])
170 if test "$retval" = 0; then
171 guix_cv_have_recent_guile_ssh="yes"
173 guix_cv_have_recent_guile_ssh="no"
177 dnl GUIX_CHECK_GUILE_SQLITE3
179 dnl Check whether a recent-enough Guile-Sqlite3 is available.
180 AC_DEFUN([GUIX_CHECK_GUILE_SQLITE3], [
181 dnl Check whether 'sqlite-bind-arguments' is available. It was introduced
182 dnl in February 2018:
183 dnl <https://notabug.org/civodul/guile-sqlite3/commit/1cd1dec96a9999db48c0ff45bab907efc637247f>.
184 AC_CACHE_CHECK([whether Guile-Sqlite3 is available and recent enough],
185 [guix_cv_have_recent_guile_sqlite3],
186 [GUILE_CHECK([retval],
187 [(@ (sqlite3) sqlite-bind-arguments)])
188 if test "$retval" = 0; then
189 guix_cv_have_recent_guile_sqlite3="yes"
191 guix_cv_have_recent_guile_sqlite3="no"
195 dnl GUIX_TEST_ROOT_DIRECTORY
196 AC_DEFUN([GUIX_TEST_ROOT_DIRECTORY], [
197 AC_CACHE_CHECK([for unit test root directory],
198 [ac_cv_guix_test_root],
199 [ac_cv_guix_test_root="`pwd`/test-tmp"])
202 dnl 'BINPRM_BUF_SIZE' constant in Linux (we leave room for the trailing zero.)
203 dnl The Hurd has a limit of about a page (see exec/hashexec.c.)
204 m4_define([LINUX_HASH_BANG_LIMIT], 127)
206 dnl Hardcoded 'sun_path' length in <sys/un.h>.
207 m4_define([SOCKET_FILE_NAME_LIMIT], 108)
209 dnl GUIX_SOCKET_FILE_NAME_LENGTH
210 AC_DEFUN([GUIX_SOCKET_FILE_NAME_LENGTH], [
211 AC_CACHE_CHECK([the length of the installed socket file name],
212 [ac_cv_guix_socket_file_name_length],
213 [ac_cv_guix_socket_file_name_length="`echo -n "$guix_localstatedir/guix/daemon-socket/socket" | wc -c`"])
216 dnl GUIX_TEST_SOCKET_FILE_NAME_LENGTH
217 AC_DEFUN([GUIX_TEST_SOCKET_FILE_NAME_LENGTH], [
218 AC_REQUIRE([GUIX_TEST_ROOT_DIRECTORY])
219 AC_CACHE_CHECK([the length of the socket file name used in tests],
220 [ac_cv_guix_test_socket_file_name_length],
221 [ac_cv_guix_test_socket_file_name_length="`echo -n "$ac_cv_guix_test_root/var/123456/daemon-socket/socket" | wc -c`"])
224 dnl GUIX_HASH_BANG_LENGTH
225 AC_DEFUN([GUIX_HASH_BANG_LENGTH], [
226 AC_CACHE_CHECK([the length of a typical hash bang line],
227 [ac_cv_guix_hash_bang_length],
228 [ac_cv_guix_hash_bang_length=`echo -n "$storedir/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-bootstrap-binaries-0/bin/bash" | wc -c`])
231 dnl GUIX_TEST_HASH_BANG_LENGTH
232 AC_DEFUN([GUIX_TEST_HASH_BANG_LENGTH], [
233 AC_REQUIRE([GUIX_TEST_ROOT_DIRECTORY])
234 AC_CACHE_CHECK([the length of a hash bang line used in tests],
235 [ac_cv_guix_test_hash_bang_length],
236 [ac_cv_guix_test_hash_bang_length=`echo -n "$ac_cv_guix_test_root/store/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-bootstrap-binaries-0/bin/bash" | wc -c`])
239 dnl GUIX_CHECK_FILE_NAME_LIMITS
241 dnl GNU/Linux has a couple of silly limits that we can easily run into.
242 dnl Make sure everything is fine with the current settings. Set $1 to
243 dnl 'yes' if tests can run, 'no' otherwise.
244 AC_DEFUN([GUIX_CHECK_FILE_NAME_LIMITS], [
245 AC_REQUIRE([GUIX_SOCKET_FILE_NAME_LENGTH])
246 AC_REQUIRE([GUIX_TEST_SOCKET_FILE_NAME_LENGTH])
247 AC_REQUIRE([GUIX_HASH_BANG_LENGTH])
248 AC_REQUIRE([GUIX_TEST_HASH_BANG_LENGTH])
250 if test "$ac_cv_guix_socket_file_name_length" -ge ]SOCKET_FILE_NAME_LIMIT[; then
251 AC_MSG_ERROR([socket file name would exceed the maxium allowed length])
253 if test "$ac_cv_guix_test_socket_file_name_length" -ge ]SOCKET_FILE_NAME_LIMIT[; then
254 AC_MSG_WARN([socket file name limit may be exceeded when running tests])
258 if test "$ac_cv_guix_hash_bang_length" -ge ]LINUX_HASH_BANG_LIMIT[; then
260 AC_MSG_ERROR([store directory '$storedir' would lead to overly long hash-bang lines])
262 if test "$ac_cv_guix_test_hash_bang_length" -ge ]LINUX_HASH_BANG_LIMIT[; then
264 AC_MSG_WARN([test directory '$ac_cv_guix_test_root' may lead to overly long hash-bang lines])
270 dnl Check whether the C++ compiler can compile a typical C++11 program.
271 AC_DEFUN([GUIX_CHECK_CXX11], [
272 AC_REQUIRE([AC_PROG_CXX])
273 AC_CACHE_CHECK([whether $CXX supports C++11],
274 [ac_cv_guix_cxx11_support],
275 [save_CXXFLAGS="$CXXFLAGS"
276 CXXFLAGS="-std=c++11 $CXXFLAGS"
279 #include <functional>
281 std::function<int(int)>
282 return_plus_lambda (int x)
284 auto result = [[&]](int y) {
291 [ac_cv_guix_cxx11_support=yes],
292 [ac_cv_guix_cxx11_support=no])
293 CXXFLAGS="$save_CXXFLAGS"
297 dnl GUIX_ASSERT_CXX11
299 dnl Error out if the C++ compiler cannot compile C++11 code.
300 AC_DEFUN([GUIX_ASSERT_CXX11], [
302 if test "x$ac_cv_guix_cxx11_support" != "xyes"; then
303 AC_MSG_ERROR([C++ compiler '$CXX' does not support the C++11 standard])
307 dnl GUIX_LIBGCRYPT_LIBDIR VAR
309 dnl Attempt to determine libgcrypt's LIBDIR; store the result in VAR.
310 AC_DEFUN([GUIX_LIBGCRYPT_LIBDIR], [
311 AC_PATH_PROG([LIBGCRYPT_CONFIG], [libgcrypt-config])
312 AC_CACHE_CHECK([libgcrypt's library directory],
313 [guix_cv_libgcrypt_libdir],
314 [if test "x$LIBGCRYPT_CONFIG" != "x"; then
315 guix_cv_libgcrypt_libdir=`$LIBGCRYPT_CONFIG --libs | grep -e -L | sed -e "s/.*-L\([[^ ]]\+\)[[[:blank:]]]\+-lgcrypt.*/\1/g"`
317 guix_cv_libgcrypt_libdir=""
319 $1="$guix_cv_libgcrypt_libdir"
322 dnl GUIX_LIBZ_LIBDIR VAR
324 dnl Attempt to determine libz's LIBDIR; store the result in VAR.
325 AC_DEFUN([GUIX_LIBZ_LIBDIR], [
326 AC_REQUIRE([PKG_PROG_PKG_CONFIG])
327 AC_CACHE_CHECK([zlib's library directory],
328 [guix_cv_libz_libdir],
329 [guix_cv_libz_libdir="`$PKG_CONFIG zlib --variable=libdir 2> /dev/null`"])
330 $1="$guix_cv_libz_libdir"
333 dnl GUIX_CURRENT_LOCALSTATEDIR
335 dnl Determine the localstatedir of an existing Guix installation and set
336 dnl 'guix_cv_current_localstatedir' accordingly. Set it to "none" if no
337 dnl existing installation was found.
338 AC_DEFUN([GUIX_CURRENT_LOCALSTATEDIR], [
339 AC_PATH_PROG([GUILE], [guile])
340 AC_CACHE_CHECK([the current installation's localstatedir],
341 [guix_cv_current_localstatedir],
342 [dnl Call 'dirname' because (guix config) appends "/guix" to LOCALSTATEDIR.
343 guix_cv_current_localstatedir="`"$GUILE" \
344 -c '(use-modules (guix config))
345 (when (string=? %store-directory "'$storedir'")
346 (display (dirname %state-directory)))' \
348 if test "x$guix_cv_current_localstatedir" = "x"; then
349 guix_cv_current_localstatedir=none
352 dnl GUIX_CHECK_LOCALSTATEDIR
354 dnl Check that the LOCALSTATEDIR value is consistent with that of the existing
355 dnl Guix installation, if any. Error out or warn if they do not match.
356 AC_DEFUN([GUIX_CHECK_LOCALSTATEDIR], [
357 AC_REQUIRE([GUIX_CURRENT_LOCALSTATEDIR])
358 if test "x$guix_cv_current_localstatedir" != "xnone"; then
359 if test "$guix_cv_current_localstatedir" != "$guix_localstatedir"; then
360 case "$localstatedir" in
362 # User kept the default value---i.e., did not pass '--localstatedir'.
363 AC_MSG_ERROR([chosen localstatedir '$guix_localstatedir' does not match \
364 that of the existing installation '$guix_cv_current_localstatedir'
365 Installing may corrupt $storedir!
366 Use './configure --localstatedir=$guix_cv_current_localstatedir'.])
369 # User passed an explicit '--localstatedir'. Assume they know what
371 AC_MSG_WARN([chosen localstatedir '$guix_localstatedir' does not match \
372 that of the existing installation '$guix_cv_current_localstatedir'])
373 AC_MSG_WARN([installing may corrupt $storedir!])