From b19c30909640841e39a764c83afab4a688fe4a52 Mon Sep 17 00:00:00 2001 From: Niels De Graef Date: Tue, 20 Mar 2018 22:03:56 +0100 Subject: [PATCH] Add build support for Meson To build with meson, use the following commands: ``` $ meson build $ ninja -C build # in case you want to install $ ninja -C build install ``` --- docs/man/meson.build | 18 +++ docs/meson.build | 4 + docs/reference/libsecret/meson.build | 39 ++++++ egg/egg-secure-memory.h | 1 + egg/meson.build | 24 ++++ libsecret/.dirstamp | 0 libsecret/meson.build | 189 +++++++++++++++++++++++++++ meson.build | 85 ++++++++++++ meson_options.txt | 5 + po/meson.build | 3 + tool/meson.build | 11 ++ 11 files changed, 379 insertions(+) create mode 100644 docs/man/meson.build create mode 100644 docs/meson.build create mode 100644 docs/reference/libsecret/meson.build create mode 100644 egg/meson.build create mode 100644 libsecret/.dirstamp create mode 100644 libsecret/meson.build create mode 100644 meson.build create mode 100644 meson_options.txt create mode 100644 po/meson.build create mode 100644 tool/meson.build diff --git a/docs/man/meson.build b/docs/man/meson.build new file mode 100644 index 0000000..37cabc4 --- /dev/null +++ b/docs/man/meson.build @@ -0,0 +1,18 @@ +secret_tool_man = custom_target('secret-tool.1', + input: 'secret-tool.xml', + output: 'secret-tool.1', + command: [ find_program('xsltproc'), + '-o', '@OUTPUT@', + '--nonet', + '--stringparam', 'man.output.quietly', '1', + '--stringparam', 'man.funcsynopsis.style', 'ansi', + '--stringparam', 'man.th.extra1.suppress', '1', + '--stringparam', 'man.authors.section.enabled', '0', + '--stringparam', 'man.copyright.section.enabled', '0', + 'http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl', + '@INPUT@', + ], + build_by_default: true, + install: true, + install_dir: join_paths(libsecret_prefix, get_option('mandir'), 'man1'), +) diff --git a/docs/meson.build b/docs/meson.build new file mode 100644 index 0000000..cc8d964 --- /dev/null +++ b/docs/meson.build @@ -0,0 +1,4 @@ +subdir('man') +if with_gtkdoc + subdir('reference/libsecret') +endif diff --git a/docs/reference/libsecret/meson.build b/docs/reference/libsecret/meson.build new file mode 100644 index 0000000..81add38 --- /dev/null +++ b/docs/reference/libsecret/meson.build @@ -0,0 +1,39 @@ +reference_content_files = [ + 'libsecret-examples.sgml', + 'libsecret-using.sgml', + 'migrating-libgnome-keyring.xml', +] + +# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded +reference_expanded_content_files = [ + 'migrating-libgnome-keyring.xml', +] + +reference_ignore_headers = [ + 'mock-service.h', + 'secret-dbus-generated.h', + 'secret-private.h', +] + +version_conf = configuration_data() +version_conf.set('VERSION', meson.project_version()) +configure_file( + input: 'version.xml.in', + output: 'version.xml', + configuration: version_conf, +) + +gnome.gtkdoc('libsecret', + main_sgml: 'libsecret-docs.sgml', + content_files: reference_content_files, + src_dir: include_directories('../../../libsecret'), + dependencies: libsecret_dep, + gobject_typesfile: 'libsecret.types', + mkdb_args: '--expand-content-files=' + ' '.join(reference_expanded_content_files), + scan_args: [ + '--deprecated-guards=SECRET_DISABLE_DEPRECATED', + '--rebuild-types', + '--ignore-headers=' + ' '.join(reference_ignore_headers), + ], + module_version: api_version_major, +) diff --git a/egg/egg-secure-memory.h b/egg/egg-secure-memory.h index 008c82d..660bc6f 100644 --- a/egg/egg-secure-memory.h +++ b/egg/egg-secure-memory.h @@ -23,6 +23,7 @@ #ifndef EGG_SECURE_MEMORY_H #define EGG_SECURE_MEMORY_H +#include #include /* ------------------------------------------------------------------- diff --git a/egg/meson.build b/egg/meson.build new file mode 100644 index 0000000..11eeb75 --- /dev/null +++ b/egg/meson.build @@ -0,0 +1,24 @@ +libegg_sources = [ + 'egg-hex.c', + 'egg-secure-memory.c', + 'egg-testing.c', +] + +if with_gcrypt + libegg_sources += [ + 'egg-dh.c', + 'egg-hkdf.c', + 'egg-libgcrypt.c', + ] +endif + +libegg_deps = [ + glib_deps, + gcrypt_dep, +] + +libegg = static_library('egg', + libegg_sources, + dependencies: libegg_deps, + include_directories: config_h_dir, +) diff --git a/libsecret/.dirstamp b/libsecret/.dirstamp new file mode 100644 index 0000000..e69de29 diff --git a/libsecret/meson.build b/libsecret/meson.build new file mode 100644 index 0000000..5cc2456 --- /dev/null +++ b/libsecret/meson.build @@ -0,0 +1,189 @@ +installed_headers_subdir = join_paths('libsecret-@0@'.format(api_version_major), 'libsecret') + +libsecret_sources = [ + 'secret-attributes.c', + 'secret-collection.c', + 'secret-item.c', + 'secret-methods.c', + 'secret-password.c', + 'secret-prompt.c', + 'secret-schema.c', + 'secret-schemas.c', + 'secret-service.c', + 'secret-value.c', + 'secret-paths.c', + 'secret-session.c', + 'secret-util.c', +] + +libsecret_headers = [ + 'secret.h', + 'secret-attributes.h', + 'secret-collection.h', + 'secret-item.h', + 'secret-password.h', + 'secret-paths.h', + 'secret-prompt.h', + 'secret-schema.h', + 'secret-schemas.h', + 'secret-service.h', + 'secret-types.h', + 'secret-value.h', +] + +_dbus_generated = gnome.gdbus_codegen('secret-dbus-generated', + sources: 'org.freedesktop.Secrets.xml', + interface_prefix: 'org.freedesktop.Secret.', + namespace: '_SecretGen', +) + +_enums_generated = gnome.mkenums('secret-enum-types', + sources: libsecret_headers, + c_template: 'secret-enum-types.c.template', + h_template: 'secret-enum-types.h.template', + install_header: true, + install_dir: join_paths(includedir, installed_headers_subdir), +) + +libsecret_dependencies = [ + glib_deps, +] + +if with_gcrypt + libsecret_dependencies += gcrypt_dep +endif + +libsecret_cflags = [ + '-DSECRET_COMPILATION', +] + +libsecret = shared_library('secret-@0@'.format(api_version_major), + [ libsecret_sources, _dbus_generated, _enums_generated ], + version: libtool_version, + dependencies: libsecret_dependencies, + link_with: libegg, + c_args: libsecret_cflags, + include_directories: config_h_dir, + install: true, +) + +install_headers(libsecret_headers, + subdir: installed_headers_subdir, +) + +libsecret_dep = declare_dependency( + link_with: [ libsecret, libegg ], + dependencies: libsecret_dependencies, +) + +# GObject Introspection +libsecret_gir_sources = [ + 'secret-attributes.c', + 'secret-attributes.h', + 'secret-collection.c', + 'secret-collection.h', + 'secret-item.c', + 'secret-item.h', + 'secret-methods.c', + 'secret-password.c', + 'secret-password.h', + 'secret-paths.c', + 'secret-paths.h', + 'secret-prompt.c', + 'secret-prompt.h', + 'secret-schema.c', + 'secret-schema.h', + 'secret-schemas.c', + 'secret-schemas.h', + 'secret-service.c', + 'secret-service.h', + 'secret-types.h', + 'secret-value.c', + 'secret-value.h', +] + +libsecret_gir = gnome.generate_gir(libsecret, + sources: libsecret_gir_sources, + namespace: 'Secret', + nsversion: api_version_major, + export_packages: 'libsecret-@0@'.format(api_version_major), + includes: [ 'GObject-2.0', 'Gio-2.0' ], + extra_args: [ '-D SECRET_COMPILATION'], + install: true, +) + +# Vapi +if with_vapi + libsecret_vapi = gnome.generate_vapi('libsecret-@0@'.format(api_version_major), + sources: libsecret_gir[0], + metadata_dirs: join_paths(meson.source_root(), 'libsecret'), + packages: [ 'gobject-2.0', 'gio-2.0' ], + install: true, + ) +endif + +# pkg-config +pc_conf = configuration_data() +pc_conf.set('prefix', libsecret_prefix) +pc_conf.set('exec_prefix', '${prefix}') +pc_conf.set('libdir', join_paths('${prefix}', get_option('libdir'))) +pc_conf.set('includedir', join_paths('${prefix}', get_option('includedir'))) +pc_conf.set('datarootdir', join_paths('${prefix}', get_option('datadir'))) +pc_conf.set('datadir', '${datarootdir}') +pc_conf.set('sysconfdir', join_paths('${prefix}', get_option('sysconfdir'))) +pc_conf.set('SECRET_MAJOR', api_version_major) +pc_conf.set('VERSION', meson.project_version()) + +configure_file( + input: 'libsecret.pc.in', + output: 'libsecret-@0@.pc'.format(api_version_major), + configuration: pc_conf, + install: true, + install_dir: join_paths(libdir, 'pkgconfig'), +) +configure_file( + input: 'libsecret-unstable.pc.in', + output: 'libsecret-unstable.pc', + configuration: pc_conf, + install: true, + install_dir: join_paths(libdir, 'pkgconfig'), +) + +# Tests +mock_cflags = [ + libsecret_cflags, + '-DSRCDIR="@0@"'.format(meson.source_root()), +] + +mock_service_lib = static_library('mock-service', + 'mock-service.c', + dependencies: glib_deps, + c_args: mock_cflags, + include_directories: config_h_dir, +) + +test_names = [ + 'test-attributes', + 'test-value', + 'test-prompt', + 'test-service', + 'test-session', + 'test-paths', + 'test-methods', + 'test-password', + 'test-item', + 'test-collection', +] + +foreach _test : test_names + + test_bin = executable(_test, + '@0@.c'.format(_test), + dependencies: libsecret_dep, + link_with: mock_service_lib, + include_directories: config_h_dir, + c_args: libsecret_cflags, + ) + + test(_test, test_bin) +endforeach diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..3c97f81 --- /dev/null +++ b/meson.build @@ -0,0 +1,85 @@ +project('libsecret', 'c', + version: '0.18.7', + license: 'GPL2+', + meson_version: '>= 0.48', +) + +gnome = import('gnome') +i18n = import('i18n') + +# API version +api_version = '1.0.0' +api_version_major = api_version.split('.')[0] +api_version_minor = api_version.split('.')[1] +api_version_micro = api_version.split('.')[2] + +libtool_version = '0.0.0' + +# Options +with_manpage = get_option('manpage') +with_gcrypt = get_option('gcrypt') +enable_debug = get_option('debugging') +with_vapi = get_option('vapi') +with_gtkdoc = get_option('gtk_doc') + +# Some variables +config_h_dir = include_directories('.') +libsecret_prefix = get_option('prefix') +datadir = join_paths(libsecret_prefix, get_option('datadir')) +includedir = join_paths(libsecret_prefix, get_option('includedir')) +bindir = join_paths(libsecret_prefix, get_option('bindir')) +libdir = join_paths(libsecret_prefix, get_option('libdir')) +libexecdir = join_paths(libsecret_prefix, get_option('libexecdir')) +locale_dir = join_paths(libsecret_prefix, get_option('localedir')) +pkgdatadir = join_paths(datadir, meson.project_name()) +pkglibdir = join_paths(libdir, meson.project_name()) +sysconfdir = join_paths(libsecret_prefix, get_option('sysconfdir')) +po_dir = join_paths(meson.source_root(), 'po') + +# Dependencies +min_glib_version = '2.44' +glib_deps = [ + dependency('glib-2.0', version: '>=' + min_glib_version), + dependency('gio-2.0', version: '>=' + min_glib_version), + dependency('gio-unix-2.0', version: '>=' + min_glib_version), +] +if with_gcrypt + min_libgcrypt_version = '1.2.2' + libgcrypt_config = find_program('libgcrypt-config') + libgcrypt_version = run_command(libgcrypt_config, '--version').stdout().strip() + if (libgcrypt_version.version_compare('>' + libgcrypt_version)) + error('@0@ requires at least gcrypt version @1@, but version found is @2@' + .format(meson.project_name(), min_libgcrypt_version, libgcrypt_version)) + endif + message('gcrypt version: @0@'.format(libgcrypt_version)) + gcrypt_dep = declare_dependency( + link_args: run_command(libgcrypt_config, '--libs').stdout().strip().split(), + compile_args: run_command(libgcrypt_config, '--cflags').stdout().strip().split(), + ) +endif + +# Libraries +math = meson.get_compiler('c').find_library('m') + +# Configuration +conf = configuration_data() +conf.set_quoted('GETTEXT_PACKAGE', meson.project_name()) +conf.set_quoted('G_LOG_DOMAIN', meson.project_name()) +conf.set_quoted('LOCALEDIR', locale_dir) +conf.set_quoted('PACKAGE_NAME', meson.project_name()) +conf.set_quoted('PACKAGE_STRING', meson.project_name()) +conf.set_quoted('PACKAGE_VERSION', meson.project_version()) +conf.set('WITH_GCRYPT', with_gcrypt) +if with_gcrypt + conf.set_quoted('LIBGCRYPT_VERSION', min_libgcrypt_version) +endif +conf.set('WITH_DEBUG', enable_debug) +conf.set('_DEBUG', enable_debug) +configure_file(output: 'config.h', configuration: conf) + +# Subfolders +subdir('po') +subdir('egg') +subdir('libsecret') +subdir('tool') +subdir('docs') diff --git a/meson_options.txt b/meson_options.txt new file mode 100644 index 0000000..c1fda5d --- /dev/null +++ b/meson_options.txt @@ -0,0 +1,5 @@ +option('manpage', type: 'boolean', value: true, description: 'Build man pages') +option('gcrypt', type: 'boolean', value: true, description: 'With gcrypt and transport encryption') +option('debugging', type: 'boolean', value: false, description: 'Turn debugging on/off') +option('vapi', type: 'boolean', value: true, description: 'Create VAPI file.') +option('gtk_doc', type: 'boolean', value: true, description: 'Build reference documentation using gtk-doc') diff --git a/po/meson.build b/po/meson.build new file mode 100644 index 0000000..f904cde --- /dev/null +++ b/po/meson.build @@ -0,0 +1,3 @@ +i18n.gettext(meson.project_name(), + preset: 'glib' +) diff --git a/tool/meson.build b/tool/meson.build new file mode 100644 index 0000000..686cf24 --- /dev/null +++ b/tool/meson.build @@ -0,0 +1,11 @@ +secret_tool_sources = [ + 'secret-tool.c', +] + +secret_tool = executable('secret-tool', + secret_tool_sources, + dependencies: libsecret_dep, + include_directories: config_h_dir, + c_args: libsecret_cflags, + install: true, +)