diff --git a/configure.ac b/configure.ac index cd504b3..7b28666 100644 --- a/configure.ac +++ b/configure.ac @@ -381,6 +381,7 @@ AC_CONFIG_FILES([Makefile tests/Makefile docs/libpsl/Makefile docs/libpsl/version.xml libpsl.pc:libpsl.pc.in + meson.build msvc/Makefile msvc/config.h.win32 msvc/config-msvc.mak]) diff --git a/meson.build b/meson.build index 773e6af..36a55bb 100644 --- a/meson.build +++ b/meson.build @@ -1,5 +1,5 @@ project('libpsl', 'c', - version : '0.20.2', + version : '0.21.0', meson_version : '>=0.47.0') cc = meson.get_compiler('c') diff --git a/meson.build.in b/meson.build.in new file mode 100644 index 0000000..622d2e9 --- /dev/null +++ b/meson.build.in @@ -0,0 +1,148 @@ +project('libpsl', 'c', + version : '@LIBPSL_VERSION_MAJOR@.@LIBPSL_VERSION_MINOR@.@LIBPSL_VERSION_PATCH@', + meson_version : '>=0.47.0') + +cc = meson.get_compiler('c') + +enable_runtime = get_option('runtime') +enable_builtin = get_option('builtin') + +# We need to know the build type to determine what .lib files we need on Visual Studio +# for dependencies that don't normally come with pkg-config files for Visual Studio builds +buildtype = get_option('buildtype') + +notfound = dependency('', required : false) +libidn2_dep = notfound +libicu_dep = notfound +libidn_dep = notfound +libunistring = notfound +networking_deps = notfound + +# FIXME: Cleanup this when Meson gets 'feature-combo': +# https://github.com/mesonbuild/meson/issues/4566 +# Dependency fallbacks would help too: +# https://github.com/mesonbuild/meson/pull/4595 +if ['libidn2', 'auto'].contains(enable_runtime) or ['libidn2', 'auto'].contains(enable_builtin) + libidn2_dep = dependency('libidn2', required : false) + if not libidn2_dep.found() and cc.has_header('idn2.h') + libidn2_dep = cc.find_library('idn2', required : false) + endif + if libidn2_dep.found() + if enable_runtime == 'auto' + enable_runtime = 'libidn2' + endif + if enable_builtin == 'auto' + enable_builtin = 'libidn2' + endif + elif [enable_runtime, enable_builtin].contains('libidn2') + error('You requested libidn2 but it is not installed.') + endif +endif + +if ['libicu', 'auto'].contains(enable_runtime) or ['libicu', 'auto'].contains(enable_builtin) + libicu_dep = dependency('icu-uc', required : false) + if not libicu_dep.found() and cc.has_header('unicode/ustring.h') + # MSVC: the debug configuration of ICU generated the libraries with d suffix + # we must handle this and search for the right library depending on the + # build type. Note debugoptimized is just a release build with .pdb files enabled + if cc.get_id() == 'msvc' and buildtype == 'debug' + libicu_dep = cc.find_library('icuucd', required : false) + else + libicu_dep = cc.find_library('icuuc', required : false) + endif + endif + if libicu_dep.found() + if enable_runtime == 'auto' + enable_runtime = 'libicu' + endif + if enable_builtin == 'auto' + enable_builtin = 'libicu' + endif + elif [enable_runtime, enable_builtin].contains('libicu') + error('You requested libicu but it is not installed.') + endif +endif + +if ['libidn', 'auto'].contains(enable_runtime) or ['libidn', 'auto'].contains(enable_builtin) + libidn_dep = dependency('libidn', required : false) + if not libidn_dep.found() and cc.has_header('idna.h') + libidn_dep = cc.find_library('idn', required : false) + endif + if libidn_dep.found() + if enable_runtime == 'auto' + enable_runtime = 'libidn' + endif + if enable_builtin == 'auto' + enable_builtin = 'libidn' + endif + elif [enable_runtime, enable_builtin].contains('libidn') + error('You requested libidn but it is not installed.') + endif +endif + +if libidn2_dep.found() or libidn_dep.found() + # Check for libunistring, we need it for psl_str_to_utf8lower() + libunistring = cc.find_library('unistring') +endif + +if host_machine.system() == 'windows' + networking_deps = cc.find_library('ws2_32') +endif + +if enable_runtime == 'auto' + enable_runtime = 'no' +endif +if enable_builtin == 'auto' + enable_builtin = 'no' +endif + +config = configuration_data() +config.set_quoted('PACKAGE_VERSION', meson.project_version()) +config.set('WITH_LIBIDN2', enable_runtime == 'libidn2') +config.set('WITH_LIBICU', enable_runtime == 'libicu') +config.set('WITH_LIBIDN', enable_runtime == 'libidn') +config.set('BUILTIN_GENERATOR_LIBIDN2', enable_builtin == 'libidn2') +config.set('BUILTIN_GENERATOR_LIBICU', enable_builtin == 'libicu') +config.set('BUILTIN_GENERATOR_LIBIDN', enable_builtin == 'libidn') +config.set('HAVE_UNISTD_H', cc.check_header('unistd.h')) +config.set('HAVE_STDINT_H', cc.check_header('stdint.h')) +config.set('HAVE_ALLOCA_H', cc.check_header('alloca.h')) +config.set('HAVE_ALLOCA', cc.has_function('alloca')) +config.set('HAVE_STRNDUP', cc.has_function('strndup')) +config.set('HAVE_CLOCK_GETTIME', cc.has_function('clock_gettime')) +config.set('HAVE_FMEMOPEN', cc.has_function('fmemopen')) +config.set('HAVE_NL_LANGINFO', cc.has_function('nl_langinfo')) +configure_file(output : 'config.h', configuration : config) + +configinc = include_directories('.') +includedir = include_directories('include') + +psl_distfile = get_option('psl_distfile') +psl_file = get_option('psl_file') +if psl_file == '' + psl_file = join_paths(meson.current_source_dir(), 'list', 'public_suffix_list.dat') +endif +psl_test_file = get_option('psl_testfile') +if psl_test_file == '' + psl_test_file = join_paths(meson.current_source_dir(), 'list', 'tests', 'tests.txt') +endif + +python = import('python').find_installation() +pkgconfig = import('pkgconfig') + +if cc.get_id() == 'msvc' + if not cc.has_header_symbol('stdio.h', 'snprintf') + if cc.has_header_symbol('stdio.h', '_snprintf') + add_project_arguments('-Dsnprintf=_snprintf', language: 'c') + endif + endif + if cc.has_header_symbol('malloc.h', '_alloca') + add_project_arguments('-Dalloca=_alloca', language: 'c') + endif +endif + +subdir('include') +subdir('src') +subdir('tools') +subdir('tests') +subdir('fuzz')