#!/bin/sh -e resolve_package() { for pkg in "$@" do apk info "$pkg" | head -n1 | awk '{print $1}' done } strip_version_from_pkg_name() { for pkg in "$@" do echo "$pkg" | sed 's,-[0-9a-zA-Z.]\+-r[0-9]\+$,,' done } find_runtime_dependency_pkgs() { for p in "$@" do ldd "$p" 2>/dev/null |\ grep '=> .\+\.so' |\ awk '{print $3}' |\ sort |\ uniq |\ while read -r so do apk info --who-owns $so done |\ awk '{print $5}' |\ awk -F- '{print $1}' done } find_devel_pkg() { # shellcheck disable=SC2046 strip_version_from_pkg_name $( apk list -d "$1" |\ grep dev |\ sort |\ uniq |\ awk '{print $1}' ) } # retrieve configure args of already packaged nginx NGINX_CONFIGURE_ARGS="$(nginx -V 2>&1 | grep -o '^configure arguments: .*$' | sed 's,^configure arguments: ,,g')" # remove preconfigured dynamic modules so only ours will be placed in the objs folder NGINX_CONFIGURE_ARGS="$(printf '%s' "$NGINX_CONFIGURE_ARGS" | sed 's,--with-[^=]\+module=dynamic,,g')" apk update # Determine all dependencies used for the packaged nginx and install them DEPENDENCIES="$( find_runtime_dependency_pkgs /usr/lib/nginx/modules/*.so # shellcheck disable=SC2046 strip_version_from_pkg_name $(resolve_package $(apk info -R nginx | tail -n+2)) )" DEVPACKAGES="$(for dep in $DEPENDENCIES; do find_devel_pkg "$dep"; done | sort | uniq)" apk add --virtual .build-deps \ gcc \ libc-dev \ make \ linux-headers \ $DEVPACKAGES tar -zx -f nginx.tar.gz rm nginx.tar.gz cd nginx-*/ ./configure $NGINX_CONFIGURE_ARGS --add-dynamic-module=../module --with-debug make modules . /etc/os-release versionsuffix="$ID$VERSION_ID-nginx$NGINX_VERSION" find_runtime_dependency_pkgs objs/*.so > "../required_packages-$versionsuffix.txt" for so in objs/*.so do name="$(basename "$so" .so)-$versionsuffix.so" install -m644 "$so" "../$name" done