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. There is about where the similarities with 10GNU autotools end, so try to forget what you know about them. 11 12 13Stage 1: configure 14================== 15 16The QEMU configure script is written directly in shell, and should be 17compatible with any POSIX shell, hence it uses #!/bin/sh. An important 18implication of this is that it is important to avoid using bash-isms on 19development platforms where bash is the primary host. 20 21In contrast to autoconf scripts, QEMU's configure is expected to be 22silent while it is checking for features. It will only display output 23when an error occurs, or to show the final feature enablement summary 24on completion. 25 26Because QEMU uses the Meson build system under the hood, only VPATH 27builds are supported. There are two general ways to invoke configure & 28perform a build: 29 30 - VPATH, build artifacts outside of QEMU source tree entirely:: 31 32 cd ../ 33 mkdir build 34 cd build 35 ../qemu/configure 36 make 37 38 - VPATH, build artifacts in a subdir of QEMU source tree:: 39 40 mkdir build 41 cd build 42 ../configure 43 make 44 45For now, checks on the compilation environment are found in configure 46rather than meson.build, though this is expected to change. The command 47line is parsed in the configure script and, whenever needed, converted 48into the appropriate options to Meson. 49 50New checks should be added to Meson, which usually comprises the 51following tasks: 52 53 - Add a Meson build option to meson_options.txt. 54 55 - Add support to the command line arg parser to handle any new 56 `--enable-XXX`/`--disable-XXX` flags required by the feature. 57 58 - Add information to the help output message to report on the new 59 feature flag. 60 61 - Add code to perform the actual feature check. 62 63 - Add code to include the feature status in `config-host.h` 64 65 - Add code to print out the feature status in the configure summary 66 upon completion. 67 68 69Taking the probe for SDL as an example, we have the following pieces 70in configure:: 71 72 # Initial variable state 73 sdl=auto 74 75 ..snip.. 76 77 # Configure flag processing 78 --disable-gnutls) sdl=disabled 79 ;; 80 --enable-gnutls) sdl=enabled 81 ;; 82 83 ..snip.. 84 85 # Help output feature message 86 sdl SDL UI 87 88 ..snip.. 89 90 # Meson invocation 91 -Dsdl=$sdl 92 93In meson_options.txt:: 94 95 option('sdl', type : 'feature', value : 'auto') 96 97In meson.build:: 98 99 # Detect dependency 100 sdl = dependency('sdl2', 101 required: get_option('sdl'), 102 static: enable_static) 103 104 # Create config-host.h 105 config_host_data.set('CONFIG_SDL', sdl.found()) 106 107 # Summary 108 summary_info += {'SDL support': sdl.found()} 109 110 111 112Helper functions 113---------------- 114 115The configure script provides a variety of helper functions to assist 116developers in checking for system features: 117 118`do_cc $ARGS...` 119 Attempt to run the system C compiler passing it $ARGS... 120 121`do_cxx $ARGS...` 122 Attempt to run the system C++ compiler passing it $ARGS... 123 124`compile_object $CFLAGS` 125 Attempt to compile a test program with the system C compiler using 126 $CFLAGS. The test program must have been previously written to a file 127 called $TMPC. 128 129`compile_prog $CFLAGS $LDFLAGS` 130 Attempt to compile a test program with the system C compiler using 131 $CFLAGS and link it with the system linker using $LDFLAGS. The test 132 program must have been previously written to a file called $TMPC. 133 134`has $COMMAND` 135 Determine if $COMMAND exists in the current environment, either as a 136 shell builtin, or executable binary, returning 0 on success. 137 138`path_of $COMMAND` 139 Return the fully qualified path of $COMMAND, printing it to stdout, 140 and returning 0 on success. 141 142`check_define $NAME` 143 Determine if the macro $NAME is defined by the system C compiler 144 145`check_include $NAME` 146 Determine if the include $NAME file is available to the system C 147 compiler 148 149`write_c_skeleton` 150 Write a minimal C program main() function to the temporary file 151 indicated by $TMPC 152 153`feature_not_found $NAME $REMEDY` 154 Print a message to stderr that the feature $NAME was not available 155 on the system, suggesting the user try $REMEDY to address the 156 problem. 157 158`error_exit $MESSAGE $MORE...` 159 Print $MESSAGE to stderr, followed by $MORE... and then exit from the 160 configure script with non-zero status 161 162`query_pkg_config $ARGS...` 163 Run pkg-config passing it $ARGS. If QEMU is doing a static build, 164 then --static will be automatically added to $ARGS 165 166 167Stage 2: Meson 168============== 169 170The Meson build system is currently used to describe the build 171process for: 172 1731) executables, which include: 174 175 - Tools - qemu-img, qemu-nbd, qga (guest agent), etc 176 177 - System emulators - qemu-system-$ARCH 178 179 - Userspace emulators - qemu-$ARCH 180 181 - Some (but not all) unit tests 182 1832) documentation 184 1853) ROMs, which can be either installed as binary blobs or compiled 186 1874) other data files, such as icons or desktop files 188 189The source code is highly modularized, split across many files to 190facilitate building of all of these components with as little duplicated 191compilation as possible. The Meson "sourceset" functionality is used 192to list the files and their dependency on various configuration 193symbols. 194 195Various subsystems that are common to both tools and emulators have 196their own sourceset, for example `block_ss` for the block device subsystem, 197`chardev_ss` for the character device subsystem, etc. These sourcesets 198are then turned into static libraries as follows:: 199 200 libchardev = static_library('chardev', chardev_ss.sources(), 201 name_suffix: 'fa', 202 build_by_default: false) 203 204 chardev = declare_dependency(link_whole: libchardev) 205 206The special `.fa` suffix is needed as long as unit tests are built with 207the older Makefile infrastructure, and will go away later. 208 209Files linked into emulator targets there can be split into two distinct groups 210of files, those which are independent of the QEMU emulation target and 211those which are dependent on the QEMU emulation target. 212 213In the target-independent set lives various general purpose helper code, 214such as error handling infrastructure, standard data structures, 215platform portability wrapper functions, etc. This code can be compiled 216once only and the .o files linked into all output binaries. 217Target-independent code lives in the `common_ss`, `softmmu_ss` and 218`user_ss` sourcesets. `common_ss` is linked into all emulators, `softmmu_ss` 219only in system emulators, `user_ss` only in user-mode emulators. 220 221In the target-dependent set lives CPU emulation, device emulation and 222much glue code. This sometimes also has to be compiled multiple times, 223once for each target being built. 224 225All binaries link with a static library `libqemuutil.a`, which is then 226linked to all the binaries. `libqemuutil.a` is built from several 227sourcesets; most of them however host generated code, and the only two 228of general interest are `util_ss` and `stub_ss`. 229 230The separation between these two is purely for documentation purposes. 231`util_ss` contains generic utility files. Even though this code is only 232linked in some binaries, sometimes it requires hooks only in some of 233these and depend on other functions that are not fully implemented by 234all QEMU binaries. `stub_ss` links dummy stubs that will only be linked 235into the binary if the real implementation is not present. In a way, 236the stubs can be thought of as a portable implementation of the weak 237symbols concept. 238 239The following files concur in the definition of which files are linked 240into each emulator: 241 242`default-configs/*.mak` 243 The files under default-configs/ control what emulated hardware is built 244 into each QEMU system and userspace emulator targets. They merely contain 245 a list of config variable definitions like the machines that should be 246 included. For example, default-configs/aarch64-softmmu.mak has:: 247 248 include arm-softmmu.mak 249 CONFIG_XLNX_ZYNQMP_ARM=y 250 CONFIG_XLNX_VERSAL=y 251 252`*/Kconfig` 253 These files are processed together with `default-configs/*.mak` and 254 describe the dependencies between various features, subsystems and 255 device models. They are described in kconfig.rst. 256 257These files rarely need changing unless new devices / hardware need to 258be enabled for a particular system/userspace emulation target 259 260 261Support scripts 262--------------- 263 264Meson has a special convention for invoking Python scripts: if their 265first line is `#! /usr/bin/env python3` and the file is *not* executable, 266find_program() arranges to invoke the script under the same Python 267interpreter that was used to invoke Meson. This is the most common 268and preferred way to invoke support scripts from Meson build files, 269because it automatically uses the value of configure's --python= option. 270 271In case the script is not written in Python, use a `#! /usr/bin/env ...` 272line and make the script executable. 273 274Scripts written in Python, where it is desirable to make the script 275executable (for example for test scripts that developers may want to 276invoke from the command line, such as tests/qapi-schema/test-qapi.py), 277should be invoked through the `python` variable in meson.build. For 278example:: 279 280 test('QAPI schema regression tests', python, 281 args: files('test-qapi.py'), 282 env: test_env, suite: ['qapi-schema', 'qapi-frontend']) 283 284This is needed to obey the --python= option passed to the configure 285script, which may point to something other than the first python3 286binary on the path. 287 288 289Stage 3: makefiles 290================== 291 292The use of GNU make is required with the QEMU build system. 293 294The output of Meson is a build.ninja file, which is used with the Ninja 295build system. QEMU uses a different approach, where Makefile rules are 296synthesized from the build.ninja file. The main Makefile includes these 297rules and wraps them so that e.g. submodules are built before QEMU. 298The resulting build system is largely non-recursive in nature, in 299contrast to common practices seen with automake. 300 301Tests are also ran by the Makefile with the traditional `make check` 302phony target. Meson test suites such as `unit` can be ran with `make 303check-unit` too. It is also possible to run tests defined in meson.build 304with `meson test`. 305 306The following text is only relevant for unit tests which still have to 307be converted to Meson. 308 309All binaries should link to `libqemuutil.a`, e.g.: 310 311 qemu-img$(EXESUF): qemu-img.o ..snip.. libqemuutil.a 312 313On Windows, all binaries have the suffix `.exe`, so all Makefile rules 314which create binaries must include the $(EXESUF) variable on the binary 315name. e.g. 316 317 qemu-img$(EXESUF): qemu-img.o ..snip.. 318 319This expands to `.exe` on Windows, or an empty string on other platforms. 320 321Variable naming 322--------------- 323 324The QEMU convention is to define variables to list different groups of 325object files. These are named with the convention $PREFIX-obj-y. The 326Meson `chardev` variable in the previous example corresponds to a 327variable 'chardev-obj-y'. 328 329Likewise, tests that are executed by `make check-unit` are grouped into 330a variable check-unit-y, like this: 331 332 check-unit-y += tests/test-visitor-serialization$(EXESUF) 333 check-unit-y += tests/test-iov$(EXESUF) 334 check-unit-y += tests/test-bitmap$(EXESUF) 335 336When a test or object file which needs to be conditionally built based 337on some characteristic of the host system, the configure script will 338define a variable for the conditional. For example, on Windows it will 339define $(CONFIG_POSIX) with a value of 'n' and $(CONFIG_WIN32) with a 340value of 'y'. It is now possible to use the config variables when 341listing object files. For example, 342 343 check-unit-$(CONFIG_POSIX) += tests/test-vmstate$(EXESUF) 344 345On Windows this expands to 346 347 check-unit-n += tests/vmstate.exe 348 349Since the `check-unit` target only runs tests included in `$(check-unit-y)`, 350POSIX specific tests listed in `$(util-obj-n)` are ignored on the Windows 351platform builds. 352 353 354CFLAGS / LDFLAGS / LIBS handling 355-------------------------------- 356 357There are many different binaries being built with differing purposes, 358and some of them might even be 3rd party libraries pulled in via git 359submodules. As such the use of the global CFLAGS variable is generally 360avoided in QEMU, since it would apply to too many build targets. 361 362Flags that are needed by any QEMU code (i.e. everything *except* GIT 363submodule projects) are put in $(QEMU_CFLAGS) variable. For linker 364flags the $(LIBS) variable is sometimes used, but a couple of more 365targeted variables are preferred. 366 367In addition to these variables, it is possible to provide cflags and 368libs against individual source code files, by defining variables of the 369form $FILENAME-cflags and $FILENAME-libs. For example, the test 370test-crypto-tlscredsx509 needs to link to the libtasn1 library, 371so tests/Makefile.include defines some variables: 372 373 tests/crypto-tls-x509-helpers.o-cflags := $(TASN1_CFLAGS) 374 tests/crypto-tls-x509-helpers.o-libs := $(TASN1_LIBS) 375 376The scope is a little different between the two variables. The libs get 377used when linking any target binary that includes the curl.o object 378file, while the cflags get used when compiling the curl.c file only. 379 380 381Important files for the build system 382==================================== 383 384Statically defined files 385------------------------ 386 387The following key files are statically defined in the source tree, with 388the rules needed to build QEMU. Their behaviour is influenced by a 389number of dynamically created files listed later. 390 391`Makefile` 392 The main entry point used when invoking make to build all the components 393 of QEMU. The default 'all' target will naturally result in the build of 394 every component. Makefile takes care of recursively building submodules 395 directly via a non-recursive set of rules. 396 397`*/meson.build` 398 The meson.build file in the root directory is the main entry point for the 399 Meson build system, and it coordinates the configuration and build of all 400 executables. Build rules for various subdirectories are included in 401 other meson.build files spread throughout the QEMU source tree. 402 403`rules.mak` 404 This file provides the generic helper rules for invoking build tools, in 405 particular the compiler and linker. 406 407`tests/Makefile.include` 408 Rules for building the unit tests. This file is included directly by the 409 top level Makefile, so anything defined in this file will influence the 410 entire build system. Care needs to be taken when writing rules for tests 411 to ensure they only apply to the unit test execution / build. 412 413`tests/docker/Makefile.include` 414 Rules for Docker tests. Like tests/Makefile, this file is included 415 directly by the top level Makefile, anything defined in this file will 416 influence the entire build system. 417 418`tests/vm/Makefile.include` 419 Rules for VM-based tests. Like tests/Makefile, this file is included 420 directly by the top level Makefile, anything defined in this file will 421 influence the entire build system. 422 423Dynamically created files 424------------------------- 425 426The following files are generated dynamically by configure in order to 427control the behaviour of the statically defined makefiles. This avoids 428the need for QEMU makefiles to go through any pre-processing as seen 429with autotools, where Makefile.am generates Makefile.in which generates 430Makefile. 431 432Built by configure: 433 434`config-host.mak` 435 When configure has determined the characteristics of the build host it 436 will write a long list of variables to config-host.mak file. This 437 provides the various install directories, compiler / linker flags and a 438 variety of `CONFIG_*` variables related to optionally enabled features. 439 This is imported by the top level Makefile and meson.build in order to 440 tailor the build output. 441 442 config-host.mak is also used as a dependency checking mechanism. If make 443 sees that the modification timestamp on configure is newer than that on 444 config-host.mak, then configure will be re-run. 445 446 The variables defined here are those which are applicable to all QEMU 447 build outputs. Variables which are potentially different for each 448 emulator target are defined by the next file... 449 450`$TARGET-NAME/config-target.mak` 451 TARGET-NAME is the name of a system or userspace emulator, for example, 452 x86_64-softmmu denotes the system emulator for the x86_64 architecture. 453 This file contains the variables which need to vary on a per-target 454 basis. For example, it will indicate whether KVM or Xen are enabled for 455 the target and any other potential custom libraries needed for linking 456 the target. 457 458 459Built by Meson: 460 461`${TARGET-NAME}-config-devices.mak` 462 TARGET-NAME is again the name of a system or userspace emulator. The 463 config-devices.mak file is automatically generated by make using the 464 scripts/make_device_config.sh program, feeding it the 465 default-configs/$TARGET-NAME file as input. 466 467`config-host.h`, `$TARGET-NAME/config-target.h`, `$TARGET-NAME/config-devices.h` 468 These files are used by source code to determine what features 469 are enabled. They are generated from the contents of the corresponding 470 `*.h` files using the scripts/create_config program. This extracts 471 relevant variables and formats them as C preprocessor macros. 472 473`build.ninja` 474 The build rules. 475 476 477Built by Makefile: 478 479`Makefile.ninja` 480 A Makefile conversion of the build rules in build.ninja. The conversion 481 is straightforward and, were it necessary to debug the rules produced 482 by Meson, it should be enough to look at build.ninja. The conversion 483 is performed by scripts/ninjatool.py. 484 485`Makefile.mtest` 486 The Makefile definitions that let "make check" run tests defined in 487 meson.build. The rules are produced from Meson's JSON description of 488 tests (obtained with "meson introspect --tests") through the script 489 scripts/mtest2make.py. 490 491 492Useful make targets 493------------------- 494 495`help` 496 Print a help message for the most common build targets. 497 498`print-VAR` 499 Print the value of the variable VAR. Useful for debugging the build 500 system. 501