diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..6b8710a71 --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +.git diff --git a/.gitignore b/.gitignore index b2ebd4aa1..522225425 100644 --- a/.gitignore +++ b/.gitignore @@ -40,8 +40,19 @@ docs/*.html i3-command-parser.stamp i3-config-parser.stamp .clang_complete +compile_commands.json +/.ccls-cache +/.clangd LAST_VERSION +# We recommend building in a subdirectory called build. +# If you chose a different directory name, +# it is up to you to arrange for it to be ignored by git, +# e.g. by listing your directory in .git/info/exclude. +/build + +# TODO(autotools-removal): remove autotools from .gitignore: + ################################################################################ # https://raw.githubusercontent.com/github/gitignore/master/Autotools.gitignore ################################################################################ diff --git a/.travis.yml b/.travis.yml index b56bf6843..e56db17f9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -31,7 +31,10 @@ 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 + # # TODO(autotools-removal): autoconf build has to keep working until i3 4.19 + # is released, so we keep building it in travis. - 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 -Wstrict-prototypes -Wmissing-prototypes -Werror -fno-common"' + - docker run -v $PWD:/usr/src/i3/ -w /usr/src/i3 -e CC ${BASENAME} /bin/sh -c 'rm -rf build; mkdir -p build && cd build && CFLAGS="-Wformat -Wformat-security -Wextra -Wno-unused-parameter -Wstrict-prototypes -Wmissing-prototypes -Werror -fno-common" meson .. -Ddocs=true -Dmans=true -Db_sanitize=address && ninja -v' - 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/RELEASE-NOTES-next b/RELEASE-NOTES-next index f8c21241b..d5db53220 100644 --- a/RELEASE-NOTES-next +++ b/RELEASE-NOTES-next @@ -6,6 +6,12 @@ This is i3 v4.19. This version is considered stable. All users of i3 are strongly encouraged to upgrade. +In this release, we switched from the autotools build system to the meson build +system (https://mesonbuild.com/). Check https://github.com/i3/i3/issues/4086 for +details. If this causes problems for you, you can revert the commit which +removed autotools from the tree: we tried our best to keep both build systems +working. Please reach out to us in that case! + ┌────────────────────────────┐ │ Changes in i3 v4.19 │ └────────────────────────────┘ diff --git a/debian/compat b/debian/compat index ec635144f..f599e28b8 100644 --- a/debian/compat +++ b/debian/compat @@ -1 +1 @@ -9 +10 diff --git a/debian/control b/debian/control index 843e6557c..5cd27cd62 100644 --- a/debian/control +++ b/debian/control @@ -2,8 +2,8 @@ Source: i3-wm Section: x11 Priority: extra Maintainer: Michael Stapelberg -Build-Depends: debhelper (>= 9), - dh-autoreconf, +Build-Depends: debhelper (>= 10), + meson, libx11-dev, libxcb-util0-dev (>= 0.3.8), libxcb-keysyms1-dev, diff --git a/debian/rules b/debian/rules index d5c306867..6b342141c 100755 --- a/debian/rules +++ b/debian/rules @@ -22,4 +22,4 @@ override_dh_builddeb: dh_builddeb -- -Zgzip %: - dh $@ --parallel --builddirectory=build --with=autoreconf + dh $@ --buildsystem=meson+ninja diff --git a/docs/hacking-howto b/docs/hacking-howto index 16b9a5516..52b10c494 100644 --- a/docs/hacking-howto +++ b/docs/hacking-howto @@ -23,16 +23,12 @@ outdated information. == Building i3 -You can build i3 like you build any other software package which uses autotools. +You can build i3 like you build any other software package which uses meson. 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. + $ meson .. + $ ninja === Build system features diff --git a/include/libi3.h b/include/libi3.h index 56da86fb2..c0b9ddbd3 100644 --- a/include/libi3.h +++ b/include/libi3.h @@ -101,7 +101,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, STRIPPED__FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__) +#define DLOG(fmt, ...) debuglog("%s:%s:%d - " fmt, __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__) #endif /** diff --git a/include/log.h b/include/log.h index d3c3e3f3e..c2758443a 100644 --- a/include/log.h +++ b/include/log.h @@ -26,7 +26,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, STRIPPED__FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__) +#define DLOG(fmt, ...) debuglog("%s:%s:%d - " fmt, __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__) extern char *errorfilename; extern char *shmlogname; diff --git a/libi3/is_debug_build.c b/libi3/is_debug_build.c index cb53407ec..9458f75b3 100644 --- a/libi3/is_debug_build.c +++ b/libi3/is_debug_build.c @@ -16,10 +16,16 @@ */ bool is_debug_build(void) { /* i3_version contains either something like this: - * "4.0.2 (2011-11-11, branch "release")". - * or: "4.0.2-123-gCOFFEEBABE (2011-11-11, branch "next")". + * "4.0.2 (2011-11-11)" (release version) + * or: "4.0.2-123-gC0FFEE" (debug version) * * So we check for the offset of the first opening round bracket to * determine whether this is a git version or a release version. */ + if (strchr(I3_VERSION, '(') == NULL) { + return true; // e.g. 4.0.2-123-gC0FFEE + } + /* In practice, debug versions do not contain parentheses at all, + * but leave the logic as it was before so that we can re-add + * parentheses if we chose to. */ return ((strchr(I3_VERSION, '(') - I3_VERSION) > 10); } diff --git a/meson.build b/meson.build new file mode 100644 index 000000000..0a94ac05e --- /dev/null +++ b/meson.build @@ -0,0 +1,637 @@ +# -*- mode: meson -*- + +# Style objective: be consistent with what mesonbuild.com documents/uses, and/or +# the meson book: https://meson-manual.com/ + +project( + 'i3', + 'c', + version: '4.18.1', + default_options: [ + 'c_std=c11', + 'warning_level=1', # enable all warnings (-Wall) + # TODO(https://github.com/i3/i3/issues/4087): switch to + # 'buildtype=debugoptimized', + ], + # Ubuntu 18.04 (supported until 2023) has meson 0.45. + # We can revisit our minimum supported meson version + # if it turns out to be too hard to maintain. + meson_version: '>=0.45.0', +) + +cc = meson.get_compiler('c') +add_project_arguments(cc.get_supported_arguments(['-Wunused-value']), language: 'c') + +if meson.version().version_compare('>=0.48.0') + # https://github.com/mesonbuild/meson/issues/2166#issuecomment-629696911 + meson.add_dist_script('meson/meson-dist-script') +else + message('meson <0.48.0 detected, dist tarballs will not be filtered') +endif + +################################################################################ +# Version handling +################################################################################ + +cdata = configuration_data() + +version_array = meson.project_version().split('.') +cdata.set('MAJOR_VERSION', version_array[0].to_int()) +cdata.set('MINOR_VERSION', version_array[1].to_int()) +if version_array.length() > 2 + cdata.set('PATCH_VERSION', version_array[2].to_int()) +else + cdata.set('PATCH_VERSION', 0) +endif +cdata.set_quoted('I3_VERSION', '@VCS_TAG@') +cdata.set_quoted('SYSCONFDIR', join_paths(get_option('prefix'), get_option('sysconfdir'))) + +if get_option('b_sanitize').split(',').contains('address') + cdata.set('I3_ASAN_ENABLED', 1) +endif + +cdata.set('HAVE_STRNDUP', cc.has_function('strndup')) +cdata.set('HAVE_MKDIRP', cc.has_function('mkdirp')) + +# Instead of generating config.h directly, make vcs_tag generate it so that +# @VCS_TAG@ is replaced. +config_h_in = configure_file( + output: 'config.h.in', + configuration: cdata, +) +config_h = declare_dependency( + sources: vcs_tag( + input: config_h_in, + output: 'config.h', + fallback: meson.project_version() + '-non-git', + ) +) + +################################################################################ +# docs generation +################################################################################ + +if get_option('docs') + asciidoc = find_program('asciidoc') + doc_toc_inputs = [ + 'docs/hacking-howto', + 'docs/userguide', + 'docs/ipc', + 'docs/multi-monitor', + 'docs/wsbar', + 'docs/testsuite', + 'docs/i3bar-protocol', + 'docs/layout-saving', + ] + foreach m : doc_toc_inputs + custom_target( + m.underscorify()+'_asciidoc', + input: m, + output: '@BASENAME@.html', + command: [ + asciidoc, + '-a', 'toc', + '-n', + '-o', '@OUTPUT@', + '@INPUT@', + ], + install: true, + install_dir: join_paths(get_option('datadir'), 'doc', 'i3'), + ) + endforeach + + doc_notoc_inputs = [ + 'docs/debugging', + ] + foreach m : doc_notoc_inputs + custom_target( + m.underscorify()+'_asciidoc', + input: m, + output: '@BASENAME@.html', + command: [ + asciidoc, + '-n', + '-o', '@OUTPUT@', + '@INPUT@', + ], + install: true, + install_dir: join_paths(get_option('datadir'), 'doc', 'i3'), + ) + endforeach +endif + +if meson.version().version_compare('>=0.53') + summary('build docs (-Ddocs)', get_option('docs')) +endif + +################################################################################ +# manpages +################################################################################ + +if get_option('mans') + asciidoc = find_program('asciidoc') + asciidoc_cdata = configuration_data() + asciidoc_cdata.set('PACKAGE_VERSION', meson.project_version()) + asciidoc_conf = configure_file( + input: 'man/asciidoc.conf.in', + output: 'asciidoc.conf', + configuration: asciidoc_cdata, + ) + + xmlto = find_program('xmlto') + + pod2man = find_program('pod2man') + + man_inputs = [ + 'man/i3.man', + 'man/i3bar.man', + 'man/i3-msg.man', + 'man/i3-input.man', + 'man/i3-nagbar.man', + 'man/i3-config-wizard.man', + 'man/i3-migrate-config-to-v4.man', + 'man/i3-sensible-editor.man', + 'man/i3-sensible-pager.man', + 'man/i3-sensible-terminal.man', + 'man/i3-dump-log.man', + ] + + foreach m : man_inputs + xml = custom_target( + m.underscorify()+'_asciidoc', + input: m, + output: '@BASENAME@.xml', + command: [ + asciidoc, + '-d', 'manpage', + '-b', 'docbook', + '-f', asciidoc_conf, + '-o', '@OUTPUT@', + '@INPUT@', + ], + ) + + custom_target( + m.underscorify()+'_xmlto', + input: xml, + output: '@BASENAME@.1', + command: [ + xmlto, + 'man', + '-o', + '@OUTDIR@', + '@INPUT@', + ], + # We should use install and install_dir instead of install_man as per: + # https://github.com/mesonbuild/meson/issues/4981#issuecomment-467084867 + # https://github.com/mesonbuild/meson/issues/1550#issuecomment-370164307 + install: true, + install_dir: join_paths(get_option('mandir'), 'man1'), + ) + endforeach + + pod2man_inputs = [ + 'i3-dmenu-desktop', + 'i3-save-tree', + ] + foreach m : pod2man_inputs + custom_target( + m.underscorify()+'_pod2man', + input: m, + output: '@BASENAME@.1', + command: [ + pod2man, + '--utf8', + '@INPUT@', + '@OUTPUT@', + ], + # We should use install and install_dir instead of install_man as per: + # https://github.com/mesonbuild/meson/issues/4981#issuecomment-467084867 + # https://github.com/mesonbuild/meson/issues/1550#issuecomment-370164307 + install: true, + install_dir: join_paths(get_option('mandir'), 'man1'), + ) + endforeach +endif + +if meson.version().version_compare('>=0.53') + summary('build manpages (-Dmans)', get_option('docs')) +endif + +# Required for e.g. struct ucred to be defined as per unix(7). +add_project_arguments('-D_GNU_SOURCE', language: 'c') + +# https://mesonbuild.com/howtox.html#add-math-library-lm-portably +m_dep = cc.find_library('m', required: false) +rt_dep = cc.find_library('rt', required: false) +iconv_dep = cc.find_library('iconv', required: false) + +libsn_dep = dependency('libstartup-notification-1.0', method: 'pkg-config') +xcb_dep = dependency('xcb', method: 'pkg-config') +xcb_xkb_dep = dependency('xcb-xkb', method: 'pkg-config') +xcb_xinerama_dep = dependency('xcb-xinerama', method: 'pkg-config') +xcb_randr_dep = dependency('xcb-randr', method: 'pkg-config') +xcb_shape_dep = dependency('xcb-shape', method: 'pkg-config') +xcb_util_dep = dependency('xcb-util', method: 'pkg-config') +xcb_util_cursor_dep = dependency('xcb-cursor', method: 'pkg-config') +xcb_util_keysyms_dep = dependency('xcb-keysyms', method: 'pkg-config') +xcb_util_wm_dep = dependency('xcb-icccm', method: 'pkg-config') +xcb_util_xrm_dep = dependency('xcb-xrm', method: 'pkg-config') +xkbcommon_dep = dependency('xkbcommon', method: 'pkg-config') +xkbcommon_x11_dep = dependency('xkbcommon-x11', method: 'pkg-config') +yajl_dep = dependency('yajl', method: 'pkg-config') +libpcre_dep = dependency('libpcre', version: '>=8.10', method: 'pkg-config') +cairo_dep = dependency('cairo', version: '>=1.14.4', method: 'pkg-config') +pangocairo_dep = dependency('pangocairo', method: 'pkg-config') +glib_dep = dependency('glib-2.0', method: 'pkg-config') +gobject_dep = dependency('gobject-2.0', method: 'pkg-config') + +ev_dep = cc.find_library('ev') + +inc = include_directories('include') + +libi3srcs = [ + '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/g_utf8_make_valid.c', + 'libi3/ipc_connect.c', + 'libi3/ipc_recv_message.c', + 'libi3/ipc_send_message.c', + 'libi3/is_debug_build.c', + 'libi3/resolve_tilde.c', + 'libi3/root_atom_contents.c', + 'libi3/safewrappers.c', + 'libi3/string.c', + 'libi3/ucs2_conversion.c', +] + +if not cdata.get('HAVE_STRNDUP') + libi3srcs += 'libi3/strndup.c' +endif + +if not cdata.get('HAVE_MKDIRP') + libi3srcs += 'libi3/mkdirp.c' +endif + +libi3 = static_library( + 'i3', + libi3srcs, + include_directories: inc, + dependencies: [ + pangocairo_dep, + config_h, + ], +) + +i3srcs = [ + '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/display_version.c', + 'src/drag.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/sync.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', +] + +# Verify the perl interpreter is present for running parser_gen, +# ensuring a good error message when it isn’t: +perl = find_program('perl') +parser_gen = find_program('generate-command-parser.pl') + +command_parser = custom_target( + 'command_parser', + input: 'parser-specs/commands.spec', + output: [ + 'GENERATED_command_enums.h', + 'GENERATED_command_tokens.h', + 'GENERATED_command_call.h', + ], + command: [perl, parser_gen, '--input=@INPUT@', '--prefix=command'], +) + +i3srcs += command_parser + +config_parser = custom_target( + 'config_parser', + input: 'parser-specs/config.spec', + output: [ + 'GENERATED_config_enums.h', + 'GENERATED_config_tokens.h', + 'GENERATED_config_call.h', + ], + command: [parser_gen, '--input=@INPUT@', '--prefix=config'], +) + +i3srcs += config_parser + +# src/log.c uses threading primitives for synchronization +thread_dep = dependency('threads') + +common_deps = [ + thread_dep, + m_dep, + iconv_dep, + rt_dep, + libsn_dep, + xcb_dep, + xcb_xkb_dep, + xcb_xinerama_dep, + xcb_randr_dep, + xcb_shape_dep, + xcb_util_dep, + xcb_util_cursor_dep, + xcb_util_keysyms_dep, + xcb_util_wm_dep, + xcb_util_xrm_dep, + xkbcommon_dep, + xkbcommon_x11_dep, + yajl_dep, + libpcre_dep, + cairo_dep, + pangocairo_dep, + glib_dep, + gobject_dep, + ev_dep, + config_h, +] + +executable( + 'i3', + i3srcs, + install: true, + include_directories: inc, + dependencies: common_deps, + link_with: libi3, +) + +# This is the only currently working way of installing a symbolic link: +meson.add_install_script( + 'meson/meson-install-i3-with-shmlog', + get_option('bindir'), +) + +executable( + 'i3bar', + [ + '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', + ], + install: true, + include_directories: include_directories('include', 'i3bar/include'), + dependencies: common_deps, + link_with: libi3, +) + +executable( + 'i3-config-wizard', + [ + 'i3-config-wizard/i3-config-wizard-atoms.xmacro.h', + 'i3-config-wizard/main.c', + 'i3-config-wizard/xcb.h', + ], + install: true, + include_directories: include_directories('include', 'i3-config-wizard'), + dependencies: common_deps, + link_with: libi3, +) + +executable( + 'i3-dump-log', + 'i3-dump-log/main.c', + install: true, + include_directories: inc, + dependencies: common_deps, + link_with: libi3, +) + +executable( + 'i3-input', + [ + 'i3-input/i3-input.h', + 'i3-input/keysym2ucs.h', + 'i3-input/keysym2ucs.c', + 'i3-input/main.c', + ], + install: true, + include_directories: inc, + dependencies: common_deps, + link_with: libi3, +) + +executable( + 'i3-msg', + 'i3-msg/main.c', + install: true, + include_directories: inc, + dependencies: common_deps, + link_with: libi3, +) + +executable( + 'i3-nagbar', + [ + 'i3-nagbar/i3-nagbar-atoms.xmacro.h', + 'i3-nagbar/main.c', + ], + install: true, + include_directories: include_directories('include', 'i3-nagbar'), + dependencies: common_deps, + link_with: libi3, +) + +install_data( + [ + 'i3-dmenu-desktop', + 'i3-migrate-config-to-v4', + 'i3-save-tree', + 'i3-sensible-editor', + 'i3-sensible-pager', + 'i3-sensible-terminal', + ], + install_dir: 'bin', +) + +install_subdir( + 'etc', + strip_directory: true, + install_dir: join_paths(get_option('sysconfdir'), 'i3'), +) + +install_subdir( + 'share/', + strip_directory: true, + install_dir: get_option('datadir'), +) + +install_headers( + 'include/i3/ipc.h', + subdir: 'i3', +) + +# We cannot use configure_file for complete-run.pl.in and i3test.pm.in +# because configure_file strips the backslash in e.g. \@display, +# resulting in @display, breaking our Perl code: +# https://github.com/mesonbuild/meson/issues/7165 +sed = find_program('sed') +replace_dirs = [ + sed, + '-e', + 's,@abs_top_builddir@,'+meson.current_build_dir()+',g;s,@abs_top_srcdir@,'+meson.current_source_dir()+',g', + '@INPUT@', +] +complete_run = custom_target( + 'complete-run', + input: ['testcases/complete-run.pl.in'], + output: ['complete-run.pl'], + capture: true, + command: replace_dirs, +) +i3test_pm = custom_target( + 'i3test-pm', + input: ['testcases/lib/i3test.pm.in'], + output: ['i3test.pm'], + capture: true, + command: replace_dirs, +) + +if get_option('docs') + i3_pod2html = find_program('docs/i3-pod2html') + + custom_target( + 'lib-i3test.html', + input: i3test_pm, + output: 'lib-i3test.html', + command: [ + i3_pod2html, + '@INPUT@', + '@OUTPUT@', + ], + install: true, + install_dir: join_paths(get_option('datadir'), 'doc', 'i3'), + ) + + custom_target( + 'lib-i3test-test.html', + input: 'testcases/lib/i3test/Test.pm', + output: 'lib-i3test-test.html', + command: [ + i3_pod2html, + '@INPUT@', + '@OUTPUT@', + ], + install: true, + install_dir: join_paths(get_option('datadir'), 'doc', 'i3'), + ) +endif + +executable( + 'test.inject_randr15', + 'testcases/inject_randr1.5.c', + include_directories: inc, + dependencies: common_deps, + link_with: libi3, +) + +executable( + 'test.commands_parser', + 'src/commands_parser.c', + include_directories: inc, + c_args: '-DTEST_PARSER', + dependencies: common_deps, + link_with: libi3, +) + +executable( + 'test.config_parser', + 'src/config_parser.c', + include_directories: inc, + c_args: '-DTEST_PARSER', + dependencies: common_deps, + link_with: libi3, +) + +anyevent_i3 = custom_target( + 'anyevent-i3', + # Should be AnyEvent-I3/blib/lib/AnyEvent/I3.pm, + # but see https://github.com/mesonbuild/meson/issues/2320 + output: 'AnyEvent-I3.stamp', + command: [ + 'sh', + '-c', + 'cp -r @0@/AnyEvent-I3 . && cd AnyEvent-I3 && perl Makefile.PL && make && touch ../AnyEvent-I3.stamp'.format(meson.current_source_dir()), + ], +) + +if meson.version().version_compare('>=0.46.0') + test( + 'complete-run', + perl, + args: [complete_run], + depends: [ + # i3test.pm is generated at meson configure time, + # so no explicit dependency is required. + anyevent_i3, + ], + ) +else + # meson < 0.46.0 does not support the depends arg in test targets. + # Just hope for the best. + test( + 'complete-run', + perl, + args: [complete_run], + ) + message('meson < 0.46 detected, you might need to run ninja test twice') +endif diff --git a/meson/meson-dist-script b/meson/meson-dist-script new file mode 100755 index 000000000..47d9ce367 --- /dev/null +++ b/meson/meson-dist-script @@ -0,0 +1,36 @@ +#!/bin/sh + +set -eu + +cd "${MESON_DIST_ROOT}" + +# Delete everything we do not want to have in the release tarballs: +rm -rf \ + contrib/banner.svg \ + contrib/show-download-count.sh \ + contrib/sticker-7x5cm-stickma.tif.lzma \ + contrib/sticker_stickma_black.svg \ + debian/ \ + docs/GPN-2009-06-27/ \ + docs/NoName-2009-03-12/ \ + docs/slides-2012-01-25/ \ + docs/slides-2012-03-16/ \ + testcases/.gitignore \ + travis/ \ + .clang-format \ + .editorconfig \ + i3bar/.gitignore \ + .travis.yml \ + logo.svg \ + README.md \ + RELEASE-NOTES-next \ + release.sh + +mkdir build +cd build +meson .. -Dprefix=/usr -Ddocs=true -Dmans=true +ninja +cp *.1 ../man/ +cp *.html ../docs/ +cd .. +rm -rf build diff --git a/meson/meson-install-i3-with-shmlog b/meson/meson-install-i3-with-shmlog new file mode 100755 index 000000000..2290a47a3 --- /dev/null +++ b/meson/meson-install-i3-with-shmlog @@ -0,0 +1,2 @@ +#!/bin/sh +ln -sf "i3" "${MESON_INSTALL_DESTDIR_PREFIX}/$1/i3-with-shmlog" diff --git a/meson_options.txt b/meson_options.txt new file mode 100644 index 000000000..482e1c2c8 --- /dev/null +++ b/meson_options.txt @@ -0,0 +1,7 @@ +# -*- mode: meson -*- + +option('docs', type: 'boolean', value: false, + description: 'Build documentation from source (release tarballs contain a generated copy)') + +option('mans', type: 'boolean', value: false, + description: 'Build manpages from source (release tarballs contain a generated copy)') diff --git a/release.sh b/release.sh index 3335aa4a0..0d8e30c7b 100755 --- a/release.sh +++ b/release.sh @@ -55,25 +55,21 @@ 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 -echo "${RELEASE_VERSION} ($(date +%F))" > I3_VERSION -git add I3_VERSION +sed -i "s/^\s*version: '${PREVIOUS_VERSION}'/ version: '${RELEASE_VERSION}'/" meson.build git commit -a -m "release i3 ${RELEASE_VERSION}" git tag "${RELEASE_VERSION}" -m "release i3 ${RELEASE_VERSION}" --sign --local-user=0x4AC8EE1D -autoreconf -fi mkdir build -(cd build && ../configure && make dist-bzip2 -j8) -cp build/i3-${RELEASE_VERSION}.tar.bz2 . +(cd build && meson .. && ninja dist) +cp build/meson-build/i3-${RELEASE_VERSION}.tar.xz . echo "Differences in the release tarball file lists:" diff --color -u \ - <(tar tf ../i3-${PREVIOUS_VERSION}.tar.bz2 | sed "s,i3-${PREVIOUS_VERSION}/,,g" | sort) \ - <(tar tf i3-${RELEASE_VERSION}.tar.bz2 | sed "s,i3-${RELEASE_VERSION}/,,g" | sort) + <(tar tf ../i3-${PREVIOUS_VERSION}.tar.xz | sed "s,i3-${PREVIOUS_VERSION}/,,g" | sort) \ + <(tar tf i3-${RELEASE_VERSION}.tar.xz | sed "s,i3-${RELEASE_VERSION}/,,g" | sort) -gpg --armor -b i3-${RELEASE_VERSION}.tar.bz2 +gpg --armor -b i3-${RELEASE_VERSION}.tar.xz echo "${RELEASE_VERSION}-non-git" > I3_VERSION git add I3_VERSION @@ -113,9 +109,9 @@ cat > ${TMPDIR}/Dockerfile <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 $(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 +sed -i "s,,\n \n ${RELEASE_VERSION}\n i3-${RELEASE_VERSION}.tar.xz\n $(LC_ALL=en_US.UTF-8 ls -lh ../i3/i3-${RELEASE_VERSION}.tar.xz | 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" diff --git a/testcases/complete-run.pl.in b/testcases/complete-run.pl.in index 3b3c3e354..00f8e609f 100755 --- a/testcases/complete-run.pl.in +++ b/testcases/complete-run.pl.in @@ -18,7 +18,7 @@ use Time::HiRes qw(time); use IO::Handle; # these are shipped with the testsuite -use lib qw(@abs_top_builddir@/testcases/lib @abs_top_srcdir@/testcases/lib @abs_top_builddir@/AnyEvent-I3/blib/lib); +use lib qw(@abs_top_builddir@ @abs_top_builddir@/testcases/lib @abs_top_srcdir@/testcases/lib @abs_top_builddir@/AnyEvent-I3/blib/lib); use i3test::Util qw(slurp); use StartXServer; use StatusLine; diff --git a/testcases/t/193-ipc-version.t b/testcases/t/193-ipc-version.t index d5f4badf6..82449de7a 100644 --- a/testcases/t/193-ipc-version.t +++ b/testcases/t/193-ipc-version.t @@ -32,6 +32,5 @@ cmp_ok($version->{minor}, '>', 0, 'minor version > 0'); is(int($version->{minor}), $version->{minor}, 'minor version is an integer'); is(int($version->{patch}), $version->{patch}, 'patch version is an integer'); -like($version->{human_readable}, qr/branch/, 'human readable version contains branch name'); done_testing; diff --git a/travis/docker-build-and-push.sh b/travis/docker-build-and-push.sh index 686b81b0e..243d36a92 100755 --- a/travis/docker-build-and-push.sh +++ b/travis/docker-build-and-push.sh @@ -5,10 +5,6 @@ set -e BASENAME=$1 DOCKERFILE=$2 -# .dockerignore is created on demand so that release.sh and other scripts are -# not influenced by our travis setup. -echo .git > .dockerignore - docker build --pull --no-cache --rm -t=${BASENAME} -f ${DOCKERFILE} . # For pull requests, travis does not add secure environment variables to the # environment (because pull requests could then steal their values), so skip diff --git a/travis/run-tests.sh b/travis/run-tests.sh index eac2ea8a3..4cc704798 100755 --- a/travis/run-tests.sh +++ b/travis/run-tests.sh @@ -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 ! make check +if ! ninja test then - ./testcases/complete-run.pl --parallel=1 || (cat latest/complete-run.log; false) + ./complete-run.pl --parallel=1 || (cat latest/complete-run.log; false) fi