summaryrefslogtreecommitdiff
path: root/Makefile.toolchain
blob: c19ad273c0170bdc708ba10477229eb2837e2ab3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# -*- makefile -*-
# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# Toolchain configuration build system
#

# Toolchain configuration

min_make_version:=3.82
make_version_ok:=$(filter $(min_make_version), \
	$(firstword $(sort $(MAKE_VERSION) $(min_make_version))))
ifeq ($(make_version_ok),)
$(error ERROR: GNU make version $(min_make_version) or higher required.)
endif

# Default to clang if TEST_ASAN is enabled
ifneq ($(TEST_FUZZ)$(TEST_ASAN)$(TEST_MSAN)$(TEST_UBSAN),)
CC=clang
endif

# Extract cc-name
cc-name:=$(shell $(CC) -v 2>&1 | grep -q "clang version" && echo clang || echo gcc)

# Try not to assume too much about optional tools and prefixes
CCACHE:=$(shell which ccache 2>/dev/null)
ifeq ($(origin HOST_CROSS_COMPILE),undefined)
HOST_CROSS_COMPILE:=$(if $(shell which x86_64-pc-linux-gnu-gcc 2>/dev/null),x86_64-pc-linux-gnu-,)
endif

AR=$(CROSS_COMPILE)ar
CC=$(CCACHE) $(CROSS_COMPILE)$(cc-name)
CPP=$(CC) -E
CXX=$(CROSS_COMPILE)clang++
LD=$(CROSS_COMPILE)ld
NM=$(CROSS_COMPILE)nm
OBJCOPY=$(CROSS_COMPILE)objcopy
OBJDUMP=$(CROSS_COMPILE)objdump
ADDR2LINE=$(CROSS_COMPILE)addr2line
PKG_CONFIG?=pkg-config
BUILDCC?=$(CCACHE) gcc
HOSTCC?=$(CCACHE) $(HOST_CROSS_COMPILE)gcc
HOSTCXX?=$(CCACHE) $(HOST_CROSS_COMPILE)g++
PROTOC?=protoc

C_WARN = -Wstrict-prototypes -Wdeclaration-after-statement -Wno-pointer-sign
COMMON_WARN = -Wall -Werror -Wundef -Wno-trigraphs -fno-strict-aliasing \
	-fno-common -Werror-implicit-function-declaration \
	-Wno-format-security -fno-strict-overflow
ifeq ($(cc-name),clang)
# clang is pickier when it comes to packed struct members alignment.
C_WARN+= -Wno-address-of-packed-member
endif
UBSAN_FLAGS=-fsanitize=array-bounds,vla-bound \
	-fno-sanitize=vptr \
	-fno-sanitize-recover=all

CFLAGS_WARN = $(COMMON_WARN) $(C_WARN)
CXXFLAGS_WARN = $(COMMON_WARN)
CFLAGS_DEBUG= -g
CFLAGS_DEBUG+=$(CFLAGS_DEBUG_CHIP)
CFLAGS_INCLUDE=$(foreach i,$(includes),-I$(i) ) -I.
CFLAGS_TEST=$(if $(TEST_BUILD),-DTEST_BUILD \
                               -DTEST_TASKFILE=$(PROJECT).tasklist,) \
            $(if $(CTS_MODULE), $(CFLAGS_CTS)) \
            $(if $(EMU_BUILD),-DEMU_BUILD) \
            $(if $($(PROJECT)-scale),-DTEST_TIME_SCALE=$($(PROJECT)-scale)) \
            -DTEST_$(PROJECT) -DTEST_$(UC_PROJECT) \
            $(if $(TEST_ASAN),-fsanitize=address) \
            $(if $(TEST_MSAN),-fsanitize=memory) \
            $(if $(TEST_UBSAN),$(UBSAN_FLAGS)) \
            $(if $(TEST_FUZZ),-fsanitize=fuzzer-no-link -DTEST_FUZZ)
CFLAGS_COVERAGE=$(if $(TEST_COVERAGE),-fprofile-arcs -ftest-coverage \
				      -DTEST_COVERAGE,)
CFLAGS_DEFINE=-DOUTDIR=$(out)/$(BLD) -DCHIP=$(CHIP) -DBOARD_TASKFILE=$(_tsk_lst_file) \
              -DBOARD=$(BOARD) -DCORE=$(CORE) -DPROJECT=$(PROJECT) \
              -DCHIP_VARIANT=$(CHIP_VARIANT) -DCHIP_FAMILY=$(CHIP_FAMILY) \
              -DBOARD_$(UC_BOARD) -DCHIP_$(UC_CHIP) -DCORE_$(UC_CORE) \
              -DCHIP_VARIANT_$(UC_CHIP_VARIANT) -DCHIP_FAMILY_$(UC_CHIP_FAMILY) \
              -DFINAL_OUTDIR=$(out) -DPROTOBUF_MIN_PROTOC_VERSION=0 \
              $(CFLAGS_BASEBOARD)
