commit 6bf244292bad88792375e0e630150870a22c2d41
parent 6115b134556a32febfc577334814a3d611a8bd6b
Author: Martin Schanzenbach <schanzen@gnunet.org>
Date: Thu, 23 Apr 2026 10:39:22 +0200
build: Migrate to meson
Diffstat:
| M | .gitignore | | | 2 | -- |
| D | Makefile.am | | | 6 | ------ |
| A | Makefile.in | | | 49 | +++++++++++++++++++++++++++++++++++++++++++++++++ |
| M | bootstrap | | | 6 | +++--- |
| A | configure | | | 255 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| D | contrib/Makefile.am | | | 70 | ---------------------------------------------------------------------- |
| A | contrib/meson.build | | | 65 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| D | doc/Makefile.am | | | 12 | ------------ |
| A | doc/meson.build | | | 10 | ++++++++++ |
| A | flake.lock | | | 822 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | flake.nix | | | 123 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | meson.build | | | 292 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | meson.options | | | 5 | +++++ |
| D | src/Makefile.am | | | 59 | ----------------------------------------------------------- |
| A | src/meson.build | | | 61 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
15 files changed, 1685 insertions(+), 152 deletions(-)
diff --git a/.gitignore b/.gitignore
@@ -1,5 +1,4 @@
Makefile
-Makefile.in
aclocal.m4
autom4te.cache/
autoscan.log
@@ -9,7 +8,6 @@ config.h.in
config.h.in~
config.log
config.status
-configure
configure.ac~
depcomp
install-sh
diff --git a/Makefile.am b/Makefile.am
@@ -1,6 +0,0 @@
-SUBDIRS = contrib src doc .
-
-EXTRA_DIST = \
- AUTHORS
-
-ACLOCAL_AMFLAGS = -I m4
diff --git a/Makefile.in b/Makefile.in
@@ -0,0 +1,49 @@
+# Build the program in the local tree
+.PHONY: all
+all:
+ $(NINJA) -C $(mesonbuilddir)
+
+# Install the program
+.PHONY: install
+install: all
+ $(MESON) install -C $(mesonbuilddir)
+
+# Remove files created during 'all'
+.PHONY: clean
+clean:
+ $(NINJA) -C $(mesonbuilddir) -t clean
+
+# Remove files created during 'install'
+.PHONY: uninstall
+uninstall:
+ $(NINJA) uninstall -C $(mesonbuilddir)
+
+# Make tarball
+.PHONY: dist
+dist:
+ $(MESON) dist -C $(mesonbuilddir) --no-tests --formats gztar
+
+# Make doxygen
+.PHONY: doxygen
+doxygen:
+ $(NINJA) -C $(mesonbuilddir) doxygen
+
+# Run tests
+.PHONY: check
+check:
+ $(MESON) test -C $(mesonbuilddir)
+
+.PHONY: installcheck
+installcheck:
+ $(MESON) test -C $(mesonbuilddir) --suite=installcheck
+
+.PHONY: integrationtests
+integrationtests:
+ $(MESON) test -C $(mesonbuilddir) --suite=integrationtests
+
+format:
+ $(MESON) fmt -i -r .
+ #find ./src -name "*.[h,c]" | uncrustify -l c -c contrib/conf/uncrustify.cfg -F - --replace --no-backup
+
+Makefile: Makefile.in
+ ./config.status
diff --git a/bootstrap b/bootstrap
@@ -5,7 +5,9 @@ if ! git --version >/dev/null; then
exit 1
fi
-git submodule update --init
+if [ -d ".git" ]; then
+ git submodule update --init
+fi
# This is more portable than `which' but comes with
# the caveat of not(?) properly working on busybox's ash:
@@ -24,5 +26,3 @@ if existence uncrustify; then
else
echo "Uncrustify not detected, hook not installed. Please install uncrustify if you plan on doing development"
fi
-
-autoreconf -fi
diff --git a/configure b/configure
@@ -0,0 +1,255 @@
+#!/bin/sh
+
+pkg_name="taler-mdb"
+pkg_default_features=""
+pkg_optional_features="coverage logging only-doc install-rpath"
+pkg_optional_dependencies=""
+
+# DO NOT EDIT BELOW THIS LINE
+standard_dirs="prefix exec_prefix bindir sbindir libexecdir sysconfdir sharedstatedir localstatedir runstatedir libdir includedir oldincludedir datarootdir datadir infodir localedir mandir docdir htmldir dvidir pdfdir psdir srcdir mesonbuilddir"
+standard_utils="AR AS BISON CC CXX CPP FLEX INSTALL LD LDCONFIG LEX MAKE MAKEINFO RANLIB TEXI2DVI YACC CHGRP CHMOD CHOWN MKNOD RM NINJA MESON"
+standard_flags="ARFLAGS BISONFLAGS CFLAGS CXXFLAGS CPPFLAGS FLEXFLAGS INSTALLFLAGS LDFLAGS LDCONFIGFLAGS LFLAGS MAKEFLAGS MAKEINFOFLAGS RANLIBFLAGS TEXI2DVIFLAGS YACCFLAGS CHGRPFLAGS CHMODFLAGS CHOWNFLAGS MKNODFLAGS"
+standard_vars="INSTALL_DATA INSTALL_PROGRAM INSTALL_SCRIPT"
+generated_comment="# This file was generated by configure. DO NOT edit it directly."
+
+# Save arguments
+cat > config.status <<EOF
+#!/bin/sh
+$generated_comment
+$0 $*
+EOF
+chmod 755 config.status
+
+# Parse arguments
+oldifs="$IFS"
+while [ "$#" -gt "0" ]; do
+ arg="$1"
+ shift
+ argsave="$@"
+
+ IFS="="
+ set -- $arg
+ IFS="$oldifs"
+ arg="$1"
+ shift
+ argparam="$@"
+
+ case "$arg" in
+ --help|-h)
+ cat <<-EOF
+ Usage: $0 [options...]
+ General options:
+
+ <variable>=<value> Overrides default utils and flags, e.g. CC=gcc
+ EOF
+ echo ""
+ echo "Directory variables:"
+ for sdir in $standard_dirs; do
+ echo "--$sdir=<directory>"
+ done
+ echo ""
+ echo "Options specific to $pkg_name:"
+ for feat in $pkg_optional_features; do
+ echo "--enable-$feat[=arg]"
+ done
+ for feat in $pkg_default_features; do
+ echo "--disable-$feat"
+ done
+ for dep in $pkg_optional_dependencies; do
+ echo "--with-$dep"
+ done
+
+ echo
+ echo Other options will be ignored. Please see the README for additional information.
+ exit 0
+ ;;
+ --enable-*)
+ for feat in $pkg_optional_features $pkg_default_features; do
+ ft=$(echo $feat | tr - _)
+ if [ "--enable-$feat" = "$arg" ] && [ -z "$argparam" ]; then
+ eval "enable_$ft=true"
+ elif [ "--enable-$feat" = "$arg" ]; then
+ if [ "$argparam" = "yes" ]; then
+ eval "enable_$ft=\"true\""
+ else
+ eval "enable_$ft=\"$argparam\""
+ fi
+ fi
+ done
+ ;;
+ --disable-*)
+ argsave="--enable-${arg#--disable-}=false $argsave"
+ ;;
+ --with-*)
+ for dep in $pkg_optional_dependencies; do
+ if [ "--with-$dep" = "$arg" ] && [ -z "$argparam" ]; then
+ eval "with_$dep=yes"
+ elif [ "--with-$dep" = "$arg" ]; then
+ eval "with_$dep=\"$argparam\""
+ fi
+ done
+ ;;
+ --without-*)
+ argsave="--with-${arg#--without-}=no $argsave"
+ ;;
+ --*)
+ for dir in $standard_dirs; do
+ [ "--$dir" = "$arg" ] && eval "var_$dir=\"$argparam\""
+ done
+ ;;
+ *)
+ for flag in $standard_utils $standard_flags standard_vars; do
+ [ "$flag" = "$arg" ] && eval "$flag=\"$argparam\""
+ done
+ ;;
+ esac
+
+ set -- $argsave
+done
+
+# Set default values
+for util in $standard_utils; do
+ case "$util" in
+ CPP) eval "$util=\"\${${util}:-\\\$(CC) -E}\"" ;;
+ CXX) eval "$util=\"\${${util}:-g++}\"" ;;
+ RM) eval "$util=\"\${${util}:-rm -f}\"" ;;
+ MESON) eval "$util=\"\${${util}:-meson}\"" ;;
+ NINJA) eval "$util=\"\${${util}:-ninja}\"" ;;
+ *) eval "$util=\"\${${util}:-${util}}\"" ;;
+ esac
+done
+for feat in $pkg_optional_features; do
+ ft=$(echo $feat | tr - _)
+ eval "enable_$ft=\${enable_$ft:-false}"
+done
+for feat in $pkg_default_features; do
+ eval "enable_$feat=\${enable_$feat:-true}"
+done
+for feat in $pkg_optional_dependencies; do
+ eval "with_$feat=\${with_$feat:-no}"
+done
+
+# Find source files
+if [ -z "$var_srcdir" ]; then
+ [ -f ../Makefile.in ] && var_srcdir=..
+ [ -f ./Makefile.in ] && var_srcdir=.
+fi
+if [ -z "$var_srcdir" ]; then
+ echo "Source files not found. Please specify a directory using --srcdir=..." >&2
+ exit 1
+fi
+
+# Write Makefile
+cat > Makefile <<EOF
+$generated_comment
+SHELL = /bin/sh
+VPATH = ${var_srcdir}
+
+mesonbuilddir = ${var_mesonbuilddir:-build}
+srcdir = ${var_srcdir}
+prefix = ${var_prefix:-/usr/local}
+exec_prefix = ${var_exec_prefix:-\$(prefix)}
+bindir = ${var_bindir:-\$(exec_prefix)/bin}
+sbindir = ${var_sbindir:-\$(exec_prefix)/sbin}
+libexecdir = ${var_libexecdir:-\$(exec_prefix)/libexec}
+datarootdir = ${var_datarootdir:-\$(prefix)/share}
+datadir = ${var_datadir:-\$(datarootdir)}
+sysconfdir = ${var_sysconfdir:-\$(prefix)/etc}
+sharedstatedir = ${var_sharedstatedir:-\$(prefix)/com}
+localstatedir = ${var_localstatedir:-\$(prefix)/var}
+runstatedir = ${var_runstatedir:-\$(localstatedir)/run}
+includedir = ${var_includedir:-\$(prefix)/include}
+oldincludedir = ${var_oldincludedir:-/usr/include}
+docdir = ${var_docdir:-\$(datarootdir)/doc/"$pkg_name"}
+infodir = ${var_infodir:-\$(datarootdir)/info}
+htmldir = ${var_htmldir:-\$(docdir)}
+dvidir = ${var_dvidir:-\$(docdir)}
+pdfdir = ${var_pdfdir:-\$(docdir)}
+psdir = ${var_psdir:-\$(docdir)}
+libdir = ${var_libdir:-\$(exec_prefix)/lib}
+lispdir = ${var_lispdir:-\$(datarootdir)/emacs/site-lisp}
+localedir = ${var_localedir:-\$(datarootdir)/locale}
+mandir = ${var_mandir:-\$(datarootdir)/man}
+manext = .1
+EOF
+
+if [ -d ${var_mesonbuilddir:-build} ]; then
+ echo "${var_mesonbuilddir:-build} already exists, deleting with"
+ $RM -r ${var_mesonbuilddir:-build} || exit 1
+fi
+
+for var in $standard_utils $standard_flags $standard_vars; do
+ eval "echo \"${var} = \$${var}\" >> Makefile"
+done
+echo >> Makefile
+
+mesonfeatopts=""
+for feat in $pkg_optional_features $pkg_default_features; do
+ ft=$(echo $feat | tr - _)
+ eval "echo \"enable_$ft=\${enable_$ft}\" >> Makefile"
+ if [ "coverage" = $feat ]; then
+ mfeat="b_$feat"
+ else
+ mfeat=$feat
+ fi
+ eval "mesonfeatopts=\"$mesonfeatopts -D$mfeat=\${enable_$ft}\""
+done
+for dep in $pkg_optional_dependencies; do
+ eval "echo \"with_$dep=\${with_$dep}\" >> Makefile"
+done
+echo >> Makefile
+
+cat "${var_srcdir}/Makefile.in" >> Makefile
+
+# Create default targets, if not already present
+default_target() {
+ grep "^$1:" Makefile >/dev/null && return
+ echo ".PHONY: $1" >> Makefile
+ echo "$1: $2" >> Makefile
+ cat >> Makefile
+ echo >> Makefile
+}
+
+#default_target Makefile <<EOF
+# ./config.status
+#EOF
+for format in html dvi pdf ps; do
+ default_target "$format" </dev/null
+ default_target "install-$format" "$format" </dev/null
+done
+default_target check </dev/null
+default_target mostlyclean clean </dev/null
+default_target distclean clean <<EOF
+ \$(RM) Makefile config.status
+EOF
+default_target maintainer-clean distclean </dev/null
+default_target install-strip <<EOF
+ \$(MAKE) INSTALL_PROGRAM='\$(INSTALL_PROGRAM) -s' \\
+ INSTALL_SCRIPT='\$(INSTALL_SCRIPT)' install
+EOF
+
+mesondiropts=""
+for dr in $standard_dirs; do
+ if [ $dr = "srcdir" ]; then
+ continue
+ fi
+ if [ $dr = "mesonbuilddir" ]; then
+ continue
+ fi
+ eval "vn=\${var_$dr}"
+ if [ ! -z $vn ]; then
+ eval "mesondiropts=\"$mesondiropts -D$dr=\${var_$dr}\""
+ fi
+done
+
+${MESON} setup \
+ -Ddefault_library=shared \
+ $mesondiropts \
+ $mesonfeatopts \
+ ${var_mesonbuilddir:-build} \
+ ${var_srcdir} || exit 1
+
+# Done
+echo "Package $pkg_name configured successfully."
+echo "Run 'make' to build and 'make install' to install the package"
+
diff --git a/contrib/Makefile.am b/contrib/Makefile.am
@@ -1,70 +0,0 @@
-SUBDIRS = .
-
-imgdir=$(datadir)/taler/mdb
-img_DATA = \
- err/png/backend-auth-failure.png \
- err/png/backend-dns-resolution-failure.png \
- err/png/backend-no-webserver.png \
- err/png/backend-temporary-failure.png \
- err/png/backend-unexpected-failure.png \
- err/png/backend-unreachable.png \
- err/png/backend-x509-cert-bad.png \
- err/png/child-died.png \
- err/png/dispensing.png \
- err/png/err-num-read-fail.png \
- err/png/err-sold-out.png \
- err/png/internal-failure.png \
- err/png/maintenance.png \
- err/png/no-ip.png \
- err/png/unknown-product.png
-
-adsdir=$(datadir)/taler/ads
-ads_DATA = \
- ads/png/add-without-plus-8s.png \
- ads/png/chocolate-5s.png \
- ads/png/debug-my-code-7s.png \
- ads/png/dep-tree-10s.png \
- ads/png/dont-touch-it-10s.png \
- ads/png/error-handling-5s.png \
- ads/png/just-keep-coding-4s.png \
- ads/png/kitkat-7s.png \
- ads/png/lockpick-9s.png \
- ads/png/lockpick-physical-sec-9s.png \
- ads/png/lua-rules-4s.png \
- ads/png/not-even-the-bread-4s.png \
- ads/png/notsnack-7s.png \
- ads/png/paravirt-8s.png \
- ads/png/success-unreachable-7s.png \
- ads/png/swissknife-10s.png \
- ads/png/taler1-5s.png \
- ads/png/taler2-7s.png \
- ads/png/taler-machine-whats-inside-7s.png \
- ads/png/taler-post-blockchain-18s.png \
- ads/png/taler-principles-1-3s.png \
- ads/png/taler-principles-2-4s.png \
- ads/png/taler-principles-3-3s.png \
- ads/png/taler-principles-4-3s.png \
- ads/png/taler-principles-5-4s.png \
- ads/png/taler-principles-6-3s.png \
- ads/png/taler-principles-7-3s.png \
- ads/png/taler-principles-8-3s.png \
- ads/png/taler-principles-9-3s.png \
- ads/png/taler-rms-5s.png \
- ads/png/taler-wallet-eCHF-french-10s.png \
- ads/png/taler-wallet-eCHF-german-10s.png \
- ads/png/taler-wallet-question-15s.png
-
-
-
-bin_SCRIPTS = \
- taler-mdb-ads.sh \
- taler-mdb-show.sh \
- taler-mdb-network-check.sh
-
-EXTRA_DIST = \
- $(bin_SCRIPTS) \
- $(img_DATA) \
- $(ads_DATA) \
- bump \
- uncrustify.cfg \
- uncrustify_precommit
diff --git a/contrib/meson.build b/contrib/meson.build
@@ -0,0 +1,65 @@
+install_data(
+ 'err' / 'png' / 'backend-auth-failure.png',
+ 'err' / 'png' / 'backend-dns-resolution-failure.png',
+ 'err' / 'png' / 'backend-no-webserver.png',
+ 'err' / 'png' / 'backend-temporary-failure.png',
+ 'err' / 'png' / 'backend-unexpected-failure.png',
+ 'err' / 'png' / 'backend-unreachable.png',
+ 'err' / 'png' / 'backend-x509-cert-bad.png',
+ 'err' / 'png' / 'child-died.png',
+ 'err' / 'png' / 'dispensing.png',
+ 'err' / 'png' / 'err-num-read-fail.png',
+ 'err' / 'png' / 'err-sold-out.png',
+ 'err' / 'png' / 'internal-failure.png',
+ 'err' / 'png' / 'maintenance.png',
+ 'err' / 'png' / 'no-ip.png',
+ 'err' / 'png' / 'unknown-product.png',
+ install_dir: get_option('datadir') / 'taler' / 'mdb',
+)
+
+install_data(
+ 'ads' / 'png' / 'add-without-plus-8s.png',
+ 'ads' / 'png' / 'chocolate-5s.png',
+ 'ads' / 'png' / 'debug-my-code-7s.png',
+ 'ads' / 'png' / 'dep-tree-10s.png',
+ 'ads' / 'png' / 'dont-touch-it-10s.png',
+ 'ads' / 'png' / 'error-handling-5s.png',
+ 'ads' / 'png' / 'just-keep-coding-4s.png',
+ 'ads' / 'png' / 'kitkat-7s.png',
+ 'ads' / 'png' / 'lockpick-9s.png',
+ 'ads' / 'png' / 'lockpick-physical-sec-9s.png',
+ 'ads' / 'png' / 'lua-rules-4s.png',
+ 'ads' / 'png' / 'not-even-the-bread-4s.png',
+ 'ads' / 'png' / 'notsnack-7s.png',
+ 'ads' / 'png' / 'paravirt-8s.png',
+ 'ads' / 'png' / 'success-unreachable-7s.png',
+ 'ads' / 'png' / 'swissknife-10s.png',
+ 'ads' / 'png' / 'taler1-5s.png',
+ 'ads' / 'png' / 'taler2-7s.png',
+ 'ads' / 'png' / 'taler-machine-whats-inside-7s.png',
+ 'ads' / 'png' / 'taler-post-blockchain-18s.png',
+ 'ads' / 'png' / 'taler-principles-1-3s.png',
+ 'ads' / 'png' / 'taler-principles-2-4s.png',
+ 'ads' / 'png' / 'taler-principles-3-3s.png',
+ 'ads' / 'png' / 'taler-principles-4-3s.png',
+ 'ads' / 'png' / 'taler-principles-5-4s.png',
+ 'ads' / 'png' / 'taler-principles-6-3s.png',
+ 'ads' / 'png' / 'taler-principles-7-3s.png',
+ 'ads' / 'png' / 'taler-principles-8-3s.png',
+ 'ads' / 'png' / 'taler-principles-9-3s.png',
+ 'ads' / 'png' / 'taler-rms-5s.png',
+ 'ads' / 'png' / 'taler-wallet-eCHF-french-10s.png',
+ 'ads' / 'png' / 'taler-wallet-eCHF-german-10s.png',
+ 'ads' / 'png' / 'taler-wallet-question-15s.png',
+ install_dir: get_option('datadir') / 'taler' / 'ads',
+)
+
+
+
+
+install_data(
+ 'taler-mdb-ads.sh',
+ 'taler-mdb-show.sh',
+ 'taler-mdb-network-check.sh',
+ install_dir: get_option('bindir'),
+)
diff --git a/doc/Makefile.am b/doc/Makefile.am
@@ -1,12 +0,0 @@
-SUBDIRS = .
-
-man_MANS = \
- prebuilt/man/taler-mdb.1 \
- prebuilt/man/taler-mdb-ads.sh.1 \
- prebuilt/man/taler-mdb-display.1 \
- prebuilt/man/taler-mdb-network-check.sh.1 \
- prebuilt/man/taler-mdb-qr-show.1 \
- prebuilt/man/taler-mdb-show.sh.1
-
-EXTRA_DIST = \
- $(man_MANS)
diff --git a/doc/meson.build b/doc/meson.build
@@ -0,0 +1,10 @@
+install_man(
+ [
+ 'prebuilt' / 'man' / 'taler-mdb.1',
+ 'prebuilt' / 'man' / 'taler-mdb-ads.sh.1',
+ 'prebuilt' / 'man' / 'taler-mdb-display.1',
+ 'prebuilt' / 'man' / 'taler-mdb-network-check.sh.1',
+ 'prebuilt' / 'man' / 'taler-mdb-qr-show.1',
+ 'prebuilt' / 'man' / 'taler-mdb-show.sh.1',
+ ],
+)
diff --git a/flake.lock b/flake.lock
@@ -0,0 +1,822 @@
+{
+ "nodes": {
+ "donau": {
+ "inputs": {
+ "exchange": "exchange",
+ "gnunet": "gnunet_2",
+ "nixpkgs": "nixpkgs_4",
+ "systems": "systems_4"
+ },
+ "locked": {
+ "lastModified": 1776068074,
+ "narHash": "sha256-/UG1yoOAak34+mZ/fTB8+/FMMEaj4enPn+IxOV8R/4A=",
+ "ref": "refs/heads/master",
+ "rev": "4f609168fe263891f134eff01f86288066acdd81",
+ "revCount": 1050,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/donau"
+ },
+ "original": {
+ "rev": "4f609168fe263891f134eff01f86288066acdd81",
+ "type": "git",
+ "url": "https://git.gnunet.org/donau"
+ }
+ },
+ "donau_2": {
+ "inputs": {
+ "exchange": "exchange_3",
+ "gnunet": "gnunet_6",
+ "nixpkgs": "nixpkgs_11",
+ "systems": "systems_11"
+ },
+ "locked": {
+ "lastModified": 1776068074,
+ "narHash": "sha256-/UG1yoOAak34+mZ/fTB8+/FMMEaj4enPn+IxOV8R/4A=",
+ "ref": "refs/heads/master",
+ "rev": "4f609168fe263891f134eff01f86288066acdd81",
+ "revCount": 1050,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/donau"
+ },
+ "original": {
+ "rev": "4f609168fe263891f134eff01f86288066acdd81",
+ "type": "git",
+ "url": "https://git.gnunet.org/donau"
+ }
+ },
+ "exchange": {
+ "inputs": {
+ "gnunet": "gnunet",
+ "nixpkgs": "nixpkgs_2",
+ "systems": "systems_2"
+ },
+ "locked": {
+ "lastModified": 1776020637,
+ "narHash": "sha256-U/KHaAaE/JrlS3RYbRRiRRe0ur2JACkKysevCrzCXYY=",
+ "ref": "refs/heads/master",
+ "rev": "1b474b461597d11382e4e036520259a96f254e9b",
+ "revCount": 9931,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/exchange"
+ },
+ "original": {
+ "rev": "1b474b461597d11382e4e036520259a96f254e9b",
+ "type": "git",
+ "url": "https://git.gnunet.org/exchange"
+ }
+ },
+ "exchange_2": {
+ "inputs": {
+ "gnunet": "gnunet_3",
+ "nixpkgs": "nixpkgs_6",
+ "systems": "systems_6"
+ },
+ "locked": {
+ "lastModified": 1776021477,
+ "narHash": "sha256-V6qYPCNgaalQi6tRkDZ+Per3PPifm1Ze2pShV6LGomg=",
+ "ref": "refs/heads/master",
+ "rev": "92da4e81006404494f6443781c8f55249e723847",
+ "revCount": 9932,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/exchange"
+ },
+ "original": {
+ "rev": "92da4e81006404494f6443781c8f55249e723847",
+ "type": "git",
+ "url": "https://git.gnunet.org/exchange"
+ }
+ },
+ "exchange_3": {
+ "inputs": {
+ "gnunet": "gnunet_5",
+ "nixpkgs": "nixpkgs_9",
+ "systems": "systems_9"
+ },
+ "locked": {
+ "lastModified": 1776020637,
+ "narHash": "sha256-U/KHaAaE/JrlS3RYbRRiRRe0ur2JACkKysevCrzCXYY=",
+ "ref": "refs/heads/master",
+ "rev": "1b474b461597d11382e4e036520259a96f254e9b",
+ "revCount": 9931,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/exchange"
+ },
+ "original": {
+ "rev": "1b474b461597d11382e4e036520259a96f254e9b",
+ "type": "git",
+ "url": "https://git.gnunet.org/exchange"
+ }
+ },
+ "exchange_4": {
+ "inputs": {
+ "gnunet": "gnunet_7",
+ "nixpkgs": "nixpkgs_13",
+ "systems": "systems_13"
+ },
+ "locked": {
+ "lastModified": 1776021477,
+ "narHash": "sha256-V6qYPCNgaalQi6tRkDZ+Per3PPifm1Ze2pShV6LGomg=",
+ "ref": "refs/heads/master",
+ "rev": "92da4e81006404494f6443781c8f55249e723847",
+ "revCount": 9932,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/exchange"
+ },
+ "original": {
+ "rev": "92da4e81006404494f6443781c8f55249e723847",
+ "type": "git",
+ "url": "https://git.gnunet.org/exchange"
+ }
+ },
+ "gnunet": {
+ "inputs": {
+ "nixpkgs": "nixpkgs",
+ "systems": "systems"
+ },
+ "locked": {
+ "lastModified": 1774899416,
+ "narHash": "sha256-YcGma1gX/t76xDv9DW71nKkWFhzXYz3NkN/WEceHbZM=",
+ "ref": "refs/heads/master",
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "revCount": 33194,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ },
+ "original": {
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ }
+ },
+ "gnunet_2": {
+ "inputs": {
+ "nixpkgs": "nixpkgs_3",
+ "systems": "systems_3"
+ },
+ "locked": {
+ "lastModified": 1774899416,
+ "narHash": "sha256-YcGma1gX/t76xDv9DW71nKkWFhzXYz3NkN/WEceHbZM=",
+ "ref": "refs/heads/master",
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "revCount": 33194,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ },
+ "original": {
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ }
+ },
+ "gnunet_3": {
+ "inputs": {
+ "nixpkgs": "nixpkgs_5",
+ "systems": "systems_5"
+ },
+ "locked": {
+ "lastModified": 1774899416,
+ "narHash": "sha256-YcGma1gX/t76xDv9DW71nKkWFhzXYz3NkN/WEceHbZM=",
+ "ref": "refs/heads/master",
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "revCount": 33194,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ },
+ "original": {
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ }
+ },
+ "gnunet_4": {
+ "inputs": {
+ "nixpkgs": "nixpkgs_7",
+ "systems": "systems_7"
+ },
+ "locked": {
+ "lastModified": 1774899416,
+ "narHash": "sha256-YcGma1gX/t76xDv9DW71nKkWFhzXYz3NkN/WEceHbZM=",
+ "ref": "refs/heads/master",
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "revCount": 33194,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ },
+ "original": {
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ }
+ },
+ "gnunet_5": {
+ "inputs": {
+ "nixpkgs": "nixpkgs_8",
+ "systems": "systems_8"
+ },
+ "locked": {
+ "lastModified": 1774899416,
+ "narHash": "sha256-YcGma1gX/t76xDv9DW71nKkWFhzXYz3NkN/WEceHbZM=",
+ "ref": "refs/heads/master",
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "revCount": 33194,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ },
+ "original": {
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ }
+ },
+ "gnunet_6": {
+ "inputs": {
+ "nixpkgs": "nixpkgs_10",
+ "systems": "systems_10"
+ },
+ "locked": {
+ "lastModified": 1774899416,
+ "narHash": "sha256-YcGma1gX/t76xDv9DW71nKkWFhzXYz3NkN/WEceHbZM=",
+ "ref": "refs/heads/master",
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "revCount": 33194,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ },
+ "original": {
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ }
+ },
+ "gnunet_7": {
+ "inputs": {
+ "nixpkgs": "nixpkgs_12",
+ "systems": "systems_12"
+ },
+ "locked": {
+ "lastModified": 1774899416,
+ "narHash": "sha256-YcGma1gX/t76xDv9DW71nKkWFhzXYz3NkN/WEceHbZM=",
+ "ref": "refs/heads/master",
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "revCount": 33194,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ },
+ "original": {
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ }
+ },
+ "gnunet_8": {
+ "inputs": {
+ "nixpkgs": "nixpkgs_14",
+ "systems": "systems_14"
+ },
+ "locked": {
+ "lastModified": 1774899416,
+ "narHash": "sha256-YcGma1gX/t76xDv9DW71nKkWFhzXYz3NkN/WEceHbZM=",
+ "ref": "refs/heads/master",
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "revCount": 33194,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ },
+ "original": {
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ }
+ },
+ "merchant": {
+ "inputs": {
+ "donau": "donau_2",
+ "exchange": "exchange_4",
+ "gnunet": "gnunet_8",
+ "nixpkgs": "nixpkgs_15",
+ "systems": "systems_15"
+ },
+ "locked": {
+ "lastModified": 1776070816,
+ "narHash": "sha256-R+a90LanaprK2S4XzUXyW5tAUXOf+pVD7ljCfvulgAM=",
+ "ref": "refs/heads/master",
+ "rev": "b174138726171601b666fff346762502be5150a1",
+ "revCount": 5567,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/merchant"
+ },
+ "original": {
+ "rev": "b174138726171601b666fff346762502be5150a1",
+ "type": "git",
+ "url": "https://git.gnunet.org/merchant"
+ }
+ },
+ "nixpkgs": {
+ "locked": {
+ "lastModified": 1774799055,
+ "narHash": "sha256-Tsq9BCz0q47ej1uFF39m4tuhcwru/ls6vCCJzutEpaw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "107cba9eb4a8d8c9f8e9e61266d78d340867913a",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_10": {
+ "locked": {
+ "lastModified": 1774799055,
+ "narHash": "sha256-Tsq9BCz0q47ej1uFF39m4tuhcwru/ls6vCCJzutEpaw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "107cba9eb4a8d8c9f8e9e61266d78d340867913a",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_11": {
+ "locked": {
+ "lastModified": 1775825553,
+ "narHash": "sha256-LH0FGBWngFpvqXYfN1eks+L5n3aXy1ALTTRRhxP0HGA=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "ca62ee54d15571e3122309abb6740578906bcdf7",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_12": {
+ "locked": {
+ "lastModified": 1774799055,
+ "narHash": "sha256-Tsq9BCz0q47ej1uFF39m4tuhcwru/ls6vCCJzutEpaw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "107cba9eb4a8d8c9f8e9e61266d78d340867913a",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_13": {
+ "locked": {
+ "lastModified": 1774799055,
+ "narHash": "sha256-Tsq9BCz0q47ej1uFF39m4tuhcwru/ls6vCCJzutEpaw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "107cba9eb4a8d8c9f8e9e61266d78d340867913a",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_14": {
+ "locked": {
+ "lastModified": 1774799055,
+ "narHash": "sha256-Tsq9BCz0q47ej1uFF39m4tuhcwru/ls6vCCJzutEpaw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "107cba9eb4a8d8c9f8e9e61266d78d340867913a",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_15": {
+ "locked": {
+ "lastModified": 1775730577,
+ "narHash": "sha256-5i3MKmxBFQP9/wp3QyFWyS7DqURq/M4T8gr1JSbyygI=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "0d5a853f7004a5fc57b61a97ccb02832f8e7ed9d",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_16": {
+ "locked": {
+ "lastModified": 1776930694,
+ "narHash": "sha256-6Rlh6E8RTTpXxXqBcpmwnzkmLQ8vl0k8DLkkjy5BtX8=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "7694c5fd26e446ff6bab37c6496f8f5d9cc34377",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_2": {
+ "locked": {
+ "lastModified": 1774799055,
+ "narHash": "sha256-Tsq9BCz0q47ej1uFF39m4tuhcwru/ls6vCCJzutEpaw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "107cba9eb4a8d8c9f8e9e61266d78d340867913a",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_3": {
+ "locked": {
+ "lastModified": 1774799055,
+ "narHash": "sha256-Tsq9BCz0q47ej1uFF39m4tuhcwru/ls6vCCJzutEpaw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "107cba9eb4a8d8c9f8e9e61266d78d340867913a",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_4": {
+ "locked": {
+ "lastModified": 1775825553,
+ "narHash": "sha256-LH0FGBWngFpvqXYfN1eks+L5n3aXy1ALTTRRhxP0HGA=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "ca62ee54d15571e3122309abb6740578906bcdf7",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_5": {
+ "locked": {
+ "lastModified": 1774799055,
+ "narHash": "sha256-Tsq9BCz0q47ej1uFF39m4tuhcwru/ls6vCCJzutEpaw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "107cba9eb4a8d8c9f8e9e61266d78d340867913a",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_6": {
+ "locked": {
+ "lastModified": 1774799055,
+ "narHash": "sha256-Tsq9BCz0q47ej1uFF39m4tuhcwru/ls6vCCJzutEpaw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "107cba9eb4a8d8c9f8e9e61266d78d340867913a",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_7": {
+ "locked": {
+ "lastModified": 1774799055,
+ "narHash": "sha256-Tsq9BCz0q47ej1uFF39m4tuhcwru/ls6vCCJzutEpaw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "107cba9eb4a8d8c9f8e9e61266d78d340867913a",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_8": {
+ "locked": {
+ "lastModified": 1774799055,
+ "narHash": "sha256-Tsq9BCz0q47ej1uFF39m4tuhcwru/ls6vCCJzutEpaw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "107cba9eb4a8d8c9f8e9e61266d78d340867913a",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_9": {
+ "locked": {
+ "lastModified": 1774799055,
+ "narHash": "sha256-Tsq9BCz0q47ej1uFF39m4tuhcwru/ls6vCCJzutEpaw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "107cba9eb4a8d8c9f8e9e61266d78d340867913a",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "root": {
+ "inputs": {
+ "donau": "donau",
+ "exchange": "exchange_2",
+ "gnunet": "gnunet_4",
+ "merchant": "merchant",
+ "nixpkgs": "nixpkgs_16",
+ "systems": "systems_16"
+ }
+ },
+ "systems": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_10": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_11": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_12": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_13": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_14": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_15": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_16": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_2": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_3": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_4": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_5": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_6": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_7": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_8": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_9": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ }
+ },
+ "root": "root",
+ "version": 7
+}
diff --git a/flake.nix b/flake.nix
@@ -0,0 +1,123 @@
+# This is a nix flake. To use it, you need nix (with flake support) installed.
+# If you do not have nix and do not intend to use it, you can ignore this file.
+# Why should you use it? Using this flake will allow you to enter a developer shell
+# which has all necessary packages for this repository already installed.
+# The shell will allow you to code against the specific revisions of the dependencies
+# pinned in this file.
+# This is useful when git HEAD of your dependencies already contains breaking changes
+# you should not (yet) code against.
+# OTOH, if you should code against a newer, not yet released revision, you can specify
+# this revision in this file.
+# You can use this file in three ways:
+# 1. Build: $ nix build
+# this will build the package (it runs make for you in an environment with the dependencies installed)
+# 2. Develop: $ nix develop
+# This will drop you inside a shell in which you can develop and compile (and test) your code.
+# It even starts and sets up the test database for you.
+# 3. Use this repository in a new project
+# Should you create a new project that depends on this project you are in luck. You can create a flake.nix
+# in your repository and include this packages as a dependency just like the dependencies of this package are
+# included here.
+
+{
+ inputs = {
+ nixpkgs.url = "nixpkgs/release-25.11";
+ systems.url = "github:nix-systems/default";
+ gnunet.url = "git+https://git.gnunet.org/gnunet?rev=7c6b613e37e301b0e81fb94af5878d00c98e5b75";
+ exchange.url = "git+https://git.gnunet.org/exchange?rev=92da4e81006404494f6443781c8f55249e723847";
+ merchant.url = "git+https://git.gnunet.org/merchant?rev=b174138726171601b666fff346762502be5150a1";
+ donau.url = "git+https://git.gnunet.org/donau?rev=4f609168fe263891f134eff01f86288066acdd81";
+ self.submodules = true;
+ };
+
+ outputs = { self, nixpkgs, gnunet, exchange, donau, merchant, systems, ... } @ inputs:
+ let
+ supportedSystems = [ "x86_64-linux" "x86_64-darwin" "aarch64-linux" "aarch64-darwin" ];
+ forEachSystem = nixpkgs.lib.genAttrs supportedSystems;
+ nixpkgsFor = forEachSystem (system: import nixpkgs { inherit system; });
+ in
+ {
+ # This defines (installable) package derivations
+ # For use in flakes that use this flake as input in order
+ # to specify/use this package from git as a dependency
+ packages = forEachSystem (system:
+ let
+ pkgs = nixpkgsFor.${system};
+ gnunetpkgs = gnunet.packages.${system};
+ exchangepkgs = exchange.packages.${system};
+ donaupkgs = donau.packages.${system};
+ merchantpkgs = merchant.packages.${system};
+ in {
+ talermdb = pkgs.stdenv.mkDerivation {
+ name = "taler-mdb";
+ src = ./.;
+ nativeBuildInputs = [
+ pkgs.gnumake
+ pkgs.meson
+ pkgs.ninja
+ pkgs.pkg-config
+ ];
+ buildInputs = [
+ pkgs.libtool
+ pkgs.jansson
+ pkgs.git
+ pkgs.libmicrohttpd
+ pkgs.libgcrypt
+ pkgs.libunistring
+ pkgs.curlWithGnuTls
+ pkgs.libnfc
+ gnunetpkgs.gnunet
+ exchangepkgs.exchange
+ donaupkgs.donau
+ merchantpkgs.merchant
+ ];
+ preConfigure = ''
+ patchShebangs --build contrib/check-prebuilt
+ ./bootstrap
+ '';
+ };
+ }
+ );
+ defaultPackage = forEachSystem (system: self.packages.${system}.talermdb);
+ # This defines a development shell in which you can compile
+ # (and use) exchange
+ devShells = forEachSystem
+ (system:
+ let
+ pkgs = nixpkgsFor.${system};
+ gnunetpkgs = gnunet.packages.${system};
+ exchangepkgs = exchange.packages.${system};
+ donaupkgs = donau.packages.${system};
+ merchantpkgs = merchant.packages.${system};
+ in
+ {
+ default = pkgs.mkShell {
+ packages = [
+ pkgs.gcc
+ pkgs.meson
+ pkgs.ninja
+ pkgs.gnumake
+ pkgs.pkg-config
+ pkgs.libtool
+ pkgs.jansson
+ pkgs.git
+ pkgs.curlWithGnuTls
+ gnunetpkgs.gnunet
+ pkgs.codespell
+ pkgs.clang-tools
+ pkgs.uncrustify
+ pkgs.libnfc
+ exchangepkgs.exchange
+ donaupkgs.donau
+ merchantpkgs.merchant
+ ];
+
+ shellHook = ''
+ echo "taler-mdb environment loaded."
+ export CC=gcc
+ export CFLAGS="-O"
+ '';
+ };
+ });
+ };
+}
diff --git a/meson.build b/meson.build
@@ -0,0 +1,292 @@
+project(
+ 'taler-mdb',
+ 'c',
+ license: 'AGPLv3',
+ meson_version: '>=1.1.0',
+ version: '1.5.1',
+)
+
+cc = meson.get_compiler('c')
+incdir = include_directories('src/')
+
+# Used to populate gnunet_private_config.h
+private_config = configuration_data()
+
+
+plugindir = get_option('libdir') / 'paivana'
+pkgdatadir = get_option('datadir') / 'paivana'
+pkgcfgdir = pkgdatadir / 'config.d'
+docdir = get_option('datadir') / 'doc' / 'paivana'
+
+if get_option('install-rpath')
+ rpath_option = get_option('prefix') / get_option('libdir')
+else
+ rpath_option = ''
+endif
+
+install_emptydir(docdir)
+install_data('README', 'COPYING', install_dir: docdir)
+
+gnunet_user = false
+dpkg_architecture_bin = find_program(
+ 'dpkg-architecture',
+ '/usr/bin/dpkg-architecture',
+ required: false,
+)
+if dpkg_architecture_bin.found()
+ private_config.set(
+ 'MULTIARCH',
+ dpkg_architecture_bin.full_path() + ' -qDEB_HOST_MULTIARCH',
+ )
+endif
+
+TALER_PLUGIN_LDFLAGS = [
+ '-export-dynamic',
+ '-avoid-version',
+ '-module',
+ '--no-undefined',
+]
+
+cdata = configuration_data()
+if not get_option('only-doc')
+ add_project_arguments(
+ '-Wall',
+ '-Wno-address-of-packed-member',
+ language: 'c',
+ )
+ taler_lib_ldflags = '-export-dynamic -no-undefined'
+
+ check_headers = ['stdint.h', 'stdlib.h', 'string.h', 'unistd.h']
+
+ foreach h : check_headers
+ if cc.check_header(h)
+ define = 'HAVE_' + h.underscorify().to_upper()
+ message(define)
+ private_config.set(define, 1)
+ endif
+ endforeach
+
+ zlib_dep = dependency('zlib', required: false)
+ if not zlib_dep.found()
+ zlib_dep = cc.find_library('zlib', required: true)
+ endif
+ m_dep = cc.find_library('m', required: false)
+ if m_dep.found()
+ private_config.set('HAVE_LIBM', 1)
+ endif
+
+
+ mhd_dep = dependency('libmicrohttpd', required: false)
+ if not mhd_dep.found()
+ mhd_dep = cc.find_library('microhttpd', required: true)
+ endif
+
+ json_dep = dependency('jansson', required: false)
+ if not json_dep.found()
+ json_dep = cc.find_library('jansson', required: true)
+ endif
+
+ gcrypt_dep = dependency('libgcrypt', required: false)
+ if not gcrypt_dep.found()
+ gcrypt_dep = cc.find_library('gcrypt', required: true)
+ endif
+
+ private_config.set_quoted('NEED_LIBGCRYPT_VERSION', '1.6.1')
+
+ gnunetutil_dep = dependency('gnunetutil', required: false)
+ if not gnunetutil_dep.found()
+ gnunetutil_dep = cc.find_library('gnunetutil', required: true)
+ endif
+
+ cc.has_header_symbol(
+ 'gnunet/gnunet_util_lib.h',
+ 'GNUNET_TIME_round_up',
+ dependencies: [gnunetutil_dep],
+ required: true,
+ )
+
+ gnunetjson_dep = dependency('gnunetjson', required: false)
+ if not gnunetjson_dep.found()
+ gnunetjson_dep = cc.find_library('gnunetjson', required: true)
+ endif
+
+ curl_dep = dependency('libcurl', version: '>=7.34.0', required: false)
+ if not curl_dep.found()
+ curl_dep = cc.find_library('curl', required: true)
+ curl_version_check = '''#include <curl/curl.h>
+ int main(int argc, char **argv) {
+ #if LIBCURL_VERSION_NUM < 0x073400
+ #error "cURL version >= 7.34.0 required"
+ #endif
+ return 0;
+ }
+ '''
+ if not cc.compiles(
+ curl_version_check,
+ name: 'cURL version check',
+ dependencies: curl_dep,
+ )
+ error('cURL version >=7.34.0 required')
+ endif
+ endif
+
+ gnunetcurl_dep = dependency('gnunetcurl', required: false)
+ if not gnunetcurl_dep.found()
+ gnunetcurl_dep = cc.find_library('gnunetcurl', required: true)
+ endif
+ cc.has_header_symbol(
+ 'gnunet/gnunet_curl_lib.h',
+ 'GNUNET_CURL_get_select_info',
+ dependencies: [gnunetcurl_dep],
+ required: true,
+ )
+
+ talerutil_dep = dependency('talerutil', required: false)
+ if not talerutil_dep.found()
+ talerutil_dep = cc.find_library('talerutil', required: true)
+ endif
+ cc.has_header_symbol(
+ 'taler/taler_util.h',
+ 'TALER_merchant_instance_auth_hash_with_salt',
+ required: true,
+ dependencies: [talerutil_dep],
+ )
+ private_config.set10('HAVE_TALERUTIL', talerutil_dep.found())
+ talertemplating_dep = dependency('talertemplating', required: false)
+ if not talertemplating_dep.found()
+ talertemplating_dep = cc.find_library('talertemplating', required: true)
+ endif
+ talerjson_dep = dependency('talerjson', required: false)
+ if not talerjson_dep.found()
+ talerjson_dep = cc.find_library('talerjson', required: true)
+ endif
+ talermhd_dep = dependency('talermhd', required: false)
+ if not talermhd_dep.found()
+ talermhd_dep = cc.find_library('talermhd', required: true)
+ endif
+ cc.has_header_symbol(
+ 'taler/taler_mhd_lib.h',
+ 'TALER_MHD_parse_request_arg_rel_time',
+ required: true,
+ dependencies: [talermhd_dep],
+ )
+ private_config.set10('HAVE_TALERMHD', talermhd_dep.found())
+ qrencode_dep = dependency('qrencode', required: false)
+ if not qrencode_dep.found()
+ qrencode_dep = cc.find_library('qrencode', required: false)
+ endif
+ private_config.set10('HAVE_QR', qrencode_dep.found())
+
+
+ talerexchange_dep = dependency('talerexchange', required: false)
+ if not talerexchange_dep.found()
+ talerexchange_dep = cc.find_library('talerexchange', required: true)
+ endif
+ private_config.set10('HAVE_TALEREXCHANGE', talerexchange_dep.found())
+
+ talermerchant_dep = dependency('talermerchant', required: false)
+ if not talermerchant_dep.found()
+ talermerchant_dep = cc.find_library('talermerchant', required: true)
+ endif
+ cc.has_header_symbol(
+ 'taler/taler_merchant_service.h',
+ 'TALER_MERCHANT_parse_pay_uri',
+ required: true,
+ dependencies: [talermerchant_dep],
+ )
+ private_config.set10('HAVE_TALERMERCHANT', talermerchant_dep.found())
+ talermerchanttesting_dep = dependency(
+ 'talermerchanttesting',
+ required: false,
+ )
+
+ nfc_dep = dependency('nfc', required: false)
+ if not nfc_dep.found()
+ nfc_dep = cc.find_library('nfc', required: true)
+ endif
+ cc.has_header_symbol(
+ 'nfc/nfc.h',
+ 'nfc_open',
+ required: true,
+ dependencies: [nfc_dep],
+ )
+
+ logging_opt = get_option('logging')
+ logging_verbosity = 0
+
+ if logging_opt == 'yes'
+ logging_verbosity = 1
+ endif
+ if logging_opt == 'no'
+ add_project_arguments('-DGNUNET_CULL_LOGGING=1', language: 'c')
+ endif
+ if logging_opt == 'verbose'
+ logging_verbosity = 2
+ endif
+ if logging_opt == 'veryverbose'
+ logging_verbosity = 3
+ endif
+
+ #add_project_arguments('-DGNUNET_EXTRA_LOGGING=@0@'.format(logging_verbosity), language: 'c')
+
+
+ # todo gcov has meson builtin
+
+ # Used to populate configuration file and script templates
+
+
+ libltversions = [['libtalermdb', '0:0:0']]
+
+ solibversions = {}
+
+ foreach libversion : libltversions
+ ltversion = libversion[1].split(':')
+ current = ltversion[0].to_int()
+ revision = ltversion[1].to_int()
+ age = ltversion[2].to_int()
+ soversion_str = '@0@'.format(current - age)
+ ltversion_str = '@0@.@1@.@2@'.format(current - age, age, revision)
+ solibversions = solibversions + {
+ libversion[0]: {
+ 'soversion': soversion_str,
+ 'version': ltversion_str,
+ },
+ }
+ endforeach
+
+ private_config.set_quoted('PACKAGE', meson.project_name())
+ private_config.set_quoted('PACKAGE_VERSION', meson.project_version())
+ # Compatibility. Used in source.
+ private_config.set_quoted('VERSION', meson.project_version())
+ private_config.set_quoted('VCS_VERSION', 'mesonbuild')
+ private_config.set_quoted('PACKAGE_BUGREPORT', 'taler@gnu.org')
+ configure_file(output: 'config.h', configuration: private_config)
+ configuration_inc = include_directories('.')
+
+ cdata.merge_from(private_config)
+ add_project_arguments('-DHAVE_CONFIG_H', language: 'c')
+
+ pkg = import('pkgconfig')
+ subdir('contrib')
+ subdir('src')
+ if not get_option('disable-doc')
+ subdir('doc')
+ endif
+
+ taler_prefix = get_option('prefix') / get_option('libdir')
+
+ add_test_setup(
+ 'default',
+ env: ['TALER_MDB_PREFIX=' + taler_prefix],
+ exclude_suites: ['perf', 'installcheck', 'integrationtests'],
+ is_default: true,
+ )
+else
+ subdir('contrib')
+ if not get_option('disable-doc')
+ subdir('doc')
+ endif
+endif
+
+#meson.add_dist_script('meson-dist-script')
+
diff --git a/meson.options b/meson.options
@@ -0,0 +1,5 @@
+# Build options
+option('only-doc', type : 'boolean', value : false, description: 'whether to compile documentation ONLY')
+option('disable-doc', type : 'boolean', value : false, description: 'whether to disable documentation')
+option('install-rpath', type : 'boolean', value : false, description: 'Add rpath to installed binaries if set')
+option('logging', type : 'string', value: 'yes', description: 'Log setting. Can be set to "yes" (logging, default), "no" (no logging), "verbose" (extra logging"), "veryverbose" (even more logging)')
diff --git a/src/Makefile.am b/src/Makefile.am
@@ -1,59 +0,0 @@
-# This Makefile.am is in the public domain
-bin_PROGRAMS = \
- taler-mdb \
- taler-mdb-display
-
-if HAVE_QR
-bin_PROGRAMS += taler-mdb-qr-show
-endif
-
-if USE_COVERAGE
- AM_CFLAGS = --coverage -O0
- XLIB = -lgcov
-endif
-
-lib_LTLIBRARIES = \
- libtalermdb.la
-
-libtalermdb_la_SOURCES = \
- os_installation.c taler_mdb_util.h
-libtalermdb_la_LIBADD = \
- -lgnunetutil \
- $(XLIB)
-libtalermdb_la_LDFLAGS = \
- -version-info 0:0:0 \
- -export-dynamic -no-undefined
-
-
-taler_mdb_SOURCES = \
- taler-mdb.c
-taler_mdb_LDADD = \
- libtalermdb.la \
- -ltalermerchant \
- -ltalerjson \
- -ltalerutil \
- -lgnunetjson \
- -lgnunetcurl \
- -lgnunetutil \
- -ljansson \
- -lnfc \
- -lcurl \
- @QR_LIBS@ \
- $(XLIB)
-
-
-taler_mdb_qr_show_SOURCES = \
- taler-mdb-qr-show.c
-taler_mdb_qr_show_LDADD = \
- libtalermdb.la \
- -lgnunetutil \
- @QR_LIBS@ \
- $(XLIB)
-
-
-taler_mdb_display_SOURCES = \
- taler-mdb-display.c
-taler_mdb_display_LDADD = \
- libtalermdb.la \
- -lgnunetutil \
- $(XLIB)
diff --git a/src/meson.build b/src/meson.build
@@ -0,0 +1,61 @@
+# This file is in the public domain
+
+libtalermdb = library(
+ 'talermdb',
+ ['os_installation.c'],
+ soversion: solibversions['libtalermdb']['soversion'],
+ version: solibversions['libtalermdb']['soversion'],
+ install_rpath: rpath_option,
+ dependencies: [gnunetutil_dep],
+ include_directories: [incdir, configuration_inc],
+ install: true,
+ install_dir: get_option('libdir'),
+)
+
+libtalermdb_dep = declare_dependency(link_with: libtalermdb)
+pkg.generate(
+ libtalermdb,
+ url: 'https://taler.net',
+ description: 'GNU Taler MDB library',
+)
+
+if qrencode_dep.found()
+ executable(
+ 'taler-mdb-qr-show',
+ ['taler-mdb-qr-show.c'],
+ dependencies: [libtalermdb_dep, qrencode_dep, gnunetutil_dep],
+ include_directories: [incdir, configuration_inc],
+ install: true,
+ )
+endif
+
+executable(
+ 'taler-mdb',
+ ['taler-mdb.c'],
+ dependencies: [
+ libtalermdb_dep,
+ talermerchant_dep,
+ talerutil_dep,
+ talerjson_dep,
+ gnunetjson_dep,
+ gnunetcurl_dep,
+ gnunetutil_dep,
+ json_dep,
+ nfc_dep,
+ curl_dep,
+ qrencode_dep,
+ ],
+ include_directories: [incdir, configuration_inc],
+ install: true,
+)
+
+
+executable(
+ 'taler-mdb-display',
+ ['taler-mdb-display.c'],
+ dependencies: [libtalermdb_dep, gnunetutil_dep],
+ include_directories: [incdir, configuration_inc],
+ install: true,
+)
+
+