chiark / gitweb /
Copy defines for renameat2 from casync (#6181)
[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         [233.3],
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         getrandom,
382         renameat2,
383         kcmp,
384         keyctl,
385         LO_FLAGS_PARTSCAN,
386         copy_file_range,
387         explicit_bzero],
388                 [], [], [[
389 #include <sys/types.h>
390 #include <unistd.h>
391 #include <sys/mount.h>
392 #include <fcntl.h>
393 #include <sched.h>
394 #include <string.h>
395 #include <linux/loop.h>
396 #include <linux/random.h>
397 ]])
398
399 AC_CHECK_TYPES([char16_t, char32_t, key_serial_t],
400                [], [], [[
401 #include <uchar.h>
402 ]])
403
404 AC_CHECK_DECLS([IFLA_INET6_ADDR_GEN_MODE,
405                 IN6_ADDR_GEN_MODE_STABLE_PRIVACY,
406                 IFLA_VRF_TABLE,
407                 IFLA_MACVLAN_FLAGS,
408                 IFLA_IPVLAN_MODE,
409                 IFLA_VTI_REMOTE,
410                 IFLA_PHYS_PORT_ID,
411                 IFLA_BOND_AD_INFO,
412                 IFLA_VLAN_PROTOCOL,
413                 IFLA_VXLAN_REMCSUM_NOPARTIAL,
414                 IFLA_IPTUN_ENCAP_DPORT,
415                 IFLA_GRE_ENCAP_DPORT,
416                 IFLA_BRIDGE_VLAN_INFO,
417                 IFLA_BRPORT_PROXYARP,
418                 IFLA_BRPORT_LEARNING_SYNC,
419                 IFLA_BR_VLAN_DEFAULT_PVID,
420                 NDA_IFINDEX,
421                 IFA_FLAGS],
422 [], [], [[
423 #include <inttypes.h>
424 #include <netinet/in.h>
425 #include <netinet/ether.h>
426 #include <linux/rtnetlink.h>
427 #include <net/if.h>
428 #include <linux/ip.h>
429 #include <linux/if_tunnel.h>
430 #include <linux/if_link.h>
431 #include <linux/if_bridge.h>
432 #include <linux/if_addr.h>
433 #include <linux/neighbour.h>
434 ]])
435
436 # This makes sure pkg.m4 is available.
437 m4_pattern_forbid([^_?PKG_[A-Z_]+$],[*** pkg.m4 missing, please install pkg-config])
438
439
440 # ------------------------------------------------------------------------------
441 PKG_CHECK_MODULES(UDEV, [libudev])
442 dnl
443 AC_ARG_WITH([udevrulesdir],
444             AS_HELP_STRING([--with-udevrulesdir=DIR], [Directory for udev rules files]),
445             [],
446             [with_udevrulesdir=$($PKG_CONFIG --variable=udevdir udev)/rules.d])
447 AC_SUBST([udevrulesdir], [$with_udevrulesdir])
448
449 AC_ARG_WITH([udevbindir],
450             AS_HELP_STRING([--with-udevbindir=DIR], [Directory for udev binary files]),
451             [],
452             [with_udevbindir=$($PKG_CONFIG --variable=udevdir udev)])
453 AC_SUBST([udevbindir], [$with_udevbindir])
454
455 # ------------------------------------------------------------------------------
456 have_utmp=yes
457 AC_ARG_ENABLE([utmp], AS_HELP_STRING([--disable-utmp], [disable utmp/wtmp log handling]),
458         AS_CASE("x${enableval}",
459                 [xyes], [have_utmp=yes],
460                 [xno],  [have_utmp=no],
461                 AC_MSG_ERROR(bad value ${enableval} for --enable-utmp)))
462 AS_IF([test "x$have_utmp" = "xyes"], [AC_DEFINE(HAVE_UTMP, 1, [Define if utmp/wtmp support is enabled])])
463 AM_CONDITIONAL([HAVE_UTMP], [test "x$have_utmp" = "xyes"])
464
465 # ------------------------------------------------------------------------------
466 have_coverage=no
467 AC_ARG_ENABLE(coverage, AS_HELP_STRING([--enable-coverage], [enable test coverage]))
468 if test "x$enable_coverage" = "xyes" ; then
469         AC_CHECK_PROG(lcov_found, [lcov], [yes], [no])
470         if test "x$lcov_found" = xno ; then
471                 AC_MSG_ERROR([*** lcov support requested but the program was not found])
472         else
473                 lcov_version_major="`lcov --version | cut -d ' ' -f 4 | cut -d '.' -f 1`"
474                 lcov_version_minor="`lcov --version | cut -d ' ' -f 4 | cut -d '.' -f 2`"
475                 if test "$lcov_version_major" -eq 1 -a "$lcov_version_minor" -lt 10; then
476                         AC_MSG_ERROR([*** lcov version is too old. 1.10 required])
477                 else
478                         have_coverage=yes
479                         CC_CHECK_FLAGS_APPEND([with_coverage_cflags], [CFLAGS], [\
480                         -fprofile-arcs \
481                         -ftest-coverage])
482                         AC_SUBST([OUR_CFLAGS], "$with_cflags $with_coverage_cflags")
483                 fi
484         fi
485 fi
486 AM_CONDITIONAL(ENABLE_COVERAGE, [test "$have_coverage" = "yes"])
487
488 # ------------------------------------------------------------------------------
489 have_selinux=no
490 AC_ARG_ENABLE(selinux, AS_HELP_STRING([--disable-selinux], [disable optional SELINUX support]))
491 if test "x$enable_selinux" != "xno"; then
492         PKG_CHECK_MODULES([SELINUX], [libselinux >= 2.1.9],
493                 [AC_DEFINE(HAVE_SELINUX, 1, [Define if SELinux is available])
494                  have_selinux=yes
495                  M4_DEFINES="$M4_DEFINES -DHAVE_SELINUX"],
496                 [have_selinux=no])
497         if test "x$have_selinux" = xno -a "x$enable_selinux" = xyes; then
498                 AC_MSG_ERROR([*** SELinux support requested but libraries not found])
499         fi
500 fi
501 AM_CONDITIONAL(HAVE_SELINUX, [test "$have_selinux" = "yes"])
502
503 # ------------------------------------------------------------------------------
504 AC_ARG_WITH([kill-user-processes],
505         [AS_HELP_STRING([--without-kill-user-processes], [Set elogind's KillUserProcesses=no by default])])
506 AS_IF([test "$with_kill_user_processes" != "no"],
507        [kill_user_processes=true
508         KILL_USER_PROCESSES=yes],
509        [kill_user_processes=false
510         KILL_USER_PROCESSES=no])
511 AC_DEFINE_UNQUOTED(KILL_USER_PROCESSES, [$kill_user_processes], [Default KillUserProcesses setting])
512 AC_SUBST(KILL_USER_PROCESSES)
513
514 # ------------------------------------------------------------------------------
515 # We do not really support systemd hybrid or unified mode, but set the default
516 # to 'legacy' here. That is currently the only cgroup mode supported by elogind.
517 #AC_ARG_WITH(default-hierarchy,
518 #        AS_HELP_STRING([--with-default-hierarchy=MODE],
519 #                [default cgroup hierarchy, defaults to "hybrid"]),
520 #        [DEFAULT_HIERARCHY="$withval"],
521 #        [DEFAULT_HIERARCHY="hybrid"])
522 DEFAULT_HIERARCHY=legacy
523
524 AS_CASE("$DEFAULT_HIERARCHY",
525         [legacy], [mode=CGROUP_UNIFIED_NONE],
526         [hybrid], [mode=CGROUP_UNIFIED_SYSTEMD],
527         [unified], [mode=CGROUP_UNIFIED_ALL],
528         AC_MSG_ERROR(Bad default hierarchy mode ${DEFAULT_HIERARCHY}))
529 AC_DEFINE_UNQUOTED(DEFAULT_HIERARCHY, [$mode], [Default cgroup hierarchy])
530 AC_DEFINE_UNQUOTED(DEFAULT_HIERARCHY_NAME, ["$DEFAULT_HIERARCHY"],
531                                            [Default cgroup hierarchy as string])
532
533 # ------------------------------------------------------------------------------
534 AC_ARG_ENABLE([pam],
535         AS_HELP_STRING([--disable-pam],[disable optional PAM support]),
536                 [case "${enableval}" in
537                         yes) have_pam=yes ;;
538                         no) have_pam=no ;;
539                         *) AC_MSG_ERROR(bad value ${enableval} for --disable-pam) ;;
540                 esac],
541                 [have_pam=auto])
542
543 if test "x${have_pam}" != xno ; then
544         AC_CHECK_HEADERS(
545                 [security/pam_modules.h security/pam_modutil.h security/pam_ext.h],
546                 [have_pam=yes],
547                 [if test "x$have_pam" = xyes ; then
548                         AC_MSG_ERROR([*** PAM headers not found.])
549                 fi])
550
551         AC_CHECK_LIB(
552                 [pam],
553                 [pam_syslog],
554                 [have_pam=yes],
555                 [if test "x$have_pam" = xyes ; then
556                         AC_MSG_ERROR([*** libpam not found.])
557                 fi])
558
559         if test "x$have_pam" = xyes ; then
560                 PAM_LIBS="-lpam -lpam_misc"
561                 AC_DEFINE(HAVE_PAM, 1, [PAM available])
562                 M4_DEFINES="$M4_DEFINES -DHAVE_PAM"
563         else
564                 have_pam=no
565         fi
566 else
567         PAM_LIBS=
568 fi
569 AC_SUBST(PAM_LIBS)
570 AM_CONDITIONAL([HAVE_PAM], [test "x$have_pam" != xno])
571
572 # ------------------------------------------------------------------------------
573 AC_ARG_ENABLE([acl],
574         AS_HELP_STRING([--disable-acl],[disable optional ACL support]),
575                 [case "${enableval}" in
576                         yes) have_acl=yes ;;
577                         no) have_acl=no ;;
578                         *) AC_MSG_ERROR(bad value ${enableval} for --disable-acl) ;;
579                 esac],
580                 [have_acl=auto])
581
582 if test "x${have_acl}" != xno ; then
583         AC_CHECK_HEADERS(
584                 [sys/acl.h acl/libacl.h],
585                 [have_acl=yes],
586                 [if test "x$have_acl" = xyes ; then
587                         AC_MSG_ERROR([*** ACL headers not found.])
588                 fi])
589
590         AC_CHECK_LIB(
591                 [acl],
592                 [acl_get_file],
593                 [have_acl=yes],
594                 [if test "x$have_acl" = xyes ; then
595                         AC_MSG_ERROR([*** libacl not found.])
596                 fi])
597
598         if test "x$have_acl" = xyes ; then
599                 ACL_LIBS="-lacl"
600                 AC_DEFINE(HAVE_ACL, 1, [ACL available])
601                 M4_DEFINES="$M4_DEFINES -DHAVE_ACL"
602         else
603                 have_acl=no
604         fi
605 else
606         ACL_LIBS=
607 fi
608 AC_SUBST(ACL_LIBS)
609 AM_CONDITIONAL([HAVE_ACL], [test "x$have_acl" != xno])
610
611 # ------------------------------------------------------------------------------
612 AC_ARG_ENABLE([smack], AS_HELP_STRING([--disable-smack],[disable optional SMACK support]),
613                 [case "${enableval}" in
614                         yes) have_smack=yes ;;
615                         no) have_smack=no ;;
616                         *) AC_MSG_ERROR(bad value ${enableval} for --disable-smack) ;;
617                 esac],
618                 [have_smack=auto])
619
620 if test "x${have_smack}" != xno; then
621         AC_DEFINE(HAVE_SMACK, 1, [Define if SMACK is available])
622         M4_DEFINES="$M4_DEFINES -DHAVE_SMACK"
623         have_smack=yes
624 fi
625
626 AM_CONDITIONAL([HAVE_SMACK], [test "x$have_smack" = "xyes"])
627
628 have_smack_run_label=no
629 AC_ARG_WITH(smack-run-label,
630 AS_HELP_STRING([--with-smack-run-label=STRING],
631         [run systemd --system itself with a specific SMACK label]),
632         [AC_DEFINE_UNQUOTED(SMACK_RUN_LABEL, ["$withval"], [Run systemd itself with SMACK label]) have_smack_run_label=yes],
633         [])
634
635 if test "x${have_smack_run_label}" = xyes; then
636         M4_DEFINES="$M4_DEFINES -DHAVE_SMACK_RUN_LABEL"
637 fi
638
639 AC_ARG_WITH(smack-default-process-label,
640 AS_HELP_STRING([--with-smack-default-process-label=STRING],
641         [default SMACK label for executed processes]),
642         [AC_DEFINE_UNQUOTED(SMACK_DEFAULT_PROCESS_LABEL, ["$withval"], [Default SMACK label for executed processes])],
643         [])
644
645 # ------------------------------------------------------------------------------
646 AC_ARG_WITH(system-uid-max,
647         AS_HELP_STRING([--with-system-uid-max=UID]
648                 [Maximum UID for system users]),
649         [SYSTEM_UID_MAX="$withval"],
650         [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`"])
651
652 AC_DEFINE_UNQUOTED(SYSTEM_UID_MAX, [$SYSTEM_UID_MAX], [Maximum System UID])
653 AC_SUBST(SYSTEM_UID_MAX)
654
655 # ------------------------------------------------------------------------------
656 AC_ARG_WITH(system-gid-max,
657         AS_HELP_STRING([--with-system-gid-max=GID]
658                 [Maximum GID for system groups]),
659         [SYSTEM_GID_MAX="$withval"],
660         [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`"])
661
662 AC_DEFINE_UNQUOTED(SYSTEM_GID_MAX, [$SYSTEM_GID_MAX], [Maximum System GID])
663 AC_SUBST(SYSTEM_GID_MAX)
664
665 # ------------------------------------------------------------------------------
666 have_polkit=no
667 AC_ARG_ENABLE(polkit, AS_HELP_STRING([--disable-polkit], [disable PolicyKit support]))
668 if test "x$enable_polkit" != "xno"; then
669         AC_DEFINE(ENABLE_POLKIT, 1, [Define if PolicyKit support is to be enabled])
670         have_polkit=yes
671 fi
672 AM_CONDITIONAL(ENABLE_POLKIT, [test "x$have_polkit" = "xyes"])
673
674 # ------------------------------------------------------------------------------
675 AC_CHECK_HEADERS_ONCE([valgrind/memcheck.h valgrind/valgrind.h])
676
677 # ------------------------------------------------------------------------------
678 have_manpages=no
679 AC_ARG_ENABLE(manpages, AS_HELP_STRING([--disable-manpages], [disable manpages]))
680 AC_PATH_PROG([XSLTPROC], [xsltproc])
681 AS_IF([test "x$enable_manpages" != xno], [have_manpages=yes])
682 AM_CONDITIONAL(ENABLE_MANPAGES, [test "x$have_manpages" = "xyes"])
683
684 # ------------------------------------------------------------------------------
685 AC_SUBST(M4_DEFINES)
686
687 AC_ARG_WITH([dbuspolicydir],
688         AS_HELP_STRING([--with-dbuspolicydir=DIR], [D-Bus policy directory]),
689         [],
690         [with_dbuspolicydir=${datadir}/dbus-1/system.d])
691 AX_NORMALIZE_PATH([with_dbuspolicydir])
692
693 AC_ARG_WITH([dbussystemservicedir],
694         AS_HELP_STRING([--with-dbussystemservicedir=DIR], [D-Bus system service directory]),
695         [],
696         [with_dbussystemservicedir=${datadir}/dbus-1/system-services])
697 AX_NORMALIZE_PATH([with_dbussystemservicedir])
698
699 AC_ARG_WITH([bashcompletiondir],
700         AS_HELP_STRING([--with-bashcompletiondir=DIR], [bash completions directory]),
701         [],
702         [AS_IF([$($PKG_CONFIG --exists bash-completion)], [
703                 with_bashcompletiondir=$($PKG_CONFIG --variable=completionsdir bash-completion)
704         ] , [
705                 with_bashcompletiondir=${datadir}/bash-completion/completions
706         ])])
707 AM_CONDITIONAL(ENABLE_BASH_COMPLETION, [test "$with_bashcompletiondir" != "no"])
708 AX_NORMALIZE_PATH([with_bashcompletiondir])
709
710 AC_ARG_WITH([zshcompletiondir],
711         AS_HELP_STRING([--with-zshcompletiondir=DIR], [zsh completions directory]),
712         [], [with_zshcompletiondir=${datadir}/zsh/site-functions])
713 AM_CONDITIONAL(ENABLE_ZSH_COMPLETION, [test "$with_zshcompletiondir" != "no"])
714 AX_NORMALIZE_PATH([with_zshcompletiondir])
715
716 AC_ARG_WITH([rootprefix],
717         AS_HELP_STRING([--with-rootprefix=DIR], [rootfs directory prefix for config files and kernel modules]),
718         [], [with_rootprefix=${ac_default_prefix}])
719 # --with-rootprefix= (empty) should default to "/" but AX_NORMALIZE_PATH
720 # defaults those to ".", solve that here for now until we can find a suitable
721 # fix for AX_NORMALIZE_PATH upstream at autoconf-archive.
722 # See: https://github.com/systemd/systemd/issues/54
723 if test "x${with_rootprefix}" = "x"; then
724         with_rootprefix="/"
725 fi
726 AX_NORMALIZE_PATH([with_rootprefix])
727
728 AC_ARG_WITH([rootlibdir],
729         AS_HELP_STRING([--with-rootlibdir=DIR], [root directory for libraries necessary for boot]),
730         [],
731         [with_rootlibdir=${libdir}])
732 AX_NORMALIZE_PATH([with_rootlibdir])
733
734 AC_ARG_WITH([pamlibdir],
735         AS_HELP_STRING([--with-pamlibdir=DIR], [directory for PAM modules]),
736         [],
737         [with_pamlibdir=${with_rootlibdir}/security])
738 AX_NORMALIZE_PATH([with_pamlibdir])
739
740 AC_ARG_WITH([pamconfdir],
741         AS_HELP_STRING([--with-pamconfdir=DIR], [directory for PAM configuration (pass no to disable installing)]),
742         [],
743         [with_pamconfdir=${sysconfdir}/pam.d])
744 AM_CONDITIONAL(ENABLE_PAM_CONFIG, [test "$with_pamconfdir" != "no"])
745 AX_NORMALIZE_PATH([with_pamconfdir])
746
747 AC_ARG_ENABLE([split-usr],
748         AS_HELP_STRING([--enable-split-usr], [assume that /bin, /sbin aren\'t symlinks into /usr]),
749         [],
750         [AS_IF([test "x${ac_default_prefix}" != "x${with_rootprefix}"], [
751                 enable_split_usr=yes
752         ], [
753                 enable_split_usr=no
754         ])])
755
756 AS_IF([test "x${enable_split_usr}" = "xyes"], [
757         AC_DEFINE(HAVE_SPLIT_USR, 1, [Define if /bin, /sbin aren't symlinks into /usr])
758 ])
759 AM_CONDITIONAL(ENABLE_SPLIT_USR, [test "x${enable_split_usr}" = "xyes"])
760
761 # work around intltool-update issues during 'make distcheck'
762 AS_IF([test "x$0" != "x./configure"], [
763         AC_SUBST([INTLTOOL_UPDATE], [/usr/bin/env true])
764 ])
765
766 AC_ARG_ENABLE(tests,
767         [AC_HELP_STRING([--disable-tests], [disable tests, or enable extra tests with =unsafe])],
768         enable_tests=$enableval, enable_tests=yes)
769 AM_CONDITIONAL(ENABLE_TESTS, [test x$enable_tests = xyes -o x$enable_tests = xunsafe])
770 AM_CONDITIONAL(ENABLE_UNSAFE_TESTS, [test x$enable_tests = xunsafe])
771
772 AC_ARG_ENABLE(debug,
773         [AC_HELP_STRING([--enable-debug@<:@=LIST@:>@], [enable extra debugging (elogind,hashmap,mmap-cache)])],
774         [if test "x$enableval" = "xyes"; then
775                 enableval="elogind,hashmap,mmap-cache"
776         fi
777         saved_ifs="$IFS"
778         IFS="$IFS$PATH_SEPARATOR,"
779         for name in $enableval; do
780                 case $name in
781                 elogind)
782                         enable_debug_elogind=yes
783                         ;;
784                 hashmap)
785                         enable_debug_hashmap=yes
786                         ;;
787                 mmap-cache)
788                         enable_debug_mmap_cache=yes
789                         ;;
790                 esac
791         done
792         IFS="$saved_ifs"],[])
793
794 enable_debug=""
795 AS_IF([test x$enable_debug_elogind = xyes], [
796         AC_DEFINE(ENABLE_DEBUG_ELOGIND, 1, [Define if elogind debugging is to be enabled])
797         enable_debug="elogind $enable_debug"
798 ])
799 AS_IF([test x$enable_debug_hashmap = xyes], [
800         AC_DEFINE(ENABLE_DEBUG_HASHMAP, 1, [Define if hashmap debugging is to be enabled])
801         enable_debug="hashmap $enable_debug"
802 ])
803 AS_IF([test x$enable_debug_mmap_cache = xyes], [
804         AC_DEFINE(ENABLE_DEBUG_MMAP_CACHE, 1, [Define if mmap cache debugging is to be enabled])
805         enable_debug="mmap-cache $enable_debug"
806 ])
807 test -z "$enable_debug" && enable_debug="none"
808
809 AC_SUBST([dbuspolicydir], [$with_dbuspolicydir])
810 AC_SUBST([dbussystemservicedir], [$with_dbussystemservicedir])
811 AC_SUBST([bashcompletiondir], [$with_bashcompletiondir])
812 AC_SUBST([zshcompletiondir], [$with_zshcompletiondir])
813 AC_SUBST([pamlibdir], [$with_pamlibdir])
814 AC_SUBST([pamconfdir], [$with_pamconfdir])
815 AC_SUBST([rootprefix], [$with_rootprefix])
816 AC_SUBST([rootlibdir], [$with_rootlibdir])
817 AC_SUBST([cgroup_controller], [$with_cgroupctrl])
818
819 AC_CONFIG_FILES([
820         Makefile
821         po/Makefile.in
822 ])
823
824 AC_OUTPUT
825 AC_MSG_RESULT([
826         $PACKAGE_NAME $VERSION
827
828         PAM: . . . . . . . . . . . . . . . ${have_pam}
829         SELinux: . . . . . . . . . . . . . ${have_selinux}
830         SMACK: . . . . . . . . . . . . . . ${have_smack}
831         ACL: . . . . . . . . . . . . . . . ${have_acl}
832         default cgroup hierarchy: . . . .  ${DEFAULT_HIERARCHY}
833         default KillUserProcesses setting: ${KILL_USER_PROCESSES}
834         polkit: . . . . . . . . . . . . .  ${have_polkit}
835         Python: . . . . . . . . . . . . .  ${have_python}
836         man pages: . . . . . . . . . . . . ${have_manpages}
837         test coverage: . . . . . . . . . . ${have_coverage}
838         Split /usr: . . . . . . . . . . .  ${enable_split_usr}
839         utmp/wtmp support: . . . . . . . . ${have_utmp}
840         extra debugging: . . . . . . . . . ${enable_debug}
841         cgroup controller: . . . . . . . . ${with_cgroupctrl}
842
843         prefix: . . . . . . . . . . . . .  ${prefix}
844         rootprefix: . . . . . . . . . . .  ${with_rootprefix}
845         sysconf dir: . . . . . . . . . . . ${sysconfdir}
846         datarootdir: . . . . . . . . . . . ${datarootdir}
847         includedir: . . . . . . . . . . .  ${includedir}
848         lib dir: . . . . . . . . . . . . . ${libdir}
849         rootlib dir: . . . . . . . . . . . ${with_rootlibdir}
850         PAM modules dir: . . . . . . . . . ${with_pamlibdir}
851         PAM configuration dir: . . . . . . ${with_pamconfdir}
852         D-Bus policy dir: . . . . . . . .  ${with_dbuspolicydir}
853         D-Bus system dir: . . . . . . . .  ${with_dbussystemservicedir}
854         bash completions dir: . . . . . .  ${with_bashcompletiondir}
855         zsh completions dir: . . . . . . . ${with_zshcompletiondir}
856         maximum system UID: . . . . . . .  ${SYSTEM_UID_MAX}
857         maximum system GID: . . . . . . .  ${SYSTEM_GID_MAX}
858
859         CFLAGS: . . . . . . . . . . . . .  ${OUR_CFLAGS} ${CFLAGS}
860         CPPFLAGS: . . . . . . . . . . . .  ${OUR_CPPFLAGS} ${CPPFLAGS}
861         LDFLAGS: . . . . . . . . . . . . . ${OUR_LDFLAGS} ${LDFLAGS}
862 ])