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

PortSystem              1.0
PortGroup               conflicts_build 1.0
PortGroup               github 1.0
PortGroup               legacysupport 1.1
PortGroup               waf 1.0

# Please revbump mpv whenever ffmpeg{,-devel} is updated!
name                    mpv-legacy
github.setup            mpv-player mpv 0.36.0 v
# Change github.tarball_from to 'releases' or 'archive' next update
github.tarball_from     tarball
conflicts               mpv
revision                1
categories              multimedia
license                 GPL-2+
maintainers             {@barracuda156 gmail.com:vital.had} openmaintainer

description             mpv is a movie player based on MPlayer and mplayer2.
long_description        {*}${description} It plays most MPEG/VOB, AVI, Ogg/OGM, \
                        VIVO, ASF/WMA/WMV, QT/MOV/MP4, RealMedia, Matroska, \
                        NUT, NuppelVideo, FLI, YUV4MPEG, FILM, RoQ, PVA files, \
                        supported by many native, XAnim, and Win32 DLL codecs. \
                        You can watch VideoCD, SVCD, DVD, 3ivx, DivX 3/4/5, WMV \
                        and even H.264 movies.
homepage                https://www.mpv.io

set waf_version         2.0.23
set waf_distfile        waf-${waf_version}
set mpv_distfile        ${distfiles}
master_sites-append     https://waf.io/:waf
distfiles-append        ${waf_distfile}:waf

extract.only-delete     ${waf_distfile}

checksums               ${mpv_distfile} \
                        rmd160  9ff58a63048d9a18d233e40cdb4b529031086a54 \
                        sha256  8e6fed056d6981a165bfbb6c6391109a81078aa8be94f1fbb7c95cb5587d446e \
                        size    3409580 \
                        ${waf_distfile} \
                        rmd160  6af5d2bc4c80d5a21045ea031344005cbcb7a512 \
                        sha256  28a2e4583314a162cfcbffefb8a9202c1d7869040d30b5852da479b76d9c0491 \
                        size    105122

installs_libs           no

set real_name           mpv

depends_build-append    path:bin/pkg-config:pkgconfig

configure.pkg_config_path-prepend \
                        ${prefix}/libexec/ffmpeg6/lib/pkgconfig

depends_lib-append      port:ffmpeg6 \
                        port:lcms2 \
                        path:lib/pkgconfig/libass.pc:libass \
                        port:libiconv \
                        path:bin/perl:perl5 \
                        port:zimg \
                        port:zlib

# Build system is a bit handicapped and cannot link correctly otherwise:
conflicts_build         ffmpeg ffmpeg-devel

# mpv(18616,0xf0185000) malloc: *** error for object 0xe26e600:
# incorrect checksum for freed object - object was probably modified after being freed.
legacysupport.redirect_bins ${real_name}

universal_variant       no

# network is removed from defaults due to a build conflict with ffmpeg4.
default_variants        +audiocd +bluray +dvd +libarchive +osd +opengl +sdl2

platform darwin {
    default_variants-append     +rubberband

    if {${os.major} > 9} {
        default_variants-append +coreaudio
    } else {
        default_variants-append +pulseaudio
        notes-append {
            On systems older than SnowLeopard (10.6), coreaudio output support is not available.\
            The pulseaudio backend should have been enabled automatically.
        }
    }
    if {${os.major} > 10} {
        # current macOS bundle errors on < 10.7 due to unhandled -psn_* argument
        default_variants-append +bundle
    }
}

# Current waf doesn't support --nocache anymore. Set by PortGroup.
configure.post_args-delete  --nocache

configure.args-append   --enable-cocoa \
                        --enable-cplugins \
                        --enable-manpage-build \
                        --enable-swift \
                        --enable-zimg \
                        --enable-zlib \
                        --disable-android \
                        --disable-audiounit \
                        --disable-coreaudio \
                        --disable-cuda-hwaccel \
                        --disable-direct3d \
                        --disable-dvbin \
                        --disable-egl-angle-lib \
                        --disable-egl-angle-win32 \
                        --disable-egl-drm \
                        --disable-html-build \
                        --disable-ios-gl \
                        --disable-opensles \
                        --disable-plain-gl \
                        --disable-rpi \
                        --disable-videotoolbox-gl

