]> git.sur5r.net Git - i3/i3/commitdiff
Switch to autotools (GNU build system)
authorMichael Stapelberg <michael@stapelberg.de>
Fri, 7 Oct 2016 11:48:26 +0000 (13:48 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Sun, 23 Oct 2016 19:09:21 +0000 (21:09 +0200)
This commit probably comes as a surprise to some, given that one of i3’s
explicitly stated goals used to be “Do not use programs such as
autoconf/automake for configuration and creating unreadable/broken makefiles”.

I phrased this goal over 7 years ago, based largely on a grudge that I
inherited, which — as I’ve realized in the meantime — was largely held against
FOSS in general, and not actually nuanced criticism of autotools.

In the meantime, I have come to realize that the knee-jerk reaction of “I could
do this better!” (i.e. writing our own build system in this particular case) is
usually misguided, and nowadays I strongly suggest trying hard to fix the
existing system for the benefit of all existing and future users.

Further, I recently got to experience the other side of the coin, as I packaged
a new version of FreeRADIUS for Debian, which at the time of writing used
autoconf in combination with boilermake, a custom make-based build system that
only FreeRADIUS uses. Understanding the build system enough to fix issues and
enable parallel compilation took me an entire day. That time is time which
potentially every downstream maintainer needs to invest, and the resulting
knowledge cannot be applied to any other project.

Hence, I believe it’s a good idea switch i3 to autotools. Yes, it might be that
particular features were easier to implement/understand in our custom
Makefiles, and there might be individuals who have an easier time reading
through our custom Makefiles than learning autotools. All of these
considerations are outweighed by the benefits we get from using the same build
system as literally thousands of other FOSS software packages.

Aside from these somewhat philosophical considerations, there’s also practical
improvements which this change brings us. See the “changes” section below.

┌──────────────────────────────────────────────────────────────────────────────┐
│ new workflow                                                                 │
└──────────────────────────────────────────────────────────────────────────────┘

You can now build i3 like you build any other software package which uses
autotools. Here’s a memory refresher:

    autoreconf -fi
    mkdir -p build && cd build
    ../configure
    make -j8

(The autoreconf -fi step is unnecessary if you are building from a release
 tarball, but shouldn’t hurt either.)

┌──────────────────────────────────────────────────────────────────────────────┐
│ recommended reading                                                          │
└──────────────────────────────────────────────────────────────────────────────┘

I very much recommend reading “A Practitioner's Guide to GNU Autoconf,
Automake, and Libtool” by John Calcote (https://www.nostarch.com/autotools.htm).
That book is from 2010 and, AFAICT, is the most up to date comprehensive
description of autotools. Do not read older documentation. In particular, if a
document you’re reading mentions configure.in (deprecated filename) or
recursive make (now considered harmful), it’s likely outdated.

┌──────────────────────────────────────────────────────────────────────────────┐
│ changes                                                                      │
└──────────────────────────────────────────────────────────────────────────────┘

This commit implements the following new functionality/changes in behavior:

• We use the AX_ENABLE_BUILDDIR macro to enforce builds happening in a separate
  directory. This is a prerequisite for the AX_EXTEND_SRCDIR macro and building
  in a separate directory is common practice anyway. In case this causes any
  trouble when packaging i3 for your distribution, please let me know.

• “make check” runs the i3 testsuite.
  You can still use ./testcases/complete-run.pl to get the interactive progress
  output.

• “make distcheck” (runs testsuite on “make dist” result, tiny bit quicker
  feedback cycle than waiting for the travis build to catch the issue).

• “make uninstall” (occasionally requested by users who compile from source)

• “make” will build manpages/docs by default if the tools are installed.
  Conversely, manpages/docs are not tried to be built for users who don’t want
  to install all these dependencies to get started hacking on i3.

• non-release builds will enable address sanitizer by default. Use the
  --disable-sanitizers configure option to turn off all sanitizers, and see
  --help for available sanitizers.

• Support for pre-compiled headers (PCH) has been dropped for now in the
  interest of simplicitly. Maybe we can re-add it later.

• coverage reports are now generated using “make check-code-coverage”, which
  requires specifying --enable-code-coverage when calling configure.

┌──────────────────────────────────────────────────────────────────────────────┐
│ build system feature parity/testing                                          │
└──────────────────────────────────────────────────────────────────────────────┘

In addition to what’s described above, I tested the following features:

• “make install” installs the same files (plus documentation and manpages)
  cd i3-old && make install PREFIX=/tmp/inst/old
  cd i3-new && ./configure --prefix=/tmp/inst/new
  cd /tmp/inst
  (cd old && for f in $(find); do [ -e "../new/$f" ] || echo "$f missing"; done)

• make dist generates a tarball which includes the same files
  cd i3-old && make dist
  cd i3-new/x86_64-pc-linux-gnu && make dist
  colordiff -u <(tar tf i3-old/i3-4.12.tar.bz2 | sort) \
               <(tar tf i3-new/x86_64-pc-linux-gnu/i3-4.12.tar.gz | sort)
  There are some expected differences:
  • Some files have been renamed (e.g. the new etc/ and share/ subdirectories)
  • Some files will now be generated at build-time, so only their corresponding
    .in file is shipped (e.g. testcases/complete-run.pl)
  • The generated parser files are shipped in the dist tarball (they only
    depend on the parser-specs/* files, not on the target system)
  • autotools infrastructure is shipped (e.g. “configure”, “missing”, etc.)

• DLOG and ELOG statements still produce the same file name in logfiles

• Listing source code in gdb still works.

• gdb backtraces contain the i3-<version> path component

• release.sh still works

• version embedding
  1. git checkout shows “4.12-136-gf720023 (2016-10-10, branch "autotools")”
  2. tarball of a git version shows “4.12-non-git”
  3. release tarball shows 4.13

• debug mode is enabled by default for non-release builds

• enabling verbose builds via V=1

┌──────────────────────────────────────────────────────────────────────────────┐
│ speed                                                                        │
└──────────────────────────────────────────────────────────────────────────────┘

There is no noticeable difference in compilation speed itself (of binaries,
documentation and manpages):

i3-old $ time make all docs mans -j8
make all docs mans -j8  28.92s user 2.15s system 640% cpu 4.852 total

i3-new $ time make -j8
make -j8  27.08s user 1.92s system 620% cpu 4.669 total

In terms of one-time costs:
configuring the build system (../configure) takes about 2.7s on my machine,
generating the build system (autoreconf -fi) takes about 3.1s on my machine.

┌──────────────────────────────────────────────────────────────────────────────┐
│ m4 macros                                                                    │
└──────────────────────────────────────────────────────────────────────────────┘

All files in m4/ have been copied from the autoconf-archive package in version
b6aeb1988f4b6c78bf39d97b6c4f6e1d594d59b9 and should be updated whenever they
change.

This commit has been tested with autoconf 2.69 and automake 1.15.

37 files changed:
Makefile [deleted file]
Makefile.am [new file with mode: 0644]
common.mk [deleted file]
configure.ac [new file with mode: 0644]
docs/Makefile [deleted file]
docs/docs.mk [deleted file]
i3-config-wizard/Makefile [deleted file]
i3-config-wizard/i3-config-wizard.mk [deleted file]
i3-dump-log/Makefile [deleted file]
i3-dump-log/i3-dump-log.mk [deleted file]
i3-input/Makefile [deleted file]
i3-input/i3-input.mk [deleted file]
i3-msg/Makefile [deleted file]
i3-msg/i3-msg.mk [deleted file]
i3-nagbar/Makefile [deleted file]
i3-nagbar/i3-nagbar.mk [deleted file]
i3bar/Makefile [deleted file]
i3bar/i3bar.mk [deleted file]
libi3/Makefile [deleted file]
libi3/libi3.mk [deleted file]
m4/ax_append_flag.m4 [new file with mode: 0644]
m4/ax_cflags_warn_all.m4 [new file with mode: 0644]
m4/ax_check_compile_flag.m4 [new file with mode: 0644]
m4/ax_check_enable_debug.m4 [new file with mode: 0644]
m4/ax_check_gnu_make.m4 [new file with mode: 0644]
m4/ax_check_link_flag.m4 [new file with mode: 0644]
m4/ax_code_coverage.m4 [new file with mode: 0644]
m4/ax_configure_args.m4 [new file with mode: 0644]
m4/ax_enable_builddir.m4 [new file with mode: 0644]
m4/ax_extend_srcdir.m4 [new file with mode: 0644]
m4/ax_pthread.m4 [new file with mode: 0644]
m4/ax_require_defined.m4 [new file with mode: 0644]
m4/ax_sanitizers.m4 [new file with mode: 0644]
man/Makefile [deleted file]
man/man.mk [deleted file]
src/Makefile [deleted file]
src/i3.mk [deleted file]

diff --git a/Makefile b/Makefile
deleted file mode 100644 (file)
index c08f277..0000000
--- a/Makefile
+++ /dev/null
@@ -1,70 +0,0 @@
-TOPDIR=$(shell pwd)
-
-include $(TOPDIR)/common.mk
-
-SUBDIRS:=
-
-ALL_TARGETS =
-INSTALL_TARGETS =
-CLEAN_TARGETS =
-DISTCLEAN_TARGETS =
-
-all: real-all
-
-include libi3/libi3.mk
-include src/i3.mk
-include i3-config-wizard/i3-config-wizard.mk
-include i3-msg/i3-msg.mk
-include i3-input/i3-input.mk
-include i3-nagbar/i3-nagbar.mk
-include i3bar/i3bar.mk
-include i3-dump-log/i3-dump-log.mk
-include docs/docs.mk
-include man/man.mk
-
-# Update $(TOPDIR)/LAST_VERSION if it differs from $I3_VERSION
-CACHED_VERSION := '$(shell [ -f $(TOPDIR)/LAST_VERSION ] && cat $(TOPDIR)/LAST_VERSION)'
-ifneq ($(CACHED_VERSION),$(I3_VERSION))
-$(shell echo -n ${I3_VERSION} > $(TOPDIR)/LAST_VERSION)
-endif
-
-real-all: $(ALL_TARGETS)
-
-install: $(INSTALL_TARGETS)
-
-store_git_version:
-       echo -n ${I3_VERSION} > I3_VERSION
-
-dist: distclean
-       [ ! -d i3-${VERSION} ] || rm -rf i3-${VERSION}
-       [ ! -e i3-${VERSION}.tar.bz2 ] || rm i3-${VERSION}.tar.bz2
-       mkdir i3-${VERSION}
-       cp i3-migrate-config-to-v4 i3-save-tree generate-command-parser.pl i3-sensible-* i3-dmenu-desktop i3.config.keycodes DEPENDS LICENSE PACKAGE-MAINTAINER RELEASE-NOTES-${VERSION} i3.config i3.xsession.desktop i3-with-shmlog.xsession.desktop i3.applications.desktop pseudo-doc.doxygen common.mk Makefile i3-${VERSION}
-       cp -r src libi3 i3-msg i3-nagbar i3-config-wizard i3bar i3-dump-log include man parser-specs testcases i3-${VERSION}
-       # Only copy toplevel documentation (important stuff)
-       mkdir i3-${VERSION}/docs
-       # Pre-generate documentation
-       $(MAKE) docs
-       # Cleanup τεχ output files
-       find docs -regex ".*\.\(aux\|out\|log\|toc\|bm\|dvi\|log\)" -exec rm '{}' \;
-       find docs -maxdepth 1 -type f ! \( -name "*.xcf" -or -name "*.svg" \) -exec cp '{}' i3-${VERSION}/docs \;
-       # Only copy source code from i3-input
-       mkdir i3-${VERSION}/i3-input
-       find i3-input -maxdepth 1 -type f \( -name "*.c" -or -name "*.mk" -or -name "*.h" -or -name "Makefile" \) -exec cp '{}' i3-${VERSION}/i3-input \;
-       cp I3_VERSION i3-${VERSION}/I3_VERSION
-       # Pre-generate a manpage to allow distributors to skip this step and save some dependencies
-       $(MAKE) mans
-       cp man/*.1 i3-${VERSION}/man/
-       tar cfj i3-${VERSION}.tar.bz2 i3-${VERSION}
-       rm -rf i3-${VERSION}
-
-clean: $(CLEAN_TARGETS)
-       (which lcov >/dev/null 2>&1 && lcov -d . --zerocounters) || true
-
-distclean: clean $(DISTCLEAN_TARGETS)
-
-coverage:
-       rm -f /tmp/i3-coverage.info
-       rm -rf /tmp/i3-coverage
-       lcov -d . -b . --capture -o /tmp/i3-coverage.info
-       genhtml -o /tmp/i3-coverage/ /tmp/i3-coverage.info
diff --git a/Makefile.am b/Makefile.am
new file mode 100644 (file)
index 0000000..7bba241
--- /dev/null
@@ -0,0 +1,560 @@
+@CODE_COVERAGE_RULES@
+
+bin_PROGRAMS = \
+       i3 \
+       i3bar/i3bar \
+       i3-config-wizard/i3-config-wizard \
+       i3-dump-log/i3-dump-log \
+       i3-input/i3-input \
+       i3-msg/i3-msg \
+       i3-nagbar/i3-nagbar
+
+install-exec-hook:
+       $(LN_S) -f i3 $(DESTDIR)$(bindir)/i3-with-shmlog
+
+uninstall-hook:
+       rm -f $(DESTDIR)$(bindir)/i3-with-shmlog
+
+i3includedir=$(includedir)/i3
+i3include_HEADERS = \
+       include/i3/ipc.h
+
+dist_bin_SCRIPTS = \
+       i3-dmenu-desktop \
+       i3-migrate-config-to-v4 \
+       i3-save-tree \
+       i3-sensible-editor \
+       i3-sensible-pager \
+       i3-sensible-terminal
+
+i3confdir = $(sysconfdir)/i3
+dist_i3conf_DATA = \
+       etc/config \
+       etc/config.keycodes
+
+applicationsdir = $(datarootdir)/applications
+xsessionsdir = $(datarootdir)/xsessions
+dist_applications_DATA = \
+       share/applications/i3.desktop
+dist_xsessions_DATA = \
+       share/xsessions/i3.desktop \
+       share/xsessions/i3-with-shmlog.desktop
+
+noinst_LIBRARIES = libi3.a
+
+check_PROGRAMS = test.commands_parser test.config_parser
+
+check_SCRIPTS = \
+       testcases/complete-run.pl
+
+clean-check:
+       rm -rf testsuite-* latest i3-cfg-for-* _Inline
+clean-local: clean-check
+
+TESTS = testcases/complete-run.pl
+
+EXTRA_DIST = \
+       $(dist_docs_toc_DATA:.html=) \
+       $(dist_docs_notoc_DATA:.html=) \
+       docs/asciidoc-git.conf \
+       docs/bigpicture.png \
+       docs/i3-pod2html \
+       docs/i3-sync.dia \
+       docs/i3-sync.png \
+       docs/i3-sync-working.dia \
+       docs/i3-sync-working.png \
+       docs/keyboard-layer1.png \
+       docs/keyboard-layer2.png \
+       docs/layout-saving-1.png \
+       docs/logo-30.png \
+       docs/modes.png \
+       docs/refcard.html \
+       docs/refcard_style.css \
+       docs/single_terminal.png \
+       docs/snapping.png \
+       docs/tree-layout1.png \
+       docs/tree-layout2.png \
+       docs/tree-shot1.png \
+       docs/tree-shot2.png \
+       docs/tree-shot3.png \
+       docs/tree-shot4.png \
+       docs/two_columns.png \
+       docs/two_terminals.png \
+       docs/wsbar.dia \
+       docs/wsbar.png \
+       i3bar/LICENSE \
+       libi3/README \
+       $(asciidoc_MANS:.1=.man) \
+       $(asciidoc_MANS:.1=.man) \
+       man/asciidoc.conf \
+       DEPENDS \
+       I3_VERSION \
+       LICENSE \
+       PACKAGE-MAINTAINER \
+       RELEASE-NOTES-4.12 \
+       generate-command-parser.pl \
+       parser-specs/commands.spec \
+       parser-specs/config.spec \
+       parser-specs/highlighting.vim \
+       pseudo-doc.doxygen \
+       testcases/complete-run.pl.in \
+       testcases/i3-test.config \
+       testcases/lib/i3test/Test.pm \
+       testcases/lib/i3test/Util.pm \
+       testcases/lib/i3test/XTEST.pm \
+       testcases/lib/i3test.pm.in \
+       testcases/lib/SocketActivation.pm \
+       testcases/lib/StartXServer.pm \
+       testcases/lib/StatusLine.pm \
+       testcases/lib/TestWorker.pm \
+       testcases/Makefile.PL \
+       testcases/new-test \
+       testcases/restart-state.golden \
+       testcases/t \
+       testcases/valgrind.supp
+
+# dirstamps contains directories which we want to be created in $(top_builddir)
+# so that our custom rules can store files in them.
+dirstamp = .dirstamp
+dirstamps = \
+       docs/$(dirstamp) \
+       man/$(dirstamp) \
+       parser/$(dirstamp)
+DISTCLEANFILES = $(dirstamps)
+
+$(dirstamps):
+       @stamp='$@'; $(MKDIR_P) "$${stamp%/*}"
+       @: > $@
+
+################################################################################
+# docs generation
+################################################################################
+
+docs_tocdir = ${docdir}
+docs_notocdir = ${docdir}
+docs_poddir = ${docdir}
+if BUILD_DOCS
+dist_docs_toc_DATA = \
+       docs/hacking-howto.html \
+       docs/userguide.html \
+       docs/ipc.html \
+       docs/multi-monitor.html \
+       docs/wsbar.html \
+       docs/testsuite.html \
+       docs/i3bar-protocol.html \
+       docs/layout-saving.html
+
+dist_docs_notoc_DATA = \
+       docs/debugging.html
+
+dist_docs_pod_DATA = \
+       docs/lib-i3test.html \
+       docs/lib-i3test-test.html
+
+$(dist_docs_toc_DATA): docs/%.html: docs/% docs/$(dirstamp)
+       $(AM_V_GEN) @PATH_ASCIIDOC@ -a toc -n -o $@ $<
+
+$(dist_docs_notoc_DATA): docs/%.html: docs/% docs/$(dirstamp)
+       $(AM_V_GEN) @PATH_ASCIIDOC@ -n -o $@ $<
+
+docs/lib-i3test.html: testcases/lib/i3test.pm docs/$(dirstamp)
+       $(AM_V_GEN) $(top_srcdir)/docs/i3-pod2html $< $@
+
+docs/lib-i3test-test.html: testcases/lib/i3test/Test.pm docs/$(dirstamp)
+       $(AM_V_GEN) $(top_srcdir)/docs/i3-pod2html $< $@
+
+else
+dist_docs_toc_DATA =
+dist_docs_notoc_DATA =
+dist_docs_pod_DATA =
+endif
+
+################################################################################
+# manpage generation
+################################################################################
+
+if BUILD_MANS
+dist_man1_MANS = \
+       $(asciidoc_MANS) \
+       $(pod_MANS)
+
+asciidoc_MANS = \
+       man/i3.1 \
+       man/i3bar.1 \
+       man/i3-msg.1 \
+       man/i3-input.1 \
+       man/i3-nagbar.1 \
+       man/i3-config-wizard.1 \
+       man/i3-migrate-config-to-v4.1 \
+       man/i3-sensible-editor.1 \
+       man/i3-sensible-pager.1 \
+       man/i3-sensible-terminal.1 \
+       man/i3-dump-log.1
+
+pod_MANS = \
+       man/i3-dmenu-desktop.1 \
+       man/i3-save-tree.1
+
+$(asciidoc_MANS): man/%.1: man/%.xml man/$(dirstamp)
+       $(AM_V_GEN) out='$@'; @PATH_XMLTO@ man -o "$${out%/*}" $<
+       @stamp='$@'; $(MKDIR_P) "$${stamp%/*}"
+
+man/%.xml: man/%.man man/asciidoc.conf man/$(dirstamp)
+       $(AM_V_GEN) @PATH_ASCIIDOC@ -d manpage -b docbook -f $(top_srcdir)/man/asciidoc.conf -o $@ $<
+
+$(pod_MANS): man/%.1: % man/$(dirstamp)
+       $(AM_V_GEN) @PATH_POD2MAN@ --utf8 $< > $@
+else
+asciidoc_MANS =
+endif
+
+AM_CPPFLAGS = \
+       -I$(top_builddir)/parser \
+       -I$(top_srcdir)/include \
+       @AX_EXTEND_SRCDIR_CPPFLAGS@
+
+i3_CFLAGS = \
+       $(AM_CFLAGS) \
+       $(libi3_CFLAGS) \
+       $(LIBSN_CFLAGS) \
+       $(XCB_CFLAGS) \
+       $(XCB_UTIL_CURSOR_CFLAGS) \
+       $(XCB_UTIL_KEYSYM_CFLAGS) \
+       $(XCB_UTIL_WM_CFLAGS) \
+       $(XCB_UTIL_XRM_CFLAGS) \
+       $(XKBCOMMON_CFLAGS) \
+       $(YAJL_CFLAGS) \
+       $(LIBPCRE_CFLAGS) \
+       $(PTHREAD_CFLAGS) \
+       $(CODE_COVERAGE_CFLAGS)
+
+i3_CPPFLAGS = \
+       $(AM_CPPFLAGS) \
+       $(CODE_COVERAGE_CPPFLAGS)
+
+i3_LDADD = \
+       $(libi3_LIBS) \
+       $(LIBSN_LIBS) \
+       $(XCB_LIBS) \
+       $(XCB_UTIL_CURSOR_LIBS) \
+       $(XCB_UTIL_KEYSYMS_LIBS) \
+       $(XCB_UTIL_WM_LIBS) \
+       $(XCB_UTIL_XRM_LIBS) \
+       $(XKBCOMMON_LIBS) \
+       $(YAJL_LIBS) \
+       $(LIBPCRE_LIBS) \
+       $(PANGOCAIRO_LIBS) \
+       $(PTHREAD_LIBS) \
+       $(CODE_COVERAGE_LDFLAGS)
+
+libi3_CFLAGS = \
+       $(AM_CFLAGS) \
+       $(XCB_CFLAGS) \
+       $(XCB_UTIL_CFLAGS) \
+       $(XCB_UTIL_XRM_CFLAGS) \
+       $(YAJL_CFLAGS) \
+       $(PANGOCAIRO_CFLAGS)
+
+libi3_LIBS = \
+       $(top_builddir)/libi3.a \
+       $(XCB_LIBS) \
+       $(XCB_UTIL_LIBS) \
+       $(XCB_UTIL_XRM_LIBS) \
+       $(YAJL_LIBS) \
+       $(PANGOCAIRO_LIBS)
+
+libi3_a_CFLAGS = \
+       $(libi3_CFLAGS)
+
+libi3_a_SOURCES = \
+       include/libi3.h \
+       libi3/dpi.c \
+       libi3/draw_util.c \
+       libi3/fake_configure_notify.c \
+       libi3/font.c \
+       libi3/format_placeholders.c \
+       libi3/get_colorpixel.c \
+       libi3/get_config_path.c \
+       libi3/get_exe_path.c \
+       libi3/get_mod_mask.c \
+       libi3/get_process_filename.c \
+       libi3/get_visualtype.c \
+       libi3/ipc_connect.c \
+       libi3/ipc_recv_message.c \
+       libi3/ipc_send_message.c \
+       libi3/is_debug_build.c \
+       libi3/mkdirp.c \
+       libi3/resolve_tilde.c \
+       libi3/root_atom_contents.c \
+       libi3/safewrappers.c \
+       libi3/string.c \
+       libi3/strndup.c \
+       libi3/ucs2_conversion.c
+
+i3_dump_log_i3_dump_log_CFLAGS = \
+       $(AM_CFLAGS) \
+       $(PTHREAD_CFLAGS) \
+       $(libi3_CFLAGS)
+
+i3_dump_log_i3_dump_log_LDADD = \
+       $(PTHREAD_LIBS) \
+       $(libi3_LIBS)
+
+i3_dump_log_i3_dump_log_SOURCES = \
+       i3-dump-log/main.c
+
+i3_input_i3_input_CFLAGS = \
+       $(AM_CFLAGS) \
+       $(libi3_CFLAGS)
+
+i3_input_i3_input_LDADD = \
+       $(libi3_LIBS) \
+       $(XCB_UTIL_KEYSYMS_LIBS)
+
+i3_input_i3_input_SOURCES = \
+       i3-input/i3-input.h \
+       i3-input/keysym2ucs.c \
+       i3-input/keysym2ucs.h \
+       i3-input/main.c
+
+i3_msg_i3_msg_CFLAGS = \
+       $(AM_CFLAGS) \
+       $(libi3_CFLAGS)
+
+i3_msg_i3_msg_LDADD = \
+       $(libi3_LIBS)
+
+i3_msg_i3_msg_SOURCES = \
+       i3-msg/main.c
+
+i3_nagbar_i3_nagbar_CFLAGS = \
+       $(AM_CFLAGS) \
+       $(libi3_CFLAGS)
+
+i3_nagbar_i3_nagbar_LDADD = \
+       $(libi3_LIBS) \
+       $(XCB_UTIL_CURSOR_LIBS)
+
+i3_nagbar_i3_nagbar_SOURCES = \
+       i3-nagbar/atoms.xmacro \
+       i3-nagbar/i3-nagbar.h \
+       i3-nagbar/main.c
+
+i3bar_i3bar_CPPFLAGS = \
+       $(AM_CPPFLAGS) \
+       -I$(top_srcdir)/i3bar/include
+
+i3bar_i3bar_CFLAGS = \
+       $(AM_CFLAGS) \
+       $(libi3_CFLAGS) \
+       $(XCB_CFLAGS) \
+       $(XKBCOMMON_CFLAGS) \
+       $(PANGOCAIRO_CFLAGS) \
+       $(YAJL_CFLAGS)
+
+i3bar_i3bar_LDADD = \
+       $(libi3_LIBS) \
+       $(XCB_LIBS) \
+       $(XCB_UTIL_CURSOR_LIBS) \
+       $(XKBCOMMON_LIBS) \
+       $(PANGOCAIRO_LIBS) \
+       $(YAJL_LIBS)
+
+i3bar_i3bar_SOURCES = \
+       i3bar/include/child.h \
+       i3bar/include/common.h \
+       i3bar/include/configuration.h \
+       i3bar/include/ipc.h \
+       i3bar/include/mode.h \
+       i3bar/include/outputs.h \
+       i3bar/include/parse_json_header.h \
+       i3bar/include/trayclients.h \
+       i3bar/include/util.h \
+       i3bar/include/workspaces.h \
+       i3bar/include/xcb_atoms.def \
+       i3bar/include/xcb.h \
+       i3bar/src/child.c \
+       i3bar/src/config.c \
+       i3bar/src/ipc.c \
+       i3bar/src/main.c \
+       i3bar/src/mode.c \
+       i3bar/src/outputs.c \
+       i3bar/src/parse_json_header.c \
+       i3bar/src/workspaces.c \
+       i3bar/src/xcb.c
+
+i3_config_wizard_i3_config_wizard_CFLAGS = \
+       $(AM_CFLAGS) \
+       $(libi3_CFLAGS) \
+       $(XKBCOMMON_CFLAGS)
+
+i3_config_wizard_i3_config_wizard_LDADD = \
+       $(libi3_LIBS) \
+       $(XCB_UTIL_KEYSYMS_LIBS) \
+       $(XKBCOMMON_LIBS)
+
+i3_config_wizard_i3_config_wizard_SOURCES = \
+       i3-config-wizard/atoms.xmacro \
+       i3-config-wizard/main.c \
+       i3-config-wizard/xcb.h
+
+test_commands_parser_CPPFLAGS = \
+       $(AM_CPPFLAGS) \
+       -DTEST_PARSER
+
+test_commands_parser_CFLAGS = \
+       $(AM_CFLAGS) \
+       $(i3_CFLAGS)
+
+test_commands_parser_SOURCES = \
+       src/commands_parser.c
+
+test_commands_parser_LDADD = \
+       $(i3_LDADD)
+
+test_config_parser_CPPFLAGS = \
+       $(AM_CPPFLAGS) \
+       -DTEST_PARSER
+
+test_config_parser_CFLAGS = \
+       $(AM_CFLAGS) \
+       $(i3_CFLAGS)
+
+test_config_parser_SOURCES = \
+       src/config_parser.c
+
+test_config_parser_LDADD = \
+       $(i3_LDADD)
+
+command_parser_SOURCES = \
+       parser/GENERATED_command_enums.h \
+       parser/GENERATED_command_tokens.h \
+       parser/GENERATED_command_call.h
+
+config_parser_SOURCES = \
+       parser/GENERATED_config_enums.h \
+       parser/GENERATED_config_tokens.h \
+       parser/GENERATED_config_call.h
+
+i3_SOURCES = \
+       $(command_parser_SOURCES) \
+       $(config_parser_SOURCES) \
+       include/all.h \
+       include/assignments.h \
+       include/atoms_NET_SUPPORTED.xmacro \
+       include/atoms_rest.xmacro \
+       include/atoms.xmacro \
+       include/bindings.h \
+       include/click.h \
+       include/cmdparse.h \
+       include/commands.h \
+       include/commands_parser.h \
+       include/config_directives.h \
+       include/configuration.h \
+       include/config_parser.h \
+       include/con.h \
+       include/data.h \
+       include/debug.h \
+       include/display_version.h \
+       include/ewmh.h \
+       include/fake_outputs.h \
+       include/floating.h \
+       include/handlers.h \
+       include/i3.h \
+       include/ipc.h \
+       include/key_press.h \
+       include/load_layout.h \
+       include/log.h \
+       include/main.h \
+       include/manage.h \
+       include/match.h \
+       include/move.h \
+       include/output.h \
+       include/queue.h \
+       include/randr.h \
+       include/regex.h \
+       include/render.h \
+       include/resize.h \
+       include/restore_layout.h \
+       include/scratchpad.h \
+       include/sd-daemon.h \
+       include/shmlog.h \
+       include/sighandler.h \
+       include/startup.h \
+       include/tree.h \
+       include/util.h \
+       include/window.h \
+       include/workspace.h \
+       include/xcb.h \
+       include/xcursor.h \
+       include/x.h \
+       include/xinerama.h \
+       include/yajl_utils.h \
+       src/assignments.c \
+       src/bindings.c \
+       src/click.c \
+       src/commands.c \
+       src/commands_parser.c \
+       src/con.c \
+       src/config.c \
+       src/config_directives.c \
+       src/config_parser.c \
+       src/debug.c \
+       src/display_version.c \
+       src/ewmh.c \
+       src/fake_outputs.c \
+       src/floating.c \
+       src/handlers.c \
+       src/ipc.c \
+       src/key_press.c \
+       src/load_layout.c \
+       src/log.c \
+       src/main.c \
+       src/manage.c \
+       src/match.c \
+       src/move.c \
+       src/output.c \
+       src/randr.c \
+       src/regex.c \
+       src/render.c \
+       src/resize.c \
+       src/restore_layout.c \
+       src/scratchpad.c \
+       src/sd-daemon.c \
+       src/sighandler.c \
+       src/startup.c \
+       src/tree.c \
+       src/util.c \
+       src/version.c \
+       src/window.c \
+       src/workspace.c \
+       src/x.c \
+       src/xcb.c \
+       src/xcursor.c \
+       src/xinerama.c
+
+################################################################################
+# parser generation
+################################################################################
+
+$(command_parser_SOURCES): %.h: i3-command-parser.stamp
+
+$(config_parser_SOURCES): %.h: i3-config-parser.stamp
+
+src/i3-commands_parser.$(OBJEXT): i3-command-parser.stamp
+
+src/i3-config_parser.$(OBJEXT): i3-config-parser.stamp
+
+i3-command-parser.stamp: parser/$(dirstamp) generate-command-parser.pl parser-specs/commands.spec
+       $(AM_V_GEN) $(top_srcdir)/generate-command-parser.pl --input=$(top_srcdir)/parser-specs/commands.spec --prefix=command
+       $(AM_V_at) mv GENERATED_command_* $(top_builddir)/parser
+       $(AM_V_at) touch $@
+
+i3-config-parser.stamp: parser/$(dirstamp) generate-command-parser.pl parser-specs/config.spec
+       $(AM_V_GEN) $(top_srcdir)/generate-command-parser.pl --input=$(top_srcdir)/parser-specs/config.spec --prefix=config
+       $(AM_V_at) mv GENERATED_config_* $(top_builddir)/parser
+       $(AM_V_at) touch $@
+
+CLEANFILES = \
+       i3-command-parser.stamp \
+       i3-config-parser.stamp
diff --git a/common.mk b/common.mk
deleted file mode 100644 (file)
index 6032ce6..0000000
--- a/common.mk
+++ /dev/null
@@ -1,218 +0,0 @@
-UNAME=$(shell uname)
-DEBUG=1
-ASAN=0
-INSTALL=install
-LN=ln
-PKG_CONFIG=pkg-config
-ifndef PREFIX
-  PREFIX=/usr
-endif
-ifndef EXEC_PREFIX
-  EXEC_PREFIX=$(PREFIX)
-endif
-ifndef SYSCONFDIR
-  ifeq ($(PREFIX),/usr)
-    SYSCONFDIR=/etc
-  else
-    SYSCONFDIR=$(PREFIX)/etc
-  endif
-endif
-
-# In dist and snapshot tarballs, use the I3_VERSION and VERSION files. Otherwise use git information.
-ifeq ($(wildcard .git),)
-  # not in git repository
-  VERSION := $(shell [ -f $(TOPDIR)/I3_VERSION ] && cat $(TOPDIR)/I3_VERSION | cut -d '-' -f 1)
-  I3_VERSION := '$(shell [ -f $(TOPDIR)/I3_VERSION ] && cat $(TOPDIR)/I3_VERSION)'
-else
-  VERSION := $(shell git describe --tags --abbrev=0)
-  I3_VERSION := '$(shell git describe --tags --always) ($(shell git log --pretty=format:%cd --date=short -n1), branch \"$(shell git describe --tags --always --all | sed s:heads/::)\")'
-endif
-
-MAJOR_VERSION := $(shell echo ${VERSION} | cut -d '.' -f 1)
-MINOR_VERSION := $(shell echo ${VERSION} | cut -d '.' -f 2)
-PATCH_VERSION := $(shell echo ${VERSION} | cut -d '.' -f 3)
-ifeq (${PATCH_VERSION},)
-PATCH_VERSION := 0
-endif
-
-## Generic flags
-
-# Default CFLAGS that users should be able to override
-ifeq ($(DEBUG),1)
-# Extended debugging flags, macros shall be available in gcc
-CFLAGS ?= -pipe -gdwarf-2 -g3
-else
-CFLAGS ?= -pipe -O2 -freorder-blocks-and-partition
-endif
-
-ifeq ($(ASAN),1)
-CFLAGS += -fsanitize=address -DI3_ASAN_ENABLED
-LDFLAGS += -fsanitize=address
-endif
-
-# Default LDFLAGS that users should be able to override
-LDFLAGS ?= $(as_needed_LDFLAG)
-
-# Common CFLAGS for all i3 related binaries
-I3_CFLAGS  = -std=c99
-I3_CFLAGS += -Wall
-# unused-function, unused-label, unused-variable are turned on by -Wall
-# We don’t want unused-parameter because of the use of many callbacks
-I3_CFLAGS += -Wunused-value
-I3_CFLAGS += -Iinclude
-
-I3_CPPFLAGS  = -DI3_VERSION=\"${I3_VERSION}\"
-I3_CPPFLAGS += -DMAJOR_VERSION=${MAJOR_VERSION}
-I3_CPPFLAGS += -DMINOR_VERSION=${MINOR_VERSION}
-I3_CPPFLAGS += -DPATCH_VERSION=${PATCH_VERSION}
-I3_CPPFLAGS += -DSYSCONFDIR=\"${SYSCONFDIR}\"
-I3_CPPFLAGS += -DI3__FILE__=__FILE__
-
-
-## Libraries flags
-
-ifeq ($(shell which $(PKG_CONFIG) 2>/dev/null 1>/dev/null || echo 1),1)
-$(error "pkg-config was not found")
-endif
-
-# An easier way to get CFLAGS and LDFLAGS falling back in case there's
-# no pkg-config support for certain libraries.
-#
-# NOTE that you must not use a blank after comma when calling this:
-#     $(call ldflags_for_lib name, fallback) # bad
-#     $(call ldflags_for_lib name,fallback) # good
-# Otherwise, the compiler will get -l foo instead of -lfoo
-#
-# We redirect stderr to /dev/null because pkg-config prints an error if support
-# for gnome-config was enabled but gnome-config is not actually installed.
-cflags_for_lib = $(shell $(PKG_CONFIG) --silence-errors --cflags $(1) 2>/dev/null)
-ldflags_for_lib = $(shell $(PKG_CONFIG) --exists 2>/dev/null $(1) && $(PKG_CONFIG) --libs $(1) 2>/dev/null || echo -l$(2))
-
-# XCB common stuff
-XCB_CFLAGS  := $(call cflags_for_lib, xcb)
-XCB_CFLAGS  += $(call cflags_for_lib, xcb-event)
-XCB_LIBS    := $(call ldflags_for_lib, xcb,xcb)
-XCB_LIBS    += $(call ldflags_for_lib, xcb-event,xcb-event)
-XCB_CFLAGS  += $(call cflags_for_lib, xcb-util)
-XCB_LIBS    += $(call ldflags_for_lib, xcb-util)
-ifneq ($(shell $(PKG_CONFIG) --atleast-version=0.3.8 xcb-util 2>/dev/null && echo 1),1)
-$(error "xcb-util >= 0.3.8 not found")
-endif
-XCB_XKB_LIBS := $(call ldflags_for_lib, xcb-xkb,xcb-xkb)
-
-# XCB keyboard stuff
-XCB_KBD_CFLAGS := $(call cflags_for_lib, xcb-keysyms)
-XCB_KBD_LIBS   := $(call ldflags_for_lib, xcb-keysyms,xcb-keysyms)
-
-# XCB WM stuff
-XCB_WM_CFLAGS := $(call cflags_for_lib, xcb-icccm)
-XCB_WM_CFLAGS += $(call cflags_for_lib, xcb-xinerama)
-XCB_WM_CFLAGS += $(call cflags_for_lib, xcb-randr)
-XCB_WM_LIBS   := $(call ldflags_for_lib, xcb-icccm,xcb-icccm)
-XCB_WM_LIBS   += $(call ldflags_for_lib, xcb-xinerama,xcb-xinerama)
-XCB_WM_LIBS   += $(call ldflags_for_lib, xcb-randr,xcb-randr)
-
-# XCB cursor
-XCB_CURSOR_CFLAGS := $(call cflags_for_lib, xcb-cursor)
-XCB_CURSOR_LIBS   := $(call ldflags_for_lib, xcb-cursor,xcb-cursor)
-
-XKB_COMMON_CFLAGS := $(call cflags_for_lib, xkbcommon,xkbcommon)
-XKB_COMMON_LIBS := $(call ldflags_for_lib, xkbcommon,xkbcommon)
-XKB_COMMON_X11_CFLAGS := $(call cflags_for_lib, xkbcommon-x11,xkbcommon-x11)
-XKB_COMMON_X11_LIBS := $(call ldflags_for_lib, xkbcommon-x11,xkbcommon-x11)
-
-# XCB xrm
-XCB_XRM_CFLAGS := $(call cflags_for_lib, xcb-xrm)
-XCB_XRM_LIBS   := $(call ldflags_for_lib, xcb-xrm,xcb-xrm)
-
-# yajl
-YAJL_CFLAGS := $(call cflags_for_lib, yajl)
-YAJL_LIBS   := $(call ldflags_for_lib, yajl,yajl)
-
-#libev
-LIBEV_CFLAGS := $(call cflags_for_lib, libev)
-LIBEV_LIBS   := $(call ldflags_for_lib, libev,ev)
-
-# libpcre
-PCRE_CFLAGS := $(call cflags_for_lib, libpcre)
-ifneq ($(shell $(PKG_CONFIG) --atleast-version=8.10 libpcre 2>/dev/null && echo 1),1)
-$(error "libpcre >= 8.10 not found")
-endif
-PCRE_LIBS   := $(call ldflags_for_lib, libpcre,pcre)
-
-# startup-notification
-LIBSN_CFLAGS := $(call cflags_for_lib, libstartup-notification-1.0)
-LIBSN_LIBS   := $(call ldflags_for_lib, libstartup-notification-1.0,startup-notification-1)
-
-# Pango
-PANGO_CFLAGS := $(call cflags_for_lib, cairo)
-PANGO_CFLAGS += $(call cflags_for_lib, pangocairo)
-ifneq ($(shell $(PKG_CONFIG) --atleast-version=1.14.4 cairo 2>/dev/null && echo 1),1)
-$(error "cairo >= 1.14.4 missing")
-endif
-PANGO_LIBS   := $(call ldflags_for_lib, cairo)
-PANGO_LIBS   += $(call ldflags_for_lib, pangocairo)
-
-# libi3
-LIBS = -L$(TOPDIR) -li3 -lm
-
-## Platform-specific flags
-
-# Please test if -Wl,--as-needed works on your platform and send me a patch.
-# it is known not to work on Darwin (Mac OS X)
-ifneq (,$(filter Linux GNU GNU/%, $(UNAME)))
-as_needed_LDFLAG = -Wl,--as-needed
-endif
-
-ifeq ($(UNAME),NetBSD)
-# We need -idirafter instead of -I to prefer the system’s iconv over GNU libiconv
-I3_CFLAGS += -idirafter /usr/pkg/include
-I3_LDFLAGS += -Wl,-rpath,/usr/local/lib -Wl,-rpath,/usr/pkg/lib
-endif
-
-ifeq ($(UNAME),OpenBSD)
-I3_CFLAGS += -I${X11BASE}/include
-LIBS += -liconv
-I3_LDFLAGS += -L${X11BASE}/lib
-endif
-
-ifeq ($(UNAME),FreeBSD)
-LIBS += -liconv
-endif
-
-ifeq ($(UNAME),Darwin)
-LIBS += -liconv
-else ifneq ($(UNAME),OpenBSD)
-# Darwin (Mac OS X) and OpenBSD do not have librt
-LIBS += -lrt
-endif
-
-ifeq ($(UNAME),SunOS)
-LIBS += -lsocket -liconv -lgen
-endif
-
-ifneq (,$(filter Linux GNU GNU/%, $(UNAME)))
-I3_CPPFLAGS += -D_GNU_SOURCE
-endif
-
-
-ifeq ($(COVERAGE),1)
-I3_CFLAGS += -fprofile-arcs -ftest-coverage
-LIBS += -lgcov
-endif
-
-V ?= 0
-ifeq ($(V),0)
-# Don’t print command lines which are run
-.SILENT:
-
-# echo-ing vars
-V_ASCIIDOC = echo ASCIIDOC $@;
-V_POD2HTML = echo POD2HTML $@;
-V_POD2MAN = echo POD2MAN $@;
-V_A2X = echo A2X $@;
-endif
-
-# Always remake the following targets
-.PHONY: install clean dist distclean
-
diff --git a/configure.ac b/configure.ac
new file mode 100644 (file)
index 0000000..573261f
--- /dev/null
@@ -0,0 +1,164 @@
+#                                               -*- Autoconf -*-
+# Run autoreconf -fi to generate a configure script from this file.
+
+AC_PREREQ([2.69])
+AC_INIT([i3], [4.12], [https://github.com/i3/i3/issues])
+# For AX_EXTEND_SRCDIR
+AX_ENABLE_BUILDDIR
+AM_INIT_AUTOMAKE([foreign subdir-objects -Wall no-dist-gzip dist-bzip2])
+# Default to silent rules, use V=1 to get verbose compilation output.
+AM_SILENT_RULES([yes])
+# Make it possible to disable maintainer mode to disable re-generation of build
+# system files.
+AM_MAINTAINER_MODE([enable])
+AC_CONFIG_SRCDIR([libi3/ipc_recv_message.c])
+AC_CONFIG_HEADERS([config.h])
+AC_CONFIG_MACRO_DIR([m4])
+
+# Verify we are using GNU make because we use '%'-style pattern rules in
+# Makefile.am, which are a GNU make extension. Pull requests to replace
+# '%'-style pattern rules with a more portable alternative are welcome.
+AX_CHECK_GNU_MAKE
+AS_VAR_IF([_cv_gnu_make_command], [""], [AC_MSG_ERROR([the i3 Makefile.am requires GNU make])])
+
+AX_EXTEND_SRCDIR
+
+AS_IF([test -d ${srcdir}/.git],
+      [
+        VERSION="$(git describe --tags --abbrev=0)"
+        I3_VERSION="$(git describe --tags --always) ($(git log --pretty=format:%cd --date=short -n1), branch \\\"$(git describe --tags --always --all | sed s:heads/::)\\\")"
+        # Mirrors what libi3/is_debug_build.c does:
+        is_release=$(test $(echo "${I3_VERSION}" | cut -d '(' -f 1 | wc -m) -lt 10 && echo yes || echo no)
+      ],
+      [
+        VERSION="$(cut -d '-' -f 1 ${srcdir}/I3_VERSION | cut -d ' ' -f 1)"
+        I3_VERSION="$(cat ${srcdir}/I3_VERSION)"
+        is_release="$(grep -q non-git ${srcdir}/I3_VERSION && echo no || echo yes)"
+      ])
+MAJOR_VERSION="$(echo ${VERSION} | cut -d '.' -f 1)"
+MINOR_VERSION="$(echo ${VERSION} | cut -d '.' -f 2)"
+PATCH_VERSION="$(echo ${VERSION} | cut -d '.' -f 3)"
+AS_IF([test "x${PATCH_VERSION}" = x], [PATCH_VERSION=0])
+AC_DEFINE_UNQUOTED([I3_VERSION], ["${I3_VERSION}"], [i3 version])
+AC_DEFINE_UNQUOTED([MAJOR_VERSION], [${MAJOR_VERSION}], [i3 major version])
+AC_DEFINE_UNQUOTED([MINOR_VERSION], [${MINOR_VERSION}], [i3 minor version])
+AC_DEFINE_UNQUOTED([PATCH_VERSION], [${PATCH_VERSION}], [i3 patch version])
+
+AX_CODE_COVERAGE
+
+dnl is_release must be lowercase because AX_CHECK_ENABLE_DEBUG calls m4_tolower
+dnl on its fourth argument.
+AX_CHECK_ENABLE_DEBUG([yes], , [UNUSED_NDEBUG], [$is_release])
+
+AC_PROG_CC_C99
+
+AC_DEFINE_UNQUOTED(SYSCONFDIR, "`eval echo $sysconfdir`", [Location of system configuration files])
+
+# For strnlen() and vasprintf().
+AC_USE_SYSTEM_EXTENSIONS
+
+# Checks for typedefs, structures, and compiler characteristics.
+AC_CHECK_HEADER_STDBOOL
+dnl The error message should include the specific type which could not be
+dnl found, but I do not see a way to achieve that.
+AC_CHECK_TYPES([mode_t, off_t, pid_t, size_t, ssize_t], , [AC_MSG_FAILURE([cannot find required type])])
+
+# Checks for library functions.
+AC_FUNC_FORK
+AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK
+AC_FUNC_STRNLEN
+AC_CHECK_FUNCS([atexit dup2 ftruncate getcwd gettimeofday localtime_r memchr memset mkdir rmdir setlocale socket strcasecmp strchr strdup strerror strncasecmp strndup strrchr strspn strstr strtol strtoul], , [AC_MSG_FAILURE([cannot find the $ac_func function, which i3 requires])])
+
+# Checks for libraries.
+
+AC_SEARCH_LIBS([floor], [m], , [AC_MSG_FAILURE([cannot find the required floor() function despite trying to link with -lm])])
+
+# libev does not ship with a pkg-config file :(.
+AC_SEARCH_LIBS([ev_run], [ev], , [AC_MSG_FAILURE([cannot find the required ev_run() function despite trying to link with -lev])])
+
+AC_SEARCH_LIBS([shm_open], [rt])
+
+AX_PTHREAD
+
+dnl Each prefix corresponds to a source tarball which users might have
+dnl downloaded in a newer version and would like to overwrite.
+PKG_CHECK_MODULES([LIBSN], [libstartup-notification-1.0])
+PKG_CHECK_MODULES([XCB], [xcb xcb-xkb xcb-xinerama xcb-randr])
+PKG_CHECK_MODULES([XCB_UTIL], [xcb-event xcb-util])
+PKG_CHECK_MODULES([XCB_UTIL_CURSOR], [xcb-cursor])
+PKG_CHECK_MODULES([XCB_UTIL_KEYSYMS], [xcb-keysyms])
+PKG_CHECK_MODULES([XCB_UTIL_WM], [xcb-icccm])
+PKG_CHECK_MODULES([XCB_UTIL_XRM], [xcb-xrm])
+PKG_CHECK_MODULES([XKBCOMMON], [xkbcommon xkbcommon-x11])
+PKG_CHECK_MODULES([YAJL], [yajl])
+PKG_CHECK_MODULES([LIBPCRE], [libpcre >= 8.10])
+PKG_CHECK_MODULES([PANGOCAIRO], [cairo >= 1.14.4 pangocairo])
+
+# Checks for programs.
+AC_PROG_AWK
+AC_PROG_CPP
+AC_PROG_INSTALL
+AC_PROG_MAKE_SET
+AC_PROG_RANLIB
+AC_PROG_LN_S
+
+AC_PATH_PROG([PATH_ASCIIDOC], [asciidoc])
+AC_PATH_PROG([PATH_XMLTO], [xmlto])
+AC_PATH_PROG([PATH_POD2MAN], [pod2man])
+
+AM_CONDITIONAL([BUILD_MANS], [test x$PATH_ASCIIDOC != x && test x$PATH_XMLTO != x && test x$PATH_POD2MAN != x])
+AM_CONDITIONAL([BUILD_DOCS], [test x$PATH_ASCIIDOC != x])
+
+AM_PROG_AR
+
+AX_FLAGS_WARN_ALL
+AX_CHECK_COMPILE_FLAG([-Wunused-value], [AX_APPEND_FLAG([-Wunused-value], [AM_CFLAGS])])
+AC_SUBST(AM_CFLAGS)
+
+# Checks for header files.
+AC_CHECK_HEADERS([fcntl.h float.h inttypes.h limits.h locale.h netinet/in.h paths.h stddef.h stdint.h stdlib.h string.h sys/param.h sys/socket.h sys/time.h unistd.h], , [AC_MSG_FAILURE([cannot find the $ac_header header, which i3 requires])])
+
+AC_CONFIG_FILES([Makefile testcases/lib/i3test.pm])
+AC_CONFIG_FILES([testcases/complete-run.pl], [chmod +x testcases/complete-run.pl])
+
+# Enable address sanitizer for non-release builds. The performance hit is a
+# 50% increase of wallclock time for the testsuite on my machine.
+if test x$is_release = xyes; then
+       default_sanitizers=
+else
+       default_sanitizers=address
+fi
+AX_SANITIZERS(, [$default_sanitizers], [AC_DEFINE([I3_ASAN_ENABLED], [], [Enable ASAN])])
+
+AC_OUTPUT
+
+if test -z "${BUILD_DOCS_TRUE}"; then
+       print_BUILD_DOCS=yes
+else
+       print_BUILD_DOCS=no
+fi
+
+
+if test -z "${BUILD_MANS_TRUE}"; then
+       print_BUILD_MANS=yes
+else
+       print_BUILD_MANS=no
+fi
+
+echo \
+"--------------------------------------------------------------------------------
+build configured:
+
+AS_HELP_STRING([i3 version:], [`echo ${I3_VERSION} | sed 's,\\\\,,g'`])
+AS_HELP_STRING([is release version:], [${is_release}])
+
+AS_HELP_STRING([build manpages:], [${print_BUILD_MANS}])
+AS_HELP_STRING([build docs:], [${print_BUILD_DOCS}])
+AS_HELP_STRING([enable debug flags:], [${ax_enable_debug}])
+AS_HELP_STRING([code coverage:], [${CODE_COVERAGE_ENABLED}])
+AS_HELP_STRING([enabled sanitizers:], [${ax_enabled_sanitizers}])
+
+To compile, run:
+
+  cd `pwd` && make -j8
+--------------------------------------------------------------------------------"
diff --git a/docs/Makefile b/docs/Makefile
deleted file mode 100644 (file)
index d6e670c..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-all:
-       $(MAKE) -C .. docs
-
-clean:
-       $(MAKE) -C .. clean-docs
-
-.PHONY: all clean
diff --git a/docs/docs.mk b/docs/docs.mk
deleted file mode 100644 (file)
index 050df97..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-DISTCLEAN_TARGETS += clean-docs
-
-# To pass additional parameters for asciidoc
-ASCIIDOC = asciidoc
-I3POD2HTML = ./docs/i3-pod2html
-
-ASCIIDOC_NOTOC_TARGETS = \
-       docs/debugging.html
-
-ASCIIDOC_TOC_TARGETS = \
-       docs/hacking-howto.html \
-       docs/userguide.html \
-       docs/ipc.html \
-       docs/multi-monitor.html \
-       docs/wsbar.html \
-       docs/testsuite.html \
-       docs/i3bar-protocol.html \
-       docs/layout-saving.html
-
-ASCIIDOC_TARGETS = \
-       $(ASCIIDOC_TOC_TARGETS) \
-       $(ASCIIDOC_NOTOC_TARGETS)
-
-ASCIIDOC_CALL = $(V_ASCIIDOC)$(ASCIIDOC) -n $(ASCIIDOC_FLAGS) -o $@ $<
-ASCIIDOC_TOC_CALL = $(V_ASCIIDOC)$(ASCIIDOC) -a toc -n $(ASCIIDOC_FLAGS) -o $@ $<
-
-POD2HTML_TARGETS = \
-       docs/lib-i3test.html \
-       docs/lib-i3test-test.html
-
-docs/lib-i3test.html: testcases/lib/i3test.pm
-       $(V_POD2HTML)$(I3POD2HTML) $< $@
-
-docs/lib-i3test-test.html: testcases/lib/i3test/Test.pm
-       $(V_POD2HTML)$(I3POD2HTML) $< $@
-
-docs: $(ASCIIDOC_TARGETS) $(POD2HTML_TARGETS)
-
-$(ASCIIDOC_TOC_TARGETS): docs/%.html: docs/%
-       $(ASCIIDOC_TOC_CALL)
-
-$(ASCIIDOC_NOTOC_TARGETS): docs/%.html: docs/%
-       $(ASCIIDOC_CALL)
-
-clean-docs:
-       rm -f $(ASCIIDOC_TARGETS) $(POD2HTML_TARGETS)
diff --git a/i3-config-wizard/Makefile b/i3-config-wizard/Makefile
deleted file mode 100644 (file)
index d5ac18c..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-all:
-       $(MAKE) -C .. i3-config-wizard/i3-config-wizard
-
-install:
-       $(MAKE) -C .. install-i3-config-wizard
-
-clean:
-       $(MAKE) -C .. clean-i3-config-wizard
-
-.PHONY: all install clean
diff --git a/i3-config-wizard/i3-config-wizard.mk b/i3-config-wizard/i3-config-wizard.mk
deleted file mode 100644 (file)
index 9c01cdb..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-ALL_TARGETS += i3-config-wizard/i3-config-wizard
-INSTALL_TARGETS += install-i3-config-wizard
-CLEAN_TARGETS += clean-i3-config-wizard
-
-i3_config_wizard_SOURCES           := $(wildcard i3-config-wizard/*.c)
-i3_config_wizard_HEADERS           := $(wildcard i3-config-wizard/*.h)
-i3_config_wizard_CFLAGS             = $(XCB_CFLAGS) $(XCB_KBD_CFLAGS) $(PANGO_CFLAGS) $(XCB_XRM_CFLAGS) $(XKB_COMMON_CFLAGS) $(XKB_COMMON_X11_CFLAGS)
-i3_config_wizard_LIBS               = $(XCB_LIBS) $(XCB_KBD_LIBS) $(PANGO_LIBS) $(XCB_XRM_LIBS) $(XKB_COMMON_LIBS) $(XKB_COMMON_X11_LIBS)
-
-i3_config_wizard_OBJECTS := $(i3_config_wizard_SOURCES:.c=.o)
-
-
-i3-config-wizard/%.o: i3-config-wizard/%.c $(i3_config_wizard_HEADERS) i3-config-parser.stamp
-       echo "[i3-config-wizard] CC $<"
-       $(CC) $(I3_CPPFLAGS) $(CPPFLAGS) $(i3_config_wizard_CFLAGS) $(I3_CFLAGS) $(CFLAGS) -c -o $@ $<
-
-i3-config-wizard/i3-config-wizard: libi3.a $(i3_config_wizard_OBJECTS)
-       echo "[i3-config-wizard] Link i3-config-wizard"
-       $(CC) $(I3_LDFLAGS) $(LDFLAGS) -o $@ $(filter-out libi3.a,$^) $(LIBS) $(i3_config_wizard_LIBS)
-
-install-i3-config-wizard: i3-config-wizard/i3-config-wizard
-       echo "[i3-config-wizard] Install"
-       $(INSTALL) -d -m 0755 $(DESTDIR)$(EXEC_PREFIX)/bin
-       $(INSTALL) -m 0755 i3-config-wizard/i3-config-wizard $(DESTDIR)$(EXEC_PREFIX)/bin/
-
-clean-i3-config-wizard:
-       echo "[i3-config-wizard] Clean"
-       rm -f $(i3_config_wizard_OBJECTS) $(i3_config_wizard_SOURCES_GENERATED) i3-config-wizard/i3-config-wizard i3-config-wizard/cfgparse.*
diff --git a/i3-dump-log/Makefile b/i3-dump-log/Makefile
deleted file mode 100644 (file)
index 2b9e4fe..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-all:
-       $(MAKE) -C .. i3-dump-log/i3-dump-log
-
-install:
-       $(MAKE) -C .. install-i3-dump-log
-
-clean:
-       $(MAKE) -C .. clean-i3-dump-log
-
-.PHONY: all install clean
diff --git a/i3-dump-log/i3-dump-log.mk b/i3-dump-log/i3-dump-log.mk
deleted file mode 100644 (file)
index 09a793f..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-ALL_TARGETS += i3-dump-log/i3-dump-log
-INSTALL_TARGETS += install-i3-dump-log
-CLEAN_TARGETS += clean-i3-dump-log
-
-i3_dump_log_SOURCES := $(wildcard i3-dump-log/*.c)
-i3_dump_log_HEADERS := $(wildcard i3-dump-log/*.h)
-i3_dump_log_CFLAGS   = $(XCB_CFLAGS) $(PANGO_CFLAGS)
-i3_dump_log_LIBS     = $(XCB_LIBS)
-
-i3_dump_log_OBJECTS := $(i3_dump_log_SOURCES:.c=.o)
-
-
-i3-dump-log/%.o: i3-dump-log/%.c $(i3_dump_log_HEADERS)
-       echo "[i3-dump-log] CC $<"
-       $(CC) $(I3_CPPFLAGS) $(CPPFLAGS) $(i3_dump_log_CFLAGS) $(I3_CFLAGS) $(CFLAGS) -c -o $@ $<
-
-i3-dump-log/i3-dump-log: libi3.a $(i3_dump_log_OBJECTS)
-       echo "[i3-dump-log] Link i3-dump-log"
-       $(CC) $(I3_LDFLAGS) $(LDFLAGS) -o $@ $(filter-out libi3.a,$^) $(LIBS) $(i3_dump_log_LIBS)
-
-install-i3-dump-log: i3-dump-log/i3-dump-log
-       echo "[i3-dump-log] Install"
-       $(INSTALL) -d -m 0755 $(DESTDIR)$(EXEC_PREFIX)/bin
-       $(INSTALL) -m 0755 i3-dump-log/i3-dump-log $(DESTDIR)$(EXEC_PREFIX)/bin/
-
-clean-i3-dump-log:
-       echo "[i3-dump-log] Clean"
-       rm -f $(i3_dump_log_OBJECTS) i3-dump-log/i3-dump-log
diff --git a/i3-input/Makefile b/i3-input/Makefile
deleted file mode 100644 (file)
index e1c8eae..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-all:
-       $(MAKE) -C .. i3-input/i3-input
-
-install:
-       $(MAKE) -C .. install-i3-input
-
-clean:
-       $(MAKE) -C .. clean-i3-input
-
-.PHONY: all install clean
diff --git a/i3-input/i3-input.mk b/i3-input/i3-input.mk
deleted file mode 100644 (file)
index ce36f93..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-ALL_TARGETS += i3-input/i3-input
-INSTALL_TARGETS += install-i3-input
-CLEAN_TARGETS += clean-i3-input
-
-i3_input_SOURCES := $(wildcard i3-input/*.c)
-i3_input_HEADERS := $(wildcard i3-input/*.h)
-i3_input_CFLAGS   = $(XCB_CFLAGS) $(XCB_KBD_CFLAGS) $(PANGO_CFLAGS) $(XCB_XRM_CFLAGS)
-i3_input_LIBS     = $(XCB_LIBS) $(XCB_KBD_LIBS) $(PANGO_LIBS) $(XCB_XRM_LIBS)
-
-i3_input_OBJECTS := $(i3_input_SOURCES:.c=.o)
-
-
-i3-input/%.o: i3-input/%.c $(i3_input_HEADERS)
-       echo "[i3-input] CC $<"
-       $(CC) $(I3_CPPFLAGS) $(CPPFLAGS) $(i3_input_CFLAGS) $(I3_CFLAGS) $(CFLAGS) -c -o $@ $<
-
-i3-input/i3-input: libi3.a $(i3_input_OBJECTS)
-       echo "[i3-input] Link i3-input"
-       $(CC) $(I3_LDFLAGS) $(LDFLAGS) -o $@ $(filter-out libi3.a,$^) $(LIBS) $(i3_input_LIBS)
-
-install-i3-input: i3-input/i3-input
-       echo "[i3-input] Install"
-       $(INSTALL) -d -m 0755 $(DESTDIR)$(EXEC_PREFIX)/bin
-       $(INSTALL) -m 0755 i3-input/i3-input $(DESTDIR)$(EXEC_PREFIX)/bin/
-
-clean-i3-input:
-       echo "[i3-input] Clean"
-       rm -f $(i3_input_OBJECTS) i3-input/i3-input
diff --git a/i3-msg/Makefile b/i3-msg/Makefile
deleted file mode 100644 (file)
index fedb31e..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-all:
-       $(MAKE) -C .. i3-msg/i3-msg
-
-install:
-       $(MAKE) -C .. install-i3-msg
-
-clean:
-       $(MAKE) -C .. clean-i3-msg
-
-.PHONY: all install clean
diff --git a/i3-msg/i3-msg.mk b/i3-msg/i3-msg.mk
deleted file mode 100644 (file)
index dfba4d2..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-ALL_TARGETS += i3-msg/i3-msg
-INSTALL_TARGETS += install-i3-msg
-CLEAN_TARGETS += clean-i3-msg
-
-i3_msg_SOURCES := $(wildcard i3-msg/*.c)
-i3_msg_HEADERS := $(wildcard i3-msg/*.h)
-i3_msg_CFLAGS   = $(XCB_CFLAGS) $(PANGO_CFLAGS) $(YAJL_CFLAGS)
-i3_msg_LIBS     = $(XCB_LIBS) $(YAJL_LIBS)
-
-i3_msg_OBJECTS := $(i3_msg_SOURCES:.c=.o)
-
-
-i3-msg/%.o: i3-msg/%.c $(i3_msg_HEADERS)
-       echo "[i3-msg] CC $<"
-       $(CC) $(I3_CPPFLAGS) $(CPPFLAGS) $(i3_msg_CFLAGS) $(I3_CFLAGS) $(CFLAGS) -c -o $@ $<
-
-i3-msg/i3-msg: libi3.a $(i3_msg_OBJECTS)
-       echo "[i3-msg] Link i3-msg"
-       $(CC) $(I3_LDFLAGS) $(LDFLAGS) -o $@ $(filter-out libi3.a,$^) $(LIBS) $(i3_msg_LIBS)
-
-install-i3-msg: i3-msg/i3-msg
-       echo "[i3-msg] Install"
-       $(INSTALL) -d -m 0755 $(DESTDIR)$(EXEC_PREFIX)/bin
-       $(INSTALL) -m 0755 i3-msg/i3-msg $(DESTDIR)$(EXEC_PREFIX)/bin/
-
-clean-i3-msg:
-       echo "[i3-msg] Clean"
-       rm -f $(i3_msg_OBJECTS) i3-msg/i3-msg
diff --git a/i3-nagbar/Makefile b/i3-nagbar/Makefile
deleted file mode 100644 (file)
index 12748e2..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-all:
-       $(MAKE) -C .. i3-nagbar/i3-nagbar
-
-install:
-       $(MAKE) -C .. install-i3-nagbar
-
-clean:
-       $(MAKE) -C .. clean-i3-nagbar
-
-.PHONY: all install clean
diff --git a/i3-nagbar/i3-nagbar.mk b/i3-nagbar/i3-nagbar.mk
deleted file mode 100644 (file)
index c6c7a2e..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-ALL_TARGETS += i3-nagbar/i3-nagbar
-INSTALL_TARGETS += install-i3-nagbar
-CLEAN_TARGETS += clean-i3-nagbar
-
-i3_nagbar_SOURCES := $(wildcard i3-nagbar/*.c)
-i3_nagbar_HEADERS := $(wildcard i3-nagbar/*.h)
-i3_nagbar_CFLAGS   = $(XCB_CFLAGS) $(XCB_CURSOR_CFLAGS) $(XCB_WM_CFLAGS) $(PANGO_CFLAGS) $(XCB_XRM_CFLAGS)
-i3_nagbar_LIBS     = $(XCB_LIBS) $(XCB_CURSOR_LIBS) $(XCB_WM_LIBS) $(PANGO_LIBS) $(XCB_XRM_LIBS)
-
-i3_nagbar_OBJECTS := $(i3_nagbar_SOURCES:.c=.o)
-
-
-i3-nagbar/%.o: i3-nagbar/%.c $(i3_nagbar_HEADERS)
-       echo "[i3-nagbar] CC $<"
-       $(CC) $(I3_CPPFLAGS) $(CPPFLAGS) $(i3_nagbar_CFLAGS) $(I3_CFLAGS) $(CFLAGS) -c -o $@ $<
-
-i3-nagbar/i3-nagbar: libi3.a $(i3_nagbar_OBJECTS)
-       echo "[i3-nagbar] Link i3-nagbar"
-       $(CC) $(I3_LDFLAGS) $(LDFLAGS) -o $@ $(filter-out libi3.a,$^) $(LIBS) $(i3_nagbar_LIBS)
-
-install-i3-nagbar: i3-nagbar/i3-nagbar
-       echo "[i3-nagbar] Install"
-       $(INSTALL) -d -m 0755 $(DESTDIR)$(EXEC_PREFIX)/bin
-       $(INSTALL) -m 0755 i3-nagbar/i3-nagbar $(DESTDIR)$(EXEC_PREFIX)/bin/
-
-clean-i3-nagbar:
-       echo "[i3-nagbar] Clean"
-       rm -f $(i3_nagbar_OBJECTS) i3-nagbar/i3-nagbar
diff --git a/i3bar/Makefile b/i3bar/Makefile
deleted file mode 100644 (file)
index cd23cd8..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-all:
-       $(MAKE) -C .. i3bar/i3bar
-
-install:
-       $(MAKE) -C .. install-i3bar
-
-clean:
-       $(MAKE) -C .. clean-i3bar
-
-.PHONY: all install clean
diff --git a/i3bar/i3bar.mk b/i3bar/i3bar.mk
deleted file mode 100644 (file)
index 03c607d..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-ALL_TARGETS += i3bar/i3bar
-INSTALL_TARGETS += install-i3bar
-CLEAN_TARGETS += clean-i3bar
-
-i3bar_SOURCES := $(wildcard i3bar/src/*.c)
-i3bar_HEADERS := $(wildcard i3bar/include/*.h)
-i3bar_CFLAGS   = $(XCB_CFLAGS) $(XCB_CURSOR_CFLAGS) $(PANGO_CFLAGS) $(XCB_XRM_CFLAGS) $(YAJL_CFLAGS) $(LIBEV_CFLAGS)
-i3bar_LIBS     = $(XCB_LIBS) $(XCB_CURSOR_LIBS) $(PANGO_LIBS) $(XCB_XRM_LIBS) $(YAJL_LIBS) $(LIBEV_LIBS) $(XCB_XKB_LIBS)
-
-i3bar_OBJECTS := $(i3bar_SOURCES:.c=.o)
-
-
-i3bar/src/%.o: i3bar/src/%.c $(i3bar_HEADERS)
-       echo "[i3bar] CC $<"
-       $(CC) $(I3_CPPFLAGS) $(CPPFLAGS) $(i3bar_CFLAGS) $(I3_CFLAGS) $(CFLAGS) -Ii3bar/include -c -o $@ $<
-
-i3bar/i3bar: libi3.a $(i3bar_OBJECTS)
-       echo "[i3bar] Link i3bar"
-       $(CC) $(I3_LDFLAGS) $(LDFLAGS) -o $@ $(filter-out libi3.a,$^) $(LIBS) $(i3bar_LIBS)
-
-install-i3bar: i3bar/i3bar
-       echo "[i3bar] Install"
-       $(INSTALL) -d -m 0755 $(DESTDIR)$(EXEC_PREFIX)/bin
-       $(INSTALL) -m 0755 i3bar/i3bar $(DESTDIR)$(EXEC_PREFIX)/bin/
-
-clean-i3bar:
-       echo "[i3bar] Clean"
-       rm -f $(i3bar_OBJECTS) i3bar/i3bar
diff --git a/libi3/Makefile b/libi3/Makefile
deleted file mode 100644 (file)
index 2c2f68a..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-all:
-       $(MAKE) -C .. libi3.a
-
-clean:
-       $(MAKE) -C .. clean-libi3
-
-.PHONY: all clean
diff --git a/libi3/libi3.mk b/libi3/libi3.mk
deleted file mode 100644 (file)
index 16e1f14..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-CLEAN_TARGETS += clean-libi3
-
-libi3_SOURCES := $(wildcard libi3/*.c)
-libi3_HEADERS := $(wildcard libi3/*.h)
-libi3_CFLAGS   = $(PANGO_CFLAGS) $(XCB_XRM_CFLAGS)
-libi3_LIBS     =
-
-libi3_OBJECTS := $(libi3_SOURCES:.c=.o)
-
-
-libi3/%.o: libi3/%.c $(libi3_HEADERS)
-       echo "[libi3] CC $<"
-       $(CC) $(I3_CPPFLAGS) $(CPPFLAGS) $(libi3_CFLAGS) $(I3_CFLAGS) $(CFLAGS) -c -o $@ $<
-
-libi3.a: $(libi3_OBJECTS)
-       echo "[libi3] AR libi3.a"
-       $(AR) rcs $@ $^ $(libi3_LIBS)
-
-clean-libi3:
-       echo "[libi3] Clean"
-       rm -f $(libi3_OBJECTS) libi3/libi3.a libi3.a
diff --git a/m4/ax_append_flag.m4 b/m4/ax_append_flag.m4
new file mode 100644 (file)
index 0000000..08f2e07
--- /dev/null
@@ -0,0 +1,71 @@
+# ===========================================================================
+#      http://www.gnu.org/software/autoconf-archive/ax_append_flag.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_APPEND_FLAG(FLAG, [FLAGS-VARIABLE])
+#
+# DESCRIPTION
+#
+#   FLAG is appended to the FLAGS-VARIABLE shell variable, with a space
+#   added in between.
+#
+#   If FLAGS-VARIABLE is not specified, the current language's flags (e.g.
+#   CFLAGS) is used.  FLAGS-VARIABLE is not changed if it already contains
+#   FLAG.  If FLAGS-VARIABLE is unset in the shell, it is set to exactly
+#   FLAG.
+#
+#   NOTE: Implementation based on AX_CFLAGS_GCC_OPTION.
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
+#   Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
+#
+#   This program is free software: you can redistribute it and/or modify it
+#   under the terms of the GNU General Public License as published by the
+#   Free Software Foundation, either version 3 of the License, or (at your
+#   option) any later version.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+#   Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License along
+#   with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+#   As a special exception, the respective Autoconf Macro's copyright owner
+#   gives unlimited permission to copy, distribute and modify the configure
+#   scripts that are the output of Autoconf when processing the Macro. You
+#   need not follow the terms of the GNU General Public License when using
+#   or distributing such scripts, even though portions of the text of the
+#   Macro appear in them. The GNU General Public License (GPL) does govern
+#   all other use of the material that constitutes the Autoconf Macro.
+#
+#   This special exception to the GPL applies to versions of the Autoconf
+#   Macro released by the Autoconf Archive. When you make and distribute a
+#   modified version of the Autoconf Macro, you may extend this special
+#   exception to the GPL to apply to your modified version as well.
+
+#serial 6
+
+AC_DEFUN([AX_APPEND_FLAG],
+[dnl
+AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_SET_IF
+AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])])
+AS_VAR_SET_IF(FLAGS,[
+  AS_CASE([" AS_VAR_GET(FLAGS) "],
+    [*" $1 "*], [AC_RUN_LOG([: FLAGS already contains $1])],
+    [
+     AS_VAR_APPEND(FLAGS,[" $1"])
+     AC_RUN_LOG([: FLAGS="$FLAGS"])
+    ])
+  ],
+  [
+  AS_VAR_SET(FLAGS,[$1])
+  AC_RUN_LOG([: FLAGS="$FLAGS"])
+  ])
+AS_VAR_POPDEF([FLAGS])dnl
+])dnl AX_APPEND_FLAG
diff --git a/m4/ax_cflags_warn_all.m4 b/m4/ax_cflags_warn_all.m4
new file mode 100644 (file)
index 0000000..1f07799
--- /dev/null
@@ -0,0 +1,122 @@
+# ===========================================================================
+#    http://www.gnu.org/software/autoconf-archive/ax_cflags_warn_all.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_CFLAGS_WARN_ALL   [(shellvar [,default, [A/NA]])]
+#   AX_CXXFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])]
+#   AX_FCFLAGS_WARN_ALL  [(shellvar [,default, [A/NA]])]
+#
+# DESCRIPTION
+#
+#   Try to find a compiler option that enables most reasonable warnings.
+#
+#   For the GNU compiler it will be -Wall (and -ansi -pedantic) The result
+#   is added to the shellvar being CFLAGS, CXXFLAGS, or FCFLAGS by default.
+#
+#   Currently this macro knows about the GCC, Solaris, Digital Unix, AIX,
+#   HP-UX, IRIX, NEC SX-5 (Super-UX 10), Cray J90 (Unicos 10.0.0.8), and
+#   Intel compilers.  For a given compiler, the Fortran flags are much more
+#   experimental than their C equivalents.
+#
+#    - $1 shell-variable-to-add-to : CFLAGS, CXXFLAGS, or FCFLAGS
+#    - $2 add-value-if-not-found : nothing
+#    - $3 action-if-found : add value to shellvariable
+#    - $4 action-if-not-found : nothing
+#
+#   NOTE: These macros depend on AX_APPEND_FLAG.
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
+#   Copyright (c) 2010 Rhys Ulerich <rhys.ulerich@gmail.com>
+#
+#   This program is free software; you can redistribute it and/or modify it
+#   under the terms of the GNU General Public License as published by the
+#   Free Software Foundation; either version 3 of the License, or (at your
+#   option) any later version.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+#   Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License along
+#   with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+#   As a special exception, the respective Autoconf Macro's copyright owner
+#   gives unlimited permission to copy, distribute and modify the configure
+#   scripts that are the output of Autoconf when processing the Macro. You
+#   need not follow the terms of the GNU General Public License when using
+#   or distributing such scripts, even though portions of the text of the
+#   Macro appear in them. The GNU General Public License (GPL) does govern
+#   all other use of the material that constitutes the Autoconf Macro.
+#
+#   This special exception to the GPL applies to versions of the Autoconf
+#   Macro released by the Autoconf Archive. When you make and distribute a
+#   modified version of the Autoconf Macro, you may extend this special
+#   exception to the GPL to apply to your modified version as well.
+
+#serial 15
+
+AC_DEFUN([AX_FLAGS_WARN_ALL],[dnl
+AS_VAR_PUSHDEF([FLAGS],[_AC_LANG_PREFIX[]FLAGS])dnl
+AS_VAR_PUSHDEF([VAR],[ac_cv_[]_AC_LANG_ABBREV[]flags_warn_all])dnl
+AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum warnings],
+VAR,[VAR="no, unknown"
+ac_save_[]FLAGS="$[]FLAGS"
+for ac_arg dnl
+in "-warn all  % -warn all"   dnl Intel
+   "-pedantic  % -Wall"       dnl GCC
+   "-xstrconst % -v"          dnl Solaris C
+   "-std1      % -verbose -w0 -warnprotos" dnl Digital Unix
+   "-qlanglvl=ansi % -qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" dnl AIX
+   "-ansi -ansiE % -fullwarn" dnl IRIX
+   "+ESlit     % +w1"         dnl HP-UX C
+   "-Xc        % -pvctl[,]fullmsg" dnl NEC SX-5 (Super-UX 10)
+   "-h conform % -h msglevel 2" dnl Cray C (Unicos)
+   #
+do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
+   AC_COMPILE_IFELSE([AC_LANG_PROGRAM],
+                     [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break])
+done
+FLAGS="$ac_save_[]FLAGS"
+])
+AS_VAR_POPDEF([FLAGS])dnl
+AX_REQUIRE_DEFINED([AX_APPEND_FLAG])
+case ".$VAR" in
+     .ok|.ok,*) m4_ifvaln($3,$3) ;;
+   .|.no|.no,*) m4_default($4,[m4_ifval($2,[AX_APPEND_FLAG([$2], [$1])])]) ;;
+   *) m4_default($3,[AX_APPEND_FLAG([$VAR], [$1])]) ;;
+esac
+AS_VAR_POPDEF([VAR])dnl
+])dnl AX_FLAGS_WARN_ALL
+dnl  implementation tactics:
+dnl   the for-argument contains a list of options. The first part of
+dnl   these does only exist to detect the compiler - usually it is
+dnl   a global option to enable -ansi or -extrawarnings. All other
+dnl   compilers will fail about it. That was needed since a lot of
+dnl   compilers will give false positives for some option-syntax
+dnl   like -Woption or -Xoption as they think of it is a pass-through
+dnl   to later compile stages or something. The "%" is used as a
+dnl   delimiter. A non-option comment can be given after "%%" marks
+dnl   which will be shown but not added to the respective C/CXXFLAGS.
+
+AC_DEFUN([AX_CFLAGS_WARN_ALL],[dnl
+AC_LANG_PUSH([C])
+AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4])
+AC_LANG_POP([C])
+])
+
+AC_DEFUN([AX_CXXFLAGS_WARN_ALL],[dnl
+AC_LANG_PUSH([C++])
+AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4])
+AC_LANG_POP([C++])
+])
+
+AC_DEFUN([AX_FCFLAGS_WARN_ALL],[dnl
+AC_LANG_PUSH([Fortran])
+AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4])
+AC_LANG_POP([Fortran])
+])
diff --git a/m4/ax_check_compile_flag.m4 b/m4/ax_check_compile_flag.m4
new file mode 100644 (file)
index 0000000..ca36397
--- /dev/null
@@ -0,0 +1,74 @@
+# ===========================================================================
+#   http://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT])
+#
+# DESCRIPTION
+#
+#   Check whether the given FLAG works with the current language's compiler
+#   or gives an error.  (Warnings, however, are ignored)
+#
+#   ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
+#   success/failure.
+#
+#   If EXTRA-FLAGS is defined, it is added to the current language's default
+#   flags (e.g. CFLAGS) when the check is done.  The check is thus made with
+#   the flags: "CFLAGS EXTRA-FLAGS FLAG".  This can for example be used to
+#   force the compiler to issue an error when a bad flag is given.
+#
+#   INPUT gives an alternative input source to AC_COMPILE_IFELSE.
+#
+#   NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
+#   macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG.
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
+#   Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
+#
+#   This program is free software: you can redistribute it and/or modify it
+#   under the terms of the GNU General Public License as published by the
+#   Free Software Foundation, either version 3 of the License, or (at your
+#   option) any later version.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+#   Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License along
+#   with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+#   As a special exception, the respective Autoconf Macro's copyright owner
+#   gives unlimited permission to copy, distribute and modify the configure
+#   scripts that are the output of Autoconf when processing the Macro. You
+#   need not follow the terms of the GNU General Public License when using
+#   or distributing such scripts, even though portions of the text of the
+#   Macro appear in them. The GNU General Public License (GPL) does govern
+#   all other use of the material that constitutes the Autoconf Macro.
+#
+#   This special exception to the GPL applies to versions of the Autoconf
+#   Macro released by the Autoconf Archive. When you make and distribute a
+#   modified version of the Autoconf Macro, you may extend this special
+#   exception to the GPL to apply to your modified version as well.
+
+#serial 4
+
+AC_DEFUN([AX_CHECK_COMPILE_FLAG],
+[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF
+AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl
+AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [
+  ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS
+  _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1"
+  AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])],
+    [AS_VAR_SET(CACHEVAR,[yes])],
+    [AS_VAR_SET(CACHEVAR,[no])])
+  _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags])
+AS_VAR_IF(CACHEVAR,yes,
+  [m4_default([$2], :)],
+  [m4_default([$3], :)])
+AS_VAR_POPDEF([CACHEVAR])dnl
+])dnl AX_CHECK_COMPILE_FLAGS
diff --git a/m4/ax_check_enable_debug.m4 b/m4/ax_check_enable_debug.m4
new file mode 100644 (file)
index 0000000..f99d75f
--- /dev/null
@@ -0,0 +1,124 @@
+# ===========================================================================
+#   http://www.gnu.org/software/autoconf-archive/ax_check_enable_debug.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_CHECK_ENABLE_DEBUG([enable by default=yes/info/profile/no], [ENABLE DEBUG VARIABLES ...], [DISABLE DEBUG VARIABLES NDEBUG ...], [IS-RELEASE])
+#
+# DESCRIPTION
+#
+#   Check for the presence of an --enable-debug option to configure, with
+#   the specified default value used when the option is not present.  Return
+#   the value in the variable $ax_enable_debug.
+#
+#   Specifying 'yes' adds '-g -O0' to the compilation flags for all
+#   languages. Specifying 'info' adds '-g' to the compilation flags.
+#   Specifying 'profile' adds '-g -pg' to the compilation flags and '-pg' to
+#   the linking flags. Otherwise, nothing is added.
+#
+#   Define the variables listed in the second argument if debug is enabled,
+#   defaulting to no variables.  Defines the variables listed in the third
+#   argument if debug is disabled, defaulting to NDEBUG.  All lists of
+#   variables should be space-separated.
+#
+#   If debug is not enabled, ensure AC_PROG_* will not add debugging flags.
+#   Should be invoked prior to any AC_PROG_* compiler checks.
+#
+#   IS-RELEASE can be used to change the default to 'no' when making a
+#   release.  Set IS-RELEASE to 'yes' or 'no' as appropriate. By default, it
+#   uses the value of $ax_is_release, so if you are using the AX_IS_RELEASE
+#   macro, there is no need to pass this parameter.
+#
+#     AX_IS_RELEASE([git-directory])
+#     AX_CHECK_ENABLE_DEBUG()
+#
+# LICENSE
+#
+#   Copyright (c) 2011 Rhys Ulerich <rhys.ulerich@gmail.com>
+#   Copyright (c) 2014, 2015 Philip Withnall <philip@tecnocode.co.uk>
+#
+#   Copying and distribution of this file, with or without modification, are
+#   permitted in any medium without royalty provided the copyright notice
+#   and this notice are preserved.
+
+#serial 5
+
+AC_DEFUN([AX_CHECK_ENABLE_DEBUG],[
+    AC_BEFORE([$0],[AC_PROG_CC])dnl
+    AC_BEFORE([$0],[AC_PROG_CXX])dnl
+    AC_BEFORE([$0],[AC_PROG_F77])dnl
+    AC_BEFORE([$0],[AC_PROG_FC])dnl
+
+    AC_MSG_CHECKING(whether to enable debugging)
+
+    ax_enable_debug_default=m4_tolower(m4_normalize(ifelse([$1],,[no],[$1])))
+    ax_enable_debug_is_release=m4_tolower(m4_normalize(ifelse([$4],,
+                                                              [$ax_is_release],
+                                                              [$4])))
+
+    # If this is a release, override the default.
+    AS_IF([test "$ax_enable_debug_is_release" = "yes"],
+      [ax_enable_debug_default="no"])
+
+    m4_define(ax_enable_debug_vars,[m4_normalize(ifelse([$2],,,[$2]))])
+    m4_define(ax_disable_debug_vars,[m4_normalize(ifelse([$3],,[NDEBUG],[$3]))])
+
+    AC_ARG_ENABLE(debug,
+       [AS_HELP_STRING([--enable-debug=]@<:@yes/info/profile/no@:>@,[compile with debugging])],
+       [],enable_debug=$ax_enable_debug_default)
+
+    # empty mean debug yes
+    AS_IF([test "x$enable_debug" = "x"],
+      [enable_debug="yes"])
+
+    # case of debug
+    AS_CASE([$enable_debug],
+      [yes],[
+       AC_MSG_RESULT(yes)
+       CFLAGS="${CFLAGS} -g -O0"
+       CXXFLAGS="${CXXFLAGS} -g -O0"
+       FFLAGS="${FFLAGS} -g -O0"
+       FCFLAGS="${FCFLAGS} -g -O0"
+       OBJCFLAGS="${OBJCFLAGS} -g -O0"
+      ],
+      [info],[
+       AC_MSG_RESULT(info)
+       CFLAGS="${CFLAGS} -g"
+       CXXFLAGS="${CXXFLAGS} -g"
+       FFLAGS="${FFLAGS} -g"
+       FCFLAGS="${FCFLAGS} -g"
+       OBJCFLAGS="${OBJCFLAGS} -g"
+      ],
+      [profile],[
+       AC_MSG_RESULT(profile)
+       CFLAGS="${CFLAGS} -g -pg"
+       CXXFLAGS="${CXXFLAGS} -g -pg"
+       FFLAGS="${FFLAGS} -g -pg"
+       FCFLAGS="${FCFLAGS} -g -pg"
+       OBJCFLAGS="${OBJCFLAGS} -g -pg"
+       LDFLAGS="${LDFLAGS} -pg"
+      ],
+      [
+       AC_MSG_RESULT(no)
+       dnl Ensure AC_PROG_CC/CXX/F77/FC/OBJC will not enable debug flags
+       dnl by setting any unset environment flag variables
+       AS_IF([test "x${CFLAGS+set}" != "xset"],
+         [CFLAGS=""])
+       AS_IF([test "x${CXXFLAGS+set}" != "xset"],
+         [CXXFLAGS=""])
+       AS_IF([test "x${FFLAGS+set}" != "xset"],
+         [FFLAGS=""])
+       AS_IF([test "x${FCFLAGS+set}" != "xset"],
+         [FCFLAGS=""])
+       AS_IF([test "x${OBJCFLAGS+set}" != "xset"],
+         [OBJCFLAGS=""])
+      ])
+
+    dnl Define various variables if debugging is disabled.
+    dnl assert.h is a NOP if NDEBUG is defined, so define it by default.
+    AS_IF([test "x$enable_debug" = "xyes"],
+      [m4_map_args_w(ax_enable_debug_vars, [AC_DEFINE(], [,,[Define if debugging is enabled])])],
+      [m4_map_args_w(ax_disable_debug_vars, [AC_DEFINE(], [,,[Define if debugging is disabled])])])
+    ax_enable_debug=$enable_debug
+])
diff --git a/m4/ax_check_gnu_make.m4 b/m4/ax_check_gnu_make.m4
new file mode 100644 (file)
index 0000000..6762e9e
--- /dev/null
@@ -0,0 +1,84 @@
+# ===========================================================================
+#     http://www.gnu.org/software/autoconf-archive/ax_check_gnu_make.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_CHECK_GNU_MAKE()
+#
+# DESCRIPTION
+#
+#   This macro searches for a GNU version of make. If a match is found:
+#
+#     * The makefile variable `ifGNUmake' is set to the empty string, otherwise
+#       it is set to "#". This is useful for including a special features in a
+#       Makefile, which cannot be handled by other versions of make.
+#     * The variable `_cv_gnu_make_command` is set to the command to invoke
+#       GNU make if it exists, the empty string otherwise.
+#     * The variable `ax_cv_gnu_make_command` is set to the command to invoke
+#       GNU make by copying `_cv_gnu_make_command`, otherwise it is unset.
+#     * If GNU Make is found, its version is extracted from the output of
+#       `make --version` as the last field of a record of space-separated
+#       columns and saved into the variable `ax_check_gnu_make_version`.
+#
+#   Here is an example of its use:
+#
+#   Makefile.in might contain:
+#
+#     # A failsafe way of putting a dependency rule into a makefile
+#     $(DEPEND):
+#             $(CC) -MM $(srcdir)/*.c > $(DEPEND)
+#
+#     @ifGNUmake@ ifeq ($(DEPEND),$(wildcard $(DEPEND)))
+#     @ifGNUmake@ include $(DEPEND)
+#     @ifGNUmake@ endif
+#
+#   Then configure.in would normally contain:
+#
+#     AX_CHECK_GNU_MAKE()
+#     AC_OUTPUT(Makefile)
+#
+#   Then perhaps to cause gnu make to override any other make, we could do
+#   something like this (note that GNU make always looks for GNUmakefile
+#   first):
+#
+#     if  ! test x$_cv_gnu_make_command = x ; then
+#             mv Makefile GNUmakefile
+#             echo .DEFAULT: > Makefile ;
+#             echo \  $_cv_gnu_make_command \$@ >> Makefile;
+#     fi
+#
+#   Then, if any (well almost any) other make is called, and GNU make also
+#   exists, then the other make wraps the GNU make.
+#
+# LICENSE
+#
+#   Copyright (c) 2008 John Darrington <j.darrington@elvis.murdoch.edu.au>
+#   Copyright (c) 2015 Enrico M. Crisostomo <enrico.m.crisostomo@gmail.com>
+#
+#   Copying and distribution of this file, with or without modification, are
+#   permitted in any medium without royalty provided the copyright notice
+#   and this notice are preserved. This file is offered as-is, without any
+#   warranty.
+
+#serial 8
+
+AC_DEFUN([AX_CHECK_GNU_MAKE],dnl
+  [AC_PROG_AWK
+  AC_CACHE_CHECK([for GNU make],[_cv_gnu_make_command],[dnl
+    _cv_gnu_make_command="" ;
+dnl Search all the common names for GNU make
+    for a in "$MAKE" make gmake gnumake ; do
+      if test -z "$a" ; then continue ; fi ;
+      if "$a" --version 2> /dev/null | grep GNU 2>&1 > /dev/null ; then
+        _cv_gnu_make_command=$a ;
+        AX_CHECK_GNU_MAKE_HEADLINE=$("$a" --version 2> /dev/null | grep "GNU Make")
+        ax_check_gnu_make_version=$(echo ${AX_CHECK_GNU_MAKE_HEADLINE} | ${AWK} -F " " '{ print $(NF); }')
+        break ;
+      fi
+    done ;])
+dnl If there was a GNU version, then set @ifGNUmake@ to the empty string, '#' otherwise
+  AS_VAR_IF([_cv_gnu_make_command], [""], [AS_VAR_SET([ifGNUmake], ["#"])],   [AS_VAR_SET([ifGNUmake], [""])])
+  AS_VAR_IF([_cv_gnu_make_command], [""], [AS_UNSET(ax_cv_gnu_make_command)], [AS_VAR_SET([ax_cv_gnu_make_command], [${_cv_gnu_make_command}])])
+  AC_SUBST([ifGNUmake])
+])
diff --git a/m4/ax_check_link_flag.m4 b/m4/ax_check_link_flag.m4
new file mode 100644 (file)
index 0000000..eb01a6c
--- /dev/null
@@ -0,0 +1,74 @@
+# ===========================================================================
+#    http://www.gnu.org/software/autoconf-archive/ax_check_link_flag.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_CHECK_LINK_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT])
+#
+# DESCRIPTION
+#
+#   Check whether the given FLAG works with the linker or gives an error.
+#   (Warnings, however, are ignored)
+#
+#   ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
+#   success/failure.
+#
+#   If EXTRA-FLAGS is defined, it is added to the linker's default flags
+#   when the check is done.  The check is thus made with the flags: "LDFLAGS
+#   EXTRA-FLAGS FLAG".  This can for example be used to force the linker to
+#   issue an error when a bad flag is given.
+#
+#   INPUT gives an alternative input source to AC_LINK_IFELSE.
+#
+#   NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
+#   macro in sync with AX_CHECK_{PREPROC,COMPILE}_FLAG.
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
+#   Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
+#
+#   This program is free software: you can redistribute it and/or modify it
+#   under the terms of the GNU General Public License as published by the
+#   Free Software Foundation, either version 3 of the License, or (at your
+#   option) any later version.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+#   Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License along
+#   with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+#   As a special exception, the respective Autoconf Macro's copyright owner
+#   gives unlimited permission to copy, distribute and modify the configure
+#   scripts that are the output of Autoconf when processing the Macro. You
+#   need not follow the terms of the GNU General Public License when using
+#   or distributing such scripts, even though portions of the text of the
+#   Macro appear in them. The GNU General Public License (GPL) does govern
+#   all other use of the material that constitutes the Autoconf Macro.
+#
+#   This special exception to the GPL applies to versions of the Autoconf
+#   Macro released by the Autoconf Archive. When you make and distribute a
+#   modified version of the Autoconf Macro, you may extend this special
+#   exception to the GPL to apply to your modified version as well.
+
+#serial 4
+
+AC_DEFUN([AX_CHECK_LINK_FLAG],
+[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF
+AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_ldflags_$4_$1])dnl
+AC_CACHE_CHECK([whether the linker accepts $1], CACHEVAR, [
+  ax_check_save_flags=$LDFLAGS
+  LDFLAGS="$LDFLAGS $4 $1"
+  AC_LINK_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])],
+    [AS_VAR_SET(CACHEVAR,[yes])],
+    [AS_VAR_SET(CACHEVAR,[no])])
+  LDFLAGS=$ax_check_save_flags])
+AS_VAR_IF(CACHEVAR,yes,
+  [m4_default([$2], :)],
+  [m4_default([$3], :)])
+AS_VAR_POPDEF([CACHEVAR])dnl
+])dnl AX_CHECK_LINK_FLAGS
diff --git a/m4/ax_code_coverage.m4 b/m4/ax_code_coverage.m4
new file mode 100644 (file)
index 0000000..6c985eb
--- /dev/null
@@ -0,0 +1,273 @@
+# ===========================================================================
+#     http://www.gnu.org/software/autoconf-archive/ax_code_coverage.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_CODE_COVERAGE()
+#
+# DESCRIPTION
+#
+#   Defines CODE_COVERAGE_CPPFLAGS, CODE_COVERAGE_CFLAGS,
+#   CODE_COVERAGE_CXXFLAGS and CODE_COVERAGE_LDFLAGS which should be
+#   included in the CPPFLAGS, CFLAGS CXXFLAGS and LIBS/LDFLAGS variables of
+#   every build target (program or library) which should be built with code
+#   coverage support. Also defines CODE_COVERAGE_RULES which should be
+#   substituted in your Makefile; and $enable_code_coverage which can be
+#   used in subsequent configure output. CODE_COVERAGE_ENABLED is defined
+#   and substituted, and corresponds to the value of the
+#   --enable-code-coverage option, which defaults to being disabled.
+#
+#   Test also for gcov program and create GCOV variable that could be
+#   substituted.
+#
+#   Note that all optimisation flags in CFLAGS must be disabled when code
+#   coverage is enabled.
+#
+#   Usage example:
+#
+#   configure.ac:
+#
+#     AX_CODE_COVERAGE
+#
+#   Makefile.am:
+#
+#     @CODE_COVERAGE_RULES@
+#     my_program_LIBS = ... $(CODE_COVERAGE_LDFLAGS) ...
+#     my_program_CPPFLAGS = ... $(CODE_COVERAGE_CPPFLAGS) ...
+#     my_program_CFLAGS = ... $(CODE_COVERAGE_CFLAGS) ...
+#     my_program_CXXFLAGS = ... $(CODE_COVERAGE_CXXFLAGS) ...
+#
+#   This results in a "check-code-coverage" rule being added to any
+#   Makefile.am which includes "@CODE_COVERAGE_RULES@" (assuming the module
+#   has been configured with --enable-code-coverage). Running `make
+#   check-code-coverage` in that directory will run the module's test suite
+#   (`make check`) and build a code coverage report detailing the code which
+#   was touched, then print the URI for the report.
+#
+#   This code was derived from Makefile.decl in GLib, originally licenced
+#   under LGPLv2.1+.
+#
+# LICENSE
+#
+#   Copyright (c) 2012, 2016 Philip Withnall
+#   Copyright (c) 2012 Xan Lopez
+#   Copyright (c) 2012 Christian Persch
+#   Copyright (c) 2012 Paolo Borelli
+#   Copyright (c) 2012 Dan Winship
+#   Copyright (c) 2015 Bastien ROUCARIES
+#
+#   This library is free software; you can redistribute it and/or modify it
+#   under the terms of the GNU Lesser General Public License as published by
+#   the Free Software Foundation; either version 2.1 of the License, or (at
+#   your option) any later version.
+#
+#   This library is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
+#   General Public License for more details.
+#
+#   You should have received a copy of the GNU Lesser General Public License
+#   along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+#serial 15
+
+AC_DEFUN([AX_CODE_COVERAGE],[
+       dnl Check for --enable-code-coverage
+       AC_REQUIRE([AC_PROG_SED])
+
+       # allow to override gcov location
+       AC_ARG_WITH([gcov],
+         [AS_HELP_STRING([--with-gcov[=GCOV]], [use given GCOV for coverage (GCOV=gcov).])],
+         [_AX_CODE_COVERAGE_GCOV_PROG_WITH=$with_gcov],
+         [_AX_CODE_COVERAGE_GCOV_PROG_WITH=gcov])
+
+       AC_MSG_CHECKING([whether to build with code coverage support])
+       AC_ARG_ENABLE([code-coverage],
+         AS_HELP_STRING([--enable-code-coverage],
+         [Whether to enable code coverage support]),,
+         enable_code_coverage=no)
+
+       AM_CONDITIONAL([CODE_COVERAGE_ENABLED], [test x$enable_code_coverage = xyes])
+       AC_SUBST([CODE_COVERAGE_ENABLED], [$enable_code_coverage])
+       AC_MSG_RESULT($enable_code_coverage)
+
+       AS_IF([ test "$enable_code_coverage" = "yes" ], [
+               # check for gcov
+               AC_CHECK_TOOL([GCOV],
+                 [$_AX_CODE_COVERAGE_GCOV_PROG_WITH],
+                 [:])
+               AS_IF([test "X$GCOV" = "X:"],
+                 [AC_MSG_ERROR([gcov is needed to do coverage])])
+               AC_SUBST([GCOV])
+
+               dnl Check if gcc is being used
+               AS_IF([ test "$GCC" = "no" ], [
+                       AC_MSG_ERROR([not compiling with gcc, which is required for gcov code coverage])
+               ])
+
+               # List of supported lcov versions.
+               lcov_version_list="1.6 1.7 1.8 1.9 1.10 1.11 1.12"
+
+               AC_CHECK_PROG([LCOV], [lcov], [lcov])
+               AC_CHECK_PROG([GENHTML], [genhtml], [genhtml])
+
+               AS_IF([ test "$LCOV" ], [
+                       AC_CACHE_CHECK([for lcov version], ax_cv_lcov_version, [
+                               ax_cv_lcov_version=invalid
+                               lcov_version=`$LCOV -v 2>/dev/null | $SED -e 's/^.* //'`
+                               for lcov_check_version in $lcov_version_list; do
+                                       if test "$lcov_version" = "$lcov_check_version"; then
+                                               ax_cv_lcov_version="$lcov_check_version (ok)"
+                                       fi
+                               done
+                       ])
+               ], [
+                       lcov_msg="To enable code coverage reporting you must have one of the following lcov versions installed: $lcov_version_list"
+                       AC_MSG_ERROR([$lcov_msg])
+               ])
+
+               case $ax_cv_lcov_version in
+                       ""|invalid[)]
+                               lcov_msg="You must have one of the following versions of lcov: $lcov_version_list (found: $lcov_version)."
+                               AC_MSG_ERROR([$lcov_msg])
+                               LCOV="exit 0;"
+                       ;;
+               esac
+
+               AS_IF([ test -z "$GENHTML" ], [
+                       AC_MSG_ERROR([Could not find genhtml from the lcov package])
+               ])
+
+               dnl Build the code coverage flags
+               CODE_COVERAGE_CPPFLAGS="-DNDEBUG"
+               CODE_COVERAGE_CFLAGS="-O0 -g -fprofile-arcs -ftest-coverage"
+               CODE_COVERAGE_CXXFLAGS="-O0 -g -fprofile-arcs -ftest-coverage"
+               CODE_COVERAGE_LDFLAGS="-lgcov"
+
+               AC_SUBST([CODE_COVERAGE_CPPFLAGS])
+               AC_SUBST([CODE_COVERAGE_CFLAGS])
+               AC_SUBST([CODE_COVERAGE_CXXFLAGS])
+               AC_SUBST([CODE_COVERAGE_LDFLAGS])
+       ])
+
+[CODE_COVERAGE_RULES='
+# Code coverage
+#
+# Optional:
+#  - CODE_COVERAGE_DIRECTORY: Top-level directory for code coverage reporting.
+#    Multiple directories may be specified, separated by whitespace.
+#    (Default: $(top_builddir))
+#  - CODE_COVERAGE_OUTPUT_FILE: Filename and path for the .info file generated
+#    by lcov for code coverage. (Default:
+#    $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage.info)
+#  - CODE_COVERAGE_OUTPUT_DIRECTORY: Directory for generated code coverage
+#    reports to be created. (Default:
+#    $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage)
+#  - CODE_COVERAGE_BRANCH_COVERAGE: Set to 1 to enforce branch coverage,
+#    set to 0 to disable it and leave empty to stay with the default.
+#    (Default: empty)
+#  - CODE_COVERAGE_LCOV_SHOPTS_DEFAULT: Extra options shared between both lcov
+#    instances. (Default: based on $CODE_COVERAGE_BRANCH_COVERAGE)
+#  - CODE_COVERAGE_LCOV_SHOPTS: Extra options to shared between both lcov
+#    instances. (Default: $CODE_COVERAGE_LCOV_SHOPTS_DEFAULT)
+#  - CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH: --gcov-tool pathtogcov
+#  - CODE_COVERAGE_LCOV_OPTIONS_DEFAULT: Extra options to pass to the
+#    collecting lcov instance. (Default: $CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH)
+#  - CODE_COVERAGE_LCOV_OPTIONS: Extra options to pass to the collecting lcov
+#    instance. (Default: $CODE_COVERAGE_LCOV_OPTIONS_DEFAULT)
+#  - CODE_COVERAGE_LCOV_RMOPTS_DEFAULT: Extra options to pass to the filtering
+#    lcov instance. (Default: empty)
+#  - CODE_COVERAGE_LCOV_RMOPTS: Extra options to pass to the filtering lcov
+#    instance. (Default: $CODE_COVERAGE_LCOV_RMOPTS_DEFAULT)
+#  - CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT: Extra options to pass to the
+#    genhtml instance. (Default: based on $CODE_COVERAGE_BRANCH_COVERAGE)
+#  - CODE_COVERAGE_GENHTML_OPTIONS: Extra options to pass to the genhtml
+#    instance. (Default: $CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT)
+#  - CODE_COVERAGE_IGNORE_PATTERN: Extra glob pattern of files to ignore
+#
+# The generated report will be titled using the $(PACKAGE_NAME) and
+# $(PACKAGE_VERSION). In order to add the current git hash to the title,
+# use the git-version-gen script, available online.
+
+# Optional variables
+CODE_COVERAGE_DIRECTORY ?= $(top_builddir)
+CODE_COVERAGE_OUTPUT_FILE ?= $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage.info
+CODE_COVERAGE_OUTPUT_DIRECTORY ?= $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage
+CODE_COVERAGE_BRANCH_COVERAGE ?=
+CODE_COVERAGE_LCOV_SHOPTS_DEFAULT ?= $(if $(CODE_COVERAGE_BRANCH_COVERAGE),\
+--rc lcov_branch_coverage=$(CODE_COVERAGE_BRANCH_COVERAGE))
+CODE_COVERAGE_LCOV_SHOPTS ?= $(CODE_COVERAGE_LCOV_SHOPTS_DEFAULT)
+CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH ?= --gcov-tool "$(GCOV)"
+CODE_COVERAGE_LCOV_OPTIONS_DEFAULT ?= $(CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH)
+CODE_COVERAGE_LCOV_OPTIONS ?= $(CODE_COVERAGE_LCOV_OPTIONS_DEFAULT)
+CODE_COVERAGE_LCOV_RMOPTS_DEFAULT ?=
+CODE_COVERAGE_LCOV_RMOPTS ?= $(CODE_COVERAGE_LCOV_RMOPTS_DEFAULT)
+CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT ?=\
+$(if $(CODE_COVERAGE_BRANCH_COVERAGE),\
+--rc genhtml_branch_coverage=$(CODE_COVERAGE_BRANCH_COVERAGE))
+CODE_COVERAGE_GENHTML_OPTIONS ?= $(CODE_COVERAGE_GENHTML_OPTIONS_DEFAULTS)
+CODE_COVERAGE_IGNORE_PATTERN ?=
+
+code_coverage_v_lcov_cap = $(code_coverage_v_lcov_cap_$(V))
+code_coverage_v_lcov_cap_ = $(code_coverage_v_lcov_cap_$(AM_DEFAULT_VERBOSITY))
+code_coverage_v_lcov_cap_0 = @echo "  LCOV   --capture"\
+ $(CODE_COVERAGE_OUTPUT_FILE);
+code_coverage_v_lcov_ign = $(code_coverage_v_lcov_ign_$(V))
+code_coverage_v_lcov_ign_ = $(code_coverage_v_lcov_ign_$(AM_DEFAULT_VERBOSITY))
+code_coverage_v_lcov_ign_0 = @echo "  LCOV   --remove /tmp/*"\
+ $(CODE_COVERAGE_IGNORE_PATTERN);
+code_coverage_v_genhtml = $(code_coverage_v_genhtml_$(V))
+code_coverage_v_genhtml_ = $(code_coverage_v_genhtml_$(AM_DEFAULT_VERBOSITY))
+code_coverage_v_genhtml_0 = @echo "  GEN   " $(CODE_COVERAGE_OUTPUT_DIRECTORY);
+code_coverage_quiet = $(code_coverage_quiet_$(V))
+code_coverage_quiet_ = $(code_coverage_quiet_$(AM_DEFAULT_VERBOSITY))
+code_coverage_quiet_0 = --quiet
+
+# sanitizes the test-name: replaces with underscores: dashes and dots
+code_coverage_sanitize = $(subst -,_,$(subst .,_,$(1)))
+
+# Use recursive makes in order to ignore errors during check
+check-code-coverage:
+ifeq ($(CODE_COVERAGE_ENABLED),yes)
+       -$(A''M_V_at)$(MAKE) $(AM_MAKEFLAGS) -k check
+       $(A''M_V_at)$(MAKE) $(AM_MAKEFLAGS) code-coverage-capture
+else
+       @echo "Need to reconfigure with --enable-code-coverage"
+endif
+
+# Capture code coverage data
+code-coverage-capture: code-coverage-capture-hook
+ifeq ($(CODE_COVERAGE_ENABLED),yes)
+       $(code_coverage_v_lcov_cap)$(LCOV) $(code_coverage_quiet) $(addprefix --directory ,$(CODE_COVERAGE_DIRECTORY)) --capture --output-file "$(CODE_COVERAGE_OUTPUT_FILE).tmp" --test-name "$(call code_coverage_sanitize,$(PACKAGE_NAME)-$(PACKAGE_VERSION))" --no-checksum --compat-libtool $(CODE_COVERAGE_LCOV_SHOPTS) $(CODE_COVERAGE_LCOV_OPTIONS)
+       $(code_coverage_v_lcov_ign)$(LCOV) $(code_coverage_quiet) $(addprefix --directory ,$(CODE_COVERAGE_DIRECTORY)) --remove "$(CODE_COVERAGE_OUTPUT_FILE).tmp" "/tmp/*" $(CODE_COVERAGE_IGNORE_PATTERN) --output-file "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_LCOV_SHOPTS) $(CODE_COVERAGE_LCOV_RMOPTS)
+       -@rm -f $(CODE_COVERAGE_OUTPUT_FILE).tmp
+       $(code_coverage_v_genhtml)LANG=C $(GENHTML) $(code_coverage_quiet) $(addprefix --prefix ,$(CODE_COVERAGE_DIRECTORY)) --output-directory "$(CODE_COVERAGE_OUTPUT_DIRECTORY)" --title "$(PACKAGE_NAME)-$(PACKAGE_VERSION) Code Coverage" --legend --show-details "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_GENHTML_OPTIONS)
+       @echo "file://$(abs_builddir)/$(CODE_COVERAGE_OUTPUT_DIRECTORY)/index.html"
+else
+       @echo "Need to reconfigure with --enable-code-coverage"
+endif
+
+# Hook rule executed before code-coverage-capture, overridable by the user
+code-coverage-capture-hook:
+
+ifeq ($(CODE_COVERAGE_ENABLED),yes)
+clean: code-coverage-clean
+code-coverage-clean:
+       -$(LCOV) --directory $(top_builddir) -z
+       -rm -rf $(CODE_COVERAGE_OUTPUT_FILE) $(CODE_COVERAGE_OUTPUT_FILE).tmp $(CODE_COVERAGE_OUTPUT_DIRECTORY)
+       -find . -name "*.gcda" -o -name "*.gcov" -delete
+endif
+
+GITIGNOREFILES ?=
+GITIGNOREFILES += $(CODE_COVERAGE_OUTPUT_FILE) $(CODE_COVERAGE_OUTPUT_DIRECTORY)
+
+A''M_DISTCHECK_CONFIGURE_FLAGS ?=
+A''M_DISTCHECK_CONFIGURE_FLAGS += --disable-code-coverage
+
+.PHONY: check-code-coverage code-coverage-capture code-coverage-capture-hook code-coverage-clean
+']
+
+       AC_SUBST([CODE_COVERAGE_RULES])
+       m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([CODE_COVERAGE_RULES])])
+])
diff --git a/m4/ax_configure_args.m4 b/m4/ax_configure_args.m4
new file mode 100644 (file)
index 0000000..0726b1b
--- /dev/null
@@ -0,0 +1,70 @@
+# ===========================================================================
+#     http://www.gnu.org/software/autoconf-archive/ax_configure_args.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_CONFIGURE_ARGS
+#
+# DESCRIPTION
+#
+#   Helper macro for AX_ENABLE_BUILDDIR.
+#
+#   The traditional way of starting a subdir-configure is running the script
+#   with ${1+"$@"} but since autoconf 2.60 this is broken. Instead we have
+#   to rely on eval'ing $ac_configure_args however some old autoconf
+#   versions do not provide that. To ensure maximum portability of autoconf
+#   extension macros this helper can be AC_REQUIRE'd so that
+#   $ac_configure_args will alsways be present.
+#
+#   Sadly, the traditional "exec $SHELL" of the enable_builddir macros is
+#   spoiled now and must be replaced by "eval + exit $?".
+#
+#   Example:
+#
+#     AC_DEFUN([AX_ENABLE_SUBDIR],[dnl
+#       AC_REQUIRE([AX_CONFIGURE_ARGS])dnl
+#       eval $SHELL $ac_configure_args || exit $?
+#       ...])
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
+#
+#   This program is free software; you can redistribute it and/or modify it
+#   under the terms of the GNU General Public License as published by the
+#   Free Software Foundation; either version 3 of the License, or (at your
+#   option) any later version.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+#   Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License along
+#   with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+#   As a special exception, the respective Autoconf Macro's copyright owner
+#   gives unlimited permission to copy, distribute and modify the configure
+#   scripts that are the output of Autoconf when processing the Macro. You
+#   need not follow the terms of the GNU General Public License when using
+#   or distributing such scripts, even though portions of the text of the
+#   Macro appear in them. The GNU General Public License (GPL) does govern
+#   all other use of the material that constitutes the Autoconf Macro.
+#
+#   This special exception to the GPL applies to versions of the Autoconf
+#   Macro released by the Autoconf Archive. When you make and distribute a
+#   modified version of the Autoconf Macro, you may extend this special
+#   exception to the GPL to apply to your modified version as well.
+
+#serial 9
+
+AC_DEFUN([AX_CONFIGURE_ARGS],[
+   # [$]@ is unsable in 2.60+ but earlier autoconf had no ac_configure_args
+   if test "${ac_configure_args+set}" != "set" ; then
+      ac_configure_args=
+      for ac_arg in ${1+"[$]@"}; do
+         ac_configure_args="$ac_configure_args '$ac_arg'"
+      done
+   fi
+])
diff --git a/m4/ax_enable_builddir.m4 b/m4/ax_enable_builddir.m4
new file mode 100644 (file)
index 0000000..5f4ba32
--- /dev/null
@@ -0,0 +1,302 @@
+# ===========================================================================
+#    http://www.gnu.org/software/autoconf-archive/ax_enable_builddir.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_ENABLE_BUILDDIR [(dirstring-or-command [,Makefile.mk [,-all]])]
+#
+# DESCRIPTION
+#
+#   If the current configure was run within the srcdir then we move all
+#   configure-files into a subdir and let the configure steps continue
+#   there. We provide an option --disable-builddir to suppress the move into
+#   a separate builddir.
+#
+#   Defaults:
+#
+#     $1 = $host (overridden with $HOST)
+#     $2 = Makefile.mk
+#     $3 = -all
+#
+#   This macro must be called before AM_INIT_AUTOMAKE. It creates a default
+#   toplevel srcdir Makefile from the information found in the created
+#   toplevel builddir Makefile. It just copies the variables and
+#   rule-targets, each extended with a default rule-execution that recurses
+#   into the build directory of the current "HOST". You can override the
+#   auto-dection through `config.guess` and build-time of course, as in
+#
+#     make HOST=i386-mingw-cross
+#
+#   which can of course set at configure time as well using
+#
+#     configure --host=i386-mingw-cross
+#
+#   After the default has been created, additional rules can be appended
+#   that will not just recurse into the subdirectories and only ever exist
+#   in the srcdir toplevel makefile - these parts are read from the $2 =
+#   Makefile.mk file
+#
+#   The automatic rules are usually scanning the toplevel Makefile for lines
+#   like '#### $host |$builddir' to recognize the place where to recurse
+#   into. Usually, the last one is the only one used. However, almost all
+#   targets have an additional "*-all" rule which makes the script to
+#   recurse into _all_ variants of the current HOST (!!) setting. The "-all"
+#   suffix can be overriden for the macro as well.
+#
+#   a special rule is only given for things like "dist" that will copy the
+#   tarball from the builddir to the sourcedir (or $(PUB)) for reason of
+#   convenience.
+#
+# LICENSE
+#
+#   Copyright (c) 2009 Guido U. Draheim <guidod@gmx.de>
+#   Copyright (c) 2009 Alan Jenkins <alan-jenkins@tuffmail.co.uk>
+#
+#   This program is free software; you can redistribute it and/or modify it
+#   under the terms of the GNU General Public License as published by the
+#   Free Software Foundation; either version 3 of the License, or (at your
+#   option) any later version.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+#   Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License along
+#   with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+#   As a special exception, the respective Autoconf Macro's copyright owner
+#   gives unlimited permission to copy, distribute and modify the configure
+#   scripts that are the output of Autoconf when processing the Macro. You
+#   need not follow the terms of the GNU General Public License when using
+#   or distributing such scripts, even though portions of the text of the
+#   Macro appear in them. The GNU General Public License (GPL) does govern
+#   all other use of the material that constitutes the Autoconf Macro.
+#
+#   This special exception to the GPL applies to versions of the Autoconf
+#   Macro released by the Autoconf Archive. When you make and distribute a
+#   modified version of the Autoconf Macro, you may extend this special
+#   exception to the GPL to apply to your modified version as well.
+
+#serial 25
+
+AC_DEFUN([AX_ENABLE_BUILDDIR],[
+AC_REQUIRE([AC_CANONICAL_HOST])[]dnl
+AC_REQUIRE([AC_CANONICAL_TARGET])[]dnl
+AC_REQUIRE([AX_CONFIGURE_ARGS])[]dnl
+AC_REQUIRE([AM_AUX_DIR_EXPAND])[]dnl
+AC_BEFORE([$0],[AM_INIT_AUTOMAKE])dnl
+AS_VAR_PUSHDEF([SUB],[ax_enable_builddir])dnl
+AS_VAR_PUSHDEF([AUX],[ax_enable_builddir_auxdir])dnl
+AS_VAR_PUSHDEF([SED],[ax_enable_builddir_sed])dnl
+SUB="."
+AC_ARG_ENABLE([builddir], AS_HELP_STRING(
+  [--disable-builddir],[disable automatic build in subdir of sources])
+  ,[SUB="$enableval"], [SUB="auto"])
+if test ".$ac_srcdir_defaulted" != ".no" ; then
+if test ".$srcdir" = ".." ; then
+  if test -f config.status ; then
+    AC_MSG_NOTICE(toplevel srcdir already configured... skipping subdir build)
+  else
+    test ".$SUB" = "."  && SUB="."
+    test ".$SUB" = ".no"  && SUB="."
+    test ".$TARGET" = "." && TARGET="$target"
+    test ".$SUB" = ".auto" && SUB="m4_ifval([$1], [$1],[$TARGET])"
+    if test ".$SUB" != ".." ; then    # we know where to go and
+      AS_MKDIR_P([$SUB])
+      echo __.$SUB.__ > $SUB/conftest.tmp
+      cd $SUB
+      if grep __.$SUB.__ conftest.tmp >/dev/null 2>/dev/null ; then
+        rm conftest.tmp
+        AC_MSG_RESULT([continue configure in default builddir "./$SUB"])
+      else
+        AC_MSG_ERROR([could not change to default builddir "./$SUB"])
+      fi
+      srcdir=`echo "$SUB" |
+              sed -e 's,^\./,,;s,[[^/]]$,&/,;s,[[^/]]*/,../,g;s,[[/]]$,,;'`
+      # going to restart from subdirectory location
+      test -f $srcdir/config.log   && mv $srcdir/config.log   .
+      test -f $srcdir/confdefs.h   && mv $srcdir/confdefs.h   .
+      test -f $srcdir/conftest.log && mv $srcdir/conftest.log .
+      test -f $srcdir/$cache_file  && mv $srcdir/$cache_file  .
+      AC_MSG_RESULT(....exec $SHELL $srcdir/[$]0 "--srcdir=$srcdir" "--enable-builddir=$SUB" ${1+"[$]@"})
+      case "[$]0" in # restart
+       [[\\/]]* | ?:[[\\/]]*) # Asbolute name
+         eval $SHELL "'[$]0'" "'--srcdir=$srcdir'" "'--enable-builddir=$SUB'" $ac_configure_args ;;
+       *) eval $SHELL "'$srcdir/[$]0'" "'--srcdir=$srcdir'" "'--enable-builddir=$SUB'" $ac_configure_args ;;
+      esac ; exit $?
+    fi
+  fi
+fi fi
+test ".$SUB" = ".auto" && SUB="."
+dnl ac_path_prog uses "set dummy" to override $@ which would defeat the "exec"
+AC_PATH_PROG(SED,gsed sed, sed)
+AUX="$am_aux_dir"
+AS_VAR_POPDEF([SED])dnl
+AS_VAR_POPDEF([AUX])dnl
+AS_VAR_POPDEF([SUB])dnl
+AC_CONFIG_COMMANDS([buildir],[dnl .............. config.status ..............
+AS_VAR_PUSHDEF([SUB],[ax_enable_builddir])dnl
+AS_VAR_PUSHDEF([TOP],[top_srcdir])dnl
+AS_VAR_PUSHDEF([SRC],[ac_top_srcdir])dnl
+AS_VAR_PUSHDEF([AUX],[ax_enable_builddir_auxdir])dnl
+AS_VAR_PUSHDEF([SED],[ax_enable_builddir_sed])dnl
+pushdef([END],[Makefile.mk])dnl
+pushdef([_ALL],[ifelse([$3],,[-all],[$3])])dnl
+  SRC="$ax_enable_builddir_srcdir"
+  if test ".$SUB" = ".." ; then
+    if test -f "$TOP/Makefile" ; then
+      AC_MSG_NOTICE([skipping TOP/Makefile - left untouched])
+    else
+      AC_MSG_NOTICE([skipping TOP/Makefile - not created])
+    fi
+  else
+    if test -f "$SRC/Makefile" ; then
+      a=`grep "^VERSION " "$SRC/Makefile"` ; b=`grep "^VERSION " Makefile`
+      test "$a" != "$b" && rm "$SRC/Makefile"
+    fi
+    if test -f "$SRC/Makefile" ; then
+       echo "$SRC/Makefile : $SRC/Makefile.in" > $tmp/conftemp.mk
+       echo "  []@ echo 'REMOVED,,,' >\$[]@" >> $tmp/conftemp.mk
+      eval "${MAKE-make} -f $tmp/conftemp.mk 2>/dev/null >/dev/null"
+      if grep '^REMOVED,,,' "$SRC/Makefile" >/dev/null
+      then rm $SRC/Makefile ; fi
+      cp $tmp/conftemp.mk $SRC/makefiles.mk~      ## DEBUGGING
+    fi
+    if test ! -f "$SRC/Makefile" ; then
+      AC_MSG_NOTICE([create TOP/Makefile guessed from local Makefile])
+      x='`' ; cat >$tmp/conftemp.sed <<_EOF
+/^\$/n
+x
+/^\$/bS
+x
+/\\\\\$/{H;d;}
+{H;s/.*//;x;}
+bM
+:S
+x
+/\\\\\$/{h;d;}
+{h;s/.*//;x;}
+:M
+s/\\(\\n\\)    /\\1 /g
+/^     /d
+/^[[    ]]*[[\\#]]/d
+/^VPATH *=/d
+s/^srcdir *=.*/srcdir = ./
+s/^top_srcdir *=.*/top_srcdir = ./
+/[[:=]]/!d
+/^\\./d
+dnl Now handle rules (i.e. lines containing ":" but not " = ").
+/ = /b
+/ .= /b
+/:/!b
+s/:.*/:/
+s/ /  /g
+s/ \\([[a-z]][[a-z-]]*[[a-zA-Z0-9]]\\)\\([[ :]]\\)/ \\1 \\1[]_ALL\\2/g
+s/^\\([[a-z]][[a-z-]]*[[a-zA-Z0-9]]\\)\\([[ :]]\\)/\\1 \\1[]_ALL\\2/
+s/  / /g
+/^all all[]_ALL[[ :]]/i\\
+all-configured : all[]_ALL
+dnl dist-all exists... and would make for dist-all-all
+s/ [[a-zA-Z0-9-]]*[]_ALL [[a-zA-Z0-9-]]*[]_ALL[]_ALL//g
+/[]_ALL[]_ALL/d
+a\\
+       @ HOST="\$(HOST)\" \\\\\\
+       ; test ".\$\$HOST" = "." && HOST=$x sh $AUX/config.guess $x \\\\\\
+       ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\
+       ; use=$x basename "\$\@" _ALL $x; n=$x echo \$\$BUILD | wc -w $x \\\\\\
+       ; echo "MAKE \$\$HOST : \$\$n * \$\@"; if test "\$\$n" -eq "0" ; then : \\\\\\
+       ; BUILD=$x grep "^####.*|" Makefile |tail -1| sed -e 's/.*|//' $x ; fi \\\\\\
+       ; test ".\$\$BUILD" = "." && BUILD="." \\\\\\
+       ; test "\$\$use" = "\$\@" && BUILD=$x echo "\$\$BUILD" | tail -1 $x \\\\\\
+       ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\
+       ; (cd "\$\$i" && test ! -f configure && \$(MAKE) \$\$use) || exit; done
+dnl special rule add-on: "dist" copies the tarball to $(PUB). (source tree)
+/dist[]_ALL *:/a\\
+       @ HOST="\$(HOST)\" \\\\\\
+       ; test ".\$\$HOST" = "." && HOST=$x sh $AUX/config.guess $x \\\\\\
+       ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\
+       ; found=$x echo \$\$BUILD | wc -w $x \\\\\\
+       ; echo "MAKE \$\$HOST : \$\$found \$(PACKAGE)-\$(VERSION).tar.*" \\\\\\
+       ; if test "\$\$found" -eq "0" ; then : \\\\\\
+       ; BUILD=$x grep "^#### .*|" Makefile |tail -1| sed -e 's/.*|//' $x \\\\\\
+       ; fi ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\
+       ; for f in \$\$i/\$(PACKAGE)-\$(VERSION).tar.* \\\\\\
+       ; do test -f "\$\$f" && mv "\$\$f" \$(PUB). ; done ; break ; done
+dnl special rule add-on: "dist-foo" copies all the archives to $(PUB). (source tree)
+/dist-[[a-zA-Z0-9]]*[]_ALL *:/a\\
+       @ HOST="\$(HOST)\" \\\\\\
+       ; test ".\$\$HOST" = "." && HOST=$x sh ./config.guess $x \\\\\\
+       ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\
+       ; found=$x echo \$\$BUILD | wc -w $x \\\\\\
+       ; echo "MAKE \$\$HOST : \$\$found \$(PACKAGE)-\$(VERSION).*" \\\\\\
+       ; if test "\$\$found" -eq "0" ; then : \\\\\\
+       ; BUILD=$x grep "^#### .*|" Makefile |tail -1| sed -e 's/.*|//' $x \\\\\\
+       ; fi ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\
+       ; for f in \$\$i/\$(PACKAGE)-\$(VERSION).* \\\\\\
+       ; do test -f "\$\$f" && mv "\$\$f" \$(PUB). ; done ; break ; done
+dnl special rule add-on: "distclean" removes all local builddirs completely
+/distclean[]_ALL *:/a\\
+       @ HOST="\$(HOST)\" \\\\\\
+       ; test ".\$\$HOST" = "." && HOST=$x sh $AUX/config.guess $x \\\\\\
+       ; BUILD=$x grep "^#### .*|" Makefile | sed -e 's/.*|//' $x \\\\\\
+       ; use=$x basename "\$\@" _ALL $x; n=$x echo \$\$BUILD | wc -w $x \\\\\\
+       ; echo "MAKE \$\$HOST : \$\$n * \$\@ (all local builds)" \\\\\\
+       ; test ".\$\$BUILD" = "." && BUILD="." \\\\\\
+       ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\
+       ; echo "# rm -r \$\$i"; done ; echo "# (sleep 3)" ; sleep 3 \\\\\\
+       ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\
+       ; echo "\$\$i" | grep "^/" > /dev/null && continue \\\\\\
+       ; echo "\$\$i" | grep "^../" > /dev/null && continue \\\\\\
+       ; echo "rm -r \$\$i"; (rm -r "\$\$i") ; done ; rm Makefile
+_EOF
+      cp "$tmp/conftemp.sed" "$SRC/makefile.sed~"            ## DEBUGGING
+      $SED -f $tmp/conftemp.sed Makefile >$SRC/Makefile
+      if test -f "$SRC/m4_ifval([$2],[$2],[END])" ; then
+        AC_MSG_NOTICE([extend TOP/Makefile with TOP/m4_ifval([$2],[$2],[END])])
+        cat $SRC/END >>$SRC/Makefile
+      fi ; xxxx="####"
+      echo "$xxxx CONFIGURATIONS FOR TOPLEVEL MAKEFILE: " >>$SRC/Makefile
+      # sanity check
+      if grep '^; echo "MAKE ' $SRC/Makefile >/dev/null ; then
+        AC_MSG_NOTICE([buggy sed found - it deletes tab in "a" text parts])
+        $SED -e '/^@ HOST=/s/^/        /' -e '/^; /s/^/        /' $SRC/Makefile \
+          >$SRC/Makefile~
+        (test -s $SRC/Makefile~ && mv $SRC/Makefile~ $SRC/Makefile) 2>/dev/null
+      fi
+    else
+      xxxx="\\#\\#\\#\\#"
+      # echo "/^$xxxx *$ax_enable_builddir_host /d" >$tmp/conftemp.sed
+      echo "s!^$xxxx [[^|]]* | *$SUB *\$!$xxxx ...... $SUB!" >$tmp/conftemp.sed
+      $SED -f "$tmp/conftemp.sed" "$SRC/Makefile" >$tmp/mkfile.tmp
+        cp "$tmp/conftemp.sed" "$SRC/makefiles.sed~"         ## DEBUGGING
+        cp "$tmp/mkfile.tmp"   "$SRC/makefiles.out~"         ## DEBUGGING
+      if cmp -s "$SRC/Makefile" "$tmp/mkfile.tmp" 2>/dev/null ; then
+        AC_MSG_NOTICE([keeping TOP/Makefile from earlier configure])
+        rm "$tmp/mkfile.tmp"
+      else
+        AC_MSG_NOTICE([reusing TOP/Makefile from earlier configure])
+        mv "$tmp/mkfile.tmp" "$SRC/Makefile"
+      fi
+    fi
+    AC_MSG_NOTICE([build in $SUB (HOST=$ax_enable_builddir_host)])
+    xxxx="####"
+    echo "$xxxx" "$ax_enable_builddir_host" "|$SUB" >>$SRC/Makefile
+  fi
+popdef([END])dnl
+AS_VAR_POPDEF([SED])dnl
+AS_VAR_POPDEF([AUX])dnl
+AS_VAR_POPDEF([SRC])dnl
+AS_VAR_POPDEF([TOP])dnl
+AS_VAR_POPDEF([SUB])dnl
+],[dnl
+ax_enable_builddir_srcdir="$srcdir"                    # $srcdir
+ax_enable_builddir_host="$HOST"                        # $HOST / $host
+ax_enable_builddir_version="$VERSION"                  # $VERSION
+ax_enable_builddir_package="$PACKAGE"                  # $PACKAGE
+ax_enable_builddir_auxdir="$ax_enable_builddir_auxdir" # $AUX
+ax_enable_builddir_sed="$ax_enable_builddir_sed"       # $SED
+ax_enable_builddir="$ax_enable_builddir"               # $SUB
+])dnl
+])
diff --git a/m4/ax_extend_srcdir.m4 b/m4/ax_extend_srcdir.m4
new file mode 100644 (file)
index 0000000..a308d67
--- /dev/null
@@ -0,0 +1,86 @@
+# ===========================================================================
+#     http://www.gnu.org/software/autoconf-archive/ax_extend_srcdir.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_EXTEND_SRCDIR
+#
+# DESCRIPTION
+#
+#   The AX_EXTEND_SRCDIR macro extends $srcdir by one path component.
+#
+#   As an example, when working in /home/michael/i3-4.12/build and calling
+#   ../configure, your $srcdir is "..". After calling AX_EXTEND_SRCDIR,
+#   $srcdir will be set to "../../i3-4.12".
+#
+#   The result of extending $srcdir is that filenames (e.g. in the output of
+#   the "backtrace" gdb command) will include one more path component of the
+#   absolute source path. The additional path component makes it easy for
+#   users to recognize which files belong to the PACKAGE, and -- provided a
+#   dist tarball was unpacked -- which version of PACKAGE was used.
+#
+#   As an example, in "backtrace", you will see:
+#
+#     #0  main (argc=1, argv=0x7fffffff1fc8) at ../../i3-4.12/src/main.c:187
+#
+#   instead of:
+#
+#     #0  main (argc=1, argv=0x7fffffff1fc8) at ../src/main.c:187
+#
+#   In case your code uses the __FILE__ preprocessor directive to refer to
+#   the filename of the current source file (e.g. in debug messages), using
+#   the extended path might be undesirable. For this purpose,
+#   AX_EXTEND_SRCDIR defines the output variable AX_EXTEND_SRCDIR_CPPFLAGS,
+#   which can be added to AM_CPPFLAGS in Makefile.am in order to define the
+#   preprocessor directive STRIPPED__FILE__. As an example, when compiling
+#   the file "../../i3-4.12/src/main.c", STRIPPED__FILE__ evaluates to
+#   "main.c".
+#
+#   There are some caveats: When $srcdir is "." (i.e. when ./configure was
+#   called instead of ../configure in a separate build directory),
+#   AX_EXTEND_SRCDIR will still extend $srcdir, but the intended effect will
+#   not be achieved because of the way automake specifies file paths:
+#   automake defines COMPILE to use "`test -f '$source' || echo
+#   '\$(srcdir)/'`$source" in order to prefer files in the current directory
+#   over specifying $srcdir explicitly.
+#
+#   The AX_EXTEND_SRCDIR author is not aware of any way to influence this
+#   automake behavior. Patches very welcome.
+#
+#   To work around this issue, you can use AX_ENABLE_BUILDDIR i.e. by adding
+#   the following code to configure.ac:
+#
+#     AX_ENABLE_BUILDDIR
+#     dnl ...
+#     AX_EXTEND_SRCDIR
+#
+#   Then also add this bit to Makefile.am (if you wish to use
+#   STRIPPED__FILE__ in your code):
+#
+#     AM_CPPFLAGS = @AX_EXTEND_SRCDIR_CPPFLAGS@
+#
+# LICENSE
+#
+#   Copyright (c) 2016 Michael Stapelberg <michael@i3wm.org>
+#
+#   Copying and distribution of this file, with or without modification, are
+#   permitted in any medium without royalty provided the copyright notice
+#   and this notice are preserved.  This file is offered as-is, without any
+#   warranty.
+
+#serial 3
+
+AC_DEFUN([AX_EXTEND_SRCDIR],
+[dnl
+AS_CASE([$srcdir],
+  [.|.*],
+  [
+    # pwd -P is specified in IEEE 1003.1 from 2004
+    as_dir=`cd "$srcdir" && pwd -P`
+    as_base=`AS_BASENAME([$as_dir])`
+    srcdir=${srcdir}/../${as_base}
+
+    AC_SUBST([AX_EXTEND_SRCDIR_CPPFLAGS], ["-DSTRIPPED__FILE__=AS_ESCAPE([\"$$(basename $<)\"])"])
+  ])
+])dnl AX_EXTEND_SRCDIR
diff --git a/m4/ax_pthread.m4 b/m4/ax_pthread.m4
new file mode 100644 (file)
index 0000000..4c4051e
--- /dev/null
@@ -0,0 +1,485 @@
+# ===========================================================================
+#        http://www.gnu.org/software/autoconf-archive/ax_pthread.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+#
+# DESCRIPTION
+#
+#   This macro figures out how to build C programs using POSIX threads. It
+#   sets the PTHREAD_LIBS output variable to the threads library and linker
+#   flags, and the PTHREAD_CFLAGS output variable to any special C compiler
+#   flags that are needed. (The user can also force certain compiler
+#   flags/libs to be tested by setting these environment variables.)
+#
+#   Also sets PTHREAD_CC to any special C compiler that is needed for
+#   multi-threaded programs (defaults to the value of CC otherwise). (This
+#   is necessary on AIX to use the special cc_r compiler alias.)
+#
+#   NOTE: You are assumed to not only compile your program with these flags,
+#   but also to link with them as well. For example, you might link with
+#   $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
+#
+#   If you are only building threaded programs, you may wish to use these
+#   variables in your default LIBS, CFLAGS, and CC:
+#
+#     LIBS="$PTHREAD_LIBS $LIBS"
+#     CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+#     CC="$PTHREAD_CC"
+#
+#   In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant
+#   has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to
+#   that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
+#
+#   Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the
+#   PTHREAD_PRIO_INHERIT symbol is defined when compiling with
+#   PTHREAD_CFLAGS.
+#
+#   ACTION-IF-FOUND is a list of shell commands to run if a threads library
+#   is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it
+#   is not found. If ACTION-IF-FOUND is not specified, the default action
+#   will define HAVE_PTHREAD.
+#
+#   Please let the authors know if this macro fails on any platform, or if
+#   you have any other suggestions or comments. This macro was based on work
+#   by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help
+#   from M. Frigo), as well as ac_pthread and hb_pthread macros posted by
+#   Alejandro Forero Cuervo to the autoconf macro repository. We are also
+#   grateful for the helpful feedback of numerous users.
+#
+#   Updated for Autoconf 2.68 by Daniel Richard G.
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
+#   Copyright (c) 2011 Daniel Richard G. <skunk@iSKUNK.ORG>
+#
+#   This program is free software: you can redistribute it and/or modify it
+#   under the terms of the GNU General Public License as published by the
+#   Free Software Foundation, either version 3 of the License, or (at your
+#   option) any later version.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+#   Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License along
+#   with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+#   As a special exception, the respective Autoconf Macro's copyright owner
+#   gives unlimited permission to copy, distribute and modify the configure
+#   scripts that are the output of Autoconf when processing the Macro. You
+#   need not follow the terms of the GNU General Public License when using
+#   or distributing such scripts, even though portions of the text of the
+#   Macro appear in them. The GNU General Public License (GPL) does govern
+#   all other use of the material that constitutes the Autoconf Macro.
+#
+#   This special exception to the GPL applies to versions of the Autoconf
+#   Macro released by the Autoconf Archive. When you make and distribute a
+#   modified version of the Autoconf Macro, you may extend this special
+#   exception to the GPL to apply to your modified version as well.
+
+#serial 23
+
+AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD])
+AC_DEFUN([AX_PTHREAD], [
+AC_REQUIRE([AC_CANONICAL_HOST])
+AC_REQUIRE([AC_PROG_CC])
+AC_REQUIRE([AC_PROG_SED])
+AC_LANG_PUSH([C])
+ax_pthread_ok=no
+
+# We used to check for pthread.h first, but this fails if pthread.h
+# requires special compiler flags (e.g. on Tru64 or Sequent).
+# It gets checked for in the link test anyway.
+
+# First of all, check if the user has set any of the PTHREAD_LIBS,
+# etcetera environment variables, and if threads linking works using
+# them:
+if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then
+        ax_pthread_save_CC="$CC"
+        ax_pthread_save_CFLAGS="$CFLAGS"
+        ax_pthread_save_LIBS="$LIBS"
+        AS_IF([test "x$PTHREAD_CC" != "x"], [CC="$PTHREAD_CC"])
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+        AC_MSG_CHECKING([for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS])
+        AC_LINK_IFELSE([AC_LANG_CALL([], [pthread_join])], [ax_pthread_ok=yes])
+        AC_MSG_RESULT([$ax_pthread_ok])
+        if test "x$ax_pthread_ok" = "xno"; then
+                PTHREAD_LIBS=""
+                PTHREAD_CFLAGS=""
+        fi
+        CC="$ax_pthread_save_CC"
+        CFLAGS="$ax_pthread_save_CFLAGS"
+        LIBS="$ax_pthread_save_LIBS"
+fi
+
+# We must check for the threads library under a number of different
+# names; the ordering is very important because some systems
+# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
+# libraries is broken (non-POSIX).
+
+# Create a list of thread flags to try.  Items starting with a "-" are
+# C compiler flags, and other items are library names, except for "none"
+# which indicates that we try without any flags at all, and "pthread-config"
+# which is a program returning the flags for the Pth emulation library.
+
+ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
+
+# The ordering *is* (sometimes) important.  Some notes on the
+# individual items follow:
+
+# pthreads: AIX (must check this before -lpthread)
+# none: in case threads are in libc; should be tried before -Kthread and
+#       other compiler flags to prevent continual compiler warnings
+# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
+# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64
+#           (Note: HP C rejects this with "bad form for `-t' option")
+# -pthreads: Solaris/gcc (Note: HP C also rejects)
+# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
+#      doesn't hurt to check since this sometimes defines pthreads and
+#      -D_REENTRANT too), HP C (must be checked before -lpthread, which
+#      is present but should not be used directly; and before -mthreads,
+#      because the compiler interprets this as "-mt" + "-hreads")
+# -mthreads: Mingw32/gcc, Lynx/gcc
+# pthread: Linux, etcetera
+# --thread-safe: KAI C++
+# pthread-config: use pthread-config program (for GNU Pth library)
+
+case $host_os in
+
+        freebsd*)
+
+        # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
+        # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
+
+        ax_pthread_flags="-kthread lthread $ax_pthread_flags"
+        ;;
+
+        hpux*)
+
+        # From the cc(1) man page: "[-mt] Sets various -D flags to enable
+        # multi-threading and also sets -lpthread."
+
+        ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags"
+        ;;
+
+        openedition*)
+
+        # IBM z/OS requires a feature-test macro to be defined in order to
+        # enable POSIX threads at all, so give the user a hint if this is
+        # not set. (We don't define these ourselves, as they can affect
+        # other portions of the system API in unpredictable ways.)
+
+        AC_EGREP_CPP([AX_PTHREAD_ZOS_MISSING],
+            [
+#            if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS)
+             AX_PTHREAD_ZOS_MISSING
+#            endif
+            ],
+            [AC_MSG_WARN([IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support.])])
+        ;;
+
+        solaris*)
+
+        # On Solaris (at least, for some versions), libc contains stubbed
+        # (non-functional) versions of the pthreads routines, so link-based
+        # tests will erroneously succeed. (N.B.: The stubs are missing
+        # pthread_cleanup_push, or rather a function called by this macro,
+        # so we could check for that, but who knows whether they'll stub
+        # that too in a future libc.)  So we'll check first for the
+        # standard Solaris way of linking pthreads (-mt -lpthread).
+
+        ax_pthread_flags="-mt,pthread pthread $ax_pthread_flags"
+        ;;
+esac
+
+# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC)
+
+AS_IF([test "x$GCC" = "xyes"],
+      [ax_pthread_flags="-pthread -pthreads $ax_pthread_flags"])
+
+# The presence of a feature test macro requesting re-entrant function
+# definitions is, on some systems, a strong hint that pthreads support is
+# correctly enabled
+
+case $host_os in
+        darwin* | hpux* | linux* | osf* | solaris*)
+        ax_pthread_check_macro="_REENTRANT"
+        ;;
+
+        aix*)
+        ax_pthread_check_macro="_THREAD_SAFE"
+        ;;
+
+        *)
+        ax_pthread_check_macro="--"
+        ;;
+esac
+AS_IF([test "x$ax_pthread_check_macro" = "x--"],
+      [ax_pthread_check_cond=0],
+      [ax_pthread_check_cond="!defined($ax_pthread_check_macro)"])
+
+# Are we compiling with Clang?
+
+AC_CACHE_CHECK([whether $CC is Clang],
+    [ax_cv_PTHREAD_CLANG],
+    [ax_cv_PTHREAD_CLANG=no
+     # Note that Autoconf sets GCC=yes for Clang as well as GCC
+     if test "x$GCC" = "xyes"; then
+        AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG],
+            [/* Note: Clang 2.7 lacks __clang_[a-z]+__ */
+#            if defined(__clang__) && defined(__llvm__)
+             AX_PTHREAD_CC_IS_CLANG
+#            endif
+            ],
+            [ax_cv_PTHREAD_CLANG=yes])
+     fi
+    ])
+ax_pthread_clang="$ax_cv_PTHREAD_CLANG"
+
+ax_pthread_clang_warning=no
+
+# Clang needs special handling, because older versions handle the -pthread
+# option in a rather... idiosyncratic way
+
+if test "x$ax_pthread_clang" = "xyes"; then
+
+        # Clang takes -pthread; it has never supported any other flag
+
+        # (Note 1: This will need to be revisited if a system that Clang
+        # supports has POSIX threads in a separate library.  This tends not
+        # to be the way of modern systems, but it's conceivable.)
+
+        # (Note 2: On some systems, notably Darwin, -pthread is not needed
+        # to get POSIX threads support; the API is always present and
+        # active.  We could reasonably leave PTHREAD_CFLAGS empty.  But
+        # -pthread does define _REENTRANT, and while the Darwin headers
+        # ignore this macro, third-party headers might not.)
+
+        PTHREAD_CFLAGS="-pthread"
+        PTHREAD_LIBS=
+
+        ax_pthread_ok=yes
+
+        # However, older versions of Clang make a point of warning the user
+        # that, in an invocation where only linking and no compilation is
+        # taking place, the -pthread option has no effect ("argument unused
+        # during compilation").  They expect -pthread to be passed in only
+        # when source code is being compiled.
+        #
+        # Problem is, this is at odds with the way Automake and most other
+        # C build frameworks function, which is that the same flags used in
+        # compilation (CFLAGS) are also used in linking.  Many systems
+        # supported by AX_PTHREAD require exactly this for POSIX threads
+        # support, and in fact it is often not straightforward to specify a
+        # flag that is used only in the compilation phase and not in
+        # linking.  Such a scenario is extremely rare in practice.
+        #
+        # Even though use of the -pthread flag in linking would only print
+        # a warning, this can be a nuisance for well-run software projects
+        # that build with -Werror.  So if the active version of Clang has
+        # this misfeature, we search for an option to squash it.
+
+        AC_CACHE_CHECK([whether Clang needs flag to prevent "argument unused" warning when linking with -pthread],
+            [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG],
+            [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown
+             # Create an alternate version of $ac_link that compiles and
+             # links in two steps (.c -> .o, .o -> exe) instead of one
+             # (.c -> exe), because the warning occurs only in the second
+             # step
+             ax_pthread_save_ac_link="$ac_link"
+             ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g'
+             ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"`
+             ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)"
+             ax_pthread_save_CFLAGS="$CFLAGS"
+             for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do
+                AS_IF([test "x$ax_pthread_try" = "xunknown"], [break])
+                CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS"
+                ac_link="$ax_pthread_save_ac_link"
+                AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])],
+                    [ac_link="$ax_pthread_2step_ac_link"
+                     AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])],
+                         [break])
+                    ])
+             done
+             ac_link="$ax_pthread_save_ac_link"
+             CFLAGS="$ax_pthread_save_CFLAGS"
+             AS_IF([test "x$ax_pthread_try" = "x"], [ax_pthread_try=no])
+             ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try"
+            ])
+
+        case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in
+                no | unknown) ;;
+                *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;;
+        esac
+
+fi # $ax_pthread_clang = yes
+
+if test "x$ax_pthread_ok" = "xno"; then
+for ax_pthread_try_flag in $ax_pthread_flags; do
+
+        case $ax_pthread_try_flag in
+                none)
+                AC_MSG_CHECKING([whether pthreads work without any flags])
+                ;;
+
+                -mt,pthread)
+                AC_MSG_CHECKING([whether pthreads work with -mt -lpthread])
+                PTHREAD_CFLAGS="-mt"
+                PTHREAD_LIBS="-lpthread"
+                ;;
+
+                -*)
+                AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag])
+                PTHREAD_CFLAGS="$ax_pthread_try_flag"
+                ;;
+
+                pthread-config)
+                AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no])
+                AS_IF([test "x$ax_pthread_config" = "xno"], [continue])
+                PTHREAD_CFLAGS="`pthread-config --cflags`"
+                PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
+                ;;
+
+                *)
+                AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag])
+                PTHREAD_LIBS="-l$ax_pthread_try_flag"
+                ;;
+        esac
+
+        ax_pthread_save_CFLAGS="$CFLAGS"
+        ax_pthread_save_LIBS="$LIBS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+
+        # Check for various functions.  We must include pthread.h,
+        # since some functions may be macros.  (On the Sequent, we
+        # need a special flag -Kthread to make this header compile.)
+        # We check for pthread_join because it is in -lpthread on IRIX
+        # while pthread_create is in libc.  We check for pthread_attr_init
+        # due to DEC craziness with -lpthreads.  We check for
+        # pthread_cleanup_push because it is one of the few pthread
+        # functions on Solaris that doesn't have a non-functional libc stub.
+        # We try pthread_create on general principles.
+
+        AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>
+#                       if $ax_pthread_check_cond
+#                        error "$ax_pthread_check_macro must be defined"
+#                       endif
+                        static void routine(void *a) { a = 0; }
+                        static void *start_routine(void *a) { return a; }],
+                       [pthread_t th; pthread_attr_t attr;
+                        pthread_create(&th, 0, start_routine, 0);
+                        pthread_join(th, 0);
+                        pthread_attr_init(&attr);
+                        pthread_cleanup_push(routine, 0);
+                        pthread_cleanup_pop(0) /* ; */])],
+            [ax_pthread_ok=yes],
+            [])
+
+        CFLAGS="$ax_pthread_save_CFLAGS"
+        LIBS="$ax_pthread_save_LIBS"
+
+        AC_MSG_RESULT([$ax_pthread_ok])
+        AS_IF([test "x$ax_pthread_ok" = "xyes"], [break])
+
+        PTHREAD_LIBS=""
+        PTHREAD_CFLAGS=""
+done
+fi
+
+# Various other checks:
+if test "x$ax_pthread_ok" = "xyes"; then
+        ax_pthread_save_CFLAGS="$CFLAGS"
+        ax_pthread_save_LIBS="$LIBS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+
+        # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
+        AC_CACHE_CHECK([for joinable pthread attribute],
+            [ax_cv_PTHREAD_JOINABLE_ATTR],
+            [ax_cv_PTHREAD_JOINABLE_ATTR=unknown
+             for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
+                 AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>],
+                                                 [int attr = $ax_pthread_attr; return attr /* ; */])],
+                                [ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break],
+                                [])
+             done
+            ])
+        AS_IF([test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \
+               test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \
+               test "x$ax_pthread_joinable_attr_defined" != "xyes"],
+              [AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE],
+                                  [$ax_cv_PTHREAD_JOINABLE_ATTR],
+                                  [Define to necessary symbol if this constant
+                                   uses a non-standard name on your system.])
+               ax_pthread_joinable_attr_defined=yes
+              ])
+
+        AC_CACHE_CHECK([whether more special flags are required for pthreads],
+            [ax_cv_PTHREAD_SPECIAL_FLAGS],
+            [ax_cv_PTHREAD_SPECIAL_FLAGS=no
+             case $host_os in
+             solaris*)
+             ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS"
+             ;;
+             esac
+            ])
+        AS_IF([test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \
+               test "x$ax_pthread_special_flags_added" != "xyes"],
+              [PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS"
+               ax_pthread_special_flags_added=yes])
+
+        AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT],
+            [ax_cv_PTHREAD_PRIO_INHERIT],
+            [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <pthread.h>]],
+                                             [[int i = PTHREAD_PRIO_INHERIT;]])],
+                            [ax_cv_PTHREAD_PRIO_INHERIT=yes],
+                            [ax_cv_PTHREAD_PRIO_INHERIT=no])
+            ])
+        AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \
+               test "x$ax_pthread_prio_inherit_defined" != "xyes"],
+              [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.])
+               ax_pthread_prio_inherit_defined=yes
+              ])
+
+        CFLAGS="$ax_pthread_save_CFLAGS"
+        LIBS="$ax_pthread_save_LIBS"
+
+        # More AIX lossage: compile with *_r variant
+        if test "x$GCC" != "xyes"; then
+            case $host_os in
+                aix*)
+                AS_CASE(["x/$CC"],
+                    [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6],
+                    [#handle absolute path differently from PATH based program lookup
+                     AS_CASE(["x$CC"],
+                         [x/*],
+                         [AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])],
+                         [AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])])
+                ;;
+            esac
+        fi
+fi
+
+test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"
+
+AC_SUBST([PTHREAD_LIBS])
+AC_SUBST([PTHREAD_CFLAGS])
+AC_SUBST([PTHREAD_CC])
+
+# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
+if test "x$ax_pthread_ok" = "xyes"; then
+        ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1])
+        :
+else
+        ax_pthread_ok=no
+        $2
+fi
+AC_LANG_POP
+])dnl AX_PTHREAD
diff --git a/m4/ax_require_defined.m4 b/m4/ax_require_defined.m4
new file mode 100644 (file)
index 0000000..cae1111
--- /dev/null
@@ -0,0 +1,37 @@
+# ===========================================================================
+#    http://www.gnu.org/software/autoconf-archive/ax_require_defined.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_REQUIRE_DEFINED(MACRO)
+#
+# DESCRIPTION
+#
+#   AX_REQUIRE_DEFINED is a simple helper for making sure other macros have
+#   been defined and thus are available for use.  This avoids random issues
+#   where a macro isn't expanded.  Instead the configure script emits a
+#   non-fatal:
+#
+#     ./configure: line 1673: AX_CFLAGS_WARN_ALL: command not found
+#
+#   It's like AC_REQUIRE except it doesn't expand the required macro.
+#
+#   Here's an example:
+#
+#     AX_REQUIRE_DEFINED([AX_CHECK_LINK_FLAG])
+#
+# LICENSE
+#
+#   Copyright (c) 2014 Mike Frysinger <vapier@gentoo.org>
+#
+#   Copying and distribution of this file, with or without modification, are
+#   permitted in any medium without royalty provided the copyright notice
+#   and this notice are preserved. This file is offered as-is, without any
+#   warranty.
+
+#serial 1
+
+AC_DEFUN([AX_REQUIRE_DEFINED], [dnl
+  m4_ifndef([$1], [m4_fatal([macro ]$1[ is not defined; is a m4 file missing?])])
+])dnl AX_REQUIRE_DEFINED
diff --git a/m4/ax_sanitizers.m4 b/m4/ax_sanitizers.m4
new file mode 100644 (file)
index 0000000..836d4af
--- /dev/null
@@ -0,0 +1,130 @@
+# ===========================================================================
+#      http://www.gnu.org/software/autoconf-archive/ax_sanitizers.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_SANITIZERS([SANITIZERS], [ENABLED-BY-DEFAULT], [ACTION-SUCCESS])
+#
+# DESCRIPTION
+#
+#   Offers users to enable one or more sanitizers (see
+#   https://github.com/google/sanitizers) with the corresponding
+#   --enable-<sanitizer>-sanitizer option.
+#
+#   SANITIZERS is a whitespace-separated list of sanitizers to offer via
+#   --enable-<sanitizer>-sanitizer options, e.g. "address memory" for the
+#   address sanitizer and the memory sanitizer. If SANITIZERS is not specified,
+#   all known sanitizers to AX_SANITIZERS will be offered, which at the time of
+#   writing are "address memory undefined".
+#   NOTE that SANITIZERS is expanded at autoconf time, not at configure time,
+#   i.e. you cannot use shell variables in SANITIZERS.
+#
+#   ENABLED-BY-DEFAULT is a whitespace-separated list of sanitizers which
+#   should be enabled by default, e.g. "memory undefined". Note that not all
+#   sanitizers can be combined, e.g. memory sanitizer cannot be enabled when
+#   address sanitizer is already enabled.
+#   Set ENABLED-BY-DEFAULT to a single whitespace in order to disable all
+#   sanitizers by default.
+#   ENABLED-BY-DEFAULT is expanded at configure time, so you can use shell
+#   variables.
+#
+#   ACTION-SUCCESS allows to specify shell commands to execute on success, i.e.
+#   when one of the sanitizers was successfully enabled. This is a good place
+#   to call AC_DEFINE for any precompiler constants you might need to make your
+#   code play nice with sanitizers.
+#
+#   The variable ax_enabled_sanitizers contains a whitespace-separated list of
+#   all enabled sanitizers, so that you can print them at the end of configure,
+#   if you wish.
+#
+#   The additional --enable-sanitizers option allows users to enable/disable
+#   all sanitizers, effectively overriding ENABLED-BY-DEFAULT.
+#
+# EXAMPLES
+#
+#   AX_SANITIZERS([address])
+#     dnl offer users to enable address sanitizer via --enable-address-sanitizer
+#
+#   is_debug_build=…
+#   if test "x$is_debug_build" = "xyes"; then
+#     default_sanitizers="address memory"
+#   else
+#     default_sanitizers=
+#   fi
+#   AX_SANITIZERS([address memory], [$default_sanitizers])
+#     dnl enable address sanitizer and memory sanitizer by default for debug
+#     dnl builds, e.g. when building from git instead of a dist tarball.
+#
+#   AX_SANITIZERS(, , [
+#     AC_DEFINE([SANITIZERS_ENABLED],
+#               [],
+#               [At least one sanitizer was enabled])])
+#     dnl enable all sanitizers known to AX_SANITIZERS by default and set the
+#     dnl SANITIZERS_ENABLED precompiler constant.
+#
+#   AX_SANITIZERS(, [ ])
+#     dnl provide all sanitizers, but enable none by default.
+#
+# LICENSE
+#
+#   Copyright (c) 2016 Michael Stapelberg <michael@i3wm.org>
+#
+#   Copying and distribution of this file, with or without modification,
+#   are permitted in any medium without royalty provided the copyright
+#   notice and this notice are preserved.  This file is offered as-is,
+#   without any warranty.
+
+AC_DEFUN([AX_SANITIZERS],
+[AX_REQUIRE_DEFINED([AX_CHECK_COMPILE_FLAG])
+AX_REQUIRE_DEFINED([AX_CHECK_LINK_FLAG])
+AX_REQUIRE_DEFINED([AX_APPEND_FLAG])
+AC_ARG_ENABLE(sanitizers,
+  AS_HELP_STRING(
+    [--enable-sanitizers],
+    [enable all known sanitizers]),
+  [ax_sanitizers_default=$enableval],
+  [ax_sanitizers_default=])
+ax_enabled_sanitizers=
+m4_foreach_w([mysan], m4_default($1, [address memory undefined]), [
+  dnl If ax_sanitizers_default is unset, i.e. the user neither explicitly
+  dnl enabled nor explicitly disabled all sanitizers, we get the default value
+  dnl for this sanitizer based on whether it is listed in ENABLED-BY-DEFAULT.
+  AS_IF([test "x$ax_sanitizers_default" = "x"], [dnl
+          ax_sanitizer_default=
+          for mycheck in m4_default([$2], [address memory undefined]); do
+            AS_IF([test "x$mycheck" = "x[]mysan"], [ax_sanitizer_default=yes])
+          done
+          AS_IF([test "x$ax_sanitizer_default" = "x"], [ax_sanitizer_default=no])
+        ],
+        [ax_sanitizer_default=$ax_sanitizers_default])
+  AC_ARG_ENABLE(mysan[]-sanitizer,
+    AS_HELP_STRING(
+      [--enable-[]mysan[]-sanitizer],
+      [enable -fsanitize=mysan]),
+    [ax_sanitizer_enabled=$enableval],
+    [ax_sanitizer_enabled=$ax_sanitizer_default])
+
+AS_IF([test "x$ax_sanitizer_enabled" = "xyes"], [
+dnl Not using AX_APPEND_COMPILE_FLAGS and AX_APPEND_LINK_FLAGS because they
+dnl lack the ability to specify ACTION-SUCCESS.
+  AX_CHECK_COMPILE_FLAG([-fsanitize=[]mysan], [
+    AX_CHECK_LINK_FLAG([-fsanitize=[]mysan], [
+      AX_APPEND_FLAG([-fsanitize=[]mysan], [])
+dnl If and only if libtool is being used, LDFLAGS needs to contain -Wc,-fsanitize=….
+dnl See e.g. https://sources.debian.net/src/systemd/231-7/configure.ac/?hl=128#L135
+dnl TODO: how can recognize that situation and add -Wc,?
+      AX_APPEND_FLAG([-fsanitize=[]mysan], [LDFLAGS])
+dnl TODO: add -fPIE -pie for memory
+      # -fno-omit-frame-pointer results in nicer stack traces in error
+      # messages, see http://clang.llvm.org/docs/AddressSanitizer.html#usage
+      AX_CHECK_COMPILE_FLAG([-fno-omit-frame-pointer], [
+        AX_APPEND_FLAG([-fno-omit-frame-pointer], [])])
+dnl TODO: at least for clang, we should specify exactly -O1, not -O2 or -O0, so that performance is reasonable but stacktraces are not tampered with (due to inlining), see http://clang.llvm.org/docs/AddressSanitizer.html#usage
+      m4_default([$3], :)
+      ax_enabled_sanitizers="[]mysan $ax_enabled_sanitizers"
+    ])
+  ])
+])
+])dnl
+])dnl AX_SANITIZERS
diff --git a/man/Makefile b/man/Makefile
deleted file mode 100644 (file)
index e4cee0c..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-all:
-       $(MAKE) -C .. mans
-
-clean:
-       $(MAKE) -C .. clean-mans
-
-.PHONY: all clean
diff --git a/man/man.mk b/man/man.mk
deleted file mode 100644 (file)
index e0df386..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-DISTCLEAN_TARGETS += clean-mans
-
-A2X = a2x
-POD2MAN = pod2man
-
-A2X_MAN_CALL = $(V_A2X)$(A2X) -f manpage --asciidoc-opts="-f man/asciidoc.conf" $(A2X_FLAGS) $<
-POD2MAN_CALL = $(V_POD2MAN)$(POD2MAN) --utf8 $< > $@
-
-MANS_ASCIIDOC = \
-       man/i3.1 \
-       man/i3bar.1 \
-       man/i3-msg.1 \
-       man/i3-input.1 \
-       man/i3-nagbar.1 \
-       man/i3-config-wizard.1 \
-       man/i3-migrate-config-to-v4.1 \
-       man/i3-sensible-editor.1 \
-       man/i3-sensible-pager.1 \
-       man/i3-sensible-terminal.1 \
-       man/i3-dump-log.1
-
-MANS_POD = \
-       man/i3-dmenu-desktop.1 \
-       man/i3-save-tree.1
-
-MANS = \
-       $(MANS_ASCIIDOC) \
-       $(MANS_POD)
-
-mans: $(MANS)
-
-$(MANS_ASCIIDOC): %.1: %.man man/asciidoc.conf
-       $(A2X_MAN_CALL)
-
-$(MANS_POD): man/%.1: %
-       $(POD2MAN_CALL)
-
-clean-mans:
-       for file in $(notdir $(MANS)); \
-       do \
-               rm -f man/$${file} man/$${file%.*}.html man/$${file%.*}.xml; \
-       done
diff --git a/src/Makefile b/src/Makefile
deleted file mode 100644 (file)
index 6a37f56..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-all:
-       $(MAKE) -C .. i3
-
-install:
-       $(MAKE) -C .. install-i3
-
-clean:
-       $(MAKE) -C .. clean-i3
-
-.PHONY: all install clean
diff --git a/src/i3.mk b/src/i3.mk
deleted file mode 100644 (file)
index de3f684..0000000
--- a/src/i3.mk
+++ /dev/null
@@ -1,102 +0,0 @@
-ALL_TARGETS += i3 test-tools
-INSTALL_TARGETS += install-i3
-CLEAN_TARGETS += clean-i3
-
-i3_SOURCES           := $(filter-out $(i3_SOURCES_GENERATED),$(wildcard src/*.c))
-i3_HEADERS_CMDPARSER := $(wildcard include/GENERATED_*.h)
-i3_HEADERS           := $(filter-out $(i3_HEADERS_CMDPARSER),$(wildcard include/*.h))
-i3_CFLAGS             = $(XKB_COMMON_CFLAGS) $(XKB_COMMON_X11_CFLAGS) $(XCB_CFLAGS) $(XCB_KBD_CFLAGS) $(XCB_WM_CFLAGS) $(XCB_CURSOR_CFLAGS) $(XCB_XRM_CFLAGS) $(PANGO_CFLAGS) $(YAJL_CFLAGS) $(LIBEV_CFLAGS) $(PCRE_CFLAGS) $(LIBSN_CFLAGS)
-i3_LIBS               = $(XKB_COMMON_LIBS) $(XKB_COMMON_X11_LIBS) $(XCB_LIBS) $(XCB_XKB_LIBS) $(XCB_KBD_LIBS) $(XCB_WM_LIBS) $(XCB_CURSOR_LIBS) $(XCB_XRM_LIBS) $(PANGO_LIBS) $(YAJL_LIBS) $(LIBEV_LIBS) $(PCRE_LIBS) $(LIBSN_LIBS) -lm
-ifneq ($(UNAME),OpenBSD)
-i3_LIBS               += -lpthread
-endif
-
-# When using clang, we use pre-compiled headers to speed up the build. With
-# gcc, this actually makes the build slower.
-ifeq ($(CC),clang)
-i3_HEADERS_DEP       := $(i3_HEADERS) include/all.h.pch
-PCH_FLAGS            := -include include/all.h
-else
-i3_HEADERS_DEP       := $(i3_HEADERS)
-PCH_FLAGS            :=
-endif
-
-i3_OBJECTS := $(i3_SOURCES_GENERATED:.c=.o) $(i3_SOURCES:.c=.o)
-
-# The basename/pwd calls are for canonicalizing the path: Instead
-# of src/main.c, we will see something like ../i3-4.2/src/main.c in
-# debugger backtraces, making it clearer which code belongs to i3 and
-# which code doesn’t.
-# We only do this for src/ since all the other subdirectories contain i3 in
-# their name already.
-canonical_path := ../$(shell basename $(shell pwd -P))
-
-include/all.h.pch: $(i3_HEADERS)
-       echo "[i3] PCH all.h"
-       $(CC) $(I3_CPPFLAGS) $(CPPFLAGS) $(i3_CFLAGS) $(I3_CFLAGS) $(CFLAGS) -x c-header include/all.h -o include/all.h.pch
-
-src/version.o: src/version.c LAST_VERSION $(i3_HEADERS_DEP)
-       echo "[i3] CC $<"
-       $(CC) $(I3_CPPFLAGS) $(CPPFLAGS) $(i3_CFLAGS) $(I3_CFLAGS) $(CFLAGS) $(PCH_FLAGS) -c -o $@ ${canonical_path}/$<
-
-src/%.o: src/%.c $(i3_HEADERS_DEP)
-       echo "[i3] CC $<"
-       $(CC) $(I3_CPPFLAGS) $(CPPFLAGS) $(i3_CFLAGS) $(I3_CFLAGS) $(CFLAGS) $(PCH_FLAGS) -c -o $@ ${canonical_path}/$<
-
-test-tools: test.commands_parser test.config_parser
-
-test.commands_parser: src/commands_parser.c $(i3_HEADERS_DEP) i3-command-parser.stamp libi3.a
-       echo "[i3] Link test.commands_parser"
-       $(CC) $(I3_CPPFLAGS) $(CPPFLAGS) $(i3_CFLAGS) $(I3_CFLAGS) $(CFLAGS) $(I3_LDFLAGS) $(LDFLAGS) -DTEST_PARSER -g -o test.commands_parser $< $(LIBS) $(i3_LIBS)
-
-test.config_parser: src/config_parser.c $(i3_HEADERS_DEP) i3-config-parser.stamp libi3.a
-       echo "[i3] Link test.config_parser"
-       $(CC) $(I3_CPPFLAGS) $(CPPFLAGS) $(i3_CFLAGS) $(I3_CFLAGS) $(CFLAGS) $(I3_LDFLAGS) $(LDFLAGS) -DTEST_PARSER -g -o test.config_parser $< $(LIBS) $(i3_LIBS)
-
-src/commands_parser.o: src/commands_parser.c $(i3_HEADERS_DEP) i3-command-parser.stamp
-       echo "[i3] CC $<"
-       $(CC) $(I3_CPPFLAGS) $(CPPFLAGS) $(i3_CFLAGS) $(I3_CFLAGS) $(CFLAGS) -c -o $@ ${canonical_path}/$<
-
-src/config_parser.o: src/config_parser.c $(i3_HEADERS_DEP) i3-config-parser.stamp
-       echo "[i3] CC $<"
-       $(CC) $(I3_CPPFLAGS) $(CPPFLAGS) $(i3_CFLAGS) $(I3_CFLAGS) $(CFLAGS) -c -o $@ ${canonical_path}/$<
-
-i3-command-parser.stamp: generate-command-parser.pl parser-specs/commands.spec
-       echo "[i3] Generating command parser"
-       (cd $(TOPDIR)/include; ../generate-command-parser.pl --input=../parser-specs/commands.spec --prefix=command)
-       touch $@
-
-i3-config-parser.stamp: generate-command-parser.pl parser-specs/config.spec
-       echo "[i3] Generating config parser"
-       (cd $(TOPDIR)/include; ../generate-command-parser.pl --input=../parser-specs/config.spec --prefix=config)
-       touch $@
-
-i3: libi3.a $(i3_OBJECTS)
-       echo "[i3] Link i3"
-       $(CC) $(CFLAGS) $(I3_LDFLAGS) $(LDFLAGS) -o $@ $(filter-out libi3.a,$^) $(LIBS) $(i3_LIBS)
-
-install-i3: i3
-       echo "[i3] Install"
-       $(INSTALL) -d -m 0755 $(DESTDIR)$(EXEC_PREFIX)/bin
-       $(INSTALL) -d -m 0755 $(DESTDIR)$(SYSCONFDIR)/i3
-       $(INSTALL) -d -m 0755 $(DESTDIR)$(EXEC_PREFIX)/include/i3
-       $(INSTALL) -d -m 0755 $(DESTDIR)$(PREFIX)/share/xsessions
-       $(INSTALL) -d -m 0755 $(DESTDIR)$(PREFIX)/share/applications
-       $(INSTALL) -m 0755 i3 $(DESTDIR)$(EXEC_PREFIX)/bin/
-       $(LN) -sf i3 $(DESTDIR)$(EXEC_PREFIX)/bin/i3-with-shmlog
-       $(INSTALL) -m 0755 i3-migrate-config-to-v4 $(DESTDIR)$(EXEC_PREFIX)/bin/
-       $(INSTALL) -m 0755 i3-sensible-editor $(DESTDIR)$(EXEC_PREFIX)/bin/
-       $(INSTALL) -m 0755 i3-sensible-pager $(DESTDIR)$(EXEC_PREFIX)/bin/
-       $(INSTALL) -m 0755 i3-sensible-terminal $(DESTDIR)$(EXEC_PREFIX)/bin/
-       $(INSTALL) -m 0755 i3-save-tree $(DESTDIR)$(EXEC_PREFIX)/bin/
-       $(INSTALL) -m 0755 i3-dmenu-desktop $(DESTDIR)$(EXEC_PREFIX)/bin/
-       test -e $(DESTDIR)$(SYSCONFDIR)/i3/config || $(INSTALL) -m 0644 i3.config $(DESTDIR)$(SYSCONFDIR)/i3/config
-       test -e $(DESTDIR)$(SYSCONFDIR)/i3/config.keycodes || $(INSTALL) -m 0644 i3.config.keycodes $(DESTDIR)$(SYSCONFDIR)/i3/config.keycodes
-       $(INSTALL) -m 0644 i3.xsession.desktop $(DESTDIR)$(PREFIX)/share/xsessions/i3.desktop
-       $(INSTALL) -m 0644 i3-with-shmlog.xsession.desktop $(DESTDIR)$(PREFIX)/share/xsessions/i3-with-shmlog.desktop
-       $(INSTALL) -m 0644 i3.applications.desktop $(DESTDIR)$(PREFIX)/share/applications/i3.desktop
-       $(INSTALL) -m 0644 include/i3/ipc.h $(DESTDIR)$(EXEC_PREFIX)/include/i3/
-
-clean-i3:
-       echo "[i3] Clean"
-       rm -f $(i3_OBJECTS) $(i3_SOURCES_GENERATED) $(i3_HEADERS_CMDPARSER) include/loglevels.h loglevels.tmp include/all.h.pch i3-command-parser.stamp i3-config-parser.stamp i3 test.config_parser test.commands_parser src/*.gcno src/cfgparse.* src/cmdparse.* LAST_VERSION