Example:
```
$ tools/measure_timedemo_performance.py -n 32 --binary build-reld-sdl1-nonet-nosound-unpk/devilutionx
Run 1 of 32: 6.02 seconds 170.8 FPS
Run 2 of 32: 6.22 seconds 165.5 FPS
Run 3 of 32: 6.01 seconds 171.1 FPS
Run 4 of 32: 6.03 seconds 170.6 FPS
Run 5 of 32: 6.05 seconds 170.2 FPS
Run 6 of 32: 6.04 seconds 170.3 FPS
Run 7 of 32: 6.03 seconds 170.5 FPS
Run 8 of 32: 6.03 seconds 170.5 FPS
Run 9 of 32: 6.01 seconds 171.1 FPS
Run 10 of 32: 6.04 seconds 170.3 FPS
Run 11 of 32: 6.03 seconds 170.7 FPS
Run 12 of 32: 6.03 seconds 170.7 FPS
Run 13 of 32: 6.04 seconds 170.3 FPS
Run 14 of 32: 6.03 seconds 170.6 FPS
Run 15 of 32: 6.04 seconds 170.3 FPS
Run 16 of 32: 6.04 seconds 170.4 FPS
Run 17 of 32: 6.03 seconds 170.6 FPS
Run 18 of 32: 6.03 seconds 170.5 FPS
Run 19 of 32: 6.06 seconds 169.9 FPS
Run 20 of 32: 6.04 seconds 170.3 FPS
Run 21 of 32: 6.03 seconds 170.7 FPS
Run 22 of 32: 6.02 seconds 171.0 FPS
Run 23 of 32: 6.02 seconds 170.8 FPS
Run 24 of 32: 6.02 seconds 170.8 FPS
Run 25 of 32: 6.04 seconds 170.3 FPS
Run 26 of 32: 6.03 seconds 170.8 FPS
Run 27 of 32: 6.04 seconds 170.4 FPS
Run 28 of 32: 6.07 seconds 169.4 FPS
Run 29 of 32: 6.03 seconds 170.7 FPS
Run 30 of 32: 5.99 seconds 171.7 FPS
Run 31 of 32: 6.01 seconds 171.1 FPS
Run 32 of 32: 6.06 seconds 169.9 FPS
6.038 ± 0.037 seconds, 170.400 ± 0.988 FPS
```
Explicitly set `-DDEVILUTIONX_SYSTEM_SDL_AUDIOLIB=OFF`
and `-DDEVILUTIONX_SYSTEM_SIMPLEINI=OFF` because we now
also support the system versions of these.
1. Adds a `libdevilution_so` target when tests are enabled.
2. Each test file is now a separate binary target linked against `libdevilutionx_so` (can now run tests in parallel).
3. Tests are now defined in a separate `test/CMakeLists.txt` file.
4. Building the tests is now controlled by the standard `BUILD_TESTING` option (defined by CTest).
5. Tests are now built by default.
6. On CI, test errors are now reported.
Also:
* `.clang-format`: Enable SortIncludes in tests
* `path_test.cpp`: Fix -Wsign-compare
With this flag (off by default), all of the dependencies are packaged
into the source archive (including SDL2 etc).
Useful for building on machines without an internet connection.
The does some pruning of the dependencies' files to avoid a 100 MiB+ tarball.
Even with that, the final tarball size is 17 MiB with xz, 25 MiB with gzip.
See the file documentation at the top of `tools/make_src_dist.py` for
more information.
The line wrapping algorithm of gettext is somewhat complicated.
Rather than trying to approximate it, use `msgcat` from gettext
directly. This is also what poedit does.
This tool can insert ZWSP between words in Chinese .po files using this
model: https://tfhub.dev/google/zh_segmentation/1
We will use this tool to be able to word wrap Chinese translations at runtime
without bundling a segmenter.
Doing this offline also allows us to use a segmenter that would
otherwise be too slow for runtime.