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