# Maintainer: Alexander F. Rødseth <xyproto@archlinux.org>
# Contributor: loqs
# Contributor: Lukas Fleischer <lfleischer@archlinux.org>
# Contributor: Vesa Kaihlavirta <vesa@archlinux.org>
# Contributor: Sarah Hay <sarahhay@mb.sympatico.ca>
# Contributor: Tom Burdick <thomas.burdick@wrightwoodtech.com>
# Contributor: Ricardo Catalinas Jiménez <jimenezrick@gmail.com>

# ALARM: Kevin Mihelich <kevin@archlinuxarm.org>
#  - configure with --disable-pgo to fix ARM FTBFS

pkgbase=erlang
pkgname=(
  erlang
  erlang-headless
  erlang-core
  erlang-asn1
  erlang-common_test
  erlang-debugger
  erlang-dialyzer
  erlang-diameter
  erlang-edoc
  erlang-eldap
  erlang-erl_interface
  erlang-et
  erlang-eunit
  erlang-ftp
  erlang-inets
  erlang-jinterface
  erlang-megaco
  erlang-mnesia
  erlang-observer
  erlang-odbc
  erlang-os_mon
  erlang-parsetools
  erlang-public_key
  erlang-reltool
  erlang-runtime_tools
  erlang-sasl
  erlang-snmp
  erlang-ssh
  erlang-ssl
  erlang-syntax_tools
  erlang-tftp
  erlang-tools
  erlang-wx
  erlang-xmerl
)
pkgver=27.2.4
pkgrel=2
pkgdesc='General-purpose concurrent functional programming language developed by Ericsson'
arch=(x86_64)
url='https://erlang.org/'
license=(Apache-2.0)
makedepends=(
  gcc-libs
  git
  glib2
  glibc
  glu
  java-environment
  libglvnd
  libxslt
  lksctp-tools
  mesa
  ncurses
  openssl
  perl
  unixodbc
  webkit2gtk-4.1
  wxwidgets-common
  wxwidgets-gtk3
  zlib
)
conflicts=(erlang-nox)
options=(staticlibs)
source=(
  "git+https://github.com/erlang/otp#tag=OTP-$pkgver"
  epmd.conf
  epmd.service
  epmd.socket
)
b2sums=('b4afb10d31918bdce40dc71acae4fd0fc872166730f1fa72eec4fb31a933248622500578405b8da25c43e81040de714449aa5783bd848958799266f72db47219'
        '1675ac9bf948ab19e8b63077d870ccf356fcdbce14de2777f00b3488aa1ce34a5e0a5cdc0428707f744dee5940b12653a44e0ded0554de95ebb31bce4676ff87'
        '1f765318bcd322ce697a48c064ccdb1bd107b4a84e164a87f62678391cb82a9ab17a397d679cf266e037a5a2d91772b85f7a97f9cc5478c0f18118743b30045f'
        'c37706f5f6e2d49100104fb442ebf15edd6ee0a1e8038d0364794cf34fd3f02a61b9ad2706228b3327b85b0cadcd11aac6087e7c98408eae2d307a09191b6553')

prepare() {
  cd otp
  sed -i 's/^LDFLAGS = /LDFLAGS += /g' \
    lib/megaco/src/flex/Makefile.in \
    lib/odbc/c_src/Makefile.in
  # Let the Java bindings support version 11 or later, ref:
  # https://gitlab.archlinux.org/archlinux/packaging/packages/erlang/-/issues/1
  sed -i 's/^JAVA_OPTIONS =/JAVA_OPTIONS = --release 11/g' \
    lib/jinterface/java_src/com/ericsson/otp/erlang/Makefile
}

build() {
  cd otp
  #export CFLAGS+=' -ffat-lto-objects'
  ./configure \
    --enable-threads \
    --enable-shared-zlib \
    --enable-ssl=dynamic-ssl-lib \
    --with-ssl-rpath=/usr/lib \
    --prefix=/usr \
    --disable-pgo

  make all
  make DOC_TARGETS="chunks man" docs
}

_pick() {
  local dest="$1"
  shift
  for obj in "$@"; do
    mkdir -p "$dest/$(dirname "$obj")/"
    mv -v -t "$dest/$(dirname "$obj")/" "$obj"
  done
}

