# -*- 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           cmake 1.1
PortGroup           github 1.0

name                libiio
categories          science comms
maintainers         {michaelld @michaelld} openmaintainer
description         ${name} is used to interface to the Industrial Input/Output (IIO) Subsystem
long_description    {*}${description}. The IIO subsystem is intended to provide \
                    support for devices that in some sense are analog to \
                    digital or digital to analog converters (ADCs, DACs). This \
                    includes, but is not limited to ADCs, Accelerometers, Gyros, \
                    IMUs, Capacitance to Digital Converters (CDCs), Pressure \
                    Sensors, Color, Light and Proximity Sensors, Temperature \
                    Sensors, Magnetometers, DACs, DDS (Direct Digital Synthesis), \
                    PLLs (Phase Locked Loops), Variable/Programmable Gain \
                    Amplifiers (VGA, PGA), and RF transceivers. You can use libiio \
                    natively on an embedded Linux target (local mode), or use \
                    libiio to communicate remotely to that same target from a host \
                    Linux, Windows, or MAC over USB or Ethernet or Serial.
license             LGPL-2+

# release
github.setup        analogdevicesinc libiio 0.24 v
# Change github.tarball_from to 'releases' or 'archive' next update
github.tarball_from tarball
checksums           rmd160  5c214e103c2527ace2b8e4ff5cf46d5ff0210115 \
                    sha256  3680d53aa129ca2ebaac009fecc88b9f4e79d1c3ad03067c16321d25b91ee779 \
                    size    483053
revision            3

long_description    ${long_description} Provides the release, which is \
                    typically updated every few months to yearly.

# because I moved from a "devel" style 20190503 to a release style
# "0.18" and the latter is "less than" the former when comparing.
epoch               1

# patch to fix linking

patchfiles-append   patch-fix-linking.diff

# patch to fix install directory of the framework

patchfiles-append   patch-fix_build.diff

# patch to disable checking for libiio during install

patchfiles-append   patch-disable-install-libiio-check.diff

if {${os.platform} eq "darwin" && ${os.major} < 15} {
    PortGroup       legacysupport 1.1

    # strnlen
    legacysupport.newest_darwin_requires_legacy 10

    # This is the last commit which builds.
    github.setup    analogdevicesinc libiio 027919e318aacbe56c4a4a64803b6dead068180c
    version         0.19
    revision        1
    checksums       rmd160  1ace55fd89616d3a79d4ef70b99e517f17e6addd \
                    sha256  b0efca3544cd106d9e3ef3957cff658fdd525af0a2f98aef2c00e8cc24277d7e \
                    size    236403
    github.tarball_from archive

    patchfiles-replace \
                    patch-fix_build.diff patch-fix_build-0.19.diff \
                    patch-fix-linking.diff patch-fix-linking-0.19.diff

    patchfiles-append \
                    patch-fix-headers.diff

    # Uses endianness macros and built-ins requiring newer gcc.
    compiler.blacklist-append \
                    *gcc-4.0 *gcc-4.2
}

# additional arguments
configure.args-append \
    -DCMAKE_INSTALL_DOCDIR=${prefix}/share/doc/${github.project} \
    -DOSX_INSTALL_FRAMEWORKSDIR=${frameworks_dir}

depends_lib-append \
    port:libxml2 \
    path:lib/pkgconfig/libusb-1.0.pc:libusb

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

# remove top-level library path, such that internal libraries are used
# instead of any already-installed ones.

configure.ldflags-delete -L${prefix}/lib

configure.args-append \
    -DLIBUSB_INCLUDE_DIR:PATH=${prefix}/include/libusb-1.0 \
    -DLIBUSB_LIBRARIES:FILEPATH=${prefix}/lib/libusb-1.0.dylib \
    -DOSX_PACKAGE=OFF \
    -DPYTHON_BINDINGS=ON

# specify the Python dependencies; these are checked for at configure,
# then used for building, but not at runtime.

set pythons_suffixes {27 35 36 37 38 39 310 311}

set pythons_ports {}
foreach s ${pythons_suffixes} {
    lappend pythons_ports python${s}
}

foreach s ${pythons_suffixes} {
    set p python${s}
    set v [string index ${s} 0].[string range ${s} 1 end]
    set i [lsearch -exact ${pythons_ports} ${p}]
    set c [lreplace ${pythons_ports} ${i} ${i}]
    variant ${p} description "Build ${name} using Python ${v}" conflicts {*}${c} ""
}

