Full Code of asdf-vm/asdf-erlang for AI

master 7d76f6bed86d cached
13 files
26.2 KB
7.8k tokens
1 requests
Download .txt
Repository: asdf-vm/asdf-erlang
Branch: master
Commit: 7d76f6bed86d
Files: 13
Total size: 26.2 KB

Directory structure:
gitextract_43m9n7ar/

├── .editorconfig
├── .github/
│   └── workflows/
│       └── ci.yml
├── .gitignore
├── .tool-versions
├── .travis.yml
├── LICENSE
├── README.md
├── bin/
│   ├── install
│   ├── list-all
│   └── uninstall
├── lib/
│   └── utils.sh
└── scripts/
    ├── shellcheck.bash
    └── shfmt.bash

================================================
FILE CONTENTS
================================================

================================================
FILE: .editorconfig
================================================
root = true

[*]
indent_style = space
indent_size = 4
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true


================================================
FILE: .github/workflows/ci.yml
================================================
name: CI

on:
  pull_request:
    types:
      - opened
      - synchronize
      - reopened
    paths-ignore:
      - "**.md"
  push:
    branches:
      - master
    paths-ignore:
      - "**.md"

jobs:
  test:
    name: Test asdf-erlang plugin
    strategy:
      matrix:
        os:
          - ubuntu-latest
          - macos-latest
    runs-on: ${{ matrix.os }}
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Install system packages on Ubuntu
        if: ${{ runner.os == 'Linux' }}
        run: sudo apt-get update; sudo apt-get -y install build-essential autoconf m4 libwxgtk3.2-dev libgl1-mesa-dev libglu1-mesa-dev libpng-dev libssh-dev xsltproc fop libxml2-utils libncurses-dev

      - name: Install system packages on macOS
        if: ${{ runner.os == 'macOS' }}
        run: brew install autoconf openssl@1.1

      - name: Test plugin
        uses: asdf-vm/actions/plugin-test@v1
        with:
          command: erl -eval '{ok, Version} = file:read_file(filename:join([code:root_dir(), "releases", erlang:system_info(otp_release), "OTP_VERSION"])), io:fwrite(re:replace(Version, "(^\\s+)|(\\s+$)", "", [global,{return,list}])), halt().' -noshell

  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Run ShellCheck
        run: scripts/shellcheck.bash

  format:
    runs-on: macos-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Install shfmt
        run: brew install shfmt

      - name: Run shfmt
        run: scripts/shfmt.bash


================================================
FILE: .gitignore
================================================
kerl
kerl-home


================================================
FILE: .tool-versions
================================================
shellcheck 0.7.1
shfmt 3.3.0


================================================
FILE: .travis.yml
================================================
language: c
script: |-
  travis_wait 40 asdf plugin-test erlang . --asdf-plugin-gitref $TRAVIS_COMMIT erl -eval '{ok, Version} = file:read_file(filename:join([code:root_dir(), "releases", erlang:system_info(otp_release), "OTP_VERSION"])), io:fwrite(re:replace(Version, "(^\\s+)|(\\s+$)", "", [global,{return,list}])), halt().' -noshell
before_script:
  - git clone https://github.com/asdf-vm/asdf.git
  - . asdf/asdf.sh
os:
  - linux
  - osx
install:
  - if [ $TRAVIS_OS_NAME = linux ]; then sudo apt-get install -y xsltproc fop; fi


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2017 asdf version manager

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
# asdf-erlang