package_erlang() {
  depends=(
    erlang-asn1
    erlang-common_test
    erlang-core
    erlang-debugger
    erlang-dialyzer
    erlang-diameter
    erlang-edoc
    erlang-eldap
    erlang-erl_interface
    erlang-et
    erlang-eunit
    erlang-ftp
    erlang-inets
    erlang-jinterface
    erlang-megaco
    erlang-mnesia
    erlang-observer
    erlang-odbc
    erlang-os_mon
    erlang-parsetools
    erlang-public_key
    erlang-reltool
    erlang-runtime_tools
    erlang-sasl
    erlang-snmp
    erlang-ssh
    erlang-ssl
    erlang-syntax_tools
    erlang-tftp
    erlang-tools
    erlang-wx
    erlang-xmerl
  )
}

package_erlang-headless() {
  pkgdesc+=' (headless, replaces erlang-nox)'
  depends=(
    erlang-asn1
    erlang-core
    erlang-diameter
    erlang-edoc
    erlang-eldap
    erlang-eunit
    erlang-ftp
    erlang-inets
    erlang-mnesia
    erlang-odbc
    erlang-os_mon
    erlang-parsetools
    erlang-public_key
    erlang-runtime_tools
    erlang-snmp
    erlang-ssh
    erlang-ssl
    erlang-syntax_tools
    erlang-tftp
    erlang-tools
    erlang-xmerl
  )
}

package_erlang-core() {
  pkgdesc='Erlang core compenents (compiler, crypto, erts, kernel, stdlib)'
  depends=(
    gcc-libs
    glibc
    lksctp-tools
    ncurses
    openssl
    zlib
  )
  provides=(
    erlang-compiler
    erlang-crypto
    erlang-erts
    erlang-kernel
    erlang-stdlib
  )

  install -vDm644 -t "$pkgdir/usr/lib/systemd/system" epmd.service epmd.socket
  install -vDm644 epmd.conf "$pkgdir/etc/conf.d/epmd"

  cd otp
  make DESTDIR="$pkgdir" install install-docs \
    DOC_TARGETS="chunks man" \
    RELSYS_MANDIR="$pkgdir/usr/share/man"
  install -vDm644 -t "$pkgdir/usr/share/doc/$pkgbase" \
    AUTHORS CONTRIBUTING.md README.md

  # Remove unwanted files
  rm -v \
    "$pkgdir/usr/lib/erlang/Install" \
    "$pkgdir/usr/share/man/man1/.gitignore" \
    "$pkgdir/usr/lib/erlang/misc/format_man_pages" \
    "$pkgdir/usr/share/man/man1/erlsrv.1" \
    "$pkgdir/usr/share/man/man1/werl.1"

  cd "$pkgdir"
  _pick "$srcdir/erlang-asn1" usr/lib/erlang/lib/asn1-*
  _pick "$srcdir/erlang-common_test" \
    usr/bin/ct_run \
    usr/lib/erlang/bin/ct_run \
    usr/lib/erlang/erts-*/bin/ct_run \
    usr/lib/erlang/lib/common_test-* \
    usr/share/man/man1/ct_run.1
  _pick "$srcdir/erlang-debugger" usr/lib/erlang/lib/debugger-*
  _pick "$srcdir/erlang-diameter" \
    usr/lib/erlang/lib/diameter-* \
    usr/share/man/man1/diameterc.1
  _pick "$srcdir/erlang-dialyzer" \
    usr/bin/dialyzer \
    usr/bin/typer \
    usr/lib/erlang/bin/dialyzer \
    usr/lib/erlang/bin/typer \
    usr/lib/erlang/erts-*/bin/dialyzer \
    usr/lib/erlang/erts-*/bin/typer \
    usr/lib/erlang/lib/dialyzer-* \
    usr/share/man/man1/typer.1
  _pick "$srcdir/erlang-edoc" \
    usr/lib/erlang/lib/edoc-* \
    usr/share/man/man1/edoc.1
  _pick "$srcdir/erlang-eldap" usr/lib/erlang/lib/eldap-*
  _pick "$srcdir/erlang-erl_interface" \
    usr/lib/erlang/lib/erl_interface-* \
    usr/lib/erlang/bin/erl_call \
    usr/lib/erlang/erts-*/bin/erl_call \
    usr/share/man/man1/erl_call.1
  _pick "$srcdir/erlang-et" usr/lib/erlang/lib/et-*
  _pick "$srcdir/erlang-eunit" usr/lib/erlang/lib/eunit-*
  _pick "$srcdir/erlang-ftp" usr/lib/erlang/lib/ftp-*
  _pick "$srcdir/erlang-inets" usr/lib/erlang/lib/inets-*
  _pick "$srcdir/erlang-jinterface" usr/lib/erlang/lib/jinterface-*
  _pick "$srcdir/erlang-megaco" usr/lib/erlang/lib/megaco-*
  _pick "$srcdir/erlang-mnesia" usr/lib/erlang/lib/mnesia-*
  _pick "$srcdir/erlang-observer" \
    usr/lib/erlang/lib/observer-* \
    usr/share/man/man1/cdv.1
  _pick "$srcdir/erlang-odbc" usr/lib/erlang/lib/odbc-*
  _pick "$srcdir/erlang-os_mon" usr/lib/erlang/lib/os_mon-*
  _pick "$srcdir/erlang-parsetools" usr/lib/erlang/lib/parsetools-*
  _pick "$srcdir/erlang-public_key" usr/lib/erlang/lib/public_key-*
  _pick "$srcdir/erlang-reltool" usr/lib/erlang/lib/reltool-*
  _pick "$srcdir/erlang-runtime_tools" usr/lib/erlang/lib/runtime_tools-*
  _pick "$srcdir/erlang-sasl" usr/lib/erlang/lib/sasl-*
  _pick "$srcdir/erlang-snmp" \
    usr/lib/erlang/lib/snmp-* \
    usr/share/man/man1/snmpc.1
  _pick "$srcdir/erlang-ssh" usr/lib/erlang/lib/ssh-*
  _pick "$srcdir/erlang-ssl" usr/lib/erlang/lib/ssl-*
  _pick "$srcdir/erlang-syntax_tools" usr/lib/erlang/lib/syntax_tools-*
  _pick "$srcdir/erlang-tftp" usr/lib/erlang/lib/tftp-*
  _pick "$srcdir/erlang-tools" usr/lib/erlang/lib/tools-*
  _pick "$srcdir/erlang-wx" usr/lib/erlang/lib/wx-*
  _pick "$srcdir/erlang-xmerl" usr/lib/erlang/lib/xmerl-*
}

