Building test applications ========================== This is a description of how to build test applications from a test case. Dependencies ------------ If you write an application that is supposed to be run on the test-target, place it in the directory `../deps//` relative to where your test case is placed. The easiest way to obtain the full path to this directory is by calling `data_dir.get_deps_dir("")`. Don't forget to add `from virttest import data_dir` to your test case. Besides the source file, create a Makefile that will be used to build your test application. The below example shows a Makefile for the application for the timedrift test cases. The `remote_build` module requires that a Makefile is included with all test applications. .. code-block:: makefile CFLAGS+=-Wall LDLIBS+=-lrt .PHONY: clean all: clktest get_tsc clktest: clktest.o get_tsc: get_tsc.o clean: rm -f clktest get_tsc remote_build ------------ To simplify the building of applications on target, and to simplify avoiding the building of applications on target when they are installed pre-built, use the `remote_build` module. This module handles both the transfer of files, and running `make` on target. A simple example: .. code-block:: python address = vm.get_address(0) source_dir = data_dir.get_deps_dir("") builder = remote_build.Builder(params, address, source_dir) full_build_path = builder.build() In this case, we utilize the `.build()` method, which execute the necessary methods in `builder` to copy all files to target and run make (if needed). When done, `.build()` will return the full path on target to the application that was just built. Be sure to use this path when running your test application, as the path is changed if the parameters of the build is changed. For example: .. code-block:: python session.cmd_status("%s --test" % os.path.join(full_build_path, "testapp")) The `remote_build.Builder` class can give you fine-grained control over your build process as well. Another way to write the above `.build()` invocation above is: .. code-block:: python builder = remote_build.Builder(params, address, source_dir) if builder.sync_directories(): builder.make() full_build_path = builder.full_build_path This pattern can be useful if you e.g. would like to add an additional command to run before `builder.make()`, perhaps to install some extra dependencies.