Erlang plugin for [asdf](https://github.com/asdf-vm/asdf) version manager that relies on [kerl](https://github.com/kerl/kerl) for builds.

This plugin aims to combine the best of both worlds by using kerl.

kerl's compatibility and build scripts, together with asdf's easy version switching and support for the .tool-versions file. You do not need to have kerl already installed to use this. The plugin will install it's own version of kerl automatically.

## Install

```
asdf plugin add erlang https://github.com/asdf-vm/asdf-erlang.git
```

**Important**: Make sure to read the [Before asdf install](#before-asdf-install) section below to install dependencies!

## Use

Check [asdf](https://github.com/asdf-vm/asdf) readme for instructions on how to install & manage versions of Erlang. To specify custom options you [can set environment variables just as you would when using kerl](https://github.com/kerl/kerl#kerl_base_dir). For example, to skip the Java dependency during installation use:

```
export KERL_CONFIGURE_OPTIONS="--disable-debug --without-javac"
asdf install erlang <version>
```

You can also install Erlang from git, or provide the url to a fork and build from git.

```
asdf install erlang ref:master

export OTP_GITHUB_URL="https://github.com/basho/otp"
asdf install erlang ref:basho
```

See [kerl](https://github.com/kerl/kerl) for the complete list of customization options. Note that the `KERL_BASE_DIR` and `KERL_CONFIG` environment variables are set by the plugin when it runs kerl so it will not be possible to customize them.

## Before `asdf install`

### Ubuntu and Debian

Note that if you are using a previous version of Linux, you may need a different version of one of the below
libraries.

#### Ubuntu 16.04 LTS "Xenial Xerus"

Install the build tools (dpkg-dev g++ gcc libc6-dev make debianutils m4 perl)
`apt-get -y install build-essential autoconf`

Needed for HiPE (native code) support, but already installed by autoconf
`apt-get -y install m4`

Needed for terminal handling (libc-dev libncurses5 libtinfo-dev libtinfo5 ncurses-bin)
`apt-get -y install libncurses5-dev`

For building with wxWidgets (start observer or debugger!). Note that you may need to select the right `wx-config` before installing Erlang.
`apt-get -y install libwxgtk3.0-dev libgl1-mesa-dev libglu1-mesa-dev libpng-dev`

For building ssl (libssh-4 libssl-dev zlib1g-dev)
`apt-get -y install libssh-dev`

ODBC support (libltdl3-dev odbcinst1debian2 unixodbc)
`apt-get -y install unixodbc-dev`

For building documentation:
`apt-get install xsltproc fop`

If you want to install all the above:
`apt-get -y install build-essential autoconf m4 libncurses5-dev libwxgtk3.0-dev libgl1-mesa-dev libglu1-mesa-dev libpng-dev libssh-dev unixodbc-dev xsltproc fop`

#### Ubuntu 20.04 LTS

If you need to use `wxWebView` in Erlang you'll want to install a library for it:
`apt-get -y install libwxgtk-webview3.0-gtk3-dev`

If you want to install all the above:
`apt-get -y install build-essential autoconf m4 libncurses5-dev libwxgtk3.0-gtk3-dev libwxgtk-webview3.0-gtk3-dev libgl1-mesa-dev libglu1-mesa-dev libpng-dev libssh-dev unixodbc-dev xsltproc fop libxml2-utils libncurses-dev openjdk-11-jdk`

#### Ubuntu 24.04 LTS
If you want to install all the above:
`apt-get -y install build-essential autoconf m4 libwxgtk3.2-dev libwxgtk-webview3.2-dev libgl1-mesa-dev libglu1-mesa-dev libpng-dev libssh-dev unixodbc-dev xsltproc fop libxml2-utils libncurses-dev openjdk-11-jdk`

#### Debian 12 (bookworm)

To install the whole dependency suite:
`apt-get -y install build-essential autoconf m4 libncurses-dev libwxgtk3.2-dev libwxgtk-webview3.2-dev libgl1-mesa-dev libglu1-mesa-dev libpng-dev libssh-dev unixodbc-dev xsltproc fop libxml2-utils openjdk-17-jdk`

#### Debian 13 (trixie)

To install the whole dependency suite:
`apt-get -y install build-essential autoconf m4 libncurses-dev libwxgtk3.2-dev libwxgtk-webview3.2-dev libgl1-mesa-dev libglu1-mesa-dev libpng-dev libssh-dev unixodbc-dev xsltproc fop libxml2-utils openjdk-21-jdk`

### Arch Linux

Provides most of the needed build tools.
`pacman -S --needed base-devel`

Needed for terminal handling
`pacman -S ncurses`

For building with wxWidgets (start observer or debugger!). Make sure `wx-config --selected-config` prints `gtk3-unicode-...` before installing Erlang. Older OTP builds may require wxgtk2, in that case install `wxgtk2-dev` from AUR.
`pacman -S glu mesa wxwidgets-gtk3 libpng`

For building ssl
`pacman -S libssh`

ODBC support
`sudo pacman -S unixodbc`

For building documentation and elixir reference builds:
`sudo pacman -S libxslt fop`

#### Dealing with ODBC issues on arch

You may encounter an ODBC error with an output along these lines:

```
error: ld returned 1 exit status
[x86_64-pc-linux-gnu/Makefile:112: ../priv/bin/x86_64-pc-linux-gnu/odbcserver] Error 1

or

* odbc           : ODBC library - link check failed
```

This issue has been discussed [here](https://github.com/asdf-vm/asdf-erlang/issues/286) and also appears on kerl. There are
a link error on Kerl auto configure. If you see this, add a export flag `--with-odbc` to KERL-CONFIGURE. Here is
an example that skips the java dependency and also sets a specific (and existing)
path for unixodbc installed via pacman:
```
export KERL_CONFIGURE_OPTIONS="--without-javac --with-odbc=/var/lib/pacman/local/unixodbc-$(pacman -Q unixodbc | cut -d' ' -f2)"
asdf install erlang <version>
```

### OSX

Note, for MacOS 10.15.4 and newer, 22.3.1 is the earliest version that can be installed through `kerl` (and, therefore, `asdf`). Earlier versions will fail to compile. See [this issue](https://github.com/kerl/kerl/issues/335#issuecomment-605487028) for details.

Install the build tools
`brew install autoconf`

Install OpenSSL
`brew install openssl@1.1`  _Erlang 24.1 and older require OpenSSL 1.1, [read more here](https://github.com/erlang/otp/issues/4577#issuecomment-925962048)_

Note, Erlang 25.1 and newer [support OpenSSL 3.0, even for production use.](https://github.com/erlang/otp/releases/tag/OTP-25.1)
If you want to build Erlang with openssl@3.0, install it by `brew install openssl`

For building with wxWidgets (start observer or debugger!). Note that you may need to select the right `wx-config` before installing Erlang.
`brew install wxwidgets`

For building documentation and elixir reference builds:
`brew install libxslt fop`

#### Dealing with OpenSSL issues on macOS

You may encounter an SSL error with an output along these lines:

```
crypto : No usable OpenSSL found
ssh : No usable OpenSSL found
ssl : No usable OpenSSL found
```

This issue has been documented [on `kerl`](https://github.com/kerl/kerl/issues/320). If you see this
error, you can use the [`--with-ssl`](https://github.com/asdf-vm/asdf-erlang/issues/82#issuecomment-415930974)
flag with a path before installing Erlang. Here is an example that skips the java dependency and also sets a specific (and existing)
path for [OpenSSL](https://github.com/kerl/kerl#kerl-and-openssl) installed via brew on macOS.

```
export KERL_CONFIGURE_OPTIONS="--without-javac --with-ssl=$(brew --prefix openssl@1.1)"
asdf install erlang <version>
```

### CentOS & Fedora

These steps assume a most recent build of CentOS (currently
tested on CentOS 7.5 x64 & Fedora 28 x64)

Install the build tools
`sudo yum install -y git gcc g++ automake autoconf`

Needed for terminal handling
`sudo yum install -y ncurses-devel`

For building with wxWidgets (start observer or debugger!). Note that you may need to select the right `wx-config` before installing Erlang.
`sudo yum install -y wxGTK-devel wxBase`

For building ssl
`sudo yum install -y openssl-devel`

For jinterface
`sudo yum install -y java-1.8.0-openjdk-devel`

ODBC support
`sudo yum install -y libiodbc unixODBC-devel.x86_64 erlang-odbc.x86_64`

For the documentation to be built
`sudo yum install -y libxslt fop`

### Solus

Install the build tools

```bash
sudo eopkg it -c system.devel
```

For building with wxWidgets (start observer or debugger!). Note that you may need to select the right `wx-config` before installing Erlang.

```bash
sudo eopkg install wxwidgets-devel libx11-devel mesalib-devel libglu-devel fop
```

For ODBC support

```bash
sudo eopkg install unixodbc-devel
```

For jinterface

```bash
sudo eopkg install openjdk-8 openjdk-8-devel
```

If you want to install all of the above

```bash
# Install build tools
sudo eopkg it -c system.devel

sudo eopkg install wxwidgets-devel libx11-devel mesalib-devel libglu-devel fop unixodbc-devel openjdk-8 openjdk-8-devel
```

#### OpenJDK issues on Solus

I ran into an issue where `javac` wasn't a recognized command in the terminal despite having installed `openjdk-8` and `openjdk-8-devel`. Turns out it wasn't added to `PATH` by default. So simply add it to `PATH` like so:

```bash
# In ~/.bashrc add these to add Java to PATH
JAVA_HOME=/usr/lib64/openjdk-8
PATH=$PATH:$JAVA_HOME/bin

# In terminal
source ~/.bashrc
```

### openSUSE Tumbleweed

Even after you have installed the dependencies below, the Erlang installer will warn that g++ and openssl-devel appear missing.  This is safe to ignore.

The basic stuff to get Erlang to compile:

```
sudo zypper install unzip make automake autoconf gcc-c++ ncurses-devel
```

For crypto, ssh, and others (you probably want this):

```
sudo zypper install libssh-devel libopenssl-devel
```

For wx GUIs (observer, debugger, etc):

```
sudo zypper install wxGTK3-3_2-devel
```

To build documentation:

```
sudo zypper install fop libxml2-tools libxslt-tools
```

For ODBC support:

```
sudo zypper install unixODBC-devel
```

For jinterface:

```
sudo zypper install java-1_8_0-openjdk-devel
```

## Getting Erlang documentation

Erlang may come with documentation included (as man pages, pdfs and html files,
or even embedded documentation (via `c:h` function)).

For man pages this allows typing `erl -man ets` to get info on `ets` module.

For embedded documentation (on [OTP 23\+](https://www.erlang.org/downloads/23)):
- In Erlang's `erl`: via [`c:h/1,2,3`](https://erlang.org/doc/man/c.html#h/1) and [`c:ht/1,2,3`](https://erlang.org/doc/man/c.html#ht/1) for types
- In Elixir's `iex` (Elixir 1.7+): via [`h/1`](https://hexdocs.pm/iex/IEx.Helpers.html#h/1) and [`t/1`](https://hexdocs.pm/iex/IEx.Helpers.html#t/1) for types

`asdf-erlang` uses kerl for builds, and [kerl](https://github.com/kerl/kerl) is
capable of building the docs for specified version of Erlang in required
formats.

For kerl to be able to build Erlang documentation two requirements have to be met:
1. `KERL_BUILD_DOCS` environment variable has to be set to value `yes`
2. Additional dependencies have to be installed. For detailed list of dependencies for your OS please refer to the specific section above

Additionally, HTML and Man formats can be ignored entirely:
- `KERL_INSTALL_HTMLDOCS` set to `no` to not install HTML docs
- `KERL_INSTALL_MANPAGES` set to `no` to skip Man pages.

By default, docs in both of these formats are installed if `KERL_BUILD_DOCS` is set.

*It may be a good idea to disable those formats to **save space***, since **docs can easily take around 200MB** in addition to 100MB of base installation, yet to *still have docs inside shell*.

**Note:** Environment variable has to be set before `asdf install erlang <version>` is executed, to take effect.

### Setting the environment variable in bash

Type: `export KERL_BUILD_DOCS=yes` to create `KERL_BUILD_DOCS` environment variable and set it to `true`.
Repeat the same for `KERL_INSTALL_HTMLDOCS` `KERL_INSTALL_MANPAGES` if required (see above).

This line could be added to your `.bashrc` in case you want `KERL_BUILD_DOCS` to be set for future (future installations of Erlang).

To remove environment variable: `unset KERL_BUILD_DOCS`.

### Setting the environment variable in fish shell

Type: `set -xg KERL_BUILD_DOCS yes` to set environment variable.
Repeat the same for `KERL_INSTALL_HTMLDOCS` `KERL_INSTALL_MANPAGES` if required (see above).

In case you want it to be persisted between sessions (machine reboots - for example for future installations) type `set -xU KERL_BUILD_DOCS yes`.

To remove environment variable type: `set -e KERL_BUILD_DOCS`.

### Use a specific version of kerl

Overriding the default kerl version shouldn't ever be necessary, but if you want to you a specific version of kerl you can set:

```shell
export ASDF_KERL_VERSION="2.1.1"
```


================================================
FILE: bin/install
================================================
#!/usr/bin/env bash

# Unoffical Bash "strict mode"
# http://redsymbol.net/articles/unofficial-bash-strict-mode/
set -euo pipefail
#ORIGINAL_IFS=$IFS
IFS=$'\t\n' # Stricter IFS settings

# shellcheck source=lib/utils.sh
source "$(dirname "$0")/../lib/utils.sh"

install_erlang() {
    ensure_kerl_setup
    local build_name

    install_dependency_checks
    ensure_kerl_config_opts
    set_unixodbc_opt
    set_ssl_opt
    add_openjdk_to_path
    ensure_ulimit

    echo "[asdf-erlang] 📦 Building with $(env | grep KERL_CONFIGURE_OPTIONS)"

    build_name="asdf_$ASDF_INSTALL_VERSION"

    export MAKEFLAGS="-j$ASDF_CONCURRENCY"

    if $(kerl_path) list installations | grep -q "$build_name"; then
        echo "[asdf-erlang] 🧹 Cleanup kerl installation $build_name"
        $(kerl_path) delete installation "$build_name" || true
    else
        echo "[asdf-erlang] ❄️ No kerl installation to cleanup for $build_name"
    fi
    if $(kerl_path) list builds | grep -q "$build_name"; then
        echo "[asdf-erlang] 🧹 Cleanup kerl build $build_name"
        $(kerl_path) delete build "$build_name" || true
    else
        echo "[asdf-erlang] ❄️ No kerl build to cleanup for $build_name"
    fi

    if [ "$ASDF_INSTALL_TYPE" = "ref" ]; then
        $(kerl_path) build git "${OTP_GITHUB_URL:-https://github.com/erlang/otp.git}" "$ASDF_INSTALL_VERSION" "$build_name"
    else
        $(kerl_path) build "$ASDF_INSTALL_VERSION" "$build_name"
    fi

    # We hide all output from this command so the
    # "You can activate this installation running the following command:"
    # that doesn't apply is hidden
    echo "👷🏼 kerl install $build_name $ASDF_INSTALL_PATH"
    $(kerl_path) install "$build_name" "$ASDF_INSTALL_PATH" >/dev/null 2>&1

    echo "🧹 Cleanup kerl build $build_name"
    $(kerl_path) cleanup "$build_name"

    echo "🔗 Linking app executables $ASDF_INSTALL_PATH"
    link_app_executables "$ASDF_INSTALL_PATH"
    cleanup_custom_env_vars
    echo "👍 Installed erlang ${ASDF_INSTALL_VERSION}"
}

link_app_executables() {
    local install_path=$1

    # Link other executables to the bin directory so that asdf shims are created for them
    cd "$install_path/bin"

    # ln call may fail if multiple executables are found with the same name, so
    # we loop over all files matching these patterns, and symlink only if
    # file with same name does not already exist in "$install_path/bin"
    for file in ../lib/*/bin/* ../lib/*/priv/bin/*; do
        bin_name="$(basename "$file")"

        if [ ! -e "./$bin_name" ]; then
            ln -s "$file" .
        fi
    done
}

install_dependency_checks() {
    if [[ "$OSTYPE" == "darwin"* ]]; then
        installed_packages=()
        for package in fop openssl unixodbc openjdk wxmac; do
            if brew list --versions "$package" >/dev/null 2>&1; then
                installed_packages+=("$package")
            else
                if [ "$package" = "wxmac" ]; then
                    echo "[asdf-erlang] ⚠️ Warning: $package is optional and not installed. You can install it using 'brew install --build-from-source wxmac'."
                    echo "[asdf-erlang] ⚠️ Note: wxmac is required for building Erlang/OTP with a working :observer"
                else
                    echo "[asdf-erlang] ⚠️ Warning: $package is optional and not installed. Please install it using 'brew install $package'."
                fi
            fi
        done
    fi
}

ensure_kerl_config_opts() {
    if [[ -z "${KERL_CONFIGURE_OPTIONS:-}" ]]; then
        export KERL_CONFIGURE_OPTIONS=""
    fi
}

set_unixodbc_opt() {
    if [[ "$OSTYPE" == "darwin"* ]]; then
        # If no unixodbc is installed, then skip.
        if ! brew --prefix unixodbc >/dev/null 2>&1; then
            return
        fi

        if [[ ! "$KERL_CONFIGURE_OPTIONS" =~ unixodbc ]]; then
            local kerl_unixodbc_opt
            kerl_unixodbc_opt=" --with-odbc=$(brew --prefix unixodbc)"
            export KERL_CONFIGURE_OPTIONS+=" $kerl_unixodbc_opt"
            echo "[asdf-erlang] 🛟 Added unixodbc to KERL_CONFIGURE_OPTIONS: $kerl_unixodbc_opt"
        fi

        # If CC not set, then set CC.
        # ELSE add the unixodbc include path to CC.
        if [ -z "${CC:-}" ]; then
            CC="/usr/bin/clang -I$(brew --prefix unixodbc)/include"
            export CC
            echo "[asdf-erlang] 🛟 No CC found. Setting CC to: $CC"
            CC_SET_BY_ASDF_ERLANG=1 # so that we can clear it later.
        elif [[ "$CC" != *unixodbc* ]]; then
            CC+=" -I$(brew --prefix unixodbc)/include"
            export CC
            echo "[asdf-erlang] 🛟 Added unixodbc include path to CC: $CC"
        fi

        # If LDFLAGS not set, then set LDFLAGS.
        # ELSE add the unixodbc library path to LDFLAGS.
        if [ -z "${LDFLAGS:-}" ]; then
            LDFLAGS="-L$(brew --prefix unixodbc)/lib"
            export LDFLAGS
            echo "[asdf-erlang] 🛟 No LDFLAGS found. Setting LDFLAGS to: $LDFLAGS"
            LDFLAGS_SET_BY_ASDF_ERLANG=1 # so that we can clear it later.
        elif [[ "$LDFLAGS" != *unixodbc* ]]; then
            local unixodbc_lib_path
            unixodbc_lib_path="$(brew --prefix unixodbc)/lib"
            export LDFLAGS+=" -L$unixodbc_lib_path"
            echo "[asdf-erlang] 🛟 Added $unixodbc_lib_path to LDFLAGS env var"
        fi
    fi
}

add_openjdk_to_path() {
    if [[ "$OSTYPE" == "darwin"* ]]; then
        if ! brew --prefix openjdk >/dev/null 2>&1; then
            return
        fi

        local openjdk_path
        openjdk_path="$(brew --prefix openjdk)"
        if [[ ":$PATH:" != *":$openjdk_path/bin:"* ]]; then
            export PATH="$openjdk_path/bin:$PATH"
            echo "[asdf-erlang] 🛟 OpenJDK has been added to PATH for this terminal session: $openjdk_path/bin"
            echo "[asdf-erlang] Please ensure this is included in your shell's dot files (.zshrc, .bashrc, etc.)"
        fi
    fi
}

ensure_ulimit() {
    if [ "$(ulimit -n)" -lt 1000 ]; then
        ulimit -n 65536
        echo "[asdf-erlang] 🛟 ulimit was low. It has been set to 65536 for this terminal session"
    fi
}

set_ssl_opt() {
    if [[ "$OSTYPE" == "darwin"* ]]; then
        # If this is a ref install, then we don't need to set the ssl option.
        # Reason: Don't want to handle that for now.
        if [[ "$ASDF_INSTALL_TYPE" == "ref" ]]; then
            echo "[asdf-erlang] ⚠️ Skipping setting --with-ssl in KERL_CONFIGURE_OPTIONS for ref install"
            return
        fi

        otp_major=$(echo "$ASDF_INSTALL_VERSION" | cut -d. -f1)
        otp_minor=$(echo "$ASDF_INSTALL_VERSION" | cut -d. -f2)

        # Copied IF condition check from the kerl binary to match their version check.
        # We only have to fix/handle newer erlang+openssl versions because of kerl looking for openssl@3.0 instead of openssl#3.
        # The erlang version that use openssl 1.1 should be fine (or as is).
        if [ "$otp_major" = 'git' ] || [ "$otp_major" -lt 25 ] || { [ "$otp_major" -eq 25 ] && [ "$otp_minor" -lt 1 ]; }; then
            echo "[asdf-erlang] ⚠️ Skipping setting --with-ssl in KERL_CONFIGURE_OPTIONS. This erlang version uses openssl v1.x"
            return
        fi

        # Only set the ssl option for newer erlang versions that use openssl@3.
        if ! brew --prefix openssl@3 >/dev/null 2>&1; then
            echo "[asdf-erlang] ⚠️ Skipping setting --with-ssl in KERL_CONFIGURE_OPTIONS. brew prefix path for openssl@3 not found."
            return
        fi

        # If openssl is not already in KERL_CONFIGURE_OPTIONS, then add it.
        if [[ ! "$KERL_CONFIGURE_OPTIONS" =~ openssl ]]; then
            local kerl_ssl_opt
            kerl_ssl_opt=" --with-ssl=$(brew --prefix openssl@3)"
            export KERL_CONFIGURE_OPTIONS+=" $kerl_ssl_opt"
            echo "[asdf-erlang] 🛟 Added openssl to KERL_CONFIGURE_OPTIONS: $kerl_ssl_opt"
        fi
    fi
}

cleanup_custom_env_vars() {
    if [[ "${LDFLAGS_SET_BY_ASDF_ERLANG:-}" == "1" ]]; then
        unset LDFLAGS
    fi

    if [[ "${CC_SET_BY_ASDF_ERLANG:-}" == "1" ]]; then
        unset CC
    fi
}

install_erlang


================================================
FILE: bin/list-all
================================================
#!/usr/bin/env bash

# Unoffical Bash "strict mode"
# http://redsymbol.net/articles/unofficial-bash-strict-mode/
set -euo pipefail
#ORIGINAL_IFS=$IFS
IFS=$'\t\n' # Stricter IFS settings

# shellcheck source=lib/utils.sh
source "$(dirname "$0")/../lib/utils.sh"

list_all() {
    ensure_kerl_setup
    "$(kerl_path)" list releases all | tr '\n' ' '
}

list_all


================================================
FILE: bin/uninstall
================================================
#!/usr/bin/env bash

# Unoffical Bash "strict mode"
# http://redsymbol.net/articles/unofficial-bash-strict-mode/
set -euo pipefail
#ORIGINAL_IFS=$IFS
IFS=$'\t\n' # Stricter IFS settings

# shellcheck source=lib/utils.sh
source "$(dirname "$0")/../lib/utils.sh"

ensure_kerl_setup

if [ "$ASDF_INSTALL_VERSION" == "" ]; then
    echo "Please provide the version you want to uninstall"
    exit 1
fi

# Remove the installation and build if the installation was done by kerl
if $(kerl_path) list installations | grep "$ASDF_INSTALL_PATH"; then
    $(kerl_path) delete build "asdf_$ASDF_INSTALL_VERSION" || true
    $(kerl_path) delete installation "$ASDF_INSTALL_PATH" || true
fi

# Finally make sure the directory is actually removed regardless of what the
# previous kerl commands did
rm -rf "$ASDF_INSTALL_PATH" || true


================================================
FILE: lib/utils.sh
================================================
export KERL_VERSION="${ASDF_KERL_VERSION:-4.4.0}"

handle_failure() {
    function=$1
    error_message=$2
    $function && exit_code=$? || exit_code=$?

    if [ "$exit_code" -ne 0 ]; then
        printf "%s\\n" "$error_message" 1>&2
    fi

    return "$exit_code"
}

ensure_kerl_setup() {
    handle_failure set_kerl_env 'Failed to set kerl environment'
    handle_failure ensure_kerl_installed 'Failed to install kerl'
    handle_failure update_available_versions 'Failed to update available versions'
}

ensure_kerl_installed() {
    if [ ! -f "$(kerl_path)" ]; then
        download_kerl
    elif [ "$("$(kerl_path)" version)" != "$KERL_VERSION" ]; then
        # If the kerl file already exists and the version does not match, remove
        # it and download the correct version
        rm "$(kerl_path)"
        download_kerl
    fi
}

download_kerl() {
    # Print to stderr so asdf doesn't assume this string is a list of versions
    printf "Downloading kerl...\\n" >&2

    local kerl_url="https://raw.githubusercontent.com/kerl/kerl/${KERL_VERSION}/kerl"

    curl -Lo "$(kerl_path)" "$kerl_url"
    chmod +x "$(kerl_path)"
}

kerl_path() {
    printf "%s\\n" "$(dirname "$(dirname "$0")")/kerl"
}

set_kerl_env() {
    local kerl_home
    kerl_home="$(dirname "$(dirname "$0")")/kerl-home"
    mkdir -p "$kerl_home"
    export KERL_BASE_DIR="$kerl_home"
    export KERL_BUILD_BACKEND="git"
    export KERL_CONFIG="$kerl_home/.kerlrc"
    export KERL_DOWNLOAD_DIR="${ASDF_DOWNLOAD_PATH:-}"
}

update_available_versions() {
    "$(kerl_path)" update releases >/dev/null
}


================================================
FILE: scripts/shellcheck.bash
================================================
#!/usr/bin/env bash

exec shellcheck -s bash -x bin/* -x lib/*


================================================
FILE: scripts/shfmt.bash
================================================
#!/usr/bin/env bash

exec shfmt -d bin/* lib/*
Download .txt
gitextract_43m9n7ar/

├── .editorconfig
├── .github/
│   └── workflows/
│       └── ci.yml
├── .gitignore
├── .tool-versions
├── .travis.yml
├── LICENSE
├── README.md
├── bin/
│   ├── install
│   ├── list-all
│   └── uninstall
├── lib/
│   └── utils.sh
└── scripts/
    ├── shellcheck.bash
    └── shfmt.bash
Condensed preview — 13 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (29K chars).
[
  {
    "path": ".editorconfig",
    "chars": 130,
    "preview": "root = true\n\n[*]\nindent_style = space\nindent_size = 4\ncharset = utf-8\ntrim_trailing_whitespace = true\ninsert_final_newli"
  },
  {
    "path": ".github/workflows/ci.yml",
    "chars": 1578,
    "preview": "name: CI\n\non:\n  pull_request:\n    types:\n      - opened\n      - synchronize\n      - reopened\n    paths-ignore:\n      - \""
  },
  {
    "path": ".gitignore",
    "chars": 15,
    "preview": "kerl\nkerl-home\n"
  },
  {
    "path": ".tool-versions",
    "chars": 29,
    "preview": "shellcheck 0.7.1\nshfmt 3.3.0\n"
  },
  {
    "path": ".travis.yml",
    "chars": 533,
    "preview": "language: c\nscript: |-\n  travis_wait 40 asdf plugin-test erlang . --asdf-plugin-gitref $TRAVIS_COMMIT erl -eval '{ok, Ve"
  },
  {
    "path": "LICENSE",
    "chars": 1077,
    "preview": "MIT License\n\nCopyright (c) 2017 asdf version manager\n\nPermission is hereby granted, free of charge, to any person obtain"
  },
  {
    "path": "README.md",
    "chars": 12447,
    "preview": "# asdf-erlang\n\nErlang plugin for [asdf](https://github.com/asdf-vm/asdf) version manager that relies on [kerl](https://g"
  },
  {
    "path": "bin/install",
    "chars": 8146,
    "preview": "#!/usr/bin/env bash\n\n# Unoffical Bash \"strict mode\"\n# http://redsymbol.net/articles/unofficial-bash-strict-mode/\nset -eu"
  },
  {
    "path": "bin/list-all",
    "chars": 360,
    "preview": "#!/usr/bin/env bash\n\n# Unoffical Bash \"strict mode\"\n# http://redsymbol.net/articles/unofficial-bash-strict-mode/\nset -eu"
  },
  {
    "path": "bin/uninstall",
    "chars": 820,
    "preview": "#!/usr/bin/env bash\n\n# Unoffical Bash \"strict mode\"\n# http://redsymbol.net/articles/unofficial-bash-strict-mode/\nset -eu"
  },
  {
    "path": "lib/utils.sh",
    "chars": 1585,
    "preview": "export KERL_VERSION=\"${ASDF_KERL_VERSION:-4.4.0}\"\n\nhandle_failure() {\n    function=$1\n    error_message=$2\n    $function"
  },
  {
    "path": "scripts/shellcheck.bash",
    "chars": 63,
    "preview": "#!/usr/bin/env bash\n\nexec shellcheck -s bash -x bin/* -x lib/*\n"
  },
  {
    "path": "scripts/shfmt.bash",
    "chars": 47,
    "preview": "#!/usr/bin/env bash\n\nexec shfmt -d bin/* lib/*\n"
  }
]

About this extraction

This page contains the full source code of the asdf-vm/asdf-erlang GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 13 files (26.2 KB), approximately 7.8k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!