summaryrefslogtreecommitdiff
path: root/media/libjxl/src/doc/building_and_testing.md
diff options
context:
space:
mode:
Diffstat (limited to 'media/libjxl/src/doc/building_and_testing.md')
-rw-r--r--media/libjxl/src/doc/building_and_testing.md171
1 files changed, 171 insertions, 0 deletions
diff --git a/media/libjxl/src/doc/building_and_testing.md b/media/libjxl/src/doc/building_and_testing.md
new file mode 100644
index 0000000000..0a1a84e825
--- /dev/null
+++ b/media/libjxl/src/doc/building_and_testing.md
@@ -0,0 +1,171 @@
+# Building and Testing
+
+This file describes the building and testing facilities provided by the `ci.sh`
+script. It assumes you already have the build environment set up, preferably
+Docker (see [instructions](developing_in_docker.md)).
+
+## Basic building
+
+To build the JPEG XL software and run its unit tests, run:
+
+```bash
+./ci.sh release
+```
+
+## Testing
+
+`./ci.sh` build commands including `release`, `opt`, etc. will also run tests.
+You can set the environment variable `SKIP_TEST=1` to skip this.
+
+It is possible to manually run all the tests in parallel in all your CPUs with
+the command:
+
+```bash
+./ci.sh test
+```
+
+It is also possible for faster iteration to run a specific test binary directly.
+Tests are run with the `ctest` command and arguments passed to `ci.sh test` are
+forwarded to `ctest` with the appropriate environment variables set. For
+example, to list all the available tests you can run:
+
+```bash
+./ci.sh test -N
+```
+
+To run a specific test from the list or actually a set of tests matching a
+regular expression you can use `ctest`'s parameter `-R`:
+
+```bash
+./ci.sh test -R ^MyPrefixTe
+```
+
+That command would run any test whose name that starts with `MyPrefixTe`. For
+more options run `ctest --help`, for example, you can pass `-j1` if you want
+to run only one test at a time instead of our default of multiple tests in
+parallel.
+
+## Other commands
+
+Running `./ci.sh` with no parameters shows a list of available commands. For
+example, you can run `opt` for optimized developer builds with symbols or
+`debug` for debug builds which do not have NDEBUG defined and therefore include
+more runtime debug information.
+
+### Cross-compiling
+
+To compile the code for an architecture different than the one you are running
+you can pass a
+[toolchain file](https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html)
+to cmake if you have one for your target, or you can use the `BUILD_TARGET`
+environment variable in `./ci.sh`. For some targets such the Windows targets
+`ci.sh` sets up extra environment variables that are needed for testing.
+
+This assumes that you already have a cross-compiling environment set up and the
+library dependencies are already installed for the target architecture as well
+which is tricky to do in some cases. For this reason we provide a [jpegxl docker
+container](developing_in_docker.md) already configured to cross-compile and run
+for other architectures which is also used in our continuous integration
+pipeline.
+
+For example, to compile for the `aarch64-linux-gnu` target triplet you can run:
+
+```bash
+BUILD_TARGET=aarch64-linux-gnu ./ci.sh release
+```
+
+Whenever using a `BUILD_TARGET` or even a custom `BUILD_DIR` these variables
+must be set for **every call** to `ci.sh` even calls to `ci.sh test`, for which
+we recommend exporting them in your shell session, for example:
+
+```bash
+export BUILD_TARGET=x86_64-w64-mingw32 BUILD_DIR=build-foobar
+```
+
+### Format checks (lint)
+
+```bash
+./ci.sh lint
+```
+
+Linter checks will verify that the format of your patch conforms to the project
+style. For this, we run clang-format only on the lines that were changed by
+your commits.
+
+If your local git branch is tracking `origin/master` and you landed a few
+commits in your branch, running this lint command will check all the changes
+made from the common ancestor with `origin/master` to the latest changes,
+including uncommitted changes. The output of the program will show the patch
+that should be applied to fix your commits. You can apply these changes with the
+following command from the base directory of the git checkout:
+
+```bash
+./ci.sh lint | patch -p1
+```
+
+### Programming errors (tidy)
+
+```bash
+./ci.sh tidy
+```
+
+clang-tidy is a tool to check common programming errors in C++, and other valid
+C++ constructions that are discouraged by the style guide or otherwise dangerous
+and may constitute a bug.
+
+To run clang-tidy on the files changed by your changes you can run `./ci.sh
+tidy`. Note that this will report all the problems encountered in any file that
+was modified by one of your commits, not just on the lines that your commits
+modified.
+
+
+### Address Sanitizer (asan)
+
+```bash
+./ci.sh asan
+```
+
+ASan builds allow to check for invalid address usages, such as use-after-free.
+To perform these checks, as well as other undefined behavior checks we only need
+to build and run the unittests with ASan enabled which can be easily achieved
+with the command above. If you want to have the ASan build files separated from
+your regular `build/` directory to quickly switch between asan and regular
+builds, you can pass the build directory target as follows:
+
+```bash
+BUILD_DIR=build-asan ./ci.sh asan
+```
+
+### Memory Sanitizer (msan)
+
+MSan allows to check for invalid memory accesses at runtime, such as using an
+uninitialized value which likely means that there is a bug. To run these checks,
+a specially compiled version of the project and tests is needed.
+
+For building with MSan, you need to build a version of libc++ with
+`-fsanitize=memory` so we can link against it from the MSan build. Also, having
+an `llvm-symbolizer` installed is very helpful to obtain stack traces that
+include the symbols (functions and line numbers). To install `llvm-symbolizer`
+on a Debian-based system run:
+
+```bash
+sudo apt install llvm # or llvm-7, etc for a specific version.
+```
+
+To install a version of libc++ compiled with `-fsanitize=memory` you can use the
+`./ci.sh msan_install` command helper. This will download, compile and install
+libc++ and libc++abi in the `${HOME}/.msan` directory to be used later.
+
+After this is set up, you can build the project using the following command:
+
+```bash
+./ci.sh msan
+```
+
+This command by default uses the `build` directory to store the cmake and object
+files. If you want to have a separate build directory configured with msan you
+can for example call:
+
+```bash
+BUILD_DIR=build-msan ./ci.sh msan
+```