blob: 90234c4a9dd26dd17d6cc43e42357bcf1cfe7b7b [file]
# -*- makefile -*-
# vim: set filetype=make :
# Copyright 2020 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# Embedded Controller firmware build system - third_party rules/targets
#
ifeq ($(CONFIG_BORINGSSL_CRYPTO), y)
ifndef CMAKE_SYSTEM_PROCESSOR
$(error ERROR: Set CMAKE_SYSTEM_PROCESSOR in core/$(CORE)/toolchain.mk)
endif
ifndef OPENSSL_NO_ASM
$(error ERROR: Set OPENSSL_NO_ASM in core/$(CORE)/toolchain.mk)
endif
# The boringssl path can be overridden on invocation, as in the following
# example: $ make BORINGSSL_DIR=~/src/boringssl BOARD=bloonchipper
BORINGSSL_DIR ?= ../../third_party/boringssl
BORINGSSL_OUTDIR := $(out)/third_party/boringssl/crypto
BORINGSSL_TOOLCHAIN := \
$(shell pwd)/third_party/boringssl/boringssl-toolchain.cmake
$(BORINGSSL_OUTDIR)/libcrypto.a:
mkdir -p $(out)/third_party/boringssl/
cmake \
-DCC_NAME=$(CROSS_COMPILE_CC_NAME) \
-DCXX_NAME=$(CROSS_COMPILE_CXX_NAME) \
-DCROSS_COMPILE=$(CROSS_COMPILE) \
-DCMAKE_SYSTEM_PROCESSOR=$(CMAKE_SYSTEM_PROCESSOR) \
-DCMAKE_SYSROOT=$(SYSROOT) \
-DOPENSSL_NO_ASM=$(OPENSSL_NO_ASM) \
-DCROS_EC_REPO=$(CURDIR) \
-DCMAKE_TOOLCHAIN_FILE=$(BORINGSSL_TOOLCHAIN) \
-DCMAKE_VERBOSE_MAKEFILE=$(V) \
-B $(out)/third_party/boringssl/ \
-S $(BORINGSSL_DIR) \
-GNinja
cmake --build $(out)/third_party/boringssl/ -- crypto
# Make sure the EC/FPMCU code can link to the boringssl library.
CPPFLAGS += -I$(BORINGSSL_DIR) -I$(BORINGSSL_DIR)/include
BORINGSSL_LDFLAGS := -L$(BORINGSSL_OUTDIR) -lcrypto
# And the custom helpers.
CPPFLAGS += -I$(shell pwd)/third_party/boringssl/include
# Disable the unsupported features to prevent the usage of pthread & socket
# related types in headers.
CPPFLAGS += -DCROS_EC
$(out)/RO/ec.RO.elf $(out)/RO/ec.RO_B.elf: LDFLAGS_EXTRA += $(BORINGSSL_LDFLAGS)
$(out)/RO/ec.RO.elf $(out)/RO/ec.RO_B.elf: $(BORINGSSL_OUTDIR)/libcrypto.a
$(out)/RW/ec.RW.elf $(out)/RW/ec.RW_B.elf: LDFLAGS_EXTRA += $(BORINGSSL_LDFLAGS)
$(out)/RW/ec.RW.elf $(out)/RW/ec.RW_B.elf: $(BORINGSSL_OUTDIR)/libcrypto.a
$(out)/$(PROJECT).exe: LDFLAGS_EXTRA += $(BORINGSSL_LDFLAGS)
$(out)/$(PROJECT).exe: $(BORINGSSL_OUTDIR)/libcrypto.a
# On-device tests.
third-party-test-targets=$(foreach test,$(test-list-y),\
$(out)/RW/$(test).RW.elf $(out)/RO/$(test).RO.elf)
$(third-party-test-targets): LDFLAGS_EXTRA += $(BORINGSSL_LDFLAGS)
$(third-party-test-targets): $(BORINGSSL_OUTDIR)/libcrypto.a
endif # CONFIG_BORINGSSL_CRYPTO
# Build and link against googletest in *test* builds if configured.
ifeq ($(TEST_BUILD),y)
ifeq ($(CONFIG_GOOGLETEST),y)
# The googletest path can be overridden on invocation. For example:
# $ make GOOGLETEST_DIR=~/src/googletest BOARD=bloonchipper
GOOGLETEST_DIR ?= $(realpath ../../third_party/googletest)
GOOGLETEST_INSTALL_DIR := $(realpath $(out))/googletest/install
CMAKE_TOOLCHAIN_FILE := $(CURDIR)/cmake/toolchain-armv7m.cmake
GOOGLETEST_CONFIG_CFLAGS := -DGTEST_HAS_FILE_SYSTEM=0
GOOGLETEST_CFLAGS := -I$(GOOGLETEST_INSTALL_DIR)/include \
$(GOOGLETEST_CONFIG_CFLAGS)
GOOGLETEST_LDFLAGS := -L$(GOOGLETEST_INSTALL_DIR)/lib -lgtest -lgmock
GOOGLETEST_LIB := $(GOOGLETEST_INSTALL_DIR)/lib/libgtest.a
$(GOOGLETEST_LIB):
mkdir -p $(out)/googletest && \
cd $(out)/googletest && \
CXXFLAGS="$(GOOGLETEST_CONFIG_CFLAGS)" cmake -Dgtest_disable_pthreads=ON \
-GNinja \
-DCMAKE_TOOLCHAIN_FILE=$(CMAKE_TOOLCHAIN_FILE) \
-DCMAKE_INSTALL_PREFIX=$(GOOGLETEST_INSTALL_DIR) \
-DCMAKE_VERBOSE_MAKEFILE=$(V) \
$(GOOGLETEST_DIR) && \
cmake --build . && \
cmake --install .
# On-device tests.
third-party-test-targets=$(foreach test,$(test-list-y),\
$(out)/RW/$(test).RW.elf $(out)/RO/$(test).RO.elf)
$(third-party-test-targets): LDFLAGS_EXTRA += $(GOOGLETEST_LDFLAGS)
$(third-party-test-targets): CFLAGS += $(GOOGLETEST_CFLAGS)
$(third-party-test-targets): $(GOOGLETEST_LIB)
# Test files can include googletest headers, so the headers need to be
# installed first.
$(ro-objs): $(GOOGLETEST_LIB)
$(rw-objs): $(GOOGLETEST_LIB)
endif # CONFIG_GOOGLETEST
endif # TEST_BUILD