Home | History | Annotate | Download | only in vboot_reference
      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