# mpv autodetects many support libs. To prevent undeclared
# dependencies, explicitly disable everything optional first.
# This list should be expanded each time the port is updated
# to a new version, disabling any newly added options.
configure.args-append   --disable-caca \
                        --disable-cdda \
                        --disable-clang-database \
                        --disable-debug-build \
                        --disable-dvdnav \
                        --disable-egl-x11 \
                        --disable-gl \
                        --disable-gl-cocoa \
                        --disable-gl-x11 \
                        --disable-jack \
                        --disable-javascript \
                        --disable-jpeg \
                        --disable-libarchive \
                        --disable-libbluray \
                        --disable-libplacebo \
                        --disable-lua \
                        --disable-openal \
                        --disable-pdf-build \
                        --disable-pulse \
                        --disable-rubberband \
                        --disable-tv \
                        --disable-uchardet \
                        --disable-vapoursynth \
                        --disable-x11 \
                        --disable-xv

# Fix picking up the correct talloc version.
# -isystem has the added benefit of moving the include
# directory specified to the end of the include path list.
# This will help the build system respect custom include
# paths correctly (i.e., searching them before the MP include
# directory.)
configure.cppflags-replace  -I${prefix}/include -isystem${prefix}/include

build.args-append           -v

# Clear CPATH and LIBRARY_PATH because a ncurses include file
# conflicts with the one in MacPorts. It doesn't matter much anyway
# because the swift module in mpv doesn't have any dependencies to
# link against.
compiler.cpath
compiler.library_path

patchfiles-append       patch-apple_utils.c-should-be-included-for-Darwin.diff

platform macosx {
    if {${os.major} > 10} {
        # Force recent enough Xcode.
        # We have to compile with the compiler provided by Xcode/CLT
        # due to only it shipping libarclite on 10.7 and knowing where
        # it is.
        # Could "emulate" the same behavior by using MacPorts' clang
        # and appending -L/usr/lib/arc/ to CFLAGS/CXXFLAGS on 10.7,
        # but I don't particularly like that idea (yet.)
        # Keep using the "system compiler" for now. Also means one less
        # dependency on recent systems, so yay.
        PortGroup                   xcodeversion 1.0

        minimum_xcodeversions       {11 4.4}

        # Force recent enough SDK.
        if {[vercmp ${configure.sdk_version} 10.8] < 0} {
            configure.sdk_version   10.8
        }

        # Force clang compiler as installed by Xcode's CLT's... hopefully.
        compiler.blacklist-append   *gcc* cc macports-*
    }

    if {${os.major} <= 14 || ${configure.build_arch} ni [list x86_64 arm64]} {
        # Disable Cocoa output.
        # Users on old systems will need to embrace X11.
        configure.args-replace      --enable-cocoa \
                                    --disable-cocoa

        default_variants-append     +x11
    }
}

