chiark / gitweb /
Prep v234: Update root build files to upstream.
[elogind.git] / configure.ac
1 #
2 #  This file is part of elogind.
3 #
4 #  Copyright 2010-2012 Lennart Poettering
5 #  Copyright 2010-2012 Kay Sievers
6 #
7 #  elogind is free software; you can redistribute it and/or modify it
8 #  under the terms of the GNU Lesser General Public License as published by
9 #  the Free Software Foundation; either version 2.1 of the License, or
10 #  (at your option) any later version.
11 #
12 #  elogind is distributed in the hope that it will be useful, but
13 #  WITHOUT ANY WARRANTY; without even the implied warranty of
14 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 #  Lesser General Public License for more details.
16 #
17 #  You should have received a copy of the GNU Lesser General Public License
18 #  along with systemd; If not, see <http://www.gnu.org/licenses/>.
19
20 AC_PREREQ([2.64])
21
22 AC_INIT([elogind],
23         [234],
24         [https://github.com/elogind/elogind/issues],
25         [elogind],
26         [https://github.com/elogind/elogind])
27
28 AC_CONFIG_SRCDIR([src/login/logind.c])
29 AC_CONFIG_MACRO_DIR([m4])
30 AC_CONFIG_HEADERS([config.h])
31 AC_CONFIG_AUX_DIR([build-aux])
32
33 AC_USE_SYSTEM_EXTENSIONS
34 AC_SYS_LARGEFILE
35 AC_PREFIX_DEFAULT([/usr])
36 AM_MAINTAINER_MODE([enable])
37 AM_INIT_AUTOMAKE([foreign 1.11 -Wall -Wno-portability silent-rules tar-pax no-dist-gzip dist-xz subdir-objects parallel-tests])
38 AM_SILENT_RULES([yes])
39 AC_CANONICAL_HOST
40 AC_DEFINE_UNQUOTED([CANONICAL_HOST], "$host", [Canonical host string.])
41
42 AC_PROG_CC_C99
43
44 AX_COMPILER_VENDOR
45 AS_IF([test "x$ax_cv_c_compiler_vendor" = "xgnu"], [
46       AC_CHECK_TOOLS([AR], [gcc-ar ar], [:])
47       AC_CHECK_TOOLS([NM], [gcc-nm nm], [:])
48       AC_CHECK_TOOLS([RANLIB], [gcc-ranlib ranlib], [:])
49 ])
50
51 LT_PREREQ(2.2)
52 LT_INIT([disable-static])
53
54 AS_IF([test "x$enable_static" = "xyes"], [AC_MSG_ERROR([--enable-static is not supported by elogind])])
55 AS_IF([test "x$enable_largefile" = "xno"], [AC_MSG_ERROR([--disable-largefile is not supported by elogind])])
56
57 SET_ARCH(X86_64, x86_64*)
58 SET_ARCH(IA32, i*86*)
59 SET_ARCH(MIPS, mips*)
60 SET_ARCH(AARCH64, aarch64*)
61
62 # i18n stuff for the PolicyKit policy files, check whether intltool can be found, disable NLS otherwise
63 AC_CHECK_PROG(intltool_found, [intltool-merge], [yes], [no])
64 AS_IF([test x"$intltool_found" != xyes],
65       [AS_IF([test x"$enable_nls" = xyes],
66              [AC_MSG_ERROR([--enable-nls requested but intltool not found])],
67              [AS_IF([test x"$enable_nls" != xno],
68                     [AC_MSG_WARN([*** Disabling NLS support because intltool was not found])
69                      enable_nls=no])
70              ])
71       ])
72
73 AM_NLS
74 AS_IF([test x"$enable_nls" != xno -o "x$enable_polkit" != xno], [
75     # intltoolize greps for '^(AC|IT)_PROG_INTLTOOL', so it needs to be on its own line
76 IT_PROG_INTLTOOL([0.40.0])
77 ])
78
79 AS_IF([test -z "$INTLTOOL_POLICY_RULE"], [
80     # If intltool is not available, provide a dummy rule to fail generation of %.policy files with a meaningful error message
81     INTLTOOL_POLICY_RULE='%.policy: %.policy.in ; @echo "  ITMRG   " $@ && echo "*** intltool support required to build target $@" && false'
82     AC_SUBST(INTLTOOL_POLICY_RULE)
83 ])
84
85 GETTEXT_PACKAGE=elogind
86 AC_SUBST(GETTEXT_PACKAGE)
87 AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [elogind])
88
89 AC_PROG_MKDIR_P
90 AC_PROG_LN_S
91 AC_PROG_SED
92 AC_PROG_GREP
93 AC_PROG_AWK
94
95 AC_PATH_PROG([M4], [m4])
96 AC_PATH_PROG([XSLTPROC], [xsltproc])
97
98 AC_PATH_PROG([HALT], [halt], [halt])
99 AC_PATH_PROG([REBOOT], [reboot], [reboot])
100 AC_PATH_PROG([KEXEC], [kexec], [/usr/sbin/kexec], [$PATH:/usr/sbin:/sbin])
101
102 AS_IF([! ln --relative --help > /dev/null 2>&1], [AC_MSG_ERROR([*** ln doesn't support --relative ***])])
103
104 M4_DEFINES=
105
106 AC_CHECK_TOOL(OBJCOPY, objcopy)
107 AC_CHECK_TOOL(GPERF, gperf)
108 if test -z "$GPERF" ; then
109         AC_MSG_ERROR([*** gperf not found])
110 fi
111
112
113 # ------------------------------------------------------------------------------
114 # Let users set the cgroup controller to use, in case the target controller
115 # isn't currently running the show.
116 # Example: Gentoo Linux, user wants to switch from systemd to openrc+elogind,
117 #          and emerges elogind before having booted the machine with openrc.
118 #          See: https://github.com/elogind/elogind/issues/18
119 with_cgroupctrl=
120 AC_ARG_WITH([cgroup-controller],
121             AS_HELP_STRING([--with-cgroup-controller=name],
122             [Set the name of the cgroup controller to use.
123              Use this when the autodetection fails, or you plan to use your system with a different controller than the one in place now.
124              The value 'auto' (default) detects the running controller.
125              The values 'none' and 'elogind' will cause elogind to be its own (very limited) controller.
126              When elogind shall be its own controller, there *MUST NOT* be any other controller running!
127              Another popular controller would be 'openrc'.]),
128             [with_cgroupctrl=$withval],
129             [with_cgroupctrl=auto])
130
131 # ------------------------------------------------------------------------------
132 # Find running cgroup controller, if none was set
133 AS_IF(  [test "x$with_cgroupctrl" = "xauto"], [
134         AS_IF([test -f /proc/self/cgroup], [
135                 # If the init system is a cgroup controler, it will be position 1.
136                 # Secondary controllers, like cgmanager, do not work.
137                 with_cgroupctrl=`grep "^1:name=" /proc/self/cgroup | \
138                         sed -n 's/.*=//p' | sed -e 's/:.*$//'`
139                 AS_IF(  [test -z "$with_cgroupctrl"], [
140                         # Try to be our own cgroup controller
141                         with_cgroupctrl="elogind"
142                         ])
143         ], [
144                 # 'auto' but no cgroup fs is a problem.
145                 with_cgroupctrl=""
146         ])
147 ])
148
149 # If the user specified 'none', switch to 'elogind'.
150 # 'none' is allowed, as this means "there is no controller now"
151 AS_IF(  [test "x$with_cgroupctrl" = "xnone"], [with_cgroupctrl=elogind])
152
153 # If this was not possible, /proc/self/cgroup not mounted yet, and 'auto'
154 # chosen, error out.
155 AS_IF(  [test -z "$with_cgroupctrl"],
156         AC_MSG_ERROR([No running cgroup controller found]))
157
158 # ------------------------------------------------------------------------------
159 address_sanitizer_cflags=
160 address_sanitizer_cppflags=
161 address_sanitizer_ldflags=
162 AC_ARG_ENABLE(address-sanitizer, AS_HELP_STRING([--enable-address-sanitizer], [enable -fsanitize=address]))
163 AS_IF([test "x$enable_address_sanitizer" = "xyes"], [
164             CC_CHECK_FLAG_APPEND([with_as_cflags], [CFLAGS], [-fsanitize=address])
165             AS_IF([test -z "$with_as_cflags"],
166                   [AC_MSG_ERROR([*** -fsanitize=address is not supported])])
167             address_sanitizer_cflags="$with_as_cflags -fno-omit-frame-pointer -DVALGRIND=1"
168             address_sanitizer_cppflags="-DVALGRIND=1"
169             address_sanitizer_ldflags="-Wc,-fsanitize=address"
170       ])
171
172 undefined_sanitizer_cflags=
173 undefined_sanitizer_cppflags=
174 undefined_sanitizer_ldflags=
175 AC_ARG_ENABLE(undefined-sanitizer, AS_HELP_STRING([--enable-undefined-sanitizer], [enable -fsanitize=undefined]))
176 AS_IF([test "x$enable_undefined_sanitizer" = "xyes"], [
177             CC_CHECK_FLAG_APPEND([with_us_cflags], [CFLAGS], [-fsanitize=undefined])
178             AS_IF([test -z "$with_us_cflags"],
179                   [AC_MSG_ERROR([*** -fsanitize=undefined is not supported])])
180             undefined_sanitizer_cflags="$with_us_cflags -fno-omit-frame-pointer -DVALGRIND=1"
181             undefined_sanitizer_cppflags="-DVALGRIND=1"
182             undefined_sanitizer_ldflags="-Wc,-fsanitize=undefined"
183       ])
184
185 sanitizer_cflags="$address_sanitizer_cflags $undefined_sanitizer_cflags"
186 sanitizer_cppflags="$address_sanitizer_cppflags $undefined_sanitizer_cppflags"
187 sanitizer_ldflags="$address_sanitizer_ldflags $undefined_sanitizer_ldflags"
188
189 CC_CHECK_FLAGS_APPEND([with_cflags], [CFLAGS], [\
190         -pipe \
191         -Wall \
192         -Wextra \
193         -Wundef \
194         -Wlogical-op \
195         -Wmissing-include-dirs \
196         -Wold-style-definition \
197         -Wpointer-arith \
198         -Winit-self \
199         -Wdeclaration-after-statement \
200         -Wfloat-equal \
201         -Wsuggest-attribute=noreturn \
202         -Werror=missing-prototypes \
203         -Werror=implicit-function-declaration \
204         -Werror=missing-declarations \
205         -Werror=return-type \
206         -Werror=incompatible-pointer-types \
207         -Werror=format=2 \
208         -Wstrict-prototypes \
209         -Wredundant-decls \
210         -Wmissing-noreturn \
211         -Wshadow \
212         -Wendif-labels \
213         -Wstrict-aliasing=2 \
214         -Wwrite-strings \
215         -Wno-unused-parameter \
216         -Wno-missing-field-initializers \
217         -Wno-unused-result \
218         -Wno-format-signedness \
219         -Werror=overflow \
220         -Wdate-time \
221         -Wnested-externs \
222         -ffast-math \
223         -fno-common \
224         -fdiagnostics-show-option \
225         -fno-strict-aliasing \
226         -fvisibility=hidden \
227         -fstack-protector \
228         -fstack-protector-strong \
229         -fPIE \
230         --param=ssp-buffer-size=4])
231
232 CC_CHECK_FLAG_APPEND([with_cflags], [CFLAGS], [-Werror=shadow], [
233 #include <time.h>
234 #include <inttypes.h>
235 typedef uint64_t usec_t;
236 usec_t now(clockid_t clock);
237 int main(void) {
238         struct timespec now;
239         return 0;
240 }
241 ])
242
243 AS_CASE([$CC], [*clang*],
244         [CC_CHECK_FLAGS_APPEND([with_cppflags], [CPPFLAGS], [\
245                -Wno-typedef-redefinition \
246                -Wno-gnu-variable-sized-type-not-at-end \
247         ])])
248
249 # ------------------------------------------------------------------------------
250 AC_ARG_ENABLE([lto], [AS_HELP_STRING([--disable-lto], [disable -flto])],
251                      [], [enable_lto=yes])
252 AS_CASE([$CFLAGS], [*-O[[12345sz\ ]]*],
253         [AS_IF([test "x$enable_lto" = "xyes"],
254                [CC_CHECK_FLAGS_APPEND([with_cflags], [CFLAGS], [-flto])],
255                [AC_MSG_RESULT([disabling -flto as requested])])],
256         [AC_MSG_RESULT([skipping -flto, optimization not enabled])])
257
258 # ------------------------------------------------------------------------------
259 AS_CASE([$CFLAGS], [*-O[[12345sz\ ]]*],
260         [CC_CHECK_FLAGS_APPEND([with_cppflags], [CPPFLAGS], [\
261                -Wp,-D_FORTIFY_SOURCE=2])],
262         [AC_MSG_RESULT([skipping -D_FORTIFY_SOURCE, optimization not enabled])])
263
264 # ------------------------------------------------------------------------------
265 AS_CASE([$CFLAGS], [*-O[[12345sz\ ]]*],
266         [CC_CHECK_FLAGS_APPEND([with_ldflags], [LDFLAGS], [\
267                -Wl,--gc-sections])],
268         [AC_MSG_RESULT([skipping --gc-sections, optimization not enabled])])
269
270 # ------------------------------------------------------------------------------
271 AS_CASE([$CFLAGS], [*-O[[12345sz\ ]]*],
272         [CC_CHECK_FLAGS_APPEND([with_cflags], [CFLAGS], [\
273                -ffunction-sections -fdata-sections])],
274         [AC_MSG_RESULT([skipping -ffunction/data-section, optimization not enabled])])
275
276 # ------------------------------------------------------------------------------
277 CC_CHECK_FLAGS_APPEND([with_ldflags], [LDFLAGS], [\
278         -Wl,--as-needed \
279         -Wl,--no-undefined \
280         -Wl,-z,relro \
281         -Wl,-z,now \
282         -pie \
283         -Wl,-fuse-ld=gold])
284
285 # ------------------------------------------------------------------------------
286 AC_SUBST([OUR_CPPFLAGS], "$with_cppflags $sanitizer_cppflags")
287 AC_SUBST([OUR_CFLAGS], "-D__SANE_USERSPACE_TYPES__ $with_cflags $sanitizer_cflags")
288 AC_SUBST([OUR_LDFLAGS], "$with_ldflags $sanitizer_ldflags")
289
290 # ------------------------------------------------------------------------------
291 AC_CHECK_SIZEOF(pid_t)
292 AC_CHECK_SIZEOF(uid_t)
293 AC_CHECK_SIZEOF(gid_t)
294 AC_CHECK_SIZEOF(time_t)
295 AC_CHECK_SIZEOF(dev_t)
296 AC_CHECK_SIZEOF(ino_t)
297 AC_CHECK_SIZEOF(rlim_t,,[
298        #include <sys/time.h>
299        #include <sys/resource.h>
300 ])
301
302 GPERF_TEST="$(echo foo,bar | ${GPERF} -L ANSI-C)"
303 save_CFLAGS="$CFLAGS"
304 CFLAGS="$CFLAGS -Wno-error"
305 AC_COMPILE_IFELSE(
306         [AC_LANG_PROGRAM([
307                 #include <string.h>
308                 const char * in_word_set(const char *, size_t);
309                 $GPERF_TEST]
310         )],
311         [GPERF_LEN_TYPE=size_t],
312         [AC_COMPILE_IFELSE(
313                 [AC_LANG_PROGRAM([
314                         #include <string.h>
315                         const char * in_word_set(const char *, unsigned);
316                         $GPERF_TEST]
317                 )],
318                 [GPERF_LEN_TYPE=unsigned],
319                 [AC_MSG_ERROR([** unable to determine gperf len type])]
320         )]
321 )
322 CFLAGS="$save_CFLAGS"
323
324 AC_DEFINE_UNQUOTED([GPERF_LEN_TYPE], [$GPERF_LEN_TYPE], [gperf len type])
325
326 # ------------------------------------------------------------------------------
327 # we use python to build the man page index
328 have_python=no
329 AC_ARG_WITH([python],
330         [AS_HELP_STRING([--without-python], [disable building the man page index and systemd-python (default: test)])])
331
332 have_lxml=no
333 AS_IF([test "x$with_python" != "xno"], [
334         AM_PATH_PYTHON([3],, [:])
335         AS_IF([test "x$PYTHON" != "x:"], [
336                 AC_MSG_CHECKING([for python lxml module])
337                 AS_IF(["$PYTHON" -c 'import lxml' 2>/dev/null], [have_lxml=yes])
338                 AC_MSG_RESULT([$have_lxml])
339                 AS_IF([test "x$have_lxml" = "xyes"], [have_python=yes],
340                       [AC_MSG_WARN([*** python support requires python-lxml module installed])])
341         ])
342 ])
343 AS_IF([test "$have_python" != "yes"], [
344       AS_IF([test "$with_python" = "yes"],
345             [AC_MSG_ERROR([*** python support requested but python support not found])])
346       AS_IF([test "$with_python" != "no"],
347             [AC_MSG_WARN([*** python support not found, some documentation cannot be built])])
348 ])
349 AM_CONDITIONAL([HAVE_PYTHON], [test "x$have_python" = "xyes"])
350
351 # ------------------------------------------------------------------------------
352
353 AC_CHECK_HEADERS([sys/capability.h], [], [AC_MSG_ERROR([*** POSIX caps headers not found])])
354 AC_CHECK_HEADERS([linux/memfd.h], [], [])
355 AC_CHECK_HEADERS([linux/vm_sockets.h], [], [], [#include <sys/socket.h>])
356
357 AC_CHECK_HEADERS([printf.h], [have_printf_h=yes], [have_printf_h=no])
358 AS_IF([test x$have_printf_h = xyes], [
359         AC_DEFINE(HAVE_PRINTF_H, 1, [Define if printf.h was found])
360 ])
361
362
363
364 # unconditionally pull-in librt with old glibc versions
365 dnl AC_SEARCH_LIBS([clock_gettime], [rt], [], [])
366 dnl AC_SEARCH_LIBS([mq_unlink], [rt], [], [])
367
368 save_LIBS="$LIBS"
369 LIBS=
370 AC_SEARCH_LIBS([cap_init], [cap], [], [AC_MSG_ERROR([*** POSIX caps library not found])])
371 CAP_LIBS="$LIBS"
372 AC_SUBST(CAP_LIBS)
373
374 AC_CHECK_FUNCS([__secure_getenv secure_getenv])
375 AC_CHECK_DECLS([
376         memfd_create,
377         gettid,
378         pivot_root,
379         name_to_handle_at,
380         setns,
381         renameat2,
382         kcmp,
383         keyctl,
384         LO_FLAGS_PARTSCAN,
385         copy_file_range,
386         explicit_bzero],
387                 [], [], [[
388 #include <sys/types.h>
389 #include <unistd.h>
390 #include <sys/mount.h>
391 #include <fcntl.h>
392 #include <sched.h>
393 #include <string.h>
394 #include <linux/loop.h>
395 ]])
396
397 AC_CHECK_DECLS([getrandom],
398                [AC_DEFINE([USE_SYS_RANDOM_H], [], [sys/random.h is usable])],
399                [AC_CHECK_DECLS([getrandom], [], [], [[
400 #include <sys/random.h>
401 ]])], [[
402 #include <linux/random.h>
403 ]])
404
405 AC_CHECK_TYPES([char16_t, char32_t, key_serial_t],
406                [], [], [[
407 #include <uchar.h>
408 ]])
409
410 AC_CHECK_DECLS([IFLA_INET6_ADDR_GEN_MODE,
411                 IN6_ADDR_GEN_MODE_STABLE_PRIVACY,
412                 IFLA_VRF_TABLE,
413                 IFLA_MACVLAN_FLAGS,
414                 IFLA_IPVLAN_MODE,
415                 IFLA_VTI_REMOTE,
416                 IFLA_PHYS_PORT_ID,
417                 IFLA_BOND_AD_INFO,
418                 IFLA_VLAN_PROTOCOL,
419                 IFLA_VXLAN_GPE,
420                 IFLA_GENEVE_LABEL,
421                 IFLA_IPTUN_ENCAP_DPORT,
422                 IFLA_GRE_ENCAP_DPORT,
423                 IFLA_BRIDGE_VLAN_INFO,
424                 IFLA_BRPORT_PROXYARP,
425                 IFLA_BRPORT_LEARNING_SYNC,
426                 IFLA_BR_VLAN_DEFAULT_PVID,
427                 NDA_IFINDEX,
428                 IFA_FLAGS],
429 [], [], [[
430 #include <inttypes.h>
431 #include <netinet/in.h>
432 #include <netinet/ether.h>
433 #include <linux/rtnetlink.h>
434 #include <net/if.h>
435 #include <linux/ip.h>
436 #include <linux/if_tunnel.h>
437 #include <linux/if_link.h>
438 #include <linux/if_bridge.h>
439 #include <linux/if_addr.h>
440 #include <linux/neighbour.h>
441 ]])
442
443 # This makes sure pkg.m4 is available.
444 m4_pattern_forbid([^_?PKG_[A-Z_]+$],[*** pkg.m4 missing, please install pkg-config])
445
446
447 # ------------------------------------------------------------------------------
448 PKG_CHECK_MODULES(UDEV, [libudev])
449 dnl
450 AC_ARG_WITH([udevrulesdir],
451             AS_HELP_STRING([--with-udevrulesdir=DIR], [Directory for udev rules files]),
452             [],
453             [with_udevrulesdir=$($PKG_CONFIG --variable=udevdir udev)/rules.d])
454 AC_SUBST([udevrulesdir], [$with_udevrulesdir])
455
456 AC_ARG_WITH([udevbindir],
457             AS_HELP_STRING([--with-udevbindir=DIR], [Directory for udev binary files]),
458             [],
459             [with_udevbindir=$($PKG_CONFIG --variable=udevdir udev)])
460 AC_SUBST([udevbindir], [$with_udevbindir])
461
462 # ------------------------------------------------------------------------------
463 have_glib=no
464 AC_ARG_ENABLE(glib, AS_HELP_STRING([--disable-glib], [disable usage of glib,gobject,gio in tests]))
465 AS_IF([test "x$enable_glib" != "xno"], [
466         PKG_CHECK_MODULES(GLIB, [glib-2.0 >= 2.22.0 gobject-2.0 >= 2.22.0 gio-2.0],
467                 [AC_DEFINE(HAVE_GLIB, 1, [Define if glib,gobject,gio are available]) have_glib=yes],
468                 [have_glib=no])
469         AS_IF([test "x$have_glib" = "xno" -a "x$enable_glib" = "xyes"],
470                 [AC_MSG_ERROR([*** glib support requested but libraries not found])])])
471
472 # ------------------------------------------------------------------------------
473 have_utmp=yes
474 AC_ARG_ENABLE([utmp], AS_HELP_STRING([--disable-utmp], [disable utmp/wtmp log handling]),
475         AS_CASE("x${enableval}",
476                 [xyes], [have_utmp=yes],
477                 [xno],  [have_utmp=no],
478                 AC_MSG_ERROR(bad value ${enableval} for --enable-utmp)))
479 AS_IF([test "x$have_utmp" = "xyes"], [
480         AC_DEFINE(HAVE_UTMP, 1, [Define if utmp/wtmp support is enabled])
481         have_utmp=yes
482         M4_DEFINES="$M4_DEFINES -DHAVE_UTMP"],
483         [have_utmp=no])
484 AM_CONDITIONAL([HAVE_UTMP], [test "x$have_utmp" = "xyes"])
485
486 # ------------------------------------------------------------------------------
487 have_coverage=no
488 AC_ARG_ENABLE(coverage, AS_HELP_STRING([--enable-coverage], [enable test coverage]))
489 if test "x$enable_coverage" = "xyes" ; then
490         AC_CHECK_PROG(lcov_found, [lcov], [yes], [no])
491         if test "x$lcov_found" = xno ; then
492                 AC_MSG_ERROR([*** lcov support requested but the program was not found])
493         else
494                 lcov_version_major="`lcov --version | cut -d ' ' -f 4 | cut -d '.' -f 1`"
495                 lcov_version_minor="`lcov --version | cut -d ' ' -f 4 | cut -d '.' -f 2`"
496                 if test "$lcov_version_major" -eq 1 -a "$lcov_version_minor" -lt 10; then
497                         AC_MSG_ERROR([*** lcov version is too old. 1.10 required])
498                 else
499                         have_coverage=yes
500                         CC_CHECK_FLAGS_APPEND([with_coverage_cflags], [CFLAGS], [\
501                         -fprofile-arcs \
502                         -ftest-coverage])
503                         AC_SUBST([OUR_CFLAGS], "$with_cflags $with_coverage_cflags")
504                 fi
505         fi
506 fi
507 AM_CONDITIONAL(ENABLE_COVERAGE, [test "$have_coverage" = "yes"])
508
509 # ------------------------------------------------------------------------------
510 have_selinux=no
511 AC_ARG_ENABLE(selinux, AS_HELP_STRING([--disable-selinux], [disable optional SELINUX support]))
512 if test "x$enable_selinux" != "xno"; then
513         PKG_CHECK_MODULES([SELINUX], [libselinux >= 2.1.9],
514                 [AC_DEFINE(HAVE_SELINUX, 1, [Define if SELinux is available])
515                  have_selinux=yes
516                  M4_DEFINES="$M4_DEFINES -DHAVE_SELINUX"],
517                 [have_selinux=no])
518         if test "x$have_selinux" = xno -a "x$enable_selinux" = xyes; then
519                 AC_MSG_ERROR([*** SELinux support requested but libraries not found])
520         fi
521 fi
522 AM_CONDITIONAL(HAVE_SELINUX, [test "$have_selinux" = "yes"])
523
524 # ------------------------------------------------------------------------------
525 AC_ARG_WITH([kill-user-processes],
526         [AS_HELP_STRING([--without-kill-user-processes], [Set elogind's KillUserProcesses=no by default])])
527 AS_IF([test "$with_kill_user_processes" != "no"],
528        [kill_user_processes=true
529         KILL_USER_PROCESSES=yes],
530        [kill_user_processes=false
531         KILL_USER_PROCESSES=no])
532 AC_DEFINE_UNQUOTED(KILL_USER_PROCESSES, [$kill_user_processes], [Default KillUserProcesses setting])
533 AC_SUBST(KILL_USER_PROCESSES)
534
535 # ------------------------------------------------------------------------------
536 # We do not really support systemd hybrid or unified mode, but set the default
537 # to 'legacy' here. That is currently the only cgroup mode supported by elogind.
538 #AC_ARG_WITH(default-hierarchy,
539 #        AS_HELP_STRING([--with-default-hierarchy=MODE],
540 #                [default cgroup hierarchy, defaults to "hybrid"]),
541 #        [DEFAULT_HIERARCHY="$withval"],
542 #        [DEFAULT_HIERARCHY="hybrid"])
543 DEFAULT_HIERARCHY=legacy
544
545 AS_CASE("$DEFAULT_HIERARCHY",
546         [legacy], [mode=CGROUP_UNIFIED_NONE],
547         [hybrid], [mode=CGROUP_UNIFIED_SYSTEMD],
548         [unified], [mode=CGROUP_UNIFIED_ALL],
549         AC_MSG_ERROR(Bad default hierarchy mode ${DEFAULT_HIERARCHY}))
550 AC_DEFINE_UNQUOTED(DEFAULT_HIERARCHY, [$mode], [Default cgroup hierarchy])
551 AC_DEFINE_UNQUOTED(DEFAULT_HIERARCHY_NAME, ["$DEFAULT_HIERARCHY"],
552                                            [Default cgroup hierarchy as string])
553
554 # ------------------------------------------------------------------------------
555 AC_ARG_ENABLE([pam],
556         AS_HELP_STRING([--disable-pam],[disable optional PAM support]),
557                 [case "${enableval}" in
558                         yes) have_pam=yes ;;
559                         no) have_pam=no ;;
560                         *) AC_MSG_ERROR(bad value ${enableval} for --disable-pam) ;;
561                 esac],
562                 [have_pam=auto])
563
564 if test "x${have_pam}" != xno ; then
565         AC_CHECK_HEADERS(
566                 [security/pam_modules.h security/pam_modutil.h security/pam_ext.h],
567                 [have_pam=yes],
568                 [if test "x$have_pam" = xyes ; then
569                         AC_MSG_ERROR([*** PAM headers not found.])
570                 fi])
571
572         AC_CHECK_LIB(
573                 [pam],
574                 [pam_syslog],
575                 [have_pam=yes],
576                 [if test "x$have_pam" = xyes ; then
577                         AC_MSG_ERROR([*** libpam not found.])
578                 fi])
579
580         if test "x$have_pam" = xyes ; then
581                 PAM_LIBS="-lpam -lpam_misc"
582                 AC_DEFINE(HAVE_PAM, 1, [PAM available])
583                 M4_DEFINES="$M4_DEFINES -DHAVE_PAM"
584         else
585                 have_pam=no
586         fi
587 else
588         PAM_LIBS=
589 fi
590 AC_SUBST(PAM_LIBS)
591 AM_CONDITIONAL([HAVE_PAM], [test "x$have_pam" != xno])
592
593 # ------------------------------------------------------------------------------
594 AC_ARG_ENABLE([acl],
595         AS_HELP_STRING([--disable-acl],[disable optional ACL support]),
596                 [case "${enableval}" in
597                         yes) have_acl=yes ;;
598                         no) have_acl=no ;;
599                         *) AC_MSG_ERROR(bad value ${enableval} for --disable-acl) ;;
600                 esac],
601                 [have_acl=auto])
602
603 if test "x${have_acl}" != xno ; then
604         AC_CHECK_HEADERS(
605                 [sys/acl.h acl/libacl.h],
606                 [have_acl=yes],
607                 [if test "x$have_acl" = xyes ; then
608                         AC_MSG_ERROR([*** ACL headers not found.])
609                 fi])
610
611         AC_CHECK_LIB(
612                 [acl],
613                 [acl_get_file],
614                 [have_acl=yes],
615                 [if test "x$have_acl" = xyes ; then
616                         AC_MSG_ERROR([*** libacl not found.])
617                 fi])
618
619         if test "x$have_acl" = xyes ; then
620                 ACL_LIBS="-lacl"
621                 AC_DEFINE(HAVE_ACL, 1, [ACL available])
622                 M4_DEFINES="$M4_DEFINES -DHAVE_ACL"
623         else
624                 have_acl=no
625         fi
626 else
627         ACL_LIBS=
628 fi
629 AC_SUBST(ACL_LIBS)
630 AM_CONDITIONAL([HAVE_ACL], [test "x$have_acl" != xno])
631
632 # ------------------------------------------------------------------------------
633 AC_ARG_ENABLE([smack], AS_HELP_STRING([--disable-smack],[disable optional SMACK support]),
634                 [case "${enableval}" in
635                         yes) have_smack=yes ;;
636                         no) have_smack=no ;;
637                         *) AC_MSG_ERROR(bad value ${enableval} for --disable-smack) ;;
638                 esac],
639                 [have_smack=auto])
640
641 if test "x${have_smack}" != xno; then
642         AC_DEFINE(HAVE_SMACK, 1, [Define if SMACK is available])
643         M4_DEFINES="$M4_DEFINES -DHAVE_SMACK"
644         have_smack=yes
645 fi
646
647 AM_CONDITIONAL([HAVE_SMACK], [test "x$have_smack" = "xyes"])
648
649 have_smack_run_label=no
650 AC_ARG_WITH(smack-run-label,
651 AS_HELP_STRING([--with-smack-run-label=STRING],
652         [run systemd --system itself with a specific SMACK label]),
653         [AC_DEFINE_UNQUOTED(SMACK_RUN_LABEL, ["$withval"], [Run systemd itself with SMACK label]) have_smack_run_label=yes],
654         [])
655
656 if test "x${have_smack_run_label}" = xyes; then
657         M4_DEFINES="$M4_DEFINES -DHAVE_SMACK_RUN_LABEL"
658 fi
659
660 AC_ARG_WITH(smack-default-process-label,
661 AS_HELP_STRING([--with-smack-default-process-label=STRING],
662         [default SMACK label for executed processes]),
663         [AC_DEFINE_UNQUOTED(SMACK_DEFAULT_PROCESS_LABEL, ["$withval"], [Default SMACK label for executed processes])],
664         [])
665
666 # ------------------------------------------------------------------------------
667 AC_ARG_WITH(system-uid-max,
668         AS_HELP_STRING([--with-system-uid-max=UID]
669                 [Maximum UID for system users]),
670         [SYSTEM_UID_MAX="$withval"],
671         [SYSTEM_UID_MAX="`awk 'BEGIN { uid=999 } /^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }' /etc/login.defs 2>/dev/null || echo 999`"])
672
673 AC_DEFINE_UNQUOTED(SYSTEM_UID_MAX, [$SYSTEM_UID_MAX], [Maximum System UID])
674 AC_SUBST(SYSTEM_UID_MAX)
675
676 # ------------------------------------------------------------------------------
677 AC_ARG_WITH(system-gid-max,
678         AS_HELP_STRING([--with-system-gid-max=GID]
679                 [Maximum GID for system groups]),
680         [SYSTEM_GID_MAX="$withval"],
681         [SYSTEM_GID_MAX="`awk 'BEGIN { gid=999 } /^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }' /etc/login.defs 2>/dev/null || echo 999`"])
682
683 AC_DEFINE_UNQUOTED(SYSTEM_GID_MAX, [$SYSTEM_GID_MAX], [Maximum System GID])
684 AC_SUBST(SYSTEM_GID_MAX)
685
686 # ------------------------------------------------------------------------------
687 have_polkit=no
688 AC_ARG_ENABLE(polkit, AS_HELP_STRING([--disable-polkit], [disable PolicyKit support]))
689 if test "x$enable_polkit" != "xno"; then
690         AC_DEFINE(ENABLE_POLKIT, 1, [Define if PolicyKit support is to be enabled])
691         have_polkit=yes
692
693         # also enable support for *.pkla files on old polkit
694         PKG_CHECK_MODULES(POLKIT, [ polkit-gobject-1 < 0.106 ],
695                            [polkit_pkla=yes],
696                            [polkit_pkla=no])
697 fi
698 AM_CONDITIONAL(ENABLE_POLKIT, [test "x$have_polkit" = "xyes"])
699 AM_CONDITIONAL(ENABLE_POLKIT_PKLA, [test "x$polkit_pkla" = "xyes"])
700
701 # ------------------------------------------------------------------------------
702 AC_CHECK_HEADERS_ONCE([valgrind/memcheck.h valgrind/valgrind.h])
703
704 # ------------------------------------------------------------------------------
705 have_manpages=no
706 AC_ARG_ENABLE(manpages, AS_HELP_STRING([--disable-manpages], [disable manpages]))
707 AC_PATH_PROG([XSLTPROC], [xsltproc])
708 AS_IF([test "x$enable_manpages" != xno], [have_manpages=yes])
709 AM_CONDITIONAL(ENABLE_MANPAGES, [test "x$have_manpages" = "xyes"])
710
711 # ------------------------------------------------------------------------------
712 AC_SUBST(M4_DEFINES)
713
714 AC_ARG_WITH([dbuspolicydir],
715         AS_HELP_STRING([--with-dbuspolicydir=DIR], [D-Bus policy directory]),
716         [],
717         [with_dbuspolicydir=${datadir}/dbus-1/system.d])
718 AX_NORMALIZE_PATH([with_dbuspolicydir])
719
720 AC_ARG_WITH([dbussystemservicedir],
721         AS_HELP_STRING([--with-dbussystemservicedir=DIR], [D-Bus system service directory]),
722         [],
723         [with_dbussystemservicedir=${datadir}/dbus-1/system-services])
724 AX_NORMALIZE_PATH([with_dbussystemservicedir])
725
726 AC_ARG_WITH([bashcompletiondir],
727         AS_HELP_STRING([--with-bashcompletiondir=DIR], [bash completions directory]),
728         [],
729         [AS_IF([$($PKG_CONFIG --exists bash-completion)], [
730                 with_bashcompletiondir=$($PKG_CONFIG --variable=completionsdir bash-completion)
731         ] , [
732                 with_bashcompletiondir=${datadir}/bash-completion/completions
733         ])])
734 AM_CONDITIONAL(ENABLE_BASH_COMPLETION, [test "$with_bashcompletiondir" != "no"])
735 AX_NORMALIZE_PATH([with_bashcompletiondir])
736
737 AC_ARG_WITH([zshcompletiondir],
738         AS_HELP_STRING([--with-zshcompletiondir=DIR], [zsh completions directory]),
739         [], [with_zshcompletiondir=${datadir}/zsh/site-functions])
740 AM_CONDITIONAL(ENABLE_ZSH_COMPLETION, [test "$with_zshcompletiondir" != "no"])
741 AX_NORMALIZE_PATH([with_zshcompletiondir])
742
743 AC_ARG_WITH([rootprefix],
744         AS_HELP_STRING([--with-rootprefix=DIR], [rootfs directory prefix for config files and kernel modules]),
745         [], [with_rootprefix=${ac_default_prefix}])
746 # --with-rootprefix= (empty) should default to "/" but AX_NORMALIZE_PATH
747 # defaults those to ".", solve that here for now until we can find a suitable
748 # fix for AX_NORMALIZE_PATH upstream at autoconf-archive.
749 # See: https://github.com/systemd/systemd/issues/54
750 if test "x${with_rootprefix}" = "x"; then
751         with_rootprefix="/"
752 fi
753 AX_NORMALIZE_PATH([with_rootprefix])
754
755 AC_ARG_WITH([rootlibdir],
756         AS_HELP_STRING([--with-rootlibdir=DIR], [root directory for libraries necessary for boot]),
757         [],
758         [with_rootlibdir=${libdir}])
759 AX_NORMALIZE_PATH([with_rootlibdir])
760
761 AC_ARG_WITH([pamlibdir],
762         AS_HELP_STRING([--with-pamlibdir=DIR], [directory for PAM modules]),
763         [],
764         [with_pamlibdir=${with_rootlibdir}/security])
765 AX_NORMALIZE_PATH([with_pamlibdir])
766
767 AC_ARG_WITH([pamconfdir],
768         AS_HELP_STRING([--with-pamconfdir=DIR], [directory for PAM configuration (pass no to disable installing)]),
769         [],
770         [with_pamconfdir=${sysconfdir}/pam.d])
771 AM_CONDITIONAL(ENABLE_PAM_CONFIG, [test "$with_pamconfdir" != "no"])
772 AX_NORMALIZE_PATH([with_pamconfdir])
773
774 AC_ARG_ENABLE([split-usr],
775         AS_HELP_STRING([--enable-split-usr], [assume that /bin, /sbin aren\'t symlinks into /usr]),
776         [],
777         [AS_IF([test "x${ac_default_prefix}" != "x${with_rootprefix}"], [
778                 enable_split_usr=yes
779         ], [
780                 enable_split_usr=no
781         ])])
782
783 AS_IF([test "x${enable_split_usr}" = "xyes"], [
784         AC_DEFINE(HAVE_SPLIT_USR, 1, [Define if /bin, /sbin aren't symlinks into /usr])
785 ])
786 AM_CONDITIONAL(ENABLE_SPLIT_USR, [test "x${enable_split_usr}" = "xyes"])
787
788 # work around intltool-update issues during 'make distcheck'
789 AS_IF([test "x$0" != "x./configure"], [
790         AC_SUBST([INTLTOOL_UPDATE], [/usr/bin/env true])
791 ])
792
793 AC_ARG_ENABLE(tests,
794         [AC_HELP_STRING([--disable-tests], [disable tests, or enable extra tests with =unsafe])],
795         enable_tests=$enableval, enable_tests=yes)
796 AM_CONDITIONAL(ENABLE_TESTS, [test x$enable_tests = xyes -o x$enable_tests = xunsafe])
797 AM_CONDITIONAL(ENABLE_UNSAFE_TESTS, [test x$enable_tests = xunsafe])
798
799 AC_ARG_ENABLE(debug,
800         [AC_HELP_STRING([--enable-debug@<:@=LIST@:>@], [enable extra debugging (elogind,hashmap,mmap-cache)])],
801         [if test "x$enableval" = "xyes"; then
802                 enableval="elogind,hashmap,mmap-cache"
803         fi
804         saved_ifs="$IFS"
805         IFS="$IFS$PATH_SEPARATOR,"
806         for name in $enableval; do
807                 case $name in
808                 elogind)
809                         enable_debug_elogind=yes
810                         ;;
811                 hashmap)
812                         enable_debug_hashmap=yes
813                         ;;
814                 mmap-cache)
815                         enable_debug_mmap_cache=yes
816                         ;;
817                 esac
818         done
819         IFS="$saved_ifs"],[])
820
821 enable_debug=""
822 AS_IF([test x$enable_debug_elogind = xyes], [
823         AC_DEFINE(ENABLE_DEBUG_ELOGIND, 1, [Define if elogind debugging is to be enabled])
824         enable_debug="elogind $enable_debug"
825 ])
826 AS_IF([test x$enable_debug_hashmap = xyes], [
827         AC_DEFINE(ENABLE_DEBUG_HASHMAP, 1, [Define if hashmap debugging is to be enabled])
828         enable_debug="hashmap $enable_debug"
829 ])
830 AS_IF([test x$enable_debug_mmap_cache = xyes], [
831         AC_DEFINE(ENABLE_DEBUG_MMAP_CACHE, 1, [Define if mmap cache debugging is to be enabled])
832         enable_debug="mmap-cache $enable_debug"
833 ])
834 test -z "$enable_debug" && enable_debug="none"
835
836 AC_SUBST([dbuspolicydir], [$with_dbuspolicydir])
837 AC_SUBST([dbussystemservicedir], [$with_dbussystemservicedir])
838 AC_SUBST([bashcompletiondir], [$with_bashcompletiondir])
839 AC_SUBST([zshcompletiondir], [$with_zshcompletiondir])
840 AC_SUBST([pamlibdir], [$with_pamlibdir])
841 AC_SUBST([pamconfdir], [$with_pamconfdir])
842 AC_SUBST([rootprefix], [$with_rootprefix])
843 AC_SUBST([rootlibdir], [$with_rootlibdir])
844 AC_SUBST([cgroup_controller], [$with_cgroupctrl])
845
846 AC_CONFIG_FILES([
847         Makefile
848         po/Makefile.in
849 ])
850
851 AC_OUTPUT
852 AC_MSG_RESULT([
853         $PACKAGE_NAME $PACKAGE_VERSION
854
855         PAM: . . . . . . . . . . . . . . . ${have_pam}
856         SELinux: . . . . . . . . . . . . . ${have_selinux}
857         SMACK: . . . . . . . . . . . . . . ${have_smack}
858         ACL: . . . . . . . . . . . . . . . ${have_acl}
859         default cgroup hierarchy: . . . .  ${DEFAULT_HIERARCHY}
860         default KillUserProcesses setting: ${KILL_USER_PROCESSES}
861         polkit: . . . . . . . . . . . . .  ${have_polkit} (legacy pkla support: ${polkit_pkla})
862         glib: . . . . . . . . . . . . . .  ${have_glib}
863         Python: . . . . . . . . . . . . .  ${have_python}
864         man pages: . . . . . . . . . . . . ${have_manpages}
865         test coverage: . . . . . . . . . . ${have_coverage}
866         Split /usr: . . . . . . . . . . .  ${enable_split_usr}
867         utmp/wtmp support: . . . . . . . . ${have_utmp}
868         extra debugging: . . . . . . . . . ${enable_debug}
869         cgroup controller: . . . . . . . . ${with_cgroupctrl}
870
871         prefix: . . . . . . . . . . . . .  ${prefix}
872         rootprefix: . . . . . . . . . . .  ${with_rootprefix}
873         sysconf dir: . . . . . . . . . . . ${sysconfdir}
874         datarootdir: . . . . . . . . . . . ${datarootdir}
875         includedir: . . . . . . . . . . .  ${includedir}
876         lib dir: . . . . . . . . . . . . . ${libdir}
877         rootlib dir: . . . . . . . . . . . ${with_rootlibdir}
878         PAM modules dir: . . . . . . . . . ${with_pamlibdir}
879         PAM configuration dir: . . . . . . ${with_pamconfdir}
880         D-Bus policy dir: . . . . . . . .  ${with_dbuspolicydir}
881         D-Bus system dir: . . . . . . . .  ${with_dbussystemservicedir}
882         bash completions dir: . . . . . .  ${with_bashcompletiondir}
883         zsh completions dir: . . . . . . . ${with_zshcompletiondir}
884         maximum system UID: . . . . . . .  ${SYSTEM_UID_MAX}
885         maximum system GID: . . . . . . .  ${SYSTEM_GID_MAX}
886
887         CFLAGS: . . . . . . . . . . . . .  ${OUR_CFLAGS} ${CFLAGS}
888         CPPFLAGS: . . . . . . . . . . . .  ${OUR_CPPFLAGS} ${CPPFLAGS}
889         LDFLAGS: . . . . . . . . . . . . . ${OUR_LDFLAGS} ${LDFLAGS}
890 ])