Gustavo Jose de Sousa
9 years ago
committed by
Lucas De Marchi
1 changed files with 146 additions and 34 deletions
@ -1,71 +1,183 @@ |
|||||||
# WAF Build # |
# WAF Build # |
||||||
|
|
||||||
To keep access to waf convenient, use the following alias from the |
Ardupilot is gradually moving from the make-based build system to |
||||||
|
[Waf](https://waf.io/). |
||||||
|
|
||||||
|
To keep access to Waf convenient, use the following alias from the |
||||||
root ardupilot directory: |
root ardupilot directory: |
||||||
|
|
||||||
```bash |
```bash |
||||||
alias waf="$PWD/modules/waf/waf-light" |
alias waf="$PWD/modules/waf/waf-light" |
||||||
|
``` |
||||||
|
|
||||||
|
You can also define the alias or create a function in your shell rc file (e.g. |
||||||
|
`~/.bashrc`). |
||||||
|
|
||||||
|
You can read the [Waf Book](https://waf.io/book/) if you want to learn more |
||||||
|
about Waf. |
||||||
|
|
||||||
|
## Calling waf ## |
||||||
|
|
||||||
|
Waf should always be called from the ardupilot's root directory. |
||||||
|
|
||||||
|
Differently from the make-based build, with Waf there's a configure step |
||||||
|
to choose the board to be used (default is `sitl`): |
||||||
|
|
||||||
|
```bash |
||||||
|
# Configure the Linux board |
||||||
|
waf configure --board=linux |
||||||
|
``` |
||||||
|
|
||||||
|
Waf build system is composed of commands. For example, the above command |
||||||
|
(`configure`) is for configuring the build. Consequently, in order to build, a |
||||||
|
"build" command is issued, thus `waf build`. That is the default command, so |
||||||
|
calling just `waf` is enough: |
||||||
|
|
||||||
|
```bash |
||||||
|
# Build programs from bin group |
||||||
|
waf |
||||||
|
|
||||||
|
# Waf also accepts '-j' option to parallelize the build. |
||||||
|
waf -j8 |
||||||
|
``` |
||||||
|
|
||||||
|
To clean things up, use the `clean` or `distclean` command: |
||||||
|
|
||||||
|
```bash |
||||||
|
# Clean the build products, but keep configure information |
||||||
|
waf clean |
||||||
|
|
||||||
|
# Clean everything, will need to call configure again |
||||||
|
waf distclean |
||||||
``` |
``` |
||||||
|
|
||||||
Waf should always be called from the ardupilot's root. |
Using git to clean the files also work fine. |
||||||
|
|
||||||
Differently from the make-based build, with waf there's a configure step |
To list the task generator names that can be used for the option `--targets`, |
||||||
to choose the board to be used |
use the `list`command: |
||||||
|
|
||||||
```bash |
```bash |
||||||
# Configure the Linux board. |
waf list |
||||||
waf configure --board=linux |
|
||||||
``` |
``` |
||||||
|
|
||||||
by default the board used is `sitl`. |
## Program groups ## |
||||||
|
|
||||||
|
The programs in ardupilot are categorized into the following groups: |
||||||
|
|
||||||
To build, use the 'waf build' command. This is the default command, so |
- bin: *the main binaries, that is, ardupilot's main products - the vehicles and |
||||||
calling just `waf` is enough |
Antenna Tracker* |
||||||
|
- tools |
||||||
|
- examples: *programs that show how certain libraries are used or to simply |
||||||
|
test their operation* |
||||||
|
- benchmarks |
||||||
|
- tests: *basically unit tests to ensure changes don't break the system's |
||||||
|
logic* |
||||||
|
|
||||||
|
There's also a special group, called "all", that comprises all groups. |
||||||
|
|
||||||
|
All build files are placed under `build/<board>/`, where `<board>` represents |
||||||
|
the board/platform you selected during configuration. Each program group has a |
||||||
|
folder with its name directly under `build/<board>/`. Thus, a program will be |
||||||
|
stored in `build/<board>/<group/`, where `<group>` is the group the program |
||||||
|
belongs to. For example, for a linux build, arducopter will be located at |
||||||
|
`build/linux/bin/arducopter`. |
||||||
|
|
||||||
|
## Building a program group ## |
||||||
|
|
||||||
|
Ardupilot adds to waf an option called `--program-group`, which receives as |
||||||
|
argument the group you want it to build. For a build command, if you don't pass |
||||||
|
any of `--targets` or `--program-group`, then the group "bin" is selected by |
||||||
|
default. The option `--program-group` can be passed multiple times. |
||||||
|
|
||||||
|
Examples: |
||||||
|
|
||||||
|
```bash |
||||||
|
# Group bin is the default one |
||||||
|
waf |
||||||
|
|
||||||
|
# Build all vehicles and Antenna Tracker |
||||||
|
waf --program-group bin |
||||||
|
|
||||||
|
# Build all benchmarks and tests |
||||||
|
waf --program-group benchmarks --program-group tests |
||||||
|
``` |
||||||
|
### Shortcut for program groups ### |
||||||
|
|
||||||
|
For less typing, you can use the group name as the command to waf. Examples: |
||||||
|
|
||||||
```bash |
```bash |
||||||
# From the root ardupilot directory, build everything. |
# Build all vehicles and Antenna Tracker |
||||||
waf |
waf bin |
||||||
|
|
||||||
# Waf also accepts '-j' option to parallelize the build. |
# Build all examples |
||||||
waf -j8 |
waf examples |
||||||
``` |
``` |
||||||
|
|
||||||
It's possible to build for just a vehicle or an example by specifying it as the |
## Building a specific program ## |
||||||
target: |
|
||||||
|
In order to build a specific program, you just need to pass its path relative |
||||||
|
to `build/<board>/` to the option `--targets`. Example: |
||||||
|
|
||||||
```bash |
```bash |
||||||
# From the top directory |
# Build arducopter |
||||||
waf --targets bin/ArduCopter |
waf --targets bin/arducopter |
||||||
|
|
||||||
# List all the targets available |
# Build vectors unit test |
||||||
waf list |
waf --targets tests/test_vectors |
||||||
``` |
``` |
||||||
|
|
||||||
There are also shortcuts for vehicle builds, for example: |
### Shortcuts for vehicles ### |
||||||
|
|
||||||
|
Vehicles can be built in the common single program building way (example: `waf |
||||||
|
--targets bin/arducopter`). But that is too much typing :-), we provide |
||||||
|
shortcut commands for vehicles: |
||||||
|
|
||||||
```bash |
```bash |
||||||
# Shortcut for waf --targets bin/ArduCopter |
# Build arducopter |
||||||
waf copter |
waf copter |
||||||
|
|
||||||
|
# Build arduplane |
||||||
|
waf plane |
||||||
|
|
||||||
|
# Build ardurover |
||||||
|
waf rover |
||||||
``` |
``` |
||||||
|
|
||||||
By default all the files produced by the build will be inside the build/ |
## Checking ## |
||||||
subdirectory. The binaries will also be there, with the name identifying |
|
||||||
the target board. |
|
||||||
|
|
||||||
To clean things up use |
The command `check` builds all programs and then run the relevant tests. In |
||||||
|
that context, a relevant test is a program from the group "tests" that makes |
||||||
|
one of the following statements true: |
||||||
|
|
||||||
|
- it's the first time the test is built since the last cleanup or when the |
||||||
|
project was cloned. |
||||||
|
- the program had to be rebuilt (due to modifications in the code or |
||||||
|
dependencies, for example) |
||||||
|
- the test program failed in the previous check. |
||||||
|
|
||||||
|
That is, the tests are run only if necessary. If you want waf to run all tests, |
||||||
|
then you can use either option `--alltests` or the shortcut command |
||||||
|
`check-all`. |
||||||
|
|
||||||
|
Examples: |
||||||
|
|
||||||
```bash |
```bash |
||||||
# Clean the build products, but keep configure information |
# Build everything and run relevant tests |
||||||
waf clean |
waf check |
||||||
|
|
||||||
# Clean everything, will need to call configure again |
# Build everything and run all tests |
||||||
waf distclean |
waf check --alltests |
||||||
|
|
||||||
|
# Build everything and run all tests |
||||||
|
waf check-all |
||||||
``` |
``` |
||||||
|
|
||||||
using git to clean the files also work fine. |
## Make wrapper ## |
||||||
|
|
||||||
There's also a make wrapper called `Makefile.waf`. You can use |
There's also a make wrapper called `Makefile.waf`. You can use |
||||||
`make -f Makefile.waf help` for instructions on how to use it. |
`make -f Makefile.waf help` for instructions on how to use it. |
||||||
|
|
||||||
*TODO: Add explanation on how the build system is organized once we |
## Command line help ## |
||||||
settle down.* |
|
||||||
|
You can use `waf --help` to see information about commands and options built-in |
||||||
|
to waf as well as some quick help on those added by ardupilot. |
||||||
|
Loading…
Reference in new issue