Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/on_PR_meson.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,7 @@ jobs:
cmake:p
curl:p
gtest:p
libiconv:p
libinih:p
meson:p
ninja:p
Expand Down
111 changes: 51 additions & 60 deletions meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ project(
'exiv2',
'cpp',
version: '1.0.0',
meson_version: '>=0.54.1',
default_options: ['warning_level=0', 'cpp_std=c++20'],
meson_version: '>=0.63.0',
default_options: 'cpp_std=c++20',
)

cpp = meson.get_compiler('cpp')
Expand Down Expand Up @@ -50,58 +50,43 @@ cdata.set('EXV_ENABLE_BMFF', get_option('bmff'))
cdata.set('EXV_HAVE_LENSDATA', get_option('lensdata'))
cdata.set('EXV_ENABLE_VIDEO', get_option('video'))

deps = []
net_dep = []
foreach d, os : {'procstat': 'freebsd', 'socket': 'sunos', 'ws2_32': 'windows'}
if host_machine.system() == os
deps += cpp.find_library(d)
net_dep += cpp.find_library(d)
break
endif
endforeach

fmt_dep = []
if not cdata.get('EXV_HAVE_STD_FORMAT')
fmt_dep = dependency('fmt', version: '>=5.0.0')
deps += fmt_dep
endif

brotli_dep = dependency('libbrotlidec', disabler: true, required: get_option('brotli'))
if brotli_dep.found()
deps += brotli_dep
endif
brotli_dep = dependency('libbrotlidec', required: get_option('brotli'))

if get_option('webready')
curl_dep = dependency('libcurl', required: get_option('curl'))
web_dep = declare_dependency(dependencies: [curl_dep])
deps += web_dep
else
web_dep = dependency('', disabler: true, required: false)
web_dep = dependency('', required: false)
curl_dep = web_dep
endif

expat_dep = dependency('expat', disabler: true, required: get_option('xmp'))
if expat_dep.found()
deps += expat_dep
endif

inih_dep = dependency('INIReader', disabler: true, required: get_option('inih'))
if inih_dep.found()
deps += inih_dep
endif

zlib_dep = dependency('zlib', disabler: true, required: get_option('png'))
if zlib_dep.found()
deps += zlib_dep
endif
expat_dep = dependency('expat', required: get_option('xmp'))
inih_dep = dependency('INIReader', required: get_option('inih'))
zlib_dep = dependency('zlib', required: get_option('png'))

if meson.version().version_compare('>= 0.60')
#hack for FreeBSD which includes external libiconv for libcurl
if curl_dep.found() and host_machine.system() == 'freebsd'
iconv_dep = cpp.find_library('iconv', dirs: '/usr/local/lib')
elif meson.version().version_compare('>= 0.60')
iconv_dep = dependency('iconv', required: get_option('iconv'))
elif not get_option('iconv').disabled() and not cpp.links('#include <iconv.h>\nint main(){iconv_open("", "");}')
iconv_dep = cpp.find_library('iconv', required: get_option('iconv'))
else
iconv_dep = get_option('iconv').disabled() ? dependency('', required: false) : declare_dependency()
endif
if iconv_dep.found()
deps += iconv_dep
endif

if meson.version().version_compare('>= 0.60')
intl_dep = dependency('intl', required: get_option('nls'))
Expand All @@ -110,7 +95,6 @@ else
endif
if intl_dep.found()
add_project_arguments('-DEXV_LOCALEDIR="@0@"'.format(get_option('prefix') / get_option('localedir')), language: 'cpp')
deps += intl_dep
endif

cdata.set('EXV_ENABLE_INIH', inih_dep.found())
Expand All @@ -130,6 +114,11 @@ cfile = configure_file(
configuration: cdata,
)

add_project_dependencies(
intl_dep,
language: 'cpp',
)

libinc = include_directories('.', 'include/exiv2')
depinc = include_directories('.', 'include')
subdir('xmpsdk')
Expand Down Expand Up @@ -167,42 +156,44 @@ endif