# default to Py310 if not selected by the user
set selected_python_no_dot 310
foreach s ${pythons_suffixes} {
    if {[variant_isset python${s}]} {
        set selected_python_no_dot ${s}
    }
}
default_variants +python${selected_python_no_dot}

# make sure the default python variant wasn't
# deselected without selecting another one
set selected_python_no_dot ""
foreach s ${pythons_suffixes} {
    if {[variant_isset python${s}]} {
        set selected_python_no_dot ${s}
    }
}

if {${selected_python_no_dot} eq ""} {
    set py_vars ""
    set final_s [lindex ${pythons_suffixes} end]
    foreach s ${pythons_suffixes} {
        if {${s} eq ${final_s}} {
            set py_vars "${py_vars}or "
        }
        set py_vars "${py_vars}+python${s}"
        if {${s} ne ${final_s}} {
            set py_vars "${py_vars}, "
        }
    }
    ui_error "\n\nYou must select one of the variants ${py_vars}.\n"
    return -code error "Invalid variant selection"
}

set selected_python_with_dot [string index ${selected_python_no_dot} 0].[string range ${selected_python_no_dot} 1 end]

set python_top_dir ${frameworks_dir}/Python.framework/Versions/${selected_python_with_dot}

set python_name python${selected_python_with_dot}

# required Python

depends_lib-append port:python${selected_python_no_dot} \
    port:py${selected_python_no_dot}-setuptools
configure.args-append \
    -DPython_EXECUTABLE=${python_top_dir}/bin/${python_name}

post-destroot {
    # move Python install to frameworks_dir for Python
    set py_install_dir ${python_top_dir}/lib
    xinstall -m 755 -d ${destroot}${py_install_dir}
    move ${destroot}${prefix}/lib/${python_name} ${destroot}${py_install_dir}

    # link from iio.framework to normal
    set iio_framework_version ${version}
    set iio_framework_top ${frameworks_dir}/iio.framework
    set iio_framework ${iio_framework_top}/Versions/${iio_framework_version}/iio
    set iio_dr_framework_top ${destroot}${iio_framework_top}

    # fix iio library & link it into .../lib
    xinstall -m 755 -d ${destroot}${prefix}/lib
    ln -s ${iio_framework_top}/Versions/${iio_framework_version}/iio ${destroot}${prefix}/lib/libiio.dylib
    system "install_name_tool -id ${iio_framework} ${destroot}${iio_framework}"

    if {[variant_isset docs]} {
        # fix Tools, and link them into .../bin
        xinstall -m 755 -d ${destroot}${prefix}/bin
        foreach app [glob ${iio_dr_framework_top}/Tools/*] {
            set non_dr_app [strsed ${app} "s@${destroot}@@"]
            set lib_iio_framework [strsed ${iio_framework} "s@Library/Frameworks@lib@"]
            system "install_name_tool -change ${lib_iio_framework} ${iio_framework} ${app}"
            ln -s ${non_dr_app} ${destroot}${prefix}/bin
        }
    }

    # link includes into .../include
    xinstall -m 755 -d ${destroot}${prefix}/include
    foreach header [glob ${iio_dr_framework_top}/Versions/${iio_framework_version}/Headers/*] {
        ln -s [strsed ${header} "s@${destroot}@@"] ${destroot}${prefix}/include
    }
}

variant docs description {build documentation} {

    depends_build-append \
        path:bin/doxygen:doxygen \
        port:man \
        port:py${selected_python_no_dot}-sphinx \
        port:py${selected_python_no_dot}-sphinx_rtd_theme

    configure.args-append \
        -DWITH_MAN=ON \
        -DWITH_DOC=ON \
        -DWITH_TESTS=ON \
        -DSPHINX_EXECUTABLE=${prefix}/bin/sphinx-build-${selected_python_with_dot}

}

if {![variant_isset docs]} {
    configure.args-append \
        -DWITH_MAN=OFF \
        -DWITH_DOC=OFF \
        -DWITH_TESTS=OFF
}

# overload the github livecheck regex to look for versions that
# are just numbers and '.', no letters (e.g., "3.7.3_rc2").

github.livecheck.regex {([0-9.]+)}
