# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:ft=tcl:et:sw=4:ts=4:sts=4

PortSystem                  1.0
PortGroup                   compiler_blacklist_versions 1.0
PortGroup                   github 1.0
PortGroup                   muniversal 1.1

# Keep the wine-stable, wine-devel and wine-crossover portfiles as similar as possible.

github.setup                wine-mirror wine 9.21 wine-
github.tarball_from         archive
name                        wine-devel
conflicts                   wine-stable wine-staging wine-crossover
set my_name                 wine
revision                    1
platforms                   {darwin >= 19}
set branch                  [lindex [split ${version} .] 0].x
license                     LGPL-2.1+
categories                  emulators
supported_archs             x86_64
maintainers                 {@Gcenx gmail.com:gcenx83}
homepage                    https://www.winehq.org
dist_subdir                 ${my_name}

description \
    A Windows API implementation

long_description \
    Wine is a compatibility layer capable of running \
    Windows applications. \
    Instead of simulating internal Windows logic like \
    a virtual machine or emulator, Wine translates \
    Windows API calls into POSIX calls on-the-fly, \
    eliminating the performance and memory penalties \
    of other methods and allowing you to cleanly \
    integrate Windows applications into your desktop.

checksums \
    ${distname}${extract.suffix} \
    rmd160  9df39caf3f99be28c1fc73bda63edb8374fda62b \
    sha256  10dbc38de71950da5f8535d419f984a218be48641f54ab98830dd8415a6d9e75 \
    size    51733008

depends_build \
    port:bison \
    bin:flex:flex \
    port:gettext \
    port:mingw-w64 \
    path:bin/pkg-config:pkgconfig

depends_lib \
    port:freetype \
    port:gettext-runtime \
    path:lib/pkgconfig/gnutls.pc:gnutls \
    path:lib/libMoltenVK.dylib:MoltenVK-latest \
    port:libpcap \
    port:libsdl2

depends_run \
    port:mingw-w64-wine-gecko-2.47.4 \
    port:mingw-w64-wine-mono-9.3.0

patch.pre_args-replace -p0 -p1

patchfiles-append \
    0001-winemac.drv-no-flicker-patch.diff

# Some required hacks to make wine work better on macOS & Rosetta2
patchfiles-append \
    0002-macos_hacks.diff

# wine requires the program specified in INSTALL to create intermediate
# directories; /usr/bin/install doesn't.
# http://bugs.winehq.org/show_bug.cgi?id=35310
configure.install \
    ${worksrcpath}/tools/install-sh

configure.args.x86_64 \
    --enable-archs=i386,x86_64 \
    --enable-win64

configure.args \
    --disable-tests \
    --without-alsa \
    --without-capi \
    --with-coreaudio \
    --with-cups \
    --without-dbus \
    --without-ffmpeg \
    --without-fontconfig \
    --with-freetype \
    --with-gettext \
    --without-gettextpo \
    --without-gphoto \
    --with-gnutls \
    --without-gssapi \
    --without-gstreamer \
    --without-inotify \
    --without-krb5 \
    --with-mingw \
    --without-netapi \
    --with-opencl \
    --with-opengl \
    --without-oss \
    --with-pcap \
    --with-pcsclite \
    --with-pthread \
    --without-pulse \
    --without-sane \
    --with-sdl \
    --without-udev \
    --with-unwind \
    --without-usb \
    --without-v4l2 \
    --with-vulkan \
    --without-wayland \
    --without-x

configure.env-append        ac_cv_lib_soname_vulkan=

# We need to tell the linker to add MacPorts to the rpath stack.
configure.ldflags-append    -Wl,-rpath,${compiler.library_path}

# wine requires clang >= 3.8
# FSF GCC cannot compile code using Apple's "blocks" language extensions
compiler.blacklist-append   {*gcc*} {clang < 800} {macports-clang-3.*}

# Setting an older deployment target avoids build error with MacOSX15.sdk
# https://gitlab.winehq.org/wine/wine/-/merge_requests/5935#note_74758
macosx_deployment_target    10.15

if {${subport} eq "wine-devel"} {
    patchfiles-append       1001-devel-msync.diff
}

