Packaging guidelines

Hare depends on a POSIX-compatible C11 environment, and our compiler backend, qbe. To provide the minimum level of support for Hare, you need at least qbe, harec, and hare packages.

Your distro’s packages are our preferred means for users to install Hare and programs written in Hare. Your support is important to us. Please reach out to us if you have any questions.

Hare installation layout

Assuming a typical Unix filesystem layout (you can configure this in config.mk if you need something different), Hare expects to be installed in the following places:

  • /usr/bin/hare: The Hare build driver

  • /usr/bin/harec: The Hare compiler

  • /usr/bin/haredoc: The Hare documentation tool

  • /usr/src/hare/stdlib: The standard library source code

  • /usr/src/hare/third-party: Third-party library source code

The source code for Hare dependencies must be present to build Hare packages or read their documentation.

Timekeeping requirements

Hare’s timekeeping support in the standard library relies on a local installation of the IANA time zone database.

Warning

Hare uses the local leap second list, located at /usr/share/zoneinfo/leap-seconds.list by default, which is often not installed by many distributions. Please update your tzdata package accordingly when packaging Hare.

Customizing the toolchain

You should provide a config.mk file suitable for your distribution for the “hare” package (i.e. the stdlib et al) which configures the default values for the toolchain as appropriate for your distribution.

For each supported architecture, set e.g. AARCH64_AS to the appropriate binary name. For the native host, you will presumably use simply as, ld, and so on; for cross compiling you will provide something like aarch64-linux-gnu-as (assuming your distribution provides cross compilers).

Once packaged, the build driver will use the toolchains configured by config.mk by default, but on a per-build basis this can be overridden with the standard LD, AS, and similar environment variables. If linking with libc, LDFLAGS are passed to the C compiler; if not, LDLINKFLAGS are passed to the linker.

Hare programs are usually statically linked. We know you’re not a fan of this. We’re sorry.

Linking to native dependencies

See System libraries and C FFI.

Was your question not answered?

Please reach out and we’d be happy to help.