summaryrefslogtreecommitdiff
path: root/boot/u-boot/u-boot.mk
blob: 2f890fa33f7bb9c956cced95c66d466fda211f87 (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
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
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
#############################################################
#
# U-Boot
#
#############################################################
U_BOOT_VERSION:=$(call qstrip,$(BR2_TARGET_UBOOT_VERSION))
U_BOOT_BOARD_NAME:=$(call qstrip,$(BR2_TARGET_UBOOT_BOARDNAME))

# U-Boot may not be selected in the configuration, but mkimage might
# be needed to build/prepare a kernel image. In this case, we just
# pick some random stable U-Boot version that will be used just to
# build mkimage.
ifeq ($(U_BOOT_VERSION),)
U_BOOT_VERSION=2010.12
endif

ifeq ($(U_BOOT_VERSION),custom)
# Handle custom U-Boot tarballs as specified by the configuration
U_BOOT_TARBALL=$(call qstrip,$(BR2_TARGET_UBOOT_CUSTOM_TARBALL_LOCATION))
U_BOOT_SITE:=$(dir $(U_BOOT_TARBALL))
U_BOOT_SOURCE:=$(notdir $(U_BOOT_TARBALL))
else
# Handle stable official U-Boot versions
U_BOOT_SITE:=ftp://ftp.denx.de/pub/u-boot
U_BOOT_SOURCE:=u-boot-$(U_BOOT_VERSION).tar.bz2
endif

U_BOOT_DIR:=$(BUILD_DIR)/u-boot-$(U_BOOT_VERSION)
U_BOOT_CAT:=$(BZCAT)

ifeq ($(BR2_TARGET_UBOOT_FORMAT_KWB),y)
U_BOOT_BIN:=u-boot.kwb
U_BOOT_MAKE_OPT:=$(U_BOOT_BIN)
else
U_BOOT_BIN:=u-boot.bin
endif

MKIMAGE:=$(HOST_DIR)/usr/bin/mkimage

U_BOOT_TARGETS:=$(BINARIES_DIR)/$(U_BOOT_BIN) $(MKIMAGE)
U_BOOT_ARCH=$(KERNEL_ARCH)

# u-boot in the past used arch=ppc for powerpc
ifneq ($(findstring x200,x$(U_BOOT_VERSION))$(findstring x2010.03,x$(U_BOOT_VERSION)),)
U_BOOT_ARCH=$(KERNEL_ARCH:powerpc=ppc)
endif

U_BOOT_INC_CONF_FILE:=$(U_BOOT_DIR)/include/config.h

ifeq ($(BR2_TARGET_UBOOT_TOOL_MKIMAGE),y)
U_BOOT_TARGETS+=$(TARGET_DIR)/usr/bin/mkimage
endif
ifeq ($(BR2_TARGET_UBOOT_TOOL_ENV),y)
U_BOOT_TARGETS+=$(TARGET_DIR)/usr/sbin/fw_printenv
endif

U_BOOT_CONFIGURE_OPTS += CONFIG_NOSOFTFLOAT=1

# Define a helper function
define insert_define
@echo "#ifdef $(strip $(1))" >> $(U_BOOT_INC_CONF_FILE)
@echo "#undef $(strip $(1))" >> $(U_BOOT_INC_CONF_FILE)
@echo "#endif" >> $(U_BOOT_INC_CONF_FILE)
@echo '#define $(strip $(1)) $(call qstrip,$(2))' >> $(U_BOOT_INC_CONF_FILE)
endef

$(DL_DIR)/$(U_BOOT_SOURCE):
	 $(call DOWNLOAD,$(U_BOOT_SITE),$(U_BOOT_SOURCE))

$(U_BOOT_DIR)/.unpacked: $(DL_DIR)/$(U_BOOT_SOURCE)
	mkdir -p $(@D)
	$(INFLATE$(suffix $(U_BOOT_SOURCE))) $(DL_DIR)/$(U_BOOT_SOURCE) \
		| tar $(TAR_STRIP_COMPONENTS)=1 -C $(@D) $(TAR_OPTIONS) -
	touch $@

$(U_BOOT_DIR)/.patched: $(U_BOOT_DIR)/.unpacked
	toolchain/patch-kernel.sh $(U_BOOT_DIR) boot/u-boot \
		u-boot-$(U_BOOT_VERSION)-\*.patch \
		u-boot-$(U_BOOT_VERSION)-\*.patch.$(ARCH)
ifneq ($(call qstrip,$(BR2_TARGET_UBOOT_CUSTOM_PATCH_DIR)),)
	toolchain/patch-kernel.sh $(U_BOOT_DIR) $(BR2_TARGET_UBOOT_CUSTOM_PATCH_DIR) u-boot-$(U_BOOT_VERSION)-\*.patch
endif
	touch $@

$(U_BOOT_DIR)/.configured: $(U_BOOT_DIR)/.patched
ifeq ($(U_BOOT_BOARD_NAME),)
	$(error NO U-Boot board name set. Check your BR2_TARGET_UBOOT_BOARDNAME setting)
endif
	$(TARGET_CONFIGURE_OPTS)		\
		$(U_BOOT_CONFIGURE_OPTS) \
		$(MAKE) -C $(U_BOOT_DIR) \
		CROSS_COMPILE="$(TARGET_CROSS)" ARCH=$(U_BOOT_ARCH) \
		$(U_BOOT_BOARD_NAME)_config
	touch $@

$(U_BOOT_DIR)/.header_modified: $(U_BOOT_DIR)/.configured
	# Modify configuration header in $(U_BOOT_INC_CONF_FILE)
ifdef BR2_TARGET_UBOOT_NETWORK
	@echo >> $(U_BOOT_INC_CONF_FILE)
	@echo "/* Add a wrapper around the values Buildroot sets. */" >> $(U_BOOT_INC_CONF_FILE)
	@echo "#ifndef __BR2_ADDED_CONFIG_H" >> $(U_BOOT_INC_CONF_FILE)
	@echo "#define __BR2_ADDED_CONFIG_H" >> $(U_BOOT_INC_CONF_FILE)
	$(call insert_define, DATE, $(DATE))
	$(call insert_define, CONFIG_LOAD_SCRIPTS, 1)
ifneq ($(strip $(BR2_TARGET_UBOOT_IPADDR)),"")
	$(call insert_define, CONFIG_IPADDR, $(BR2_TARGET_UBOOT_IPADDR))
endif
ifneq ($(strip $(BR2_TARGET_UBOOT_GATEWAY)),"")
	$(call insert_define, CONFIG_GATEWAYIP, $(BR2_TARGET_UBOOT_GATEWAY))
endif
ifneq ($(strip $(BR2_TARGET_UBOOT_NETMASK)),"")
	$(call insert_define, CONFIG_NETMASK, $(BR2_TARGET_UBOOT_NETMASK))
endif
ifneq ($(strip $(BR2_TARGET_UBOOT_SERVERIP)),"")
	$(call insert_define, CONFIG_SERVERIP, $(BR2_TARGET_UBOOT_SERVERIP))
endif
ifneq ($(strip $(BR2_TARGET_UBOOT_ETHADDR)),"")
	$(call insert_define, CONFIG_ETHADDR, $(BR2_TARGET_UBOOT_ETHADDR))
endif
ifneq ($(strip $(BR2_TARGET_UBOOT_ETH1ADDR)),"")
	$(call insert_define, CONFIG_ETH1ADDR, $(BR2_TARGET_UBOOT_ETH1ADDR))
endif
	@echo "#endif /* __BR2_ADDED_CONFIG_H */" >> $(U_BOOT_INC_CONF_FILE)
endif # BR2_TARGET_UBOOT_NETWORK
	touch $@

# Build U-Boot itself
$(U_BOOT_DIR)/$(U_BOOT_BIN): $(U_BOOT_DIR)/.header_modified
	$(TARGET_CONFIGURE_OPTS) \
		CFLAGS="$(TARGET_CFLAGS)" \
		LDFLAGS="$(TARGET_LDFLAGS)" \
		$(U_BOOT_CONFIGURE_OPTS) \
		$(MAKE) CROSS_COMPILE="$(CCACHE) $(TARGET_CROSS)" ARCH=$(U_BOOT_ARCH) \
		$(U_BOOT_MAKE_OPT) -C $(U_BOOT_DIR)

# Copy the result to the images/ directory
$(BINARIES_DIR)/$(U_BOOT_BIN): $(U_BOOT_DIR)/$(U_BOOT_BIN)
	rm -f $(BINARIES_DIR)/$(U_BOOT_BIN)
	cp -dpf $(U_BOOT_DIR)/$(U_BOOT_BIN) $(BINARIES_DIR)/

# Build just mkimage for the host. It might have already been built by
# the U-Boot build procedure, but mkimage may also be needed even if
# U-Boot isn't selected in the configuration, to generate a kernel
# uImage.
$(MKIMAGE): $(U_BOOT_DIR)/.patched
	mkdir -p $(@D)
	$(MAKE) -C $(U_BOOT_DIR) CROSS_COMPILE="$(TARGET_CROSS)" ARCH=$(U_BOOT_ARCH) tools
	cp -dpf $(U_BOOT_DIR)/tools/mkimage $(@D)

# Build manually mkimage for the target
$(TARGET_DIR)/usr/bin/mkimage: $(U_BOOT_DIR)/.configured
	mkdir -p $(@D)
	$(TARGET_CC) -I$(U_BOOT_DIR)/include -I$(U_BOOT_DIR)/tools \
		-DUSE_HOSTCC -o $@ \
		$(U_BOOT_DIR)/common/image.c \
		$(wildcard $(addprefix $(U_BOOT_DIR)/tools/,default_image.c \
			fit_image.c imximage.c kwbimage.c mkimage.c)) \
		$(addprefix $(U_BOOT_DIR)/lib*/,crc32.c md5.c sha1.c) \
		$(U_BOOT_DIR)/tools/os_support.c \
		$(wildcard $(U_BOOT_DIR)/libfdt/fdt*.c $(U_BOOT_DIR)/lib/libfdt/fdt*.c)

	$(STRIPCMD) $(STRIP_STRIP_UNNEEDED) $@

# Build manually fw_printenv for the target
$(TARGET_DIR)/usr/sbin/fw_printenv: $(U_BOOT_DIR)/.configured
	mkdir -p $(@D)
	$(TARGET_CC) -I$(U_BOOT_DIR)/include -I$(LINUX_HEADERS_DIR)/include \
		-DUSE_HOSTCC -o $@ \
		$(U_BOOT_DIR)/tools/env/*.c $(U_BOOT_DIR)/lib*/crc32.c
	$(STRIPCMD) $(STRIP_STRIP_UNNEEDED) $@
	ln -sf fw_printenv $(TARGET_DIR)/usr/sbin/fw_setenv

u-boot: $(U_BOOT_TARGETS)

u-boot-clean:
	-$(MAKE) -C $(U_BOOT_DIR) clean
	rm -f $(MKIMAGE)

u-boot-dirclean:
	rm -rf $(U_BOOT_DIR)

u-boot-source: $(DL_DIR)/$(U_BOOT_SOURCE)

u-boot-unpacked: $(U_BOOT_DIR)/.patched

u-boot-configured: $(U_BOOT_DIR)/.header_modified

#############################################################
#
# Toplevel Makefile options
#
#############################################################
ifeq ($(BR2_TARGET_UBOOT),y)
TARGETS+=u-boot

# we NEED a board name unless we're at make source
ifeq ($(filter source,$(MAKECMDGOALS)),)
ifeq ($(U_BOOT_BOARD_NAME),)
$(error NO U-Boot board name set. Check your BR2_TARGET_UBOOT_BOARDNAME setting)
endif
endif

endif