AC_INIT([Finit], [5.0-rc1], [https://github.com/finit-project/finit/issues], [finit], [https://http://finit-project.github.io/]) AC_CONFIG_AUX_DIR(aux) AM_INIT_AUTOMAKE([1.11 foreign subdir-objects]) AM_SILENT_RULES([yes]) AC_CONFIG_SRCDIR([src/finit.c]) AC_CONFIG_HEADERS([config.h]) AC_CONFIG_FILES([Makefile contrib/Makefile contrib/alpine/Makefile contrib/alpine/finit.d/Makefile contrib/alpine/finit.d/available/Makefile contrib/debian/Makefile contrib/debian/finit.d/Makefile contrib/debian/finit.d/available/Makefile contrib/void/Makefile contrib/void/finit.d/Makefile contrib/void/finit.d/available/Makefile doc/Makefile doc/config/Makefile dbus-1/Makefile libink/Makefile libsystemd/Makefile libsystemd/libsystemd.pc man/Makefile plugins/Makefile src/Makefile keventd/Makefile system/Makefile system/10-hotplug.conf test/test.env test/Makefile test/lib/Makefile test/src/Makefile tmpfiles.d/Makefile]) # Older versions of autoconf (<2.58) do not have AC_CONFIG_MACRO_DIR() #m4_include([m4/plugin.m4]) #m4_include([m4/expand.m4]) AC_CONFIG_MACRO_DIR([m4]) # Handle building plugins either as dynamically loadable, or built-in LT_INIT([shared disable-static dlopen aix-soname=both disable-fast-install]) # Checks for programs. AC_PROG_CC AC_PROG_LN_S AC_PROG_INSTALL AC_PROG_MKDIR_P # Configuration. AC_CHECK_HEADERS([termios.h sys/ioctl.h mntent.h sys/sysmacros.h]) AC_CHECK_FUNCS([strstr getopt getmntent getmntent_r close_range]) # Check for uint[8,16,32]_t AC_TYPE_UINT8_T AC_TYPE_UINT16_T AC_TYPE_UINT32_T # Check for pkg-config first, warn if it's not installed PKG_PROG_PKG_CONFIG # Check for required libraries PKG_CHECK_MODULES([uev], [libuev >= 2.4.1]) PKG_CHECK_MODULES([lite], [libite >= 2.6.1]) # 3.3 is the floor: CFGF_KEYSTRVAL, which environment {} and the # free-form cgroup keys are built on, does not exist before it. 3.3 # parses both correctly. Two workarounds hang off this number, the # spurious KEYSTRVAL warning and cfg_parse_buf() losing the file name # of a template; grep the XXX notes in src/conf.c before raising it. PKG_CHECK_MODULES([confuse], [libconfuse >= 3.3]) # Check for configured Finit features AC_ARG_ENABLE(auto_reload, AS_HELP_STRING([--enable-auto-reload], [Automatic reload on any .conf change]),,[ enable_auto_reload=no]) AC_ARG_ENABLE(kernel_cmdline, AS_HELP_STRING([--enable-kernel-cmdline], [Parse init args from /proc/cmdline (don't use!)]),,[ enable_kernel_cmdline=no]) AC_ARG_ENABLE(fastboot, AS_HELP_STRING([--enable-fastboot], [Skip fsck check on filesystems listed in /etc/fstab]),,[ enable_fastboot=no]) AC_ARG_ENABLE(fsckfix, AS_HELP_STRING([--enable-fsckfix], [Run fsck fix mode (options: -yf) on filesystems listed in /etc/fstab]),,[ enable_fsckfix=no]) AC_ARG_ENABLE(cgroup, AS_HELP_STRING([--disable-cgroup], [Disable cgroup v2 support, default: autodetect from /sys/fs/cgroup]),,[ enable_cgroup=yes]) AC_ARG_ENABLE(libcap, AS_HELP_STRING([--disable-libcap], [Disable Linux capabilities support]),,[ enable_libcap=yes]) AC_ARG_ENABLE(pam, AS_HELP_STRING([--disable-pam], [Disable PAM session support for services]), [pam_explicit=yes], [enable_pam=yes]) AC_ARG_ENABLE(redirect, AS_HELP_STRING([--disable-redirect], [Disable redirection of service output to /dev/null]),,[ enable_redirect=yes]) AC_ARG_ENABLE(kernel_logging, AS_HELP_STRING([--disable-kernel-logging], [Disable kernel logging to console (use 'quiet' instead!]),,[ enable_kernel_logging=yes]) AC_ARG_ENABLE(logrotate, AS_HELP_STRING([--disable-logrotate], [Disable built-in rotation of /var/log/wtmp]),,[ enable_logrotate=yes]) AC_ARG_ENABLE(dbus, AS_HELP_STRING([--disable-dbus], [Disable D-Bus support (libink + Finit object tree)]),,[ enable_dbus=yes]) AC_ARG_ENABLE(doc, AS_HELP_STRING([--disable-doc], [Disable build and install of doc/ section]),,[ enable_doc=yes]) AC_ARG_ENABLE(contrib, AS_HELP_STRING([--disable-contrib], [Disable build and install of contrib section]),,[ enable_contrib=yes]) AC_ARG_ENABLE([rescue], AS_HELP_STRING([--disable-rescue], [Disable potentially unsafe rescue mode]),, [enable_rescue=yes]) # Check for extra plugins to enable AC_ARG_ENABLE(all_plugins, AS_HELP_STRING([--enable-all-plugins], [Enable all plugins, default: auto]), enable_all_plugins=$enableval, enable_all_plugins=auto) AC_PLUGIN([alsa-utils], [no], [Save and restore ALSA sound settings using alsactl]) AC_PLUGIN([dbus], [yes], [Setup and start system message bus, D-Bus]) AC_PLUGIN([modules-load], [no], [Scans /etc/modules-load.d for modules to load]) AC_PLUGIN([modprobe], [no], [Coldplug modules using modalias magic]) AC_PLUGIN([resolvconf], [no], [Setup necessary files for resolvconf]) AC_PLUGIN([x11-common], [no], [Console setup (for X)]) AC_PLUGIN([netlink], [yes], [Basic netlink plugin for IFUP/IFDN and GW events. Can be replaced with externally built plugin that links with libnl or similar.]) AC_PLUGIN([hook-scripts], [no], [Trigger script execution from hook points]) AC_PLUGIN([hotplug], [no], [Start udevd or mdev kernel event datamon]) AC_PLUGIN([rtc], [yes], [Save and restore RTC using hwclock]) AC_PLUGIN([tty], [yes], [Automatically activate new TTYs, e.g. USB-to-serial]) AC_PLUGIN([urandom], [yes], [Setup and save random seed at boot/shutdown]) AC_PLUGIN([plymouth], [no], [Plymouth boot splash integration]) AC_PLUGIN([testserv], [no], [Test plugin to start test serv daemon]) # Check for extra arguments or packages AC_ARG_WITH([bash-completion-dir], AS_HELP_STRING([--with-bash-completion-dir[=PATH]], [Directory to install Bash completion, default: auto]), [bash_dir=$withval], [bash_dir=yes]) AC_ARG_WITH(fstab, AS_HELP_STRING([--with-fstab=FILE], [System default fstab, default $sysconfdir/fstab]), [fstab=$withval], [fstab=yes]) AC_ARG_WITH(heading, AS_HELP_STRING([--with-heading=GREET], [Heading for boot progress. Default: PRETTY_NAME from /etc/os-release, fallback to "Finit vX.YY"]), [heading=$withval], [heading=yes]) AC_ARG_WITH(config, AS_HELP_STRING([--with-config=CONFIG], [Finit bootstrap config file, default /etc/finit.conf]), [conf=$withval], [conf=yes]) AC_ARG_WITH(rcsd, AS_HELP_STRING([--with-rcsd=DIR], [Finit rcS.d/ directory, default /etc/finit.d]), [rcsd=$withval], [rcsd=yes]) AC_ARG_WITH(rc-local, AS_HELP_STRING([--with-rc-local=FILE], [SysV init /etc/rc.local file, default /etc/rc.local]), [rclocal=$withval], [rclocal=yes]) AC_ARG_WITH(sysconfig, AS_HELP_STRING([--with-sysconfig=DIR], [System environment directory, sourced by .conf files, default /etc/default & /etc/conf.d]), [sysconfig=$withval], [sysconfig=default]) AC_ARG_WITH(group, AS_HELP_STRING([--with-group=NAME], [Group for /run/finit/socket and /run/finit/bus, default: root]), [group=$withval], [group=root]) AC_ARG_WITH(hostname, AS_HELP_STRING([--with-hostname=NAME], [If /etc/hostname is missing, default: noname]), [hostname=$withval], [hostname=yes]) AC_ARG_WITH(runlevel, AS_HELP_STRING([--with-runlevel=N], [Runlevel to switch to after bootstrap [1-9], default: 2]), [runlevel=$withval], [runlevel=yes]) AC_ARG_WITH(random-seed, AS_HELP_STRING([--with-random-seed=FILE], [Save a random seed for /dev/urandom across reboots, default /var/lib/misc/random-seed]), [random_seed=$withval], [random_seed=yes]) AC_ARG_WITH(keventd, AS_HELP_STRING([--with-keventd], [Enable built-in keventd device manager, default: yes]),, [with_keventd=yes]) AC_ARG_WITH(udev-rules, AS_HELP_STRING([--without-udev-rules], [Skip install of curated udev rules under /lib/udev/rules.d, default: yes when keventd enabled]),, [with_udev_rules=yes]) AC_ARG_WITH(sulogin, AS_HELP_STRING([--with-sulogin@<:@=USER@:>@], [Built-in sulogin, optional USER to request password for, default: yes (root)]),[sulogin=$withval],[with_sulogin=yes sulogin=yes]) AC_ARG_WITH(watchdog, AS_HELP_STRING([--with-watchdog@<:@=DEV@:>@], [Built-in watchdog, default: yes (/dev/watchdog)]), [watchdog=$withval], [with_watchdog=yes watchdog=yes]) AC_ARG_WITH(libsystemd, AS_HELP_STRING([--with-libsystemd], [Build replacement libsystemd library, default: no]), [with_libsystemd=$withval], [with_libsystemd=no]) AC_ARG_WITH(hook-scripts-path, AS_HELP_STRING([--with-hook-scripts-path=DIR], [Base directory for hook scripts, default $libexecdir/finit/hook]), [hook_scripts_path=$withval], [hook_scripts_path=yes]) AC_ARG_WITH(plugin-path, AS_HELP_STRING([--with-plugin-path=DIR], [Search path for external plugins, default /usr/lib/finit/plugins:/usr/local/lib/finit/plugins]), [plugin_path=$withval], [plugin_path=yes]) AC_ARG_WITH(rtc-date, AS_HELP_STRING([--with-rtc-date=DATE], [If RTC date/time is too old, restore to DATE, format "YYYY-MM-DD HH:MM:SS", default "2000-01-01 00:00:00"]), [rtc_date=$withval], [rtc_date=no]) AC_ARG_WITH(rtc-file, AS_HELP_STRING([--with-rtc-file=FILE], [If RTC is missing, save and restore system clock from this file, default: no]), [rtc_file=$withval], [rtc_file=no]) ### Enable features ########################################################################### # Create config.h from selected features and fallback defaults AS_IF([test "x$enable_auto_reload" = "xyes"], [ AC_DEFINE(AUTO_RELOAD, 1, [Finit automatically does `initctl reload` on any .conf change])]) AS_IF([test "x$enable_kernel_cmdline" = "xyes"], [ AC_DEFINE(KERNEL_CMDLINE, 1, [Dumpster diving after init args from /proc/cmdline])]) AS_IF([test "x$enable_kernel_logging" = "xyes"], [ AC_DEFINE(KERNEL_LOGGING, 1, [Keep kernel warn/err logs to console])]) AS_IF([test "x$enable_cgroup" = "xyes"], [ AC_DEFINE(CGROUP2_ENABLED, 1, [Autodetect cgroup v2 support from /sys/fs/cgroup])]) AS_IF([test "x$enable_libcap" = "xyes"], [ AC_CHECK_LIB([cap], [cap_from_text], [ AC_DEFINE(HAVE_LIBCAP, 1, [Have libcap for Linux capabilities support]) LIBS="$LIBS -lcap" ], [ AC_MSG_WARN([libcap not found, capabilities support disabled]) enable_libcap=no ]) ]) AS_IF([test "x$enable_pam" = "xyes"], [ AS_IF([test "x$enable_static" = "xyes"], [ AS_IF([test "x$pam_explicit" = "xyes"], [ AC_MSG_ERROR([--enable-pam does not work with --enable-static, PAM dlopen()s its modules])], [ AC_MSG_NOTICE([PAM disabled for static build, PAM dlopen()s its modules]) enable_pam=no])]) ]) AS_IF([test "x$enable_pam" = "xyes"], [ AC_CHECK_HEADER([security/pam_appl.h], [], [ AC_MSG_WARN([PAM headers not found, PAM support disabled]) enable_pam=no]) AS_IF([test "x$enable_pam" = "xyes"], [ AC_CHECK_LIB([pam], [pam_start], [ AC_DEFINE(HAVE_LIBPAM, 1, [Have Linux-PAM for per-service session support]) LIBS="$LIBS -lpam" ], [ AC_MSG_WARN([libpam not found, PAM support disabled]) enable_pam=no])]) ]) AS_IF([test "x$enable_fastboot" = "xyes"], [ AC_DEFINE(FAST_BOOT, 1, [Skip fsck check on filesystems listed in /etc/fstab])]) AS_IF([test "x$enable_fsckfix" = "xyes"], [ AC_DEFINE(FSCK_FIX, 1, [Run fsck fix mode (options: -yf) on filesystems listed in /etc/fstab])]) AS_IF([test "x$enable_redirect" = "xyes"], [ AC_DEFINE(REDIRECT_OUTPUT, 1, [Enable redirection of service output to /dev/null])]) ### Disable features ########################################################################### AS_IF([test "x$enable_logrotate" != "xno"], [ AC_DEFINE(LOGROTATE_ENABLED, 1, [Enable built-in rotation of /var/log/wtmp et al.])]) AS_IF([test "x$enable_rescue" != "xno"], [ AC_DEFINE([RESCUE_MODE], 1, [Define to enable support for rescue mode.])]) AM_CONDITIONAL(LOGROTATE, [test "x$enable_logrotate" = "xyes"]) AS_IF([test "x$enable_dbus" = "xyes"], [ AC_DEFINE(HAVE_DBUS, 1, [Build D-Bus support via libink])]) AM_CONDITIONAL(DBUS, [test "x$enable_dbus" = "xyes"]) AM_CONDITIONAL(PAM, [test "x$enable_pam" = "xyes"]) ### With features ############################################################################## AS_IF([test "x$bash_dir" = "xyes"], [ PKG_CHECK_MODULES([BASH_COMPLETION], [bash-completion >= 2.0], [BASH_DIR="$(pkg-config --variable=completionsdir bash-completion)"], [BASH_DIR="$datadir/bash-completion/completions"])], [ BASH_DIR="$bash_dir"]) AS_IF([test "x$with_fstab" != "xno"], [ AS_IF([test "x$fstab" = "xyes"], [fstab=$sysconfdir/fstab]) AC_EXPAND_DIR(fstab_path, "$fstab") AC_DEFINE_UNQUOTED(FINIT_FSTAB, "$fstab_path", [Built-in default: /etc/fstab])],[ AC_DEFINE_UNQUOTED(FINIT_FSTAB, NULL, [No built-in default fstab])]) AS_IF([test "x$with_config" != "xno"], [ AS_IF([test "x$conf" = "xyes"], [ conf=$sysconfdir/finit.conf])]) AC_EXPAND_DIR(conf_path, "$conf") AC_DEFINE_UNQUOTED(FINIT_CONF, "$conf_path", [Main Finit configuration file, default /etc/finit.conf]) AC_SUBST(FINIT_CONF, "$conf_path") AS_IF([test "x$with_rcsd" != "xno"], [ AS_IF([test "x$rcsd" = "xyes"], [ rcsd=$sysconfdir/finit.d])]) AC_EXPAND_DIR(rcsd_path, "$rcsd") AC_DEFINE_UNQUOTED(FINIT_RCSD, "$rcsd_path", [Finit rcS.d/, default /etc/finit.d]) AC_SUBST(FINIT_RCSD, "$rcsd_path") AS_IF([test "x$with_rc_local" != "xno"], [ AS_IF([test "x$rclocal" = "xyes"], [rclocal=$sysconfdir/rc.local]) AC_EXPAND_DIR(rclocal_path, "$rclocal") AC_DEFINE_UNQUOTED(FINIT_RC_LOCAL, "$rclocal_path", [Compat SysV /etc/rc.local file to run last at boot.])]) AS_IF([test "x$with_sysconfig" != "xno"], [ AS_IF([test "x$sysconfig" != "xdefault"], [ AC_EXPAND_DIR(sysconfig_path, "$sysconfig") AC_DEFINE_UNQUOTED(FINIT_SYSCONFIG, "$sysconfig_path", [System environment, default /etc/default & /etc/conf.d])])]) AS_IF([test "x$with_heading" != "xno"], [ AS_IF([test "x$heading" = "xyes"], [heading=""]) AC_DEFINE_UNQUOTED(INIT_OSHEADING, "$heading", [Displayed by Finit at boot, defaults to /etc/os-release PRETTY_NAME])]) AS_IF([test "x$with_group" != "xno"], [ AS_IF([test "x$group" = "xyes"], [ group=root])]) AC_DEFINE_UNQUOTED(DEFGROUP, "$group", [For /run/finit/socket and /run/finit/bus]) AS_IF([test "x$with_hostname" != "xno"], [ AS_IF([test "x$hostname" = "xyes"], [ hostname=noname])]) AC_DEFINE_UNQUOTED(DEFHOST, "$hostname", [For /etc/hostname]) AS_IF([test "x$with_runlevel" != "xno"], [ AS_IF([test "x$runlevel" = "xyes"], [ runlevel=2 AC_DEFINE_UNQUOTED(RUNLEVEL, $runlevel, [Default runlevel to start after S])]) AC_DEFINE_UNQUOTED(RUNLEVEL, $runlevel, [Runlevel to start after S])]) AS_IF([test "x$with_random_seed" != "xno"], [ AS_IF([test "x$random_seed" = "xyes"], [ random_seed=/var/lib/misc/random-seed]) AC_EXPAND_DIR(random_path, "$random_seed") AC_DEFINE_UNQUOTED(RANDOMSEED, "$random_path", [Improve random at boot by seeding it with sth from before.])]) AS_IF([test "x$rtc_date" != "xno"], [ AC_DEFINE_UNQUOTED(RTC_TIMESTAMP_CUSTOM, "$rtc_date", [Custom RTC restore date, default: 2000-01-01 00:00])], [ rtc_date=""]) AS_IF([test "x$rtc_file" != "xno"], [ AS_IF([test "x$rtc_file" = "xyes"], [ rtc_file=/var/lib/misc/rtc]) AC_EXPAND_DIR(rtcfile_path, "$rtc_file") AC_DEFINE_UNQUOTED(RTC_FILE, "$rtcfile_path", [Save and restore system time from this file if /dev/rtc is missing.])],[ AC_DEFINE_UNQUOTED(RTC_FILE, NULL)]) AS_IF([test "x$with_keventd" != "xno"], [ with_keventd=yes PKG_CHECK_MODULES([blkid], [blkid],, [ AC_MSG_ERROR([libblkid (util-linux) is required to build keventd. Install the dev package (e.g. libblkid-dev) or disable keventd with --without-keventd])])]) AS_IF([test "x$with_sulogin" != "xno"], [ AS_IF([test "x$sulogin" = "xyes"], [ sulogin=root]) with_sulogin=yes AC_DEFINE_UNQUOTED(SULOGIN_USER, "$sulogin", [Built-in sulogin user, default: root])], [ sulogin=]) AS_IF([test "x$with_watchdog" != "xno"], [ AS_IF([test "x$watchdog" = "xyes"], [ watchdog=/dev/watchdog]) with_watchdog=yes AC_DEFINE_UNQUOTED(WDT_DEVNODE, "$watchdog", [Built-in watchdog device node])], [ watchdog=]) AS_IF([test "x$with_libsystemd" != "xno"], [ AC_DEFINE(HAVE_LIBSYSTEMD, 1, [Build replacement libsystemd library support])]) AS_IF([test "x$enable_hook_scripts_plugin" != "xno"], [ AS_IF([test "x$hook_scripts_path" = "xyes"], [hook_scripts_path=$libexecdir/finit/hook]) AC_EXPAND_DIR(hook_scripts_path, "$hook_scripts_path") AC_DEFINE_UNQUOTED(PLUGIN_HOOK_SCRIPTS_PATH, "$hook_scripts_path", [Built-in default: $libexecdir/finit])]) AS_IF([test "x$with_plugin_path" != "xno"], [ AS_IF([test "x$plugin_path" = "xyes"], [plugin_path=/usr/lib/finit/plugins:/usr/local/lib/finit/plugins]) AC_EXPAND_DIR(plugin_path, "$plugin_path") AC_DEFINE_UNQUOTED(EXTERNAL_PLUGIN_PATH, "$plugin_path", [Built-in default: /usr/lib/finit/plugins:/usr/local/lib/finit/plugins])]) # Control build with automake flags AM_CONDITIONAL(BASH, [test "x$bash_dir" != "xno"]) AM_CONDITIONAL(STATIC, [test "x$enable_static" = "xyes"]) AM_CONDITIONAL(KEVENTD, [test "x$with_keventd" != "xno"]) AM_CONDITIONAL(UDEV_RULES, [test "x$with_keventd" != "xno" -a "x$with_udev_rules" != "xno"]) AM_CONDITIONAL(SULOGIN, [test "x$with_sulogin" != "xno"]) AM_CONDITIONAL(WATCHDOGD, [test "x$with_watchdog" != "xno"]) AM_CONDITIONAL(LIBSYSTEMD, [test "x$with_libsystemd" != "xno"]) AM_CONDITIONAL(DOC, [test "x$enable_doc" = "xyes"]) AM_CONDITIONAL(CONTRIB, [test "x$enable_contrib" = "xyes"]) AM_CONDITIONAL(TESTSERV, [test "x$enable_testserv_plugin" = "xyes"]) # Workaround for as-of-yet unreleased runstatedir support, planned for # autoconf 2.70, which some major distros have backported. AS_IF([test -z "$runstatedir"], runstatedir="$localstatedir/run") AC_SUBST(runstatedir) # Override default libdir, used for plugins and rescue.conf pkglibdir=$libdir/finit AC_SUBST(pkglibexecdir) AC_EXPAND_DIR(pkglibexecdir, "$libexecdir/finit") AC_DEFINE_UNQUOTED(FINIT_EXECPATH_, "$pkglibexecdir", [Finit libexec path]) AC_EXPAND_DIR(finit_runpath, "$runstatedir/finit/system") AC_DEFINE_UNQUOTED(FINIT_RUNPATH_, "$finit_runpath", [Finit runtime dynamic system services]) AC_EXPAND_DIR(plugin_path, "$pkglibdir/plugins") AC_SUBST(plugin_path) AC_DEFINE_UNQUOTED(PLUGIN_PATH, "$plugin_path", [Finit plugin path]) AC_EXPAND_DIR(tmpfiles_path, "$libdir/tmpfiles.d") AC_SUBST(tmpfiles_path) AC_DEFINE_UNQUOTED(TMPFILES_PATH_, "$tmpfiles_path", [Main tmpfiles.d/, override in /etc]) AC_EXPAND_DIR(finit_tmpfiles, "$pkglibdir/tmpfiles.d") AC_SUBST(finit_tmpfiles) AC_DEFINE_UNQUOTED(FINIT_TMPFILES, "$finit_tmpfiles", [Finit tmpfiles.d/ .conf path]) AC_EXPAND_DIR(system_path, "$pkglibdir/system") AC_SUBST(system_path) AC_DEFINE_UNQUOTED(FINIT_SYSPATH_, "$system_path", [Static services, previously generated at runtime by plugins]) AC_EXPAND_DIR(rescue_conf, "$pkglibdir/rescue.conf") AC_DEFINE_UNQUOTED(RESCUE_CONF, "$rescue_conf", [Finit rescue mode .conf]) AC_EXPAND_DIR(sample_conf, "$pkglibdir/sample.conf") AC_DEFINE_UNQUOTED(SAMPLE_CONF, "$sample_conf", [Finit sameple.conf for initctl create]) AC_EXPAND_DIR(bash_completion_dir, "$BASH_DIR") AC_SUBST(BASH_DIR, "$bash_completion_dir") AS_IF([test "$heading" = ""], [heading=""]) AS_IF([test "$heading" = "no"], [heading=""]) RTC_DATE=$rtc_date AS_IF([test "$rtc_date" = ""], [RTC_DATE=""]) AS_IF([test "$rtc_date" = "no"], [RTC_DATE=""]) # Generate all files AC_OUTPUT cat <