chiark / gitweb /
Prep v231.6: Upstream installs in lib/systemd, we install in lib/elogind.
[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.2],
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 have_lto=no
251 AC_ARG_ENABLE([lto], [AS_HELP_STRING([--disable-lto], [disable -flto])],
252                      [], [enable_lto=yes])
253 AS_CASE([$CFLAGS], [*-O[[12345sz\ ]]*],
254         [AS_IF([test "x$enable_lto" = "xyes"], [have_lto=yes],
255                [AC_MSG_RESULT([disabling -flto as requested])])],
256         [AC_MSG_RESULT([skipping -flto, optimization not enabled])])
257
258 AS_IF([test "x$have_lto" = "xyes"],
259         [CC_CHECK_FLAGS_APPEND([with_cflags], [CFLAGS],
260         [-flto -fuse-linker-plugin])])
261
262 AS_CASE([$with_cflags], [*-flto*], [], [have_lto=no])
263
264 # ------------------------------------------------------------------------------
265 AS_CASE([$CFLAGS], [*-O[[12345sz\ ]]*],
266         [CC_CHECK_FLAGS_APPEND([with_cppflags], [CPPFLAGS], [\
267                -Wp,-D_FORTIFY_SOURCE=2])],
268         [AC_MSG_RESULT([skipping -D_FORTIFY_SOURCE, optimization not enabled])])
269
270 # ------------------------------------------------------------------------------
271 AS_CASE([$CFLAGS], [*-O[[12345sz\ ]]*],
272         [CC_CHECK_FLAGS_APPEND([with_ldflags], [LDFLAGS], [\
273                -Wl,--gc-sections])],
274         [AC_MSG_RESULT([skipping --gc-sections, optimization not enabled])])
275
276 # ------------------------------------------------------------------------------
277 AS_CASE([$CFLAGS], [*-O[[12345sz\ ]]*],
278         [CC_CHECK_FLAGS_APPEND([with_cflags], [CFLAGS], [\
279                -ffunction-sections -fdata-sections])],
280         [AC_MSG_RESULT([skipping -ffunction/data-section, optimization not enabled])])
281
282 # ------------------------------------------------------------------------------
283 CC_CHECK_FLAGS_APPEND([with_ldflags], [LDFLAGS], [\
284         -Wl,--as-needed \
285         -Wl,--no-undefined \
286         -Wl,-z,relro \
287         -Wl,-z,now \
288         -pie])
289 AS_IF([test "x$have_lto" = "xyes"],
290         [CC_CHECK_FLAGS_APPEND([with_ldflags], [LDFLAGS], [-Wl,-fuse-ld=gold])])
291
292 # ------------------------------------------------------------------------------
293 AC_SUBST([OUR_CPPFLAGS], "$with_cppflags $sanitizer_cppflags")
294 AC_SUBST([OUR_CFLAGS], "-D__SANE_USERSPACE_TYPES__ $with_cflags $sanitizer_cflags")
295 AC_SUBST([OUR_LDFLAGS], "$with_ldflags $sanitizer_ldflags")
296
297 # ------------------------------------------------------------------------------
298 AC_CHECK_SIZEOF(pid_t)
299 AC_CHECK_SIZEOF(uid_t)
300 AC_CHECK_SIZEOF(gid_t)
301 AC_CHECK_SIZEOF(time_t)
302 AC_CHECK_SIZEOF(dev_t)
303 AC_CHECK_SIZEOF(ino_t)
304 AC_CHECK_SIZEOF(rlim_t,,[
305        #include <sys/time.h>
306        #include <sys/resource.h>
307 ])
308
309 GPERF_TEST="$(echo foo,bar | ${GPERF} -L ANSI-C)"
310 save_CFLAGS="$CFLAGS"
311 CFLAGS="$CFLAGS -Wno-error"
312 AC_COMPILE_IFELSE(
313         [AC_LANG_PROGRAM([
314                 #include <string.h>
315                 const char * in_word_set(const char *, size_t);
316                 $GPERF_TEST]
317         )],
318         [GPERF_LEN_TYPE=size_t],
319         [AC_COMPILE_IFELSE(
320                 [AC_LANG_PROGRAM([
321                         #include <string.h>
322                         const char * in_word_set(const char *, unsigned);
323                         $GPERF_TEST]
324                 )],
325                 [GPERF_LEN_TYPE=unsigned],
326                 [AC_MSG_ERROR([** unable to determine gperf len type])]
327         )]
328 )
329 CFLAGS="$save_CFLAGS"
330
331 AC_DEFINE_UNQUOTED([GPERF_LEN_TYPE], [$GPERF_LEN_TYPE], [gperf len type])
332
333 # ------------------------------------------------------------------------------
334 # we use python to build the man page index
335 have_python=no
336 AC_ARG_WITH([python],
337         [AS_HELP_STRING([--without-python], [disable building the man page index and systemd-python (default: test)])])
338
339 have_lxml=no
340 AS_IF([test "x$with_python" != "xno"], [
341         AM_PATH_PYTHON([3],, [:])
342         AS_IF([test "x$PYTHON" != "x:"], [
343                 AC_MSG_CHECKING([for python lxml module])
344                 AS_IF(["$PYTHON" -c 'import lxml' 2>/dev/null], [have_lxml=yes])
345                 AC_MSG_RESULT([$have_lxml])
346                 AS_IF([test "x$have_lxml" = "xyes"], [have_python=yes],
347                       [AC_MSG_WARN([*** python support requires python-lxml module installed])])
348         ])
349 ])
350 AS_IF([test "$have_python" != "yes"], [
351       AS_IF([test "$with_python" = "yes"],
352             [AC_MSG_ERROR([*** python support requested but python support not found])])
353       AS_IF([test "$with_python" != "no"],
354             [AC_MSG_WARN([*** python support not found, some documentation cannot be built])])
355 ])
356 AM_CONDITIONAL([HAVE_PYTHON], [test "x$have_python" = "xyes"])
357
358 # ------------------------------------------------------------------------------
359
360 AC_CHECK_HEADERS([sys/capability.h], [], [AC_MSG_ERROR([*** POSIX caps headers not found])])
361 AC_CHECK_HEADERS([linux/memfd.h], [], [])
362 AC_CHECK_HEADERS([linux/vm_sockets.h], [], [], [#include <sys/socket.h>])
363
364 AC_CHECK_HEADERS([printf.h], [have_printf_h=yes], [have_printf_h=no])
365 AS_IF([test x$have_printf_h = xyes], [
366         AC_DEFINE(HAVE_PRINTF_H, 1, [Define if printf.h was found])
367 ])
368
369
370
371 # unconditionally pull-in librt with old glibc versions
372 dnl AC_SEARCH_LIBS([clock_gettime], [rt], [], [])
373 dnl AC_SEARCH_LIBS([mq_unlink], [rt], [], [])
374
375 save_LIBS="$LIBS"
376 LIBS=
377 AC_SEARCH_LIBS([cap_init], [cap], [], [AC_MSG_ERROR([*** POSIX caps library not found])])
378 CAP_LIBS="$LIBS"
379 AC_SUBST(CAP_LIBS)
380
381 AC_CHECK_FUNCS([__secure_getenv secure_getenv])
382 AC_CHECK_DECLS([
383         memfd_create,
384         gettid,
385         pivot_root,
386         name_to_handle_at,
387         setns,
388         renameat2,
389         kcmp,
390         keyctl,
391         LO_FLAGS_PARTSCAN,
392         copy_file_range,
393         explicit_bzero],
394                 [], [], [[
395 #include <sys/types.h>
396 #include <unistd.h>
397 #include <sys/mount.h>
398 #include <fcntl.h>
399 #include <sched.h>
400 #include <string.h>
401 #include <linux/loop.h>
402 ]])
403
404 AC_CHECK_DECLS([getrandom],
405                [AC_DEFINE([USE_SYS_RANDOM_H], [], [sys/random.h is usable])],
406                [AC_CHECK_DECLS([getrandom], [], [], [[
407 #include <sys/random.h>
408 ]])], [[
409 #include <linux/random.h>
410 ]])
411
412 AC_CHECK_TYPES([char16_t, char32_t, key_serial_t],
413                [], [], [[
414 #include <uchar.h>
415 ]])
416
417 AC_CHECK_DECLS([IFLA_INET6_ADDR_GEN_MODE,
418                 IN6_ADDR_GEN_MODE_STABLE_PRIVACY,
419                 IFLA_VRF_TABLE,
420                 IFLA_MACVLAN_FLAGS,
421                 IFLA_IPVLAN_MODE,
422                 IFLA_VTI_REMOTE,
423                 IFLA_PHYS_PORT_ID,
424                 IFLA_BOND_AD_INFO,
425                 IFLA_VLAN_PROTOCOL,
426                 IFLA_VXLAN_GPE,
427                 IFLA_GENEVE_LABEL,
428                 IFLA_IPTUN_ENCAP_DPORT,
429                 IFLA_GRE_ENCAP_DPORT,
430                 IFLA_BRIDGE_VLAN_INFO,
431                 IFLA_BRPORT_PROXYARP,
432                 IFLA_BRPORT_LEARNING_SYNC,
433                 IFLA_BR_VLAN_DEFAULT_PVID,
434                 NDA_IFINDEX,
435                 IFA_FLAGS],
436 [], [], [[
437 #include <inttypes.h>
438 #include <netinet/in.h>
439 #include <netinet/ether.h>
440 #include <linux/rtnetlink.h>
441 #include <net/if.h>
442 #include <linux/ip.h>
443 #include <linux/if_tunnel.h>
444 #include <linux/if_link.h>
445 #include <linux/if_bridge.h>
446 #include <linux/if_addr.h>
447 #include <linux/neighbour.h>
448 ]])
449
450 # This makes sure pkg.m4 is available.
451 m4_pattern_forbid([^_?PKG_[A-Z_]+$],[*** pkg.m4 missing, please install pkg-config])
452
453
454 # ------------------------------------------------------------------------------
455 PKG_CHECK_MODULES(UDEV, [libudev])
456 dnl
457 AC_ARG_WITH([udevrulesdir],
458             AS_HELP_STRING([--with-udevrulesdir=DIR], [Directory for udev rules files]),
459             [],
460             [with_udevrulesdir=$($PKG_CONFIG --variable=udevdir udev)/rules.d])
461 AC_SUBST([udevrulesdir], [$with_udevrulesdir])
462
463 AC_ARG_WITH([udevbindir],
464             AS_HELP_STRING([--with-udevbindir=DIR], [Directory for udev binary files]),
465             [],
466             [with_udevbindir=$($PKG_CONFIG --variable=udevdir udev)])
467 AC_SUBST([udevbindir], [$with_udevbindir])
468
469 # ------------------------------------------------------------------------------
470 have_glib=no
471 AC_ARG_ENABLE(glib, AS_HELP_STRING([--disable-glib], [disable usage of glib,gobject,gio in tests]))
472 AS_IF([test "x$enable_glib" != "xno"], [
473         PKG_CHECK_MODULES(GLIB, [glib-2.0 >= 2.22.0 gobject-2.0 >= 2.22.0 gio-2.0],
474                 [AC_DEFINE(HAVE_GLIB, 1, [Define if glib,gobject,gio are available]) have_glib=yes],
475                 [have_glib=no])
476         AS_IF([test "x$have_glib" = "xno" -a "x$enable_glib" = "xyes"],
477                 [AC_MSG_ERROR([*** glib support requested but libraries not found])])])
478
479 # ------------------------------------------------------------------------------
480 have_utmp=yes
481 AC_ARG_ENABLE([utmp], AS_HELP_STRING([--disable-utmp], [disable utmp/wtmp log handling]),
482         AS_CASE("x${enableval}",
483                 [xyes], [have_utmp=yes],
484                 [xno],  [have_utmp=no],
485                 AC_MSG_ERROR(bad value ${enableval} for --enable-utmp)))
486 AS_IF([test "x$have_utmp" = "xyes"], [
487         AC_DEFINE(HAVE_UTMP, 1, [Define if utmp/wtmp support is enabled])
488         have_utmp=yes
489         M4_DEFINES="$M4_DEFINES -DHAVE_UTMP"],
490         [have_utmp=no])
491 AM_CONDITIONAL([HAVE_UTMP], [test "x$have_utmp" = "xyes"])
492
493 # ------------------------------------------------------------------------------
494 have_coverage=no
495 AC_ARG_ENABLE(coverage, AS_HELP_STRING([--enable-coverage], [enable test coverage]))
496 if test "x$enable_coverage" = "xyes" ; then
497         AC_CHECK_PROG(lcov_found, [lcov], [yes], [no])
498         if test "x$lcov_found" = xno ; then
499                 AC_MSG_ERROR([*** lcov support requested but the program was not found])
500         else
501                 lcov_version_major="`lcov --version | cut -d ' ' -f 4 | cut -d '.' -f 1`"
502                 lcov_version_minor="`lcov --version | cut -d ' ' -f 4 | cut -d '.' -f 2`"
503                 if test "$lcov_version_major" -eq 1 -a "$lcov_version_minor" -lt 10; then
504                         AC_MSG_ERROR([*** lcov version is too old. 1.10 required])
505                 else
506                         have_coverage=yes
507                         CC_CHECK_FLAGS_APPEND([with_coverage_cflags], [CFLAGS], [\
508                         -fprofile-arcs \
509                         -ftest-coverage])
510                         AC_SUBST([OUR_CFLAGS], "$with_cflags $with_coverage_cflags")
511                 fi
512         fi
513 fi
514 AM_CONDITIONAL(ENABLE_COVERAGE, [test "$have_coverage" = "yes"])
515
516 # ------------------------------------------------------------------------------
517 have_selinux=no
518 AC_ARG_ENABLE(selinux, AS_HELP_STRING([--disable-selinux], [disable optional SELINUX support]))
519 if test "x$enable_selinux" != "xno"; then
520         PKG_CHECK_MODULES([SELINUX], [libselinux >= 2.1.9],
521                 [AC_DEFINE(HAVE_SELINUX, 1, [Define if SELinux is available])
522                  have_selinux=yes
523                  M4_DEFINES="$M4_DEFINES -DHAVE_SELINUX"],
524                 [have_selinux=no])
525         if test "x$have_selinux" = xno -a "x$enable_selinux" = xyes; then
526                 AC_MSG_ERROR([*** SELinux support requested but libraries not found])
527         fi
528 fi
529 AM_CONDITIONAL(HAVE_SELINUX, [test "$have_selinux" = "yes"])
530
531 # ------------------------------------------------------------------------------
532 AC_ARG_WITH([kill-user-processes],
533         [AS_HELP_STRING([--without-kill-user-processes], [Set elogind's KillUserProcesses=no by default])])
534 AS_IF([test "$with_kill_user_processes" != "no"],
535        [kill_user_processes=true
536         KILL_USER_PROCESSES=yes],
537        [kill_user_processes=false
538         KILL_USER_PROCESSES=no])
539 AC_DEFINE_UNQUOTED(KILL_USER_PROCESSES, [$kill_user_processes], [Default KillUserProcesses setting])
540 AC_SUBST(KILL_USER_PROCESSES)
541
542 # ------------------------------------------------------------------------------
543 # We do not really support systemd hybrid or unified mode, but set the default
544 # to 'legacy' here. That is currently the only cgroup mode supported by elogind.
545 #AC_ARG_WITH(default-hierarchy,
546 #        AS_HELP_STRING([--with-default-hierarchy=MODE],
547 #                [default cgroup hierarchy, defaults to "hybrid"]),
548 #        [DEFAULT_HIERARCHY="$withval"],
549 #        [DEFAULT_HIERARCHY="hybrid"])
550 DEFAULT_HIERARCHY=legacy
551
552 AS_CASE("$DEFAULT_HIERARCHY",
553         [legacy], [mode=CGROUP_UNIFIED_NONE],
554         [hybrid], [mode=CGROUP_UNIFIED_SYSTEMD],
555         [unified], [mode=CGROUP_UNIFIED_ALL],
556         AC_MSG_ERROR(Bad default hierarchy mode ${DEFAULT_HIERARCHY}))
557 AC_DEFINE_UNQUOTED(DEFAULT_HIERARCHY, [$mode], [Default cgroup hierarchy])
558 AC_DEFINE_UNQUOTED(DEFAULT_HIERARCHY_NAME, ["$DEFAULT_HIERARCHY"],
559                                            [Default cgroup hierarchy as string])
560
561 # ------------------------------------------------------------------------------
562 AC_ARG_ENABLE([pam],
563         AS_HELP_STRING([--disable-pam],[disable optional PAM support]),
564                 [case "${enableval}" in
565                         yes) have_pam=yes ;;
566                         no) have_pam=no ;;
567                         *) AC_MSG_ERROR(bad value ${enableval} for --disable-pam) ;;
568                 esac],
569                 [have_pam=auto])
570
571 if test "x${have_pam}" != xno ; then
572         AC_CHECK_HEADERS(
573                 [security/pam_modules.h security/pam_modutil.h security/pam_ext.h],
574                 [have_pam=yes],
575                 [if test "x$have_pam" = xyes ; then
576                         AC_MSG_ERROR([*** PAM headers not found.])
577                 fi])
578
579         AC_CHECK_LIB(
580                 [pam],
581                 [pam_syslog],
582                 [have_pam=yes],
583                 [if test "x$have_pam" = xyes ; then
584                         AC_MSG_ERROR([*** libpam not found.])
585                 fi])
586
587         if test "x$have_pam" = xyes ; then
588                 PAM_LIBS="-lpam -lpam_misc"
589                 AC_DEFINE(HAVE_PAM, 1, [PAM available])
590                 M4_DEFINES="$M4_DEFINES -DHAVE_PAM"
591         else
592                 have_pam=no
593         fi
594 else
595         PAM_LIBS=
596 fi
597 AC_SUBST(PAM_LIBS)
598 AM_CONDITIONAL([HAVE_PAM], [test "x$have_pam" != xno])
599
600 # ------------------------------------------------------------------------------
601 AC_ARG_ENABLE([acl],
602         AS_HELP_STRING([--disable-acl],[disable optional ACL support]),
603                 [case "${enableval}" in
604                         yes) have_acl=yes ;;
605                         no) have_acl=no ;;
606                         *) AC_MSG_ERROR(bad value ${enableval} for --disable-acl) ;;
607                 esac],
608                 [have_acl=auto])
609
610 if test "x${have_acl}" != xno ; then
611         AC_CHECK_HEADERS(
612                 [sys/acl.h acl/libacl.h],
613                 [have_acl=yes],
614                 [if test "x$have_acl" = xyes ; then
615                         AC_MSG_ERROR([*** ACL headers not found.])
616                 fi])
617
618         AC_CHECK_LIB(
619                 [acl],
620                 [acl_get_file],
621                 [have_acl=yes],
622                 [if test "x$have_acl" = xyes ; then
623                         AC_MSG_ERROR([*** libacl not found.])
624                 fi])
625
626         if test "x$have_acl" = xyes ; then
627                 ACL_LIBS="-lacl"
628                 AC_DEFINE(HAVE_ACL, 1, [ACL available])
629                 M4_DEFINES="$M4_DEFINES -DHAVE_ACL"
630         else
631                 have_acl=no
632         fi
633 else
634         ACL_LIBS=
635 fi
636 AC_SUBST(ACL_LIBS)
637 AM_CONDITIONAL([HAVE_ACL], [test "x$have_acl" != xno])
638
639 # ------------------------------------------------------------------------------
640 AC_ARG_ENABLE([smack], AS_HELP_STRING([--disable-smack],[disable optional SMACK support]),
641                 [case "${enableval}" in
642                         yes) have_smack=yes ;;
643                         no) have_smack=no ;;
644                         *) AC_MSG_ERROR(bad value ${enableval} for --disable-smack) ;;
645                 esac],
646                 [have_smack=auto])
647
648 if test "x${have_smack}" != xno; then
649         AC_DEFINE(HAVE_SMACK, 1, [Define if SMACK is available])
650         M4_DEFINES="$M4_DEFINES -DHAVE_SMACK"
651         have_smack=yes
652 fi
653
654 AM_CONDITIONAL([HAVE_SMACK], [test "x$have_smack" = "xyes"])
655
656 have_smack_run_label=no
657 AC_ARG_WITH(smack-run-label,
658 AS_HELP_STRING([--with-smack-run-label=STRING],
659         [run systemd --system itself with a specific SMACK label]),
660         [AC_DEFINE_UNQUOTED(SMACK_RUN_LABEL, ["$withval"], [Run systemd itself with SMACK label]) have_smack_run_label=yes],
661         [])
662
663 if test "x${have_smack_run_label}" = xyes; then
664         M4_DEFINES="$M4_DEFINES -DHAVE_SMACK_RUN_LABEL"
665 fi
666
667 AC_ARG_WITH(smack-default-process-label,
668 AS_HELP_STRING([--with-smack-default-process-label=STRING],
669         [default SMACK label for executed processes]),
670         [AC_DEFINE_UNQUOTED(SMACK_DEFAULT_PROCESS_LABEL, ["$withval"], [Default SMACK label for executed processes])],
671         [])
672
673 # ------------------------------------------------------------------------------
674 AC_ARG_WITH(system-uid-max,
675         AS_HELP_STRING([--with-system-uid-max=UID]
676                 [Maximum UID for system users]),
677         [SYSTEM_UID_MAX="$withval"],
678         [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`"])
679
680 AC_DEFINE_UNQUOTED(SYSTEM_UID_MAX, [$SYSTEM_UID_MAX], [Maximum System UID])
681 AC_SUBST(SYSTEM_UID_MAX)
682
683 # ------------------------------------------------------------------------------
684 AC_ARG_WITH(system-gid-max,
685         AS_HELP_STRING([--with-system-gid-max=GID]
686                 [Maximum GID for system groups]),
687         [SYSTEM_GID_MAX="$withval"],
688         [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`"])
689
690 AC_DEFINE_UNQUOTED(SYSTEM_GID_MAX, [$SYSTEM_GID_MAX], [Maximum System GID])
691 AC_SUBST(SYSTEM_GID_MAX)
692
693 # ------------------------------------------------------------------------------
694 have_polkit=no
695 AC_ARG_ENABLE(polkit, AS_HELP_STRING([--disable-polkit], [disable PolicyKit support]))
696 if test "x$enable_polkit" != "xno"; then
697         AC_DEFINE(ENABLE_POLKIT, 1, [Define if PolicyKit support is to be enabled])
698         have_polkit=yes
699
700         # also enable support for *.pkla files on old polkit
701         PKG_CHECK_MODULES(POLKIT, [ polkit-gobject-1 < 0.106 ],
702                            [polkit_pkla=yes],
703                            [polkit_pkla=no])
704 fi
705 AM_CONDITIONAL(ENABLE_POLKIT, [test "x$have_polkit" = "xyes"])
706 AM_CONDITIONAL(ENABLE_POLKIT_PKLA, [test "x$polkit_pkla" = "xyes"])
707
708 # ------------------------------------------------------------------------------
709 AC_CHECK_HEADERS_ONCE([valgrind/memcheck.h valgrind/valgrind.h])
710
711 # ------------------------------------------------------------------------------
712 have_manpages=no
713 AC_ARG_ENABLE(manpages, AS_HELP_STRING([--disable-manpages], [disable manpages]))
714 AC_PATH_PROG([XSLTPROC], [xsltproc])
715 AS_IF([test "x$enable_manpages" != xno], [have_manpages=yes])
716 AM_CONDITIONAL(ENABLE_MANPAGES, [test "x$have_manpages" = "xyes"])
717
718 # ------------------------------------------------------------------------------
719 AC_SUBST(M4_DEFINES)
720
721 AC_ARG_WITH([dbuspolicydir],
722         AS_HELP_STRING([--with-dbuspolicydir=DIR], [D-Bus policy directory]),
723         [],
724         [with_dbuspolicydir=${datadir}/dbus-1/system.d])
725 AX_NORMALIZE_PATH([with_dbuspolicydir])
726
727 AC_ARG_WITH([dbussystemservicedir],
728         AS_HELP_STRING([--with-dbussystemservicedir=DIR], [D-Bus system service directory]),
729         [],
730         [with_dbussystemservicedir=${datadir}/dbus-1/system-services])
731 AX_NORMALIZE_PATH([with_dbussystemservicedir])
732
733 AC_ARG_WITH([bashcompletiondir],
734         AS_HELP_STRING([--with-bashcompletiondir=DIR], [bash completions directory]),
735         [],
736         [AS_IF([$($PKG_CONFIG --exists bash-completion)], [
737                 with_bashcompletiondir=$($PKG_CONFIG --variable=completionsdir bash-completion)
738         ] , [
739                 with_bashcompletiondir=${datadir}/bash-completion/completions
740         ])])
741 AM_CONDITIONAL(ENABLE_BASH_COMPLETION, [test "$with_bashcompletiondir" != "no"])
742 AX_NORMALIZE_PATH([with_bashcompletiondir])
743
744 AC_ARG_WITH([zshcompletiondir],
745         AS_HELP_STRING([--with-zshcompletiondir=DIR], [zsh completions directory]),
746         [], [with_zshcompletiondir=${datadir}/zsh/site-functions])
747 AM_CONDITIONAL(ENABLE_ZSH_COMPLETION, [test "$with_zshcompletiondir" != "no"])
748 AX_NORMALIZE_PATH([with_zshcompletiondir])
749
750 AC_ARG_WITH([rootprefix],
751         AS_HELP_STRING([--with-rootprefix=DIR], [rootfs directory prefix for config files and kernel modules]),
752         [], [with_rootprefix=${ac_default_prefix}])
753 # --with-rootprefix= (empty) should default to "/" but AX_NORMALIZE_PATH
754 # defaults those to ".", solve that here for now until we can find a suitable
755 # fix for AX_NORMALIZE_PATH upstream at autoconf-archive.
756 # See: https://github.com/systemd/systemd/issues/54
757 if test "x${with_rootprefix}" = "x"; then
758         with_rootprefix="/"
759 fi
760 AX_NORMALIZE_PATH([with_rootprefix])
761
762 AC_ARG_WITH([rootlibdir],
763         AS_HELP_STRING([--with-rootlibdir=DIR], [root directory for libraries necessary for boot]),
764         [],
765         [with_rootlibdir=${libdir}])
766 AX_NORMALIZE_PATH([with_rootlibdir])
767
768 AC_ARG_WITH([rootlibexecdir],
769         AS_HELP_STRING([--with-rootlibexecdir=DIR], [Root directory for executables necessary for boot]),
770         [],
771         [with_rootlibexecdir=${with_rootprefix}/lib/elogind])
772 AX_NORMALIZE_PATH([with_rootlibexecdir])
773
774 AC_ARG_WITH([pamlibdir],
775         AS_HELP_STRING([--with-pamlibdir=DIR], [directory for PAM modules]),
776         [],
777         [with_pamlibdir=${with_rootlibdir}/security])
778 AX_NORMALIZE_PATH([with_pamlibdir])
779
780 AC_ARG_WITH([pamconfdir],
781         AS_HELP_STRING([--with-pamconfdir=DIR], [directory for PAM configuration (pass no to disable installing)]),
782         [],
783         [with_pamconfdir=${sysconfdir}/pam.d])
784 AM_CONDITIONAL(ENABLE_PAM_CONFIG, [test "$with_pamconfdir" != "no"])
785 AX_NORMALIZE_PATH([with_pamconfdir])
786
787 AC_ARG_ENABLE([split-usr],
788         AS_HELP_STRING([--enable-split-usr], [assume that /bin, /sbin aren\'t symlinks into /usr]),
789         [],
790         [AS_IF([test "x${ac_default_prefix}" != "x${with_rootprefix}"], [
791                 enable_split_usr=yes
792         ], [
793                 enable_split_usr=no
794         ])])
795
796 AS_IF([test "x${enable_split_usr}" = "xyes"], [
797         AC_DEFINE(HAVE_SPLIT_USR, 1, [Define if /bin, /sbin aren't symlinks into /usr])
798 ])
799 AM_CONDITIONAL(ENABLE_SPLIT_USR, [test "x${enable_split_usr}" = "xyes"])
800
801 # work around intltool-update issues during 'make distcheck'
802 AS_IF([test "x$0" != "x./configure"], [
803         AC_SUBST([INTLTOOL_UPDATE], [/usr/bin/env true])
804 ])
805
806 AC_ARG_ENABLE(tests,
807         [AC_HELP_STRING([--disable-tests], [disable tests, or enable extra tests with =unsafe])],
808         enable_tests=$enableval, enable_tests=yes)
809 AM_CONDITIONAL(ENABLE_TESTS, [test x$enable_tests = xyes -o x$enable_tests = xunsafe])
810 AM_CONDITIONAL(ENABLE_UNSAFE_TESTS, [test x$enable_tests = xunsafe])
811
812 AC_ARG_ENABLE(debug,
813         [AC_HELP_STRING([--enable-debug@<:@=LIST@:>@], [enable extra debugging (elogind,hashmap,mmap-cache)])],
814         [if test "x$enableval" = "xyes"; then
815                 enableval="elogind,hashmap,mmap-cache"
816         fi
817         saved_ifs="$IFS"
818         IFS="$IFS$PATH_SEPARATOR,"
819         for name in $enableval; do
820                 case $name in
821                 elogind)
822                         enable_debug_elogind=yes
823                         ;;
824                 hashmap)
825                         enable_debug_hashmap=yes
826                         ;;
827                 mmap-cache)
828                         enable_debug_mmap_cache=yes
829                         ;;
830                 esac
831         done
832         IFS="$saved_ifs"],[])
833
834 enable_debug=""
835 AS_IF([test x$enable_debug_elogind = xyes], [
836         AC_DEFINE(ENABLE_DEBUG_ELOGIND, 1, [Define if elogind debugging is to be enabled])
837         enable_debug="elogind $enable_debug"
838 ])
839 AS_IF([test x$enable_debug_hashmap = xyes], [
840         AC_DEFINE(ENABLE_DEBUG_HASHMAP, 1, [Define if hashmap debugging is to be enabled])
841         enable_debug="hashmap $enable_debug"
842 ])
843 AS_IF([test x$enable_debug_mmap_cache = xyes], [
844         AC_DEFINE(ENABLE_DEBUG_MMAP_CACHE, 1, [Define if mmap cache debugging is to be enabled])
845         enable_debug="mmap-cache $enable_debug"
846 ])
847 test -z "$enable_debug" && enable_debug="none"
848
849 AC_SUBST([dbuspolicydir], [$with_dbuspolicydir])
850 AC_SUBST([dbussystemservicedir], [$with_dbussystemservicedir])
851 AC_SUBST([bashcompletiondir], [$with_bashcompletiondir])
852 AC_SUBST([zshcompletiondir], [$with_zshcompletiondir])
853 AC_SUBST([pamlibdir], [$with_pamlibdir])
854 AC_SUBST([pamconfdir], [$with_pamconfdir])
855 AC_SUBST([rootprefix], [$with_rootprefix])
856 AC_SUBST([rootlibdir], [$with_rootlibdir])
857 AC_SUBST([rootlibexecdir], [$with_rootlibexecdir])
858 AC_SUBST([cgroup_controller], [$with_cgroupctrl])
859
860 AC_CONFIG_FILES([
861         Makefile
862         po/Makefile.in
863 ])
864
865 AC_OUTPUT
866 AC_MSG_RESULT([
867         $PACKAGE_NAME $PACKAGE_VERSION
868
869         PAM: . . . . . . . . . . . . . . . ${have_pam}
870         SELinux: . . . . . . . . . . . . . ${have_selinux}
871         SMACK: . . . . . . . . . . . . . . ${have_smack}
872         ACL: . . . . . . . . . . . . . . . ${have_acl}
873         default cgroup hierarchy: . . . .  ${DEFAULT_HIERARCHY}
874         default KillUserProcesses setting: ${KILL_USER_PROCESSES}
875         polkit: . . . . . . . . . . . . .  ${have_polkit} (legacy pkla support: ${polkit_pkla})
876         glib: . . . . . . . . . . . . . .  ${have_glib}
877         Python: . . . . . . . . . . . . .  ${have_python}
878         man pages: . . . . . . . . . . . . ${have_manpages}
879         test coverage: . . . . . . . . . . ${have_coverage}
880         Split /usr: . . . . . . . . . . .  ${enable_split_usr}
881         utmp/wtmp support: . . . . . . . . ${have_utmp}
882         Link time optimization: . . . . .  ${have_lto}
883         extra debugging: . . . . . . . . . ${enable_debug}
884         cgroup controller: . . . . . . . . ${with_cgroupctrl}
885
886         prefix: . . . . . . . . . . . . .  ${prefix}
887         rootprefix: . . . . . . . . . . .  ${with_rootprefix}
888         sysconf dir: . . . . . . . . . . . ${sysconfdir}
889         datarootdir: . . . . . . . . . . . ${datarootdir}
890         includedir: . . . . . . . . . . .  ${includedir}
891         lib dir: . . . . . . . . . . . . . ${libdir}
892         rootlib dir: . . . . . . . . . . . ${with_rootlibdir}
893         rootlibexec dir: . . . . . . . . . ${with_rootlibexecdir}
894         PAM modules dir: . . . . . . . . . ${with_pamlibdir}
895         PAM configuration dir: . . . . . . ${with_pamconfdir}
896         D-Bus policy dir: . . . . . . . .  ${with_dbuspolicydir}
897         D-Bus system dir: . . . . . . . .  ${with_dbussystemservicedir}
898         bash completions dir: . . . . . .  ${with_bashcompletiondir}
899         zsh completions dir: . . . . . . . ${with_zshcompletiondir}
900         maximum system UID: . . . . . . .  ${SYSTEM_UID_MAX}
901         maximum system GID: . . . . . . .  ${SYSTEM_GID_MAX}
902
903         CFLAGS: . . . . . . . . . . . . .  ${OUR_CFLAGS} ${CFLAGS}
904         CPPFLAGS: . . . . . . . . . . . .  ${OUR_CPPFLAGS} ${CPPFLAGS}
905         LDFLAGS: . . . . . . . . . . . . . ${OUR_LDFLAGS} ${LDFLAGS}
906 ])