platform darwin {
    notes-append [subst {
                    The maintainer ships his personal config file in
                    * ${prefix}/share/doc/${real_name}/examples/config-maintainer.

                    You are strongly encouraged to copy this file to either
                    * ${prefix}/etc/${real_name}/${real_name}.conf (globally for all users of the system) or
                    * ~/.config/${real_name}/config (only for your current user)
                    and adjust it to your needs.

                    If you previously had your configuration file in
                    * ~/.${real_name}/config
                    please migrate it to
                    * ~/.config/${real_name}/config
                    which is the location preferred by upstream.
    }]

    # cocoa-cb backend requires Swift 5 or 4 support, which is only available
    # in Xcode 9.1 onwards.
    # From version 0.34.0 Swift 4.1 (Xcode 9.3+) or later is required
    if {[vercmp ${xcodeversion} 9.3] < 0} {
        configure.args-replace  --enable-swift \
                                --disable-swift
    }

    # VideotoolBox, a new hardware acceleration framework, is supported on 10.8+ and "here to stay".
    # It provides support for H265, H264, H263, MPEG1, MPEG2 and MPEG4.
    if {${os.major} > 14} {
        configure.args-delete   --disable-videotoolbox-gl
        configure.args-append   --enable-videotoolbox-gl
    }

    if {${os.major} > 11} {
        notes-append {
            This config file already defines the necessary video output settings to make\
            use of the hardware acceleration features provided by your operating system.
        }
    } else {
        notes-append {
            Sadly, your system is incapable of utilizing mpv's hardware decoding features.\
            The example config file will not include a hardware decoding option.\
            Consult ``man mpv'' for further information.
        }
    }

    # C11 atomics is mandatory from version 0.33.0
    compiler.c_standard 2011
    compiler.blacklist-append \
                        {clang < 700}

    # Should eliminate most swift (module) related problems
    if {[vercmp ${xcodeversion} 9.1] >= 0 || ${os.major} >= 16} {
        use_xcode yes
    }

    # Shared build fixes for 10.6 and 10.7.
    if {${os.major} < 12} {
        patchfiles-append   patch-misc-import-CoreVideo.diff
        patchfiles-append   patch-waftools-detection-compiler-py-no-tautological.diff
    }

    # Make mpv work as good as possible on 10.6 and below. No Cocoa support, instead concentrate
    # on getting the OpenGL output to work via X11.
    # Also fix some other minor compile issues only manifesting on 10.6 and below along the way.
    if {${os.major} < 11} {
        patchfiles-append   patch-audio_out_ao_coreaudio_utils.c-add-missing-header-for-getpid.diff
        patchfiles-append   patch-waftools_detections_compiler.py-support-older-GCC.diff

        notes-append {
            On systems older than Lion (10.7) or on architectures other than x86_64, Cocoa output support is not available.\
            The X11 backend should have been enabled automatically.
        }
    }

    # Fix youtube-dl hook for streaming youtube videos
    patchfiles-append       patch-youtubedl-edl-track-error.diff

    post-extract {
        xinstall -m 0644 -W "${filespath}" config-maintainer "${worksrcpath}/TOOLS/"
    }

    pre-configure {
        if {${use_xcode}} {
            if {[vercmp ${xcodeversion} 4.3] < 0} {
                set sdks_dir ${developer_dir}/SDKs
            } else {
                set sdks_dir ${developer_dir}/Platforms/MacOSX.platform/Developer/SDKs
            }
            set sdks [glob -directory ${sdks_dir} MacOSX*.sdk]
            configure.sdkroot [lindex [lsort -command vercmp ${sdks}] end]
        }
        if {${configure.sdkroot} ne ""} {
            configure.sdk_version [exec /usr/libexec/PlistBuddy -c Print:ProductVersion ${configure.sdkroot}/System/Library/CoreServices/SystemVersion.plist]
        }
        if {[llength [split ${configure.sdk_version} .]] < 2} {
            configure.sdk_version ${configure.sdk_version}.0
        }
        configure.env-append \
                        MACOS_SDK=${configure.sdkroot} \
                        MACOS_SDK_VERSION=${configure.sdk_version}

        if {[variant_isset network]} {
            reinplace -W "${worksrcpath}/TOOLS" "s/@@NETWORK@@//" config-maintainer
        } else {
            reinplace -W "${worksrcpath}/TOOLS" "/@@NETWORK@@/d" config-maintainer
        }

        if {${os.major} > 11} {
            reinplace -W "${worksrcpath}/TOOLS" "s/@@HWDEC@@//" config-maintainer
        } else {
            reinplace -W "${worksrcpath}/TOOLS" "/@@HWDEC@@/d" config-maintainer
        }

        if {${os.major} > 12} {
            reinplace -W "${worksrcpath}/TOOLS" "s/@@HWDEC_CUDA@@//" config-maintainer
        } else {
            reinplace -W "${worksrcpath}/TOOLS" "/@@HWDEC_CUDA@@/d" config-maintainer
        }

        if {${os.major} < 11 || ${configure.build_arch} ni [list x86_64 arm64]} {
            reinplace -W "${worksrcpath}/TOOLS" "/@@VOGPU@@/d" config-maintainer
            reinplace -W "${worksrcpath}/TOOLS" "s/@@BACKEND@@/x11/" config-maintainer
        } else {
            reinplace -W "${worksrcpath}/TOOLS" "s/@@VOGPU@@//" config-maintainer
            reinplace -W "${worksrcpath}/TOOLS" "/@@BACKEND@@/d" config-maintainer
        }
    }
}

# Shameless copy from ipe-tools.
set python.versions         {38 39 310 311}
dict set python.legacy_versions 37 38
# After Python 3.9 is released, and mpv can be built with it,
# replace with the above lines with the following:
#set python.versions         {27 39}
#dict set python.legacy_versions 38 39

set python.default_version  311
set python.version          ""

# Create python variants.
foreach ver ${python.versions} {
    set variant_line {variant python${ver} description }
    set python_branch [string index $ver 0].[string range $ver 1 end]
    append variant_line " {Use Python ${python_branch} to build ${name} and generate man pages}"

    foreach over ${python.versions} {
        if {${ver} == ${over}} {
            continue
        }

        append variant_line " conflicts python${over}"
    }

    append variant_line " {
        depends_build-append    port:py${ver}-docutils
        license_noconflict      py${ver}-docutils
    }"
    eval $variant_line
}

