xref: /openbmc/qemu/docs/devel/build-system.rst (revision ee48fef0)
1==================================
2The QEMU build system architecture
3==================================
4
5This document aims to help developers understand the architecture of the
6QEMU build system. As with projects using GNU autotools, the QEMU build
7system has two stages; first the developer runs the "configure" script
8to determine the local build environment characteristics, then they run
9"make" to build the project.  This is about where the similarities with
10GNU autotools end, so try to forget what you know about them.
11
12The two general ways to perform a build are as follows:
13
14 - build artifacts outside of QEMU source tree entirely::
15
16     cd ../
17     mkdir build
18     cd build
19     ../qemu/configure
20     make
21
22 - build artifacts in a subdir of QEMU source tree::
23
24     mkdir build
25     cd build
26     ../configure
27     make
28
29Most of the actual build process uses Meson under the hood, therefore
30build artifacts cannot be placed in the source tree itself.
31
32
33Stage 1: configure
34==================
35
36The configure script has five tasks:
37
38 - detect the host architecture
39
40 - list the targets for which to build emulators; the list of
41   targets also affects which firmware binaries and tests to build
42
43 - find the compilers (native and cross) used to build executables,
44   firmware and tests.  The results are written as either Makefile
45   fragments (``config-host.mak``) or a Meson machine file
46   (``config-meson.cross``)
47
48 - create a virtual environment in which all Python code runs during
49   the build, and possibly install packages into it from PyPI
50
51 - invoke Meson in the virtual environment, to perform the actual
52   configuration step for the emulator build
53
54The configure script automatically recognizes command line options for
55which a same-named Meson option exists; dashes in the command line are
56replaced with underscores.
57
58Almost all QEMU developers that need to modify the build system will
59only be concerned with Meson, and therefore can skip the rest of this
60section.
61
62
63Modifying ``configure``
64-----------------------
65
66``configure`` is a shell script; it uses ``#!/bin/sh`` and therefore
67should be compatible with any POSIX shell. It is important to avoid
68using bash-isms to avoid breaking development platforms where bash is
69the primary host.
70
71The configure script provides a variety of functions to help writing
72portable shell code and providing consistent behavior across architectures
73and operating systems:
74
75``error_exit $MESSAGE $MORE...``
76   Print $MESSAGE to stderr, followed by $MORE... and then exit from the
77   configure script with non-zero status.
78
79``has $COMMAND``
80   Determine if $COMMAND exists in the current environment, either as a
81   shell builtin, or executable binary, returning 0 on success.  The
82   replacement in Meson is ``find_program()``.
83
84``probe_target_compiler $TARGET``
85  Detect a cross compiler and cross tools for the QEMU target $TARGET (e.g.,
86  ``$CPU-softmmu``, ``$CPU-linux-user``, ``$CPU-bsd-user``).  If a working
87  compiler is present, return success and set variables ``$target_cc``,
88  ``$target_ar``, etc. to non-empty values.
89
90``write_target_makefile``
91  Write a Makefile fragment to stdout, exposing the result of the most
92  ``probe_target_compiler`` call as the usual Make variables (``CC``,
93  ``AR``, ``LD``, etc.).
94
95
96Configure does not generally perform tests for compiler options beyond
97basic checks to detect the host platform and ensure the compiler is
98functioning.  These are performed using a few more helper functions:
99
100``compile_object $CFLAGS``
101   Attempt to compile a test program with the system C compiler using
102   $CFLAGS. The test program must have been previously written to a file
103   called $TMPC.
104
105``compile_prog $CFLAGS $LDFLAGS``
106   Attempt to compile a test program with the system C compiler using
107   $CFLAGS and link it with the system linker using $LDFLAGS. The test
108   program must have been previously written to a file called $TMPC.
109
110``check_define $NAME``
111   Determine if the macro $NAME is defined by the system C compiler.
112
113``do_compiler $CC $ARGS...``
114   Attempt to run the C compiler $CC, passing it $ARGS...  This function
115   does not use flags passed via options such as ``--extra-cflags``, and
116   therefore can be used to check for cross compilers.  However, most
117   such checks are done at ``make`` time instead (see for example the
118   ``cc-option`` macro in ``pc-bios/option-rom/Makefile``).
119
120``write_c_skeleton``
121   Write a minimal C program main() function to the temporary file
122   indicated by $TMPC.
123
124
125Python virtual environments and the build process
126-------------------------------------------------
127
128An important step in ``configure`` is to create a Python virtual
129environment (venv) during the configuration phase.  The Python interpreter
130comes from the ``--python`` command line option, the ``$PYTHON`` variable
131from the environment, or the system PATH, in this order.  The venv resides
132in the ``pyvenv`` directory in the build tree, and provides consistency
133in how the build process runs Python code.
134
135At this stage, ``configure`` also queries the chosen Python interpreter
136about QEMU's build dependencies.  Note that the build process does  *not*
137look for ``meson``, ``sphinx-build`` or ``avocado`` binaries in the PATH;
138likewise, there are no options such as ``--meson`` or ``--sphinx-build``.
139This avoids a potential mismatch, where Meson and Sphinx binaries on the
140PATH might operate in a different Python environment than the one chosen
141by the user during the build process.  On the other hand, it introduces
142a potential source of confusion where the user installs a dependency but
143``configure`` is not able to find it.  When this happens, the dependency
144was installed in the ``site-packages`` directory of another interpreter,
145or with the wrong ``pip`` program.
146
147If a package is available for the chosen interpreter, ``configure``
148prepares a small script that invokes it from the venv itself[#distlib]_.
149If not, ``configure`` can also optionally install dependencies in the
150virtual environment with ``pip``, either from wheels in ``python/wheels``
151or by downloading the package with PyPI.  Downloading can be disabled with
152``--disable-download``; and anyway, it only happens when a ``configure``
153option (currently, only ``--enable-docs``) is explicitly enabled but
154the dependencies are not present[#pip]_.
155
156.. [#distlib] The scripts are created based on the package's metadata,
157              specifically the ``console_script`` entry points.  This is the
158              same mechanism that ``pip`` uses when installing a package.
159              Currently, in all cases it would be possible to use ``python -m``
160              instead of an entry point script, which makes this approach a
161              bit overkill.  On the other hand, creating the scripts is
162              future proof and it makes the contents of the ``pyvenv/bin``
163              directory more informative.  Portability is also not an issue,
164              because the Python Packaging Authority provides a package
165              ``distlib.scripts`` to perform this task.
166
167.. [#pip] ``pip`` might also be used when running ``make check-avocado``
168           if downloading is enabled, to ensure that Avocado is
169           available.
170
171The required versions of the packages are stored in a configuration file
172``pythondeps.toml``.  The format is custom to QEMU, but it is documented
173at the top of the file itself and it should be easy to understand.  The
174requirements should make it possible to use the version that is packaged
175that is provided by supported distros.
176
177When dependencies are downloaded, instead, ``configure`` uses a "known
178good" version that is also listed in ``pythondeps.toml``.  In this
179scenario, ``pythondeps.toml`` behaves like the "lock file" used by
180``cargo``, ``poetry`` or other dependency management systems.
181
182
183Bundled Python packages
184-----------------------
185
186Python packages that are **mandatory** dependencies to build QEMU,
187but are not available in all supported distros, are bundled with the
188QEMU sources.  The only one is currently Meson (outdated in Ubuntu
18922.04 and openSUSE Leap).
190
191In order to include a new or updated wheel, modify and rerun the
192``python/scripts/vendor.py`` script.  The script embeds the
193sha256 hash of package sources and checks it.  The pypi.org web site
194provides an easy way to retrieve the sha256 hash of the sources.
195
196
197Stage 2: Meson
198==============
199
200The Meson build system describes the build and install process for:
201
2021) executables, which include:
203
204   - Tools - ``qemu-img``, ``qemu-nbd``, ``qemu-ga`` (guest agent), etc
205
206   - System emulators - ``qemu-system-$ARCH``
207
208   - Userspace emulators - ``qemu-$ARCH``
209
210   - Unit tests
211
2122) documentation
213
2143) ROMs, whether provided as binary blobs in the QEMU distributions
215   or cross compiled under the direction of the configure script
216
2174) other data files, such as icons or desktop files
218
219All executables are built by default, except for some ``contrib/``
220binaries that are known to fail to build on some platforms (for example
22132-bit or big-endian platforms).  Tests are also built by default,
222though that might change in the future.
223
224The source code is highly modularized, split across many files to
225facilitate building of all of these components with as little duplicated
226compilation as possible. Using the Meson "sourceset" functionality,
227``meson.build`` files group the source files in rules that are
228enabled according to the available system libraries and to various
229configuration symbols.  Sourcesets belong to one of four groups:
230
231Subsystem sourcesets:
232  Various subsystems that are common to both tools and emulators have
233  their own sourceset, for example ``block_ss`` for the block device subsystem,
234  ``chardev_ss`` for the character device subsystem, etc.  These sourcesets
235  are then turned into static libraries as follows::
236
237    libchardev = static_library('chardev', chardev_ss.sources(),
238                                name_suffix: 'fa',
239                                build_by_default: false)
240
241    chardev = declare_dependency(link_whole: libchardev)
242
243  As of Meson 0.55.1, the special ``.fa`` suffix should be used for everything
244  that is used with ``link_whole``, to ensure that the link flags are placed
245  correctly in the command line.
246
247Target-independent emulator sourcesets:
248  Various general purpose helper code is compiled only once and
249  the .o files are linked into all output binaries that need it.
250  This includes error handling infrastructure, standard data structures,
251  platform portability wrapper functions, etc.
252
253  Target-independent code lives in the ``common_ss``, ``system_ss`` and
254  ``user_ss`` sourcesets.  ``common_ss`` is linked into all emulators,
255  ``system_ss`` only in system emulators, ``user_ss`` only in user-mode
256  emulators.
257
258Target-dependent emulator sourcesets:
259  In the target-dependent set lives CPU emulation, some device emulation and
260  much glue code. This sometimes also has to be compiled multiple times,
261  once for each target being built.  Target-dependent files are included
262  in the ``specific_ss`` sourceset.
263
264  Each emulator also includes sources for files in the ``hw/`` and ``target/``
265  subdirectories.  The subdirectory used for each emulator comes
266  from the target's definition of ``TARGET_BASE_ARCH`` or (if missing)
267  ``TARGET_ARCH``, as found in ``default-configs/targets/*.mak``.
268
269  Each subdirectory in ``hw/`` adds one sourceset to the ``hw_arch`` dictionary,
270  for example::
271
272    arm_ss = ss.source_set()
273    arm_ss.add(files('boot.c'), fdt)
274    ...
275    hw_arch += {'arm': arm_ss}
276
277  The sourceset is only used for system emulators.
278
279  Each subdirectory in ``target/`` instead should add one sourceset to each
280  of the ``target_arch`` and ``target_system_arch``, which are used respectively
281  for all emulators and for system emulators only.  For example::
282
283    arm_ss = ss.source_set()
284    arm_system_ss = ss.source_set()
285    ...
286    target_arch += {'arm': arm_ss}
287    target_system_arch += {'arm': arm_system_ss}
288
289Module sourcesets:
290  There are two dictionaries for modules: ``modules`` is used for
291  target-independent modules and ``target_modules`` is used for
292  target-dependent modules.  When modules are disabled the ``module``
293  source sets are added to ``system_ss`` and the ``target_modules``
294  source sets are added to ``specific_ss``.
295
296  Both dictionaries are nested.  One dictionary is created per
297  subdirectory, and these per-subdirectory dictionaries are added to
298  the toplevel dictionaries.  For example::
299
300    hw_display_modules = {}
301    qxl_ss = ss.source_set()
302    ...
303    hw_display_modules += { 'qxl': qxl_ss }
304    modules += { 'hw-display': hw_display_modules }
305
306Utility sourcesets:
307  All binaries link with a static library ``libqemuutil.a``.  This library
308  is built from several sourcesets; most of them however host generated
309  code, and the only two of general interest are ``util_ss`` and ``stub_ss``.
310
311  The separation between these two is purely for documentation purposes.
312  ``util_ss`` contains generic utility files.  Even though this code is only
313  linked in some binaries, sometimes it requires hooks only in some of
314  these and depend on other functions that are not fully implemented by
315  all QEMU binaries.  ``stub_ss`` links dummy stubs that will only be linked
316  into the binary if the real implementation is not present.  In a way,
317  the stubs can be thought of as a portable implementation of the weak
318  symbols concept.
319
320
321The following files concur in the definition of which files are linked
322into each emulator:
323
324``default-configs/devices/*.mak``
325  The files under ``default-configs/devices/`` control the boards and devices
326  that are built into each QEMU system emulation targets. They merely contain
327  a list of config variable definitions such as::
328
329    include arm-softmmu.mak
330    CONFIG_XLNX_ZYNQMP_ARM=y
331    CONFIG_XLNX_VERSAL=y
332
333``*/Kconfig``
334  These files are processed together with ``default-configs/devices/*.mak`` and
335  describe the dependencies between various features, subsystems and
336  device models.  They are described in :ref:`kconfig`
337
338``default-configs/targets/*.mak``
339  These files mostly define symbols that appear in the ``*-config-target.h``
340  file for each emulator [#cfgtarget]_.  However, the ``TARGET_ARCH``
341  and ``TARGET_BASE_ARCH`` will also be used to select the ``hw/`` and
342  ``target/`` subdirectories that are compiled into each target.
343
344.. [#cfgtarget] This header is included by ``qemu/osdep.h`` when
345                compiling files from the target-specific sourcesets.
346
347These files rarely need changing unless you are adding a completely
348new target, or enabling new devices or hardware for a particular
349system/userspace emulation target
350
351
352Adding checks
353-------------
354
355Compiler checks can be as simple as the following::
356
357  config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
358
359A more complex task such as adding a new dependency usually
360comprises the following tasks:
361
362 - Add a Meson build option to meson_options.txt.
363
364 - Add code to perform the actual feature check.
365
366 - Add code to include the feature status in ``config-host.h``
367
368 - Add code to print out the feature status in the configure summary
369   upon completion.
370
371Taking the probe for SDL2_Image as an example, we have the following
372in ``meson_options.txt``::
373
374  option('sdl_image', type : 'feature', value : 'auto',
375         description: 'SDL Image support for icons')
376
377Unless the option was given a non-``auto`` value (on the configure
378command line), the detection code must be performed only if the
379dependency will be used::
380
381  sdl_image = not_found
382  if not get_option('sdl_image').auto() or have_system
383    sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
384                           method: 'pkg-config')
385  endif
386
387This avoids warnings on static builds of user-mode emulators, for example.
388Most of the libraries used by system-mode emulators are not available for
389static linking.
390
391The other supporting code is generally simple::
392
393  # Create config-host.h (if applicable)
394  config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
395
396  # Summary
397  summary_info += {'SDL image support': sdl_image.found()}
398
399For the configure script to parse the new option, the
400``scripts/meson-buildoptions.sh`` file must be up-to-date; ``make
401update-buildoptions`` (or just ``make``) will take care of updating it.
402
403
404Support scripts
405---------------
406
407Meson has a special convention for invoking Python scripts: if their
408first line is ``#! /usr/bin/env python3`` and the file is *not* executable,
409find_program() arranges to invoke the script under the same Python
410interpreter that was used to invoke Meson.  This is the most common
411and preferred way to invoke support scripts from Meson build files,
412because it automatically uses the value of configure's --python= option.
413
414In case the script is not written in Python, use a ``#! /usr/bin/env ...``
415line and make the script executable.
416
417Scripts written in Python, where it is desirable to make the script
418executable (for example for test scripts that developers may want to
419invoke from the command line, such as tests/qapi-schema/test-qapi.py),
420should be invoked through the ``python`` variable in meson.build. For
421example::
422
423  test('QAPI schema regression tests', python,
424       args: files('test-qapi.py'),
425       env: test_env, suite: ['qapi-schema', 'qapi-frontend'])
426
427This is needed to obey the --python= option passed to the configure
428script, which may point to something other than the first python3
429binary on the path.
430
431By the time Meson runs, Python dependencies are available in the virtual
432environment and should be invoked through the scripts that ``configure``
433places under ``pyvenv``.  One way to do so is as follows, using Meson's
434``find_program`` function::
435
436  sphinx_build = find_program(
437       fs.parent(python.full_path()) / 'sphinx-build',
438       required: get_option('docs'))
439
440
441Stage 3: Make
442=============
443
444The next step in building QEMU is to invoke make.  GNU Make is required
445to build QEMU, and may be installed as ``gmake`` on some hosts.
446
447The output of Meson is a ``build.ninja`` file, which is used with the
448Ninja build tool.  However, QEMU's build comprises other components than
449just the emulators (namely firmware and the tests in ``tests/tcg``) which
450need different cross compilers.  The QEMU Makefile wraps both Ninja and
451the smaller build systems for firmware and tests; it also takes care of
452running ``configure`` again when the script changes.  Apart from invoking
453these sub-Makefiles, the resulting build is largely non-recursive.
454
455Tests, whether defined in ``meson.build`` or not, are also ran by the
456Makefile with the traditional ``make check`` phony target, while benchmarks
457are run with ``make bench``.  Meson test suites such as ``unit`` can be ran
458with ``make check-unit``, and ``make check-tcg`` builds and runs "non-Meson"
459tests for all targets.
460
461If desired, it is also possible to use ``ninja`` and ``meson test``,
462respectively to build emulators and run tests defined in meson.build.
463The main difference is that ``make`` needs the ``-jN`` flag in order to
464enable parallel builds or tests.
465
466Useful make targets
467-------------------
468
469``help``
470  Print a help message for the most common build targets.
471
472``print-VAR``
473  Print the value of the variable VAR. Useful for debugging the build
474  system.
475
476
477Important files for the build system
478====================================
479
480Statically defined files
481------------------------
482
483The following key files are statically defined in the source tree, with
484the rules needed to build QEMU. Their behaviour is influenced by a
485number of dynamically created files listed later.
486
487``Makefile``
488  The main entry point used when invoking make to build all the components
489  of QEMU. The default 'all' target will naturally result in the build of
490  every component.
491
492``*/meson.build``
493  The meson.build file in the root directory is the main entry point for the
494  Meson build system, and it coordinates the configuration and build of all
495  executables.  Build rules for various subdirectories are included in
496  other meson.build files spread throughout the QEMU source tree.
497
498``python/scripts/mkvenv.py``
499  A wrapper for the Python ``venv`` and ``distlib.scripts`` packages.
500  It handles creating the virtual environment, creating scripts in
501  ``pyvenv/bin``, and calling ``pip`` to install dependencies.
502
503``tests/Makefile.include``
504  Rules for external test harnesses. These include the TCG tests
505  and the Avocado-based integration tests.
506
507``tests/docker/Makefile.include``
508  Rules for Docker tests. Like ``tests/Makefile.include``, this file is
509  included directly by the top level Makefile, anything defined in this
510  file will influence the entire build system.
511
512``tests/vm/Makefile.include``
513  Rules for VM-based tests. Like ``tests/Makefile.include``, this file is
514  included directly by the top level Makefile, anything defined in this
515  file will influence the entire build system.
516
517Dynamically created files
518-------------------------
519
520The following files are generated at run-time in order to control the
521behaviour of the Makefiles. This avoids the need for QEMU makefiles to
522go through any pre-processing as seen with autotools, where configure
523generates ``Makefile`` from ``Makefile.in``.
524
525Built by configure:
526
527``config-host.mak``
528  When configure has determined the characteristics of the build host it
529  will write the paths to various tools to this file, for use in ``Makefile``
530  and to a smaller extent ``meson.build``.
531
532  ``config-host.mak`` is also used as a dependency checking mechanism. If make
533  sees that the modification timestamp on configure is newer than that on
534  ``config-host.mak``, then configure will be re-run.
535
536``config-meson.cross``
537
538  A Meson "cross file" (or native file) used to communicate the paths to
539  the toolchain and other configuration options.
540
541``config.status``
542
543  A small shell script that will invoke configure again with the same
544  environment variables that were set during the first run.  It's used to
545  rerun configure after changes to the source code, but it can also be
546  inspected manually to check the contents of the environment.
547
548``Makefile.prereqs``
549
550  A set of Makefile dependencies that order the build and execution of
551  firmware and tests after the container images and emulators that they
552  need.
553
554``pc-bios/*/config.mak``, ``tests/tcg/config-host.mak``, ``tests/tcg/*/config-target.mak``
555
556  Configuration variables used to build the firmware and TCG tests,
557  including paths to cross compilation toolchains.
558
559``pyvenv``
560
561  A Python virtual environment that is used for all Python code running
562  during the build.  Using a virtual environment ensures that even code
563  that is run via ``sphinx-build``, ``meson`` etc. uses the same interpreter
564  and packages.
565
566Built by Meson:
567
568``config-host.h``
569  Used by C code to determine the properties of the build environment
570  and the set of enabled features for the entire build.
571
572``${TARGET-NAME}-config-devices.mak``
573  TARGET-NAME is the name of a system emulator. The file is
574  generated by Meson using files under ``configs/devices`` as input.
575
576``${TARGET-NAME}-config-target.mak``
577  TARGET-NAME is the name of a system or usermode emulator. The file is
578  generated by Meson using files under ``configs/targets`` as input.
579
580``$TARGET_NAME-config-target.h``, ``$TARGET_NAME-config-devices.h``
581  Used by C code to determine the properties and enabled
582  features for each target.  enabled.  They are generated from
583  the contents of the corresponding ``*.mak`` files using Meson's
584  ``configure_file()`` function; each target can include them using
585  the ``CONFIG_TARGET`` and ``CONFIG_DEVICES`` macro respectively.
586
587``build.ninja``
588  The build rules.
589
590
591Built by Makefile:
592
593``Makefile.ninja``
594  A Makefile include that bridges to ninja for the actual build.  The
595  Makefile is mostly a list of targets that Meson included in build.ninja.
596
597``Makefile.mtest``
598  The Makefile definitions that let "make check" run tests defined in
599  meson.build.  The rules are produced from Meson's JSON description of
600  tests (obtained with "meson introspect --tests") through the script
601  scripts/mtest2make.py.
602