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