From b337f3d4039bd4a666b2ef6f52ee4be4c4c97f45 Mon Sep 17 00:00:00 2001 From: Paul Adelsbach Date: Wed, 10 Sep 2025 15:40:53 -0700 Subject: [PATCH] Cleanup Debian packaging flow --- .github/workflows/debian-package.yml | 9 +++++--- .gitignore | 21 +++++------------- debian/control | 1 - debian/libssl-dev.install | 2 -- debian/libssl-dev.links | 7 ++++++ debian/rules | 19 +++++++++++----- scripts/build-debian.sh | 7 ++++-- scripts/build-wolfprovider.sh | 2 +- .../tests/.libs/test_sha256_simple.standalone | Bin 36176 -> 0 bytes 9 files changed, 38 insertions(+), 30 deletions(-) create mode 100644 debian/libssl-dev.links delete mode 100755 test/standalone/tests/.libs/test_sha256_simple.standalone diff --git a/.github/workflows/debian-package.yml b/.github/workflows/debian-package.yml index 5e5bb868..cd4f358f 100644 --- a/.github/workflows/debian-package.yml +++ b/.github/workflows/debian-package.yml @@ -14,6 +14,9 @@ jobs: image: debian:bookworm # or debian:bookworm-slim env: DEBIAN_FRONTEND: noninteractive + strategy: + matrix: + debug_flag: [ '', '--debug' ] steps: - name: Set up environment run: | @@ -84,7 +87,7 @@ jobs: - name: Build Debian package run: | # Bypass the warning prompt with 'yes Y' - yes Y | ./scripts/build-wolfprovider.sh --debian $FIPS_FLAG + yes Y | ./scripts/build-wolfprovider.sh --debian ${{ matrix.debug_flag }} # List generated packages echo "Generated Packages:" @@ -202,12 +205,12 @@ jobs: if: always() uses: actions/upload-artifact@v4 with: - name: wolfprovider-debian-packages + name: wolfprovider-debian-packages${{ matrix.debug_flag }} path: | /tmp/wolfprov-packages/*.deb /tmp/wolfprov-packages/*.dsc /tmp/wolfprov-packages/*.tar.gz - retention-days: 7 + retention-days: 2 libwolfprov-with-openssl: runs-on: ubuntu-22.04 diff --git a/.gitignore b/.gitignore index 2b2f58b9..5e86d412 100644 --- a/.gitignore +++ b/.gitignore @@ -112,20 +112,9 @@ debian/libwolfprov* debian/libssl-dev* debian/openssl* debian/libssl3* -!debian/libwolfprov.install -!debian/libwolfprov.postinst -!debian/libwolfprov.postrm -!debian/libwolfprov-dev.docs -!debian/libwolfprov-dev.install -!debian/openssl.cnf -!debian/openssl.install -!debian/openssl.postinst -!debian/openssl.postrm -!debian/libssl3.postinst -!debian/libssl3.postrm -!debian/libssl3.install -!debian/libssl3.docs -!debian/libssl3.install -!debian/libssl3.postinst -!debian/libssl3.postrm +!debian/*.install +!debian/*.postinst +!debian/*.postrm +!debian/*.docs +!debian/*.links diff --git a/debian/control b/debian/control index 992b65e4..25dcd83a 100644 --- a/debian/control +++ b/debian/control @@ -8,7 +8,6 @@ Build-Depends: debhelper-compat (= 13), devscripts, dh-exec, - openssl, git, pkgconf, libwolfssl-dev diff --git a/debian/libssl-dev.install b/debian/libssl-dev.install index 049ee3ed..b18f6b24 100755 --- a/debian/libssl-dev.install +++ b/debian/libssl-dev.install @@ -1,7 +1,5 @@ #!/usr/bin/dh-exec usr/include/openssl/** -usr/lib/${DEB_HOST_MULTIARCH}/libcrypto.so -usr/lib/${DEB_HOST_MULTIARCH}/libssl.so usr/lib/${DEB_HOST_MULTIARCH}/pkgconfig/openssl.pc usr/lib/${DEB_HOST_MULTIARCH}/pkgconfig/libcrypto.pc usr/lib/${DEB_HOST_MULTIARCH}/pkgconfig/libssl.pc \ No newline at end of file diff --git a/debian/libssl-dev.links b/debian/libssl-dev.links new file mode 100644 index 00000000..584cd66f --- /dev/null +++ b/debian/libssl-dev.links @@ -0,0 +1,7 @@ +#!/usr/bin/dh-exec + +# Create symlinks for the shared libs rather than pulling in the full versioned files +# This avoids issues with soname mismatches for applications linking against +# libssl and libcrypto. +usr/lib/$(DEB_HOST_MULTIARCH)/libssl.so usr/lib/$(DEB_HOST_MULTIARCH)/libssl.so.3 +usr/lib/$(DEB_HOST_MULTIARCH)/libcrypto.so usr/lib/$(DEB_HOST_MULTIARCH)/libcrypto.so.3 \ No newline at end of file diff --git a/debian/rules b/debian/rules index 284884b5..9ce75506 100755 --- a/debian/rules +++ b/debian/rules @@ -21,7 +21,7 @@ ifeq ($(WOLFSSL_ISFIPS),1) VARIANT := fips VARIANT_DESC := FIPS build VARIANT_PROVIDES := libwolfprov-fips - VERSION := $(BASEVER)+fips + VERSION := $(BASEVER)-fips FIPS_FLAG := --enable-fips PROVIDER_CONF := provider-fips.conf else @@ -33,12 +33,21 @@ else FIPS_FLAG := endif +# Debug build flag +WOLFPROV_DEBUG?=0 +ifeq ($(WOLFPROV_DEBUG),1) + VARIANT := $(VARIANT)-debug + VARIANT_DESC := $(VARIANT_DESC) with debug logs + VERSION := $(VERSION)-debug +endif + override_dh_auto_configure: # None, handled below override_dh_auto_build: - # Always build OpenSSL with wolfProvider as the default provider - WOLFPROV_BUILD_DEBIAN=1 ./scripts/build-wolfprovider.sh --replace-default $(FIPS_FLAG) + # Always build OpenSSL with wolfProvider as the default provider even + # if we choose not to use it. + WOLFPROV_BUILD_DEBIAN=1 WOLFPROV_DEBUG=$(WOLFPROV_DEBUG) ./scripts/build-wolfprovider.sh --replace-default $(FIPS_FLAG) override_dh_auto_install: # Detect OpenSSL library directory (lib or lib64) @@ -51,8 +60,8 @@ override_dh_auto_install: # Install OpenSSL shared libraries for libssl3 package install -d $(DESTDIR)/usr/lib/$(DEB_HOST_MULTIARCH) - install -m755 ./openssl-install/$(OPENSSL_LIB_DIR)/libssl.so* \ - ./openssl-install/$(OPENSSL_LIB_DIR)/libcrypto.so* \ + install -m755 ./openssl-install/$(OPENSSL_LIB_DIR)/libssl.so.3 \ + ./openssl-install/$(OPENSSL_LIB_DIR)/libcrypto.so.3 \ $(DESTDIR)/usr/lib/$(DEB_HOST_MULTIARCH)/ # Install OpenSSL headers and dev files for libssl-dev package diff --git a/scripts/build-debian.sh b/scripts/build-debian.sh index 6c6bbc1b..f08d3f3e 100755 --- a/scripts/build-debian.sh +++ b/scripts/build-debian.sh @@ -20,6 +20,9 @@ set -euo pipefail PKG_NAME="libwolfprov" +WOLFSSL_ISFIPS=${WOLFSSL_ISFIPS:-0} +WOLFPROV_DEBUG=${WOLFPROV_DEBUG:-0} + # Step 1: Determine the repo root REPO_ROOT=$(git rev-parse --show-toplevel) cd "$REPO_ROOT" @@ -110,7 +113,7 @@ git archive --format=tar.gz --prefix="${TARBALL_PREFIX}/" \ # Step 10: Build package echo "⚙️ Building package..." -WOLFSSL_ISFIPS=${WOLFSSL_ISFIPS:-0} -debuild -e WOLFSSL_ISFIPS -us -uc +# Use nostrip to avoid building the -dbgsym package +DEB_BUILD_OPTIONS="nostrip" debuild -e WOLFSSL_ISFIPS -e WOLFPROV_DEBUG -us -uc echo "✅ Build completed for version $VERSION" diff --git a/scripts/build-wolfprovider.sh b/scripts/build-wolfprovider.sh index ad25d106..9488c464 100755 --- a/scripts/build-wolfprovider.sh +++ b/scripts/build-wolfprovider.sh @@ -144,7 +144,7 @@ fi if [ -n "$build_debian" ]; then echo "Building Debian package..." - WOLFSSL_ISFIPS=${WOLFSSL_ISFIPS:-0} ./scripts/build-debian.sh + WOLFSSL_ISFIPS=${WOLFSSL_ISFIPS:-0} WOLFPROV_DEBUG=${WOLFPROV_DEBUG:-0} ./scripts/build-debian.sh exit $? fi diff --git a/test/standalone/tests/.libs/test_sha256_simple.standalone b/test/standalone/tests/.libs/test_sha256_simple.standalone deleted file mode 100755 index e47d2b431a74c4015ceb4b41ddef248a535b4527..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36176 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 DvP`U3