# Linux Kernel Module Cheat

##### 2.8.2.1. Userland setup getting started natively

With this setup, we will use the host toolchain and execute executables directly on the host.

No toolchain build is required, so you can just download your distro toolchain and jump straight into it.

Build, run and example, and clean it in-tree with:

    sudo apt-get install gcc
    cd userland
    ./build c/hello
    ./c/hello.out
    ./build --clean

Source: userland/c/hello.c.

Build an entire directory and test it:

    cd userland
    ./build c
    ./test c

Build the current directory and test it:

    cd userland/c
    ./build
    ./test

As mentioned at userland/libs directory, tests under userland/libs require certain optional libraries to be installed, and are not built or tested by default.

You can install those libraries with:

    cd linux-kernel-module-cheat
    ./setup
    ./build --download-dependencies userland-host

and then build the examples and test with:

    ./build --package-all
    ./test --package-all

Pass custom compiler options:

    ./build --ccflags='-foptimize-sibling-calls -foptimize-strlen' --force-rebuild

Here we used `--force-rebuild` to force rebuild since the sources weren’t modified since the last build.

Some CLI options have more specialized flags, e.g. `-O` for the Optimization level of a build:

    ./build --optimization-level 3 --force-rebuild

See also User mode static executables for `--static`.

The `build` scripts inside userland/ are just symlinks to build-userland-in-tree which you can also use from toplevel as:

    ./build-userland-in-tree
    ./build-userland-in-tree userland/c
    ./build-userland-in-tree userland/c/hello.c

`build-userland-in-tree` is in turn just a thin wrapper around build-userland:

    ./build-userland --gcc-which host --in-tree userland/c

So you can use any option supported by `build-userland` script freely with `build-userland-in-tree` and `build`.

The situation is analogous for userland/test, test-executables-in-tree and test-executables, which are further documented at: Section 11.2, “User mode tests”.

Do a more clean out-of-tree build instead and run the program:

    ./build-userland --gcc-which host --userland-build-id host
    ./run --emulator native --userland userland/c/hello.c --userland-build-id host

Here we:

- put the host executables in a separate build variant to avoid conflict with Buildroot builds.

- ran with the `--emulator native` option to run the program natively

In this case you can debub the program with:

    ./run --debug-vm --emulator native --userland userland/c/hello.c --userland-build-id host

as shown at: Section 23.8, “Debug the emulator”, although direct GDB host usage works as well of course.