Building VPP
To get started developing with VPP, you need to get the required VPP sources and then build the packages. For more detailed information on the build system please refer to Build System.
VPP for Ubuntu: Environment Setup
If you are not downloading VPP on Ubuntu with WSL (Windows Subsystem for Linux), please disregard this section and jump to 'Get the VPP Sources'.
Before starting on VPP for Ubuntu, make sure WSL2 and Ubuntu are installed.
To install WSL2 and Ubuntu, run Windows PowerShell as an administrator and enter this in the terminal:
$ wsl --install
Next, go to the 'resolv.conf' file in Ubuntu's '/etc' folder. It should have been automatically generated when Ubuntu was installed; if it doesn't exist, create it. Please use 'sudo' to avoid "File resolv.conf is unwritable" errors.
$ cd /etc
$ sudo nano resolv.conf
In the file, add the following content in place of the current 'nameserver X.X.X.X' line:
nameserver 8.8.8.8
This replaces the DNS nameserver on your machine with the Google DNS service, resolving any DNS Internet connection issues.
Note: by default, the 'resolv.conf' file regenerates every time you restart Ubuntu, so your changes won't be saved. To keep your changes, run the following command to make 'resolv.conf' immutable:
$ sudo chattr +i /etc/resolv.conf
Now copy the following lines from 'resolv.conf':
[network]
generateResolvConf = false
Then, go to the 'wsl.conf' file in '/etc' and paste the lines there. Please use 'sudo' here as well to avoid "File wsl.conf is unwritable" errors.
$ sudo nano wsl.conf
In order to test your DNS server connection, please ping 8.8.8.8 on the terminal:
$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=116 time=9.58 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=116 time=45.8 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=116 time=9.62 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=116 time=11.4 ms
64 bytes from 8.8.8.8: icmp_seq=5 ttl=116 time=12.2 ms
64 bytes from 8.8.8.8: icmp_seq=6 ttl=116 time=8.69 ms
64 bytes from 8.8.8.8: icmp_seq=7 ttl=116 time=52.4 ms
64 bytes from 8.8.8.8: icmp_seq=8 ttl=116 time=11.0 ms
...
While still in /etc, run the following commands:
$ sudo apt-get update
$ sudo apt-get dist-upgrade
$ sudo apt-get install --reinstall ca-certificates
$ sudo update-ca-certificates
Finally, head back to your home directory and jump to 'Get the VPP Sources'.
Set up Proxies
Depending on the environment you are operating in, proxies may need to be set. Run these proxy commands to specify the proxy-server-name and corresponding port-number:
$ export http_proxy=http://<proxy-server-name>.com:<port-number>
$ export https_proxy=https://<proxy-server-name>.com:<port-number>
Get the VPP Sources
To get the VPP sources that are used to create the build, run the following commands:
$ git clone https://gerrit.fd.io/r/vpp
$ cd vpp
As VPP version is derived from git description (which is based on git tags), if the github generated tarballs are used, the version information will be missing from the version file (.../src/scripts/.version) which is required by the version script when building in a non-git based workspace or the build will fail. In that case, put the desired version string into .../src/scripts/.version to satisfy the requirements of the version script.
Alternatively, the make dist
command in a cloned git workspace
will generate an xz compressed tarball of the source
including the .../src/scripts/.version file containing the git hash
using the standard nomenclature for VPP images.
Extract the tarball using the -J option to decompress it using xz. For example,
tar xvJf ./build-root/vpp-23.10-rc0~184-g48cd559fb.tar.xz
Build VPP Dependencies
Before building a VPP image, make sure there are no FD.io VPP or DPDK packages installed, by entering the following commands:
$ dpkg -l | grep vpp
$ dpkg -l | grep DPDK
There should be no output, or no packages shown after the above commands are run.
Please make sure make is installed before running the next command. If it is not installed, run the following command first:
$ sudo apt install make
Run the following make command to install the dependencies for FD.io VPP.
If the download hangs at any point, then you may need to set up proxies for the download to work.
$ make install-dep
Hit:1 http://us.archive.ubuntu.com/ubuntu xenial InRelease
Get:2 http://us.archive.ubuntu.com/ubuntu xenial-updates InRelease [109 kB]
Get:3 http://security.ubuntu.com/ubuntu xenial-security InRelease [107 kB]
Get:4 http://us.archive.ubuntu.com/ubuntu xenial-backports InRelease [107 kB]
Get:5 http://us.archive.ubuntu.com/ubuntu xenial-updates/main amd64 Packages [803 kB]
Get:6 http://us.archive.ubuntu.com/ubuntu xenial-updates/main i386 Packages [732 kB]
...
...
Update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jmap to provide /usr/bin/jmap (jmap) in auto mode
Setting up default-jdk-headless (2:1.8-56ubuntu2) ...
Processing triggers for libc-bin (2.23-0ubuntu3) ...
Processing triggers for systemd (229-4ubuntu6) ...
Processing triggers for ureadahead (0.100.0-19) ...
Processing triggers for ca-certificates (20160104ubuntu1) ...
Updating certificates in /etc/ssl/certs...
0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
done.
Build VPP (Debug)
This build version contains debug symbols which are useful for modifying VPP. The make command below builds a debug version of VPP. The binaries, when building the debug images, can be found in /build-root/vpp_debug-native.
The Debug build version contains debug symbols, which are useful for troubleshooting or modifying VPP. The make command below, builds a debug version of VPP. The binaries used for building the debug image can be found in /build-root/vpp_debug-native.
$ make build
make[1]: Entering directory '/home/vagrant/vpp-master/build-root'
@@@@ Arch for platform 'vpp' is native @@@@
@@@@ Finding source for dpdk @@@@
@@@@ Makefile fragment found in /home/vagrant/vpp-master/build-data/packages/dpdk.mk @@@@
@@@@ Source found in /home/vagrant/vpp-master/dpdk @@@@
@@@@ Arch for platform 'vpp' is native @@@@
@@@@ Finding source for vpp @@@@
@@@@ Makefile fragment found in /home/vagrant/vpp-master/build-data/packages/vpp.mk @@@@
@@@@ Source found in /home/vagrant/vpp-master/src @@@@
...
...
make[5]: Leaving directory '/home/vagrant/vpp-master/build-root/build-vpp_debug-native/vpp/vpp-api/java'
make[4]: Leaving directory '/home/vagrant/vpp-master/build-root/build-vpp_debug-native/vpp/vpp-api/java'
make[3]: Leaving directory '/home/vagrant/vpp-master/build-root/build-vpp_debug-native/vpp'
make[2]: Leaving directory '/home/vagrant/vpp-master/build-root/build-vpp_debug-native/vpp'
@@@@ Installing vpp: nothing to do @@@@
make[1]: Leaving directory '/home/vagrant/vpp-master/build-root'
Build VPP (Release Version)
This section describes how to build the regular release version of FD.io VPP. The release build is optimized and does not create any debug symbols. The binaries used in building the release images are found in /build-root/vpp-native.
Use the following make command below to build the release version of FD.io VPP.
$ make build-release
Installing External Dependencies
At this point, there are still some VPP external dependencies left to install. They could be installed using 'make-build', but this only installs them locally in the VPP tree, not in the operating system. In order to fix this and save time, run the following command:
$ make install-ext-deps
Building Necessary Packages
The package that needs to be built depends on the type system VPP will be running on:
The Debian package is built if VPP is going to run on Ubuntu
The RPM package is built if VPP is going to run on Centos or Redhat
Building Debian Packages
To build the debian packages, use the following command:
$ make pkg-deb
Reproducible builds on Debian
By default the VPP artifacts have various bits of information in them aimed at simplifying the identification during the development (like, the user name that built the package as well as the build times). By setting a few environment variables one can obtain bit-identical .deb files, assuming that the prerequisites installed in the build environment are identical.
Setting and using the SOURCE_DATE_EPOCH variable (see https://reproducible-builds.org/docs/source-date-epoch/) takes care of most of the magic necessary.
The package vpp-ext-deps is already being built with that date set to date of the last modification of the build/external/ tree (similar to deriving the "number of commits" for the package versioning of vpp-ext-deps)
For the rest of the packages, pinning the following three variables should result in bit-identical artifacts across multiple runs in the build environment:
export SOURCE_DATE_EPOCH=$(date +%s) export VPP_BUILD_HOST="buildhost" export VPP_BUILD_USER="builduser"
If you want to reproduce the bit-identical builds across different environments, take a look at "vpp_<BUILD_VERSION>.buildinfo" file which gets created in build-root alongside the .deb repositories - it has the cryptographic hashes for the newly built packages, and the full list of build dependencies and their versions.
Building RPM Packages
To build the rpm packages, use one of the following commands below, depending on the system:
$ make pkg-rpm
Once the packages are built they can be found in the build-root directory.
$ ls build-root/*.deb
If the packages are built correctly, then this should be the corresponding output:
vpp_18.07-rc0~456-gb361076_amd64.deb vpp-dbg_18.07-rc0~456-gb361076_amd64.deb
vpp-dev_18.07-rc0~456-gb361076_amd64.deb vpp-api-lua_18.07-rc0~456-gb361076_amd64.deb
vpp-lib_18.07-rc0~456-gb361076_amd64.deb vpp-api-python_18.07-rc0~456-gb361076_amd64.deb
vpp-plugins_18.07-rc0~456-gb361076_amd64.deb
Finally, the created packages can be installed using the following commands. Install the package that corresponds to OS that VPP will be running on:
For Ubuntu:
$ sudo dpkg -i build-root/*.deb
For Centos or Redhat:
$ sudo rpm -ivh build-root/*.rpm