diff options
Diffstat (limited to 'meson.build')
-rw-r--r-- | meson.build | 174 |
1 files changed, 142 insertions, 32 deletions
diff --git a/meson.build b/meson.build index 6f6d156..82e7978 100644 --- a/meson.build +++ b/meson.build @@ -1,7 +1,8 @@ # vim: noet ts=4 sts=4 sw=4: project('fiv', 'c', default_options : ['c_std=gnu99', 'warning_level=2'], - version : '0.1.0') + version : '0.1.0', + meson_version : '>=0.57') cc = meson.get_compiler('c') add_project_arguments( @@ -25,22 +26,25 @@ libjpegqs = dependency('libjpegqs', required : get_option('libjpegqs'), lcms2 = dependency('lcms2', required : get_option('lcms2')) # Note that only libraw_r is thread-safe, but we'll just run it out-of process. libraw = dependency('libraw', required : get_option('libraw')) +# This is a direct runtime dependency, but its usage may be disabled for images. librsvg = dependency('librsvg-2.0', required : get_option('librsvg')) xcursor = dependency('xcursor', required : get_option('xcursor')) libheif = dependency('libheif', required : get_option('libheif')) libtiff = dependency('libtiff-4', required : get_option('libtiff')) -# This is a direct dependency of GTK+, but its usage may be disabled. +# This is a direct dependency of GTK+, but its usage may be disabled for images. gdkpixbuf = dependency('gdk-pixbuf-2.0', required : get_option('gdk-pixbuf')) dependencies = [ dependency('gtk+-3.0'), dependency('pixman-1'), + dependency('epoxy'), - # Wuffs is included as a submodule. + dependency('libjpeg'), dependency('libturbojpeg'), dependency('libwebp'), dependency('libwebpdemux'), dependency('libwebpdecoder', required : false), dependency('libwebpmux'), + # Wuffs is included as a submodule. lcms2, libjpegqs, @@ -53,13 +57,31 @@ dependencies = [ cc.find_library('m', required : false), ] +# As of writing, no pkg-config file is produced, and the plugin is not installed +# by default. The library can be built statically, but it's a bit of a hassle. +have_lcms2_fast_float = false +if not get_option('lcms2fastfloat').disabled() + lcms2ff = dependency('lcms2_fast_float', required : false) + if not lcms2ff.found() + lcms2ff = cc.find_library( + 'lcms2_fast_float', required : get_option('lcms2fastfloat')) + if lcms2ff.found() and not cc.has_header('lcms2_fast_float.h') + error('lcms2_fast_float.h not found') + endif + endif + if lcms2ff.found() + dependencies += lcms2ff + have_lcms2_fast_float = true + endif +endif + # As of writing, the API is unstable, and no pkg-config file is produced. # Trying to wrap Cargo in Meson is a recipe for pain, so no version pinning. have_resvg = false if not get_option('resvg').disabled() resvg = dependency('resvg', required : false) if not resvg.found() - resvg = cc.find_library('libresvg', required : get_option('resvg')) + resvg = cc.find_library('resvg', required : get_option('resvg')) if resvg.found() and not cc.has_header('resvg.h') error('resvg.h not found') endif @@ -73,11 +95,13 @@ endif # XXX: https://github.com/mesonbuild/meson/issues/825 docdir = get_option('datadir') / 'doc' / meson.project_name() application_ns = 'name.janouch.' +application_url = 'https://janouch.name/p/' + meson.project_name() conf = configuration_data() conf.set_quoted('PROJECT_NAME', meson.project_name()) conf.set_quoted('PROJECT_VERSION', '@VCS_TAG@') conf.set_quoted('PROJECT_NS', application_ns) +conf.set_quoted('PROJECT_URL', application_url) conf.set_quoted('PROJECT_DOCDIR', get_option('prefix') / docdir) if win32 conf.set_quoted('PROJECT_DOCDIR', docdir) @@ -85,6 +109,7 @@ endif conf.set('HAVE_JPEG_QS', libjpegqs.found()) conf.set('HAVE_LCMS2', lcms2.found()) +conf.set('HAVE_LCMS2_FAST_FLOAT', have_lcms2_fast_float) conf.set('HAVE_LIBRAW', libraw.found()) conf.set('HAVE_RESVG', have_resvg) conf.set('HAVE_LIBRSVG', librsvg.found()) @@ -118,7 +143,8 @@ if win32 '--width', size, '--height', size, '@INPUT@']) endforeach - icon_ico = custom_target(input : icon_png_list, output : 'fiv.ico', + icon_ico = custom_target('fiv.ico', + output : 'fiv.ico', input : icon_png_list, command : [icotool, '-c', '-o', '@OUTPUT@', '@INPUT@']) rc += windows.compile_resources('fiv.rc', depends : icon_ico) endif @@ -133,23 +159,23 @@ gresources = gnome.compile_resources('resources', tiff_tables = custom_target('tiff-tables.h', output : 'tiff-tables.h', input : 'tiff-tables.db', - command : ['tiff-tables.awk', '@INPUT@'], + # Meson 0.56 chokes on files() as well as on a relative path. + command : [meson.current_source_dir() / 'tiff-tables.awk', '@INPUT@'], capture : true, ) desktops = ['fiv.desktop', 'fiv-browse.desktop'] -exe = executable('fiv', 'fiv.c', 'fiv-view.c', 'fiv-io.c', 'fiv-context-menu.c', +iolib = static_library('fiv-io', 'fiv-io.c', 'fiv-io-cmm.c', 'xdg.c', + tiff_tables, config, + dependencies : dependencies).extract_all_objects(recursive : true) +exe = executable('fiv', 'fiv.c', 'fiv-view.c', 'fiv-context-menu.c', 'fiv-browser.c', 'fiv-sidebar.c', 'fiv-thumbnail.c', 'fiv-collection.c', - 'xdg.c', gresources, rc, config, - install : true, + 'fiv-io-model.c', gresources, rc, config, + objects : iolib, dependencies : dependencies, + install : true, win_subsystem : 'windows', ) -if gdkpixbuf.found() - executable('io-benchmark', 'fiv-io-benchmark.c', 'fiv-io.c', 'xdg.c', - build_by_default : false, - dependencies : [dependencies, gdkpixbuf]) -endif desktops += 'fiv-jpegcrop.desktop' jpegcrop = executable('fiv-jpegcrop', 'fiv-jpegcrop.c', rc, config, @@ -162,38 +188,55 @@ jpegcrop = executable('fiv-jpegcrop', 'fiv-jpegcrop.c', rc, config, ) if get_option('tools').enabled() - # libjq 1.6 lacks a pkg-config file, and there is no release in sight. - # libjq 1.6 is required. - tools_dependencies = [cc.find_library('libjq'), dependency('libpng')] + # libjq has only received a pkg-config file in version 1.7. + # libjq >= 1.6 is required. + tools_dependencies = [ + cc.find_library('jq'), dependency('libpng'), dependency('libraw')] tools_c_args = cc.get_supported_arguments( '-Wno-unused-function', '-Wno-unused-parameter') - foreach tool : ['pnginfo', 'jpeginfo', 'tiffinfo', 'webpinfo', 'bmffinfo'] + foreach tool : ['info', 'pnginfo', 'rawinfo', 'hotpixels'] executable(tool, 'tools/' + tool + '.c', tiff_tables, dependencies : tools_dependencies, c_args: tools_c_args) endforeach + + if gdkpixbuf.found() + executable('benchmark-io', 'tools/benchmark-io.c', + objects : iolib, + dependencies : [dependencies, gdkpixbuf]) + endif endif +# Copying the files to the build directory makes GSettings find them in devenv. gsettings_schemas = ['fiv.gschema.xml'] foreach schema : gsettings_schemas - install_data(schema, - rename : [application_ns + schema], + configure_file( + input : schema, + output : application_ns + schema, + copy : true, + install: true, install_dir : get_option('datadir') / 'glib-2.0' / 'schemas') endforeach # For the purposes of development: make the program find its GSettings schemas. gnome.compile_schemas(depend_files : files(gsettings_schemas)) +gnome.post_install(glib_compile_schemas : true, gtk_update_icon_cache : true) -# Validate various files, if there are tools around to do it. -xmls = ['fiv.svg', 'fiv.manifest', 'resources/resources.gresource.xml'] + \ - gsettings_schemas -xmls += run_command(find_program('sed', required : false, disabler : true), - '-n', 's@.*>\([^<>]*[.]svg\)<.*@resources/\\1@p', +# Meson is broken on Windows and removes the backslashes, so this ends up empty. +symbolics = run_command(find_program('sed', required : false, disabler : true), + '-n', 's@.*>\\([^<>]*[.]svg\\)<.*@resources/\\1@p', configure_file( input : 'resources/resources.gresource.xml', output : 'resources.gresource.xml.stamp', copy : true, - ), capture : true, check : true).stdout().strip().split('\n') + ), capture : true, check : true).stdout().strip() + +# Validate various files, if there are tools around to do it. +xmls = ['fiv.svg', 'fiv.manifest', 'resources/resources.gresource.xml'] + \ + gsettings_schemas +if symbolics != '' + xmls += symbolics.split('\n') +endif xmlwf = find_program('xmlwf', required : false, disabler : true) xmllint = find_program('xmllint', required : false, disabler : true) @@ -217,9 +260,11 @@ if not win32 asciidoctor = find_program('asciidoctor', required : false) a2x = find_program('a2x', required : false) if not asciidoctor.found() and not a2x.found() - error('Neither asciidoctor nor a2x were found') + warning('Neither asciidoctor nor a2x were found, ' + + 'falling back to a substandard manual page generator') endif foreach page : [meson.project_name()] + man_capture = false if asciidoctor.found() command = [asciidoctor, '-b', 'manpage', '-a', 'release-version=' + meson.project_version(), @@ -228,10 +273,17 @@ if not win32 command = [a2x, '--doctype', 'manpage', '--format', 'manpage', '-a', 'release-version=' + meson.project_version(), '-D', '@OUTDIR@', '@INPUT@'] + else + command = ['env', 'LC_ALL=C', + 'asciidoc-release-version=' + meson.project_version(), + 'awk', '-f', files('submodules/liberty/tools/asciiman.awk'), + '@INPUT@'] + man_capture = true endif custom_target('manpage for ' + page, input : 'docs' / page + '.adoc', output : page + '.1', + capture : man_capture, command : command, install : true, install_dir : get_option('mandir') / 'man1') @@ -243,6 +295,32 @@ if not win32 install_dir : get_option('datadir') / 'applications') endforeach + # TODO(p): Consider moving this to /usr/share or /usr/lib. + install_data('fiv-reverse-search', + install_dir : get_option('bindir')) + + # As usual, handling generated files in Meson is a fucking pain. + updatable_desktops = [application_ns + 'fiv.desktop'] + foreach name, uri : { + 'Google' : 'https://lens.google.com/uploadbyurl?url=', + 'Bing' : 'https://www.bing.com/images/searchbyimage?cbir=sbi&imgurl=', + 'Yandex' : 'https://yandex.com/images/search?rpt=imageview&url=', + 'TinEye' : 'https://tineye.com/search?url=', + 'SauceNAO' : 'https://saucenao.com/search.php?url=', + 'IQDB' : 'https://iqdb.org/?url=', + } + desktop = 'fiv-reverse-search-' + name.to_lower() + '.desktop' + updatable_desktops += application_ns + desktop + + test(desktop, dfv, args : configure_file( + input : 'fiv-reverse-search.desktop.in', + output : application_ns + desktop, + configuration : {'NAME' : name, 'URL' : uri}, + install : true, + install_dir : get_option('datadir') / 'applications', + )) + endforeach + # With gdk-pixbuf, fiv.desktop depends on currently installed modules; # the package manager needs to be told to run this script as necessary. dynamic_desktops = gdkpixbuf.found() @@ -251,20 +329,52 @@ if not win32 input : 'fiv-update-desktop-files.in', output : 'fiv-update-desktop-files', configuration : { - 'EXE' : get_option('prefix') / get_option('bindir') / exe.name(), - 'DESKTOP' : get_option('prefix') / get_option('datadir') \ - / 'applications' / application_ns + 'fiv.desktop', + 'FIV' : get_option('prefix') / get_option('bindir') / exe.name(), + 'DESKTOPDIR' : get_option('prefix') / + get_option('datadir') / 'applications', + 'DESKTOPS' : ' \\\n\t'.join(updatable_desktops), }, install : dynamic_desktops, install_dir : get_option('bindir')) if not meson.is_cross_build() meson.add_install_script(updater, skip_if_destdir : dynamic_desktops) endif + + # Quick and dirty package generation, lacking dependencies. + packaging = configuration_data({ + 'name' : meson.project_name(), + 'version' : meson.project_version(), + 'summary' : 'Image viewer', + 'author' : 'Přemysl Eric Janouch', + }) + + subdir('submodules/liberty/meson/packaging') elif meson.is_cross_build() + # Note that even compiling /from within MSYS2/ can still be a cross-build. msys2_root = meson.get_external_property('msys2_root') - meson.add_install_script('msys2-cross-install.sh', msys2_root) + meson.add_install_script('msys2-install.sh', msys2_root) + + wxs = configure_file( + input : 'fiv.wxs.in', + output : 'fiv.wxs', + configuration : configuration_data({ + 'ProjectName' : meson.project_name(), + 'ProjectVersion' : meson.project_version(), + 'ProjectURL' : application_url, + }), + ) + custom_target('package', + output : 'fiv.msi', + command : [meson.current_source_dir() / 'msys2-package.sh', + host_machine.cpu(), 'fiv.msi', wxs], + env : ['MESON_BUILD_ROOT=' + meson.current_build_dir(), + 'MESON_SOURCE_ROOT=' + meson.current_source_dir()], + console : true, + build_always_stale : true, + build_by_default : false, + ) - # This is the minimum to run targets from msys2-cross-configure.sh builds. + # This is the minimum to run targets from msys2-configure.sh builds. meson.add_devenv({ 'WINEPATH' : msys2_root / 'bin', 'XDG_DATA_DIRS' : msys2_root / 'share', |