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
|
# Building Chawan
Chawan uses GNU make for builds.
## Variables
Following is a list of variables which may be safely overridden. You can
also override them by setting an environment variable with the same name.
* `TARGET`: the build target.
- `debug`: Generate a debug build, with stack traces and
debugging symbols enabled. Useful for debugging, but generates
huge and slow executables.
- `release`: The default target. Uses LTO and strips the final
binaries.
- `release0`: A release build with stack traces enabled. Useful
when you need to debug a crash that needs a lot of processing
to manifest. Note: this does not enable line traces.
- `release1`: A release build with debugging symbols enabled.
Useful for profiling with cachegrind, or debugging a release
build with gdb.
* `OUTDIR`: where to output the files.
* `NIM`: path to the Nim compiler.
* `CFLAGS`, `LDFLAGS`: flags to pass to the C compiler at compile or
link time.
* `OBJDIR`: directory to output compilation artifacts. By default, it is
`.obj`.
* `PREFIX`: installation prefix, by default it is `/usr/local`.
* `DESTDIR`: directory prepended to `$(PREFIX)`. e.g. you can set it to
`/tmp`, so that `make install` installs the binary to the path
`/tmp/usr/local/bin/cha`.
* `MANPREFIX`, `MANPREFIX1`, `MANPREFIX5`: prefixes for the installation
of man pages. The default setting expands to
`/usr/local/share/man/man1`, etc. (Normally you shouldn't have to
set `MANPREFIX1` or `MANPREFIX5` at all, as these are derived from
`MANPREFIX`.)
* `CURLLIBNAME`: Change the name of the libcurl shared object file.
* `LIBEXECDIR`: Path to your libexec directory; by default, it is
relative to wherever the binary is placed when it is executed. (i.e.
after installation it would resolve to `/usr/local/libexec`.)
* `STATIC_LINK`: Set it to 1 for static linking.
* `DANGER_DISABLE_SANDBOX`: Set it to 1 to forcibly disable syscall
filtering. Note that this is *not* taken from the environment
variables, and you must use it like `make DANGER_DISABLE_SANDBOX=1`.
**Warning**: as the name suggests, this is rarely an optimal solution
to whatever problem you are facing.
This list does not include the `CC` variable, because Nim only supports
a limited set of C compilers. If you want to override the C compiler:
1. Set `CC` to the respective compiler anyways, because it is used by
chaseccomp.
2. If your compiler is supported by Nim, then set e.g. `FLAGS=--cc:clang`.
Check the list of supported compilers with `nim --cc:help`.
3. If your compiler is not supported by Nim, but emulates another
compiler driver, then add e.g.
`FLAGS=--gcc.path=/usr/local/musl/bin --gcc.exe=musl-gcc --gcc.linkerexe=musl-gcc`
## Phony targets
* `all`: build all required executables
* `clean`: remove OBJDIR (i.e. object files, but not the built executables)
* `distclean`: remove OBJDIR and OUTDIR (i.e. both object files and executables)
* `manpage`: rebuild man pages; note that this is not part of `all`.
Manual pages are included in the repository, so this only needs to be called
when you modify the documentation.
* `install`: install the `cha` binary, and if man pages were generated,
those as well
* `uninstall`: remove the `cha` binary and Chawan man pages
## Cross-compiling
[Apparently](https://todo.sr.ht/~bptato/chawan/37) it's possible.
From user cutenice (with dependencies updated):
> With the latest changes, I could simply run
> `CFLAGS=-m32 LDFLAGS=-m32 FLAGS=--cpu:i386 make` to cross-compile!
>
> I don't know if I have any additional insight from today's
> exploration.. On Arch I needed these things:
>
> - `nim-git` from the AUR
> - the version available in the repos isn't quite new enough it
> seems. I think it's related to #12 (at least i got similar looking
> errors)
> - enable the multilib repository in `/etc/pacman.conf`
> - `pacman -S lib32-openssl lib32-libxcrypt lib32-libssh2`
> - most of these packages pull packages like `lib32-gcc-libs` and
> `lib32-glibc` which might be useful as well haha
> - the rest can be eluded from the PKGBUILD in the
> [AUR](https://aur.archlinux.org/packages/chawan-git)
## Static linking
Tested with musl as follows:
* Install musl to the default path (`/usr/local/musl`)
* Add the following to `$HOME/nim.cfg`:
```
cc:gcc
gcc.path = "/usr/local/musl/bin"
gcc.exe = "musl-gcc"
gcc.linkerexe = "musl-gcc"
```
* Compile and install OpenSSL, libssh2, libbrotlicommon and libbrotlidec
to `/usr/local/musl`.
* Compile Chawan:
```sh
$ export PKG_CONFIG_PATH=/usr/local/musl/lib/pkgconfig:/usr/local/musl/lib64/pkgconfig
$ export CC=musl-gcc STATIC_LINK=1
$ make distclean
$ make
```
|