xref: /openbmc/qemu/docs/devel/build-system.rst (revision b447378e)
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.  Currently this includes Meson (outdated in CentOS 8
189and derivatives, Ubuntu 20.04 and 22.04, and openSUSE Leap) and tomli
190(absent in Ubuntu 20.04).
191
192If you need to update these, please do so by modifying and rerunning
193``python/scripts/vendor.py``.  This script embeds the sha256 hash of
194package sources and checks it.  The pypi.org web site provides an easy
195way to retrieve the sha256 hash of the sources.
196
197
198Stage 2: Meson
199==============
200
201The Meson build system describes the build and install process for:
202
2031) executables, which include:
204
205   - Tools - ``qemu-img``, ``qemu-nbd``, ``qemu-ga`` (guest agent), etc
206
207   - System emulators - ``qemu-system-$ARCH``
208
209   - Userspace emulators - ``qemu-$ARCH``
210
211   - Unit tests
212
2132) documentation
214
2153) ROMs, whether provided as binary blobs in the QEMU distributions
216   or cross compiled under the direction of the configure script
217
2184) other data files, such as icons or desktop files
219
220All executables are built by default, except for some ``contrib/``
221binaries that are known to fail to build on some platforms (for example
22232-bit or big-endian platforms).  Tests are also built by default,
223though that might change in the future.
224
225The source code is highly modularized, split across many files to
226facilitate building of all of these components with as little duplicated
227compilation as possible. Using the Meson "sourceset" functionality,
228``meson.build`` files group the source files in rules that are
229enabled according to the available system libraries and to various
230configuration symbols.  Sourcesets belong to one of four groups:
231
232Subsystem sourcesets:
233  Various subsystems that are common to both tools and emulators have
234  their own sourceset, for example ``block_ss`` for the block device subsystem,
235  ``chardev_ss`` for the character device subsystem, etc.  These sourcesets
236  are then turned into static libraries as follows::
237
238    libchardev = static_library('chardev', chardev_ss.sources(),
239                                name_suffix: 'fa',
240                                build_by_default: false)
241
242    chardev = declare_dependency(link_whole: libchardev)
243
244  As of Meson 0.55.1, the special ``.fa`` suffix should be used for everything
245  that is used with ``link_whole``, to ensure that the link flags are placed
246  correctly in the command line.
247
248Target-independent emulator sourcesets:
249  Various general purpose helper code is compiled only once and
250  the .o files are linked into all output binaries that need it.
251  This includes error handling infrastructure, standard data structures,
252  platform portability wrapper functions, etc.
253
254  Target-independent code lives in the ``common_ss``, ``system_ss`` and
255  ``user_ss`` sourcesets.  ``common_ss`` is linked into all emulators,
256  ``system_ss`` only in system emulators, ``user_ss`` only in user-mode
257  emulators.
258
259  Target-independent sourcesets must exercise particular care when using
260  ``if_false`` rules.  The ``if_false`` rule will be used correctly when linking
261  emulator binaries; however, when *compiling* target-independent files
262  into .o files, Meson may need to pick *both* the ``if_true`` and
263  ``if_false`` sides to cater for targets that want either side.  To
264  achieve that, you can add a special rule using the ``CONFIG_ALL``
265  symbol::
266
267    # Some targets have CONFIG_ACPI, some don't, so this is not enough
268    system_ss.add(when: 'CONFIG_ACPI', if_true: files('acpi.c'),
269                                        if_false: files('acpi-stub.c'))
270
271    # This is required as well:
272    system_ss.add(when: 'CONFIG_ALL', if_true: files('acpi-stub.c'))
273
274Target-dependent emulator sourcesets:
275  In the target-dependent set lives CPU emulation, some device emulation and
276  much glue code. This sometimes also has to be compiled multiple times,
277  once for each target being built.  Target-dependent files are included
278  in the ``specific_ss`` sourceset.
279
280  Each emulator also includes sources for files in the ``hw/`` and ``target/``
281  subdirectories.  The subdirectory used for each emulator comes
282  from the target's definition of ``TARGET_BASE_ARCH`` or (if missing)
283  ``TARGET_ARCH``, as found in ``default-configs/targets/*.mak``.
284
285  Each subdirectory in ``hw/`` adds one sourceset to the ``hw_arch`` dictionary,
286  for example::
287
288    arm_ss = ss.source_set()
289    arm_ss.add(files('boot.c'), fdt)
290    ...
291    hw_arch += {'arm': arm_ss}
292
293  The sourceset is only used for system emulators.
294
295  Each subdirectory in ``target/`` instead should add one sourceset to each
296  of the ``target_arch`` and ``target_system_arch``, which are used respectively
297  for all emulators and for system emulators only.  For example::
298
299    arm_ss = ss.source_set()
300    arm_system_ss = ss.source_set()
301    ...
302    target_arch += {'arm': arm_ss}
303    target_system_arch += {'arm': arm_system_ss}
304
305Module sourcesets:
306  There are two dictionaries for modules: ``modules`` is used for
307  target-independent modules and ``target_modules`` is used for
308  target-dependent modules.  When modules are disabled the ``module``
309  source sets are added to ``system_ss`` and the ``target_modules``
310  source sets are added to ``specific_ss``.
311
312  Both dictionaries are nested.  One dictionary is created per
313  subdirectory, and these per-subdirectory dictionaries are added to
314  the toplevel dictionaries.  For example::
315
316    hw_display_modules = {}
317    qxl_ss = ss.source_set()
318    ...
319    hw_display_modules += { 'qxl': qxl_ss }
320    modules += { 'hw-display': hw_display_modules }
321
322Utility sourcesets:
323  All binaries link with a static library ``libqemuutil.a``.  This library
324  is built from several sourcesets; most of them however host generated
325  code, and the only two of general interest are ``util_ss`` and ``stub_ss``.
326
327  The separation between these two is purely for documentation purposes.
328  ``util_ss`` contains generic utility files.  Even though this code is only
329  linked in some binaries, sometimes it requires hooks only in some of
330  these and depend on other functions that are not fully implemented by
331  all QEMU binaries.  ``stub_ss`` links dummy stubs that will only be linked
332  into the binary if the real implementation is not present.  In a way,
333  the stubs can be thought of as a portable implementation of the weak
334  symbols concept.
335
336
337The following files concur in the definition of which files are linked
338into each emulator:
339
340``default-configs/devices/*.mak``
341  The files under ``default-configs/devices/`` control the boards and devices
342  that are built into each QEMU system emulation targets. They merely contain
343  a list of config variable definitions such as::
344
345    include arm-softmmu.mak
346    CONFIG_XLNX_ZYNQMP_ARM=y
347    CONFIG_XLNX_VERSAL=y
348
349``*/Kconfig``
350  These files are processed together with ``default-configs/devices/*.mak`` and
351  describe the dependencies between various features, subsystems and
352  device models.  They are described in :ref:`kconfig`
353
354``default-configs/targets/*.mak``
355  These files mostly define symbols that appear in the ``*-config-target.h``
356  file for each emulator [#cfgtarget]_.  However, the ``TARGET_ARCH``
357  and ``TARGET_BASE_ARCH`` will also be used to select the ``hw/`` and
358  ``target/`` subdirectories that are compiled into each target.
359
360.. [#cfgtarget] This header is included by ``qemu/osdep.h`` when
361                compiling files from the target-specific sourcesets.
362
363These files rarely need changing unless you are adding a completely
364new target, or enabling new devices or hardware for a particular
365system/userspace emulation target
366
367
368Adding checks
369-------------
370
371Compiler checks can be as simple as the following::
372
373  config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
374
375A more complex task such as adding a new dependency usually
376comprises the following tasks:
377
378 - Add a Meson build option to meson_options.txt.
379
380 - Add code to perform the actual feature check.
381
382 - Add code to include the feature status in ``config-host.h``
383
384 - Add code to print out the feature status in the configure summary
385   upon completion.
386
387Taking the probe for SDL2_Image as an example, we have the following
388in ``meson_options.txt``::
389
390  option('sdl_image', type : 'feature', value : 'auto',
391         description: 'SDL Image support for icons')
392
393Unless the option was given a non-``auto`` value (on the configure
394command line), the detection code must be performed only if the
395dependency will be used::
396
397  sdl_image = not_found
398  if not get_option('sdl_image').auto() or have_system
399    sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
400                           method: 'pkg-config')
401  endif
402
403This avoids warnings on static builds of user-mode emulators, for example.
404Most of the libraries used by system-mode emulators are not available for
405static linking.
406
407The other supporting code is generally simple::
408
409  # Create config-host.h (if applicable)
410  config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
411
412  # Summary
413  summary_info += {'SDL image support': sdl_image.found()}
414
415For the configure script to parse the new option, the
416``scripts/meson-buildoptions.sh`` file must be up-to-date; ``make
417update-buildoptions`` (or just ``make``) will take care of updating it.
418
419
420Support scripts
421---------------
422
423Meson has a special convention for invoking Python scripts: if their
424first line is ``#! /usr/bin/env python3`` and the file is *not* executable,
425find_program() arranges to invoke the script under the same Python
426interpreter that was used to invoke Meson.  This is the most common
427and preferred way to invoke support scripts from Meson build files,
428because it automatically uses the value of configure's --python= option.
429
430In case the script is not written in Python, use a ``#! /usr/bin/env ...``
431line and make the script executable.
432
433Scripts written in Python, where it is desirable to make the script
434executable (for example for test scripts that developers may want to
435invoke from the command line, such as tests/qapi-schema/test-qapi.py),
436should be invoked through the ``python`` variable in meson.build. For
437example::
438
439  test('QAPI schema regression tests', python,
440       args: files('test-qapi.py'),
441       env: test_env, suite: ['qapi-schema', 'qapi-frontend'])
442
443This is needed to obey the --python= option passed to the configure
444script, which may point to something other than the first python3
445binary on the path.
446
447By the time Meson runs, Python dependencies are available in the virtual
448environment and should be invoked through the scripts that ``configure``
449places under ``pyvenv``.  One way to do so is as follows, using Meson's
450``find_program`` function::
451
452  sphinx_build = find_program(
453       fs.parent(python.full_path()) / 'sphinx-build',
454       required: get_option('docs'))
455
456
457Stage 3: Make
458=============
459
460The next step in building QEMU is to invoke make.  GNU Make is required
461to build QEMU, and may be installed as ``gmake`` on some hosts.
462
463The output of Meson is a ``build.ninja`` file, which is used with the
464Ninja build tool.  However, QEMU's build comprises other components than
465just the emulators (namely firmware and the tests in ``tests/tcg``) which
466need different cross compilers.  The QEMU Makefile wraps both Ninja and
467the smaller build systems for firmware and tests; it also takes care of
468running ``configure`` again when the script changes.  Apart from invoking
469these sub-Makefiles, the resulting build is largely non-recursive.
470
471Tests, whether defined in ``meson.build`` or not, are also ran by the
472Makefile with the traditional ``make check`` phony target, while benchmarks
473are run with ``make bench``.  Meson test suites such as ``unit`` can be ran
474with ``make check-unit``, and ``make check-tcg`` builds and runs "non-Meson"
475tests for all targets.
476
477If desired, it is also possible to use ``ninja`` and ``meson test``,
478respectively to build emulators and run tests defined in meson.build.
479The main difference is that ``make`` needs the ``-jN`` flag in order to
480enable parallel builds or tests.
481
482Useful make targets
483-------------------
484
485``help``
486  Print a help message for the most common build targets.
487
488``print-VAR``
489  Print the value of the variable VAR. Useful for debugging the build
490  system.
491
492
493Important files for the build system
494====================================
495
496Statically defined files
497------------------------
498
499The following key files are statically defined in the source tree, with
500the rules needed to build QEMU. Their behaviour is influenced by a
501number of dynamically created files listed later.
502
503``Makefile``
504  The main entry point used when invoking make to build all the components
505  of QEMU. The default 'all' target will naturally result in the build of
506  every component.
507
508``*/meson.build``
509  The meson.build file in the root directory is the main entry point for the
510  Meson build system, and it coordinates the configuration and build of all
511  executables.  Build rules for various subdirectories are included in
512  other meson.build files spread throughout the QEMU source tree.
513
514``python/scripts/mkvenv.py``
515  A wrapper for the Python ``venv`` and ``distlib.scripts`` packages.
516  It handles creating the virtual environment, creating scripts in
517  ``pyvenv/bin``, and calling ``pip`` to install dependencies.
518
519``tests/Makefile.include``
520  Rules for external test harnesses. These include the TCG tests
521  and the Avocado-based integration tests.
522
523``tests/docker/Makefile.include``
524  Rules for Docker tests. Like ``tests/Makefile.include``, this file is
525  included directly by the top level Makefile, anything defined in this
526  file will influence the entire build system.
527
528``tests/vm/Makefile.include``
529  Rules for VM-based tests. Like ``tests/Makefile.include``, this file is
530  included directly by the top level Makefile, anything defined in this
531  file will influence the entire build system.
532
533Dynamically created files
534-------------------------
535
536The following files are generated at run-time in order to control the
537behaviour of the Makefiles. This avoids the need for QEMU makefiles to
538go through any pre-processing as seen with autotools, where configure
539generates ``Makefile`` from ``Makefile.in``.
540
541Built by configure:
542
543``config-host.mak``
544  When configure has determined the characteristics of the build host it
545  will write the paths to various tools to this file, for use in ``Makefile``
546  and to a smaller extent ``meson.build``.
547
548  ``config-host.mak`` is also used as a dependency checking mechanism. If make
549  sees that the modification timestamp on configure is newer than that on
550  ``config-host.mak``, then configure will be re-run.
551
552``config-meson.cross``
553
554  A Meson "cross file" (or native file) used to communicate the paths to
555  the toolchain and other configuration options.
556
557``config.status``
558
559  A small shell script that will invoke configure again with the same
560  environment variables that were set during the first run.  It's used to
561  rerun configure after changes to the source code, but it can also be
562  inspected manually to check the contents of the environment.
563
564``Makefile.prereqs``
565
566  A set of Makefile dependencies that order the build and execution of
567  firmware and tests after the container images and emulators that they
568  need.
569
570``pc-bios/*/config.mak``, ``tests/tcg/config-host.mak``, ``tests/tcg/*/config-target.mak``
571
572  Configuration variables used to build the firmware and TCG tests,
573  including paths to cross compilation toolchains.
574
575``pyvenv``
576
577  A Python virtual environment that is used for all Python code running
578  during the build.  Using a virtual environment ensures that even code
579  that is run via ``sphinx-build``, ``meson`` etc. uses the same interpreter
580  and packages.
581
582Built by Meson:
583
584``config-host.h``
585  Used by C code to determine the properties of the build environment
586  and the set of enabled features for the entire build.
587
588``${TARGET-NAME}-config-devices.mak``
589  TARGET-NAME is the name of a system emulator. The file is
590  generated by Meson using files under ``configs/devices`` as input.
591
592``${TARGET-NAME}-config-target.mak``
593  TARGET-NAME is the name of a system or usermode emulator. The file is
594  generated by Meson using files under ``configs/targets`` as input.
595
596``$TARGET_NAME-config-target.h``, ``$TARGET_NAME-config-devices.h``
597  Used by C code to determine the properties and enabled
598  features for each target.  enabled.  They are generated from
599  the contents of the corresponding ``*.mak`` files using Meson's
600  ``configure_file()`` function; each target can include them using
601  the ``CONFIG_TARGET`` and ``CONFIG_DEVICES`` macro respectively.
602
603``build.ninja``
604  The build rules.
605
606
607Built by Makefile:
608
609``Makefile.ninja``
610  A Makefile include that bridges to ninja for the actual build.  The
611  Makefile is mostly a list of targets that Meson included in build.ninja.
612
613``Makefile.mtest``
614  The Makefile definitions that let "make check" run tests defined in
615  meson.build.  The rules are produced from Meson's JSON description of
616  tests (obtained with "meson introspect --tests") through the script
617  scripts/mtest2make.py.
618