xref: /aosp_15_r20/external/coreboot/payloads/libpayload/Makefile.mk (revision b9411a12aaaa7e1e6a6fb7c5e057f44ee179a49c)
1##
2##
3## Copyright (C) 2008 Advanced Micro Devices, Inc.
4## Copyright (C) 2008 Uwe Hermann <[email protected]>
5## Copyright (C) 2011 secunet Security Networks AG
6##
7## Redistribution and use in source and binary forms, with or without
8## modification, are permitted provided that the following conditions
9## are met:
10## 1. Redistributions of source code must retain the above copyright
11##    notice, this list of conditions and the following disclaimer.
12## 2. Redistributions in binary form must reproduce the above copyright
13##    notice, this list of conditions and the following disclaimer in the
14##    documentation and/or other materials provided with the distribution.
15## 3. The name of the author may not be used to endorse or promote products
16##    derived from this software without specific prior written permission.
17##
18## THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19## ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20## IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21## ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22## FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23## DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24## OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25## HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26## LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27## OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28## SUCH DAMAGE.
29##
30
31ifneq ($(NOCOMPILE),1)
32GIT:=$(shell git -C "$(top)" rev-parse --git-dir 1>/dev/null 2>&1 \
33	&& command -v git)
34else
35GIT:=
36endif
37
38export KERNELVERSION      := 0.2.0
39
40ARCHDIR-$(CONFIG_LP_ARCH_ARM)     := arm
41ARCHDIR-$(CONFIG_LP_ARCH_ARM64)   := arm64
42ARCHDIR-$(CONFIG_LP_ARCH_X86)     := x86
43ARCHDIR-$(CONFIG_LP_ARCH_MOCK)    := mock
44DESTDIR ?= install
45
46real-target: lib
47
48classes-$(CONFIG_LP_PCI) += libpci
49classes-$(CONFIG_LP_LIBC) += libc
50classes-$(CONFIG_LP_CURSES) += libcurses
51classes-$(CONFIG_LP_PDCURSES) += libmenu libform libpanel
52classes-$(CONFIG_LP_CBFS) += libcbfs
53classes-$(CONFIG_LP_LZMA) += liblzma
54classes-$(CONFIG_LP_LZ4) += liblz4
55classes-$(CONFIG_LP_REMOTEGDB) += libgdb
56classes-$(CONFIG_LP_VBOOT_LIB) += vboot_fw
57classes-$(CONFIG_LP_VBOOT_LIB) += tlcl
58libraries := $(classes-y)
59
60subdirs-y := arch/$(ARCHDIR-y)
61subdirs-y += crypto libc drivers libpci gdb
62subdirs-$(CONFIG_LP_CURSES) += curses
63subdirs-$(CONFIG_LP_CBFS) += libcbfs
64subdirs-$(CONFIG_LP_LZMA) += liblzma
65subdirs-$(CONFIG_LP_LZ4) += liblz4
66subdirs-$(CONFIG_LP_VBOOT_LIB) += vboot
67
68INCLUDES := -Iinclude -Iinclude/$(ARCHDIR-y) -I$(obj)
69INCLUDES += -include include/kconfig.h
70INCLUDES += -include $(coreboottop)/src/commonlib/bsd/include/commonlib/bsd/compiler.h
71INCLUDES += -I$(coreboottop)/src/commonlib/bsd/include
72ifeq ($(CONFIG_LP_GPL),y)
73INCLUDES += -I$(coreboottop)/src/commonlib/include
74endif
75INCLUDES += -I$(VBOOT_SOURCE)/firmware/include
76
77CFLAGS += $(INCLUDES) -Os -pipe -nostdinc -ggdb3
78CFLAGS += -nostdlib -fno-builtin -ffreestanding -fomit-frame-pointer
79CFLAGS += -ffunction-sections -fdata-sections
80CFLAGS += -Wall -Wundef -Wstrict-prototypes -Wmissing-prototypes -Wvla
81CFLAGS += -Wwrite-strings -Wredundant-decls -Wno-trigraphs -Wimplicit-fallthrough
82CFLAGS += -Wstrict-aliasing -Wshadow -Werror
83
84ifeq ($(CONFIG_LP_LTO),y)
85CFLAGS += -flto
86endif
87
88# Some of the commonlib cbfs headers include vboot headers, so initialize the
89# submodule in case we are building a payload outside the main coreboot build
90forgetthis:=$(if $(GIT),$(shell git submodule update --init ../../3rdparty/vboot $(quiet_errors)))
91
92$(obj)/libpayload.config: $(DOTCONFIG)
93	cp $< $@
94
95$(obj)/libpayload-config.h: $(KCONFIG_AUTOHEADER) $(obj)/libpayload.config
96	cmp $@ $< 2>/dev/null || cp $< $@
97
98library-targets = $(addsuffix .a,$(addprefix $(obj)/,$(libraries))) $(obj)/libpayload.a
99lib: $$(library-targets) $(obj)/libpayload.ldscript
100
101extract_nth=$(word $(1), $(subst |, ,$(2)))
102
103#######################################################################
104# Add handler for special include files
105$(call add-special-class,includes)
106includes-handler= \
107		$(if $(wildcard $(1)$(call extract_nth,1,$(2))), \
108			$(eval includes += $(1)$(2)))
109
110$(obj)/libpayload.a: $(foreach class,$(libraries),$$($(class)-objs))
111	printf "    AR         $(subst $(CURDIR)/,,$(@))\n"
112	printf "create $@\n$(foreach objc,$(filter-out %.a,$^),addmod $(objc)\n)$(foreach lib,$(filter %.a,$^),addlib $(lib)\n)save\nend\n" | $(AR) -M
113
114$(obj)/%.a: $$(%-objs)
115	printf "    AR         $(subst $(CURDIR)/,,$(@))\n"
116	printf "create $@\n$(foreach objc,$(filter-out %.a,$^),addmod $(objc)\n)$(foreach lib,$(filter %.a,$^),addlib $(lib)\n)save\nend\n" | $(AR) -M
117
118$(obj)/libpayload.ldscript: arch/$(ARCHDIR-y)/libpayload.ldscript $(obj)/libpayload-config.h
119	@printf "  LDSCRIPT  $@\n"
120	$(CC) $(CFLAGS) $(EXTRA_CFLAGS) -E -P -x assembler-with-cpp -undef -o $@ $<
121
122install: real-target
123	printf "    INSTALL    $(DESTDIR)/libpayload/lib\n"
124	install -m 755 -d $(DESTDIR)/libpayload/lib
125	install -m 644 $(library-targets) $(DESTDIR)/libpayload/lib/
126	install -m 644 $(obj)/libpayload.ldscript $(DESTDIR)/libpayload/lib/
127	install -m 755 -d $(DESTDIR)/libpayload/lib/$(ARCHDIR-y)
128	printf "    INSTALL    $(DESTDIR)/libpayload/include\n"
129	install -m 755 -d $(DESTDIR)/libpayload/include
130	find include -type d -exec install -m755 -d $(DESTDIR)/libpayload/{} \;
131	find include -type f -exec install -m644 {} $(DESTDIR)/libpayload/{} \;
132	cd $(coreboottop)/src/commonlib/bsd && find include -type d -exec install -m755 -d $(abspath $(DESTDIR))/libpayload/{} \;
133	cd $(coreboottop)/src/commonlib/bsd && find include -type f -exec install -m644 {} $(abspath $(DESTDIR))/libpayload/{} \;
134ifeq ($(CONFIG_LP_GPL),y)
135	cd $(coreboottop)/src/commonlib && find include -type d -exec install -m755 -d $(abspath $(DESTDIR))/libpayload/{} \;
136	cd $(coreboottop)/src/commonlib && find include -type f -exec install -m644 {} $(abspath $(DESTDIR))/libpayload/{} \;
137endif
138	install -m 644 $(obj)/libpayload-config.h $(DESTDIR)/libpayload/include
139	$(foreach item,$(includes), \
140		install -m 755 -d $(DESTDIR)/libpayload/include/$(call extract_nth,2,$(item)); \
141		install -m 644 $(call extract_nth,1,$(item)) $(DESTDIR)/libpayload/include/$(call extract_nth,2,$(item)); )
142	printf "    INSTALL    $(DESTDIR)/libpayload/vboot\n"
143	install -m 755 -d $(DESTDIR)/libpayload/vboot
144	for file in `find $(VBOOT_SOURCE)/firmware/include \
145			  $(VBOOT_SOURCE)/firmware/2lib/include \
146			  -iname '*.h' -type f \
147			  | sed 's,$(VBOOT_SOURCE)/firmware/,,'`; do \
148		install -m 755 -d $(DESTDIR)/libpayload/vboot/$$(dirname $$file); \
149		install -m 644 $(VBOOT_SOURCE)/firmware/$$file $(DESTDIR)/libpayload/vboot/$$file ; \
150	done
151	printf "    INSTALL    $(DESTDIR)/libpayload/bin\n"
152	install -m 755 -d $(DESTDIR)/libpayload/bin
153	install -m 755 bin/lpgcc $(DESTDIR)/libpayload/bin
154	install -m 755 bin/lpas $(DESTDIR)/libpayload/bin
155	install -m 644 bin/lp.functions $(DESTDIR)/libpayload/bin
156	install -m 644 $(DOTCONFIG) $(DESTDIR)/libpayload/libpayload.config
157	install -m 755 $(xcompile) $(DESTDIR)/libpayload/libpayload.xcompile
158
159clean-for-update-target:
160	rm -f $(addsuffix .a,$(addprefix $(obj)/,$(libraries))) $(obj)/libpayload.a
161
162clean-target:
163prepare:
164
165junit.xml:
166	echo '<?xml version="1.0" encoding="utf-8"?><testsuite>' > $@.tmp
167	for i in $(filter-out %.old %.unit-tests,$(wildcard configs/*)); do \
168		$(MAKE) clean; \
169		echo "Building libpayload for $$i"; \
170		cp "$$i" junit_config; \
171		$(MAKE) olddefconfig DOTCONFIG=junit_config V=$(V) Q=$(Q) 2>/dev/null >/dev/null; \
172		echo "<testcase classname='libpayload' name='$$i'>" >> $@.tmp; \
173		$(MAKE) V=$(V) Q=$(Q) CONFIG_LP_CCACHE=$(CONFIG_LP_CCACHE) DOTCONFIG=junit_config >> $@.tmp.2 2>&1 && type="system-out" || type="failure"; \
174		if [ $$type = "failure" ]; then \
175			echo "<failure type='buildFailed'>" >> $@.tmp; \
176		else \
177			echo "<$$type>" >> $@.tmp; \
178		fi; \
179		echo '<![CDATA[' >> $@.tmp; \
180		cat $@.tmp.2 >> $@.tmp; \
181		echo "]]></$$type>" >>$@.tmp; \
182		rm -f $@.tmp.2; \
183		echo "</testcase>" >> $@.tmp; \
184	done
185	echo "</testsuite>" >> $@.tmp
186	echo "libpayload build complete, test results in $@"
187	mv $@.tmp $@
188
189test-configs:
190	for config in $(filter-out %.old %.unit-tests,$(wildcard configs/*)); do \
191		$(MAKE) clean; \
192		cp "$$config" test_config; \
193		echo "*** Making libpayload config $$config ***"; \
194		$(MAKE) olddefconfig DOTCONFIG=test_config V=$(V) Q=$(Q) ; \
195		$(MAKE) V=$(V) Q=$(Q) CONFIG_LP_CCACHE=$(CONFIG_LP_CCACHE) DOTCONFIG=test_config; \
196	done
197