summaryrefslogtreecommitdiffstats
blob: d43cc60fdf37564e0a3d171d25a8cb5d1d8a381e (plain) (blame)
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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
#
# Copyright 2015 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

# Targets for building U-Boot
#
# The following must be set before including this file:
# TARGET_UBOOT_SRC must be set the base of a U-Boot tree.
# TARGET_UBOOT_DEFCONFIG must name a base U-Boot config.
# TARGET_UBOOT_ARCH must be set to match U-Boot arch.
#
# The following may be set:
# TARGET_UBOOT_CROSS_COMPILE_PREFIX to override toolchain.
# TARGET_UBOOT_CONFIGS to specify a set of additional U-Boot config files.
# TARGET_UBOOT_ENV to specify an environment to be compiled into uboot.env.
# TARGET_UBOOT_ENV_SIZE to specify the size reserved in U-Boot for the env.

ifeq ($(TARGET_UBOOT_SRC),)
$(error TARGET_UBOOT_SRC not defined but uboot.mk included)
endif

ifeq ($(TARGET_UBOOT_DEFCONFIG),)
$(error TARGET_UBOOT_DEFCONFIG not defined)
endif

ifeq ($(TARGET_UBOOT_ARCH),)
$(error TARGET_UBOOT_ARCH not defined)
endif

ifeq ($(TARGET_UBOOT_ENV_SIZE),)
ifneq ($(TARGET_UBOOT_ENV),)
$(error If TARGET_UBOOT_ENV is set TARGET_UBOOT_ENV_SIZE must also be set. See\
 CONFIG_ENV_SIZE in the selected U-Boot board config file.)
endif
endif

# These may be assigned in target BoardConfig.mk.
TARGET_UBOOT_MAKE_TARGET ?= u-boot.bin
TARGET_UBOOT_COPY_TARGETS ?= $(TARGET_UBOOT_MAKE_TARGET)

# Check target arch.
TARGET_UBOOT_ARCH := $(strip $(TARGET_UBOOT_ARCH))
UBOOT_ARCH := $(TARGET_UBOOT_ARCH)
UBOOT_CC_WRAPPER := $(CC_WRAPPER)
UBOOT_AFLAGS :=
UBOOT_DTC := $(HOST_OUT_EXECUTABLES)/dtc
UBOOT_DTC_ABS := $(abspath $(UBOOT_DTC))

ifeq ($(TARGET_UBOOT_ARCH), arm)
UBOOT_TOOLCHAIN_ABS := $(realpath prebuilts/gcc/$(HOST_PREBUILT_TAG)/arm/arm-linux-androideabi-4.9/bin)
UBOOT_CROSS_COMPILE := $(UBOOT_TOOLCHAIN_ABS)/arm-linux-androidkernel-
UBOOT_SRC_ARCH := arm
UBOOT_CFLAGS :=
else ifeq ($(TARGET_UBOOT_ARCH), arm64)
UBOOT_TOOLCHAIN_ABS := $(realpath prebuilts/gcc/$(HOST_PREBUILT_TAG)/aarch64/aarch64-linux-android-4.9/bin)
UBOOT_CROSS_COMPILE := $(UBOOT_TOOLCHAIN_ABS)/aarch64-linux-androidkernel-
UBOOT_SRC_ARCH := arm64
UBOOT_CFLAGS :=
else ifeq ($(TARGET_UBOOT_ARCH), i386)
UBOOT_TOOLCHAIN_ABS := $(realpath prebuilts/gcc/$(HOST_PREBUILT_TAG)/x86/x86_64-linux-android-4.9/bin)
UBOOT_CROSS_COMPILE := $(UBOOT_TOOLCHAIN_ABS)/x86_64-linux-androidkernel-
UBOOT_SRC_ARCH := x86
UBOOT_CFLAGS := -mstack-protector-guard=tls
else ifeq ($(TARGET_UBOOT_ARCH), x86_64)
UBOOT_TOOLCHAIN_ABS := $(realpath prebuilts/gcc/$(HOST_PREBUILT_TAG)/x86/x86_64-linux-android-4.9/bin)
UBOOT_CROSS_COMPILE := $(UBOOT_TOOLCHAIN_ABS)/x86_64-linux-androidkernel-
UBOOT_SRC_ARCH := x86
UBOOT_CFLAGS := -mstack-protector-guard=tls
else ifeq ($(TARGET_UBOOT_ARCH), mips)
UBOOT_TOOLCHAIN_ABS := $(realpath prebuilts/gcc/$(HOST_PREBUILT_TAG)/mips/mips64el-linux-android-4.9/bin)
UBOOT_CROSS_COMPILE := $(UBOOT_TOOLCHAIN_ABS)/mips64el-linux-androidkernel-
UBOOT_SRC_ARCH := mips
UBOOT_CFLAGS :=
else
$(error U-Boot arch not supported at present)
endif

# Allow caller to override toolchain.
TARGET_UBOOT_CROSS_COMPILE_PREFIX := $(strip $(TARGET_UBOOT_CROSS_COMPILE_PREFIX))
ifneq ($(TARGET_UBOOT_CROSS_COMPILE_PREFIX),)
UBOOT_CROSS_COMPILE := $(TARGET_UBOOT_CROSS_COMPILE_PREFIX)
endif

# Use ccache if requested by USE_CCACHE variable
UBOOT_CROSS_COMPILE_WRAPPER := $(realpath $(UBOOT_CC_WRAPPER)) $(UBOOT_CROSS_COMPILE)

