Commit Graph

112 Commits (cfe9824c1dcd3c23575a5dfa3a3983e83a338057)

Author SHA1 Message Date
Michael Stapelberg 4a52a7e9fb Switch to autotools (GNU build system)
This commit probably comes as a surprise to some, given that one of i3’s
explicitly stated goals used to be “Do not use programs such as
autoconf/automake for configuration and creating unreadable/broken makefiles”.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

• Listing source code in gdb still works.

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

• release.sh still works

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

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

• enabling verbose builds via V=1

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

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

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

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

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

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

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

This commit has been tested with autoconf 2.69 and automake 1.15.
2016-10-23 21:09:21 +02:00
Denton Liu 85bb32409f Update manpages (#2404) 2016-07-30 19:30:25 +02:00
Ingo Bürk b1d70f25b3 Introduced a new GET_BINDING_MODES message type and reply. (#2376)
This type dumps all currently configured binding modes.

fixes #2375
2016-06-15 22:25:22 +02:00
Zamarin Arthur 82dd59cb31 Added qterminal to i3-sensible-terminal (#2367) 2016-05-31 22:57:58 +02:00
Hong Xu a2632fd308 Point out the default ipc message type in i3-msg.man 2016-04-04 08:47:07 +02:00
Michael Stapelberg c9f0bc174d release i3 4.12 2016-03-06 16:17:15 +01:00
bendem 9c595a1a28 Reflect changes to i3-sensible-terminal in its manpage 2016-02-14 13:28:14 +01:00
Michael Stapelberg fbfbdb8e12 travis: check spelling of binaries and manpages, use docker
We now build a docker base container based on debian sid (where the very
latest packages are available). That base container is updated once a
month, or whenever travis-build.Dockerfile or debian/control change, but
re-used for subsequent travis runs. While the initial build might take
up to 15 minutes, subsequent builds typically run in a minute or two.

All the different steps that we run on travis are now factored into
separate scripts in the travis/ directory.

Switching to docker should also help with issue #2174.
2016-02-06 10:36:43 +01:00
David Coppa 7a25d3f149 Fix i3-nagbar example. 2016-01-26 09:57:59 +01:00
Michael Stapelberg d56264e001 man: add “floating window” to terminology (Thanks frederik) 2015-10-16 19:42:20 +02:00
Michael Stapelberg 041e549efd release i3 4.11 2015-09-30 08:55:07 +02:00
Michael Stapelberg 69eb4619a7 release i3 4.10.4 2015-09-08 09:19:17 +02:00
Michael Stapelberg 3cc377166f release i3 4.10.3 2015-07-30 22:26:58 +02:00
Michael Stapelberg 9557a0a5b2 release i3 4.10.2 2015-04-16 09:02:58 +02:00
Michael Stapelberg 2dea50d469 release i3 4.10.1 2015-03-29 19:07:03 +02:00
Michael Stapelberg 6d94231f74 Merge branch 'master' into next 2015-03-29 17:46:37 +02:00
Michael Stapelberg 71310adaea release i3 4.10 2015-03-29 17:46:16 +02:00
Diana Thayer 94b1e76af4 degendered terms 2015-03-11 21:41:43 -07:00
Michael Stapelberg 0b145d214b release i3 4.9.1 2015-03-07 20:26:09 +01:00
Michael Stapelberg 55ba1c5e56 release i3 v4.9 2015-02-28 14:51:33 +01:00
Mats e59a76e456 Extend the fullscreen command
Rather than just toggling the fullscreen modes, allow to set them
directly with:

    fullscreen enable|toggle [global]
    fullscreen disable

For compatibility, retain the previous command and its toggling behavior:

    fullscreen [global]

fixes #1120
2014-12-10 20:42:52 +01:00
Michael Stapelberg 0125530409 merge the formerly debian-specific x-terminal-emulator patch
I think instead of maintaining distribution-specific patches forever,
it’s a bit easier to have them applied upstream, especially since they
don’t break anything.

fixes #876
2014-11-06 19:56:32 +01:00
Michael Stapelberg 30992e48d8 man: bump version to 4.8 2014-06-15 19:12:16 +02:00
Michael Stapelberg b83c3909b4 man/i3.man: update to contain new default font 2014-06-15 18:18:44 +02:00
Michael Stapelberg 812f1d268d s/he/she/, s/his/her/ (Thanks lasers) 2014-04-30 09:43:32 +02:00
Michael Stapelberg b966f3796f build i3-save-tree(1) manpage (Thanks xeen) 2014-04-23 19:33:22 +02:00
Arun Persaud ae84637888 i3-nagbar.man: updated man page to include all options
several options were not documented in the man page.
2014-03-23 18:56:49 +01:00
Alexander Berntsen cdbf62d055 man/i3.man: Update font doc to reflect i3.config 2014-02-15 13:23:08 +01:00
Michael Stapelberg 31c33df279 add release notes for 4.7.2 2014-01-23 22:51:55 +01:00
Michael Stapelberg 92694c7983 add release notes for 4.7.1, update manpage version 2014-01-21 19:20:36 +01:00
Michael Stapelberg 26e30ef00c add release notes for v4.7 2013-12-22 21:12:10 +01:00
Michael Stapelberg 5d005f403c man/i3-dump-log: document -f (Thanks TonyC) 2013-09-22 00:08:27 +02:00
Michael Stapelberg e6ee8b3256 add release notes for v4.6 2013-08-07 21:04:18 +02:00
Arun Persaud 55a338c919 i3-msg.man: updated man page to include all options
-s, -v, -q and -h options were not documented.
2013-05-21 19:46:09 +02:00
Michael Stapelberg 13f4a9f3ee add release notes for v4.5.1 2013-03-18 22:42:33 +01:00
Michael Stapelberg ec0dca9c75 add release notes for i3 v4.5 2013-03-12 13:40:52 +01:00
Michael Stapelberg fa2da352d1 add release notes for v4.4 2012-12-11 22:45:34 +01:00
Michael Stapelberg 18e46ffae5 install i3-dmenu-desktop 2012-12-11 22:31:44 +01:00
Michael Stapelberg 69a77d182e i3-msg.man: fix reference to the "reply section" (Thanks slowpoke) 2012-10-06 22:28:24 +02:00
Michael Stapelberg c808a39fb2 man: set version to 4.3 2012-09-19 17:53:27 +02:00
Michael Stapelberg 156bd24f23 man: update i3(1) 2012-09-19 17:53:17 +02:00
Michael Stapelberg b8ac9591a2 manpage: update force-xinerama nvidia hint 2012-08-27 15:25:22 +02:00
Michael Stapelberg c97d6198bd manpage: describe keybindings to open a terminal/dmenu (Thanks Joost) 2012-08-27 15:22:19 +02:00
Michael Stapelberg 67999269fd manpage: improve locale setup in example .xsession (Thanks Harald König)
Harald mentioned he was surprised about the locales we recommend in the
.xsession example, so I’ve re-investigated.

Here is the test program I have used:

    #include <stdio.h>
    #include <locale.h>

    int main() {
        /* SUSv2 setlocale(3) says:
         * Internationalised programs must call setlocale() to initiate
         * a specific language operation. This can be done by calling
         * setlocale() as follows: */
        setlocale(LC_ALL, "");

        printf("LC_NUMERIC is %s\n", setlocale(LC_NUMERIC, NULL));
    }

Then, I have unset LANG and LC_*:

    midna /tmp $ env | grep LANG
    midna /tmp $ env | grep LC
    midna /tmp $

Now, observe that LC_ALL overwrites all specific LC variables:

    midna /tmp $ LC_ALL=de_DE.UTF-8 LC_NUMERIC=en_DK.UTF-8 ./localetest
    LC_NUMERIC is de_DE.UTF-8

However, LANG does not:

    midna /tmp $ LANG=de_DE.UTF-8 ./localetest
    LC_NUMERIC is de_DE.UTF-8
    midna /tmp $ LANG=de_DE.UTF-8 LC_NUMERIC=en_DK.UTF-8 ./localetest
    LC_NUMERIC is en_DK.UTF-8

This is consistent with what perldoc perllocale says:
http://perldoc.perl.org/perllocale.html#ENVIRONMENT
2012-08-27 15:07:18 +02:00
Michael Stapelberg 070a18e598 i3bar: update manpage for the i3bar-protocol
fixes #739
2012-08-12 19:26:04 +02:00
Michael Stapelberg 78f5f2204d ipc: implement GET_VERSION to find out the i3 version
This is useful for third-party scripts which require certain features
and want to error out cleanly when they are run with an old i3 version.

Additionally, i3 --version might be different from what’s actually
running (an old version of the binary), so i3-msg -t get_version will be
the best way to figure out the i3 version you are actually running from
this commit on.
2012-08-05 14:30:05 +02:00
Quentin Glidic f80b877c6b man/i3bar: Reference j4status 2012-08-05 14:01:20 +02:00
Michael Stapelberg 4cba4c89ad Add xfce4-terminal to i3-sensible-terminal
Fixes #753
2012-08-02 15:20:17 +02:00
Quentin Glidic 8029fae6a9 Move mans to the new Makefile layout 2012-07-22 20:27:13 +02:00
Quentin Glidic bdc078914b i3: Replace loglevels by a global debug logging
File-limited were not used nor really useful
Besides, they are painful to maintain in Makefile rules compared to the
benefit
2012-07-22 18:41:12 +02:00