# Create legacy python variants, mapping to the replacement version.
dict for {legacy_ver replace_ver} ${python.legacy_versions} {
    set variant_line {variant python${legacy_ver} description }
    set legacy_branch [join [split ${legacy_ver} {}] "."]
    set replace_branch [join [split ${replace_ver} {}] "."]
    append variant_line " {Legacy variant for Python ${legacy_branch} mapping to Python ${replace_branch}}"
    append variant_line " requires python${replace_ver}"

    foreach over ${python.versions} {
        if {${legacy_ver} == ${over} || ${replace_ver} == ${over}} {
            continue
        }

        append variant_line " conflicts python${over}"
    }

    append variant_line " { }"
    eval $variant_line
}

# Set default python variant.
set variant_none true
foreach ver ${python.versions} {
    if {[variant_isset python${ver}]} {
        set variant_none [expr $variant_none && ![variant_isset python${ver}]]
    }
}

if {${variant_none}} {
    default_variants-append "+python${python.default_version}"
}

# Set ${python.version} to the currently active variant.
# And let waf use the same python version as the currently active variant.
foreach ver ${python.versions} {
    if {[variant_isset python${ver}]} {
        set python.version ${ver}
        set python_branch [string index ${python.version} 0].[string range ${python.version} 1 end]
        waf.python_branch ${python_branch}
    }
}

if {[string length ${python.version}] == 0} {
    ui_error "No python variant selected. You must select at least one. The highest value will be used."
    error "Select a python variant."
}

post-patch {
    set python_ver_dot [string index ${python.version} 0].[string range ${python.version} 1 end]
    reinplace -W "${worksrcpath}" "s|'rst2man'|'rst2man-${python_ver_dot}'|" wscript
}

post-extract {
    xinstall -m 0644 -W "${distpath}" "${waf_distfile}" "${worksrcpath}/waf"
}