subport wine-staging {
    conflicts               wine-stable wine-devel wine-crossover
    set staging_version     ${version}
    set wine_staging_distfile v${staging_version}${extract.suffix}
    distfiles-append        ${wine_staging_distfile}:stagingsource
    master_sites-append     https://github.com/wine-staging/wine-staging/archive/:stagingsource
    worksrcdir              wine-${distname}
    extract.rename          no

    checksums-append \
        ${wine_staging_distfile} \
        rmd160  61f5912f617b47274545bf0941802f3f6b20d37c \
        sha256  2e8c9cf9e378f99de133c7d86f9f0d5d506305869f4c802cb598f97b2f6bf8a6 \
        size    9564841

    depends_patch-append    port:autoconf

    # Applying staging after other patchfiles to avoid problems
    post-patch {
        system -W ${worksrcpath} \
            "${workpath}/wine-staging-${staging_version}/staging/patchinstall.py --all -W eventfd_synchronization -W ntdll-Syscall_Emulation -W winemac.drv-no-flicker-patch"
        system -W ${worksrcpath} \
            "patch -p1 < ${filespath}/1001-staging-msync.diff"
    }
}

# Makes destroot take significantly longer
variant dev description "Install ${subport} development environment" {
    build.target            all
    destroot.target-append  install-dev
}

variant gphoto description "Build ${subport} with support for digital cameras" {
    depends_lib-append      port:libgphoto2
    configure.args-replace  --without-gphoto --with-gphoto
}

variant ffmpeg description "Build ${subport} with FFmpeg-based implementation for the MF byte stream handlers" {
    # Use the same version of ffmpeg as gstreamer1-gst-libav
    set ffmpeg_ver          6
    depends_lib-append      port:ffmpeg${ffmpeg_ver}
    configure.args-replace  --without-ffmpeg --with-ffmpeg
    configure.pkg_config_path   ${prefix}/libexec/ffmpeg${ffmpeg_ver}/lib/pkgconfig

    notes-append "
        \n
        The new implementation can be enabled by setting the DWORD value:
        \n
        DisableGstByteStreamHandler = 1
        \n
        in the HKCU\Software\Wine\MediaFoundation registry key.
    "
}

variant gstreamer description "Build ${subport} with GStreamer, for multimedia support" {
    depends_lib-append      port:gstreamer1 port:gstreamer1-gst-plugins-base port:gstreamer1-gst-plugins-good \
        port:gstreamer1-gst-plugins-bad port:gstreamer1-gst-plugins-ugly port:gstreamer1-gst-libav
    configure.args-replace  --without-gstreamer --with-gstreamer
}

variant kerberos description "Build ${subport} with Kerberos, for network authentication protocol support" {
    depends_lib-append      port:kerberos5
    configure.args-replace  --without-krb5 --with-krb5
}

default_variants            +ffmpeg +gstreamer

triplet.add_build           cross
triplet.add_host            none

# macports-base injects a number of flags that now propagate to mingw-gcc this causes the build to fail since, wine-7.21
# https://gitlab.winehq.org/wine/wine/-/commit/b1f59bc679a8c2dea18a6789a5b9b1a1ae825129
compiler.limit_flags        yes
muniversal.arch_flag        no
muniversal.arch_compiler    yes
configure.ldflags-delete    -L${compiler.library_path}
configure.optflags          -g -O2
configure.env-append        "CROSSCFLAGS=${configure.optflags}"

# Were only installing wine not the development files
destroot.target             install-lib

post-destroot {
    set docdir ${prefix}/share/doc/${my_name}
    xinstall -d ${destroot}${docdir}
    xinstall -m 0644 -W ${worksrcpath} \
        ANNOUNCE.md \
        AUTHORS \
        COPYING.LIB \
        LICENSE \
        README.md \
        ${destroot}${docdir}
}

pre-activate {
    if {${os.major} == 19 && ${os.minor} < 4 && ${os.platform} eq "darwin"} {
        ui_error "You must first update to macOS 10.15.4."
        return -code error "You must first update to macOS 10.15.4."
    }
}