Add Meson build system support

Signed-off-by: Quentin Glidic <sardemff7+git@sardemff7.net>
This commit is contained in:
Quentin Glidic 2017-05-04 13:45:11 +02:00
parent 9302ef59f3
commit 7fd8ce4c0a
No known key found for this signature in database
GPG key ID: AC203F96E2C34BB7
7 changed files with 531 additions and 11 deletions

View file

@ -56,6 +56,10 @@ before_install:
# TODO: We install libxcb-ewmh-dev here, until it is whitelisted again in Travis
install:
- sudo apt-get install -y --force-yes libxkbcommon-dev libxkbcommon-x11-dev libxcb-ewmh-dev flex/trusty-backports libfl-dev/trusty-backports
- pip3 install meson
- wget https://github.com/ninja-build/ninja/releases/download/v1.7.2/ninja-linux.zip
- unzip ninja-linux.zip
- export PATH=$(pwd):$PATH
- git clone https://github.com/alobbs/doxy-coverage
- git clone --recursive https://github.com/Airblader/xcb-util-xrm.git
- cd xcb-util-xrm
@ -72,21 +76,16 @@ install:
- cd -
before_script:
- autoreconf -i
- ./configure --enable-gcov --enable-drun
- meson build -Db_coverage=true
script:
- make
- make check
- ninja -C build
- ninja -C build test
- ulimit -c unlimited
- make test-x
- if [ -f core ]; then echo "bt" | gdb ./rofi core; fi
- make test-x1
- make coverage-cli
- make distcheck
- make doxy 2>&1 > doxygen.log
- ninja -C build test-x
- ninja -C build doc/html 2>&1 > doxygen.log
- test $(grep -c warning doxygen.log) -eq 0
- ./doxy-coverage/doxy-coverage.py doc/html/xml/
- ./doxy-coverage/doxy-coverage.py build/doc/html/xml/
after_success:
- bash <(curl -s https://codecov.io/bash)

View file

@ -25,6 +25,7 @@
*
*/
#include "config.h"
#include <stdio.h>
#include <stdlib.h>
#include <glib.h>

32
doc/meson.build Normal file
View file

@ -0,0 +1,32 @@
ronn = find_program('ronn', required: false)
if ronn.found()
run_target('update-manpage',
command: [ ronn, files(
'rofi-manpage.markdown',
'rofi-theme-manpage.markdown',
)]
)
endif
doxy_conf = configuration_data()
doxy_conf.set('PACKAGE', meson.project_name())
doxy_conf.set('VERSION', meson.project_version())
doxy_conf.set('abs_builddir', join_paths(meson.build_root(), meson.current_build_dir()))
doxy_conf.set('abs_top_srcdir', meson.source_root())
doxyfile = configure_file(
input: 'rofi.doxy.in',
output: 'rofi.doxy',
configuration: doxy_conf,
install: false,
)
doxygen = find_program('doxygen', required: false)
if doxygen.found()
html_target = custom_target('doxy',
input: doxyfile,
output: 'html',
command: [doxygen, doxyfile],
install: false,
)
endif

441
meson.build Normal file
View file

@ -0,0 +1,441 @@
project('rofi', 'c',
version: '1.3.1',
meson_version: '>=0.39.1',
license: [ 'MIT' ],
default_options: [
'c_std=c99',
'warning_level=3',
],
)
c_compiler = meson.get_compiler('c')
plugindir = join_paths(get_option('prefix'), get_option('libdir'), meson.project_name())
themedir = join_paths(get_option('prefix'), get_option('datadir'), meson.project_name(), 'themes')
deps = [
dependency('glib-2.0', version: '>= 2.40'),
dependency('gio-unix-2.0'),
dependency('gmodule-2.0'),
dependency('cairo'),
dependency('pango'),
dependency('pangocairo'),
dependency('xkbcommon', version: '>= 0.5.0'),
c_compiler.find_library('m', required: false),
]
# XCB stuff
deps += [
subproject('libgwater/xcb').get_variable('libgwater_xcb'),
dependency('xcb-aux'),
dependency('xcb-xkb'),
dependency('xkbcommon-x11'),
dependency('xcb-ewmh'),
dependency('xcb-icccm'),
dependency('xcb-xrm'),
dependency('xcb-randr'),
dependency('xcb-xinerama'),
dependency('cairo-xcb'),
dependency('libstartup-notification-1.0'),
]
check = dependency('check', version: '>= 0.11.0', required: get_option('enable-check'))
header_conf = configuration_data()
header_conf.set_quoted('PACKAGE_NAME', meson.project_name())
header_conf.set_quoted('PACKAGE_VERSION', meson.project_version())
header_conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
header_conf.set_quoted('PACKAGE_BUGREPORT', 'https://github.com/DaveDavenport/rofi/')
header_conf.set_quoted('PACKAGE_URL', 'https://reddit.com/r/qtools/')
header_conf.set('THEME_CONVERTER', true)
header_conf.set('_GNU_SOURCE', true)
git = find_program('git', required: false)
if git.found()
git_version = run_command(git, '--git-dir', join_paths(meson.source_root(), '.git'), 'describe', '--tags', '--always', '--dirty')
git_branch = run_command(git, '--git-dir', join_paths(meson.source_root(), '.git'), 'describe', '--tags', '--always', '--all')
if git_version.returncode() == 0 and git_branch.returncode() == 0
git_branch_parts = []
foreach b : git_branch.stdout().strip().split('/')
if b != 'heads'
git_branch_parts += b
endif
endforeach
header_conf.set_quoted('GIT_VERSION', '@0@ - @1@ (@2@)'.format(meson.project_version(), git_version.stdout().strip(), '/'.join(git_branch_parts)))
endif
endif
header_conf.set('ENABLE_DRUN', get_option('enable-drun'))
header_conf.set('WINDOW_MODE', get_option('enable-window'))
header_conf.set_quoted('MANPAGE_PATH', join_paths(get_option('prefix'), get_option('mandir')))
header_conf.set_quoted('SYSCONFDIR', join_paths(get_option('prefix'), get_option('sysconfdir')))
header_conf.set_quoted('PLUGIN_PATH', plugindir)
header_conf.set_quoted('THEME_DIR', themedir)
config_h = configure_file(output: 'config.h', configuration: header_conf)
add_project_arguments(
'-fvisibility=hidden',
'-I@0@'.format(meson.build_root()),
'-I@0@'.format(join_paths(meson.source_root(), 'include')),
language: 'c'
)
flags = [
'-Wparentheses',
'-Winline',
'-Wunreachable-code',
'-Werror=missing-prototypes',
]
if get_option('enable-asan')
flags += [
'-fsanitize=address',
'-fno-omit-frame-pointer',
]
endif
foreach f : flags
if c_compiler.has_argument(f)
add_project_arguments(f, language: 'c')
endif
endforeach
install_headers([
'include/mode.h',
'include/mode-private.h',
'include/helper.h',
],
subdir: meson.project_name(),
)
install_data(
'script/rofi-sensible-terminal',
'script/rofi-theme-selector',
install_dir: join_paths(get_option('prefix'), get_option('bindir'))
)
flex = generator(find_program('flex'),
output: '@BASENAME@.c',
arguments: [ '-o', '@OUTPUT@', '@INPUT@' ]
)
bison = generator(find_program('bison'),
output: [ '@BASENAME@.c', '@BASENAME@.h' ],
arguments: [ '-y', '@INPUT@', '--defines=@OUTPUT1@', '--output=@OUTPUT0@' ]
)
rofi_sources = files(
'source/rofi.c',
'source/view.c',
'source/mode.c',
'source/keyb.c',
'config/config.c',
'source/helper.c',
'source/timings.c',
'source/history.c',
'source/theme.c',
'source/widgets/box.c',
'source/widgets/container.c',
'source/widgets/widget.c',
'source/widgets/textbox.c',
'source/widgets/listview.c',
'source/widgets/scrollbar.c',
'source/xrmoptions.c',
'source/x11-helper.c',
'source/dialogs/run.c',
'source/dialogs/ssh.c',
'source/dialogs/drun.c',
'source/dialogs/dmenu.c',
'source/dialogs/combi.c',
'source/dialogs/window.c',
'source/dialogs/script.c',
'source/dialogs/help-keys.c',
'include/xcb.h',
'include/xcb-internal.h',
'include/rofi.h',
'include/mode.h',
'include/mode-private.h',
'include/settings.h',
'include/keyb.h',
'include/view.h',
'include/view-internal.h',
'include/helper.h',
'include/helper-theme.h',
'include/timings.h',
'include/history.h',
'include/theme.h',
'include/default-theme.h',
'include/widgets/box.h',
'include/widgets/container.h',
'include/widgets/widget.h',
'include/widgets/widget-internal.h',
'include/widgets/textbox.h',
'include/widgets/listview.h',
'include/widgets/scrollbar.h',
'include/xrmoptions.h',
'include/x11-helper.h',
'include/dialogs/ssh.h',
'include/dialogs/run.h',
'include/dialogs/drun.h',
'include/dialogs/dmenu.h',
'include/dialogs/combi.h',
'include/dialogs/script.h',
'include/dialogs/window.h',
'include/dialogs/dialogs.h',
'include/dialogs/help-keys.h',
'include/xkb.h',
'include/xkb-internal.h',
)
theme_lexer_sources = files('lexer/theme-lexer.l')
theme_parser_sources = files('lexer/theme-parser.y')
theme_lexer = flex.process(theme_lexer_sources)
theme_parser = bison.process(theme_parser_sources)
rofi = executable('rofi', rofi_sources + [
theme_lexer,
theme_parser,
],
dependencies: deps,
install: true,
)
subdir('doc')
install_man(
'doc/rofi.1',
'doc/rofi-sensible-terminal.1',
)
install_data(
'themes/Adapta-Nokto.rasi',
'themes/Arc.rasi',
'themes/DarkBlue.rasi',
'themes/Indego.rasi',
'themes/Monokai.rasi',
'themes/Paper.rasi',
'themes/android_notification.rasi',
'themes/arthur.rasi',
'themes/blue.rasi',
'themes/c64.rasi',
'themes/glue_pro_blue.rasi',
'themes/gruvbox-dark-hard.rasi',
'themes/gruvbox-dark-soft.rasi',
'themes/gruvbox-dark.rasi',
'themes/gruvbox-light-hard.rasi',
'themes/gruvbox-light-soft.rasi',
'themes/gruvbox-light.rasi',
'themes/lb.rasi',
'themes/paper-float.rasi',
'themes/purple.rasi',
'themes/sidebar.rasi',
'themes/solarized.rasi',
'themes/solarized_alternate.rasi',
install_dir: themedir
)
test('history test', executable('history.test', [
'test/history-test.c',
],
objects: rofi.extract_objects([
'source/history.c',
'config/config.c',
]),
dependencies: deps,
))
test('helper_pidfile test', executable('helper_pidfile.test', [
'test/helper-pidfile.c',
],
objects: rofi.extract_objects([
'config/config.c',
'source/helper.c',
'source/xrmoptions.c',
'source/x11-helper.c',
]),
dependencies: deps,
))
test('helper_tokenize test', executable('helper_tokenize.test', [
'test/helper-tokenize.c',
],
objects: rofi.extract_objects([
'config/config.c',
'source/helper.c',
'source/xrmoptions.c',
'source/x11-helper.c',
]),
dependencies: deps,
))
test('widget test', executable('widget.test', [
'test/widget-test.c',
theme_parser,
theme_lexer,
],
objects: rofi.extract_objects([
'source/widgets/widget.c',
'source/widgets/textbox.c',
'source/theme.c',
'source/helper.c',
'source/x11-helper.c',
'config/config.c',
]),
dependencies: deps,
))
test('box test', executable('box.test', [
'test/box-test.c',
theme_parser,
theme_lexer,
],
objects: rofi.extract_objects([
'source/widgets/widget.c',
'source/widgets/box.c',
'source/theme.c',
'config/config.c',
]),
dependencies: deps,
))
test('scrollbar test', executable('scrollbar.test', [
'test/scrollbar-test.c',
theme_parser,
theme_lexer,
],
objects: rofi.extract_objects([
'source/widgets/widget.c',
'source/widgets/scrollbar.c',
'source/theme.c',
'config/config.c',
]),
dependencies: deps,
))
test('textbox test', executable('textbox.test', [
'test/textbox-test.c',
theme_parser,
theme_lexer,
],
objects: rofi.extract_objects([
'source/widgets/widget.c',
'source/widgets/textbox.c',
'source/theme.c',
'source/helper.c',
'source/x11-helper.c',
'config/config.c',
]),
dependencies: deps,
))
test('helper test', executable('helper.test', [
'test/helper-test.c',
],
objects: rofi.extract_objects([
'config/config.c',
'source/helper.c',
'source/xrmoptions.c',
'source/x11-helper.c',
]),
dependencies: deps,
))
test('helper_expand test', executable('helper_expand.test', [
'test/helper-expand.c',
],
objects: rofi.extract_objects([
'config/config.c',
'source/helper.c',
'source/xrmoptions.c',
'source/x11-helper.c',
]),
dependencies: deps,
))
test('helper_config_cmdline_parser test', executable('helper_config_cmdline_parser.test', [
'test/helper-config-cmdline-parser.c',
],
objects: rofi.extract_objects([
'config/config.c',
'source/helper.c',
'source/xrmoptions.c',
'source/x11-helper.c',
]),
dependencies: deps,
))
if check.found()
deps+= [ check ]
test('theme_parser test', executable('theme_parser.test', [
'test/theme-parser-test.c',
theme_lexer,
theme_parser,
],
objects: rofi.extract_objects([
'config/config.c',
'source/helper.c',
'source/xrmoptions.c',
'source/x11-helper.c',
'source/theme.c',
]),
dependencies: deps,
))
test('mode test', executable('mode.test', [
'test/mode-test.c',
],
objects: rofi.extract_objects([
'config/config.c',
'source/dialogs/help-keys.c',
'source/helper.c',
'source/mode.c',
'source/xrmoptions.c',
'source/keyb.c',
]),
dependencies: deps,
))
endif
run_target('test-x', command: [ 'test/run_all_tests.sh' ])
uncrustify = find_program('uncrustify', required: false)
if uncrustify.found()
run_target('indent',
command: [
uncrustify,
'-c', join_paths(meson.source_root(), 'data', 'uncrustify.cfg'),
rofi_sources
],
)
endif
rofi_sources += theme_lexer_sources
rofi_sources += theme_parser_sources
cppcheck = find_program('cppcheck', required: false)
if cppcheck.found()
run_target('cppcheck',
command: [
cppcheck,
'--std=@0@'.format(get_option('c_std')),
'--platform=unix64',
'--enable=all',
'-Uerror_dialog',
'--inconclusive',
'-I@0@'.format(join_paths(meson.source_root(), 'include')),
rofi_sources
],
)
endif
ohcount = find_program('ohcount', required: false)
if ohcount.found()
run_target('ohcount',
command: [
ohcount,
rofi_sources
],
)
endif

5
meson_options.txt Normal file
View file

@ -0,0 +1,5 @@
option('enable-drun', type: 'boolean', value: true, description: 'Desktop file mode')
option('enable-window', type: 'boolean', value: true, description: 'Window switcher mode')
option('enable-timings', type: 'boolean', value: true, description: 'Timimngs output')
option('enable-asan', type: 'boolean', value: false, description: 'Address sanitizer')
option('enable-check', type: 'boolean', value: true, description: 'Build and run libcheck-based tests')

View file

@ -27,6 +27,7 @@
#define G_LOG_DOMAIN "Theme"
#include "config.h"
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

41
test/run_all_tests.sh Executable file
View file

@ -0,0 +1,41 @@
#!/usr/bin/env bash
tests=(
run_errormsg_test
run_switchdialog_test
run_dmenu_test
run_dmenu_custom_test
run_run_test
run_script_test
run_issue_256
run_issue_275
run_dmenu_empty
run_dmenu_issue_292
run_screenshot_test
xr_dump_test
run_drun_test
run_combi_test
run_regex_test
run_glob_test
run_issue333_test
help_output_test
run_dmenu_normal_window_test
run_window_test
)
cd ${MESON_BUILD_ROOT}
rm -f core
display=200
for test in "${tests[@]}"; do
echo "Test ${test}"
${MESON_SOURCE_ROOT}/test/run_test.sh ${display} ${MESON_SOURCE_ROOT}/test/${test}.sh ${MESON_BUILD_ROOT} ${MESON_SOURCE_ROOT}
ret=$?
if [[ -f core ]]; then
echo "bt" | gdb ./rofi core
exit ${ret}
elif [[ ${ret} != 0 ]]; then
exit ${ret}
fi
display=$(( ${display} + 1 ))
done