CPPFLAGS=$(CFLAGS_DEFINE) $(CFLAGS_INCLUDE) $(CFLAGS_TEST) \
	 $(EXTRA_CFLAGS) $(CFLAGS_COVERAGE) $(LATE_CFLAGS_DEFINE) \
	-DSECTION_IS_$(BLD) -DSECTION=$(BLD) $(CPPFLAGS_$(BLD))
BUILD_CPPFLAGS=$(CFLAGS_DEFINE) -Icore/host $(CFLAGS_INCLUDE) $(CFLAGS_TEST) \
	 $(EXTRA_CFLAGS) $(CFLAGS_COVERAGE) $(LATE_CFLAGS_DEFINE) \
	 -DSECTION_IS_$(BLD) -DSECTION=$(BLD) $(CPPFLAGS_$(BLD))
HOST_CPPFLAGS=$(CFLAGS_DEFINE) $(CFLAGS_INCLUDE) $(CFLAGS_TEST) \
	 $(EXTRA_CFLAGS) $(CFLAGS_COVERAGE) $(LATE_CFLAGS_DEFINE) \
	 -DSECTION_IS_$(BLD) -DSECTION=$(BLD) $(CPPFLAGS_$(BLD))
ifneq ($(BOARD),host)
CPPFLAGS+=-ffreestanding -fno-builtin -nostdinc -nostdlib
CPPFLAGS+=-Ibuiltin/
endif
CFLAGS=$(CPPFLAGS) $(CFLAGS_CPU) $(CFLAGS_DEBUG) $(COMMON_WARN) $(CFLAGS_y)
CFLAGS+= -ffunction-sections -fshort-wchar
CFLAGS+= -fno-delete-null-pointer-checks
ifneq ($(cc-name),clang)
CFLAGS+= -fconserve-stack
endif
CFLAGS+= -DCHROMIUM_EC
CXXFLAGS+=-DPROTOBUF_INLINE_NOT_IN_HEADERS=0

FTDIVERSION:=$(shell $(PKG_CONFIG) --modversion libftdi1 2>/dev/null)
ifneq ($(FTDIVERSION),)
  LIBFTDI_NAME=ftdi1
else
  LIBFTDI_NAME=ftdi
endif

LIBFTDIUSB_CFLAGS:=$(shell $(PKG_CONFIG) --cflags lib${LIBFTDI_NAME} libusb-1.0)
LIBFTDIUSB_LDLIBS:=$(shell $(PKG_CONFIG) --libs   lib${LIBFTDI_NAME} libusb-1.0)

ifeq ($(TEST_FUZZ),y)
LIBPROTOBUF_CFLAGS:=$(shell $(PKG_CONFIG) --cflags protobuf)
LIBPROTOBUF_LDLIBS:=$(shell $(PKG_CONFIG) --libs   protobuf)

LIBPROTOBUF_MUTATOR_CFLAGS:=${LIBPROTOBUF_CFLAGS} \
	$(shell $(PKG_CONFIG) --cflags libprotobuf-mutator)
LIBPROTOBUF_MUTATOR_LDLIBS:=$(shell $(PKG_CONFIG) --libs libprotobuf-mutator) \
	${LIBPROTOBUF_LDLIBS}
endif

BUILD_CFLAGS = $(LIBFTDIUSB_CFLAGS) $(BUILD_CPPFLAGS) -O3 $(CFLAGS_DEBUG)
BUILD_CFLAGS += $(CFLAGS_WARN)
HOST_CFLAGS=$(HOST_CPPFLAGS) -O3 $(CFLAGS_DEBUG) $(CFLAGS_WARN) -DHOST_TOOLS_BUILD
ifneq (${SYSROOT},)
  LDFLAGS_EXTRA+=--sysroot=${SYSROOT}
endif
LDFLAGS=-nostdlib -g -Wl,-X -Wl,--gc-sections -Wl,--build-id=none \
	$(LDFLAGS_EXTRA) $(CFLAGS_CPU)
BUILD_LDFLAGS=$(LIBFTDIUSB_LDLIBS)
HOST_TEST_LDFLAGS=-Wl,-T core/host/host_exe.lds -lrt -pthread -rdynamic -lm\
		  -fuse-ld=bfd \
		  $(if $(TEST_COVERAGE),-fprofile-arcs,) \
		  $(if $(TEST_ASAN), -fsanitize=address) \
		  $(if $(TEST_MSAN), -fsanitize=memory) \
		  $(if $(TEST_UBSAN), ${UBSAN_FLAGS}) \
		  $(if $(TEST_FUZZ), -fsanitize=fuzzer)

# utility function to provide overridable defaults
# $1: name of variable to set
# $2: first default to use
# $3: second default to use
set-option = $(eval $1=$$(strip $$(if $(2),$(2),$(3))))