summaryrefslogtreecommitdiff
path: root/windows-libs/make-libgcrypt-libs-zip.sh
blob: a178ba336282a580fb9a5bc7d62863484ccb2970 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#!/bin/bash
# Create a libgcrypt-*-win??ws.zip file based on MingW packages.
#
# Copyright 2018, Peter Wu <peter@lekensteyn.nl>
#
# SPDX-License-Identifier: (GPL-2.0-or-later or MIT)
set -eu

# Debian buster (already contains --disable-padlock-support --disable-asm)
# https://packages.debian.org/buster/libgcrypt-mingw-w64-dev
# https://packages.debian.org/buster/libgpg-error-mingw-w64-dev
# https://salsa.debian.org/gnutls-team/libgcrypt/blob/1.8.3-1/debian/rules
# https://salsa.debian.org/debian/libgpg-error/blob/debian/1.32-1/debian/rules
urls=(
http://ftp.nl.debian.org/debian/pool/main/libg/libgcrypt20/libgcrypt-mingw-w64-dev_1.8.3-1_all.deb
http://ftp.nl.debian.org/debian/pool/main/libg/libgpg-error/libgpg-error-mingw-w64-dev_1.32-1_all.deb
)
version=1.8.3

if [ -e usr ]; then
    echo "Remove usr/ before proceeding"
    exit 1
fi

# 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 <<SHA256
ff5eae9c905a7a9ca2cdd8ff8334e2a1f5846aa30c0e589b0ee74cd7560472ae  libgcrypt-mingw-w64-dev_1.8.3-1_all.deb
a4be1f60fa9035db79015ab2f4fa2c222233d19bbdd791ebdeaa3e5934254cae  libgpg-error-mingw-w64-dev_1.32-1_all.deb
SHA256

# 2. Unpack files.
for url in "${urls[@]}"; do
    filename="${url##*/}"
    bsdtar -xOf "$filename" data.tar.xz |
    bsdtar -xJvf- usr/x86_64-w64-mingw32 usr/i686-w64-mingw32
done

# 3. Patch header
echo "Patching ssize_t in gcrypt.h"
sed 's,typedef long ssize_t;,/*&*/,' -i usr/*/include/gcrypt.h

# 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) destdir=libgcrypt-$version-win32ws ;;
    usr/x86_64-w64-mingw32) destdir=libgcrypt-$version-win64ws ;;
    *) continue ;;
    esac
    rm -rf "$destdir" "$destdir.zip"

    mkdir -m755 "$destdir" "$destdir/bin"
    cp -va "$prefix/include" "$destdir/"
    cp -va "$prefix/lib/libgcrypt.dll.a" "$destdir/bin/libgcrypt-20.lib"
    cp -va "$prefix/lib/libgpg-error.dll.a" "$destdir/bin/libgpg-error-0.lib"
    cp -va "$prefix/bin/"*.dll "$destdir/bin/"
    strip "$destdir/bin/"*.dll

    {
        echo "Downloaded from Debian Buster:"
        printf "%s\n" "${urls[@]}"
        printf "\nOther comments:\n"
        echo "- libgcrypt was compiled with --disable-asm and --disable-padlock-support flags"
        echo "- the ssize_t typedef was commented out in gcrypt.h; we define it elsewhere"
        echo "- lib/*.dll.a files were moved to bin/*.lib (including a version number based on the lib/*.dll file)"
        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 "libgcrypt-$version-win32ws.zip" "libgcrypt-$version-win64ws.zip"