blob: 6106a710d2820316b39751b8c987af735cd18a92 [file] [log] [blame]
John DeNisco06dcd452018-07-26 12:45:10 -04001.. _building:
2
3.. toctree::
4
5Building VPP
Saima Yunus5f6422d2022-05-19 11:48:59 -07006=====================
John DeNisco06dcd452018-07-26 12:45:10 -04007
Nathan Skrzypczak9ad39c02021-08-19 11:38:06 +02008To get started developing with VPP, you need to get the required VPP sources and then build the packages.
John DeNisco2ba9dcf2018-08-23 14:04:22 -04009For more detailed information on the build system please refer to :ref:`buildsystem`.
John DeNisco06dcd452018-07-26 12:45:10 -040010
Saima Yunus5f6422d2022-05-19 11:48:59 -070011.. _makesureinstalled:
12
13VPP for Ubuntu: Environment Setup
14-------------------------------------------
15
16If you are not downloading VPP on Ubuntu with WSL (Windows Subsystem for Linux), please disregard this section
17and jump to 'Get the VPP Sources'.
18
19Before starting on VPP for Ubuntu, make sure WSL2 and Ubuntu are installed.
20
21To install WSL2 and Ubuntu, run Windows PowerShell as an administrator and enter this in the terminal:
22
23.. code-block:: console
24
25 $ wsl --install
26
27Next, go to the 'resolv.conf' file in Ubuntu's '/etc' folder.
28It should have been automatically generated when Ubuntu was installed; if it doesn't exist, create it.
29Please use 'sudo' to avoid "File resolv.conf is unwritable" errors.
30
31.. code-block:: console
32
33 $ cd /etc
34 $ sudo nano resolv.conf
35
36In the file, add the following content in place of the current 'nameserver X.X.X.X' line:
37
38.. code-block:: console
39
40 nameserver 8.8.8.8
41
42This replaces the DNS nameserver on your machine with the Google DNS service,
43resolving any DNS Internet connection issues.
44
45Note: by default, the 'resolv.conf' file regenerates every time you restart Ubuntu, so your changes won't be saved.
46To keep your changes, run the following command to make 'resolv.conf' immutable:
47
48.. code-block:: console
49
50 $ sudo chattr +i /etc/resolv.conf
51
52
53Now copy the following lines from 'resolv.conf':
54
55.. code-block:: console
56
57 [network]
58 generateResolvConf = false
59
60Then, go to the 'wsl.conf' file in '/etc' and paste the lines there.
61Please use 'sudo' here as well to avoid "File wsl.conf is unwritable" errors.
62
63.. code-block:: console
64
65 $ sudo nano wsl.conf
66
67In order to test your DNS server connection, please ping 8.8.8.8 on the terminal:
68
69.. code-block:: console
70
71 $ ping 8.8.8.8
72 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
73 64 bytes from 8.8.8.8: icmp_seq=1 ttl=116 time=9.58 ms
74 64 bytes from 8.8.8.8: icmp_seq=2 ttl=116 time=45.8 ms
75 64 bytes from 8.8.8.8: icmp_seq=3 ttl=116 time=9.62 ms
76 64 bytes from 8.8.8.8: icmp_seq=4 ttl=116 time=11.4 ms
77 64 bytes from 8.8.8.8: icmp_seq=5 ttl=116 time=12.2 ms
78 64 bytes from 8.8.8.8: icmp_seq=6 ttl=116 time=8.69 ms
79 64 bytes from 8.8.8.8: icmp_seq=7 ttl=116 time=52.4 ms
80 64 bytes from 8.8.8.8: icmp_seq=8 ttl=116 time=11.0 ms
81 ...
82
83While still in /etc, run the following commands:
84
85.. code-block:: console
86
87 $ sudo apt-get update
88 $ sudo apt-get dist-upgrade
89 $ sudo apt-get install --reinstall ca-certificates
90 $ sudo update-ca-certificates
91
92
93Finally, head back to your home directory and jump to 'Get the VPP Sources'.
94
John DeNisco06dcd452018-07-26 12:45:10 -040095.. _setupproxies:
96
97Set up Proxies
andrewa38d0012018-08-06 00:25:33 -040098--------------------------
John DeNisco06dcd452018-07-26 12:45:10 -040099
Nathan Skrzypczak9ad39c02021-08-19 11:38:06 +0200100Depending on the environment you are operating in, proxies may need to be set.
John DeNisco2ba9dcf2018-08-23 14:04:22 -0400101Run these proxy commands to specify the *proxy-server-name* and corresponding *port-number*:
John DeNisco06dcd452018-07-26 12:45:10 -0400102
103.. code-block:: console
104
105 $ export http_proxy=http://<proxy-server-name>.com:<port-number>
106 $ export https_proxy=https://<proxy-server-name>.com:<port-number>
107
108
109Get the VPP Sources
andrewa38d0012018-08-06 00:25:33 -0400110-----------------------------------
John DeNisco06dcd452018-07-26 12:45:10 -0400111
John DeNiscoce96dda2018-08-14 16:04:09 -0400112To get the VPP sources that are used to create the build, run the following commands:
John DeNisco06dcd452018-07-26 12:45:10 -0400113
114.. code-block:: console
115
116 $ git clone https://gerrit.fd.io/r/vpp
117 $ cd vpp
118
Vratko Polakc142cd12023-09-13 10:22:57 +0200119As VPP version is derived from git description (which is based on git tags),
120if the github generated tarballs are used, the version information
121will be missing from the version file (.../src/scripts/.version)
122which is required by the version script when building
123in a non-git based workspace or the build will fail.
124In that case, put the desired version string into
125.../src/scripts/.version to satisfy the requirements of the version script.
126
127Alternatively, the ``make dist`` command in a cloned git workspace
128will generate an xz compressed tarball of the source
129including the .../src/scripts/.version file containing the git hash
130using the standard nomenclature for VPP images.
131
132Extract the tarball using the -J option to decompress it using xz. For example,
133``tar xvJf ./build-root/vpp-23.10-rc0~184-g48cd559fb.tar.xz``
134
John DeNisco06dcd452018-07-26 12:45:10 -0400135Build VPP Dependencies
andrewa38d0012018-08-06 00:25:33 -0400136--------------------------------------
John DeNisco06dcd452018-07-26 12:45:10 -0400137
John DeNisco2ba9dcf2018-08-23 14:04:22 -0400138Before building a VPP image, make sure there are no FD.io VPP or DPDK packages
139installed, by entering the following commands:
John DeNisco06dcd452018-07-26 12:45:10 -0400140
141.. code-block:: console
142
Nathan Skrzypczak9ad39c02021-08-19 11:38:06 +0200143 $ dpkg -l | grep vpp
John DeNisco06dcd452018-07-26 12:45:10 -0400144 $ dpkg -l | grep DPDK
145
John DeNisco2ba9dcf2018-08-23 14:04:22 -0400146There should be no output, or no packages shown after the above commands are run.
John DeNisco06dcd452018-07-26 12:45:10 -0400147
Saima Yunus5f6422d2022-05-19 11:48:59 -0700148Please make sure **make** is installed before running the next command.
149If it is not installed, run the following command first:
150
151.. code-block:: console
152
153 $ sudo apt install make
154
Nathan Skrzypczak9ad39c02021-08-19 11:38:06 +0200155Run the following **make** command to install the dependencies for FD.io VPP.
John DeNisco2ba9dcf2018-08-23 14:04:22 -0400156
Nathan Skrzypczak9ad39c02021-08-19 11:38:06 +0200157If the download hangs at any point, then you may need to
John DeNisco2ba9dcf2018-08-23 14:04:22 -0400158:ref:`set up proxies <setupproxies>` for the download to work.
John DeNisco06dcd452018-07-26 12:45:10 -0400159
160.. code-block:: console
161
162 $ make install-dep
163 Hit:1 http://us.archive.ubuntu.com/ubuntu xenial InRelease
164 Get:2 http://us.archive.ubuntu.com/ubuntu xenial-updates InRelease [109 kB]
165 Get:3 http://security.ubuntu.com/ubuntu xenial-security InRelease [107 kB]
166 Get:4 http://us.archive.ubuntu.com/ubuntu xenial-backports InRelease [107 kB]
167 Get:5 http://us.archive.ubuntu.com/ubuntu xenial-updates/main amd64 Packages [803 kB]
168 Get:6 http://us.archive.ubuntu.com/ubuntu xenial-updates/main i386 Packages [732 kB]
169 ...
170 ...
171 Update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/jmap to provide /usr/bin/jmap (jmap) in auto mode
172 Setting up default-jdk-headless (2:1.8-56ubuntu2) ...
173 Processing triggers for libc-bin (2.23-0ubuntu3) ...
174 Processing triggers for systemd (229-4ubuntu6) ...
175 Processing triggers for ureadahead (0.100.0-19) ...
176 Processing triggers for ca-certificates (20160104ubuntu1) ...
177 Updating certificates in /etc/ssl/certs...
178 0 added, 0 removed; done.
179 Running hooks in /etc/ca-certificates/update.d...
180
181 done.
182 done.
183
andrewa38d0012018-08-06 00:25:33 -0400184Build VPP (Debug)
185----------------------------
John DeNisco06dcd452018-07-26 12:45:10 -0400186
John DeNiscoce96dda2018-08-14 16:04:09 -0400187This build version contains debug symbols which are useful for modifying VPP. The
188**make** command below builds a debug version of VPP. The binaries, when building the
189debug images, can be found in /build-root/vpp_debug-native.
John DeNisco06dcd452018-07-26 12:45:10 -0400190
John DeNisco2ba9dcf2018-08-23 14:04:22 -0400191The Debug build version contains debug symbols, which are useful for troubleshooting
192or modifying VPP. The **make** command below, builds a debug version of VPP. The
193binaries used for building the debug image can be found in */build-root/vpp_debug-native*.
194
John DeNisco06dcd452018-07-26 12:45:10 -0400195.. code-block:: console
196
197 $ make build
198 make[1]: Entering directory '/home/vagrant/vpp-master/build-root'
199 @@@@ Arch for platform 'vpp' is native @@@@
200 @@@@ Finding source for dpdk @@@@
201 @@@@ Makefile fragment found in /home/vagrant/vpp-master/build-data/packages/dpdk.mk @@@@
202 @@@@ Source found in /home/vagrant/vpp-master/dpdk @@@@
203 @@@@ Arch for platform 'vpp' is native @@@@
204 @@@@ Finding source for vpp @@@@
205 @@@@ Makefile fragment found in /home/vagrant/vpp-master/build-data/packages/vpp.mk @@@@
206 @@@@ Source found in /home/vagrant/vpp-master/src @@@@
207 ...
208 ...
209 make[5]: Leaving directory '/home/vagrant/vpp-master/build-root/build-vpp_debug-native/vpp/vpp-api/java'
210 make[4]: Leaving directory '/home/vagrant/vpp-master/build-root/build-vpp_debug-native/vpp/vpp-api/java'
211 make[3]: Leaving directory '/home/vagrant/vpp-master/build-root/build-vpp_debug-native/vpp'
212 make[2]: Leaving directory '/home/vagrant/vpp-master/build-root/build-vpp_debug-native/vpp'
213 @@@@ Installing vpp: nothing to do @@@@
214 make[1]: Leaving directory '/home/vagrant/vpp-master/build-root'
215
216Build VPP (Release Version)
andrewa38d0012018-08-06 00:25:33 -0400217-----------------------------------------
John DeNisco06dcd452018-07-26 12:45:10 -0400218
John DeNisco2ba9dcf2018-08-23 14:04:22 -0400219This section describes how to build the regular release version of FD.io VPP. The
220release build is optimized and does not create any debug symbols.
221The binaries used in building the release images are found in */build-root/vpp-native*.
John DeNisco06dcd452018-07-26 12:45:10 -0400222
John DeNisco2ba9dcf2018-08-23 14:04:22 -0400223Use the following **make** command below to build the release version of FD.io VPP.
John DeNiscoce96dda2018-08-14 16:04:09 -0400224
John DeNisco06dcd452018-07-26 12:45:10 -0400225.. code-block:: console
226
andrewa38d0012018-08-06 00:25:33 -0400227 $ make build-release
John DeNisco06dcd452018-07-26 12:45:10 -0400228
Saima Yunus5f6422d2022-05-19 11:48:59 -0700229Installing External Dependencies
230-------------------------------------------
231At this point, there are still some VPP external dependencies left to install. They could be installed
232using 'make-build', but this only installs them locally in the VPP tree, not in the operating system.
233In order to fix this and save time, run the following command:
John DeNisco06dcd452018-07-26 12:45:10 -0400234
Saima Yunus5f6422d2022-05-19 11:48:59 -0700235.. code-block:: console
236
237 $ make install-ext-deps
238
239-------------------------------------------
John DeNisco06dcd452018-07-26 12:45:10 -0400240Building Necessary Packages
Saima Yunus5f6422d2022-05-19 11:48:59 -0700241-------------------------------------------
John DeNisco06dcd452018-07-26 12:45:10 -0400242
John DeNisco2ba9dcf2018-08-23 14:04:22 -0400243The package that needs to be built depends on the type system VPP will be running on:
244
245* The :ref:`Debian package <debianpackages>` is built if VPP is going to run on Ubuntu
246* The :ref:`RPM package <rpmpackages>` is built if VPP is going to run on Centos or Redhat
247
248.. _debianpackages:
249
John DeNisco06dcd452018-07-26 12:45:10 -0400250Building Debian Packages
andrewa38d0012018-08-06 00:25:33 -0400251^^^^^^^^^^^^^^^^^^^^^^^^^
John DeNisco06dcd452018-07-26 12:45:10 -0400252
John DeNisco2ba9dcf2018-08-23 14:04:22 -0400253To build the debian packages, use the following command:
John DeNiscoce96dda2018-08-14 16:04:09 -0400254
John DeNisco06dcd452018-07-26 12:45:10 -0400255.. code-block:: console
256
Nathan Skrzypczak9ad39c02021-08-19 11:38:06 +0200257 $ make pkg-deb
258
Andrew Yourtchenko5ca8bfc2023-10-18 21:18:32 +0000259Reproducible builds on Debian
260^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
261
262By default the VPP artifacts have various bits of
263information in them aimed at simplifying the identification
264during the development (like, the user name that built
265the package as well as the build times). By setting
266a few environment variables one can obtain bit-identical
267.deb files, assuming that the prerequisites installed
268in the build environment are identical.
269
270
271Setting and using the SOURCE_DATE_EPOCH variable
272(see https://reproducible-builds.org/docs/source-date-epoch/)
273takes care of most of the magic necessary.
274
275The package vpp-ext-deps is already being built with that
276date set to date of the last modification of the
277build/external/ tree
278(similar to deriving the "number of commits" for the package
279versioning of vpp-ext-deps)
280
281For the rest of the packages, pinning the following
282three variables should result in bit-identical
283artifacts across multiple runs in the build environment:
284
285 .. code-block:: console
286
287 export SOURCE_DATE_EPOCH=$(date +%s)
288 export VPP_BUILD_HOST="buildhost"
289 export VPP_BUILD_USER="builduser"
290
291If you want to reproduce the bit-identical builds across
292different environments, take a look at "vpp_<BUILD_VERSION>.buildinfo" file
293which gets created in build-root alongside the .deb repositories -
294it has the cryptographic hashes for the newly built packages, and
295the full list of build dependencies and their versions.
296
John DeNisco2ba9dcf2018-08-23 14:04:22 -0400297.. _rpmpackages:
John DeNisco06dcd452018-07-26 12:45:10 -0400298
John DeNisco06dcd452018-07-26 12:45:10 -0400299Building RPM Packages
andrewa38d0012018-08-06 00:25:33 -0400300^^^^^^^^^^^^^^^^^^^^^^^
John DeNisco06dcd452018-07-26 12:45:10 -0400301
John DeNiscoce96dda2018-08-14 16:04:09 -0400302To build the rpm packages, use one of the following commands below, depending on the system:
303
John DeNisco06dcd452018-07-26 12:45:10 -0400304.. code-block:: console
305
306 $ make pkg-rpm
307
John DeNisco2ba9dcf2018-08-23 14:04:22 -0400308Once the packages are built they can be found in the build-root directory.
John DeNisco06dcd452018-07-26 12:45:10 -0400309
310.. code-block:: console
Nathan Skrzypczak9ad39c02021-08-19 11:38:06 +0200311
Benoît Ganne8aa47b72023-06-07 11:33:31 +0200312 $ ls build-root/*.deb
John DeNisco06dcd452018-07-26 12:45:10 -0400313
John DeNisco2ba9dcf2018-08-23 14:04:22 -0400314 If the packages are built correctly, then this should be the corresponding output:
John DeNisco06dcd452018-07-26 12:45:10 -0400315
316 vpp_18.07-rc0~456-gb361076_amd64.deb vpp-dbg_18.07-rc0~456-gb361076_amd64.deb
Michal Cmarada4e633e12019-01-31 10:57:40 +0100317 vpp-dev_18.07-rc0~456-gb361076_amd64.deb vpp-api-lua_18.07-rc0~456-gb361076_amd64.deb
318 vpp-lib_18.07-rc0~456-gb361076_amd64.deb vpp-api-python_18.07-rc0~456-gb361076_amd64.deb
319 vpp-plugins_18.07-rc0~456-gb361076_amd64.deb
John DeNisco06dcd452018-07-26 12:45:10 -0400320
John DeNisco2ba9dcf2018-08-23 14:04:22 -0400321Finally, the created packages can be installed using the following commands. Install
Paul Vinciguerra7fa3dd22019-10-27 17:28:10 -0400322the package that corresponds to OS that VPP will be running on:
andrewa38d0012018-08-06 00:25:33 -0400323
324For Ubuntu:
John DeNisco06dcd452018-07-26 12:45:10 -0400325
326.. code-block:: console
327
Benoît Ganne8aa47b72023-06-07 11:33:31 +0200328 $ sudo dpkg -i build-root/*.deb
andrewa38d0012018-08-06 00:25:33 -0400329
330For Centos or Redhat:
331
332.. code-block:: console
333
Benoît Ganne8aa47b72023-06-07 11:33:31 +0200334 $ sudo rpm -ivh build-root/*.rpm