• Andrii Nakryiko's avatar
    selftests/bpf: Replace test_progs and test_maps w/ general rule · 74b5a596
    Andrii Nakryiko authored
    Define test runner generation meta-rule that codifies dependencies
    between test runner, its tests, and its dependent BPF programs. Use that
    for defining test_progs and test_maps test-runners. Also additionally define
    2 flavors of test_progs:
    - alu32, which builds BPF programs with 32-bit registers codegen;
    - bpf_gcc, which build BPF programs using GCC, if it supports BPF target.
    
    Overall, this is accomplished through $(eval)'ing a set of generic
    rules, which defines Makefile targets dynamically at runtime. See
    comments explaining the need for 2 $(evals), though.
    
    For each test runner we have (test_maps and test_progs, currently), and,
    optionally, their flavors, the logic of build process is modeled as
    follows (using test_progs as an example):
    - all BPF objects are in progs/:
      - BPF object's .o file is built into output directory from
        corresponding progs/.c file;
      - all BPF objects in progs/*.c depend on all progs/*.h headers;
      - all BPF objects depend on bpf_*.h helpers from libbpf (but not
        libbpf archive). There is an extra rule to trigger bpf_helper_defs.h
        (re-)build, if it's not present/outdated);
      - build recipe for BPF object can be re-defined per test runner/flavor;
    - test files are built from prog_tests/*.c:
      - all such test file objects are built on individual file basis;
      - currently, every single test file depends on all BPF object files;
        this might be improved in follow up patches to do 1-to-1 dependency,
        but allowing to customize this per each individual test;
      - each test runner definition can specify a list of extra .c and .h
        files to be built along test files and test runner binary; all such
        headers are becoming automatic dependency of each test .c file;
      - due to test files sometimes embedding (using .incbin assembly
        directive) contents of some BPF objects at compilation time, which are
        expected to be in CWD of compiler, compilation for test file object does
        cd into test runner's output directory; to support this mode all the
        include paths are turned into absolute paths using $(abspath) make
        function;
    - prog_tests/test.h is automatically (re-)generated with an entry for
      each .c file in prog_tests/;
    - final test runner binary is linked together from test object files and
      extra object files, linking together libbpf's archive as well;
    - it's possible to specify extra "resource" files/targets, which will be
      copied into test runner output directory, if it differes from
      Makefile-wide $(OUTPUT). This is used to ensure btf_dump test cases and
      urandom_read binary is put into a test runner's CWD for tests to find
      them in runtime.
    
    For flavored test runners, their output directory is a subdirectory of
    common Makefile-wide $(OUTPUT) directory with flavor name used as
    subdirectory name.
    
    BPF objects targets might be reused between different test runners, so
    extra checks are employed to not double-define them. Similarly, we have
    redefinition guards for output directories and test headers.
    
    test_verifier follows slightly different patterns and is simple enough
    to not justify generalizing TEST_RUNNER_DEFINE/TEST_RUNNER_DEFINE_RULES
    further to accomodate these differences. Instead, rules for
    test_verifier are minimized and simplified, while preserving correctness
    of dependencies.
    Signed-off-by: default avatarAndrii Nakryiko <andriin@fb.com>
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Link: https://lore.kernel.org/bpf/20191016060051.2024182-6-andriin@fb.com
    74b5a596
Makefile 11 KB