package_erlang-asn1() {
  pkgdesc='Provides support for Abstract Syntax Notation One'
  depends=(
    erlang-core
    glibc
  )
  cp -va -t "$pkgdir" "$pkgname/"*
}

package_erlang-common_test() {
  pkgdesc='A portable framework for automatic testing'
  depends=(
    erlang-core
    erlang-debugger
    erlang-inets
    erlang-observer
    erlang-runtime_tools
    erlang-sasl
    erlang-snmp
    erlang-ssh
    erlang-syntax_tools
    erlang-tools
    erlang-xmerl
    glibc
  )
  cp -va -t "$pkgdir" "$pkgname/"*
}

package_erlang-debugger() {
  pkgdesc='A debugger for debugging and testing of Erlang programs'
  depends=(
    erlang-core
    erlang-wx
  )
  cp -va -t "$pkgdir" "$pkgname/"*
}

package_erlang-dialyzer() {
  pkgdesc='A DIscrepancy AnaLYZer for ERlang programs'
  depends=(
    erlang-core
    erlang-syntax_tools
    erlang-wx
  )
  cp -va -t "$pkgdir" "$pkgname/"*
}

package_erlang-diameter() {
  pkgdesc='Diameter (RFC 3588) library'
  depends=(
    erlang-core
    erlang-runtime_tools
    erlang-ssl
    erlang-syntax_tools
    glibc
  )
  cp -va -t "$pkgdir" "$pkgname/"*
}

package_erlang-edoc() {
  pkgdesc='A utility used to generate documentation out of tags in source files'
  depends=(
    erlang-core
    erlang-inets
    erlang-syntax_tools
    erlang-xmerl
  )
  cp -va -t "$pkgdir" "$pkgname/"*
}

package_erlang-eldap() {
  pkgdesc='Erlang LDAP library'
  depends=(
    erlang-asn1
    erlang-core
    erlang-ssl
  )
  cp -va -t "$pkgdir" "$pkgname/"*
}

package_erlang-erl_interface() {
  pkgdesc='Low level interface to C'
  depends=(
    erlang-core
    glibc
  )
  cp -va -t "$pkgdir" "$pkgname/"*
}

package_erlang-et() {
  pkgdesc='An event tracer for Erlang programs'
  depends=(
    erlang-core
    erlang-runtime_tools
    erlang-wx
  )
  cp -va -t "$pkgdir" "$pkgname/"*
}

package_erlang-eunit() {
  pkgdesc='Support for unit testing'
  depends=(erlang-core)
  cp -va -t "$pkgdir" "$pkgname/"*
}

package_erlang-ftp() {
  pkgdesc='FTP client'
  depends=(erlang-core)
  cp -va -t "$pkgdir" "$pkgname/"*
}

package_erlang-inets() {
  pkgdesc='A set of services such as a Web server and a HTTP client etc'
  depends=(
    erlang-core
    erlang-mnesia
    erlang-runtime_tools
    erlang-ssl
  )
  cp -va -t "$pkgdir" "$pkgname/"*
}

