# EcKit

<div align="center">

[![Latest Tag](https://img.shields.io/github/v/tag/ecmwf/eckit?label=latest&style=flat-square&logo=github)](https://github.com/ecmwf/eckit/tags)
[![CI](https://img.shields.io/github/actions/workflow/status/ecmwf/eckit/ci.yml?branch=master&label=ci%20(master)&style=flat-square&logo=github)](https://github.com/ecmwf/eckit/actions/workflows/ci.yml)
[![CI](https://img.shields.io/github/actions/workflow/status/ecmwf/eckit/ci.yml?branch=develop&label=ci%20(develop)&style=flat-square&logo=github)](https://github.com/ecmwf/eckit/actions/workflows/ci.yml)

[![codecov](https://codecov.io/gh/ecmwf/eckit/branch/develop/graph/badge.svg)](https://codecov.io/gh/ecmwf/eckit)
[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://github.com/ecmwf/eckit/blob/develop/LICENSE)
[![Project Maturity](https://github.com/ecmwf/codex/raw/refs/heads/main/Project%20Maturity/graduated_badge.svg)](https://github.com/ecmwf/codex/raw/refs/heads/main/Project%20Maturity#graduated)

</div>

> [!IMPORTANT]
> This software is **Graduated** and subject to ECMWF's guidelines on
> [Software Maturity](https://github.com/ecmwf/codex/raw/refs/heads/main/Project%20Maturity).

## Overview

EcKit is a cross-platform C++ toolkit that supports development of tools and
applications at ECMWF. It is based on code developed over the last 20 years
within the MARS software and was re-factored out to be reused by other
applications. It provides an abstraction layer on top of the operating system,
so it is easier to port code to new architectures. It is developed taking into
account the robustness requirements of running production systems at ECMWF. The
main focus is UNIX/POSIX systems, and it has been thoroughly tested on Linux
and Mac OSX. Historically, the code base pre-dates and in some way can be seen
as a leaner substitute for some 'Boost' libraries.

## Features

It features facilities to easily handle, in a cross-platform way:

* multi-threading
* json and yaml parsing
* object serialization and persistence
* object serialization supporting compression, to and from file and network
* configuration of user options and resources
* file-system abstraction
* regular expressions
* socket networking
* http protocol
* type-to-type conversions
* asynchronous IO
* asynchronous processing
* exception handling and stack dumping
* MPI object-oriented wrapper
* linear algebra abstraction with multiple backends (BLAS, MKL, Eigen3)
* advanced container classes
* space partition trees
* file-mapped arrays

## Requirements

Make sure ecbuild is installed and the ecbuild executable script is found (`which ecbuild`).

Now proceed with installation as follows:

```bash
# Environment --- Edit as needed
srcdir=$(pwd)
builddir=build
installdir=$HOME/.local

# 1. Create the build directory:
mkdir $builddir
cd $builddir

# 2. Run CMake
ecbuild --prefix=$installdir -- $srcdir

# 3. Compile / Install
make -j10
make install

# 4. Check installation
$installdir/bin/eckit-version
```
