portable: add OpenBSD to PLATFORM detection
[got-portable.git] / .github / README.md
blob98c987a5918be5e34702c57fee238d2732dda753
1 README.portable
2 ===============
4 **NOTE: This repository is read-only and is used only to mirror the
5 got-portable repository for CI purposes.**
7 This is the portable version of got[1] (Game of Trees), using autotools to
8 provide the library checks required for GoT's dependencies.
10 The following operating systems are supported:
12 * FreeBSD
13 * NetBSD
14 * DragonFlyBSD
15 * MacOS
16 * Linux
18 DEPENDENCIES
19 ============
21 Linux:
23 * `libncurses` (for tog(1))
24 * `libmd` (BSD's digest routines)
25 * `libbsd` (BSD's arc4random routines)
26 * `libcrypto` (often via 'libssl-dev' for SHA1 routines)
27 * `libuuid` (for UUID generation)
28 * `libz` (for Z compression)
29 * `pkg-config` (for searching libraries)
30 * `bison` (for configuration file grammar)
32 FreeBSD:
34 * `automake`
35 * `pkgconf`
36 * `GNU coreutils` (for running tests)
38 NetBSD:
40 * `automake`
41 * `libuuid`
42 * `ncuresesw`
43 * `GNU coreutils` (for running tests)
45 DragonFlyBSD:
47 * `automake`
48 * `pkgconf`
49 * `openssl`
50 * `GNU coreutils` (for running tests)
52 Darwin (MacOS):
54 * `automake`
55 * `bison`
56 * `pkg-config`
57 * `ncurses`
58 * `openssl`
59 * `ossp-uuid`
61 TESTS (REGRESS)
62 ===============
64 To run the test suite:
66 ```
67  $ make tests
68 ```
70 NOTE: For Linux, you must have the jot(1) command which is typically in the
71 `athena-jot` package, or similar.  For non-linux systems (as mentioned above),
72 GNU Coreutils needs to be installed.
74 NOTE:  THIS ONLY WORKS AFTER `make install` DUE TO HOW PATHS TO LIBEXEC
75        HELPERS ARE HARD-CODED INTO THE BINARIES.
77 INSTALLATION
78 ============
80 ```
81  $ ./autogen.sh
82  $ ./configure && make
83  $ sudo make install
84 ```
86 BRANCHES + SUBMITTING PATCHES
87 =============================
89 `got-portable` has two key branches:
91 * `main` which tracks got upstream untainted.
92 * `linux` which provides the portable version of GoT based from code on `main`
94 Patches for portable code fixes should be based from the `linux` branch and
95 sent to the mailing list for review [2] or sent to me directly (see CONTACT).
97 Portable-specific patches should have a shortlog in the form of:
99 ```
100 portable: AREA: description
103 Where `AREA` relates to the change in question (for example, `regress`,
104 `libexec`, etc).  In some cases, this can be omitted if it's a generic change.
106 This helps to delineate `-portable` changes from upstream `got`.
108 The read-only Github repository also runs CI checks using Cirrus-CI on Linux
109 and FreeBSD.
111 SYNCING UPSTREAM CHANGES WITH PORTABLE
112 ======================================
114 The `-portable` GoT repository uses the following workflow:
117                 Github (gh)               GoT (upstream)
118                   ^                              ^
119                   |                              |
120                   |                              |
121                   |                              |
122                   |                              |
123                   +--------> GoT-portable <------+
127 Here, `got-portable` is a clone of the `-portable` repository, locally on
128 disk.  There are two remotes set up within that repository, via `git-remote`:
130 * `upstream` -- which points to the official GoT repository;
131 * `gh` -- which points to the mirrored `-portable` repository so that CI can
132   be run for cross-platform/test purposes [3]
133 * `origin` -- our cloned copy from `-portable`
135 Within the `-portable` repository are two key branches (there may be other
136 topic branches which represent on-going work):
138 * `main` -- this is the branch that tracks (without modification) those
139   changes from `upstream`.  This branch is continually reset to
140   `upstream/main` whenever changes occur.
142 * `linux` -- this is the *default* branch of the `-portable` repository which
143   contains portable-specific changes to make `GoT` compile across different
144   OSes.
146 When updating `-portable` from upstream changes, the following actions happen:
148 1. Changes from `upstream` are fetched.  If there are no new changes, there's
149    nothing else to do.
150 2. Changes from `gh` are fetch so that the result can be pushed out to `gh`.
151 3. The difference between the local copy of `main` and `origin/main` is used
152    to represent the set of commits which have *NOT* yet been merged to
153    `-portable`.
154 4. A topic-branch called `syncup` is created from the HEAD of the `linux`
155    branch to hold the to-be-cherry-picked commits from step 3.
156 5. These commits are then cherry-picked to the `syncup` branch.
157 6. If there's any conflicts, they must be resolved.
158 7. Once done, a sanity build is done in-situ to check there's nothing amiss.
159 8. If that succeeds, the `syncup` branch is merged to `linux` and pushed to
160    `gh` for verification against CI.
161 9. If that fails, fixes continue and pushed up to `gh` as required.
162 10. Once happy, both the `main` and `linux` branches can be merged to `origin`.
164 These steps are encapsulated in a script within `-portable`.  [Link](../maintscripts/sync-upstream.sh)
166 RELEASING A NEW VERSION
167 =======================
169 Release for `-portable` try and align as close to upstream GoT as much as
170 possible, even on the same day where that can happen.  That being said,
171 sometimes a release of `-portable` might happen outside of that cadence, where
172 a `-portable`-specific issue needs addressing, for example.
174 Before creating a new release, check the version of GoT as found in
175 `util/got-portable-ver.sh` -- as `GOT_PORTABLE_VER`:
178 GOT_PORTABLE_VER=0.75
182 Here, the *to be released* version of `got-portable` will be `0.75`.
183 Typically, this version is incremented directly after a release, such that
184 there's no need to change this value.  The only exception would be if there
185 were an out-of-band release to `-portable`.  In such cases, that would take
186 the form:
189 0.75.1
192 Where the suffix of `1`, `2`, etc., can be used to denote any sub-releases
193 from the `0.75` version.
195 The variable `GOT_RELEASE` needs be changed to `yes` so that the
196 GOT_PORTABLE_VER is asserted correctly.
198 Once the version is verified, the following should be run from the `linux`
199 branch -- and the repository should not have any outstanding modifications to
200 the source:
203 make clean ; ./autogen && ./configure && make distcheck
206 If this succeeds, the tarball is in the CWD, as: `got-portable-VERSION.tar.gz`
208 This can then be copied to the `got-www` repository and uploaded, along with
209 changing a couple of HTML pages therein to represent the new released version.
210 Additionally, the CHANGELOG file can be copied to the `got-www` and committed.
212 Once all of that has been done, the repository should be tagged to indicate
213 the release, hence:
216 git tag -a 0.75
219 This can then be pushed out to `gh` and `origin`.
221 After that point, the version of `GOT_PORTABLE_VER` in
222 `util/got-portable-ver.sh` should be changed to the next version, and
223 `GOT_RELEASE` should be setg back to `no`.
225 TODO
226 ====
228 This port is incomplete in that only got(1) and tog(1) have been ported.
229 gotweb has yet to be ported.
231 configure.ac should start defining AC_ENABLE arguments to allow for
232 finer-grained control of where to search for includes/libraries, etc.
234 CONTACT
235 =======
237 Thomas Adam <thomas@xteddy.org><br />
238 thomas_adam (#gameoftrees on irc.libera.chat)
240 [1]  https://gameoftrees.org<br />
241 [2]  https://lists.openbsd.org/cgi-bin/mj_wwwusr?user=&passw=&func=lists-long-full&extra=gameoftrees<br />
242 [3]  https://github.com/ThomasAdam/got-portable