if get_option('app')
samples = {
'addmoddel': [],
'addmoddel': declare_dependency(),
'conntest': web_dep,
'convert-test': [],
'easyaccess-test': [],
'exifcomment': [],
'exifdata-test': [],
'exifdata': [],
'exifprint': [],
'exifvalue': [],
'convert-test': declare_dependency(),
'easyaccess-test': declare_dependency(),
'exifcomment': declare_dependency(),
'exifdata-test': declare_dependency(),
'exifdata': declare_dependency(),
'exifprint': declare_dependency(),
'exifvalue': declare_dependency(),
'geotag': expat_dep,
'ini-test': inih_dep,
'iotest': [],
'iptceasy': [],
'iptcprint': [],
'iptctest': [],
'jpegparsetest': [],
'key-test': [],
'largeiptc-test': [],
'mmap-test': [],
'mrwthumb': [],
'prevtest': [],
'remotetest': [],
'stringto-test': [],
'taglist': [],
'tiff-test': [],
'write-test': [],
'write2-test': [],
'xmpparse': [],
'xmpparser-test': [],
'xmpprint': [],
'xmpsample': [],
'xmpdump': [],
'iotest': declare_dependency(),
'iptceasy': declare_dependency(),
'iptcprint': declare_dependency(),
'iptctest': declare_dependency(),
'jpegparsetest': declare_dependency(),
'key-test': declare_dependency(),
'largeiptc-test': declare_dependency(),
'mmap-test': declare_dependency(),
'mrwthumb': declare_dependency(),
'prevtest': declare_dependency(),
'remotetest': declare_dependency(),
'stringto-test': declare_dependency(),
'taglist': declare_dependency(),
'tiff-test': declare_dependency(),
'write-test': declare_dependency(),
'write2-test': declare_dependency(),
'xmpparse': declare_dependency(),
'xmpparser-test': declare_dependency(),
'xmpprint': declare_dependency(),
'xmpsample': declare_dependency(),
'xmpdump': declare_dependency(),
}

foreach s, d : samples
executable(s, 'samples/@[email protected]'.format(s), dependencies: [exiv2_dep, d], include_directories: exiv2inc)
if d.found()
executable(s, 'samples/@[email protected]'.format(s), dependencies: [exiv2_dep, d], include_directories: exiv2inc)
endif
endforeach

gopt = [
Expand Down
26 changes: 7 additions & 19 deletions src/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ base_lib = files(
'basicio.cpp',
'bmffimage.cpp',
'bmpimage.cpp',
'convert.cpp',
'cr2image.cpp',
'crwimage.cpp',
'datasets.cpp',
Expand Down Expand Up @@ -74,28 +75,14 @@ exiv2int = static_library(
'exiv2int',
int_lib,
cpp_args: '-DEXIV2API=',
dependencies: deps,
dependencies: [fmt_dep, inih_dep, zlib_dep],
include_directories: libinc,
)

exiv2int_dep = declare_dependency(
include_directories: libinc,
link_with: exiv2int,
)

# This is compiled separately, because there are multiple sources for iconv
# (methods "builtin" and "system") and it's possible to have the include
# directory from one dependency leak over and force the system iconv to be used
# instead of the builtin one. This causes miscompilation.
convertlib = static_library(
'_convert',
'convert.cpp',
cpp_args: cargs,
gnu_symbol_visibility: 'hidden',
pic: true,
dependencies: [fmt_dep, iconv_dep],
include_directories: libinc,
build_by_default: false,
dependencies: [fmt_dep, inih_dep, zlib_dep],
)

exiv2 = library(
Expand All @@ -106,8 +93,7 @@ exiv2 = library(
version: meson.project_version(),
soversion: sover,
gnu_symbol_visibility: 'hidden',
link_with: convertlib,
dependencies: [deps, exiv2int_dep],
dependencies: [exiv2int_dep, brotli_dep, curl_dep, expat_dep, iconv_dep, net_dep],
install: true,
)

Expand All @@ -126,7 +112,9 @@ pkg.generate(

exiv2_dep = declare_dependency(
compile_args: dllapi,
dependencies: intl_dep,
dependencies: [fmt_dep],
include_directories: depinc,
link_with: exiv2,
)

meson.override_dependency('exiv2', exiv2_dep)
2 changes: 1 addition & 1 deletion unitTests/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ unit_tests = executable(
'unit_tests',
test_sources,
cpp_args: t_args,
dependencies: [deps, exiv2_dep, gtest_dep],
dependencies: [exiv2_dep, gtest_dep],
include_directories: exiv2inc,
)

Expand Down