commit a6452739b0299ee8c10659980ac8084a52cf90ad parent 591a5952dd30327b807a0832717b4dd44a601c2f Author: Florian Dold <florian@dold.me> Date: Fri, 5 Jun 2026 23:53:25 +0200 simplify, use same naming and structure for buildconfig as packaging/ng Diffstat:
40 files changed, 211 insertions(+), 238 deletions(-)
diff --git a/Dockerfile b/Dockerfile @@ -72,241 +72,72 @@ RUN DEBIAN_FRONTEND=noninteractive \ # FIXME: Try to use debian packages where possible and otherwise really use # a venv or per-user installation of the package. RUN pip3 install --break-system-packages sphinx-book-theme sphinx-markdown-builder sphinxcontrib-jquery +RUN npm install -g pnpm@10 +COPY buildscripts/sandcastle-build-generic /bin/ # GNUnet FROM base-system AS gnunet - -COPY buildconfig/gnunet.tag buildconfig/gnunet.checkout /buildconfig/ -WORKDIR /build -RUN TAG=$(cat /buildconfig/gnunet.tag) && \ - git clone git://git.gnunet.org/gnunet \ - --branch $TAG && \ - cd gnunet && git checkout $(cat /buildconfig/gnunet.checkout) -WORKDIR /build/gnunet -RUN ./bootstrap -RUN dpkg-buildpackage -rfakeroot -b -uc -us -WORKDIR / -RUN mkdir -p /packages/gnunet -RUN mv /build/*.deb /packages/gnunet -RUN rm -rf /build -RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install --no-install-recommends -y /packages/gnunet/*.deb -WORKDIR / +COPY buildconfig/gnunet.* /buildconfig/ +RUN sandcastle-build-generic gnunet # Directory FROM base-system AS taler-directory - COPY buildconfig/taler-directory.* /buildconfig/ -WORKDIR /build -RUN TAG=$(cat /buildconfig/taler-directory.tag) && \ - git clone git://git.gnunet.org/taldir \ - --branch $TAG && \ - cd taldir && git checkout $(cat /buildconfig/taler-directory.checkout) -WORKDIR /build/taldir -RUN ./bootstrap -RUN dpkg-buildpackage -rfakeroot -b -uc -us -WORKDIR / -RUN mkdir -p /packages/taldir -RUN mv /build/*.deb /packages/taldir -RUN rm -rf /build -RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install --no-install-recommends -y /packages/taldir/*.deb -WORKDIR / +RUN sandcastle-build-generic taler-directory # Mailbox FROM base-system AS taler-mailbox - COPY buildconfig/taler-mailbox.* /buildconfig/ -WORKDIR /build -RUN TAG=$(cat /buildconfig/taler-mailbox.tag) && \ - git clone git://git.gnunet.org/taler-mailbox \ - --branch $TAG && \ - cd taler-mailbox && git checkout $(cat /buildconfig/taler-mailbox.checkout) -WORKDIR /build/taler-mailbox -RUN dpkg-buildpackage -rfakeroot -b -uc -us -WORKDIR / -RUN mkdir -p /packages/taler-mailbox -RUN mv /build/*.deb /packages/taler-mailbox -RUN rm -rf /build -RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install --no-install-recommends -y /packages/taler-mailbox/*.deb -WORKDIR / +RUN sandcastle-build-generic taler-mailbox # Exchange -FROM gnunet as exchange - -COPY buildconfig/exchange.tag buildconfig/exchange.checkout /buildconfig/ -WORKDIR /build -RUN TAG=$(cat /buildconfig/exchange.tag) && \ - git clone git://git.taler.net/exchange \ - --branch $TAG && \ - cd exchange && git checkout $(cat /buildconfig/exchange.checkout) -WORKDIR /build/exchange -RUN ./bootstrap -RUN dpkg-buildpackage -rfakeroot -b -uc -us -WORKDIR / -RUN mkdir -p /packages/exchange -RUN mv /build/*.deb /packages/exchange -RUN rm -rf /build -RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install --no-install-recommends -y /packages/exchange/*.deb -WORKDIR / +FROM gnunet as taler-exchange +COPY buildconfig/taler-exchange.* /buildconfig/ +RUN sandcastle-build-generic taler-exchange # Donau -FROM exchange as donau -COPY buildconfig/donau.tag buildconfig/donau.checkout /buildconfig/ -WORKDIR /build -RUN TAG=$(cat /buildconfig/donau.tag) && \ - git clone git://git.taler.net/donau \ - --branch $TAG && \ - cd donau && git checkout $(cat /buildconfig/donau.checkout) -WORKDIR /build/donau -RUN ./bootstrap && \ - ./configure --prefix=/usr \ - --disable-doc -RUN dpkg-buildpackage -rfakeroot -b -uc -us -WORKDIR / -RUN mkdir -p /packages/donau -RUN mv /build/*.deb /packages/donau -RUN rm -rf /build -RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install --no-install-recommends -y /packages/donau/*.deb -WORKDIR / +FROM taler-exchange as donau +COPY buildconfig/donau.* /buildconfig/ +RUN sandcastle-build-generic donau # Merchant -# FROM exchange as merchant -FROM donau as merchant - -COPY buildconfig/merchant.tag buildconfig/merchant.checkout /buildconfig/ -WORKDIR /build -RUN TAG=$(cat /buildconfig/merchant.tag) && \ - git clone git://git.taler.net/merchant \ - --branch $TAG && \ - cd merchant && git checkout $(cat /buildconfig/merchant.checkout) -WORKDIR /build/merchant -RUN ./bootstrap && \ - ./configure --prefix=/usr \ - --disable-doc -RUN dpkg-buildpackage -rfakeroot -b -uc -us -WORKDIR / -RUN mkdir -p /packages/merchant -RUN mv /build/*.deb /packages/merchant -RUN rm -rf /build -RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install --no-install-recommends -y /packages/merchant/*.deb -WORKDIR / +FROM donau as taler-merchant +COPY buildconfig/taler-merchant.* /buildconfig/ +RUN sandcastle-build-generic taler-merchant # Challenger -FROM exchange as challenger - -COPY buildconfig/challenger.tag buildconfig/challenger.checkout /buildconfig/ -WORKDIR /build -RUN TAG=$(cat /buildconfig/challenger.tag) && \ - git clone git://git.taler.net/challenger \ - --branch $TAG && \ - cd challenger && git checkout $(cat /buildconfig/challenger.checkout) -WORKDIR /build/challenger -RUN ./bootstrap && \ - ./configure --prefix=/usr \ - --disable-doc -RUN dpkg-buildpackage -rfakeroot -b -uc -us -WORKDIR / -RUN mkdir -p /packages/challenger -RUN mv /build/*.deb /packages/challenger -RUN rm -rf /build -RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install --no-install-recommends -y /packages/challenger/*.deb -WORKDIR / +FROM taler-exchange as challenger +COPY buildconfig/challenger.* /buildconfig/ +RUN sandcastle-build-generic challenger # Libeufin FROM base-system as libeufin - -WORKDIR /build -COPY buildconfig/libeufin.tag buildconfig/libeufin.checkout /buildconfig/ -RUN TAG=$(cat /buildconfig/libeufin.tag) && \ - git clone git://git.taler.net/libeufin \ - --branch $TAG && \ - cd libeufin && git checkout $(cat /buildconfig/libeufin.checkout) -WORKDIR /build/libeufin -RUN ./bootstrap -RUN ./configure --prefix=/usr -RUN dpkg-buildpackage -rfakeroot -b -uc -us -WORKDIR / -RUN mkdir -p /packages/libeufin -RUN mv /build/*.deb /packages/libeufin -RUN rm -rf /build -RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install --no-install-recommends -y /packages/libeufin/*.deb +COPY buildconfig/libeufin.* /buildconfig/ +RUN sandcastle-build-generic libeufin # Merchant demos -FROM base-system as merchant-demos - -WORKDIR /build -COPY buildconfig/merchant-demos.tag buildconfig/merchant-demos.checkout /buildconfig/ -RUN TAG=$(cat /buildconfig/merchant-demos.tag) && \ - git clone git://git.taler.net/taler-merchant-demos \ - --branch $TAG && \ - cd taler-merchant-demos && git checkout $(cat /buildconfig/merchant-demos.checkout) -WORKDIR /build/taler-merchant-demos -RUN ./bootstrap -RUN dpkg-buildpackage -rfakeroot -b -uc -us -WORKDIR / -RUN mkdir -p /packages/merchant-demos -RUN mv /build/*.deb /packages/merchant-demos -RUN rm -rf /build -RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install --no-install-recommends -y /packages/merchant-demos/*.deb +FROM base-system as taler-merchant-demos +COPY buildconfig/taler-merchant-demos.* /buildconfig/ +RUN sandcastle-build-generic taler-merchant-demos -# taler-typescript-core tools (taler-wallet-cli and taler-harness) -FROM base-system as wallet -WORKDIR /build -COPY buildconfig/wallet.tag buildconfig/wallet.checkout /buildconfig/ -RUN TAG=$(cat /buildconfig/wallet.tag) && \ - git clone git://git.taler.net/taler-typescript-core \ - --branch $TAG && \ - cd taler-typescript-core && git checkout $(cat /buildconfig/wallet.checkout) -RUN npm install -g pnpm@^9.10.0 -WORKDIR /build/taler-typescript-core -RUN ./bootstrap -# Install standalone merchant SPA -WORKDIR /build/taler-typescript-core/packages/merchant-backoffice-ui -RUN ./configure --prefix=/usr/local -RUN make install -# taler-wallet-cli -WORKDIR /build/taler-typescript-core/packages/taler-wallet-cli -RUN ./configure --prefix=/usr/local -RUN make deps -RUN dpkg-buildpackage -rfakeroot -b -uc -us -# taler-harness -WORKDIR /build/taler-typescript-core/packages/taler-harness -RUN ./configure --prefix=/usr/local -RUN pnpm install --frozen-lockfile --filter @gnu-taler/taler-harness... -RUN pnpm run --filter @gnu-taler/taler-harness... compile -RUN dpkg-buildpackage -rfakeroot -b -uc -us -# copy debs -WORKDIR / -RUN mkdir -p /packages/wallet -RUN mv /build/taler-typescript-core/packages/*.deb /packages/wallet -RUN rm -rf /build -RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install --no-install-recommends -y /packages/wallet/*.deb +FROM base-system as taler-wallet-cli +COPY buildconfig/taler-wallet-cli.* /buildconfig/ +RUN sandcastle-build-generic taler-wallet-cli -## Sync -#FROM merchant as sync -#COPY buildconfig/sync.* /buildconfig/ -#WORKDIR /build -#RUN TAG=$(cat /buildconfig/sync.tag) && \ -# git clone git://git.taler.net/sync \ -# --branch $TAG && \ -# cd sync && git checkout $(cat /buildconfig/sync.checkout) -#WORKDIR /build/sync -#RUN ./bootstrap -#RUN dpkg-buildpackage -rfakeroot -b -uc -us -#WORKDIR / -#RUN mkdir -p /packages/sync -#RUN mv /build/*.deb /packages/sync -#RUN rm -rf /build -#RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install --no-install-recommends -y /packages/sync/*.deb -#WORKDIR / +FROM base-system as taler-harness +COPY buildconfig/taler-harness.* /buildconfig/ +RUN sandcastle-build-generic taler-harness +FROM base-system as taler-merchant-webui +COPY buildconfig/taler-merchant-webui.* /buildconfig/ +RUN sandcastle-build-generic taler-merchant-webui FROM base-system as turnstile -COPY buildconfig/turnstile.tag buildconfig/turnstile.checkout /buildconfig/ +COPY buildconfig/turnstile.* /buildconfig/ RUN TAG=$(cat /buildconfig/turnstile.tag) && \ cd /opt/ && \ git clone git://git.taler.net/turnstile \ - --branch $TAG && \ - cd /opt/turnstile && git checkout $(cat /buildconfig/turnstile.checkout) + --branch $TAG # Final image FROM base-system as taler-final @@ -339,14 +170,15 @@ RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get -y upgrade && apt-g RUN mkdir -p /packages COPY --from=gnunet /packages/gnunet/* /packages/ -COPY --from=taler-directory /packages/taldir/* /packages/ +COPY --from=taler-directory /packages/taler-directory/* /packages/ COPY --from=taler-mailbox /packages/taler-mailbox/* /packages/ -COPY --from=exchange /packages/exchange/* /packages/ -COPY --from=merchant /packages/merchant/* /packages/ -COPY --from=wallet /packages/wallet/* /packages/ -COPY --from=wallet /usr/local/share/taler-merchant-backoffice /usr/local/share/taler-merchant-backoffice +COPY --from=taler-exchange /packages/taler-exchange/* /packages/ +COPY --from=taler-merchant /packages/taler-merchant/* /packages/ +COPY --from=taler-wallet-cli /packages/taler-wallet-cli/* /packages/ +COPY --from=taler-harness /packages/taler-harness/* /packages/ +COPY --from=taler-merchant-webui /packages/taler-merchant-webui/* /packages/ COPY --from=libeufin /packages/libeufin/* /packages/ -COPY --from=merchant-demos /packages/merchant-demos/* /packages/ +COPY --from=taler-merchant-demos /packages/taler-merchant-demos/* /packages/ COPY --from=challenger /packages/challenger/* /packages/ COPY --from=donau /packages/donau/* /packages/ COPY --from=turnstile /opt/turnstile /opt/turnstile diff --git a/buildconfig/challenger.checkout b/buildconfig/challenger.checkout @@ -1 +0,0 @@ -challenger.tag -\ No newline at end of file diff --git a/buildconfig/challenger.giturl b/buildconfig/challenger.giturl @@ -0,0 +1 @@ +git://git.taler.net/challenger diff --git a/buildconfig/donau.checkout b/buildconfig/donau.checkout @@ -1 +0,0 @@ -donau.tag -\ No newline at end of file diff --git a/buildconfig/donau.giturl b/buildconfig/donau.giturl @@ -0,0 +1 @@ +git://git.taler.net/donau.git diff --git a/buildconfig/donau.tag b/buildconfig/donau.tag @@ -1 +1 @@ -v1.6.0 +v1.6.1 diff --git a/buildconfig/exchange.checkout b/buildconfig/exchange.checkout @@ -1 +0,0 @@ -exchange.tag -\ No newline at end of file diff --git a/buildconfig/exchange.tag b/buildconfig/exchange.tag @@ -1 +0,0 @@ -v1.6.0 diff --git a/buildconfig/gnunet.checkout b/buildconfig/gnunet.checkout @@ -1 +0,0 @@ -gnunet.tag -\ No newline at end of file diff --git a/buildconfig/gnunet.giturl b/buildconfig/gnunet.giturl @@ -0,0 +1 @@ +git://git.gnunet.org/gnunet.git diff --git a/buildconfig/gnunet.tag b/buildconfig/gnunet.tag @@ -1 +1 @@ -v0.27.0 +v0.28.0-dev.1 diff --git a/buildconfig/libeufin.checkout b/buildconfig/libeufin.checkout @@ -1 +0,0 @@ -libeufin.tag -\ No newline at end of file diff --git a/buildconfig/libeufin.giturl b/buildconfig/libeufin.giturl @@ -0,0 +1 @@ +git://git.taler.net/libeufin diff --git a/buildconfig/merchant-demos.checkout b/buildconfig/merchant-demos.checkout @@ -1 +0,0 @@ -merchant-demos.tag -\ No newline at end of file diff --git a/buildconfig/merchant.checkout b/buildconfig/merchant.checkout @@ -1 +0,0 @@ -merchant.tag -\ No newline at end of file diff --git a/buildconfig/merchant.tag b/buildconfig/merchant.tag @@ -1 +0,0 @@ -v1.6.0 diff --git a/buildconfig/sync.checkout b/buildconfig/sync.checkout @@ -1 +0,0 @@ -sync.tag -\ No newline at end of file diff --git a/buildconfig/taler-directory.checkout b/buildconfig/taler-directory.checkout @@ -1 +0,0 @@ -taler-directory.tag -\ No newline at end of file diff --git a/buildconfig/taler-directory.giturl b/buildconfig/taler-directory.giturl @@ -0,0 +1 @@ +git://git.gnunet.org/taldir diff --git a/buildconfig/taler-exchange.giturl b/buildconfig/taler-exchange.giturl @@ -0,0 +1 @@ +git://git.taler.net/exchange.git diff --git a/buildconfig/taler-exchange.tag b/buildconfig/taler-exchange.tag @@ -0,0 +1 @@ +v1.6.3-dev.1 diff --git a/buildconfig/taler-harness.debpath b/buildconfig/taler-harness.debpath @@ -0,0 +1 @@ +packages/taler-harness diff --git a/buildconfig/taler-harness.giturl b/buildconfig/taler-harness.giturl @@ -0,0 +1 @@ +git://git.taler.net/taler-typescript-core.git diff --git a/buildconfig/taler-harness.tag b/buildconfig/taler-harness.tag @@ -0,0 +1 @@ +v1.5.0 diff --git a/buildconfig/taler-mailbox.checkout b/buildconfig/taler-mailbox.checkout @@ -1 +0,0 @@ -taler-mailbox.tag -\ No newline at end of file diff --git a/buildconfig/taler-mailbox.giturl b/buildconfig/taler-mailbox.giturl @@ -0,0 +1 @@ +git://git.gnunet.org/taler-mailbox diff --git a/buildconfig/taler-merchant-demos.giturl b/buildconfig/taler-merchant-demos.giturl @@ -0,0 +1 @@ +git://git.taler.net/taler-merchant-demos diff --git a/buildconfig/merchant-demos.tag b/buildconfig/taler-merchant-demos.tag diff --git a/buildconfig/taler-merchant-webui.debpath b/buildconfig/taler-merchant-webui.debpath @@ -0,0 +1 @@ +packages/taler-merchant-webui diff --git a/buildconfig/taler-merchant-webui.giturl b/buildconfig/taler-merchant-webui.giturl @@ -0,0 +1 @@ +git://git.taler.net/taler-typescript-core.git diff --git a/buildconfig/taler-merchant-webui.tag b/buildconfig/taler-merchant-webui.tag @@ -0,0 +1 @@ +v1.6.3 diff --git a/buildconfig/taler-merchant.giturl b/buildconfig/taler-merchant.giturl @@ -0,0 +1 @@ +git://git.taler.net/merchant.git diff --git a/buildconfig/taler-merchant.tag b/buildconfig/taler-merchant.tag @@ -0,0 +1 @@ +v1.5.18-dev.4 diff --git a/buildconfig/taler-wallet-cli.debpath b/buildconfig/taler-wallet-cli.debpath @@ -0,0 +1 @@ +packages/taler-wallet-cli diff --git a/buildconfig/taler-wallet-cli.giturl b/buildconfig/taler-wallet-cli.giturl @@ -0,0 +1 @@ +git://git.taler.net/taler-typescript-core.git diff --git a/buildconfig/taler-wallet-cli.tag b/buildconfig/taler-wallet-cli.tag @@ -0,0 +1 @@ +v1.5.0 diff --git a/buildconfig/turnstile.checkout b/buildconfig/turnstile.checkout @@ -1 +0,0 @@ -turnstile.tag -\ No newline at end of file diff --git a/buildconfig/wallet.checkout b/buildconfig/wallet.checkout @@ -1 +0,0 @@ -wallet.tag -\ No newline at end of file diff --git a/buildconfig/wallet.tag b/buildconfig/wallet.tag @@ -1 +0,0 @@ -v1.6.0-dev.1 diff --git a/buildscripts/sandcastle-build-generic b/buildscripts/sandcastle-build-generic @@ -0,0 +1,148 @@ +#!/usr/bin/env python3 +# This file is in the public domain. +# Helper script to build the latest DEB packages in the container. + +# Supported tag syntax variants: +# v$maj.$min$.$patch => release version +# v$maj.$min$.$patch-dev.$n => dev version +# deb-v$maj.$min$.$patch-$revision => release version with debian revision +# Debian revisions of dev versions are *not* supported + +import os +import sys +import subprocess +import glob +import shutil +import shlex +from email.utils import formatdate + +def run_cmd(cmd, shell=False, cwd=None, env=None): + """Helper to run commands and exit on failure (mimicking set -e).""" + # If specific env vars are passed, update the current env, otherwise use current + command_env = os.environ.copy() + if env: + command_env.update(env) + + # Flush stdout so logs appear in order + sys.stdout.flush() + + subprocess.check_call(cmd, shell=shell, cwd=cwd, env=command_env) + +def get_output(cmd, shell=False, cwd=None): + """Helper to get command output as string.""" + return subprocess.check_output(cmd, shell=shell, cwd=cwd, text=True).strip() + +def get_tag_debver(tag): + """Get a debian version string from a git tag""" + if tag.startswith("v"): + devsuff = "-dev." + d = tag.find(devsuff) + if d < 0: + return tag[1:] + else: + return tag[1:d] + "~dev" + tag[d + len(devsuff)] + if tag.startswith("deb-v"): + tag = tag[5:] + if "-" in tag: + a, b = tag.split("-") + return a + ":" + b + return tag + raise Error("unexpected tag format") + + +def main(): + if 'LD_LIBRARY_PATH' in os.environ: + del os.environ['LD_LIBRARY_PATH'] + + # Arguments + if len(sys.argv) < 2: + print(f"Usage: {sys.argv[0]} <PACKAGE>", file=sys.stderr) + sys.exit(1) + + package = sys.argv[1] + + # Path of the debian/ folder in the repository + DEBIANPATH = "" + debpath_file = f"/buildconfig/{package}.debpath" + if os.path.exists(debpath_file): + with open(debpath_file, 'r') as f: + DEBIANPATH = f.read().strip() + + print(f"Building {package} with generic build logic", file=sys.stderr) + + with open(f"/buildconfig/{package}.tag", 'r') as f: + tag = f.read().strip() + + # Prepare Build Directory + if not os.path.exists("/build"): + os.makedirs("/build") + os.chdir("/build") + + with open(f"/buildconfig/{package}.giturl", 'r') as f: + GITURL = f.read().strip() + + run_cmd(["git", "config", "--global", "advice.detachedHead", "false"]) + run_cmd(["git", "clone", "--depth=1", f"--branch={tag}", GITURL, package]) + + build_pkg_path = os.path.join("/build", package, DEBIANPATH) + os.chdir(build_pkg_path) + + deb_version = get_tag_debver(tag) + + # Bootstrap and Install Deps + os.chdir(os.path.join("/build", package)) + run_cmd(["./bootstrap"]) + + os.chdir(build_pkg_path) + + # Sparse checkout hint + with open(".version", "w") as f: + f.write(f"{deb_version}\n") + + # Configure Environment for Build + deb_dbg_repo = "debian/.debhelper/" + os.environ["DEB_DBG_SYMBOLS_REPO"] = deb_dbg_repo + os.makedirs(deb_dbg_repo, exist_ok=True) + + open(os.path.join(deb_dbg_repo, "debian-symbols-pool"), 'a').close() + + os.environ["DEB_BUILD_MAINT_OPTIONS"] = "debug" + + debian_date = formatdate(localtime=True) + + changelog = f"""\ +{package} ({deb_version}) unstable; urgency=low + + * Release {deb_version} (for sandcastle-ng). + + -- Taler Packaging Team <deb@taler.net> {debian_date} +""" + + with open("debian/changelog", "w") as f: + f.write(changelog) + + # Build Package + run_cmd(["dpkg-buildpackage", "-rfakeroot", "-b", "-uc", "-us"]) + + # Copy artifacts + # Globs for ../*.deb and ../*.ddeb relative to current dir + deb_files = glob.glob("../*.deb") + ddeb_files = glob.glob("../*.ddeb") + + outdir = f"/packages/{package}/" + + os.makedirs(outdir, exist_ok=True) + + for f in deb_files: + shutil.copy(f, outdir) + + for f in ddeb_files: + shutil.copy(f, outdir) + + print(f"Installing built packages from {build_pkg_path}/..", file=sys.stderr) + pkgdir_debs = glob.glob(f"{build_pkg_path}/../*.deb") + if pkgdir_debs: + run_cmd(["apt", "install", "-y"] + pkgdir_debs) + +if __name__ == "__main__": + main()