From 4d66841811250814cfe5d9ca9f9371ed09901487 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Fri, 7 Oct 2016 13:35:06 +0200 Subject: [PATCH 01/14] check vasprintf return code --- i3bar/src/child.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/i3bar/src/child.c b/i3bar/src/child.c index 3570dde9..295eb76f 100644 --- a/i3bar/src/child.c +++ b/i3bar/src/child.c @@ -105,7 +105,9 @@ __attribute__((format(printf, 1, 2))) static void set_statusline_error(const cha char *message; va_list args; va_start(args, format); - (void)vasprintf(&message, format, args); + if (vasprintf(&message, format, args) == -1) { + return; + } struct status_block *err_block = scalloc(1, sizeof(struct status_block)); err_block->full_text = i3string_from_utf8("Error: "); From ea0b5dd335e7b40bd8077e05ecfa21107a8fa3d0 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Fri, 7 Oct 2016 13:36:45 +0200 Subject: [PATCH 02/14] Ensure error message is included when bailing out --- testcases/t/175-startup-notification.t | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/testcases/t/175-startup-notification.t b/testcases/t/175-startup-notification.t index b27bed53..4456b1d0 100644 --- a/testcases/t/175-startup-notification.t +++ b/testcases/t/175-startup-notification.t @@ -192,7 +192,7 @@ is_num_children($third_ws, 2, 'two containers on the third workspace'); # environment variable. ###################################################################### -mkfifo($tmp, 0600) or BAIL_OUT "Could not create FIFO in $tmp"; +mkfifo($tmp, 0600) or BAIL_OUT "Could not create FIFO in $tmp: $!"; cmd qq|exec --no-startup-id echo \$DESKTOP_STARTUP_ID >$tmp|; @@ -208,7 +208,7 @@ is($startup_id, '', 'startup_id empty'); # 4) same thing, but with double quotes in exec ###################################################################### -mkfifo($tmp, 0600) or BAIL_OUT "Could not create FIFO in $tmp"; +mkfifo($tmp, 0600) or BAIL_OUT "Could not create FIFO in $tmp: $!"; cmd qq|exec --no-startup-id "echo \$DESKTOP_STARTUP_ID >$tmp"|; From 4e9925de7300997567d6621c8466d5b62b974021 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Fri, 7 Oct 2016 13:33:58 +0200 Subject: [PATCH 03/14] rename config.h to configuration.h This is a preparation step for the next commit. --- i3bar/include/common.h | 2 +- i3bar/include/{config.h => configuration.h} | 0 include/all.h | 2 +- include/{config.h => configuration.h} | 2 +- include/ipc.h | 2 +- 5 files changed, 4 insertions(+), 4 deletions(-) rename i3bar/include/{config.h => configuration.h} (100%) rename include/{config.h => configuration.h} (99%) diff --git a/i3bar/include/common.h b/i3bar/include/common.h index 0d46ab6a..c6bb0dba 100644 --- a/i3bar/include/common.h +++ b/i3bar/include/common.h @@ -85,6 +85,6 @@ TAILQ_HEAD(statusline_head, status_block) statusline_head; #include "mode.h" #include "trayclients.h" #include "xcb.h" -#include "config.h" +#include "configuration.h" #include "libi3.h" #include "parse_json_header.h" diff --git a/i3bar/include/config.h b/i3bar/include/configuration.h similarity index 100% rename from i3bar/include/config.h rename to i3bar/include/configuration.h diff --git a/include/all.h b/include/all.h index e39e27b9..b323f863 100644 --- a/include/all.h +++ b/include/all.h @@ -51,7 +51,7 @@ #include "click.h" #include "key_press.h" #include "floating.h" -#include "config.h" +#include "configuration.h" #include "handlers.h" #include "randr.h" #include "xinerama.h" diff --git a/include/config.h b/include/configuration.h similarity index 99% rename from include/config.h rename to include/configuration.h index 699cc882..ced104b6 100644 --- a/include/config.h +++ b/include/configuration.h @@ -4,7 +4,7 @@ * i3 - an improved dynamic tiling window manager * © 2009 Michael Stapelberg and contributors (see also: LICENSE) * - * include/config.h: Contains all structs/variables for the configurable + * include/configuration.h: Contains all structs/variables for the configurable * part of i3 as well as functions handling the configuration file (calling * the parser (src/config_parse.c) with the correct path, switching key * bindings mode). diff --git a/include/ipc.h b/include/ipc.h index e1c18816..a9323751 100644 --- a/include/ipc.h +++ b/include/ipc.h @@ -16,7 +16,7 @@ #include "data.h" #include "tree.h" -#include "config.h" +#include "configuration.h" #include "i3/ipc.h" From 4a52a7e9fb6fb2e1f0256b2e086cfa313f411cd8 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Fri, 7 Oct 2016 13:48:26 +0200 Subject: [PATCH 04/14] Switch to autotools (GNU build system) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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- 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. --- Makefile | 70 ---- Makefile.am | 560 +++++++++++++++++++++++++++ common.mk | 218 ----------- configure.ac | 164 ++++++++ docs/Makefile | 7 - docs/docs.mk | 46 --- i3-config-wizard/Makefile | 10 - i3-config-wizard/i3-config-wizard.mk | 28 -- i3-dump-log/Makefile | 10 - i3-dump-log/i3-dump-log.mk | 28 -- i3-input/Makefile | 10 - i3-input/i3-input.mk | 28 -- i3-msg/Makefile | 10 - i3-msg/i3-msg.mk | 28 -- i3-nagbar/Makefile | 10 - i3-nagbar/i3-nagbar.mk | 28 -- i3bar/Makefile | 10 - i3bar/i3bar.mk | 28 -- libi3/Makefile | 7 - libi3/libi3.mk | 21 - m4/ax_append_flag.m4 | 71 ++++ m4/ax_cflags_warn_all.m4 | 122 ++++++ m4/ax_check_compile_flag.m4 | 74 ++++ m4/ax_check_enable_debug.m4 | 124 ++++++ m4/ax_check_gnu_make.m4 | 84 ++++ m4/ax_check_link_flag.m4 | 74 ++++ m4/ax_code_coverage.m4 | 273 +++++++++++++ m4/ax_configure_args.m4 | 70 ++++ m4/ax_enable_builddir.m4 | 302 +++++++++++++++ m4/ax_extend_srcdir.m4 | 86 ++++ m4/ax_pthread.m4 | 485 +++++++++++++++++++++++ m4/ax_require_defined.m4 | 37 ++ m4/ax_sanitizers.m4 | 130 +++++++ man/Makefile | 7 - man/man.mk | 42 -- src/Makefile | 10 - src/i3.mk | 102 ----- 37 files changed, 2656 insertions(+), 758 deletions(-) delete mode 100644 Makefile create mode 100644 Makefile.am delete mode 100644 common.mk create mode 100644 configure.ac delete mode 100644 docs/Makefile delete mode 100644 docs/docs.mk delete mode 100644 i3-config-wizard/Makefile delete mode 100644 i3-config-wizard/i3-config-wizard.mk delete mode 100644 i3-dump-log/Makefile delete mode 100644 i3-dump-log/i3-dump-log.mk delete mode 100644 i3-input/Makefile delete mode 100644 i3-input/i3-input.mk delete mode 100644 i3-msg/Makefile delete mode 100644 i3-msg/i3-msg.mk delete mode 100644 i3-nagbar/Makefile delete mode 100644 i3-nagbar/i3-nagbar.mk delete mode 100644 i3bar/Makefile delete mode 100644 i3bar/i3bar.mk delete mode 100644 libi3/Makefile delete mode 100644 libi3/libi3.mk create mode 100644 m4/ax_append_flag.m4 create mode 100644 m4/ax_cflags_warn_all.m4 create mode 100644 m4/ax_check_compile_flag.m4 create mode 100644 m4/ax_check_enable_debug.m4 create mode 100644 m4/ax_check_gnu_make.m4 create mode 100644 m4/ax_check_link_flag.m4 create mode 100644 m4/ax_code_coverage.m4 create mode 100644 m4/ax_configure_args.m4 create mode 100644 m4/ax_enable_builddir.m4 create mode 100644 m4/ax_extend_srcdir.m4 create mode 100644 m4/ax_pthread.m4 create mode 100644 m4/ax_require_defined.m4 create mode 100644 m4/ax_sanitizers.m4 delete mode 100644 man/Makefile delete mode 100644 man/man.mk delete mode 100644 src/Makefile delete mode 100644 src/i3.mk diff --git a/Makefile b/Makefile deleted file mode 100644 index c08f2777..00000000 --- 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 index 00000000..7bba241b --- /dev/null +++ b/Makefile.am @@ -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 index 6032ce6c..00000000 --- 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 index 00000000..573261f5 --- /dev/null +++ b/configure.ac @@ -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 index d6e670c9..00000000 --- a/docs/Makefile +++ /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 index 050df97d..00000000 --- a/docs/docs.mk +++ /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 index d5ac18c6..00000000 --- a/i3-config-wizard/Makefile +++ /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 index 9c01cdb6..00000000 --- a/i3-config-wizard/i3-config-wizard.mk +++ /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 index 2b9e4fe9..00000000 --- a/i3-dump-log/Makefile +++ /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 index 09a793f5..00000000 --- a/i3-dump-log/i3-dump-log.mk +++ /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 index e1c8eae5..00000000 --- a/i3-input/Makefile +++ /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 index ce36f932..00000000 --- a/i3-input/i3-input.mk +++ /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 index fedb31e7..00000000 --- a/i3-msg/Makefile +++ /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 index dfba4d2c..00000000 --- a/i3-msg/i3-msg.mk +++ /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 index 12748e21..00000000 --- a/i3-nagbar/Makefile +++ /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 index c6c7a2ef..00000000 --- a/i3-nagbar/i3-nagbar.mk +++ /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 index cd23cd81..00000000 --- a/i3bar/Makefile +++ /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 index 03c607dd..00000000 --- a/i3bar/i3bar.mk +++ /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 index 2c2f68ad..00000000 --- a/libi3/Makefile +++ /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 index 16e1f149..00000000 --- a/libi3/libi3.mk +++ /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 index 00000000..08f2e07e --- /dev/null +++ b/m4/ax_append_flag.m4 @@ -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 +# Copyright (c) 2011 Maarten Bosmans +# +# 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 . +# +# 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 index 00000000..1f077992 --- /dev/null +++ b/m4/ax_cflags_warn_all.m4 @@ -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 +# Copyright (c) 2010 Rhys Ulerich +# +# 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 . +# +# 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 index 00000000..ca363971 --- /dev/null +++ b/m4/ax_check_compile_flag.m4 @@ -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 +# Copyright (c) 2011 Maarten Bosmans +# +# 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 . +# +# 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 index 00000000..f99d75fe --- /dev/null +++ b/m4/ax_check_enable_debug.m4 @@ -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 +# Copyright (c) 2014, 2015 Philip Withnall +# +# 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 index 00000000..6762e9ed --- /dev/null +++ b/m4/ax_check_gnu_make.m4 @@ -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 +# Copyright (c) 2015 Enrico M. Crisostomo +# +# 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 index 00000000..eb01a6ce --- /dev/null +++ b/m4/ax_check_link_flag.m4 @@ -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 +# Copyright (c) 2011 Maarten Bosmans +# +# 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 . +# +# 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 index 00000000..6c985ebc --- /dev/null +++ b/m4/ax_code_coverage.m4 @@ -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 . + +#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 index 00000000..0726b1bc --- /dev/null +++ b/m4/ax_configure_args.m4 @@ -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 +# +# 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 . +# +# 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 index 00000000..5f4ba327 --- /dev/null +++ b/m4/ax_enable_builddir.m4 @@ -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 +# Copyright (c) 2009 Alan Jenkins +# +# 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 . +# +# 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 index 00000000..a308d67d --- /dev/null +++ b/m4/ax_extend_srcdir.m4 @@ -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 +# +# 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 index 00000000..4c4051ea --- /dev/null +++ b/m4/ax_pthread.m4 @@ -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 +# Copyright (c) 2011 Daniel Richard G. +# +# 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 . +# +# 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 +# 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 ], + [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 ]], + [[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 index 00000000..cae11112 --- /dev/null +++ b/m4/ax_require_defined.m4 @@ -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 +# +# 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 index 00000000..836d4afd --- /dev/null +++ b/m4/ax_sanitizers.m4 @@ -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 option. +# +# SANITIZERS is a whitespace-separated list of sanitizers to offer via +# --enable--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 +# +# 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 index e4cee0cc..00000000 --- a/man/Makefile +++ /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 index e0df386d..00000000 --- a/man/man.mk +++ /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 index 6a37f56c..00000000 --- a/src/Makefile +++ /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 index de3f6845..00000000 --- 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 From 84e70a19a82eeed387160a75f4ca28717cd5db7a Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Mon, 10 Oct 2016 21:14:59 +0200 Subject: [PATCH 05/14] testsuite: use relative paths, set PATH to absolute path This approach works better with autotools, which supports the build directory being complete outside the source tree. --- .../{complete-run.pl => complete-run.pl.in} | 71 ++++++++----------- testcases/lib/SocketActivation.pm | 10 +-- testcases/lib/TestWorker.pm | 2 +- testcases/lib/{i3test.pm => i3test.pm.in} | 2 +- testcases/t/171-config-migrate.t | 2 +- testcases/t/187-commands-parser.t | 2 +- testcases/t/196-randr-output-names.t | 2 +- testcases/t/201-config-parser.t | 2 +- testcases/t/207-shmlog.t | 8 +-- testcases/t/235-check-config-no-x.t | 2 +- 10 files changed, 41 insertions(+), 62 deletions(-) rename testcases/{complete-run.pl => complete-run.pl.in} (89%) rename testcases/lib/{i3test.pm => i3test.pm.in} (99%) diff --git a/testcases/complete-run.pl b/testcases/complete-run.pl.in similarity index 89% rename from testcases/complete-run.pl rename to testcases/complete-run.pl.in index 14c0a15d..d872bda1 100755 --- a/testcases/complete-run.pl +++ b/testcases/complete-run.pl.in @@ -17,19 +17,8 @@ use TAP::Parser::Aggregator; use Time::HiRes qw(time); use IO::Handle; -my $dirname; - -BEGIN { - use File::Basename; - use Cwd qw(abs_path); - - # fileparse()[1] contains the directory portion of the specified path. - # See File::Basename(3p) for more details. - $dirname = (fileparse(abs_path($0)))[1]; -} - # these are shipped with the testsuite -use lib $dirname . 'lib'; +use lib qw(@abs_top_builddir@/testcases/lib @abs_top_srcdir@/testcases/lib); use i3test::Util qw(slurp); use StartXServer; use StatusLine; @@ -82,17 +71,15 @@ my $result = GetOptions( pod2usage(-verbose => 2, -exitcode => 0) if $help; -chdir $dirname or die "Could not chdir into $dirname"; - # Check for missing executables my @binaries = qw( - ../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 + @abs_top_builddir@/i3 + @abs_top_builddir@/i3bar/i3bar + @abs_top_builddir@/i3-config-wizard/i3-config-wizard + @abs_top_builddir@/i3-dump-log/i3-dump-log + @abs_top_builddir@/i3-input/i3-input + @abs_top_builddir@/i3-msg/i3-msg + @abs_top_builddir@/i3-nagbar/i3-nagbar ); foreach my $binary (@binaries) { @@ -100,15 +87,16 @@ foreach my $binary (@binaries) { die "$binary is not an executable" unless -x $binary; } -if ($options{coverage}) { - qx(command -v lcov &> /dev/null); - die "Cannot find lcov needed for coverage testing." if $?; - qx(command -v genhtml &> /dev/null); - die "Cannot find genhtml needed for coverage testing." if $?; - - # clean out the counters that may be left over from previous tests. - qx(lcov -d ../ --zerocounters &> /dev/null); -} +$ENV{PATH} = join(':', + '@abs_top_builddir@/i3-nagbar', + '@abs_top_builddir@/i3-msg', + '@abs_top_builddir@/i3-input', + '@abs_top_builddir@/i3-dump-log', + '@abs_top_builddir@/i3-config-wizard', + '@abs_top_builddir@/i3bar', + '@abs_top_builddir@', + '@abs_top_srcdir@', + $ENV{PATH}); qx(Xephyr -help 2>&1); die "Xephyr was not found in your path. Please install Xephyr (xserver-xephyr on Debian)." if $?; @@ -120,7 +108,17 @@ die "Xephyr was not found in your path. Please install Xephyr (xserver-xephyr on my @testfiles = @ARGV; # if no files were passed on command line, run all tests from t/ -@testfiles = if @testfiles == 0; +if (scalar @testfiles == 0) { + @testfiles = <@abs_top_srcdir@/testcases/t/*.t> if @testfiles == 0; +} else { + @testfiles = map { + # Fully qualify each specified file if necessary + if (! -e $_) { + $_ = "@abs_top_srcdir@/testcases/$_"; + } + $_ + } @testfiles; +} my $numtests = scalar @testfiles; @@ -251,17 +249,6 @@ if ($numtests == 1) { END { cleanup() } -if ($options{coverage}) { - print("\nGenerating test coverage report...\n"); - qx(lcov -d ../ -b ../ --capture -o latest/i3-coverage.info); - qx(genhtml -o latest/i3-coverage latest/i3-coverage.info); - if ($?) { - print("Could not generate test coverage html. Did you compile i3 with test coverage support?\n"); - } else { - print("Test coverage report generated in latest/i3-coverage\n"); - } -} - # Report logfiles that match “(Leak|Address)Sanitizer:”. my @logs_with_leaks; for my $log (<$outdir/i3-log-for-*>) { diff --git a/testcases/lib/SocketActivation.pm b/testcases/lib/SocketActivation.pm index b58707a4..53dbb3b6 100644 --- a/testcases/lib/SocketActivation.pm +++ b/testcases/lib/SocketActivation.pm @@ -62,14 +62,6 @@ sub activate_i3 { mkdir $ENV{XDG_RUNTIME_DIR}; } $ENV{DISPLAY} = $args{display}; - $ENV{PATH} = join(':', - '../i3-nagbar', - '../i3-msg', - '../i3-config-wizard', - '../i3bar', - '..', - $ENV{PATH} - ); # We are about to exec, but we did not modify $^F to include $socket # when creating the socket (because the file descriptor could have a @@ -96,7 +88,7 @@ sub activate_i3 { # the interactive signalhandler to make it crash immediately instead. # Also disable logging to SHM since we redirect the logs anyways. # Force Xinerama because we use Xdmx for multi-monitor tests. - my $i3cmd = abs_path("../i3") . q| --shmlog-size=0 --disable-signalhandler --force-xinerama|; + my $i3cmd = q|i3 --shmlog-size=0 --disable-signalhandler --force-xinerama|; if (!$args{validate_config}) { # We only set logging if i3 is actually started, but not if we only # validate the config file. This is to keep logging to a minimum as diff --git a/testcases/lib/TestWorker.pm b/testcases/lib/TestWorker.pm index 6371591f..aee994f7 100644 --- a/testcases/lib/TestWorker.pm +++ b/testcases/lib/TestWorker.pm @@ -125,7 +125,7 @@ sub worker_wait { package main; local $@; - do "./$file"; + do $file; $test->ok(undef, "$@") if $@; # XXX hack, we need to trigger the read watcher once more diff --git a/testcases/lib/i3test.pm b/testcases/lib/i3test.pm.in similarity index 99% rename from testcases/lib/i3test.pm rename to testcases/lib/i3test.pm.in index 98486122..f9f6e821 100644 --- a/testcases/lib/i3test.pm +++ b/testcases/lib/i3test.pm.in @@ -836,7 +836,7 @@ sub launch_with_config { if ($config ne '-default') { say $fh $config; } else { - open(my $conf_fh, '<', './i3-test.config') + open(my $conf_fh, '<', '@abs_top_srcdir@/testcases/i3-test.config') or $tester->BAIL_OUT("could not open default config: $!"); local $/; say $fh scalar <$conf_fh>; diff --git a/testcases/t/171-config-migrate.t b/testcases/t/171-config-migrate.t index d098ae58..5bd21128 100644 --- a/testcases/t/171-config-migrate.t +++ b/testcases/t/171-config-migrate.t @@ -29,7 +29,7 @@ sub migrate_config { print $fh $config; close($fh); - my $cmd = "sh -c 'exec " . abs_path("../i3-migrate-config-to-v4") . " --v3 <$tmpfile'"; + my $cmd = "sh -c 'exec i3-migrate-config-to-v4 --v3 <$tmpfile'"; return [ split /\n/, qx($cmd) ]; } diff --git a/testcases/t/187-commands-parser.t b/testcases/t/187-commands-parser.t index 73c443f9..dc5b67ed 100644 --- a/testcases/t/187-commands-parser.t +++ b/testcases/t/187-commands-parser.t @@ -25,7 +25,7 @@ sub parser_calls { # TODO: use a timeout, so that we can error out if it doesn’t terminate # TODO: better way of passing arguments - my $stdout = qx(../test.commands_parser '$command' 2>&1 >&-); + my $stdout = qx(test.commands_parser '$command' 2>&1 >&-); # Filter out all debugging output. my @lines = split("\n", $stdout); diff --git a/testcases/t/196-randr-output-names.t b/testcases/t/196-randr-output-names.t index e5049eb8..7c53732b 100644 --- a/testcases/t/196-randr-output-names.t +++ b/testcases/t/196-randr-output-names.t @@ -28,7 +28,7 @@ font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1 workspace 2 output DVI-I_1/digital EOT -my $output = qx(../i3 -C -c $filename); +my $output = qx(i3 -C -c $filename); unlike($output, qr/ERROR/, 'no errors in i3 -C'); close($fh); diff --git a/testcases/t/201-config-parser.t b/testcases/t/201-config-parser.t index d92d3b20..6cd84b6f 100644 --- a/testcases/t/201-config-parser.t +++ b/testcases/t/201-config-parser.t @@ -25,7 +25,7 @@ sub parser_calls { my ($command) = @_; my $stdout; - run [ '../test.config_parser', $command ], + run [ 'test.config_parser', $command ], '>/dev/null', '2>', \$stdout; # TODO: use a timeout, so that we can error out if it doesn’t terminate diff --git a/testcases/t/207-shmlog.t b/testcases/t/207-shmlog.t index b63a7499..b6c6d776 100644 --- a/testcases/t/207-shmlog.t +++ b/testcases/t/207-shmlog.t @@ -33,7 +33,7 @@ my $pid = launch_with_config($config); my $stdout; my $stderr; -run [ '../i3-dump-log/i3-dump-log' ], +run [ 'i3-dump-log' ], '>', \$stdout, '2>', \$stderr; @@ -49,7 +49,7 @@ cmd 'shmlog on'; my $random_nop = mktemp('nop.XXXXXX'); cmd "nop $random_nop"; -run [ '../i3-dump-log/i3-dump-log' ], +run [ 'i3-dump-log' ], '>', \$stdout, '2>', \$stderr; @@ -62,7 +62,7 @@ like($stderr, qr#^$#, 'stderr empty'); cmd 'shmlog ' . (23 * 1024 * 1024); -run [ '../i3-dump-log/i3-dump-log' ], +run [ 'i3-dump-log' ], '>', \$stdout, '2>', \$stderr; @@ -75,7 +75,7 @@ like($stderr, qr#^$#, 'stderr empty'); cmd 'shmlog off'; -run [ '../i3-dump-log/i3-dump-log' ], +run [ 'i3-dump-log' ], '>', \$stdout, '2>', \$stderr; diff --git a/testcases/t/235-check-config-no-x.t b/testcases/t/235-check-config-no-x.t index ec17353e..5e87d992 100644 --- a/testcases/t/235-check-config-no-x.t +++ b/testcases/t/235-check-config-no-x.t @@ -26,7 +26,7 @@ sub check_config { my ($config) = @_; my ($fh, $tmpfile) = tempfile(UNLINK => 1); print $fh $config; - my $output = qx(DISPLAY= ../i3 -C -c $tmpfile 2>&1); + my $output = qx(DISPLAY= i3 -C -c $tmpfile 2>&1); my $retval = $?; $fh->flush; close($fh); From 567897bec6378cd771c8a554b33c0f068786e2ca Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Mon, 10 Oct 2016 21:16:09 +0200 Subject: [PATCH 06/14] Switch from I3__FILE__ to STRIPPED__FILE__ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …as we now use the m4/ax_extend_srcdir.m4 macro, which defines STRIPPED__FILE__ (the macro is not i3-specific). --- include/libi3.h | 2 +- include/log.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/libi3.h b/include/libi3.h index 5123ce01..0d9189f3 100644 --- a/include/libi3.h +++ b/include/libi3.h @@ -89,7 +89,7 @@ void errorlog(char *fmt, ...) #if !defined(DLOG) void debuglog(char *fmt, ...) __attribute__((format(printf, 1, 2))); -#define DLOG(fmt, ...) debuglog("%s:%s:%d - " fmt, I3__FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__) +#define DLOG(fmt, ...) debuglog("%s:%s:%d - " fmt, STRIPPED__FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__) #endif /** diff --git a/include/log.h b/include/log.h index e7fc8acb..b683529c 100644 --- a/include/log.h +++ b/include/log.h @@ -27,7 +27,7 @@ is, delete the preceding comma */ #define LOG(fmt, ...) verboselog(fmt, ##__VA_ARGS__) #define ELOG(fmt, ...) errorlog("ERROR: " fmt, ##__VA_ARGS__) -#define DLOG(fmt, ...) debuglog("%s:%s:%d - " fmt, I3__FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__) +#define DLOG(fmt, ...) debuglog("%s:%s:%d - " fmt, STRIPPED__FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__) extern char *errorfilename; extern char *shmlogname; From c2bd10c482173b72a74f568348305ea87d3b4dd9 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Tue, 11 Oct 2016 08:53:58 +0200 Subject: [PATCH 07/14] Move/rename config files/.desktop files into subdirs This makes it easier to install them with the correct name when using autotools. --- i3.config => etc/config | 0 i3.config.keycodes => etc/config.keycodes | 0 i3.applications.desktop => share/applications/i3.desktop | 0 .../xsessions/i3-with-shmlog.desktop | 0 i3.xsession.desktop => share/xsessions/i3.desktop | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename i3.config => etc/config (100%) rename i3.config.keycodes => etc/config.keycodes (100%) rename i3.applications.desktop => share/applications/i3.desktop (100%) rename i3-with-shmlog.xsession.desktop => share/xsessions/i3-with-shmlog.desktop (100%) rename i3.xsession.desktop => share/xsessions/i3.desktop (100%) diff --git a/i3.config b/etc/config similarity index 100% rename from i3.config rename to etc/config diff --git a/i3.config.keycodes b/etc/config.keycodes similarity index 100% rename from i3.config.keycodes rename to etc/config.keycodes diff --git a/i3.applications.desktop b/share/applications/i3.desktop similarity index 100% rename from i3.applications.desktop rename to share/applications/i3.desktop diff --git a/i3-with-shmlog.xsession.desktop b/share/xsessions/i3-with-shmlog.desktop similarity index 100% rename from i3-with-shmlog.xsession.desktop rename to share/xsessions/i3-with-shmlog.desktop diff --git a/i3.xsession.desktop b/share/xsessions/i3.desktop similarity index 100% rename from i3.xsession.desktop rename to share/xsessions/i3.desktop From f354f534357798eb3ba497b7143132f41ff090f6 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Tue, 11 Oct 2016 09:13:35 +0200 Subject: [PATCH 08/14] Ensure all *.[ch] files include config.h Including config.h is necessary to get e.g. the _GNU_SOURCE define and any other definitions that autoconf declares. Hence, config.h needs to be included as the first header in each file. This is done either via: 1. Including "common.h" (i3bar) 2. Including "libi3.h" 3. Including "all.h" (i3) 4. Including directly Also remove now-unused I3__FILE__, add copyright/license statement where missing and switch include/all.h to #pragma once. --- i3-config-wizard/main.c | 2 ++ i3-dump-log/main.c | 2 ++ i3-input/i3-input.h | 2 ++ i3-input/main.c | 4 ++-- i3-msg/main.c | 3 ++- i3-nagbar/i3-nagbar.h | 2 ++ i3-nagbar/main.c | 3 ++- i3bar/include/child.h | 2 ++ i3bar/include/common.h | 2 ++ i3bar/include/configuration.h | 2 ++ i3bar/include/ipc.h | 2 ++ i3bar/include/mode.h | 2 ++ i3bar/include/outputs.h | 2 ++ i3bar/include/parse_json_header.h | 2 ++ i3bar/include/util.h | 2 ++ i3bar/include/workspaces.h | 4 ++-- i3bar/include/xcb.h | 2 ++ i3bar/src/child.c | 4 ++-- i3bar/src/config.c | 4 ++-- i3bar/src/ipc.c | 4 ++-- i3bar/src/main.c | 4 ++-- i3bar/src/mode.c | 4 ++-- i3bar/src/outputs.c | 4 ++-- i3bar/src/parse_json_header.c | 4 ++-- i3bar/src/workspaces.c | 4 ++-- i3bar/src/xcb.c | 3 ++- include/all.h | 7 +++---- include/assignments.h | 2 ++ include/bindings.h | 2 ++ include/click.h | 2 ++ include/cmdparse.h | 2 ++ include/commands.h | 2 ++ include/commands_parser.h | 2 ++ include/con.h | 2 ++ include/config_directives.h | 2 ++ include/config_parser.h | 2 ++ include/configuration.h | 3 ++- include/data.h | 3 ++- include/debug.h | 2 ++ include/display_version.h | 2 ++ include/ewmh.h | 2 ++ include/fake_outputs.h | 2 ++ include/floating.h | 2 ++ include/handlers.h | 2 ++ include/i3.h | 2 ++ include/ipc.h | 2 ++ include/key_press.h | 2 ++ include/libi3.h | 2 ++ include/load_layout.h | 2 ++ include/log.h | 2 ++ include/main.h | 2 ++ include/manage.h | 2 ++ include/match.h | 2 ++ include/move.h | 2 ++ include/output.h | 2 ++ include/randr.h | 2 ++ include/regex.h | 2 ++ include/render.h | 2 ++ include/resize.h | 2 ++ include/restore_layout.h | 2 ++ include/scratchpad.h | 2 ++ include/shmlog.h | 2 ++ include/sighandler.h | 2 ++ include/startup.h | 2 ++ include/tree.h | 2 ++ include/util.h | 2 ++ include/window.h | 2 ++ include/workspace.h | 2 ++ include/x.h | 2 ++ include/xcb.h | 2 ++ include/xcursor.h | 2 ++ include/xinerama.h | 2 ++ include/yajl_utils.h | 2 ++ libi3/dpi.c | 1 + libi3/draw_util.c | 4 ++-- libi3/fake_configure_notify.c | 4 ++-- libi3/font.c | 4 ++-- libi3/format_placeholders.c | 4 ++-- libi3/get_colorpixel.c | 4 ++-- libi3/get_config_path.c | 1 + libi3/get_exe_path.c | 11 +++++++++-- libi3/get_mod_mask.c | 4 ++-- libi3/get_process_filename.c | 4 ++-- libi3/ipc_connect.c | 4 ++-- libi3/ipc_recv_message.c | 4 ++-- libi3/ipc_send_message.c | 4 ++-- libi3/is_debug_build.c | 9 +++++++++ libi3/mkdirp.c | 8 ++++++++ libi3/resolve_tilde.c | 2 +- libi3/root_atom_contents.c | 4 ++-- libi3/safewrappers.c | 4 ++-- libi3/string.c | 3 +-- libi3/strndup.c | 4 ++-- libi3/ucs2_conversion.c | 4 ++-- src/assignments.c | 2 -- src/click.c | 2 -- src/commands.c | 5 ++--- src/commands_parser.c | 6 ++---- src/con.c | 3 +-- src/config.c | 3 +-- src/config_directives.c | 6 ++---- src/config_parser.c | 6 ++---- src/debug.c | 4 ++-- src/display_version.c | 5 ++--- src/ewmh.c | 2 -- src/fake_outputs.c | 2 -- src/floating.c | 2 -- src/handlers.c | 2 -- src/ipc.c | 3 +-- src/key_press.c | 2 -- src/load_layout.c | 2 -- src/log.c | 4 ++-- src/main.c | 5 ++--- src/manage.c | 3 +-- src/match.c | 2 -- src/move.c | 2 -- src/output.c | 2 -- src/randr.c | 2 -- src/regex.c | 2 -- src/render.c | 2 -- src/resize.c | 2 -- src/restore_layout.c | 2 -- src/scratchpad.c | 2 -- src/sighandler.c | 2 -- src/startup.c | 3 +-- src/tree.c | 2 -- src/util.c | 2 -- src/version.c | 2 ++ src/window.c | 2 -- src/workspace.c | 2 -- src/x.c | 2 -- src/xcb.c | 2 -- src/xcursor.c | 4 ++-- src/xinerama.c | 2 -- 134 files changed, 230 insertions(+), 149 deletions(-) diff --git a/i3-config-wizard/main.c b/i3-config-wizard/main.c index 284f15fa..2bb43270 100644 --- a/i3-config-wizard/main.c +++ b/i3-config-wizard/main.c @@ -8,6 +8,8 @@ * keysyms. * */ +#include + #if defined(__FreeBSD__) #include #endif diff --git a/i3-dump-log/main.c b/i3-dump-log/main.c index d9b0613c..ec9e577d 100644 --- a/i3-dump-log/main.c +++ b/i3-dump-log/main.c @@ -7,6 +7,8 @@ * i3-dump-log/main.c: Dumps the i3 SHM log to stdout. * */ +#include + #include #include #include diff --git a/i3-input/i3-input.h b/i3-input/i3-input.h index fcf9edc3..d347506f 100644 --- a/i3-input/i3-input.h +++ b/i3-input/i3-input.h @@ -1,5 +1,7 @@ #pragma once +#include + #include #define die(...) errx(EXIT_FAILURE, __VA_ARGS__); diff --git a/i3-input/main.c b/i3-input/main.c index b467c4c3..97d574a2 100644 --- a/i3-input/main.c +++ b/i3-input/main.c @@ -8,6 +8,8 @@ * to i3. * */ +#include "libi3.h" + #include #include #include @@ -31,8 +33,6 @@ #include "i3-input.h" -#include "libi3.h" - /* IPC format string. %s will be replaced with what the user entered, then * the command will be sent to i3 */ static char *format; diff --git a/i3-msg/main.c b/i3-msg/main.c index 658c33b4..51612459 100644 --- a/i3-msg/main.c +++ b/i3-msg/main.c @@ -14,6 +14,8 @@ * Additionally, it’s even useful sometimes :-). * */ +#include "libi3.h" + #include #include #include @@ -34,7 +36,6 @@ #include #include -#include "libi3.h" #include static char *socket_path; diff --git a/i3-nagbar/i3-nagbar.h b/i3-nagbar/i3-nagbar.h index fc076d72..c5e94cc6 100644 --- a/i3-nagbar/i3-nagbar.h +++ b/i3-nagbar/i3-nagbar.h @@ -1,5 +1,7 @@ #pragma once +#include + #include #define die(...) errx(EXIT_FAILURE, __VA_ARGS__); diff --git a/i3-nagbar/main.c b/i3-nagbar/main.c index 674fcb7d..2e9e77d4 100644 --- a/i3-nagbar/main.c +++ b/i3-nagbar/main.c @@ -8,6 +8,8 @@ * when the user has an error in their configuration file. * */ +#include "libi3.h" + #include #include #include @@ -30,7 +32,6 @@ #include #include -#include "libi3.h" #include "i3-nagbar.h" /** This is the equivalent of XC_left_ptr. I’m not sure why xcb doesn’t have a diff --git a/i3bar/include/child.h b/i3bar/include/child.h index 873a3465..0871c7f4 100644 --- a/i3bar/include/child.h +++ b/i3bar/include/child.h @@ -9,6 +9,8 @@ */ #pragma once +#include + #include #define STDIN_CHUNK_SIZE 1024 diff --git a/i3bar/include/common.h b/i3bar/include/common.h index c6bb0dba..0929e408 100644 --- a/i3bar/include/common.h +++ b/i3bar/include/common.h @@ -7,6 +7,8 @@ */ #pragma once +#include + #include #include #include diff --git a/i3bar/include/configuration.h b/i3bar/include/configuration.h index 2a059046..c7c1f5e2 100644 --- a/i3bar/include/configuration.h +++ b/i3bar/include/configuration.h @@ -9,6 +9,8 @@ */ #pragma once +#include + #include "common.h" typedef enum { diff --git a/i3bar/include/ipc.h b/i3bar/include/ipc.h index 686c0322..5056e5f3 100644 --- a/i3bar/include/ipc.h +++ b/i3bar/include/ipc.h @@ -9,6 +9,8 @@ */ #pragma once +#include + #include /* diff --git a/i3bar/include/mode.h b/i3bar/include/mode.h index 828d4906..5c87d904 100644 --- a/i3bar/include/mode.h +++ b/i3bar/include/mode.h @@ -9,6 +9,8 @@ */ #pragma once +#include + #include #include "common.h" diff --git a/i3bar/include/outputs.h b/i3bar/include/outputs.h index 63cfca7f..3067581d 100644 --- a/i3bar/include/outputs.h +++ b/i3bar/include/outputs.h @@ -9,6 +9,8 @@ */ #pragma once +#include + #include #include diff --git a/i3bar/include/parse_json_header.h b/i3bar/include/parse_json_header.h index 41e97de2..d834fe05 100644 --- a/i3bar/include/parse_json_header.h +++ b/i3bar/include/parse_json_header.h @@ -10,6 +10,8 @@ */ #pragma once +#include + #include /** diff --git a/i3bar/include/util.h b/i3bar/include/util.h index dfbfd6bf..3af79ed7 100644 --- a/i3bar/include/util.h +++ b/i3bar/include/util.h @@ -7,6 +7,8 @@ */ #pragma once +#include + #include "queue.h" /* Get the maximum/minimum of x and y */ diff --git a/i3bar/include/workspaces.h b/i3bar/include/workspaces.h index 5ed84de8..dde8b6e1 100644 --- a/i3bar/include/workspaces.h +++ b/i3bar/include/workspaces.h @@ -9,10 +9,10 @@ */ #pragma once -#include - #include "common.h" +#include + typedef struct i3_ws i3_ws; TAILQ_HEAD(ws_head, i3_ws); diff --git a/i3bar/include/xcb.h b/i3bar/include/xcb.h index e5af39fa..7783e877 100644 --- a/i3bar/include/xcb.h +++ b/i3bar/include/xcb.h @@ -9,6 +9,8 @@ */ #pragma once +#include + #include //#include "outputs.h" diff --git a/i3bar/src/child.c b/i3bar/src/child.c index 295eb76f..1fd901ce 100644 --- a/i3bar/src/child.c +++ b/i3bar/src/child.c @@ -7,6 +7,8 @@ * child.c: Getting input for the statusline * */ +#include "common.h" + #include #include #include @@ -25,8 +27,6 @@ #include #include -#include "common.h" - /* Global variables for child_*() */ i3bar_child child; diff --git a/i3bar/src/config.c b/i3bar/src/config.c index 5c23bc78..d065ff4c 100644 --- a/i3bar/src/config.c +++ b/i3bar/src/config.c @@ -7,6 +7,8 @@ * config.c: Parses the configuration (received from i3). * */ +#include "common.h" + #include #include #include @@ -17,8 +19,6 @@ #include -#include "common.h" - static char *cur_key; static bool parsing_bindings; static bool parsing_tray_outputs; diff --git a/i3bar/src/ipc.c b/i3bar/src/ipc.c index 34898663..4a090ad7 100644 --- a/i3bar/src/ipc.c +++ b/i3bar/src/ipc.c @@ -7,6 +7,8 @@ * ipc.c: Communicating with i3 * */ +#include "common.h" + #include #include #include @@ -21,8 +23,6 @@ #include #endif -#include "common.h" - ev_io *i3_connection; const char *sock_path; diff --git a/i3bar/src/main.c b/i3bar/src/main.c index 14e42a2b..be684fc5 100644 --- a/i3bar/src/main.c +++ b/i3bar/src/main.c @@ -5,6 +5,8 @@ * © 2010 Axel Wagner and contributors (see also: LICENSE) * */ +#include "common.h" + #include #include #include @@ -15,8 +17,6 @@ #include #include -#include "common.h" - /* * Having verboselog(), errorlog() and debuglog() is necessary when using libi3. * diff --git a/i3bar/src/mode.c b/i3bar/src/mode.c index 3e52f0b1..17e7b97e 100644 --- a/i3bar/src/mode.c +++ b/i3bar/src/mode.c @@ -7,6 +7,8 @@ * mode.c: Handle mode event and show current binding mode in the bar * */ +#include "common.h" + #include #include #include @@ -14,8 +16,6 @@ #include #include -#include "common.h" - /* A datatype to pass through the callbacks to save the state */ struct mode_json_params { char *json; diff --git a/i3bar/src/outputs.c b/i3bar/src/outputs.c index b53d8cc8..480c00be 100644 --- a/i3bar/src/outputs.c +++ b/i3bar/src/outputs.c @@ -7,6 +7,8 @@ * outputs.c: Maintaining the outputs list * */ +#include "common.h" + #include #include #include @@ -15,8 +17,6 @@ #include #include -#include "common.h" - /* A datatype to pass through the callbacks to save the state */ struct outputs_json_params { struct outputs_head *outputs; diff --git a/i3bar/src/parse_json_header.c b/i3bar/src/parse_json_header.c index 1cd95106..3d4c2a67 100644 --- a/i3bar/src/parse_json_header.c +++ b/i3bar/src/parse_json_header.c @@ -8,6 +8,8 @@ * protocol version and features. * */ +#include "common.h" + #include #include #include @@ -25,8 +27,6 @@ #include #include -#include "common.h" - static enum { KEY_VERSION, KEY_STOP_SIGNAL, diff --git a/i3bar/src/workspaces.c b/i3bar/src/workspaces.c index 1187a946..23324989 100644 --- a/i3bar/src/workspaces.c +++ b/i3bar/src/workspaces.c @@ -7,6 +7,8 @@ * workspaces.c: Maintaining the workspace lists * */ +#include "common.h" + #include #include #include @@ -14,8 +16,6 @@ #include #include -#include "common.h" - /* A datatype to pass through the callbacks to save the state */ struct workspaces_json_params { struct ws_head *workspaces; diff --git a/i3bar/src/xcb.c b/i3bar/src/xcb.c index 32187445..2715e447 100644 --- a/i3bar/src/xcb.c +++ b/i3bar/src/xcb.c @@ -7,6 +7,8 @@ * xcb.c: Communicating with X * */ +#include "common.h" + #include #include #include @@ -32,7 +34,6 @@ #include #endif -#include "common.h" #include "libi3.h" /** This is the equivalent of XC_left_ptr. I’m not sure why xcb doesn’t have a diff --git a/include/all.h b/include/all.h index b323f863..c26835b9 100644 --- a/include/all.h +++ b/include/all.h @@ -10,8 +10,9 @@ * compile-time. * */ -#ifndef I3_ALL_H -#define I3_ALL_H +#pragma once + +#include #include #include @@ -81,5 +82,3 @@ #include "display_version.h" #include "restore_layout.h" #include "main.h" - -#endif diff --git a/include/assignments.h b/include/assignments.h index 22ebafc3..a4dc766b 100644 --- a/include/assignments.h +++ b/include/assignments.h @@ -9,6 +9,8 @@ */ #pragma once +#include + /** * Checks the list of assignments for the given window and runs all matching * ones (unless they have already been run for this specific window). diff --git a/include/bindings.h b/include/bindings.h index d15598ea..0fcc4df4 100644 --- a/include/bindings.h +++ b/include/bindings.h @@ -9,6 +9,8 @@ */ #pragma once +#include + extern pid_t command_error_nagbar_pid; /** diff --git a/include/click.h b/include/click.h index 7ce80d97..0d57abf7 100644 --- a/include/click.h +++ b/include/click.h @@ -9,6 +9,8 @@ */ #pragma once +#include + /** * The button press X callback. This function determines whether the floating * modifier is pressed and where the user clicked (decoration, border, inside diff --git a/include/cmdparse.h b/include/cmdparse.h index 2ffa49b0..a2cbb17e 100644 --- a/include/cmdparse.h +++ b/include/cmdparse.h @@ -9,4 +9,6 @@ */ #pragma once +#include + char *parse_cmd(const char *new); diff --git a/include/commands.h b/include/commands.h index 9f83cb21..a57b2925 100644 --- a/include/commands.h +++ b/include/commands.h @@ -9,6 +9,8 @@ */ #pragma once +#include + #include "commands_parser.h" /** The beginning of the prototype for every cmd_ function. */ diff --git a/include/commands_parser.h b/include/commands_parser.h index 1acb7fae..88b3f6d0 100644 --- a/include/commands_parser.h +++ b/include/commands_parser.h @@ -9,6 +9,8 @@ */ #pragma once +#include + #include /* diff --git a/include/con.h b/include/con.h index 73ae0f38..0c532207 100644 --- a/include/con.h +++ b/include/con.h @@ -11,6 +11,8 @@ */ #pragma once +#include + /** * Create a new container (and attach it to the given parent, if not NULL). * This function only initializes the data structures. diff --git a/include/config_directives.h b/include/config_directives.h index bcbea111..7f1bfe4a 100644 --- a/include/config_directives.h +++ b/include/config_directives.h @@ -9,6 +9,8 @@ */ #pragma once +#include + #include "config_parser.h" /** diff --git a/include/config_parser.h b/include/config_parser.h index 2ba79a68..ace4041d 100644 --- a/include/config_parser.h +++ b/include/config_parser.h @@ -9,6 +9,8 @@ */ #pragma once +#include + #include SLIST_HEAD(variables_head, Variable); diff --git a/include/configuration.h b/include/configuration.h index ced104b6..b7cdc804 100644 --- a/include/configuration.h +++ b/include/configuration.h @@ -12,10 +12,11 @@ */ #pragma once +#include "libi3.h" + #include #include "queue.h" #include "i3.h" -#include "libi3.h" typedef struct Config Config; typedef struct Barconfig Barconfig; diff --git a/include/data.h b/include/data.h index 70edd222..a729b21e 100644 --- a/include/data.h +++ b/include/data.h @@ -9,6 +9,8 @@ */ #pragma once +#include "libi3.h" + #define SN_API_NOT_YET_FROZEN 1 #include @@ -17,7 +19,6 @@ #include #include -#include "libi3.h" #include "queue.h" /* diff --git a/include/debug.h b/include/debug.h index 3875ec6b..ab5f3808 100644 --- a/include/debug.h +++ b/include/debug.h @@ -10,4 +10,6 @@ */ #pragma once +#include + int handle_event(void *ignored, xcb_connection_t *c, xcb_generic_event_t *e); diff --git a/include/display_version.h b/include/display_version.h index b1a5a0e0..d8dac30b 100644 --- a/include/display_version.h +++ b/include/display_version.h @@ -9,6 +9,8 @@ */ #pragma once +#include + /** * Connects to i3 to find out the currently running version. Useful since it * might be different from the version compiled into this binary (maybe the diff --git a/include/ewmh.h b/include/ewmh.h index 2a55ab9f..545e3a6b 100644 --- a/include/ewmh.h +++ b/include/ewmh.h @@ -9,6 +9,8 @@ */ #pragma once +#include + /** * Updates _NET_CURRENT_DESKTOP with the current desktop number. * diff --git a/include/fake_outputs.h b/include/fake_outputs.h index 32b07fa9..27a0d41a 100644 --- a/include/fake_outputs.h +++ b/include/fake_outputs.h @@ -10,6 +10,8 @@ */ #pragma once +#include + /** * Creates outputs according to the given specification. * The specification must be in the format wxh+x+y, for example 1024x768+0+0, diff --git a/include/floating.h b/include/floating.h index e187b98f..babfafc9 100644 --- a/include/floating.h +++ b/include/floating.h @@ -9,6 +9,8 @@ */ #pragma once +#include + #include "tree.h" /** Callback for dragging */ diff --git a/include/handlers.h b/include/handlers.h index d80a24f8..1d5a3865 100644 --- a/include/handlers.h +++ b/include/handlers.h @@ -10,6 +10,8 @@ */ #pragma once +#include + #include extern int randr_base; diff --git a/include/i3.h b/include/i3.h index 254c4d23..4d13d448 100644 --- a/include/i3.h +++ b/include/i3.h @@ -9,6 +9,8 @@ */ #pragma once +#include + #include #include diff --git a/include/ipc.h b/include/ipc.h index a9323751..5c528a6d 100644 --- a/include/ipc.h +++ b/include/ipc.h @@ -9,6 +9,8 @@ */ #pragma once +#include + #include #include #include diff --git a/include/key_press.h b/include/key_press.h index bbfec83b..8f23854b 100644 --- a/include/key_press.h +++ b/include/key_press.h @@ -9,6 +9,8 @@ */ #pragma once +#include + /** * There was a key press. We compare this key code with our bindings table and pass * the bound action to parse_command(). diff --git a/include/libi3.h b/include/libi3.h index 0d9189f3..11ca3127 100644 --- a/include/libi3.h +++ b/include/libi3.h @@ -10,6 +10,8 @@ */ #pragma once +#include + #include #include #include diff --git a/include/load_layout.h b/include/load_layout.h index f8b7da20..0dd81318 100644 --- a/include/load_layout.h +++ b/include/load_layout.h @@ -10,6 +10,8 @@ */ #pragma once +#include + typedef enum { // We could not determine the content of the JSON file. This typically // means it’s unreadable or contains garbage. diff --git a/include/log.h b/include/log.h index b683529c..5c530231 100644 --- a/include/log.h +++ b/include/log.h @@ -9,6 +9,8 @@ */ #pragma once +#include + #include #include diff --git a/include/main.h b/include/main.h index 1ce53954..1f213cce 100644 --- a/include/main.h +++ b/include/main.h @@ -9,6 +9,8 @@ */ #pragma once +#include + /** * Enable or disable the main X11 event handling function. * This is used by drag_pointer() which has its own, modal event handler, which diff --git a/include/manage.h b/include/manage.h index 520f0c06..55b0a85b 100644 --- a/include/manage.h +++ b/include/manage.h @@ -9,6 +9,8 @@ */ #pragma once +#include + #include "data.h" /** diff --git a/include/match.h b/include/match.h index 64a4f22b..4ff8c485 100644 --- a/include/match.h +++ b/include/match.h @@ -13,6 +13,8 @@ */ #pragma once +#include + /* * Initializes the Match data structure. This function is necessary because the * members representing boolean values (like dock) need to be initialized with diff --git a/include/move.h b/include/move.h index 7debcf28..64b12b80 100644 --- a/include/move.h +++ b/include/move.h @@ -9,6 +9,8 @@ */ #pragma once +#include + /** * Moves the given container in the given direction (TOK_LEFT, TOK_RIGHT, * TOK_UP, TOK_DOWN from cmdparse.l) diff --git a/include/output.h b/include/output.h index 03a4fbcf..b13c9728 100644 --- a/include/output.h +++ b/include/output.h @@ -9,6 +9,8 @@ */ #pragma once +#include + /** * Returns the output container below the given output container. * diff --git a/include/randr.h b/include/randr.h index 30dd955d..55068316 100644 --- a/include/randr.h +++ b/include/randr.h @@ -11,6 +11,8 @@ */ #pragma once +#include + #include "data.h" #include diff --git a/include/regex.h b/include/regex.h index 2e2f22fd..abda3cd7 100644 --- a/include/regex.h +++ b/include/regex.h @@ -9,6 +9,8 @@ */ #pragma once +#include + /** * Creates a new 'regex' struct containing the given pattern and a PCRE * compiled regular expression. Also, calls pcre_study because this regex will diff --git a/include/render.h b/include/render.h index d32f0310..750b7d31 100644 --- a/include/render.h +++ b/include/render.h @@ -10,6 +10,8 @@ */ #pragma once +#include + /* This is used to keep a state to pass around when rendering a con in render_con(). */ typedef struct render_params { /* A copy of the coordinates of the container which is being rendered. */ diff --git a/include/resize.h b/include/resize.h index 945678d9..7b33de90 100644 --- a/include/resize.h +++ b/include/resize.h @@ -9,6 +9,8 @@ */ #pragma once +#include + bool resize_find_tiling_participants(Con **current, Con **other, direction_t direction); int resize_graphical_handler(Con *first, Con *second, orientation_t orientation, const xcb_button_press_event_t *event); diff --git a/include/restore_layout.h b/include/restore_layout.h index f952834c..98b257d9 100644 --- a/include/restore_layout.h +++ b/include/restore_layout.h @@ -10,6 +10,8 @@ */ #pragma once +#include + /** * Opens a separate connection to X11 for placeholder windows when restoring * layouts. This is done as a safety measure (users can xkill a placeholder diff --git a/include/scratchpad.h b/include/scratchpad.h index b385550c..241653c0 100644 --- a/include/scratchpad.h +++ b/include/scratchpad.h @@ -9,6 +9,8 @@ */ #pragma once +#include + /** * Moves the specified window to the __i3_scratch workspace, making it floating * and setting the appropriate scratchpad_state. diff --git a/include/shmlog.h b/include/shmlog.h index 0216c8d6..b90211ef 100644 --- a/include/shmlog.h +++ b/include/shmlog.h @@ -10,6 +10,8 @@ */ #pragma once +#include + #include #if !defined(__OpenBSD__) #include diff --git a/include/sighandler.h b/include/sighandler.h index 56680bc4..20ede4eb 100644 --- a/include/sighandler.h +++ b/include/sighandler.h @@ -11,6 +11,8 @@ */ #pragma once +#include + /** * Setup signal handlers to safely handle SIGSEGV and SIGFPE * diff --git a/include/startup.h b/include/startup.h index 9729cdc2..5da221e1 100644 --- a/include/startup.h +++ b/include/startup.h @@ -12,6 +12,8 @@ */ #pragma once +#include + #define SN_API_NOT_YET_FROZEN 1 #include diff --git a/include/tree.h b/include/tree.h index c64c173d..62461def 100644 --- a/include/tree.h +++ b/include/tree.h @@ -9,6 +9,8 @@ */ #pragma once +#include + extern Con *croot; /* TODO: i am not sure yet how much access to the focused container should * be permitted to source files */ diff --git a/include/util.h b/include/util.h index 9915c1a8..e5ba3341 100644 --- a/include/util.h +++ b/include/util.h @@ -10,6 +10,8 @@ */ #pragma once +#include + #include #include "data.h" diff --git a/include/window.h b/include/window.h index d0b97f1d..77e3f48f 100644 --- a/include/window.h +++ b/include/window.h @@ -9,6 +9,8 @@ */ #pragma once +#include + /** * Frees an i3Window and all its members. * diff --git a/include/workspace.h b/include/workspace.h index 8e5ff841..8d109e9e 100644 --- a/include/workspace.h +++ b/include/workspace.h @@ -10,6 +10,8 @@ */ #pragma once +#include + #include "data.h" #include "tree.h" #include "randr.h" diff --git a/include/x.h b/include/x.h index 39e0eb2f..3e81bc36 100644 --- a/include/x.h +++ b/include/x.h @@ -10,6 +10,8 @@ */ #pragma once +#include + /** Stores the X11 window ID of the currently focused window */ extern xcb_window_t focused_id; diff --git a/include/xcb.h b/include/xcb.h index b7eed2cb..94f2945d 100644 --- a/include/xcb.h +++ b/include/xcb.h @@ -9,6 +9,8 @@ */ #pragma once +#include + #include "data.h" #include "xcursor.h" diff --git a/include/xcursor.h b/include/xcursor.h index e0ee9813..804e1f84 100644 --- a/include/xcursor.h +++ b/include/xcursor.h @@ -9,6 +9,8 @@ */ #pragma once +#include + #include enum xcursor_cursor_t { diff --git a/include/xinerama.h b/include/xinerama.h index 936b9653..f01ee568 100644 --- a/include/xinerama.h +++ b/include/xinerama.h @@ -11,6 +11,8 @@ */ #pragma once +#include + #include "data.h" /** diff --git a/include/yajl_utils.h b/include/yajl_utils.h index 93c63d8f..6ab1ff1c 100644 --- a/include/yajl_utils.h +++ b/include/yajl_utils.h @@ -9,6 +9,8 @@ */ #pragma once +#include + #include #include #include diff --git a/libi3/dpi.c b/libi3/dpi.c index f105ef9a..a832a689 100644 --- a/libi3/dpi.c +++ b/libi3/dpi.c @@ -6,6 +6,7 @@ * */ #include "libi3.h" + #include #include #include diff --git a/libi3/draw_util.c b/libi3/draw_util.c index 56b1bce8..e471405b 100644 --- a/libi3/draw_util.c +++ b/libi3/draw_util.c @@ -6,6 +6,8 @@ * draw.c: Utility for drawing. * */ +#include "libi3.h" + #include #include #include @@ -13,8 +15,6 @@ #include #include -#include "libi3.h" - /* The default visual_type to use if none is specified when creating the surface. Must be defined globally. */ xcb_visualtype_t *visual_type; diff --git a/libi3/fake_configure_notify.c b/libi3/fake_configure_notify.c index 2c4d4559..145f4512 100644 --- a/libi3/fake_configure_notify.c +++ b/libi3/fake_configure_notify.c @@ -5,14 +5,14 @@ * © 2009 Michael Stapelberg and contributors (see also: LICENSE) * */ +#include "libi3.h" + #include #include #include #include -#include "libi3.h" - /* * Generates a configure_notify event and sends it to the given window * Applications need this to think they’ve configured themselves correctly. diff --git a/libi3/font.c b/libi3/font.c index 7c305e25..fa848481 100644 --- a/libi3/font.c +++ b/libi3/font.c @@ -5,6 +5,8 @@ * © 2009 Michael Stapelberg and contributors (see also: LICENSE) * */ +#include "libi3.h" + #include #include #include @@ -15,8 +17,6 @@ #include #include -#include "libi3.h" - static const i3Font *savedFont = NULL; static xcb_visualtype_t *root_visual_type; diff --git a/libi3/format_placeholders.c b/libi3/format_placeholders.c index c9cbbea4..59e94781 100644 --- a/libi3/format_placeholders.c +++ b/libi3/format_placeholders.c @@ -5,12 +5,12 @@ * © 2009 Michael Stapelberg and contributors (see also: LICENSE) * */ +#include "libi3.h" + #include #include #include -#include "libi3.h" - #ifndef STARTS_WITH #define STARTS_WITH(string, needle) (strncasecmp((string), (needle), strlen((needle))) == 0) #endif diff --git a/libi3/get_colorpixel.c b/libi3/get_colorpixel.c index dc6d7748..9bdd0a71 100644 --- a/libi3/get_colorpixel.c +++ b/libi3/get_colorpixel.c @@ -5,13 +5,13 @@ * © 2009 Michael Stapelberg and contributors (see also: LICENSE) * */ +#include "libi3.h" + #include #include #include #include "queue.h" -#include "libi3.h" - struct Colorpixel { char hex[8]; uint32_t pixel; diff --git a/libi3/get_config_path.c b/libi3/get_config_path.c index bad75c4d..c47e6dd8 100644 --- a/libi3/get_config_path.c +++ b/libi3/get_config_path.c @@ -6,6 +6,7 @@ * */ #include "libi3.h" + #include #include #include diff --git a/libi3/get_exe_path.c b/libi3/get_exe_path.c index ef8f23bc..b9d35ea1 100644 --- a/libi3/get_exe_path.c +++ b/libi3/get_exe_path.c @@ -1,3 +1,12 @@ +/* + * vim:ts=4:sw=4:expandtab + * + * i3 - an improved dynamic tiling window manager + * © 2009 Michael Stapelberg and contributors (see also: LICENSE) + * + */ +#include "libi3.h" + #include #include #include @@ -5,8 +14,6 @@ #include #include -#include "libi3.h" - /* * This function returns the absolute path to the executable it is running in. * diff --git a/libi3/get_mod_mask.c b/libi3/get_mod_mask.c index ac71e6b2..98031d4c 100644 --- a/libi3/get_mod_mask.c +++ b/libi3/get_mod_mask.c @@ -5,13 +5,13 @@ * © 2009 Michael Stapelberg and contributors (see also: LICENSE) * */ +#include "libi3.h" + #include #include #include #include -#include "libi3.h" - /* * All-in-one function which returns the modifier mask (XCB_MOD_MASK_*) for the * given keysymbol, for example for XCB_NUM_LOCK (usually configured to mod2). diff --git a/libi3/get_process_filename.c b/libi3/get_process_filename.c index a3dee9cd..7e2ecbd2 100644 --- a/libi3/get_process_filename.c +++ b/libi3/get_process_filename.c @@ -5,6 +5,8 @@ * © 2009 Michael Stapelberg and contributors (see also: LICENSE) * */ +#include "libi3.h" + #include #include #include @@ -17,8 +19,6 @@ #include #include -#include "libi3.h" - /* * Returns the name of a temporary file with the specified prefix. * diff --git a/libi3/ipc_connect.c b/libi3/ipc_connect.c index f493b4f1..2e628342 100644 --- a/libi3/ipc_connect.c +++ b/libi3/ipc_connect.c @@ -5,6 +5,8 @@ * © 2009 Michael Stapelberg and contributors (see also: LICENSE) * */ +#include "libi3.h" + #include #include #include @@ -14,8 +16,6 @@ #include #include -#include "libi3.h" - /* * Connects to the i3 IPC socket and returns the file descriptor for the * socket. die()s if anything goes wrong. diff --git a/libi3/ipc_recv_message.c b/libi3/ipc_recv_message.c index 0ef4fced..16dda90d 100644 --- a/libi3/ipc_recv_message.c +++ b/libi3/ipc_recv_message.c @@ -5,6 +5,8 @@ * © 2009 Michael Stapelberg and contributors (see also: LICENSE) * */ +#include "libi3.h" + #include #include #include @@ -14,8 +16,6 @@ #include -#include "libi3.h" - /* * Reads a message from the given socket file descriptor and stores its length * (reply_length) as well as a pointer to its contents (reply). diff --git a/libi3/ipc_send_message.c b/libi3/ipc_send_message.c index a9ba3165..c2cc0127 100644 --- a/libi3/ipc_send_message.c +++ b/libi3/ipc_send_message.c @@ -5,6 +5,8 @@ * © 2009 Michael Stapelberg and contributors (see also: LICENSE) * */ +#include "libi3.h" + #include #include #include @@ -14,8 +16,6 @@ #include -#include "libi3.h" - /* * Formats a message (payload) of the given size and type and sends it to i3 via * the given socket file descriptor. diff --git a/libi3/is_debug_build.c b/libi3/is_debug_build.c index 3173c122..4e583622 100644 --- a/libi3/is_debug_build.c +++ b/libi3/is_debug_build.c @@ -1,3 +1,12 @@ +/* + * vim:ts=4:sw=4:expandtab + * + * i3 - an improved dynamic tiling window manager + * © 2009 Michael Stapelberg and contributors (see also: LICENSE) + * + */ +#include "libi3.h" + #include #include diff --git a/libi3/mkdirp.c b/libi3/mkdirp.c index c64b80a3..1fc8c346 100644 --- a/libi3/mkdirp.c +++ b/libi3/mkdirp.c @@ -1,4 +1,12 @@ +/* + * vim:ts=4:sw=4:expandtab + * + * i3 - an improved dynamic tiling window manager + * © 2009 Michael Stapelberg and contributors (see also: LICENSE) + * + */ #include "libi3.h" + #include #include #include diff --git a/libi3/resolve_tilde.c b/libi3/resolve_tilde.c index 7a4fb79b..51d642db 100644 --- a/libi3/resolve_tilde.c +++ b/libi3/resolve_tilde.c @@ -5,8 +5,8 @@ * © 2009 Michael Stapelberg and contributors (see also: LICENSE) * */ - #include "libi3.h" + #include #include #include diff --git a/libi3/root_atom_contents.c b/libi3/root_atom_contents.c index 8d26c307..d6394d4b 100644 --- a/libi3/root_atom_contents.c +++ b/libi3/root_atom_contents.c @@ -5,6 +5,8 @@ * © 2009 Michael Stapelberg and contributors (see also: LICENSE) * */ +#include "libi3.h" + #include #include #include @@ -15,8 +17,6 @@ #include #include -#include "libi3.h" - /* * Try to get the contents of the given atom (for example I3_SOCKET_PATH) from * the X11 root window and return NULL if it doesn’t work. diff --git a/libi3/safewrappers.c b/libi3/safewrappers.c index 0a233a12..94ad4ee6 100644 --- a/libi3/safewrappers.c +++ b/libi3/safewrappers.c @@ -5,6 +5,8 @@ * © 2009 Michael Stapelberg and contributors (see also: LICENSE) * */ +#include "libi3.h" + #include #include #include @@ -13,8 +15,6 @@ #include #include -#include "libi3.h" - /* * The s* functions (safe) are wrappers around malloc, strdup, …, which exits if one of * the called functions returns NULL, meaning that there is no more memory available diff --git a/libi3/string.c b/libi3/string.c index 19039a23..edd588da 100644 --- a/libi3/string.c +++ b/libi3/string.c @@ -9,14 +9,13 @@ * others want UTF-8 (Pango). * */ +#include "libi3.h" #include #include #include -#include "libi3.h" - struct _i3String { char *utf8; xcb_char2b_t *ucs2; diff --git a/libi3/strndup.c b/libi3/strndup.c index c4032dc5..e17f843c 100644 --- a/libi3/strndup.c +++ b/libi3/strndup.c @@ -5,11 +5,11 @@ * © 2009 Michael Stapelberg and contributors (see also: LICENSE) * */ +#include "libi3.h" + #include #include -#include "libi3.h" - #if defined(__APPLE__) /* diff --git a/libi3/ucs2_conversion.c b/libi3/ucs2_conversion.c index b583e32c..75cff78a 100644 --- a/libi3/ucs2_conversion.c +++ b/libi3/ucs2_conversion.c @@ -5,14 +5,14 @@ * © 2009 Michael Stapelberg and contributors (see also: LICENSE) * */ +#include "libi3.h" + #include #include #include #include #include -#include "libi3.h" - static iconv_t utf8_conversion_descriptor = (iconv_t)-1; static iconv_t ucs2_conversion_descriptor = (iconv_t)-1; diff --git a/src/assignments.c b/src/assignments.c index 6c563357..a0f5d5a7 100644 --- a/src/assignments.c +++ b/src/assignments.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "assignments.c" /* * vim:ts=4:sw=4:expandtab * diff --git a/src/click.c b/src/click.c index 788c10f2..913741b4 100644 --- a/src/click.c +++ b/src/click.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "click.c" /* * vim:ts=4:sw=4:expandtab * diff --git a/src/commands.c b/src/commands.c index 58641d6a..b91c71a4 100644 --- a/src/commands.c +++ b/src/commands.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "commands.c" /* * vim:ts=4:sw=4:expandtab * @@ -9,6 +7,8 @@ * commands.c: all command functions (see commands_parser.c) * */ +#include "all.h" + #include #include #include @@ -17,7 +17,6 @@ #include #endif -#include "all.h" #include "shmlog.h" // Macros to make the YAJL API a bit easier to use. diff --git a/src/commands_parser.c b/src/commands_parser.c index cdd35e45..98f06659 100644 --- a/src/commands_parser.c +++ b/src/commands_parser.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "commands_parser.c" /* * vim:ts=4:sw=4:expandtab * @@ -25,6 +23,8 @@ * instead of actually calling any function). * */ +#include "all.h" + #include #include #include @@ -32,8 +32,6 @@ #include #include -#include "all.h" - // Macros to make the YAJL API a bit easier to use. #define y(x, ...) (command_output.json_gen != NULL ? yajl_gen_##x(command_output.json_gen, ##__VA_ARGS__) : 0) #define ystr(str) (command_output.json_gen != NULL ? yajl_gen_string(command_output.json_gen, (unsigned char *)str, strlen(str)) : 0) diff --git a/src/con.c b/src/con.c index 124d24ea..3c7c2186 100644 --- a/src/con.c +++ b/src/con.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "con.c" /* * vim:ts=4:sw=4:expandtab * @@ -12,6 +10,7 @@ * */ #include "all.h" + #include "yajl_utils.h" static void con_on_remove_child(Con *con); diff --git a/src/config.c b/src/config.c index c2824ca2..d4441d5d 100644 --- a/src/config.c +++ b/src/config.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "config.c" /* * vim:ts=4:sw=4:expandtab * @@ -11,6 +9,7 @@ * */ #include "all.h" + #include char *current_configpath = NULL; diff --git a/src/config_directives.c b/src/config_directives.c index 05c19c70..6b5464f1 100644 --- a/src/config_directives.c +++ b/src/config_directives.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "config_directives.c" /* * vim:ts=4:sw=4:expandtab * @@ -9,11 +7,11 @@ * config_directives.c: all config storing functions (see config_parser.c) * */ +#include "all.h" + #include #include -#include "all.h" - /******************************************************************************* * Criteria functions. ******************************************************************************/ diff --git a/src/config_parser.c b/src/config_parser.c index 2a884730..a8265869 100644 --- a/src/config_parser.c +++ b/src/config_parser.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "config_parser.c" /* * vim:ts=4:sw=4:expandtab * @@ -25,6 +23,8 @@ * nearest token. * */ +#include "all.h" + #include #include #include @@ -37,8 +37,6 @@ #include #include -#include "all.h" - // Macros to make the YAJL API a bit easier to use. #define y(x, ...) yajl_gen_##x(command_output.json_gen, ##__VA_ARGS__) #define ystr(str) yajl_gen_string(command_output.json_gen, (unsigned char *)str, strlen(str)) diff --git a/src/debug.c b/src/debug.c index bb880b2f..ea4ca997 100644 --- a/src/debug.c +++ b/src/debug.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "debug.c" /* * vim:ts=4:sw=4:expandtab * @@ -10,6 +8,8 @@ * events. This code is from xcb-util. * */ +#include + #include #include diff --git a/src/display_version.c b/src/display_version.c index c82610ed..0e650e81 100644 --- a/src/display_version.c +++ b/src/display_version.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "key_press.c" /* * vim:ts=4:sw=4:expandtab * @@ -10,6 +8,8 @@ * i3 --moreversion. * */ +#include "all.h" + #include #include #include @@ -17,7 +17,6 @@ #include #include #include -#include "all.h" static bool human_readable_key, loaded_config_file_name_key; static char *human_readable_version, *loaded_config_file_name; diff --git a/src/ewmh.c b/src/ewmh.c index 5459c7e9..f4bb049a 100644 --- a/src/ewmh.c +++ b/src/ewmh.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "ewmh.c" /* * vim:ts=4:sw=4:expandtab * diff --git a/src/fake_outputs.c b/src/fake_outputs.c index 3df0e246..b898ce98 100644 --- a/src/fake_outputs.c +++ b/src/fake_outputs.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "fake_outputs.c" /* * vim:ts=4:sw=4:expandtab * diff --git a/src/floating.c b/src/floating.c index e9c7a801..616602c0 100644 --- a/src/floating.c +++ b/src/floating.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "floating.c" /* * vim:ts=4:sw=4:expandtab * diff --git a/src/handlers.c b/src/handlers.c index bd391176..7dfacef7 100644 --- a/src/handlers.c +++ b/src/handlers.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "handlers.c" /* * vim:ts=4:sw=4:expandtab * diff --git a/src/ipc.c b/src/ipc.c index bf529b17..73f8d8cb 100644 --- a/src/ipc.c +++ b/src/ipc.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "ipc.c" /* * vim:ts=4:sw=4:expandtab * @@ -10,6 +8,7 @@ * */ #include "all.h" + #include "yajl_utils.h" #include diff --git a/src/key_press.c b/src/key_press.c index 6760e35b..d16174f8 100644 --- a/src/key_press.c +++ b/src/key_press.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "key_press.c" /* * vim:ts=4:sw=4:expandtab * diff --git a/src/load_layout.c b/src/load_layout.c index a3b44756..7004a859 100644 --- a/src/load_layout.c +++ b/src/load_layout.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "load_layout.c" /* * vim:ts=4:sw=4:expandtab * diff --git a/src/log.c b/src/log.c index e9a1160d..1c33649a 100644 --- a/src/log.c +++ b/src/log.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "log.c" /* * vim:ts=4:sw=4:expandtab * @@ -9,6 +7,8 @@ * log.c: Logging functions. * */ +#include + #include #include #include diff --git a/src/main.c b/src/main.c index f94a8941..4d9fd5a5 100644 --- a/src/main.c +++ b/src/main.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "main.c" /* * vim:ts=4:sw=4:expandtab * @@ -9,6 +7,8 @@ * main.c: Initialization, main loop * */ +#include "all.h" + #include #include #include @@ -19,7 +19,6 @@ #include #include #include -#include "all.h" #include "shmlog.h" #include "sd-daemon.h" diff --git a/src/manage.c b/src/manage.c index fd9226e4..81ee16fd 100644 --- a/src/manage.c +++ b/src/manage.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "manage.c" /* * vim:ts=4:sw=4:expandtab * @@ -10,6 +8,7 @@ * */ #include "all.h" + #include "yajl_utils.h" #include diff --git a/src/match.c b/src/match.c index ac9ddaf9..4d87c560 100644 --- a/src/match.c +++ b/src/match.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "match.c" /* * vim:ts=4:sw=4:expandtab * diff --git a/src/move.c b/src/move.c index 25c658ce..70c8c788 100644 --- a/src/move.c +++ b/src/move.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "move.c" /* * vim:ts=4:sw=4:expandtab * diff --git a/src/output.c b/src/output.c index 1a9f6129..0f2bd617 100644 --- a/src/output.c +++ b/src/output.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "output.c" /* * vim:ts=4:sw=4:expandtab * diff --git a/src/randr.c b/src/randr.c index 512e0d28..51255619 100644 --- a/src/randr.c +++ b/src/randr.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "randr.c" /* * vim:ts=4:sw=4:expandtab * diff --git a/src/regex.c b/src/regex.c index 12c0b67f..296b91dd 100644 --- a/src/regex.c +++ b/src/regex.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "regex.c" /* * vim:ts=4:sw=4:expandtab * diff --git a/src/render.c b/src/render.c index 7ee501f0..85548f26 100644 --- a/src/render.c +++ b/src/render.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "render.c" /* * vim:ts=4:sw=4:expandtab * diff --git a/src/resize.c b/src/resize.c index 5d9eb2eb..f07fcec6 100644 --- a/src/resize.c +++ b/src/resize.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "resize.c" /* * vim:ts=4:sw=4:expandtab * diff --git a/src/restore_layout.c b/src/restore_layout.c index da018b9e..131196e9 100644 --- a/src/restore_layout.c +++ b/src/restore_layout.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "restore_layout.c" /* * vim:ts=4:sw=4:expandtab * diff --git a/src/scratchpad.c b/src/scratchpad.c index 6d83a558..9018ad3f 100644 --- a/src/scratchpad.c +++ b/src/scratchpad.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "scratchpad.c" /* * vim:ts=4:sw=4:expandtab * diff --git a/src/sighandler.c b/src/sighandler.c index 400cd5a5..79f90d9a 100644 --- a/src/sighandler.c +++ b/src/sighandler.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "sighandler.c" /* * vim:ts=4:sw=4:expandtab * diff --git a/src/startup.c b/src/startup.c index 2a6bc002..166842e0 100644 --- a/src/startup.c +++ b/src/startup.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "startup.c" /* * vim:ts=4:sw=4:expandtab * @@ -13,6 +11,7 @@ * */ #include "all.h" + #include "sd-daemon.h" #include diff --git a/src/tree.c b/src/tree.c index e848a6ac..6e128363 100644 --- a/src/tree.c +++ b/src/tree.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "tree.c" /* * vim:ts=4:sw=4:expandtab * diff --git a/src/util.c b/src/util.c index 15796d88..cfe4c953 100644 --- a/src/util.c +++ b/src/util.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "util.c" /* * vim:ts=4:sw=4:expandtab * diff --git a/src/version.c b/src/version.c index 6e385ada..1244711a 100644 --- a/src/version.c +++ b/src/version.c @@ -8,4 +8,6 @@ * and used dynamically without recompiling every object file. * */ +#include + const char *i3_version = I3_VERSION; diff --git a/src/window.c b/src/window.c index d10811f5..db6215d0 100644 --- a/src/window.c +++ b/src/window.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "window.c" /* * vim:ts=4:sw=4:expandtab * diff --git a/src/workspace.c b/src/workspace.c index 0da0a378..d7f2ce7c 100644 --- a/src/workspace.c +++ b/src/workspace.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "workspace.c" /* * vim:ts=4:sw=4:expandtab * diff --git a/src/x.c b/src/x.c index 9a387749..8d7d3dd8 100644 --- a/src/x.c +++ b/src/x.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "x.c" /* * vim:ts=4:sw=4:expandtab * diff --git a/src/xcb.c b/src/xcb.c index 630c68f9..900840a2 100644 --- a/src/xcb.c +++ b/src/xcb.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "xcb.c" /* * vim:ts=4:sw=4:expandtab * diff --git a/src/xcursor.c b/src/xcursor.c index 1e1e23b0..cbfe808b 100644 --- a/src/xcursor.c +++ b/src/xcursor.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "xcursor.c" /* * vim:ts=4:sw=4:expandtab * @@ -9,6 +7,8 @@ * xcursor.c: xcursor support for themed cursors. * */ +#include + #include #include diff --git a/src/xinerama.c b/src/xinerama.c index ddf98375..25bfa6b1 100644 --- a/src/xinerama.c +++ b/src/xinerama.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "xinerama.c" /* * vim:ts=4:sw=4:expandtab * From ca83fd566dfc7a1b86894ad481f346225ecc9fc3 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Tue, 11 Oct 2016 09:40:06 +0200 Subject: [PATCH 09/14] pull autotools.gitignore into .gitignore --- .gitignore | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/.gitignore b/.gitignore index 617421ac..c6fd81c8 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,30 @@ i3-command-parser.stamp i3-config-parser.stamp .clang_complete LAST_VERSION + +################################################################################ +# https://raw.githubusercontent.com/github/gitignore/master/Autotools.gitignore +################################################################################ + +# http://www.gnu.org/software/automake + +Makefile.in +/ar-lib +/test-driver + +# http://www.gnu.org/software/autoconf + +/autom4te.cache +/autoscan.log +/autoscan-*.log +/aclocal.m4 +/compile +/config.h.in +/config.guess +/config.sub +/configure +/configure.scan +/depcomp +/install-sh +/missing +/stamp-h1 From 8ab1bf6063dc9c6079ca544aeb05cc623b51553e Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Fri, 14 Oct 2016 09:16:08 +0200 Subject: [PATCH 10/14] Update debian/ for autotools --- debian/rules | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/debian/rules b/debian/rules index 843655ee..e119f260 100755 --- a/debian/rules +++ b/debian/rules @@ -4,14 +4,14 @@ export V:=1 export DEB_BUILD_MAINT_OPTIONS = hardening=+all -override_dh_auto_build: - dh_auto_build -- all docs mans - override_dh_installchangelogs: dh_installchangelogs RELEASE-NOTES-* override_dh_strip: dh_strip --dbg-package=i3-wm-dbg +override_dh_auto_test: + # TODO: enable tests + %: - dh $@ --parallel + dh $@ --parallel --builddirectory=build --with=autoreconf From 7b2d7344633bcfc138517bdd6676ea9a90048cdd Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Fri, 14 Oct 2016 09:51:07 +0200 Subject: [PATCH 11/14] Update release.sh for autotools --- release.sh | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/release.sh b/release.sh index cc59d6a2..14f443f3 100755 --- a/release.sh +++ b/release.sh @@ -55,13 +55,18 @@ git checkout -b release-${RELEASE_VERSION} cp "${STARTDIR}/RELEASE-NOTES-${RELEASE_VERSION}" "RELEASE-NOTES-${RELEASE_VERSION}" git add RELEASE-NOTES-${RELEASE_VERSION} git rm RELEASE-NOTES-${PREVIOUS_VERSION} +sed -i "s,RELEASE-NOTES-${PREVIOUS_VERSION},RELEASE-NOTES-${RELEASE_VERSION},g" Makefile.am +sed -i "s/AC_INIT(\[i3\], \[${PREVIOUS_VERSION}\]/AC_INIT([i3], [${RELEASE_VERSION}]/" configure.ac sed -i "s,[^<]*,${RELEASE_VERSION},g" man/asciidoc.conf echo "${RELEASE_VERSION} ($(date +%F))" > I3_VERSION git add I3_VERSION git commit -a -m "release i3 ${RELEASE_VERSION}" git tag "${RELEASE_VERSION}" -m "release i3 ${RELEASE_VERSION}" --sign --local-user=0x4AC8EE1D -make dist +autoreconf -fi +mkdir build +(cd build && ../configure && make dist-bzip2 -j8) +cp build/i3-${RELEASE_VERSION}.tar.bz2 . echo "Differences in the release tarball file lists:" @@ -157,7 +162,7 @@ git add downloads/RELEASE-NOTES-${RELEASE_VERSION}.txt sed -i "s,

Documentation for i3 v[^<]*

,

Documentation for i3 v${RELEASE_VERSION}

,g" docs/index.html sed -i "s,[^<]*,${RELEASE_VERSION},g" index.html sed -i "s,The current stable version is .*$,The current stable version is ${RELEASE_VERSION}.,g" downloads/index.html -sed -i "s,,\n \n ${RELEASE_VERSION}\n i3-${RELEASE_VERSION}.tar.bz2\n $(ls -lh ../i3/i3-${RELEASE_VERSION}.tar.bz2 | awk -F " " {'print $5'} | sed 's/K$/ KiB/g')\n signature\n $(date +'%Y-%m-%d')\n release notes\n \n,g" downloads/index.html +sed -i "s,,\n \n ${RELEASE_VERSION}\n i3-${RELEASE_VERSION}.tar.bz2\n $(LC_ALL=en_US.UTF-8 ls -lh ../i3/i3-${RELEASE_VERSION}.tar.bz2 | awk -F " " {'print $5'} | sed 's/K$/ KiB/g' | sed 's/M$/ MiB/g')\n signature\n $(date +'%Y-%m-%d')\n release notes\n \n,g" downloads/index.html git commit -a -m "add ${RELEASE_VERSION} release" From cfe9824c1dcd3c23575a5dfa3a3983e83a338057 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Sat, 15 Oct 2016 17:39:14 +0200 Subject: [PATCH 12/14] =?UTF-8?q?Update=20PACKAGE-MAINTAINER=E2=80=99s=20c?= =?UTF-8?q?ompilation=20instructions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PACKAGE-MAINTAINER | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/PACKAGE-MAINTAINER b/PACKAGE-MAINTAINER index 5a922ee8..953fac53 100644 --- a/PACKAGE-MAINTAINER +++ b/PACKAGE-MAINTAINER @@ -23,14 +23,10 @@ x-terminal-emulator symlink in Debian, please use it in i3-sensible-terminal. On debian, compilation and installing the manpages looks like this: - # Compilation - $(MAKE) - $(MAKE) -C man - - # Installation - $(MAKE) DESTDIR=$(CURDIR)/debian/i3-wm/ install - mkdir -p $(CURDIR)/debian/i3-wm/usr/share/man/man1 - cp man/*.1 $(CURDIR)/debian/i3-wm/usr/share/man/man1 + autoreconf -fi + mkdir -p build && cd build + ../configure + make -j8 install Please make sure that i3-migrate-config-to-v4 and i3-config-wizard are installed with i3. The Perl script is necessary to (automatically) convert v3 From 05e5901bcae1ceaec435936f0c056886ac3ed12d Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Sun, 16 Oct 2016 17:23:51 +0200 Subject: [PATCH 13/14] generate asciidoc.conf via autoconf MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …instead of updating it in release.sh. --- Makefile.am | 4 ++-- configure.ac | 2 +- man/{asciidoc.conf => asciidoc.conf.in} | 2 +- release.sh | 1 - 4 files changed, 4 insertions(+), 5 deletions(-) rename man/{asciidoc.conf => asciidoc.conf.in} (87%) diff --git a/Makefile.am b/Makefile.am index 7bba241b..21f57e5b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -86,7 +86,7 @@ EXTRA_DIST = \ libi3/README \ $(asciidoc_MANS:.1=.man) \ $(asciidoc_MANS:.1=.man) \ - man/asciidoc.conf \ + man/asciidoc.conf.in \ DEPENDS \ I3_VERSION \ LICENSE \ @@ -200,7 +200,7 @@ $(asciidoc_MANS): man/%.1: man/%.xml man/$(dirstamp) @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 $@ $< + $(AM_V_GEN) @PATH_ASCIIDOC@ -d manpage -b docbook -f $(top_builddir)/man/asciidoc.conf -o $@ $< $(pod_MANS): man/%.1: % man/$(dirstamp) $(AM_V_GEN) @PATH_POD2MAN@ --utf8 $< > $@ diff --git a/configure.ac b/configure.ac index 573261f5..01b4d309 100644 --- a/configure.ac +++ b/configure.ac @@ -118,7 +118,7 @@ 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([Makefile testcases/lib/i3test.pm man/asciidoc.conf]) 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 diff --git a/man/asciidoc.conf b/man/asciidoc.conf.in similarity index 87% rename from man/asciidoc.conf rename to man/asciidoc.conf.in index 11e76501..e9a9ea23 100644 --- a/man/asciidoc.conf +++ b/man/asciidoc.conf.in @@ -7,7 +7,7 @@ template::[header-declarations] {mantitle} {manvolnum} i3 -4.12 +@PACKAGE_VERSION@ i3 Manual diff --git a/release.sh b/release.sh index 14f443f3..9101332c 100755 --- a/release.sh +++ b/release.sh @@ -57,7 +57,6 @@ git add RELEASE-NOTES-${RELEASE_VERSION} git rm RELEASE-NOTES-${PREVIOUS_VERSION} sed -i "s,RELEASE-NOTES-${PREVIOUS_VERSION},RELEASE-NOTES-${RELEASE_VERSION},g" Makefile.am sed -i "s/AC_INIT(\[i3\], \[${PREVIOUS_VERSION}\]/AC_INIT([i3], [${RELEASE_VERSION}]/" configure.ac -sed -i "s,[^<]*,${RELEASE_VERSION},g" man/asciidoc.conf echo "${RELEASE_VERSION} ($(date +%F))" > I3_VERSION git add I3_VERSION git commit -a -m "release i3 ${RELEASE_VERSION}" From ca98c7e614c35c64cf717eaa95ebe9dafa5b02c1 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Sun, 16 Oct 2016 18:03:09 +0200 Subject: [PATCH 14/14] Update travis for autotools --- .travis.yml | 2 +- Makefile.am | 3 +++ configure.ac | 1 + travis/check-spelling.pl | 16 ++++++++-------- travis/clang-analyze.sh | 4 ++-- travis/debian-build.sh | 9 ++++++--- travis/run-tests.sh | 6 +++--- 7 files changed, 24 insertions(+), 17 deletions(-) diff --git a/.travis.yml b/.travis.yml index f8a3de6f..f9744335 100644 --- a/.travis.yml +++ b/.travis.yml @@ -32,7 +32,7 @@ install: script: - docker run -v $PWD:/usr/src/i3/ -w /usr/src/i3 ${BASENAME} ./travis/check-safe-wrappers.sh - docker run -v $PWD:/usr/src/i3/ -w /usr/src/i3 ${BASENAME} ./travis/check-formatting.sh - - docker run -v $PWD:/usr/src/i3/ -w /usr/src/i3 -e CC -e CFLAGS="-Wformat -Wformat-security -Wextra -Wno-unused-parameter -Werror" ${BASENAME} make all mans -j ASAN=1 + - docker run -v $PWD:/usr/src/i3/ -w /usr/src/i3 -e CC ${BASENAME} /bin/sh -c 'autoreconf -fi && mkdir -p build && cd build && (../configure || (cat config.log; false)) && make -j CFLAGS="-Wformat -Wformat-security -Wextra -Wno-unused-parameter -Werror"' - docker run -v $PWD:/usr/src/i3/ -w /usr/src/i3 ${BASENAME} ./travis/check-spelling.pl - docker run -v $PWD:/usr/src/i3/ -w /usr/src/i3 -e CC ${BASENAME} ./travis/run-tests.sh - ./travis/skip-pkg.sh || docker run -v $PWD:/usr/src/i3/ -w /usr/src/i3 ${BASENAME} ./travis/debian-build.sh deb/debian-amd64/DIST diff --git a/Makefile.am b/Makefile.am index 21f57e5b..57d5b019 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,5 +1,8 @@ @CODE_COVERAGE_RULES@ +echo-version: + @echo "@I3_VERSION@" + bin_PROGRAMS = \ i3 \ i3bar/i3bar \ diff --git a/configure.ac b/configure.ac index 01b4d309..3c47c6b5 100644 --- a/configure.ac +++ b/configure.ac @@ -35,6 +35,7 @@ AS_IF([test -d ${srcdir}/.git], I3_VERSION="$(cat ${srcdir}/I3_VERSION)" is_release="$(grep -q non-git ${srcdir}/I3_VERSION && echo no || echo yes)" ]) +AC_SUBST([I3_VERSION], [$I3_VERSION]) MAJOR_VERSION="$(echo ${VERSION} | cut -d '.' -f 1)" MINOR_VERSION="$(echo ${VERSION} | cut -d '.' -f 2)" PATCH_VERSION="$(echo ${VERSION} | cut -d '.' -f 3)" diff --git a/travis/check-spelling.pl b/travis/check-spelling.pl index 71feec31..6d070136 100755 --- a/travis/check-spelling.pl +++ b/travis/check-spelling.pl @@ -29,13 +29,13 @@ my $binary_spelling_exceptions = { 'betwen' => 1, # asan_flags.inc contains this spelling error. }; my @binaries = qw( - i3 - i3-config-wizard/i3-config-wizard - i3-dump-log/i3-dump-log - i3-input/i3-input - i3-msg/i3-msg - i3-nagbar/i3-nagbar - i3bar/i3bar + build/i3 + build/i3-config-wizard/i3-config-wizard + build/i3-dump-log/i3-dump-log + build/i3-input/i3-input + build/i3-msg/i3-msg + build/i3-nagbar/i3-nagbar + build/i3bar/i3bar ); for my $binary (@binaries) { check_spelling(slurp($binary), $binary_spelling_exceptions, sub { @@ -50,7 +50,7 @@ for my $binary (@binaries) { my $manpage_spelling_exceptions = { }; -for my $name (glob('man/*.1')) { +for my $name (glob('build/man/*.1')) { for my $line (split(/\n/, slurp($name))) { next if $line =~ /^\.\\\"/o; check_spelling($line, $manpage_spelling_exceptions, sub { diff --git a/travis/clang-analyze.sh b/travis/clang-analyze.sh index 05d54119..97c11fcc 100755 --- a/travis/clang-analyze.sh +++ b/travis/clang-analyze.sh @@ -3,7 +3,7 @@ set -e set -x -mkdir -p deb/DIST-clang +mkdir -p deb/DIST-clang/build tar xf *.tar.bz2 -C deb/DIST-clang --strip-components=1 -(cd deb/DIST-clang && scan-build -o ../CLANG --html-title="Analysis of i3 v$(git describe --tags)" make -j8) +(cd deb/DIST-clang/build && scan-build -o ../../CLANG ../configure && scan-build -o ../../CLANG --html-title="Analysis of i3 v$(git describe --tags)" make -j8) mv deb/CLANG/*/* deb/CLANG diff --git a/travis/debian-build.sh b/travis/debian-build.sh index 655bd5c4..9ce5a5af 100755 --- a/travis/debian-build.sh +++ b/travis/debian-build.sh @@ -5,12 +5,15 @@ set -x DEST=$1 -make store_git_version -make dist +mkdir -p build +cd build +../configure +make echo-version > ../I3_VERSION +make dist-bzip2 # unpack dist tarball mkdir -p "${DEST}" tar xf *.tar.bz2 -C "${DEST}" --strip-components=1 -cp -r debian "${DEST}" +cp -r ../debian "${DEST}" sed -i '/^\s*libxcb-xrm-dev/d' deb/ubuntu-*/DIST/debian/control || true cd "${DEST}" debchange -m -l+g$(git describe --tags) 'Automatically built' diff --git a/travis/run-tests.sh b/travis/run-tests.sh index d8a40d77..44df81d2 100755 --- a/travis/run-tests.sh +++ b/travis/run-tests.sh @@ -3,7 +3,7 @@ set -e set -x -cd testcases +cd build # TODO: remove this workaround once https://bugs.debian.org/836723 is fixed # Found at https://llvm.org/bugs/show_bug.cgi?id=27310#c8: @@ -26,7 +26,7 @@ fi # Try running the tests in parallel so that the common case (tests pass) is # quick, but fall back to running them in sequence to make debugging easier. -if ! xvfb-run ./complete-run.pl +if ! xvfb-run make check then - xvfb-run ./complete-run.pl --parallel=1 || (cat latest/complete-run.log; false) + xvfb-run ./testcases/complete-run.pl --parallel=1 || (cat latest/complete-run.log; false) fi