build: win: change from win-iconv to GNU libiconv
- (zbar requires [0] iconv)
- issues [1][3] compiling win-iconv:
- pre-existing issue: lots of "-Wincompatible-pointer-types" warnings when compiling zbar with win-iconv
- new debian means newer GCC
- new GCC changed that [2] warning type to "error"
- GNU libiconv works as an alternative
- drawback: win-iconv is more minimal, it uses the win32 API to do most of the work
- still, is a 25+ year old GNU project with one release every ~2 years, so IMO fine
[0]: https://github.com/mchehab/zbar/blob/a549566ea11eb03622bd4458a1728ffe3f589163/README-windows.md
[1]: https://github.com/SomberNight/electrum/commit/cb00cb60cf9a0cb059dcac5e7acfe5186620cabe
[2]: https://gcc.gnu.org/pipermail/gcc-cvs/2023-December/394351.html
[3]: see snippet when compiling libzbar:
```
decoder.c: In function ‘zbar_decoder_reset’:
decoder.c:116:22: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
116 | memset(dcode, 0, (long)&dcode->buf_alloc - (long)dcode);
| ^
decoder.c:116:48: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
116 | memset(dcode, 0, (long)&dcode->buf_alloc - (long)dcode);
| ^
CC processor/libzbar_la-win.lo
/bin/bash ../libtool --tag=RC \
--mode=compile x86_64-w64-mingw32-windres -DHAVE_CONFIG_H -I. -I../include \
-I../include -o libzbar-rc.lo libzbar.rc
CC processor/libzbar_la-lock.lo
CC decoder/libzbar_la-qr_finder.lo
CC qrcode/libzbar_la-qrdec.lo
In file included from ./processor.h:26,
from processor/lock.c:25:
../include/config.h:423:9: warning: "_WIN32_WINNT" redefined
423 | #define _WIN32_WINNT 0x0500
| ^~~~~~~~~~~~
In file included from /usr/share/mingw-w64/include/corecrt.h:10,
from /usr/share/mingw-w64/include/crtdefs.h:10,
from /usr/share/mingw-w64/include/assert.h:15,
from processor/lock.c:24:
/usr/share/mingw-w64/include/_mingw.h:232:9: note: this is the location of the previous definition
232 | #define _WIN32_WINNT 0xa00
| ^~~~~~~~~~~~
libtool: compile: x86_64-w64-mingw32-windres -DHAVE_CONFIG_H -I. -I../include -I../include libzbar.rc -o .libs/libzbar-rc.o
CC qrcode/libzbar_la-qrdectxt.lo
CC qrcode/libzbar_la-rs.lo
CC qrcode/libzbar_la-isaac.lo
CC qrcode/libzbar_la-bch15_5.lo
CC qrcode/libzbar_la-binarize.lo
CC qrcode/libzbar_la-util.lo
In file included from ./image.h:26,
from qrcode/binarize.c:10:
../include/config.h:423:9: warning: "_WIN32_WINNT" redefined
423 | #define _WIN32_WINNT 0x0500
| ^~~~~~~~~~~~
In file included from /usr/share/mingw-w64/include/corecrt.h:10,
from /usr/share/mingw-w64/include/crtdefs.h:10,
from /usr/share/mingw-w64/include/math.h:13,
from qrcode/binarize.c:7:
/usr/share/mingw-w64/include/_mingw.h:232:9: note: this is the location of the previous definition
232 | #define _WIN32_WINNT 0xa00
| ^~~~~~~~~~~~
CC video/libzbar_la-dshow.lo
CC window/libzbar_la-win.lo
In file included from ./window.h:26,
from window/win.c:26:
../include/config.h:423:9: warning: "_WIN32_WINNT" redefined
423 | #define _WIN32_WINNT 0x0500
| ^~~~~~~~~~~~
In file included from /usr/share/mingw-w64/include/corecrt.h:10,
from /usr/share/mingw-w64/include/crtdefs.h:10,
from /usr/share/mingw-w64/include/ctype.h:9,
from window/win.c:24:
/usr/share/mingw-w64/include/_mingw.h:232:9: note: this is the location of the previous definition
232 | #define _WIN32_WINNT 0xa00
| ^~~~~~~~~~~~
In file included from ./processor.h:26,
from processor/win.c:29:
../include/config.h:423:9: warning: "_WIN32_WINNT" redefined
423 | #define _WIN32_WINNT 0x0500
| ^~~~~~~~~~~~
In file included from /usr/share/mingw-w64/include/corecrt.h:10,
from /usr/share/mingw-w64/include/crtdefs.h:10,
from /usr/share/mingw-w64/include/assert.h:15,
from processor/win.c:24:
/usr/share/mingw-w64/include/_mingw.h:232:9: note: this is the location of the previous definition
232 | #define _WIN32_WINNT 0xa00
| ^~~~~~~~~~~~
processor/win.c: In function ‘_zbar_processor_open’:
processor/win.c:282:47: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
282 | proc->display = CreateWindowEx(EXT_STYLE, (LPCTSTR)(long)wca, "ZBar",
| ^
processor/win.c: In function ‘_zbar_processor_close’:
processor/win.c:297:25: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
297 | UnregisterClass((LPCTSTR)(long)proc->state->registeredClass, 0);
| ^
CC window/libzbar_la-dib.lo
qrcode/qrdectxt.c: In function ‘qr_code_data_list_extract_text’:
qrcode/qrdectxt.c:302:62: error: passing argument 2 of ‘iconv’ from incompatible pointer type [-Wincompatible-pointer-types]
302 | iconv(utf8_cd, &in, &inleft, &out,
| ^~~
| |
| char **
In file included from qrcode/qrdectxt.c:12:
/usr/x86_64-w64-mingw32/include/iconv.h:43:56: note: expected ‘const char **’ but argument is of type ‘char **’
43 | size_t iconv(iconv_t cd, WINICONV_CONST char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft);
qrcode/qrdectxt.c:352:71: error: passing argument 2 of ‘iconv’ from incompatible pointer type [-Wincompatible-pointer-types]
352 | err = iconv(enc_list[ei], &in,
| ^~~
| |
| char **
/usr/x86_64-w64-mingw32/include/iconv.h:43:56: note: expected ‘const char **’ but argument is of type ‘char **’
43 | size_t iconv(iconv_t cd, WINICONV_CONST char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft);
qrcode/qrdectxt.c:374:53: error: passing argument 2 of ‘iconv’ from incompatible pointer type [-Wincompatible-pointer-types]
374 | iconv(eci_cd, &in, &inleft, &out,
| ^~~
| |
| char **
/usr/x86_64-w64-mingw32/include/iconv.h:43:56: note: expected ‘const char **’ but argument is of type ‘char **’
43 | size_t iconv(iconv_t cd, WINICONV_CONST char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft);
make[2]: *** [Makefile:1089: qrcode/libzbar_la-qrdectxt.lo] Error 1
make[2]: *** Waiting for unfinished jobs....
make[2]: Leaving directory '/opt/wine64/drive_c/electrum/contrib/zbar/zbar'
make[1]: *** [Makefile:1895: all-recursive] Error 1
make[1]: Leaving directory '/opt/wine64/drive_c/electrum/contrib/zbar'
make: *** [Makefile:989: all] Error 2
🗯 ERROR: Could not build zbar
🗯 ERROR: Could not build zbar
```
This commit is contained in:
@@ -22,6 +22,8 @@ RUN dpkg --add-architecture i386 && \
|
||||
git \
|
||||
p7zip-full \
|
||||
make \
|
||||
cmake \
|
||||
pkgconf \
|
||||
mingw-w64 \
|
||||
mingw-w64-tools \
|
||||
autotools-dev \
|
||||
|
||||
@@ -53,28 +53,34 @@ if [ -f "$DLL_TARGET_DIR/libzbar-0.dll" ]; then
|
||||
info "libzbar already built, skipping"
|
||||
else
|
||||
(
|
||||
# As debian bullseye doesn't provide win-iconv-mingw-w64-dev, we need to build it:
|
||||
WIN_ICONV_COMMIT="9f98392dfecadffd62572e73e9aba878e03496c4"
|
||||
# ^ tag "v0.0.8"
|
||||
info "Building win-iconv..."
|
||||
cd "$CACHEDIR"
|
||||
if [ ! -d win-iconv ]; then
|
||||
git clone https://github.com/win-iconv/win-iconv.git
|
||||
fi
|
||||
cd win-iconv
|
||||
if ! $(git cat-file -e ${WIN_ICONV_COMMIT}) ; then
|
||||
info "Could not find requested version $WIN_ICONV_COMMIT in local clone; fetching..."
|
||||
git fetch --all
|
||||
fi
|
||||
git reset --hard
|
||||
git clean -dfxq
|
||||
git checkout "${WIN_ICONV_COMMIT}^{commit}"
|
||||
|
||||
# note: "-j1" as parallel jobs lead to non-reproducibility seemingly due to ordering issues
|
||||
# see https://github.com/win-iconv/win-iconv/issues/42
|
||||
CC="${GCC_TRIPLET_HOST}-gcc" make -j1 || fail "Could not build win-iconv"
|
||||
# iconv is needed for zbar. see https://github.com/mchehab/zbar/blob/a549566ea11eb03622bd4458a1728ffe3f589163/README-windows.md
|
||||
# (previously were using win-iconv, but changed to GNU libiconv due to compilation errors with modern gcc)
|
||||
LIBICONV_VER="1.18"
|
||||
download_if_not_exist "$CACHEDIR/libiconv-${LIBICONV_VER}.tar.gz" "https://ftp.gnu.org/pub/gnu/libiconv/libiconv-${LIBICONV_VER}.tar.gz"
|
||||
verify_hash "$CACHEDIR/libiconv-${LIBICONV_VER}.tar.gz" "3b08f5f4f9b4eb82f151a7040bfd6fe6c6fb922efe4b1659c66ea933276965e8"
|
||||
tar xf "$CACHEDIR/libiconv-${LIBICONV_VER}.tar.gz" -C "$CACHEDIR"
|
||||
# ref https://github.com/msys2/MINGW-packages/blob/7f68e9f2488737bbe03888ade094eaee8021d1c5/mingw-w64-libiconv/PKGBUILD
|
||||
info "Building libiconv..."
|
||||
cd "$CACHEDIR/libiconv-${LIBICONV_VER}"
|
||||
# Patches taken from msys2/MINGW-packages
|
||||
patch -p1 < "$here/patches/libiconv-fix-pointer-buf.patch"
|
||||
./configure \
|
||||
$AUTOCONF_FLAGS \
|
||||
--prefix="/usr/${GCC_TRIPLET_HOST}" \
|
||||
--disable-static \
|
||||
--enable-shared \
|
||||
--enable-extra-encodings \
|
||||
--enable-relocatable \
|
||||
--disable-rpath \
|
||||
--enable-silent-rules \
|
||||
--enable-nls
|
||||
CC="${GCC_TRIPLET_HOST}-gcc" make "-j$CPU_COUNT" || fail "Could not build libiconv"
|
||||
cp -fpv "libcharset/lib/.libs/libcharset-1.dll" "$DLL_TARGET_DIR/" || fail "Could not copy the libcharset binary to DLL_TARGET_DIR"
|
||||
cp -fpv "lib/.libs/libiconv-2.dll" "$DLL_TARGET_DIR/" || fail "Could not copy the libiconv binary to DLL_TARGET_DIR"
|
||||
# FIXME avoid using sudo
|
||||
sudo make install prefix="/usr/${GCC_TRIPLET_HOST}" || fail "Could not install win-iconv"
|
||||
sudo make install || fail "Could not install libiconv"
|
||||
# workaround to delete files owned by root, created by "make install":
|
||||
make clean
|
||||
)
|
||||
"$CONTRIB"/make_zbar.sh || fail "Could not build zbar"
|
||||
fi
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
--- a/lib/iconv.c 2018-05-03 23:18:55.997221700 -0400
|
||||
+++ b/lib/iconv.c 2018-05-03 23:26:47.611682700 -0400
|
||||
@@ -170,12 +170,12 @@ static const struct stringpool2_t string
|
||||
#include "aliases2.h"
|
||||
#undef S
|
||||
};
|
||||
#define stringpool2 ((const char *) &stringpool2_contents)
|
||||
static const struct alias sysdep_aliases[] = {
|
||||
-#define S(tag,name,encoding_index) { (int)(long)&((struct stringpool2_t *)0)->stringpool_##tag, encoding_index },
|
||||
+#define S(tag,name,encoding_index) { (int)(intptr_t)&((struct stringpool2_t *)0)->stringpool_##tag, encoding_index },
|
||||
#include "aliases2.h"
|
||||
#undef S
|
||||
};
|
||||
#ifdef __GNUC__
|
||||
__inline
|
||||
#else
|
||||
--- a/lib/genaliases.c 2023-01-14 00:00:00.000000000 +0000
|
||||
+++ b/lib/genaliases.c 2023-01-14 10:18:00.000000000 +0000
|
||||
@@ -50,7 +50,7 @@
|
||||
putc(c, out2);
|
||||
}
|
||||
}
|
||||
- fprintf(out2,"\")' tmp.h | sed -e 's|^.*\\(stringpool_str[0-9]*\\).*$| (int)(long)\\&((struct stringpool_t *)0)->\\1,|'\n");
|
||||
+ fprintf(out2,"\")' tmp.h | sed -e 's|^.*\\(stringpool_str[0-9]*\\).*$| (int)(intptr_t)\\&((struct stringpool_t *)0)->\\1,|'\n");
|
||||
for (; n > 0; names++, n--)
|
||||
emit_alias(out1, *names, c_name);
|
||||
}
|
||||
--- a/lib/genaliases2.c 2023-01-14 00:00:00.000000000 +0000
|
||||
+++ b/lib/genaliases2.c 2023-01-14 10:18:00.000000000 +0000
|
||||
@@ -44,6 +44,6 @@
|
||||
static void emit_encoding (FILE* out1, FILE* out2, const char* tag, const char* const* names, size_t n, const char* c_name)
|
||||
{
|
||||
- fprintf(out2," (int)(long)&((struct stringpool2_t *)0)->stringpool_%s_%u,\n",tag,counter);
|
||||
+ fprintf(out2," (int)(intptr_t)&((struct stringpool2_t *)0)->stringpool_%s_%u,\n",tag,counter);
|
||||
for (; n > 0; names++, n--)
|
||||
emit_alias(out1, tag, *names, c_name);
|
||||
}
|
||||
@@ -53,9 +53,7 @@ $WINE_PYTHON -m pip install --no-build-isolation --no-dependencies --no-binary :
|
||||
|
||||
|
||||
# copy already built DLLs
|
||||
cp "$DLL_TARGET_DIR"/libsecp256k1-*.dll $WINEPREFIX/drive_c/electrum/electrum/ || fail "Could not copy libsecp to its destination"
|
||||
cp "$DLL_TARGET_DIR/libzbar-0.dll" $WINEPREFIX/drive_c/electrum/electrum/ || fail "Could not copy libzbar to its destination"
|
||||
cp "$DLL_TARGET_DIR/libusb-1.0.dll" $WINEPREFIX/drive_c/electrum/electrum/ || fail "Could not copy libusb to its destination"
|
||||
cp "$DLL_TARGET_DIR"/*.dll "$WINEPREFIX/drive_c/electrum/electrum/" || fail "Could not copy DLLs to destination"
|
||||
|
||||
|
||||
info "Building PyInstaller."
|
||||
|
||||
Reference in New Issue
Block a user