diff --git a/emulators/wine-devel/Makefile b/emulators/wine-devel/Makefile index a3659db22d33..11a96abed229 100644 --- a/emulators/wine-devel/Makefile +++ b/emulators/wine-devel/Makefile @@ -1,177 +1,177 @@ PORTNAME= wine DISTVERSION= 8.19 PORTEPOCH= 1 CATEGORIES= emulators MASTER_SITES= https://dl.winehq.org/wine/source/8.x/ PKGNAMESUFFIX= -devel MAINTAINER= ports@FreeBSD.org COMMENT= Microsoft Windows compatibility environment WWW= https://www.winehq.org LICENSE= LGPL21 LGPL3 LICENSE_COMB= dual LICENSE_FILE= ${WRKSRC}/LICENSE ONLY_FOR_ARCHS= amd64 i386 -BROKEN_i386= fails to build: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=271201\#c6 BUILD_DEPENDS= ${LOCALBASE}/bin/flex:textproc/flex llvm${_LLVM_VERSION}>=0:devel/llvm${_LLVM_VERSION} USES= bison cpe desktop-file-utils gmake localbase \ pkgconfig sdl shebangfix tar:xz USE_GCC= yes USE_SDL= sdl2 CPE_VENDOR= winehq CONFLICTS_INSTALL= wine GNU_CONFIGURE= yes CONFIGURE_ARGS+=--verbose \ --disable-kerberos \ --disable-tests \ --without-capi \ --without-coreaudio \ --without-dbus \ --without-gettext --without-gettextpo \ --without-gphoto \ --without-gssapi \ --without-inotify \ --without-krb5 \ --with-mingw CROSSCC="clang" CROSSCFLAGS="-isystem ${FILESDIR}/clang" \ --without-netapi \ --without-opencl \ --without-osmesa \ --without-pcap \ --without-pcsclite \ --with-pthread \ --without-pulse \ --without-sane \ --with-sdl \ --without-udev \ --without-unwind \ --without-usb \ --without-wayland CONFIGURE_ENV= CPPBIN="${CPP}" FLEX="${LOCALBASE}/bin/flex" WINELIBDIR= ${PREFIX}/lib .if !defined(USE_LDCONFIG32) USE_LDCONFIG= ${WINELIBDIR} ${WINELIBDIR}/wine .endif SHEBANG_FILES= tools/make_requests tools/winemaker/winemaker \ tools/winedump/function_grep.pl BINARY_ALIAS+= clang=${LOCALBASE}/bin/clang${_LLVM_VERSION} \ lld-link=${LOCALBASE}/bin/lld-link${_LLVM_VERSION} SUB_FILES= pkg-message PORTDATA= wine.inf OPTIONS_DEFINE= CUPS DOCS DOSBOX GNUTLS V4L WINEMAKER X11 GECKO MONO OPTIONS_DEFAULT=ALSA GNUTLS X11 OPTIONS_RADIO= AUDIO OPTIONS_RADIO_AUDIO= ALSA OSS OPTIONS_SUB= yes DOSBOX_DESC= Use DOSBox to run MS-DOS programs WINEMAKER_DESC= Fully support winemaker (requires Perl) GECKO_DESC= Bundle Gecko MSI package for Wine MONO_DESC= Bundle Mono MSI package for Wine ALSA_CONFIGURE_WITH= alsa ALSA_USES= gstreamer ALSA_LIB_DEPENDS= libasound.so:audio/alsa-lib ALSA_RUN_DEPENDS= alsa-plugins>0:audio/alsa-plugins CUPS_CONFIGURE_WITH= cups CUPS_LIB_DEPENDS= libcups.so:print/cups DOSBOX_RUN_DEPENDS= dosbox:emulators/dosbox GECKO_RUN_DEPENDS= wine-gecko-devel>0:emulators/wine-gecko-devel GNUTLS_CONFIGURE_WITH= gnutls GNUTLS_LIB_DEPENDS= libgnutls.so:security/gnutls MONO_RUN_DEPENDS= wine-mono-devel>0:emulators/wine-mono-devel OSS_CONFIGURE_WITH= oss OSS_USES= gstreamer V4L_CONFIGURE_WITH= v4l2 V4L_BUILD_DEPENDS= ${LOCALBASE}/include/linux/videodev2.h:multimedia/v4l_compat V4L_LIB_DEPENDS= libv4l2.so:multimedia/libv4l WINEMAKER_RUN_DEPENDS= p5-XML-LibXML>0:textproc/p5-XML-LibXML X11_CONFIGURE_WITH= x fontconfig freetype opengl xinerama xinput2 xrandr xrender X11_USES= gl xorg X11_USE= GL=glu XORG=x11,xext,xcomposite,xcursor,xi,xinerama,xrandr,xrender X11_LIB_DEPENDS= libfontconfig.so:x11-fonts/fontconfig \ libfreetype.so:print/freetype2 \ libvulkan.so:graphics/vulkan-loader .include .if ${PORT_OPTIONS:MALSA} || ${PORT_OPTIONS:MOSS} CONFIGURE_ARGS+= --with-gstreamer PLIST_SUB+= GSTREAMER="" .else CONFIGURE_ARGS+= --without-gstreamer PLIST_SUB+= GSTREAMER="@comment " .endif .if (${LLVM_DEFAULT} == 10 || ${LLVM_DEFAULT} == 11) _LLVM_VERSION= 15 .else _LLVM_VERSION= ${LLVM_DEFAULT} .endif .if ${ARCH} == amd64 # Wine is composed of three parts: # - wine (aka this port on FreeBSD/i386) is the 32-bit component # and runs 32-bit programs. # - wine64 (aka this part of this port on FreeBSD/amd64) is the # 64-bit component and runs 64-bit programs. # - wow64 (aka this port built on FreeBSD/i386) is a part of the # 64-bit component [wine64] that runs 32-bit programs on FreeBSD/amd64. # --libdir is required since Wine defaults to "${PREFIX}/lib64" on amd64. CONFIGURE_ARGS+= --enable-win64 --libdir=${PREFIX}/lib PLIST_SUB+= WINE32="@comment " WINE64="" WINEARCH="x86_64" # Wine assumes a WoW64 package is available, which is not the case on # FreeBSD yet. post-patch: ${REINPLACE_CMD} '/Exec/s|wine|wine64|g' ${WRKSRC}/loader/wine.desktop .else +EXTRA_PATCHES+= files/extra-patch-tools-winebuild-res32 PLIST_SUB+= WINE32="" WINE64="@comment " WINEARCH="i386" .endif pre-build: cd ${WRKSRC} && ${MAKE_CMD} depend post-install: .if ${ARCH} == i386 ${MV} ${STAGEDIR}${PREFIX}/bin/wineserver ${STAGEDIR}${PREFIX}/bin/wineserver32 ${MV} ${STAGEDIR}${PREFIX}/bin/wine ${STAGEDIR}${PREFIX}/bin/wine.bin -${ELFCTL} -e +noaslr ${STAGEDIR}${PREFIX}/bin/wine.bin ${INSTALL_SCRIPT} ${FILESDIR}/wine.sh ${STAGEDIR}${PREFIX}/bin/wine .else ${MV} ${STAGEDIR}${PREFIX}/bin/wine64 ${STAGEDIR}${PREFIX}/bin/wine64.bin -${ELFCTL} -e +noaslr ${STAGEDIR}${PREFIX}/bin/wine64.bin ${INSTALL_SCRIPT} ${FILESDIR}/wine.sh ${STAGEDIR}${PREFIX}/bin/wine64 ${INSTALL_SCRIPT} ${FILESDIR}/wine-wow64.sh ${STAGEDIR}${PREFIX}/bin/wine ${INSTALL_SCRIPT} ${FILESDIR}/pkg32.sh ${STAGEDIR}${DATADIR}/pkg32.sh .endif @${MKDIR} ${STAGEDIR}${DOCSDIR} .for i in README ANNOUNCE AUTHORS ${INSTALL_DATA} ${WRKSRC}/${i} ${STAGEDIR}${DOCSDIR} .endfor ${INSTALL_DATA} ${WRKSRC}/programs/winedbg/README ${STAGEDIR}${DOCSDIR}/README.winedbg ${INSTALL_DATA} ${WRKSRC}/tools/winedump/README ${STAGEDIR}${DOCSDIR}/README.winedump .include diff --git a/emulators/wine-devel/files/extra-patch-tools-winebuild-res32 b/emulators/wine-devel/files/extra-patch-tools-winebuild-res32 new file mode 100644 index 000000000000..7c6c62b9fe58 --- /dev/null +++ b/emulators/wine-devel/files/extra-patch-tools-winebuild-res32 @@ -0,0 +1,95 @@ +The upstream change + + commit 0b3f90ab1485d5bd32bd72d41c7fd8213b3b95b9 + Author: RĂ©mi Bernon + Date: Sat Feb 11 11:05:22 2023 +0100 + + winebuild: Use .incbin instead of printf for resource data. + +apparently causes some (not completely reproducible) build +issues on i386 due to resource exhaustion by the compiler, +cf. https://bugs.winehq.org/show_bug.cgi?id=54889 . + +https://github.com/llvm/llvm-project/issues/62339 tracks this on +the LLVM side, alas has not really seen progress since April 2003. +So for now this reverts the upstream commit (alas on i386 only as +to minimize divergence and risk on 64-bit x86). + + +--- tools/winebuild/res32.c ++++ tools/winebuild/res32.c +@@ -44,8 +44,6 @@ struct resource + { + struct string_id type; + struct string_id name; +- const char *input_name; +- unsigned int input_offset; + const void *data; + unsigned int data_size; + unsigned int data_offset; +@@ -158,6 +156,28 @@ static void put_string( const struct string_id *str ) + } + } + ++static void dump_res_data( const struct resource *res ) ++{ ++ unsigned int i = 0; ++ unsigned int size = (res->data_size + 3) & ~3; ++ ++ if (!size) return; ++ ++ input_buffer = res->data; ++ input_buffer_pos = 0; ++ input_buffer_size = size; ++ ++ output( "\t.long " ); ++ while (size > 4) ++ { ++ if ((i++ % 16) == 15) output( "0x%08x\n\t.long ", get_dword() ); ++ else output( "0x%08x,", get_dword() ); ++ size -= 4; ++ } ++ output( "0x%08x\n", get_dword() ); ++ assert( input_buffer_pos == input_buffer_size ); ++} ++ + /* check the file header */ + /* all values must be zero except header size */ + static int check_header(void) +@@ -179,7 +199,7 @@ static int check_header(void) + } + + /* load the next resource from the current file */ +-static void load_next_resource( DLLSPEC *spec, const char *name ) ++static void load_next_resource( DLLSPEC *spec ) + { + unsigned int hdr_size; + struct resource *res = add_resource( spec ); +@@ -189,9 +209,6 @@ static void load_next_resource( DLLSPEC *spec, const char *name ) + if (hdr_size & 3) fatal_error( "%s header size not aligned\n", input_buffer_filename ); + if (hdr_size < 32) fatal_error( "%s invalid header size %u\n", input_buffer_filename, hdr_size ); + +- res->input_name = xstrdup( name ); +- res->input_offset = input_buffer_pos - 2*sizeof(unsigned int) + hdr_size; +- + res->data = input_buffer + input_buffer_pos - 2*sizeof(unsigned int) + hdr_size; + if ((const unsigned char *)res->data < input_buffer || + (const unsigned char *)res->data >= input_buffer + input_buffer_size) +@@ -220,7 +237,7 @@ int load_res32_file( const char *name, DLLSPEC *spec ) + + if ((ret = check_header())) + { +- while (input_buffer_pos < input_buffer_size) load_next_resource( spec, name ); ++ while (input_buffer_pos < input_buffer_size) load_next_resource( spec ); + } + return ret; + } +@@ -473,7 +490,7 @@ void output_resources( DLLSPEC *spec ) + { + output( "\n\t.balign 4\n" ); + output( ".L__wine_spec_res_%d:\n", i ); +- output( "\t.incbin \"%s\",%d,%d\n", res->input_name, res->input_offset, res->data_size ); ++ dump_res_data( res ); + } + + if (!is_pe())