#!/bin/bash # Create a gnutls-*-win??ws.zip file based on MingW packages. # # Copyright 2018, Peter Wu # # SPDX-License-Identifier: (GPL-2.0-or-later or MIT) set -eu shopt -s extglob umask 22 # Packaging sources and information: # https://src.fedoraproject.org/rpms/mingw-gnutls/blob/f29/f/mingw-gnutls.spec # https://apps.fedoraproject.org/packages/mingw64-gnutls # # parse-fedorarepo.py --ignore binutils --ignore cpp --ignore headers --ignore gcc-c++ --ignore crt --ignore pkg-config --release 29 mingw64-gnutls mingw32-gnutls --downloadUsing cached file repomd.xml # # Dependency tree: # + mingw64-gnutls 3.6.3-1.fc29.noarch # + mingw64-gcc (mingw64(libgcc_s_seh-1.dll)) 8.2.0-3.fc29.x86_64 # + mingw64-winpthreads (mingw64(libwinpthread-1.dll)) # + mingw64-gmp (mingw64(libgmp-10.dll)) 6.1.2-4.fc29.noarch # + mingw64-gcc (mingw64(libgcc_s_seh-1.dll)) # + mingw64-nettle (mingw64(libhogweed-4.dll)) 3.4-2.fc29.noarch # + mingw64-gmp (mingw64(libgmp-10.dll)) # + mingw64-nettle (mingw64(libnettle-6.dll)) # + mingw64-p11-kit (mingw64(libp11-kit-0.dll)) 0.23.7-5.fc29.noarch # + mingw64-libffi (mingw64(libffi-6.dll)) 3.1-4.fc29.noarch # + mingw64-libtasn1 (mingw64(libtasn1-6.dll)) # + mingw64-libtasn1 (mingw64(libtasn1-6.dll)) 4.13-3.fc29.noarch # + mingw64-winpthreads (mingw64(libwinpthread-1.dll)) 5.0.4-2.fc29.noarch # + mingw64-libtasn1 # + mingw32-gnutls 3.6.3-1.fc29.noarch # + mingw32-gcc (mingw32(libgcc_s_sjlj-1.dll)) 8.2.0-3.fc29.x86_64 # + mingw32-winpthreads (mingw32(libwinpthread-1.dll)) # + mingw32-gmp (mingw32(libgmp-10.dll)) 6.1.2-4.fc29.noarch # + mingw32-gcc (mingw32(libgcc_s_sjlj-1.dll)) # + mingw32-nettle (mingw32(libhogweed-4.dll)) 3.4-2.fc29.noarch # + mingw32-gcc (mingw32(libgcc_s_sjlj-1.dll)) # + mingw32-gmp (mingw32(libgmp-10.dll)) # + mingw32-nettle (mingw32(libnettle-6.dll)) # + mingw32-p11-kit (mingw32(libp11-kit-0.dll)) 0.23.7-5.fc29.noarch # + mingw32-libffi (mingw32(libffi-6.dll)) 3.1-4.fc29.noarch # + mingw32-gcc (mingw32(libgcc_s_sjlj-1.dll)) # + mingw32-libtasn1 (mingw32(libtasn1-6.dll)) # + mingw32-libtasn1 (mingw32(libtasn1-6.dll)) 4.13-3.fc29.noarch # + mingw32-gcc (mingw32(libgcc_s_sjlj-1.dll)) # + mingw32-winpthreads (mingw32(libwinpthread-1.dll)) 5.0.4-2.fc29.noarch # + mingw32-libtasn1 # urls=( https://mirror.nl.leaseweb.net/fedora/linux/releases/29/Everything/x86_64/os/Packages/m/mingw64-gnutls-3.6.3-1.fc29.noarch.rpm https://mirror.nl.leaseweb.net/fedora/linux/releases/29/Everything/x86_64/os/Packages/m/mingw64-gcc-8.2.0-3.fc29.x86_64.rpm https://mirror.nl.leaseweb.net/fedora/linux/releases/29/Everything/x86_64/os/Packages/m/mingw64-gmp-6.1.2-4.fc29.noarch.rpm https://mirror.nl.leaseweb.net/fedora/linux/releases/29/Everything/x86_64/os/Packages/m/mingw64-nettle-3.4-2.fc29.noarch.rpm https://mirror.nl.leaseweb.net/fedora/linux/releases/29/Everything/x86_64/os/Packages/m/mingw64-p11-kit-0.23.7-5.fc29.noarch.rpm https://mirror.nl.leaseweb.net/fedora/linux/releases/29/Everything/x86_64/os/Packages/m/mingw64-libffi-3.1-4.fc29.noarch.rpm https://mirror.nl.leaseweb.net/fedora/linux/releases/29/Everything/x86_64/os/Packages/m/mingw64-libtasn1-4.13-3.fc29.noarch.rpm https://mirror.nl.leaseweb.net/fedora/linux/releases/29/Everything/x86_64/os/Packages/m/mingw64-winpthreads-5.0.4-2.fc29.noarch.rpm https://mirror.nl.leaseweb.net/fedora/linux/releases/29/Everything/x86_64/os/Packages/m/mingw32-gnutls-3.6.3-1.fc29.noarch.rpm https://mirror.nl.leaseweb.net/fedora/linux/releases/29/Everything/x86_64/os/Packages/m/mingw32-gcc-8.2.0-3.fc29.x86_64.rpm https://mirror.nl.leaseweb.net/fedora/linux/releases/29/Everything/x86_64/os/Packages/m/mingw32-gmp-6.1.2-4.fc29.noarch.rpm https://mirror.nl.leaseweb.net/fedora/linux/releases/29/Everything/x86_64/os/Packages/m/mingw32-nettle-3.4-2.fc29.noarch.rpm https://mirror.nl.leaseweb.net/fedora/linux/releases/29/Everything/x86_64/os/Packages/m/mingw32-p11-kit-0.23.7-5.fc29.noarch.rpm https://mirror.nl.leaseweb.net/fedora/linux/releases/29/Everything/x86_64/os/Packages/m/mingw32-libffi-3.1-4.fc29.noarch.rpm https://mirror.nl.leaseweb.net/fedora/linux/releases/29/Everything/x86_64/os/Packages/m/mingw32-libtasn1-4.13-3.fc29.noarch.rpm https://mirror.nl.leaseweb.net/fedora/linux/releases/29/Everything/x86_64/os/Packages/m/mingw32-winpthreads-5.0.4-2.fc29.noarch.rpm ) version=3.6.3-1 if [ -e usr ]; then echo "Remove usr/ before proceeding" exit 1 fi for prog in curl objdump llvm-dlltool; do if ! type "$prog" &>/dev/null; then echo "Missing program: $prog" exit 1 fi done # 1. Download .deb files if they are missing and verify integrity. for url in "${urls[@]}"; do filename="${url##*/}" if [ ! -e "$filename" ]; then echo "Retrieving $url" curl -O "$url" fi done sha256sum --check < 1 && /^$/ { exit } p { print "; unexpected objdump output:", $0; exit 1 } END { if (p < 2) { print "; cannot find export data section"; exit 1 } } ' > "$deffile" # Create .lib suitable for MSVC. Cannot use binutils dlltool as that creates # an import library (like the one found in lib/*.dll.a) that results in # broken executables. For example, assume executable foo.exe that uses fnA # (from liba.dll) and fnB (from libb.dll). Using link.exe (14.00.24215.1) # with these broken .lib files results in an import table that lists both # fnA and fnB under both liba.dll and libb.dll. Use of llvm-dlltool creates # the correct archive that uses Import Headers (like official MS tools). llvm-dlltool -m "$machine" -d "$deffile" -l "$libfile" rm -f "$deffile" } # 4. Install files, shrink their size and create a .zip. # .def files are only needed to create .lib files. Do not bother. # However, import libraries (.lib) files must be present. for prefix in usr/*; do case $prefix in usr/i686-w64-mingw32) machine=i386 destdir=gnutls-$version-win32ws ;; usr/x86_64-w64-mingw32) machine=i386:x86-64 destdir=gnutls-$version-win64ws ;; *) continue ;; esac rm -rf "$destdir" "$destdir.zip" mkdir -m755 "$destdir" "$destdir/bin" cp -va "$prefix/sys-root/mingw/include" "$destdir/" # Optional, but perhaps useful for debugging. cp -va "$prefix/sys-root/mingw/bin/"*.exe "$destdir/bin/" cp -va "$prefix/sys-root/mingw/bin/"*.dll "$destdir/bin/" for dllpath in "$destdir/bin/"*-*.dll; do make_implib "$machine" "$dllpath" done # Saves only 500K (7%), prefer unmodified files. #strip "$destdir/bin/"*.dll { echo "Downloaded from Fedora:" printf "%s\n" "${urls[@]}" printf "\nOther comments:\n" echo "- the .lib files were generated using llvm-dlltool based on .def files extracted from objdump -p foo.dll" #echo "- the .dll files were stripped (strip bin/*.dll)" } | sed 's/$/\r/' > "$destdir/README.Wireshark" # Create zip, but without extra info such as timestamp and uid/gid (-X) zip -Xr "$destdir.zip" "$destdir" done ls -l "gnutls-$version-win32ws.zip" "gnutls-$version-win64ws.zip"