1 # Copyright 2013 The Chromium OS Authors. All rights reserved. 2 # Use of this source code is governed by a BSD-style license that can be 3 # found in the LICENSE file. 4 5 # This Makefile normally builds in a 'build' subdir, but use 6 # 7 # make BUILD=<dir> 8 # 9 # to put the output somewhere else. 10 11 ############################################################################## 12 # Make variables come in two flavors, immediate or deferred. 13 # 14 # Variable definitions are parsed like this: 15 # 16 # IMMEDIATE = DEFERRED 17 # or 18 # IMMEDIATE := IMMEDIATE 19 # 20 # Rules are parsed this way: 21 # 22 # IMMEDIATE : IMMEDIATE 23 # DEFERRED 24 # 25 # So you can assign variables in any order if they're only to be used in 26 # actions, but if you use a variable in either the target or prerequisite of a 27 # rule, the rule will be constructed using only the top-down, immediate value. 28 # 29 # So we'll try to define all the variables first. Then the rules. 30 # 31 32 ############################################################################## 33 # Configuration variables come first. 34 # 35 # Our convention is that we only use := for variables that will never be 36 # changed or appended. They must be defined before being used anywhere. 37 38 # We should only run pwd once, not every time we refer to ${BUILD}. 39 SRCDIR := $(shell pwd) 40 export SRCDIR 41 BUILD = ${SRCDIR}/build 42 export BUILD 43 44 # Stuff for 'make install' 45 INSTALL = install 46 DESTDIR = /usr/local 47 LIBDIR ?= lib 48 49 # Default values 50 DEV_DEBUG_FORCE= 51 52 # Where exactly do the pieces go? 53 # UB_DIR = utility binary directory 54 # ULP_DIR = pkgconfig directory, usually /usr/lib/pkgconfig 55 # DF_DIR = utility defaults directory 56 # VB_DIR = vboot binary directory for dev-mode-only scripts 57 ifeq (${MINIMAL},) 58 # Host install just puts everything where it's told 59 UB_DIR=${DESTDIR}/bin 60 ULP_DIR=${DESTDIR}/${LIBDIR}/pkgconfig 61 DF_DIR=${DESTDIR}/default 62 VB_DIR=${DESTDIR}/bin 63 else 64 # Target install puts things into different places 65 UB_DIR=${DESTDIR}/usr/bin 66 ULP_DIR=${DESTDIR}/usr/${LIBDIR}/pkgconfig 67 DF_DIR=${DESTDIR}/etc/default 68 VB_DIR=${DESTDIR}/usr/share/vboot/bin 69 endif 70 71 # Where to install the (exportable) executables for testing? 72 TEST_INSTALL_DIR = ${BUILD}/install_for_test 73 74 # Verbose? Use V=1 75 ifeq (${V},) 76 Q := @ 77 endif 78 79 # Quiet? Use QUIET=1 80 ifeq (${QUIET},) 81 PRINTF := printf 82 else 83 PRINTF := : 84 endif 85 86 # Architecture detection 87 _machname := $(shell uname -m) 88 HOST_ARCH ?= ${_machname} 89 90 # ARCH and/or FIRMWARE_ARCH are defined by the Chromium OS ebuild. 91 # Pick a sane target architecture if none is defined. 92 ifeq (${ARCH},) 93 ARCH := ${HOST_ARCH} 94 else ifeq (${ARCH},i386) 95 override ARCH := x86 96 else ifeq (${ARCH},amd64) 97 override ARCH := x86_64 98 endif 99 100 # FIRMWARE_ARCH is only defined by the Chromium OS ebuild if compiling 101 # for a firmware target (such as u-boot or depthcharge). It must map 102 # to the same consistent set of architectures as the host. 103 ifeq (${FIRMWARE_ARCH},i386) 104 override FIRMWARE_ARCH := x86 105 else ifeq (${FIRMWARE_ARCH},amd64) 106 override FIRMWARE_ARCH := x86_64 107 else ifeq (${FIRMWARE_ARCH},armv7) 108 override FIRMWARE_ARCH := arm 109 endif 110 111 # Provide default CC and CFLAGS for firmware builds; if you have any -D flags, 112 # please add them after this point (e.g., -DVBOOT_DEBUG). 113 # 114 # TODO(crosbug.com/16808) We hard-code u-boot's compiler flags here just 115 # temporarily. As we are still investigating which flags are necessary for 116 # maintaining a compatible ABI, etc. between u-boot and vboot_reference. 117 # 118 # As a first step, this makes the setting of CC and CFLAGS here optional, to 119 # permit a calling script or Makefile to set these. 120 # 121 # Flag ordering: arch, then -f, then -m, then -W 122 DEBUG_FLAGS := $(if ${DEBUG},-g -O0,-Os) 123 COMMON_FLAGS := -nostdinc -pipe \ 124 -ffreestanding -fno-builtin -fno-stack-protector \ 125 -Werror -Wall -Wstrict-prototypes ${DEBUG_FLAGS} 126 127 # Note: FIRMWARE_ARCH is defined by the Chromium OS ebuild. 128 ifeq (${FIRMWARE_ARCH}, arm) 129 CC ?= armv7a-cros-linux-gnueabi-gcc 130 CFLAGS ?= -march=armv5 \ 131 -fno-common -ffixed-r8 \ 132 -mfloat-abi=hard -marm -mabi=aapcs-linux -mno-thumb-interwork \ 133 ${COMMON_FLAGS} 134 else ifeq (${FIRMWARE_ARCH}, x86) 135 CC ?= i686-pc-linux-gnu-gcc 136 # Drop -march=i386 to permit use of SSE instructions 137 CFLAGS ?= \ 138 -ffunction-sections -fvisibility=hidden -fno-strict-aliasing \ 139 -fomit-frame-pointer -fno-toplevel-reorder -fno-dwarf2-cfi-asm \ 140 -mpreferred-stack-boundary=2 \ 141 ${COMMON_FLAGS} 142 else ifeq (${FIRMWARE_ARCH}, x86_64) 143 CFLAGS ?= ${COMMON_FLAGS} \ 144 -fvisibility=hidden -fno-strict-aliasing -fomit-frame-pointer 145 else 146 # FIRMWARE_ARCH not defined; assuming local compile. 147 CC ?= gcc 148 CFLAGS += -DCHROMEOS_ENVIRONMENT -Wall -Werror ${DEBUG_FLAGS} 149 endif 150 151 ifneq (${DEBUG},) 152 CFLAGS += -DVBOOT_DEBUG 153 endif 154 155 ifeq (${DISABLE_NDEBUG},) 156 CFLAGS += -DNDEBUG 157 endif 158 159 ifneq (${FORCE_LOGGING_ON},) 160 CFLAGS += -DFORCE_LOGGING_ON=${FORCE_LOGGING_ON} 161 endif 162 163 ifneq (${PD_SYNC},) 164 CFLAGS += -DPD_SYNC 165 endif 166 167 ifneq (${USE_MTD},) 168 CFLAGS += -DUSE_MTD 169 LDLIBS += -lmtdutils 170 endif 171 172 # NOTE: We don't use these files but they are useful for other packages to 173 # query about required compiling/linking flags. 174 PC_IN_FILES = vboot_host.pc.in 175 176 # Create / use dependency files 177 CFLAGS += -MMD -MF $@.d 178 179 ifeq (${FIRMWARE_ARCH},) 180 # Creates position independent code for non firmware target. 181 CFLAGS += -fPIE 182 endif 183 184 # These are required to access large disks and files on 32-bit systems. 185 CFLAGS += -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 186 187 # Code coverage 188 ifneq (${COV},) 189 COV_FLAGS = -O0 --coverage -DCOVERAGE 190 CFLAGS += ${COV_FLAGS} 191 LDFLAGS += ${COV_FLAGS} 192 COV_INFO = ${BUILD}/coverage.info 193 endif 194 195 ifdef HAVE_MACOS 196 CFLAGS += -DHAVE_MACOS -Wno-deprecated-declarations 197 endif 198 199 # And a few more default utilities 200 LD = ${CC} 201 CXX ?= g++ 202 PKG_CONFIG ?= pkg-config 203 204 # Static? 205 ifneq (${STATIC},) 206 LDFLAGS += -static 207 PKG_CONFIG += --static 208 endif 209 210 # Determine QEMU architecture needed, if any 211 ifeq (${ARCH},${HOST_ARCH}) 212 # Same architecture; no need for QEMU 213 QEMU_ARCH := 214 else ifeq (${HOST_ARCH}-${ARCH},x86_64-x86) 215 # 64-bit host can run 32-bit targets directly 216 QEMU_ARCH := 217 else 218 QEMU_ARCH := ${ARCH} 219 endif 220 221 # The top of the chroot for qemu must be passed in via the SYSROOT environment 222 # variable. In the Chromium OS chroot, this is done automatically by the 223 # ebuild. 224 225 ifeq (${QEMU_ARCH},) 226 # Path to build output for running tests is same as for building 227 BUILD_RUN = ${BUILD} 228 SRC_RUN = ${SRCDIR} 229 else 230 $(info Using qemu for testing.) 231 # Path to build output for running tests is different in the chroot 232 BUILD_RUN = $(subst ${SYSROOT},,${BUILD}) 233 SRC_RUN = $(subst ${SYSROOT},,${SRCDIR}) 234 235 QEMU_BIN = qemu-${QEMU_ARCH} 236 QEMU_RUN = ${BUILD_RUN}/${QEMU_BIN} 237 export QEMU_RUN 238 239 RUNTEST = tests/test_using_qemu.sh 240 endif 241 242 export BUILD_RUN 243 244 ############################################################################## 245 # Now we need to describe everything we might want or need to build 246 247 # Everything wants these headers. 248 INCLUDES += \ 249 -Ifirmware/include \ 250 -Ifirmware/lib/include \ 251 -Ifirmware/lib/cgptlib/include \ 252 -Ifirmware/lib/cryptolib/include \ 253 -Ifirmware/lib/tpm_lite/include \ 254 -Ifirmware/2lib/include 255 256 # If we're not building for a specific target, just stub out things like the 257 # TPM commands and various external functions that are provided by the BIOS. 258 ifeq (${FIRMWARE_ARCH},) 259 INCLUDES += -Ihost/include -Ihost/lib/include 260 endif 261 262 # Firmware library, used by the other firmware components (depthcharge, 263 # coreboot, etc.). It doesn't need exporting to some other place; they'll build 264 # this source tree locally and link to it directly. 265 FWLIB = ${BUILD}/vboot_fw.a 266 267 # Smaller firmware library common to all vboot 2.x, used only for 268 # 1) compile-time tests of the public API or 269 # 2) linking with an actual 2.0 or 2.1 implementation 270 FWLIB2X = ${BUILD}/vboot_fw2x.a 271 272 # Vboot 2.0 (deprecated - see firmware/README) 273 FWLIB20 = ${BUILD}/vboot_fw20.a 274 # Vboot 2.1 (not yet ready - see firmware/README) 275 FWLIB21 = ${BUILD}/vboot_fw21.a 276 277 # Firmware library sources needed by VbInit() call 278 VBINIT_SRCS = \ 279 firmware/lib/crc8.c \ 280 firmware/lib/utility.c \ 281 firmware/lib/vboot_api_init.c \ 282 firmware/lib/vboot_common_init.c \ 283 firmware/lib/vboot_nvstorage.c \ 284 firmware/lib/vboot_nvstorage_rollback.c \ 285 firmware/lib/region-init.c \ 286 287 # Additional firmware library sources needed by VbSelectFirmware() call 288 VBSF_SRCS = \ 289 firmware/lib/cryptolib/padding.c \ 290 firmware/lib/cryptolib/rsa.c \ 291 firmware/lib/cryptolib/rsa_utility.c \ 292 firmware/lib/cryptolib/sha1.c \ 293 firmware/lib/cryptolib/sha256.c \ 294 firmware/lib/cryptolib/sha512.c \ 295 firmware/lib/cryptolib/sha_utility.c \ 296 firmware/lib/stateful_util.c \ 297 firmware/lib/vboot_api_firmware.c \ 298 firmware/lib/vboot_common.c \ 299 firmware/lib/vboot_firmware.c \ 300 firmware/lib/region-fw.c \ 301 302 # Additional firmware library sources needed by VbSelectAndLoadKernel() call 303 VBSLK_SRCS = \ 304 firmware/lib/cgptlib/cgptlib.c \ 305 firmware/lib/cgptlib/cgptlib_internal.c \ 306 firmware/lib/cgptlib/crc32.c \ 307 firmware/lib/gpt_misc.c \ 308 firmware/lib/utility_string.c \ 309 firmware/lib/vboot_api_kernel.c \ 310 firmware/lib/vboot_audio.c \ 311 firmware/lib/vboot_display.c \ 312 firmware/lib/vboot_kernel.c \ 313 firmware/lib/region-kernel.c \ 314 315 # Code common to both vboot 2.0 (old structs) and 2.1 (new structs) 316 FWLIB2X_SRCS = \ 317 firmware/2lib/2api.c \ 318 firmware/2lib/2common.c \ 319 firmware/2lib/2crc8.c \ 320 firmware/2lib/2misc.c \ 321 firmware/2lib/2nvstorage.c \ 322 firmware/2lib/2rsa.c \ 323 firmware/2lib/2secdata.c \ 324 firmware/2lib/2sha1.c \ 325 firmware/2lib/2sha256.c \ 326 firmware/2lib/2sha512.c \ 327 firmware/2lib/2sha_utility.c \ 328 firmware/2lib/2tpm_bootmode.c 329 330 FWLIB20_SRCS = \ 331 firmware/lib20/api.c \ 332 firmware/lib20/common.c \ 333 firmware/lib20/misc.c \ 334 firmware/lib20/packed_key.c 335 336 FWLIB21_SRCS = \ 337 firmware/lib21/api.c \ 338 firmware/lib21/common.c \ 339 firmware/lib21/misc.c \ 340 firmware/lib21/packed_key.c 341 342 # Support real TPM unless BIOS sets MOCK_TPM 343 ifeq (${MOCK_TPM},) 344 VBINIT_SRCS += \ 345 firmware/lib/rollback_index.c \ 346 firmware/lib/tpm_lite/tlcl.c 347 348 VBSF_SRCS += \ 349 firmware/lib/tpm_bootmode.c 350 else 351 VBINIT_SRCS += \ 352 firmware/lib/mocked_rollback_index.c \ 353 firmware/lib/tpm_lite/mocked_tlcl.c 354 355 VBSF_SRCS += \ 356 firmware/lib/mocked_tpm_bootmode.c 357 endif 358 359 ifeq (${FIRMWARE_ARCH},) 360 # Include BIOS stubs in the firmware library when compiling for host 361 # TODO: split out other stub funcs too 362 VBINIT_SRCS += \ 363 firmware/stub/tpm_lite_stub.c \ 364 firmware/stub/utility_stub.c \ 365 firmware/stub/vboot_api_stub_init.c \ 366 firmware/stub/vboot_api_stub_region.c 367 368 VBSF_SRCS += \ 369 firmware/stub/vboot_api_stub_sf.c 370 371 VBSLK_SRCS += \ 372 firmware/stub/vboot_api_stub.c \ 373 firmware/stub/vboot_api_stub_disk.c \ 374 firmware/stub/vboot_api_stub_stream.c 375 376 FWLIB2X_SRCS += \ 377 firmware/2lib/2stub.c 378 379 endif 380 381 VBSF_SRCS += ${VBINIT_SRCS} 382 FWLIB_SRCS += ${VBSF_SRCS} ${VBSLK_SRCS} 383 384 VBINIT_OBJS = ${VBINIT_SRCS:%.c=${BUILD}/%.o} 385 VBSF_OBJS = ${VBSF_SRCS:%.c=${BUILD}/%.o} 386 ALL_OBJS += ${VBINIT_OBJS} ${VBSF_OBJS} 387 388 FWLIB_OBJS = ${FWLIB_SRCS:%.c=${BUILD}/%.o} 389 FWLIB2X_OBJS = ${FWLIB2X_SRCS:%.c=${BUILD}/%.o} 390 FWLIB20_OBJS = ${FWLIB20_SRCS:%.c=${BUILD}/%.o} 391 FWLIB21_OBJS = ${FWLIB21_SRCS:%.c=${BUILD}/%.o} 392 ALL_OBJS += ${FWLIB_OBJS} ${FWLIB2X_OBJS} ${FWLIB20_OBJS} ${FWLIB21_OBJS} 393 394 # Intermediate library for the vboot_reference utilities to link against. 395 UTILLIB = ${BUILD}/libvboot_util.a 396 UTILLIB21 = ${BUILD}/libvboot_util21.a 397 398 UTILLIB_SRCS = \ 399 cgpt/cgpt_create.c \ 400 cgpt/cgpt_add.c \ 401 cgpt/cgpt_boot.c \ 402 cgpt/cgpt_show.c \ 403 cgpt/cgpt_repair.c \ 404 cgpt/cgpt_prioritize.c \ 405 cgpt/cgpt_common.c \ 406 futility/dump_kernel_config_lib.c \ 407 host/arch/${ARCH}/lib/crossystem_arch.c \ 408 host/lib/crossystem.c \ 409 host/lib/file_keys.c \ 410 host/lib/fmap.c \ 411 host/lib/host_common.c \ 412 host/lib/host_key.c \ 413 host/lib/host_keyblock.c \ 414 host/lib/host_misc.c \ 415 host/lib/util_misc.c \ 416 host/lib/host_signature.c \ 417 host/lib/signature_digest.c 418 419 UTILLIB_OBJS = ${UTILLIB_SRCS:%.c=${BUILD}/%.o} 420 ALL_OBJS += ${UTILLIB_OBJS} 421 422 UTILLIB21_SRCS += \ 423 host/lib21/host_fw_preamble.c \ 424 host/lib21/host_key.c \ 425 host/lib21/host_keyblock.c \ 426 host/lib21/host_misc.c \ 427 host/lib21/host_signature.c 428 429 UTILLIB21_OBJS = ${UTILLIB21_SRCS:%.c=${BUILD}/%.o} 430 ALL_OBJS += ${UTILLIB21_OBJS} 431 432 # Externally exported library for some target userspace apps to link with 433 # (cryptohome, updater, etc.) 434 HOSTLIB = ${BUILD}/libvboot_host.a 435 436 HOSTLIB_SRCS = \ 437 cgpt/cgpt_add.c \ 438 cgpt/cgpt_boot.c \ 439 cgpt/cgpt_common.c \ 440 cgpt/cgpt_create.c \ 441 cgpt/cgpt_prioritize.c \ 442 firmware/lib/cgptlib/cgptlib_internal.c \ 443 firmware/lib/cgptlib/crc32.c \ 444 firmware/lib/crc8.c \ 445 firmware/lib/gpt_misc.c \ 446 firmware/lib/tpm_lite/tlcl.c \ 447 firmware/lib/utility_string.c \ 448 firmware/lib/vboot_nvstorage.c \ 449 firmware/stub/tpm_lite_stub.c \ 450 firmware/stub/utility_stub.c \ 451 firmware/stub/vboot_api_stub_disk.c \ 452 firmware/stub/vboot_api_stub_init.c \ 453 firmware/stub/vboot_api_stub_sf.c \ 454 futility/dump_kernel_config_lib.c \ 455 host/arch/${ARCH}/lib/crossystem_arch.c \ 456 host/lib/crossystem.c \ 457 host/lib/extract_vmlinuz.c \ 458 host/lib/fmap.c \ 459 host/lib/host_misc.c 460 461 HOSTLIB_OBJS = ${HOSTLIB_SRCS:%.c=${BUILD}/%.o} 462 ALL_OBJS += ${HOSTLIB_OBJS} 463 464 # Sigh. For historical reasons, the autoupdate installer must sometimes be a 465 # 32-bit executable, even when everything else is 64-bit. But it only needs a 466 # few functions, so let's just build those. 467 TINYHOSTLIB = ${BUILD}/libtinyvboot_host.a 468 469 TINYHOSTLIB_SRCS = \ 470 cgpt/cgpt_add.c \ 471 cgpt/cgpt_boot.c \ 472 cgpt/cgpt_common.c \ 473 cgpt/cgpt_create.c \ 474 cgpt/cgpt_prioritize.c \ 475 firmware/lib/cgptlib/cgptlib_internal.c \ 476 firmware/lib/cgptlib/crc32.c \ 477 firmware/lib/gpt_misc.c \ 478 firmware/lib/utility_string.c \ 479 firmware/stub/vboot_api_stub_disk.c \ 480 firmware/stub/vboot_api_stub_sf.c \ 481 firmware/stub/utility_stub.c \ 482 futility/dump_kernel_config_lib.c \ 483 host/lib/extract_vmlinuz.c 484 485 TINYHOSTLIB_OBJS = ${TINYHOSTLIB_SRCS:%.c=${BUILD}/%.o} 486 487 # ---------------------------------------------------------------------------- 488 # Now for the userspace binaries 489 490 CGPT = ${BUILD}/cgpt/cgpt 491 492 CGPT_SRCS = \ 493 cgpt/cgpt.c \ 494 cgpt/cgpt_add.c \ 495 cgpt/cgpt_boot.c \ 496 cgpt/cgpt_common.c \ 497 cgpt/cgpt_create.c \ 498 cgpt/cgpt_find.c \ 499 cgpt/cgpt_legacy.c \ 500 cgpt/cgpt_nor.c \ 501 cgpt/cgpt_prioritize.c \ 502 cgpt/cgpt_repair.c \ 503 cgpt/cgpt_show.c \ 504 cgpt/cmd_add.c \ 505 cgpt/cmd_boot.c \ 506 cgpt/cmd_create.c \ 507 cgpt/cmd_find.c \ 508 cgpt/cmd_legacy.c \ 509 cgpt/cmd_prioritize.c \ 510 cgpt/cmd_repair.c \ 511 cgpt/cmd_show.c 512 513 CGPT_OBJS = ${CGPT_SRCS:%.c=${BUILD}/%.o} 514 515 ALL_OBJS += ${CGPT_OBJS} 516 517 CGPT_WRAPPER = ${BUILD}/cgpt/cgpt_wrapper 518 519 CGPT_WRAPPER_SRCS = \ 520 cgpt/cgpt_nor.c \ 521 cgpt/cgpt_wrapper.c 522 523 CGPT_WRAPPER_OBJS = ${CGPT_WRAPPER_SRCS:%.c=${BUILD}/%.o} 524 525 ALL_OBJS += ${CGPT_WRAPPER_OBJS} 526 527 # Utility defaults 528 UTIL_DEFAULTS = ${BUILD}/default/vboot_reference 529 530 # Scripts to install directly (not compiled) 531 UTIL_SCRIPTS = \ 532 utility/dev_debug_vboot \ 533 utility/enable_dev_usb_boot 534 535 ifeq (${MINIMAL},) 536 UTIL_SCRIPTS += \ 537 utility/dev_make_keypair \ 538 utility/vbutil_what_keys 539 endif 540 541 # These utilities should be linked statically. 542 UTIL_NAMES_STATIC = \ 543 utility/crossystem 544 545 UTIL_NAMES = ${UTIL_NAMES_STATIC} \ 546 utility/tpm_init_temp_fix \ 547 utility/dumpRSAPublicKey \ 548 utility/tpmc 549 550 # TODO: Do we still need eficompress and efidecompress for anything? 551 ifeq (${MINIMAL},) 552 UTIL_NAMES += \ 553 utility/bmpblk_font \ 554 utility/bmpblk_utility \ 555 utility/eficompress \ 556 utility/efidecompress \ 557 utility/load_kernel_test \ 558 utility/pad_digest_utility \ 559 utility/signature_digest_utility \ 560 utility/verify_data 561 endif 562 563 UTIL_BINS_STATIC := $(addprefix ${BUILD}/,${UTIL_NAMES_STATIC}) 564 UTIL_BINS = $(addprefix ${BUILD}/,${UTIL_NAMES}) 565 ALL_OBJS += $(addsuffix .o,${UTIL_BINS} ${UTIL_BINS_STATIC}) 566 567 568 # Scripts for signing stuff. 569 SIGNING_SCRIPTS = \ 570 utility/tpm-nvsize \ 571 utility/chromeos-tpm-recovery 572 573 # These go in a different place. 574 SIGNING_SCRIPTS_DEV = \ 575 scripts/image_signing/resign_firmwarefd.sh \ 576 scripts/image_signing/make_dev_firmware.sh \ 577 scripts/image_signing/make_dev_ssd.sh \ 578 scripts/image_signing/set_gbb_flags.sh 579 580 # Installed, but not made executable. 581 SIGNING_COMMON = scripts/image_signing/common_minimal.sh 582 583 584 # The unified firmware utility will eventually replace all the others 585 FUTIL_BIN = ${BUILD}/futility/futility 586 # But we still need both static (tiny) and dynamic (with openssl) versions. 587 FUTIL_STATIC_BIN = ${FUTIL_BIN}_s 588 589 # These are the executables that are now built in to futility. We'll create 590 # symlinks for these so the old names will still work. 591 FUTIL_SYMLINKS = \ 592 dump_fmap \ 593 dump_kernel_config \ 594 gbb_utility \ 595 vbutil_firmware \ 596 vbutil_kernel \ 597 vbutil_key \ 598 vbutil_keyblock 599 600 FUTIL_STATIC_SRCS = \ 601 futility/futility.c \ 602 futility/cmd_dump_fmap.c \ 603 futility/cmd_gbb_utility.c \ 604 futility/misc.c 605 606 FUTIL_SRCS = \ 607 ${FUTIL_STATIC_SRCS} \ 608 futility/cmd_create.c \ 609 futility/cmd_dump_kernel_config.c \ 610 futility/cmd_load_fmap.c \ 611 futility/cmd_pcr.c \ 612 futility/cmd_show.c \ 613 futility/cmd_sign.c \ 614 futility/cmd_vbutil_firmware.c \ 615 futility/cmd_vbutil_kernel.c \ 616 futility/cmd_vbutil_key.c \ 617 futility/cmd_vbutil_keyblock.c \ 618 futility/file_type.c \ 619 futility/traversal.c \ 620 futility/vb1_helper.c 621 622 # List of commands built in futility and futility_s. 623 FUTIL_STATIC_CMD_LIST = ${BUILD}/gen/futility_static_cmds.c 624 FUTIL_CMD_LIST = ${BUILD}/gen/futility_cmds.c 625 626 # Workaround for TODO(crbug.com/437107). 627 FUTIL_STATIC_WORKAROUND_SRCS = firmware/stub/vboot_api_stub_static_sf.c 628 629 FUTIL_STATIC_OBJS = ${FUTIL_STATIC_SRCS:%.c=${BUILD}/%.o} \ 630 ${FUTIL_STATIC_WORKAROUND_SRCS:%.c=${BUILD}/%.o} \ 631 ${FUTIL_STATIC_CMD_LIST:%.c=%.o} 632 FUTIL_OBJS = ${FUTIL_SRCS:%.c=${BUILD}/%.o} ${FUTIL_CMD_LIST:%.c=%.o} 633 634 ${FUTIL_OBJS}: INCLUDES += -Ihost/lib21/include -Ifirmware/lib21/include 635 ${FUTIL_BIN}: ${UTILLIB21} 636 ${FUTIL_BIN}: LIBS += ${UTILLIB21} 637 638 ALL_OBJS += ${FUTIL_OBJS} 639 640 641 # Library of handy test functions. 642 TESTLIB = ${BUILD}/tests/test.a 643 644 TESTLIB_SRCS = \ 645 tests/test_common.c \ 646 tests/timer_utils.c \ 647 tests/crc32_test.c 648 649 TESTLIB_OBJS = ${TESTLIB_SRCS:%.c=${BUILD}/%.o} 650 TEST_OBJS += ${TESTLIB_OBJS} 651 652 653 # And some compiled tests. 654 TEST_NAMES = \ 655 tests/cgptlib_test \ 656 tests/rollback_index2_tests \ 657 tests/rollback_index3_tests \ 658 tests/rsa_padding_test \ 659 tests/rsa_utility_tests \ 660 tests/rsa_verify_benchmark \ 661 tests/sha_benchmark \ 662 tests/sha_tests \ 663 tests/stateful_util_tests \ 664 tests/tlcl_tests \ 665 tests/tpm_bootmode_tests \ 666 tests/utility_string_tests \ 667 tests/utility_tests \ 668 tests/vboot_api_init_tests \ 669 tests/vboot_api_devmode_tests \ 670 tests/vboot_api_firmware_tests \ 671 tests/vboot_api_kernel_tests \ 672 tests/vboot_api_kernel2_tests \ 673 tests/vboot_api_kernel3_tests \ 674 tests/vboot_api_kernel4_tests \ 675 tests/vboot_audio_tests \ 676 tests/vboot_common_tests \ 677 tests/vboot_common2_tests \ 678 tests/vboot_common3_tests \ 679 tests/vboot_display_tests \ 680 tests/vboot_firmware_tests \ 681 tests/vboot_kernel_tests \ 682 tests/vboot_nvstorage_test \ 683 tests/verify_kernel \ 684 tests/futility/binary_editor \ 685 tests/futility/test_not_really 686 687 ifdef REGION_READ 688 TEST_NAMES += tests/vboot_region_tests 689 endif 690 691 TEST2X_NAMES = \ 692 tests/vb2_api_tests \ 693 tests/vb2_common_tests \ 694 tests/vb2_misc_tests \ 695 tests/vb2_nvstorage_tests \ 696 tests/vb2_rsa_utility_tests \ 697 tests/vb2_secdata_tests \ 698 tests/vb2_sha_tests 699 700 TEST20_NAMES = \ 701 tests/vb20_api_tests \ 702 tests/vb20_common_tests \ 703 tests/vb20_common2_tests \ 704 tests/vb20_verify_fw.c \ 705 tests/vb20_common3_tests \ 706 tests/vb20_misc_tests \ 707 tests/vb20_rsa_padding_tests \ 708 tests/vb20_verify_fw 709 710 TEST21_NAMES = \ 711 tests/vb21_api_tests \ 712 tests/vb21_common_tests \ 713 tests/vb21_common2_tests \ 714 tests/vb21_misc_tests \ 715 tests/vb21_host_fw_preamble_tests \ 716 tests/vb21_host_key_tests \ 717 tests/vb21_host_keyblock_tests \ 718 tests/vb21_host_misc_tests \ 719 tests/vb21_host_sig_tests 720 721 TEST_NAMES += ${TEST2X_NAMES} ${TEST20_NAMES} ${TEST21_NAMES} 722 723 # And a few more... 724 TLCL_TEST_NAMES = \ 725 tests/tpm_lite/tpmtest_earlyextend \ 726 tests/tpm_lite/tpmtest_earlynvram \ 727 tests/tpm_lite/tpmtest_earlynvram2 \ 728 tests/tpm_lite/tpmtest_enable \ 729 tests/tpm_lite/tpmtest_fastenable \ 730 tests/tpm_lite/tpmtest_globallock \ 731 tests/tpm_lite/tpmtest_redefine_unowned \ 732 tests/tpm_lite/tpmtest_spaceperm \ 733 tests/tpm_lite/tpmtest_testsetup \ 734 tests/tpm_lite/tpmtest_timing \ 735 tests/tpm_lite/tpmtest_writelimit 736 737 TEST_NAMES += ${TLCL_TEST_NAMES} 738 739 # Finally 740 TEST_BINS = $(addprefix ${BUILD}/,${TEST_NAMES}) 741 TEST_OBJS += $(addsuffix .o,${TEST_BINS}) 742 743 TEST2X_BINS = $(addprefix ${BUILD}/,${TEST2X_NAMES}) 744 TEST20_BINS = $(addprefix ${BUILD}/,${TEST20_NAMES}) 745 TEST21_BINS = $(addprefix ${BUILD}/,${TEST21_NAMES}) 746 747 # Directory containing test keys 748 TEST_KEYS = ${SRC_RUN}/tests/testkeys 749 750 751 ############################################################################## 752 # Finally, some targets. High-level ones first. 753 754 # Create output directories if necessary. Do this via explicit shell commands 755 # so it happens before trying to generate/include dependencies. 756 SUBDIRS := firmware host cgpt utility futility tests tests/tpm_lite 757 _dir_create := $(foreach d, \ 758 $(shell find ${SUBDIRS} -name '*.c' -exec dirname {} \; | sort -u), \ 759 $(shell [ -d ${BUILD}/${d} ] || mkdir -p ${BUILD}/${d})) 760 761 762 # Default target. 763 .PHONY: all 764 all: fwlib fwlib2x fwlib20 fwlib21 \ 765 $(if ${FIRMWARE_ARCH},,host_stuff) \ 766 $(if ${COV},coverage) 767 768 # Host targets 769 .PHONY: host_stuff 770 host_stuff: utillib hostlib cgpt utils futil tests utillib21 771 772 .PHONY: clean 773 clean: 774 ${Q}/bin/rm -rf ${BUILD} 775 776 .PHONY: install 777 install: cgpt_install utils_install signing_install futil_install \ 778 pc_files_install 779 780 .PHONY: install_mtd 781 install_mtd: install cgpt_wrapper_install 782 783 .PHONY: install_for_test 784 install_for_test: override DESTDIR = ${TEST_INSTALL_DIR} 785 install_for_test: install 786 787 # Don't delete intermediate object files 788 .SECONDARY: 789 790 # ---------------------------------------------------------------------------- 791 # Firmware library 792 793 # TPM-specific flags. These depend on the particular TPM we're targeting for. 794 # They are needed here only for compiling parts of the firmware code into 795 # user-level tests. 796 797 # TPM_BLOCKING_CONTINUESELFTEST is defined if TPM_ContinueSelfTest blocks until 798 # the self test has completed. 799 800 ${FWLIB_OBJS}: CFLAGS += -DTPM_BLOCKING_CONTINUESELFTEST 801 802 # TPM_MANUAL_SELFTEST is defined if the self test must be started manually 803 # (with a call to TPM_ContinueSelfTest) instead of starting automatically at 804 # power on. 805 # 806 # We sincerely hope that TPM_BLOCKING_CONTINUESELFTEST and TPM_MANUAL_SELFTEST 807 # are not both defined at the same time. (See comment in code.) 808 809 # CFLAGS += -DTPM_MANUAL_SELFTEST 810 811 ifeq (${FIRMWARE_ARCH},i386) 812 # Unrolling loops in cryptolib makes it faster 813 ${FWLIB_OBJS}: CFLAGS += -DUNROLL_LOOPS 814 ${FWLIB2X_OBJS}: CFLAGS += -DUNROLL_LOOPS 815 ${FWLIB20_OBJS}: CFLAGS += -DUNROLL_LOOPS 816 ${FWLIB21_OBJS}: CFLAGS += -DUNROLL_LOOPS 817 818 # Workaround for coreboot on x86, which will power off asynchronously 819 # without giving us a chance to react. This is not an example of the Right 820 # Way to do things. See chrome-os-partner:7689, and the commit message 821 # that made this change. 822 ${FWLIB_OBJS}: CFLAGS += -DSAVE_LOCALE_IMMEDIATELY 823 824 # On x86 we don't actually read the GBB data into RAM until it is needed. 825 # Therefore it makes sense to cache it rather than reading it each time. 826 # Enable this feature. 827 ${FWLIB_OBJS}: CFLAGS += -DCOPY_BMP_DATA 828 endif 829 830 ifdef REGION_READ 831 ${FWLIB_OBJS}: CFLAGS += -DREGION_READ 832 endif 833 834 ifeq (${FIRMWARE_ARCH},) 835 # Disable rollback TPM when compiling locally, since otherwise 836 # load_kernel_test attempts to talk to the TPM. 837 ${FWLIB_OBJS}: CFLAGS += -DDISABLE_ROLLBACK_TPM 838 endif 839 840 ${FWLIB20_OBJS}: INCLUDES += -Ifirmware/lib20/include 841 ${FWLIB21_OBJS}: INCLUDES += -Ifirmware/lib21/include 842 843 # Linktest ensures firmware lib doesn't rely on outside libraries 844 ${BUILD}/firmware/linktest/main_vbinit: ${VBINIT_OBJS} 845 ${BUILD}/firmware/linktest/main_vbinit: OBJS = ${VBINIT_OBJS} 846 TEST_OBJS += ${BUILD}/firmware/linktest/main_vbinit.o 847 ${BUILD}/firmware/linktest/main_vbsf: ${VBSF_OBJS} 848 ${BUILD}/firmware/linktest/main_vbsf: OBJS = ${VBSF_OBJS} 849 TEST_OBJS += ${BUILD}/firmware/linktest/main_vbsf.o 850 ${BUILD}/firmware/linktest/main: ${FWLIB} 851 ${BUILD}/firmware/linktest/main: LIBS = ${FWLIB} 852 TEST_OBJS += ${BUILD}/firmware/linktest/main.o 853 854 .PHONY: fwlinktest 855 fwlinktest: \ 856 ${BUILD}/firmware/linktest/main_vbinit \ 857 ${BUILD}/firmware/linktest/main_vbsf \ 858 ${BUILD}/firmware/linktest/main 859 860 .PHONY: fwlib 861 fwlib: $(if ${FIRMWARE_ARCH},${FWLIB},fwlinktest) 862 863 ${FWLIB}: ${FWLIB_OBJS} 864 @${PRINTF} " RM $(subst ${BUILD}/,,$@)\n" 865 ${Q}rm -f $@ 866 @${PRINTF} " AR $(subst ${BUILD}/,,$@)\n" 867 ${Q}ar qc $@ $^ 868 869 .PHONY: fwlib2x 870 fwlib2x: ${FWLIB2X} 871 872 ${FWLIB2X}: ${FWLIB2X_OBJS} 873 @${PRINTF} " RM $(subst ${BUILD}/,,$@)\n" 874 ${Q}rm -f $@ 875 @${PRINTF} " AR $(subst ${BUILD}/,,$@)\n" 876 ${Q}ar qc $@ $^ 877 878 .PHONY: fwlib20 879 fwlib20: ${FWLIB20} 880 881 ${FWLIB20}: ${FWLIB2X_OBJS} ${FWLIB20_OBJS} 882 @${PRINTF} " RM $(subst ${BUILD}/,,$@)\n" 883 ${Q}rm -f $@ 884 @${PRINTF} " AR $(subst ${BUILD}/,,$@)\n" 885 ${Q}ar qc $@ $^ 886 887 .PHONY: fwlib21 888 fwlib21: ${FWLIB21} 889 890 ${FWLIB21}: ${FWLIB2X_OBJS} ${FWLIB21_OBJS} 891 @${PRINTF} " RM $(subst ${BUILD}/,,$@)\n" 892 ${Q}rm -f $@ 893 @${PRINTF} " AR $(subst ${BUILD}/,,$@)\n" 894 ${Q}ar qc $@ $^ 895 896 # ---------------------------------------------------------------------------- 897 # Host library(s) 898 899 # Link tests for local utilities 900 ${BUILD}/host/linktest/main: ${UTILLIB} 901 ${BUILD}/host/linktest/main: LIBS = ${UTILLIB} 902 TEST_OBJS += ${BUILD}/host/linktest/main.o 903 904 .PHONY: utillib 905 utillib: ${UTILLIB} \ 906 ${BUILD}/host/linktest/main 907 908 # TODO: better way to make .a than duplicating this recipe each time? 909 ${UTILLIB}: ${UTILLIB_OBJS} ${FWLIB_OBJS} 910 @${PRINTF} " RM $(subst ${BUILD}/,,$@)\n" 911 ${Q}rm -f $@ 912 @${PRINTF} " AR $(subst ${BUILD}/,,$@)\n" 913 ${Q}ar qc $@ $^ 914 915 .PHONY: utillib21 916 utillib21: ${UTILLIB21} 917 918 ${UTILLIB21}: INCLUDES += -Ihost/lib21/include -Ifirmware/lib21/include 919 ${UTILLIB21}: ${UTILLIB21_OBJS} ${FWLIB2X_OBJS} ${FWLIB21_OBJS} 920 @${PRINTF} " RM $(subst ${BUILD}/,,$@)\n" 921 ${Q}rm -f $@ 922 @${PRINTF} " AR $(subst ${BUILD}/,,$@)\n" 923 ${Q}ar qc $@ $^ 924 925 926 # Link tests for external repos 927 ${BUILD}/host/linktest/extern: ${HOSTLIB} 928 ${BUILD}/host/linktest/extern: LIBS = ${HOSTLIB} 929 ${BUILD}/host/linktest/extern: LDLIBS += -static 930 TEST_OBJS += ${BUILD}/host/linktest/extern.o 931 932 .PHONY: hostlib 933 hostlib: ${HOSTLIB} \ 934 ${BUILD}/host/linktest/extern 935 936 # TODO: better way to make .a than duplicating this recipe each time? 937 ${HOSTLIB}: ${HOSTLIB_OBJS} 938 @${PRINTF} " RM $(subst ${BUILD}/,,$@)\n" 939 ${Q}rm -f $@ 940 @${PRINTF} " AR $(subst ${BUILD}/,,$@)\n" 941 ${Q}ar qc $@ $^ 942 943 944 # Ugh. This is a very cut-down version of HOSTLIB just for the installer. 945 .PHONY: tinyhostlib 946 tinyhostlib: ${TINYHOSTLIB} 947 ${Q}cp -f ${TINYHOSTLIB} ${HOSTLIB} 948 949 ${TINYHOSTLIB}: ${TINYHOSTLIB_OBJS} 950 @${PRINTF} " RM $(subst ${BUILD}/,,$@)\n" 951 ${Q}rm -f $@ 952 @${PRINTF} " AR $(subst ${BUILD}/,,$@)\n" 953 ${Q}ar qc $@ $^ 954 955 # ---------------------------------------------------------------------------- 956 # CGPT library and utility 957 958 .PHONY: cgpt_wrapper 959 cgpt_wrapper: ${CGPT_WRAPPER} 960 961 ${CGPT_WRAPPER}: ${CGPT_WRAPPER_OBJS} ${UTILLIB} 962 @$(PRINTF) " LD $(subst ${BUILD}/,,$@)\n" 963 ${Q}${LD} -o ${CGPT_WRAPPER} ${CFLAGS} $^ 964 965 .PHONY: cgpt 966 cgpt: ${CGPT} ${CGPT_WRAPPER} 967 968 ${CGPT}: LDLIBS += -luuid 969 970 ${CGPT}: ${CGPT_OBJS} ${UTILLIB} 971 @${PRINTF} " LDcgpt $(subst ${BUILD}/,,$@)\n" 972 ${Q}${LD} -o ${CGPT} ${CFLAGS} ${LDFLAGS} $^ ${LDLIBS} 973 974 .PHONY: cgpt_install 975 cgpt_install: ${CGPT} 976 @${PRINTF} " INSTALL CGPT\n" 977 ${Q}mkdir -p ${UB_DIR} 978 ${Q}${INSTALL} -t ${UB_DIR} $^ 979 980 .PHONY: cgpt_wrapper_install 981 cgpt_wrapper_install: cgpt_install ${CGPT_WRAPPER} 982 @$(PRINTF) " INSTALL cgpt_wrapper\n" 983 ${Q}${INSTALL} -t ${UB_DIR} ${CGPT_WRAPPER} 984 ${Q}mv ${UB_DIR}/$(notdir ${CGPT}) \ 985 ${UB_DIR}/$(notdir ${CGPT}).bin 986 ${Q}mv ${UB_DIR}/$(notdir ${CGPT_WRAPPER}) \ 987 ${UB_DIR}/$(notdir ${CGPT}) 988 989 # ---------------------------------------------------------------------------- 990 # Utilities 991 992 # These have their own headers too. 993 ${BUILD}/utility/%: INCLUDES += -Iutility/include 994 995 ${UTIL_BINS} ${UTIL_BINS_STATIC}: ${UTILLIB} 996 ${UTIL_BINS} ${UTIL_BINS_STATIC}: LIBS = ${UTILLIB} 997 998 # Utilities for auto-update toolkits must be statically linked. 999 ${UTIL_BINS_STATIC}: LDFLAGS += -static 1000 1001 1002 .PHONY: utils 1003 utils: ${UTIL_BINS} ${UTIL_SCRIPTS} 1004 ${Q}cp -f ${UTIL_SCRIPTS} ${BUILD}/utility 1005 ${Q}chmod a+rx $(patsubst %,${BUILD}/%,${UTIL_SCRIPTS}) 1006 1007 .PHONY: utils_install 1008 utils_install: ${UTIL_BINS} ${UTIL_SCRIPTS} ${UTIL_DEFAULTS} 1009 @${PRINTF} " INSTALL UTILS\n" 1010 ${Q}mkdir -p ${UB_DIR} 1011 ${Q}${INSTALL} -t ${UB_DIR} ${UTIL_BINS} ${UTIL_SCRIPTS} 1012 ${Q}mkdir -p ${DF_DIR} 1013 ${Q}${INSTALL} -t ${DF_DIR} -m 'u=rw,go=r,a-s' ${UTIL_DEFAULTS} 1014 1015 # And some signing stuff for the target 1016 .PHONY: signing_install 1017 signing_install: ${SIGNING_SCRIPTS} ${SIGNING_SCRIPTS_DEV} ${SIGNING_COMMON} 1018 @${PRINTF} " INSTALL SIGNING\n" 1019 ${Q}mkdir -p ${UB_DIR} ${VB_DIR} 1020 ${Q}${INSTALL} -t ${UB_DIR} ${SIGNING_SCRIPTS} 1021 ${Q}${INSTALL} -t ${VB_DIR} ${SIGNING_SCRIPTS_DEV} 1022 ${Q}${INSTALL} -t ${VB_DIR} -m 'u=rw,go=r,a-s' ${SIGNING_COMMON} 1023 1024 # ---------------------------------------------------------------------------- 1025 # new Firmware Utility 1026 1027 .PHONY: futil 1028 futil: ${FUTIL_STATIC_BIN} ${FUTIL_BIN} 1029 1030 ${FUTIL_STATIC_BIN}: ${FUTIL_STATIC_OBJS} ${UTILLIB} 1031 @${PRINTF} " LD $(subst ${BUILD}/,,$@)\n" 1032 ${Q}${LD} -o $@ ${CFLAGS} ${LDFLAGS} -static $^ ${LDLIBS} 1033 1034 ${FUTIL_BIN}: LDLIBS += ${CRYPTO_LIBS} 1035 ${FUTIL_BIN}: ${FUTIL_OBJS} ${UTILLIB} 1036 @${PRINTF} " LD $(subst ${BUILD}/,,$@)\n" 1037 ${Q}${LD} -o $@ ${CFLAGS} ${LDFLAGS} $^ ${LDLIBS} 1038 1039 .PHONY: futil_install 1040 futil_install: ${FUTIL_BIN} ${FUTIL_STATIC_BIN} 1041 @${PRINTF} " INSTALL futility\n" 1042 ${Q}mkdir -p ${UB_DIR} 1043 ${Q}${INSTALL} -t ${UB_DIR} ${FUTIL_BIN} ${FUTIL_STATIC_BIN} 1044 ${Q}for prog in ${FUTIL_SYMLINKS}; do \ 1045 ln -sf futility "${UB_DIR}/$$prog"; done 1046 1047 # ---------------------------------------------------------------------------- 1048 # Utility to generate TLCL structure definition header file. 1049 1050 ${BUILD}/utility/tlcl_generator: CFLAGS += -fpack-struct 1051 1052 STRUCTURES_TMP=${BUILD}/tlcl_structures.tmp 1053 STRUCTURES_SRC=firmware/lib/tpm_lite/include/tlcl_structures.h 1054 1055 .PHONY: update_tlcl_structures 1056 update_tlcl_structures: ${BUILD}/utility/tlcl_generator 1057 @${PRINTF} " Rebuilding TLCL structures\n" 1058 ${Q}${BUILD}/utility/tlcl_generator > ${STRUCTURES_TMP} 1059 ${Q}cmp -s ${STRUCTURES_TMP} ${STRUCTURES_SRC} || \ 1060 ( echo "%% Updating structures.h %%" && \ 1061 cp ${STRUCTURES_TMP} ${STRUCTURES_SRC} ) 1062 1063 # ---------------------------------------------------------------------------- 1064 # Tests 1065 1066 .PHONY: tests 1067 tests: ${TEST_BINS} 1068 1069 ${TEST_BINS}: ${UTILLIB} ${TESTLIB} 1070 ${TEST_BINS}: INCLUDES += -Itests 1071 ${TEST_BINS}: LIBS = ${TESTLIB} ${UTILLIB} 1072 1073 ${TEST2X_BINS}: ${FWLIB2X} 1074 ${TEST2X_BINS}: LIBS += ${FWLIB2X} 1075 1076 ${TEST20_BINS}: ${FWLIB20} 1077 ${TEST20_BINS}: INCLUDES += -Ifirmware/lib20/include 1078 ${TEST20_BINS}: LIBS += ${FWLIB20} 1079 1080 ${TEST21_BINS}: ${UTILLIB21} 1081 ${TEST21_BINS}: INCLUDES += -Ihost/lib21/include -Ifirmware/lib21/include 1082 ${TEST21_BINS}: LIBS += ${UTILLIB21} 1083 1084 ${TESTLIB}: ${TESTLIB_OBJS} 1085 @${PRINTF} " RM $(subst ${BUILD}/,,$@)\n" 1086 ${Q}rm -f $@ 1087 @${PRINTF} " AR $(subst ${BUILD}/,,$@)\n" 1088 ${Q}ar qc $@ $^ 1089 1090 1091 # ---------------------------------------------------------------------------- 1092 # Generic build rules. LIBS and OBJS can be overridden to tweak the generic 1093 # rules for specific targets. 1094 1095 ${BUILD}/%: ${BUILD}/%.o ${OBJS} ${LIBS} 1096 @${PRINTF} " LD $(subst ${BUILD}/,,$@)\n" 1097 ${Q}${LD} -o $@ ${CFLAGS} ${LDFLAGS} $< ${OBJS} ${LIBS} ${LDLIBS} 1098 1099 ${BUILD}/%.o: %.c 1100 @${PRINTF} " CC $(subst ${BUILD}/,,$@)\n" 1101 ${Q}${CC} ${CFLAGS} ${INCLUDES} -c -o $@ $< 1102 1103 ${BUILD}/%.o: ${BUILD}/%.c 1104 @${PRINTF} " CC $(subst ${BUILD}/,,$@)\n" 1105 ${Q}${CC} ${CFLAGS} ${INCLUDES} -c -o $@ $< 1106 1107 # Rules to recompile a single source file for library and test 1108 # TODO: is there a tidier way to do this? 1109 ${BUILD}/%_for_lib.o: CFLAGS += -DFOR_LIBRARY 1110 ${BUILD}/%_for_lib.o: %.c 1111 @${PRINTF} " CC-for-lib $(subst ${BUILD}/,,$@)\n" 1112 ${Q}${CC} ${CFLAGS} ${INCLUDES} -c -o $@ $< 1113 1114 ${BUILD}/%_for_test.o: CFLAGS += -DFOR_TEST 1115 ${BUILD}/%_for_test.o: %.c 1116 @${PRINTF} " CC-for-test $(subst ${BUILD}/,,$@)\n" 1117 ${Q}${CC} ${CFLAGS} ${INCLUDES} -c -o $@ $< 1118 1119 # TODO: C++ files don't belong in vboot reference at all. Convert to C. 1120 ${BUILD}/%.o: %.cc 1121 @${PRINTF} " CXX $(subst ${BUILD}/,,$@)\n" 1122 ${Q}${CXX} ${CFLAGS} ${INCLUDES} -c -o $@ $< 1123 1124 # ---------------------------------------------------------------------------- 1125 # Here are the special tweaks to the generic rules. 1126 1127 # Always create the defaults file, since it depends on input variables 1128 .PHONY: ${UTIL_DEFAULTS} 1129 ${UTIL_DEFAULTS}: 1130 @${PRINTF} " CREATE $(subst ${BUILD}/,,$@)\n" 1131 ${Q}rm -f $@ 1132 ${Q}mkdir -p $(dir $@) 1133 ${Q}echo '# Generated file. Do not edit.' > $@.tmp 1134 ${Q}echo "DEV_DEBUG_FORCE=${DEV_DEBUG_FORCE}" >> $@.tmp 1135 ${Q}mv -f $@.tmp $@ 1136 1137 # Some utilities need external crypto functions 1138 CRYPTO_LIBS := $(shell ${PKG_CONFIG} --libs libcrypto) 1139 1140 ${BUILD}/utility/dumpRSAPublicKey: LDLIBS += ${CRYPTO_LIBS} 1141 ${BUILD}/utility/pad_digest_utility: LDLIBS += ${CRYPTO_LIBS} 1142 ${BUILD}/utility/signature_digest_utility: LDLIBS += ${CRYPTO_LIBS} 1143 1144 ${BUILD}/host/linktest/main: LDLIBS += ${CRYPTO_LIBS} 1145 ${BUILD}/tests/vboot_common2_tests: LDLIBS += ${CRYPTO_LIBS} 1146 ${BUILD}/tests/vboot_common3_tests: LDLIBS += ${CRYPTO_LIBS} 1147 ${BUILD}/tests/vb20_common2_tests: LDLIBS += ${CRYPTO_LIBS} 1148 ${BUILD}/tests/vb20_common3_tests: LDLIBS += ${CRYPTO_LIBS} 1149 ${BUILD}/tests/verify_kernel: LDLIBS += ${CRYPTO_LIBS} 1150 1151 ${TEST21_BINS}: LDLIBS += ${CRYPTO_LIBS} 1152 1153 LZMA_LIBS := $(shell ${PKG_CONFIG} --libs liblzma) 1154 YAML_LIBS := $(shell ${PKG_CONFIG} --libs yaml-0.1) 1155 1156 ${BUILD}/utility/bmpblk_utility: LD = ${CXX} 1157 ${BUILD}/utility/bmpblk_utility: LDLIBS = ${LZMA_LIBS} ${YAML_LIBS} 1158 1159 BMPBLK_UTILITY_DEPS = \ 1160 ${BUILD}/utility/bmpblk_util.o \ 1161 ${BUILD}/utility/image_types.o \ 1162 ${BUILD}/utility/eficompress_for_lib.o \ 1163 ${BUILD}/utility/efidecompress_for_lib.o 1164 1165 ${BUILD}/utility/bmpblk_utility: OBJS = ${BMPBLK_UTILITY_DEPS} 1166 ${BUILD}/utility/bmpblk_utility: ${BMPBLK_UTILITY_DEPS} 1167 ALL_OBJS += ${BMPBLK_UTILITY_DEPS} 1168 1169 ${BUILD}/utility/bmpblk_font: OBJS += ${BUILD}/utility/image_types.o 1170 ${BUILD}/utility/bmpblk_font: ${BUILD}/utility/image_types.o 1171 ALL_OBJS += ${BUILD}/utility/image_types.o 1172 1173 # Allow multiple definitions, so tests can mock functions from other libraries 1174 ${BUILD}/tests/%: CFLAGS += -Xlinker --allow-multiple-definition 1175 ${BUILD}/tests/%: LDLIBS += -lrt -luuid 1176 ${BUILD}/tests/%: LIBS += ${TESTLIB} 1177 1178 ${BUILD}/tests/rollback_index2_tests: OBJS += \ 1179 ${BUILD}/firmware/lib/rollback_index_for_test.o 1180 ${BUILD}/tests/rollback_index2_tests: \ 1181 ${BUILD}/firmware/lib/rollback_index_for_test.o 1182 TEST_OBJS += ${BUILD}/firmware/lib/rollback_index_for_test.o 1183 1184 ${BUILD}/tests/tlcl_tests: OBJS += \ 1185 ${BUILD}/firmware/lib/tpm_lite/tlcl_for_test.o 1186 ${BUILD}/tests/tlcl_tests: \ 1187 ${BUILD}/firmware/lib/tpm_lite/tlcl_for_test.o 1188 TEST_OBJS += ${BUILD}/firmware/lib/tpm_lite/tlcl_for_test.o 1189 1190 ${BUILD}/tests/vboot_audio_tests: OBJS += \ 1191 ${BUILD}/firmware/lib/vboot_audio_for_test.o 1192 ${BUILD}/tests/vboot_audio_tests: \ 1193 ${BUILD}/firmware/lib/vboot_audio_for_test.o 1194 TEST_OBJS += ${BUILD}/firmware/lib/vboot_audio_for_test.o 1195 1196 TLCL_TEST_BINS = $(addprefix ${BUILD}/,${TLCL_TEST_NAMES}) 1197 ${TLCL_TEST_BINS}: OBJS += ${BUILD}/tests/tpm_lite/tlcl_tests.o 1198 ${TLCL_TEST_BINS}: ${BUILD}/tests/tpm_lite/tlcl_tests.o 1199 TEST_OBJS += ${BUILD}/tests/tpm_lite/tlcl_tests.o 1200 1201 # ---------------------------------------------------------------------------- 1202 # Here are the special rules that don't fit in the generic rules. 1203 1204 # Generates the list of commands defined in futility by running grep in the 1205 # source files looking for the DECLARE_FUTIL_COMMAND() macro usage. 1206 ${FUTIL_STATIC_CMD_LIST}: ${FUTIL_STATIC_SRCS} 1207 ${FUTIL_CMD_LIST}: ${FUTIL_SRCS} 1208 ${FUTIL_CMD_LIST} ${FUTIL_STATIC_CMD_LIST}: 1209 @${PRINTF} " GEN $(subst ${BUILD}/,,$@)\n" 1210 ${Q}rm -f $@ $@_t $@_commands 1211 ${Q}mkdir -p ${BUILD}/gen 1212 ${Q}grep -hoRE '^DECLARE_FUTIL_COMMAND\([^,]+' $^ \ 1213 | sed 's/DECLARE_FUTIL_COMMAND(\(.*\)/_CMD(\1)/' \ 1214 | sort >>$@_commands 1215 ${Q}./scripts/getversion.sh >> $@_t 1216 ${Q}echo '#define _CMD(NAME) extern const struct' \ 1217 'futil_cmd_t __cmd_##NAME;' >> $@_t 1218 ${Q}cat $@_commands >> $@_t 1219 ${Q}echo '#undef _CMD' >> $@_t 1220 ${Q}echo '#define _CMD(NAME) &__cmd_##NAME,' >> $@_t 1221 ${Q}echo 'const struct futil_cmd_t *const futil_cmds[] = {' >> $@_t 1222 ${Q}cat $@_commands >> $@_t 1223 ${Q}echo '0}; /* null-terminated */' >> $@_t 1224 ${Q}echo '#undef _CMD' >> $@_t 1225 ${Q}mv $@_t $@ 1226 ${Q}rm -f $@_commands 1227 1228 ############################################################################## 1229 # Targets that exist just to run tests 1230 1231 # Frequently-run tests 1232 .PHONY: test_targets 1233 test_targets:: runcgpttests runmisctests run2tests 1234 1235 ifeq (${MINIMAL},) 1236 # Bitmap utility isn't compiled for minimal variant 1237 test_targets:: runbmptests runfutiltests 1238 # Scripts don't work under qemu testing 1239 # TODO: convert scripts to makefile so they can be called directly 1240 test_targets:: runtestscripts 1241 endif 1242 1243 .PHONY: test_setup 1244 test_setup:: cgpt utils futil tests install_for_test 1245 1246 # Qemu setup for cross-compiled tests. Need to copy qemu binary into the 1247 # sysroot. 1248 ifneq (${QEMU_ARCH},) 1249 test_setup:: qemu_install 1250 1251 .PHONY: qemu_install 1252 qemu_install: 1253 ifeq (${SYSROOT},) 1254 $(error SYSROOT must be set to the top of the target-specific root \ 1255 when cross-compiling for qemu-based tests to run properly.) 1256 endif 1257 @${PRINTF} " Copying qemu binary.\n" 1258 ${Q}cp -fu /usr/bin/${QEMU_BIN} ${BUILD}/${QEMU_BIN} 1259 ${Q}chmod a+rx ${BUILD}/${QEMU_BIN} 1260 endif 1261 1262 .PHONY: runtests 1263 runtests: test_setup test_targets 1264 1265 # Generate test keys 1266 .PHONY: genkeys 1267 genkeys: utils test_setup 1268 tests/gen_test_keys.sh 1269 1270 # Generate test cases for fuzzing 1271 .PHONY: genfuzztestcases 1272 genfuzztestcases: utils test_setup 1273 tests/gen_fuzz_test_cases.sh 1274 1275 .PHONY: runbmptests 1276 runbmptests: test_setup 1277 cd tests/bitmaps && BMPBLK=${BUILD_RUN}/utility/bmpblk_utility \ 1278 ./TestBmpBlock.py -v 1279 1280 .PHONY: runcgpttests 1281 runcgpttests: test_setup 1282 ${RUNTEST} ${BUILD_RUN}/tests/cgptlib_test 1283 1284 .PHONY: runtestscripts 1285 runtestscripts: test_setup genfuzztestcases 1286 tests/load_kernel_tests.sh 1287 tests/run_cgpt_tests.sh ${BUILD_RUN}/cgpt/cgpt 1288 tests/run_cgpt_tests.sh ${BUILD_RUN}/cgpt/cgpt -D 358400 1289 tests/run_preamble_tests.sh 1290 tests/run_rsa_tests.sh 1291 tests/run_vbutil_kernel_arg_tests.sh 1292 tests/run_vbutil_tests.sh 1293 tests/vb2_rsa_tests.sh 1294 tests/vb2_firmware_tests.sh 1295 1296 .PHONY: runmisctests 1297 runmisctests: test_setup 1298 ${RUNTEST} ${BUILD_RUN}/tests/rollback_index2_tests 1299 ${RUNTEST} ${BUILD_RUN}/tests/rollback_index3_tests 1300 ${RUNTEST} ${BUILD_RUN}/tests/rsa_utility_tests 1301 ${RUNTEST} ${BUILD_RUN}/tests/sha_tests 1302 ${RUNTEST} ${BUILD_RUN}/tests/stateful_util_tests 1303 ${RUNTEST} ${BUILD_RUN}/tests/tlcl_tests 1304 ${RUNTEST} ${BUILD_RUN}/tests/tpm_bootmode_tests 1305 ${RUNTEST} ${BUILD_RUN}/tests/utility_string_tests 1306 ${RUNTEST} ${BUILD_RUN}/tests/utility_tests 1307 ${RUNTEST} ${BUILD_RUN}/tests/vboot_api_devmode_tests 1308 ${RUNTEST} ${BUILD_RUN}/tests/vboot_api_firmware_tests 1309 ${RUNTEST} ${BUILD_RUN}/tests/vboot_api_init_tests 1310 ${RUNTEST} ${BUILD_RUN}/tests/vboot_api_kernel_tests 1311 ${RUNTEST} ${BUILD_RUN}/tests/vboot_api_kernel2_tests 1312 ${RUNTEST} ${BUILD_RUN}/tests/vboot_api_kernel3_tests 1313 ${RUNTEST} ${BUILD_RUN}/tests/vboot_api_kernel4_tests 1314 ${RUNTEST} ${BUILD_RUN}/tests/vboot_audio_tests 1315 ${RUNTEST} ${BUILD_RUN}/tests/vboot_common_tests 1316 ${RUNTEST} ${BUILD_RUN}/tests/vboot_common2_tests ${TEST_KEYS} 1317 ${RUNTEST} ${BUILD_RUN}/tests/vboot_common3_tests ${TEST_KEYS} 1318 ${RUNTEST} ${BUILD_RUN}/tests/vboot_display_tests 1319 ${RUNTEST} ${BUILD_RUN}/tests/vboot_firmware_tests 1320 ${RUNTEST} ${BUILD_RUN}/tests/vboot_kernel_tests 1321 ${RUNTEST} ${BUILD_RUN}/tests/vboot_nvstorage_test 1322 1323 .PHONY: run2tests 1324 run2tests: test_setup 1325 ${RUNTEST} ${BUILD_RUN}/tests/vb2_api_tests 1326 ${RUNTEST} ${BUILD_RUN}/tests/vb2_common_tests 1327 ${RUNTEST} ${BUILD_RUN}/tests/vb2_misc_tests 1328 ${RUNTEST} ${BUILD_RUN}/tests/vb2_nvstorage_tests 1329 ${RUNTEST} ${BUILD_RUN}/tests/vb2_rsa_utility_tests 1330 ${RUNTEST} ${BUILD_RUN}/tests/vb2_secdata_tests 1331 ${RUNTEST} ${BUILD_RUN}/tests/vb2_sha_tests 1332 ${RUNTEST} ${BUILD_RUN}/tests/vb20_api_tests 1333 ${RUNTEST} ${BUILD_RUN}/tests/vb20_common_tests 1334 ${RUNTEST} ${BUILD_RUN}/tests/vb20_common2_tests ${TEST_KEYS} 1335 ${RUNTEST} ${BUILD_RUN}/tests/vb20_common3_tests ${TEST_KEYS} 1336 ${RUNTEST} ${BUILD_RUN}/tests/vb20_misc_tests 1337 ${RUNTEST} ${BUILD_RUN}/tests/vb21_api_tests 1338 ${RUNTEST} ${BUILD_RUN}/tests/vb21_common_tests 1339 ${RUNTEST} ${BUILD_RUN}/tests/vb21_common2_tests ${TEST_KEYS} 1340 ${RUNTEST} ${BUILD_RUN}/tests/vb21_misc_tests 1341 ${RUNTEST} ${BUILD_RUN}/tests/vb21_host_fw_preamble_tests ${TEST_KEYS} 1342 ${RUNTEST} ${BUILD_RUN}/tests/vb21_host_key_tests ${TEST_KEYS} 1343 ${RUNTEST} ${BUILD_RUN}/tests/vb21_host_keyblock_tests ${TEST_KEYS} 1344 ${RUNTEST} ${BUILD_RUN}/tests/vb21_host_misc_tests 1345 ${RUNTEST} ${BUILD_RUN}/tests/vb21_host_sig_tests ${TEST_KEYS} 1346 1347 .PHONY: runfutiltests 1348 runfutiltests: test_setup 1349 tests/futility/run_test_scripts.sh ${TEST_INSTALL_DIR}/bin 1350 ${RUNTEST} ${BUILD_RUN}/tests/futility/test_not_really 1351 1352 # Run long tests, including all permutations of encryption keys (instead of 1353 # just the ones we use) and tests of currently-unused code. 1354 # Not run by automated build. 1355 .PHONY: runlongtests 1356 runlongtests: test_setup genkeys genfuzztestcases 1357 ${RUNTEST} ${BUILD_RUN}/tests/vboot_common2_tests ${TEST_KEYS} --all 1358 ${RUNTEST} ${BUILD_RUN}/tests/vboot_common3_tests ${TEST_KEYS} --all 1359 ${RUNTEST} ${BUILD_RUN}/tests/vb20_common2_tests ${TEST_KEYS} --all 1360 ${RUNTEST} ${BUILD_RUN}/tests/vb20_common3_tests ${TEST_KEYS} --all 1361 ${RUNTEST} ${BUILD_RUN}/tests/vb21_common2_tests ${TEST_KEYS} --all 1362 tests/run_preamble_tests.sh --all 1363 tests/run_vbutil_tests.sh --all 1364 1365 # TODO: There were a number of ancient tests that hadn't been run in years. 1366 # They were removed with https://chromium-review.googlesource.com/#/c/214610/ 1367 # Some day it might be nice to see what they were supposed to do. 1368 1369 .PHONY: runalltests 1370 runalltests: runtests runfutiltests runlongtests 1371 1372 # Code coverage 1373 .PHONY: coverage_init 1374 coverage_init: test_setup 1375 rm -f ${COV_INFO}* 1376 lcov -c -i -d . -b . -o ${COV_INFO}.initial 1377 1378 .PHONY: coverage_html 1379 coverage_html: 1380 lcov -c -d . -b . -o ${COV_INFO}.tests 1381 lcov -a ${COV_INFO}.initial -a ${COV_INFO}.tests -o ${COV_INFO}.total 1382 lcov -r ${COV_INFO}.total '/usr/*' '*/linktest/*' -o ${COV_INFO}.local 1383 genhtml ${COV_INFO}.local -o ${BUILD}/coverage 1384 # Generate addtional coverage stats just for firmware subdir, because the stats 1385 # for the whole project don't include subdirectory summaries. This will print 1386 # the summary for just the firmware sources. 1387 lcov -r ${COV_INFO}.local '*/stub/*' -o ${COV_INFO}.nostub 1388 lcov -e ${COV_INFO}.nostub '${SRCDIR}/firmware/*' \ 1389 -o ${COV_INFO}.firmware 1390 1391 .PHONY: coverage 1392 ifeq (${COV},) 1393 coverage: 1394 $(error Build coverage like this: make clean && COV=1 make) 1395 else 1396 coverage: coverage_init runtests coverage_html 1397 endif 1398 1399 # Include generated dependencies 1400 ALL_DEPS += ${ALL_OBJS:%.o=%.o.d} 1401 TEST_DEPS += ${TEST_OBJS:%.o=%.o.d} 1402 -include ${ALL_DEPS} 1403 -include ${TEST_DEPS} 1404 1405 # We want to use only relative paths in cscope.files, especially since the 1406 # paths inside and outside the chroot are different. 1407 SRCDIRPAT=$(subst /,\/,${SRCDIR}/) 1408 1409 # Note: vboot 2.0 is deprecated, so don't index those files 1410 ${BUILD}/cscope.files: test_setup 1411 ${Q}rm -f $@ 1412 ${Q}cat ${ALL_DEPS} | tr -d ':\\' | tr ' ' '\012' | \ 1413 grep -v /lib20/ | \ 1414 sed -e "s/${SRCDIRPAT}//" | \ 1415 egrep '\.[chS]$$' | sort | uniq > $@ 1416 1417 cmd_etags = etags -o ${BUILD}/TAGS $(shell cat ${BUILD}/cscope.files) 1418 cmd_ctags = ctags -o ${BUILD}/tags $(shell cat ${BUILD}/cscope.files) 1419 run_if_prog = $(if $(shell which $(1) 2>/dev/null),$(2),) 1420 1421 .PHONY: tags TAGS xrefs 1422 tags TAGS xrefs: ${BUILD}/cscope.files 1423 ${Q}\rm -f ${BUILD}/tags ${BUILD}/TAGS 1424 ${Q}$(call run_if_prog,etags,${cmd_etags}) 1425 ${Q}$(call run_if_prog,ctags,${cmd_ctags}) 1426 1427 PC_FILES = ${PC_IN_FILES:%.pc.in=${BUILD}/%.pc} 1428 ${PC_FILES}: ${PC_IN_FILES} 1429 ${Q}sed \ 1430 -e 's:@LDLIBS@:${LDLIBS}:' \ 1431 -e 's:@LIBDIR@:${LIBDIR}:' \ 1432 $< > $@ 1433 1434 .PHONY: pc_files_install 1435 pc_files_install: ${PC_FILES} 1436 ${Q}mkdir -p ${ULP_DIR} 1437 ${Q}${INSTALL} -D -m 0644 $< ${ULP_DIR}/$(notdir $<) 1438