database: 'with-database' can now initialize new databases.
[jackhill/guix/guix.git] / m4 / guix.m4
CommitLineData
2357f850 1dnl GNU Guix --- Functional package management for GNU
14218251 2dnl Copyright © 2012, 2013, 2014, 2015, 2016, 2018 Ludovic Courtès <ludo@gnu.org>
aa1e1947 3dnl Copyright © 2014 Mark H Weaver <mhw@netris.org>
3b88f376 4dnl Copyright © 2017 Efraim Flashner <efraim@flashner.co.il>
d388c2c4 5dnl
2357f850 6dnl This file is part of GNU Guix.
d388c2c4 7dnl
2357f850 8dnl GNU Guix is free software; you can redistribute it and/or modify it
d388c2c4
LC
9dnl under the terms of the GNU General Public License as published by
10dnl the Free Software Foundation; either version 3 of the License, or (at
11dnl your option) any later version.
12dnl
2357f850 13dnl GNU Guix is distributed in the hope that it will be useful, but
d388c2c4
LC
14dnl WITHOUT ANY WARRANTY; without even the implied warranty of
15dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16dnl GNU General Public License for more details.
17dnl
18dnl You should have received a copy of the GNU General Public License
2357f850 19dnl along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
d388c2c4
LC
20
21dnl GUIX_ASSERT_LIBGCRYPT_USABLE
22dnl
23dnl Assert that GNU libgcrypt is usable from Guile.
24AC_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"
31 else
32 guix_cv_libgcrypt_usable_p="no"
33 fi])
34
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'.])
37 fi])
c2033df4
LC
38
39dnl GUIX_SYSTEM_TYPE
40dnl
41dnl Determine the Guix host system type, and store it in the
42dnl `guix_system' variable.
43AC_DEFUN([GUIX_SYSTEM_TYPE], [
44 AC_REQUIRE([AC_CANONICAL_HOST])
eb25a30a
LC
45 AC_PATH_PROG([SED], [sed])
46
c2033df4
LC
47 AC_ARG_WITH(system, AC_HELP_STRING([--with-system=SYSTEM],
48 [Platform identifier (e.g., `i686-linux').]),
49 [guix_system="$withval"],
50 [case "$host_cpu" in
51 i*86)
52 machine_name="i686";;
53 amd64)
968ae903 54 machine_name="x86_64";;
dfdb15d9 55 arm|armv[[7-9]]*)
968ae903
LC
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.
60 #
aa1e1947
MW
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,
64 # configured with:
65 # --with-arch=armv7-a
66 # --with-float=hard
67 # --with-mode=thumb
68 # --with-fpu=vfpv3-d16
69 machine_name="armhf";;
c2033df4
LC
70 *)
71 machine_name="$host_cpu";;
72 esac
73
74 case "$host_os" in
75 linux-gnu*)
76 # For backward compatibility, strip the `-gnu' part.
77 guix_system="$machine_name-linux";;
4ed40a3e
MR
78 gnu*)
79 # Always use i586 for GNU/Hurd.
80 guix_system="i586-gnu";;
c2033df4
LC
81 *)
82 # Strip the version number from names such as `gnu0.3',
83 # `darwin10.2.0', etc.
eb25a30a 84 guix_system="$machine_name-`echo $host_os | "$SED" -e's/[0-9.]*$//g'`";;
c2033df4 85 esac])
5fedc65b
LC
86
87 AC_MSG_CHECKING([for the Guix system type])
88 AC_MSG_RESULT([$guix_system])
89
d8eea3d2 90 AC_SUBST([guix_system])
c2033df4 91])
9c7dd33a 92
b97556d7
LC
93dnl GUIX_ASSERT_SUPPORTED_SYSTEM
94dnl
95dnl Assert that this is a system to which the distro is ported.
96AC_DEFUN([GUIX_ASSERT_SUPPORTED_SYSTEM], [
97 AC_REQUIRE([GUIX_SYSTEM_TYPE])
98
99 AC_ARG_WITH([courage], [AC_HELP_STRING([--with-courage],
100 [Assert that even if this platform is unsupported, you will be
101courageous and port the GNU System distribution to it (see
102"GNU Distribution" in the manual.)])],
103 [guix_courageous="$withval"],
104 [guix_courageous="no"])
105
106 # Currently only Linux-based systems are supported, and only on some
107 # platforms.
108 case "$guix_system" in
3b88f376 109 x86_64-linux|i686-linux|armhf-linux|aarch64-linux|mips64el-linux)
b97556d7
LC
110 ;;
111 *)
112 if test "x$guix_courageous" = "xyes"; then
113 AC_MSG_WARN([building Guix on `$guix_system', which is not supported])
114 else
115 AC_MSG_ERROR([`$guix_system' is not a supported platform.
116See "GNU Distribution" in the manual, or try `--with-courage'.])
117 fi
118 ;;
119 esac
120])
121
9c7dd33a
LC
122dnl GUIX_ASSERT_GUILE_FEATURES FEATURES
123dnl
124dnl Assert that FEATURES are provided by $GUILE.
125AC_DEFUN([GUIX_ASSERT_GUILE_FEATURES], [
126 for guix_guile_feature in $1
127 do
128 AC_MSG_CHECKING([whether $GUILE provides feature '$guix_guile_feature'])
129 if "$GUILE" -c "(exit (provided? '$guix_guile_feature))"
130 then
131 AC_MSG_RESULT([yes])
132 else
133 AC_MSG_RESULT([no])
134 AC_MSG_ERROR([$GUILE does not support feature '$guix_guile_feature', which is required.])
135 fi
136 done
137])
1959fb04 138
14218251
LC
139dnl GUIX_ASSERT_SYNTAX_OBJECT_EQUAL
140dnl
141dnl Guile 2.2.1 was a brown-paper-bag release where 'equal?' wouldn't work
142dnl for syntax objects, which broke gexps. Unfortunately Fedora 25 provides it.
143dnl Reject it.
144AC_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)))'
148 then
149 ac_cv_guix_syntax_object_equal=yes
150 else
151 ac_cv_guix_syntax_object_equal=no
152 fi])
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.])
156 fi
157])
158
21531add
LC
159dnl GUIX_CHECK_GUILE_SSH
160dnl
161dnl Check whether a recent-enough Guile-SSH is available.
162AC_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"
172 else
173 guix_cv_have_recent_guile_ssh="no"
174 fi])
175])
176
d59e75f3
LC
177dnl GUIX_CHECK_GUILE_SQLITE3
178dnl
179dnl Check whether a recent-enough Guile-Sqlite3 is available.
180AC_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"
190 else
191 guix_cv_have_recent_guile_sqlite3="no"
192 fi])
193])
194
2178ed66
LC
195dnl GUIX_TEST_ROOT_DIRECTORY
196AC_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"])
200])
201
93ce8a8e
LC
202dnl 'BINPRM_BUF_SIZE' constant in Linux (we leave room for the trailing zero.)
203dnl The Hurd has a limit of about a page (see exec/hashexec.c.)
204m4_define([LINUX_HASH_BANG_LIMIT], 127)
2178ed66
LC
205
206dnl Hardcoded 'sun_path' length in <sys/un.h>.
207m4_define([SOCKET_FILE_NAME_LIMIT], 108)
208
209dnl GUIX_SOCKET_FILE_NAME_LENGTH
210AC_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`"])
214])
215
216dnl GUIX_TEST_SOCKET_FILE_NAME_LENGTH
217AC_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`"])
222])
223
224dnl GUIX_HASH_BANG_LENGTH
225AC_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`])
229])
230
27ab3cee
LC
231dnl GUIX_TEST_HASH_BANG_LENGTH
232AC_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`])
237])
238
2178ed66
LC
239dnl GUIX_CHECK_FILE_NAME_LIMITS
240dnl
241dnl GNU/Linux has a couple of silly limits that we can easily run into.
bb251307
LC
242dnl Make sure everything is fine with the current settings. Set $1 to
243dnl 'yes' if tests can run, 'no' otherwise.
2178ed66
LC
244AC_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])
27ab3cee 248 AC_REQUIRE([GUIX_TEST_HASH_BANG_LENGTH])
2178ed66
LC
249
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])
252 fi
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])
255 fi
bb251307
LC
256
257 $1=yes
2178ed66 258 if test "$ac_cv_guix_hash_bang_length" -ge ]LINUX_HASH_BANG_LIMIT[; then
bb251307 259 $1=no
2178ed66
LC
260 AC_MSG_ERROR([store directory '$storedir' would lead to overly long hash-bang lines])
261 fi
27ab3cee 262 if test "$ac_cv_guix_test_hash_bang_length" -ge ]LINUX_HASH_BANG_LIMIT[; then
bb251307 263 $1=no
27ab3cee
LC
264 AC_MSG_WARN([test directory '$ac_cv_guix_test_root' may lead to overly long hash-bang lines])
265 fi
2178ed66 266])
368d08f7
LC
267
268dnl GUIX_CHECK_CXX11
269dnl
270dnl Check whether the C++ compiler can compile a typical C++11 program.
271AC_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"
277 AC_COMPILE_IFELSE([
278 AC_LANG_SOURCE([
279 #include <functional>
280
281 std::function<int(int)>
282 return_plus_lambda (int x)
283 {
284 auto result = [[&]](int y) {
285 return x + y;
286 };
287
288 return result;
289 }
290 ])],
291 [ac_cv_guix_cxx11_support=yes],
292 [ac_cv_guix_cxx11_support=no])
293 CXXFLAGS="$save_CXXFLAGS"
294 ])
295])
296
297dnl GUIX_ASSERT_CXX11
298dnl
299dnl Error out if the C++ compiler cannot compile C++11 code.
300AC_DEFUN([GUIX_ASSERT_CXX11], [
301 GUIX_CHECK_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])
304 fi
305])
12e5b266 306
dd01fecd
LC
307dnl GUIX_LIBGCRYPT_LIBDIR VAR
308dnl
309dnl Attempt to determine libgcrypt's LIBDIR; store the result in VAR.
310AC_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
ca34fc31 315 guix_cv_libgcrypt_libdir=`$LIBGCRYPT_CONFIG --libs | grep -e -L | sed -e "s/.*-L\([[^ ]]\+\)[[[:blank:]]]\+-lgcrypt.*/\1/g"`
dd01fecd
LC
316 else
317 guix_cv_libgcrypt_libdir=""
318 fi])
319 $1="$guix_cv_libgcrypt_libdir"
320])
ef5f5c86 321
72153902
LC
322dnl GUIX_LIBZ_LIBDIR VAR
323dnl
324dnl Attempt to determine libz's LIBDIR; store the result in VAR.
325AC_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"
331])
332
ef5f5c86
LC
333dnl GUIX_CURRENT_LOCALSTATEDIR
334dnl
335dnl Determine the localstatedir of an existing Guix installation and set
336dnl 'guix_cv_current_localstatedir' accordingly. Set it to "none" if no
337dnl existing installation was found.
338AC_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)))' \
347 2>/dev/null`"
348 if test "x$guix_cv_current_localstatedir" = "x"; then
349 guix_cv_current_localstatedir=none
350 fi])])
351
352dnl GUIX_CHECK_LOCALSTATEDIR
353dnl
354dnl Check that the LOCALSTATEDIR value is consistent with that of the existing
355dnl Guix installation, if any. Error out or warn if they do not match.
356AC_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
361 NONE|\${prefix}*)
362 # User kept the default value---i.e., did not pass '--localstatedir'.
363 AC_MSG_ERROR([chosen localstatedir '$guix_localstatedir' does not match \
364that of the existing installation '$guix_cv_current_localstatedir'
365Installing may corrupt $storedir!
366Use './configure --localstatedir=$guix_cv_current_localstatedir'.])
367 ;;
368 *)
369 # User passed an explicit '--localstatedir'. Assume they know what
370 # they're doing.
371 AC_MSG_WARN([chosen localstatedir '$guix_localstatedir' does not match \
372that of the existing installation '$guix_cv_current_localstatedir'])
373 AC_MSG_WARN([installing may corrupt $storedir!])
374 ;;
375 esac
376 fi
377 fi])