UBOOT_GCC_NOANDROID_CHK := $(shell (echo "int main() {return 0;}" | $(UBOOT_CROSS_COMPILE)gcc -E -mno-android - > /dev/null 2>&1 ; echo $$?))
ifeq ($(strip $(UBOOT_GCC_NOANDROID_CHK)),0)
UBOOT_CFLAGS += -mno-android
UBOOT_AFLAGS += -mno-android
endif

# Set the output for the U-Boot build products.
UBOOT_OUT := $(TARGET_OUT_INTERMEDIATES)/UBOOT_OBJ
UBOOT_ENV_OUT := $(PRODUCT_OUT)/uboot.env

# Merge all U-Boot config file sources.
UBOOT_CONFIG_DIR := device/ti/beagle_x15/uboot_config
UBOOT_CONFIG_DEFAULT := $(TARGET_UBOOT_SRC)/configs/$(TARGET_UBOOT_DEFCONFIG)
UBOOT_CONFIG_RECOMMENDED := $(UBOOT_CONFIG_DIR)/recommended.config
UBOOT_CONFIG_REQUIRED_SRC := $(UBOOT_CONFIG_DIR)/common.config
UBOOT_CONFIG_REQUIRED := $(UBOOT_OUT)/.config.required
UBOOT_CONFIG_SRC := $(UBOOT_CONFIG_DEFAULT) \
  $(UBOOT_CONFIG_RECOMMENDED) \
  $(TARGET_UBOOT_CONFIGS) \
  $(UBOOT_CONFIG_REQUIRED)
UBOOT_CONFIG := $(UBOOT_OUT)/.config
UBOOT_MERGE_CONFIG := device/ti/beagle_x15/mergeconfig.sh
# List of all the Kconfig files from the source code. Changing the Kconfig files
# requires to reassemble the .config, so we add them as dependencies.
UBOOT_SRC_KCONFIGS := \
  $(call find-files-in-subdirs,.,Kconfig,$(TARGET_UBOOT_SRC))

$(UBOOT_OUT):
	mkdir -p $@

define build_uboot
	# We don't support bundling a device tree with U-Boot yet.
	CCACHE_NODIRECT="true" PATH=$$(cd device/ti/beagle_x15/hostcc; pwd):$$PATH \
		BISON_PKGDATADIR=$$(cd prebuilts/build-tools/common/bison; pwd) \
		$(MAKE) -C $(TARGET_UBOOT_SRC) \
		O=$(realpath $(UBOOT_OUT)) \
		CROSS_COMPILE="$(UBOOT_CROSS_COMPILE_WRAPPER)" \
		DTC="$(UBOOT_DTC_ABS)" \
		KCFLAGS="$(UBOOT_CFLAGS)" \
		KAFLAGS="$(UBOOT_AFLAGS)" \
		SOURCE_DATE_EPOCH="$(BUILD_DATETIME_FROM_FILE)" \
		$(1)
endef

# Merge the required U-Boot config elements into a single file.
$(UBOOT_CONFIG_REQUIRED): $(UBOOT_CONFIG_REQUIRED_SRC) | $(UBOOT_OUT)
	$(hide) cat $^ > $@

# Merge the final target U-Boot config.
$(UBOOT_CONFIG): $(UBOOT_CONFIG_SRC) $(UBOOT_SRC_KCONFIGS) | $(UBOOT_OUT)
	$(hide) echo Merging U-Boot config
	$(call build_uboot,mrproper)
	PATH=$$(cd device/ti/beagle_x15/hostcc; pwd):$$PATH \
		BISON_PKGDATADIR=$$(cd prebuilts/build-tools/common/bison; pwd) \
		$(UBOOT_MERGE_CONFIG) \
		$(TARGET_UBOOT_SRC) $(realpath $(UBOOT_OUT)) \
		$(UBOOT_ARCH) $(UBOOT_CROSS_COMPILE) \
		$(UBOOT_CONFIG_SRC)

$(UBOOT_OUT)/$(TARGET_UBOOT_MAKE_TARGET): $(UBOOT_CONFIG) | $(UBOOT_OUT) $(UBOOT_DTC)
	$(hide) echo "Building $(UBOOT_ARCH) U-Boot ..."
	$(call build_uboot,$(TARGET_UBOOT_MAKE_TARGET))

$(addprefix $(UBOOT_OUT)/,$(TARGET_UBOOT_COPY_TARGETS)): $(UBOOT_OUT)/$(TARGET_UBOOT_MAKE_TARGET)

ifneq ($(TARGET_UBOOT_ENV),)
$(UBOOT_ENV_OUT): $(TARGET_UBOOT_ENV) | $(addprefix $(UBOOT_OUT)/,$(TARGET_UBOOT_COPY_TARGETS))
	$(UBOOT_OUT)/tools/mkenvimage -s $(TARGET_UBOOT_ENV_SIZE) -o $@ $<
endif

ALL_DEFAULT_INSTALLED_MODULES += $(addprefix $(PRODUCT_OUT)/,$(TARGET_UBOOT_COPY_TARGETS))

# Produces the actual U-Boot image!
define copy_uboot
$$(PRODUCT_OUT)/$(1): $$(UBOOT_OUT)/$(1) | $$(ACP)
	$$(ACP) -fp $$< $$@
endef
$(foreach _t,$(TARGET_UBOOT_COPY_TARGETS),$(eval $(call copy_uboot,$(_t))))