package_erlang-jinterface() {
  pkgdesc='A library for accessing Java from Erlang'
  depends=(
    erlang-core
    java-runtime
  )
  cp -va -t "$pkgdir" "$pkgname/"*
}

package_erlang-megaco() {
  pkgdesc='Megaco/H.248 support library'
  depends=(
    erlang-asn1
    erlang-core
    erlang-debugger
    erlang-et
    erlang-runtime_tools
    glibc
  )
  cp -va -t "$pkgdir" "$pkgname/"*
}

package_erlang-mnesia() {
  pkgdesc='A heavy duty real-time distributed database'
  depends=(erlang-core)
  cp -va -t "$pkgdir" "$pkgname/"*
}

package_erlang-observer() {
  pkgdesc='A set of tools for tracing and investigation of distributed systems'
  depends=(
    erlang-core
    erlang-et
    erlang-inets
    erlang-runtime_tools
    erlang-wx
  )
  cp -va -t "$pkgdir" "$pkgname/"*
}

package_erlang-odbc() {
  pkgdesc='A library for unixODBC support in Erlang'
  depends=(
    erlang-core
    glibc
    unixodbc
  )
  cp -va -t "$pkgdir" "$pkgname/"*
}

package_erlang-os_mon() {
  pkgdesc='A monitor which allows inspection of the underlying operating system'
  depends=(
    erlang-core
    erlang-mnesia
    erlang-sasl
    erlang-snmp
    glibc
  )
  cp -va -t "$pkgdir" "$pkgname/"*
}

package_erlang-parsetools() {
  pkgdesc='A set of parsing and lexical analysis tools'
  depends=(erlang-core)
  cp -va -t "$pkgdir" "$pkgname/"*
}

package_erlang-public_key() {
  pkgdesc='API to public key infrastructure'
  depends=(
    erlang-asn1
    erlang-core
  )
  cp -va -t "$pkgdir" "$pkgname/"*
}

package_erlang-reltool() {
  pkgdesc='A release management tool'
  depends=(
    erlang-core
    erlang-sasl
    erlang-tools
    erlang-wx
  )
  cp -va -t "$pkgdir" "$pkgname/"*
}

package_erlang-runtime_tools() {
  pkgdesc='A set of tools to include in a production system'
  depends=(
    erlang-core
    erlang-mnesia
    glibc
  )
  cp -va -t "$pkgdir" "$pkgname/"*
}

package_erlang-sasl() {
  pkgdesc='The System Architecture Support Libraries'
  depends=(
    erlang-core
    erlang-tools
  )
  cp -va -t "$pkgdir" "$pkgname/"*
}

package_erlang-snmp() {
  pkgdesc='Simple Network Management Protocol (SNMP) support'
  depends=(
    erlang-core
    erlang-mnesia
    erlang-runtime_tools
  )
  cp -va -t "$pkgdir" "$pkgname/"*
}

package_erlang-ssh() {
  pkgdesc='Secure Shell application with sftp and ssh support'
  depends=(
    erlang-core
    erlang-public_key
  )
  cp -va -t "$pkgdir" "$pkgname/"*
}

package_erlang-ssl() {
  pkgdesc='Secure Socket Layer support'
  depends=(
    erlang-core
    erlang-inets
    erlang-public_key
  )
  cp -va -t "$pkgdir" "$pkgname/"*
}

package_erlang-syntax_tools() {
  pkgdesc='A set of tools for dealing with erlang sources'
  depends=(erlang-core)
  cp -va -t "$pkgdir" "$pkgname/"*
}

package_erlang-tftp() {
  pkgdesc='TFTP client'
  depends=(erlang-core)
  cp -va -t "$pkgdir" "$pkgname/"*
}

package_erlang-tools() {
  pkgdesc='A set of programming tools including a coverage analyzer etc'
  depends=(
    erlang-core
    erlang-inets
    erlang-runtime_tools
  )
  cp -va -t "$pkgdir" "$pkgname/"*
}

package_erlang-wx() {
  pkgdesc='A library for wxWidgets support in Erlang'
  depends=(
    erlang-core
    gcc-libs
    glib2
    glibc
    glu
    libglvnd
    webkit2gtk-4.1
    wxwidgets-common
    wxwidgets-gtk3
  )
  cp -va -t "$pkgdir" "$pkgname/"*
}

package_erlang-xmerl() {
  pkgdesc='Provides support for XML 1.0'
  depends=(erlang-core)
  cp -va -t "$pkgdir" "$pkgname/"*
}