post-destroot {
    # Since we don't have conffiles handling, install mpv.conf as mpv.conf.example
    # to not overwrite this file on each (re-)build.
    file rename ${worksrcpath}/etc/mpv.conf ${worksrcpath}/etc/mpv.conf.example

    xinstall -d -m 0755 ${destroot}${prefix}/etc/${real_name}
    foreach etcfile {encoding-profiles.conf mpv.conf.example input.conf} {
        xinstall -m 0644 ${worksrcpath}/etc/${etcfile} \
            ${destroot}${prefix}/etc/${real_name}/${etcfile}
    }
    xinstall -d -m 0755 ${destroot}${prefix}/share/doc/${real_name}/examples
    copy {*}[glob ${worksrcpath}/TOOLS/lua ${worksrcpath}/TOOLS/*.pl \
                  ${worksrcpath}/TOOLS/*.sh ${worksrcpath}/TOOLS/*.py \
                  ${worksrcpath}/TOOLS/umpv ${worksrcpath}/TOOLS/lib] \
         ${destroot}${prefix}/share/doc/${real_name}/examples

    if {${os.platform} eq "darwin"} {
        xinstall -m 0644 ${worksrcpath}/TOOLS/config-maintainer \
                         ${destroot}${prefix}/share/doc/${real_name}/examples
    }
}

# When enabling features, make sure to replace the "disable" flags with
# "enable" flags in order to make the waf build system error out in case
# a feature cannot be used/found. Problems like that indicate a missing
# runtime dependency.

variant bundle description {Enable the optional macOS bundle of mpv} {
    post-build {
        system -W "${worksrcpath}" "${waf.python} TOOLS/osxbundle.py -s build/mpv"
    }

    post-destroot {
        xinstall -d -m 0755 ${destroot}${applications_dir}
        copy ${worksrcpath}/build/mpv.app ${destroot}${applications_dir}
    }
}

variant coreaudio description {Enable CoreAudio support} {
    configure.args-replace  --disable-coreaudio \
                            --enable-coreaudio
}

variant screenshot description {Enable optional screenshot support} {
    depends_lib-append      path:include/turbojpeg.h:libjpeg-turbo
    configure.args-replace  --disable-jpeg \
                            --enable-jpeg
}

variant network conflicts ytdlp description {Enable networking support via youtube-dl (supports wide variety of pages)} {
    depends_run-append      port:youtube-dl
}

variant ytdlp conflicts network description {Enable networking support via yt-dlp instead of youtube-dl (supports wide variety of pages)} {
    depends_run-append      port:yt-dlp
}

variant bluray description {Enable Bluray and AACS/BD+ encryption support} {
    depends_lib-append     port:libbluray
    depends_run-append     port:libaacs \
                           port:libbdplus
    configure.args-delete  --disable-libbluray
    notes-append {
                    
                    To play Bluray discs with AACS encryption, decryption key database file "keydb.cfg" needs to be placed at:
                    * ~/Library/Preferences/aacs/ (on macOS, or)
                    * ~/.config/aacs/ (on other darwin).
                    You can easily find this file on the internet.
    }
}

variant dvd description {Enable DVD and DeCSS support} {
    depends_lib-append      port:libdvdread \
                            port:libdvdnav
    configure.args-replace  --disable-dvdnav \
                            --enable-dvdnav
}

variant audiocd description {Enable Audio CD support via libcdio-paranoia} {
    depends_lib-append      port:libcdio-paranoia
    configure.args-replace   --disable-cdda \
                             --enable-cdda
}

variant libarchive description {Enable transparent handling of Zip files and other compressed formats} {
    depends_lib-append      port:libarchive
    configure.args-replace  --disable-libarchive \
                            --enable-libarchive
}

variant rubberband description {Enable support for the Rubber Band library, adding audio pitch and speed control} {
    depends_lib-append      port:rubberband
    configure.args-replace  --disable-rubberband \
                            --enable-rubberband
}

variant pulseaudio description {Enable PulseAudio support} {
    depends_lib-append      port:pulseaudio
    configure.args-replace  --disable-pulse \
                            --enable-pulse
}

variant jack description {Enable Jack Audio Connection Kit support} {
    depends_lib-append      port:jack
    configure.args-replace  --disable-jack \
                            --enable-jack
}

# TODO: switch that to openal-soft? Leave it as-is?
variant openal description {Enable OpenAL support} {
    depends_lib-append      port:openal
    configure.args-replace  --disable-openal \
                            --enable-openal
}

variant x11 {
    depends_lib-append      port:xorg-libXext \
                            port:xorg-libXinerama \
                            port:xorg-libXpresent \
                            port:xorg-libXrandr \
                            port:xorg-libXScrnSaver \
                            port:xorg-libXv

    configure.args-delete   --disable-x11 \
                            --disable-xv
    configure.args-append   --enable-x11 \
                            --enable-xv
}

variant opengl description {Enable OpenGL output support. Both the CoreVideo and X11 (GLX) outputs are supported} {
    if {${os.platform} eq "darwin" && ${os.major} > 14} {
        configure.args-replace  --disable-gl-cocoa \
                                --enable-gl-cocoa
    }

    configure.args-replace      --disable-gl \
                                --enable-gl

    if {[variant_isset x11]} {
        depends_lib-append      port:mesa
        configure.args-replace  --disable-gl-x11 \
                                --enable-gl-x11
        # FIXME: add EGL? Leave it disabled? Test!
        # As far as testing went, EGL is not available on macOS yet.
        #configure.args-replace  --disable-egl-x11 \
        #                        --enable-egl-x11
    }
}

variant sdl2 description {Enable SDL2 output} {
    depends_lib-append      port:libsdl2

    configure.args-append   --enable-sdl2 \
                            --enable-sdl2-audio \
                            --enable-sdl2-video
}

variant caca description {Enable animated ASCII art video output} {
    depends_lib-append      port:libcaca
    configure.args-replace  --disable-caca \
                            --enable-caca
}

variant osd description {Enable onscreen display and TrueType font support} {
    depends_lib-append      port:lua52
    configure.args-delete   --disable-lua
    configure.args-append   --enable-lua \
                            --lua=52fbsd
}

#variant smb description {Enable Samba support} {
#    depends_lib-append      path:lib/pkgconfig/smbclient.pc:samba3
#    configure.args-replace  --disable-libsmbclient \
#                            --enable-libsmbclient
#}
# Removed in 0.33.0

variant debug description {Compile with debugging symbols} {
    configure.args-delete   --disable-debug-build
}

variant printable_doc description {Generate printable documents (PDF help)} {
    # py27-pdfrw and py27-Pillow are needed by rst2pdf.
    depends_build-append    port:rst2pdf \
                            port:py27-pdfrw \
                            port:py27-Pillow
    configure.args-replace  --disable-pdf-build \
                            --enable-pdf-build
}

#variant javascript description {Enable JavaScript support via mujs} {
#   depends_lib-append      port:mujs
#   configure.args-replace  --disable-javascript \
#                           --enable-javascript
#}

variant uchardet description {Enable the uchardet encoding detector} {
    depends_lib-append      port:uchardet
    configure.args-replace  --disable-uchardet \
                            --enable-uchardet
}

variant libmpv description {Enable the libmpv library} {
    configure.args-append --enable-libmpv-shared
}

if {![variant_isset bundle]} {
    depends_lib-append      port:desktop-file-utils
    post-activate {
        system "${prefix}/bin/update-desktop-database ${prefix}/share/applications"
    }
}
