glm_freebsd

A Gleam package that allows you to easily create FreeBSD packages for your Gleam applications, along with a service script to manage the application (e.g. start|stop).

This is based on https://github.com/patmaddox/ex_freebsd

Package Version Hex Docs

Further documentation can be found at https://hexdocs.pm/glm_freebsd.

Quickstart

Install gleam and erlang

We need a minimum of gleam 1.14 and erlang28:

# use `latest`
echo 'FreeBSD-ports: { url: "pkg+https://pkg.FreeBSD.org/${ABI}/latest" }' > /usr/local/etc/pkg/repos/FreeBSD.conf
pkg update
pkg install -y erlang-runtime28 gleam rebar3 
./test_pkg.sh

Usage

Create a gleam app

$ gleam new APPNAME

Update the APPNAME/gleam.toml

Add the relevant FreeBSD package info to the gleam.toml

$ cd APPNAME
APPNAME $ vim gleam.toml

Add these elements:

name = "example"
version = "1.0.0"

...

[freebsd]
pkg_user = true
pkg_description = "This is a longer description .........................................................."
pkg_maintainer = "someone@example.com"
pkg_scripts = "post-install=post-install.sh,pre-deinstall=pre-deinstall.sh"


[freebsd.deps]
list = "pstree,tree"

[freebsd.deps.pstree]
version = "2.36"
origin = "sysutils/pstree"

[freebsd.deps.tree]
version = "2.2.1"
origin = "sysutils/tree"

NOTES: pkg_scripts and freebsd.deps are optional and just shown here to illustrate what you might want to put here. See below for a discussion on these elements.

Toml Elements

We pull the package name and version from the toml here:

name = "example"
version = "1.0.0"

The rest of the data comes from the [freebsd] described below:

TOML FIELDDESCRIPTION
[freebsd]this is the root toml element that this packaging code uses
pkg_user [truefalse] : if true then the package creates a user when installed. defaults to true.
pkg_usernamethe username to create if pkg_user is true. defaults to the value in ‘name’ above.
pkg_descriptiona longer description used by the packaging system.
pkg_maintaineremail address of the package maintainer. e.g. someone@example.com
pkg_scriptscomma separated k=v pairs, where k=script name, and value is a file in the output directory
typically a file generated from a template.defaults to: “post-install=post-install.sh,pre-deinstall=pre-deinstall.sh”
TOML FIELDDESCRIPTION
[freebsd.deps]the root of the list of OS package dependencies that YOUR package needs in order to function. list is the only child element.
lista list of the packages (DEP_NAME) that will follow.
TOML FIELDDESCRIPTION
[freebsd.deps.DEP_NAME]the root of a FreeBSD OS package dependency declaration. version and origin are the only child elements.
versionthe dependency version
originthe dependency origin

There are other fields that you might want to use. See the config.gleam file and specifically this Config:

pub type Config {
  Config(
    pkg_bin_path: String,
    pkg_config_dir: String,
    pkg_daemon_flags: String,
    pkg_dependencies: Dict(String, Dict(String, String)),
    pkg_env_file: String,
    pkg_comment: String,
    pkg_conf_dir_uppercase: String,
    pkg_description: String,
    pkg_maintainer: String,
    pkg_name: String,
    pkg_origin: String,
    pkg_prefix: String,
    pkg_scripts: Dict(String, String),
    pkg_user: Bool,
    pkg_username: String,
    pkg_version: String,
    pkg_www: String,
    pkg_var_dir: String,
  )
}

So if you wanted to pass in certain daemon flags, then you’d specify that in the toml file as pkg_daemon_flags = "...etc..." under [freebsd].

Create an erlang-shipment

gleam export erlang-shipment

Create a FreeBSD package

# clear the temporary directory
rm -rf ./tmp 

# run glm_freebsd to generate the package, the package file will be in this directory upon completion
gleam run -- templates --input ./priv/example/ --output ./tmp

# try installing the package
# see the ./test_pkg.sh for further details.
Search Document