summaryrefslogtreecommitdiffstats
path: root/README.md
blob: a6c939aa4f6c005df79c1767930b4bc1d75042e4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# meli
For a quick start, build and install locally:

```sh
 PREFIX=~/.local make install
```

Available subcommands:
 - meli (builds meli with optimizations in `$CARGO_TARGET_DIR`)
 - install (installs binary in `$BINDIR` and documentation to `$MANDIR`)
 - uninstall
Secondary subcommands:
 - clean (cleans build artifacts)
 - check-deps (checks dependencies)
 - install-bin (installs binary to `$BINDIR`)
 - install-doc (installs manpages to `$MANDIR`)
 - help (prints this information)
 - dist (creates release tarball named `meli-VERSION.tar.gz` in this directory)
 - deb-dist (builds debian package in the parent directory)
 - distclean (cleans distribution build artifacts)

The Makefile *should* be portable and not require a specific `make` version.

# Documentation

After installing meli, see `meli(1)` and `meli.conf(5)` for documentation. Sample configuration and theme files can be found in the `samples/` subdirectory.

# Building

meli requires rust 1.39 and rust's package manager, Cargo. Information on how
to get it on your system can be found here: <https://doc.rust-lang.org/cargo/getting-started/installation.html>

With Cargo available, the project can be built with

```sh
make
```

The resulting binary will then be found under `target/release/meli`

Run:

```sh
make install
```

to install the binary and man pages. This requires root, so I suggest you override the default paths and install it in your `$HOME`:

```sh
make PREFIX=$HOME/.local install
```

See `meli(1)` and `meli.conf(5)` for documentation.

You can build and run meli with one command:

```sh
cargo run --release
```

While the project is in early development, meli will only be developed for the
linux kernel and respected linux distributions. Support for more UNIX-like OSes
is on the roadmap.

## Features

Some functionality is held behind "feature gates", or compile-time flags. The following list explains each feature's purpose:

- `dbus-notifications` enables showing notifications using `dbus`.
- `notmuch` provides support for using a notmuch database as a mail backend
- `jmap` provides support for connecting to a jmap server and use it as a mail backend
- `sqlite3` provides support for builting fast search indexes in local sqlite3 databases
- `cli-docs` includes the manpage documentation compiled by either `mandoc` or `man` binary to plain text in `meli`'s command line. Embedded documentation can be viewed with the subcommand `meli man [PAGE]`
- `svgscreenshot` provides support for taking screenshots of the current view of meli and saving it as SVG files. Its only purpose is taking screenshots for the official meli webpage.
- `debug-tracing` enables various trace debug logs from various places around the meli code base. The trace log is printed in `stderr`.

## Building in Debian

Building with Debian's packaged cargo might require the installation of these
two packages: `librust-openssl-sys-dev librust-libdbus-sys-dev`

A `*.deb` package can be built with `make deb-dist`

# Using notmuch

To use the optional notmuch backend feature, you must have `libnotmuch5` installed in your system. In Debian-like systems, install the `libnotmuch5` packages. meli detects the library's presence on runtime.

# Building with JMAP

To build with JMAP support, prepend the environment variable `MELI_FEATURES='jmap'` to your make invocation:

```sh
MELI_FEATURES="jmap" make
```

or if building directly with cargo, use the flag `--features="jmap"'.

# Development

Development builds can be built and/or run with

```
cargo build
cargo run
```

There is a debug/tracing log feature that can be enabled by using the flag
`--feature debug-tracing` after uncommenting the features in `Cargo.toml`. The logs
are printed in stderr, thus you can run meli with a redirection (i.e `2> log`)

Code style follows the default rustfmt profile.

# Configuration

meli by default looks for a configuration file in this location: `$XDG_CONFIG_HOME/meli/config.toml`

You can run meli with arbitrary configuration files by setting the `$MELI_CONFIG`
environment variable to their locations, ie:

```sh
MELI_CONFIG=./test_config cargo run
```

# Testing

How to run specific tests:

```sh
cargo test -p {melib, meli} (-- --nocapture) (--test test_name)
```

# Profiling

```sh
perf record -g target/debug/bin
perf script | stackcollapse-perf | rust-unmangle | flamegraph > perf.svg
```

# Running fuzz targets

Note: `cargo-fuzz` requires the nightly toolchain.

```sh
cargo +nightly fuzz run envelope_parse -- -dict=fuzz/envelope_tokens.dict
```