Skip to content

Latest commit

 

History

History
176 lines (129 loc) · 6.83 KB

build.md

File metadata and controls

176 lines (129 loc) · 6.83 KB

Building babashka

Prerequisites

  • Install lein for producing uberjars

  • Download GraalVM. Currently we use jdk-22.

  • For Windows, installing Visual Studio 2019 with the "Desktop development with C++" workload is recommended.

  • Set $GRAALVM_HOME to the GraalVM distribution directory. On macOS this can look like:

    export GRAALVM_HOME=~/Downloads/graalvm-jdk-21.0.0.1/Contents/Home

    On linux:

    export GRAALVM_HOME=~/Downloads/graalvm-jdk-21.0.0.1

    On Windows, from the Visual Studio 2019 x64 Native Tools Command Prompt or cmd.exe (not Powershell):

    set GRAALVM_HOME=%USERPROFILE%\Downloads\graalvm-ce-jdk-21.0.0.1
    

    If you are not running from the x64 Native Tools Command Prompt, you will need to set additional environment variables using:

    call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"
    

Clone repository

NOTE: the babashka repository contains submodules. You need to use the --recursive flag to clone these submodules along with the main repo.

$ git clone https://github.com/babashka/babashka --recursive

To update later on:

$ git submodule update --init --recursive

Build

Run the uberjar and compile script:

$ script/uberjar
$ script/compile

To configure max heap size you can use:

$ export BABASHKA_XMX="-J-Xmx6500m"

Note: setting the max heap size to a low value can cause the build to crash or take long to complete.

Alternative: Build inside Docker

To build a Linux version of babashka, you can use docker build, enabling the desired features via --build-arg like this:

docker build --build-arg BABASHKA_FEATURE_JDBC=true --target BASE -t bb-builder .
container_id=$(docker create bb-builder)
docker cp $container_id:/opt/bb bb # copy to ./bb on the host file system
docker rm $container_id

NOTE: If you get Error: Image build request failed with exit status 137 then check whether Docker is allowed to use enough memory (e.g. in Docker Desktop preferences). If it is, then increase the memory GraalVM can use, for example by adding --build-arg BABASHKA_XMX="-J-Xmx8g" (or whatever Docker has available, bigger than the default).

Windows

Run script\uberjar.bat followed by script\compile.bat.

Static

To compile babashka as a static binary for linux, set the BABASHKA_STATIC environment variable to true.

Feature flags

Babashka supports the following feature flags:

Name Description Default
BABASHKA_FEATURE_CSV Includes the clojure.data.csv library true
BABASHKA_FEATURE_JAVA_NET_HTTP Includes commonly used classes from the java.net.http package true
BABASHKA_FEATURE_JAVA_NIO Includes commonly used classes from the java.nio package true
BABASHKA_FEATURE_JAVA_TIME Includes commonly used classes from the java.time package true
BABASHKA_FEATURE_TRANSIT Includes the transit-clj library true
BABASHKA_FEATURE_XML Includes the clojure.data.xml library true
BABASHKA_FEATURE_YAML Includes the clj-yaml library true
BABASHKA_FEATURE_HTTPKIT_CLIENT Includes the http-kit client library true
BABASHKA_FEATURE_HTTPKIT_SERVER Includes the http-kit server library true
BABASHKA_FEATURE_CORE_MATCH Includes the clojure.core.match library true
BABASHKA_FEATURE_HICCUP Includes the hiccup library true
BABASHKA_FEATURE_TEST_CHECK Includes the clojure.test.check library true
BABASHKA_FEATURE_SPEC_ALPHA Includes the clojure.spec.alpha library (WIP) false
BABASHKA_FEATURE_JDBC Includes the next.jdbc library false
BABASHKA_FEATURE_SQLITE Includes the sqlite-jdbc library false
BABASHKA_FEATURE_POSTGRESQL Includes the PostgresSQL JDBC driver false
BABASHKA_FEATURE_HSQLDB Includes the HSQLDB JDBC driver false
BABASHKA_FEATURE_ORACLEDB Includes the Oracle JDBC driver false
BABASHKA_FEATURE_DATASCRIPT Includes datascript false
BABASHKA_FEATURE_LANTERNA Includes clojure-lanterna false
BABASHKA_FEATURE_LOGGING Includes clojure.tools.logging with taoensso.timbre as the default implementation true
BABASHKA_FEATURE_PRIORITY_MAP Includes clojure.data.priority-map true

Note that httpkit server is currently experimental, the feature flag could be toggled to false in a future release.

To disable all of the above features, you can set BABASHKA_LEAN to true.

Here is an example commit that can be used as a checklist when you want to create a new feature flag.

HyperSQL

To compile babashka with the next.jdbc library and the embedded HyperSQL database:

$ export BABASHKA_FEATURE_JDBC=true
$ export BABASHKA_FEATURE_HSQLDB=true
$ script/uberjar
$ script/compile

Note: there is now a pod for working with HyperSQL.

PostgresQL

To compile babashka with the next.jdbc library and a PostgresQL driver:

$ export BABASHKA_FEATURE_JDBC=true
$ export BABASHKA_FEATURE_POSTGRESQL=true
$ script/uberjar
$ script/compile

Note: there is now a pod for working with PostgreSQL.

Lanterna

To compile babashka with the babashka/clojure-lanterna library:

$ export BABASHKA_FEATURE_LANTERNA=true
$ script/uberjar
$ script/compile

Example program:

(require '[lanterna.terminal :as terminal])

(def terminal (terminal/get-terminal))

(terminal/start terminal)
(terminal/put-string terminal "Hello TUI Babashka!" 10 5)
(terminal/flush terminal)

(read-line)