diff options
-rw-r--r-- | payloads/libpayload/Makefile.payload | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/payloads/libpayload/Makefile.payload b/payloads/libpayload/Makefile.payload new file mode 100644 index 0000000000..a8a46650e5 --- /dev/null +++ b/payloads/libpayload/Makefile.payload @@ -0,0 +1,157 @@ +# SPDX-License-Identifier: BSD-3-Clause + +# +# This file is meant to be included by in-tree payloads +# to provide default targets for incremental builds. +# +# Variables with file names and directory overrides have +# to be defined in advance for proper dependency tracking. +# Then, include this file. e.g +# +# obj := output +# OBJS := $(obj)/payload.o +# TARGET := $(obj)/payload.elf +# include ../path/to/libpayload/Makefile.payload +# + +# Find relative path to libpayload (where this Makefile resides). +LIBPAYLOAD_SRC := $(dir $(lastword $(MAKEFILE_LIST))) +LIBPAYLOAD_SRC := $(patsubst %/,%,$(LIBPAYLOAD_SRC)) + +# Build dir and config for libpayload. Need absolute +# paths to pass to libpayload's sub-make. +LIBPAYLOAD_OBJ ?= $(CURDIR)/libpayload +LIBPAYLOAD := $(LIBPAYLOAD_OBJ)/libpayload.a +LIBPAYLOAD_CONFIG_H := $(LIBPAYLOAD_OBJ)/libpayload-config.h +LIBPAYLOAD_DOTCONFIG ?= $(CURDIR)/.lp.config +LIBPAYLOAD_DEFCONFIG ?= $(CURDIR)/$(LIBPAYLOAD_SRC)/configs/defconfig + +# Some default dependencies for all targets: +DEFAULT_DEPS := Makefile $(lastword $(MAKEFILE_LIST)) +DEFAULT_DEPS += $(PAYLOAD_DEPS) + +obj ?= build + +ARCH ?= +OBJS ?= +CCACHE ?= + +CFLAGS = $(GCC_CFLAGS_$(ARCH)) +CFLAGS += -Os -ffreestanding +CFLAGS += -Wall -Wextra -Wmissing-prototypes -Wvla -Werror + +STRIP ?= debug + +$(TARGET): + +# Make is silent per default, but `make V=1` will show all calls. +Q:=@ +ifneq ($(V),1) +ifneq ($(Q),) +.SILENT: +MAKEFLAGS += -s +endif +endif +export V + +ifeq ($(filter %clean,$(MAKECMDGOALS)),) + +xcompile := $(obj)/xcompile +xcompile_script := $(LIBPAYLOAD_SRC)/../../util/xcompile/xcompile + +# In addition to the dependency below, create the file if it doesn't exist +# to silence warnings about a file that would be generated anyway. +$(if $(wildcard $(xcompile)),,$(shell \ + mkdir -p $(dir $(xcompile)) && \ + $(xcompile_script) $(XGCCPATH) > $(xcompile) || rm -f $(xcompile))) + +$(xcompile): $(xcompile_script) + $< $(XGCCPATH) > $@ + +include $(xcompile) + +ifneq ($(XCOMPILE_COMPLETE),1) +$(shell rm -f $(XCOMPILE_COMPLETE)) +$(error $(xcompile) deleted because it's invalid. \ + Restarting the build should fix that, or explain the problem.) +endif + +# `lpgcc` in in-tree mode: +LPGCC = CC="$(CCACHE) $(GCC_CC_$(ARCH))" +LPGCC += _OBJ="$(LIBPAYLOAD_OBJ)" +LPGCC += $(LIBPAYLOAD_SRC)/bin/lpgcc + +LPAS = AS="$(AS_$(ARCH))" +LPAS += $(LIBPAYLOAD_SRC)/bin/lpas + +OBJCOPY = $(OBJCOPY_$(ARCH)) + +$(obj)/%.bin: $(OBJS) $(LIBPAYLOAD) $(DEFAULT_DEPS) + @printf " LPGCC $(subst $(obj)/,,$@)\n" + $(LPGCC) $(CFLAGS) -o $@ $(OBJS) + +$(obj)/%.map: $(obj)/%.bin + @printf " SYMS $(subst $(obj)/,,$@)\n" + $(NM_$(ARCH)) -n $< > $@ + +$(obj)/%.debug: $(obj)/%.bin + @printf " DEBUG $(subst $(obj)/,,$@)\n" + $(OBJCOPY) --only-keep-debug $< $@ + +.PRECIOUS: $(obj)/%.debug + +$(obj)/%.elf: $(obj)/%.bin $(obj)/%.debug + @printf " STRIP $(subst $(obj)/,,$@)\n" + $(OBJCOPY) --strip-$(STRIP) $< $@ + $(OBJCOPY) --add-gnu-debuglink=$(obj)/$*.debug $@ + +$(obj)/%.o: %.c $(LIBPAYLOAD_CONFIG_H) $(DEFAULT_DEPS) + @printf " LPGCC $(subst $(obj)/,,$@)\n" + $(LPGCC) -MMD $(CFLAGS) -c $< -o $@ + +$(obj)/%.S.o: %.S $(LIBPAYLOAD_CONFIG_H) $(DEFAULT_DEPS) + @printf " LPAS $(subst $(obj)/,,$@)\n" + $(LPAS) $< -o $@ + +-include $(OBJS:.o=.d) + +.PRECIOUS: $(OBJS) + +LIBPAYLOAD_OPTS := obj="$(LIBPAYLOAD_OBJ)" +LIBPAYLOAD_OPTS += DOTCONFIG="$(LIBPAYLOAD_DOTCONFIG)" +LIBPAYLOAD_OPTS += $(if $(CCACHE),CONFIG_LP_CCACHE=y) + +defconfig: lp-defconfig +lp-defconfig: $(LIBPAYLOAD_DOTCONFIG) +$(LIBPAYLOAD_DOTCONFIG): $(LIBPAYLOAD_DEFCONFIG) | $(PAYLOAD_DEPS) + $(MAKE) -C $(LIBPAYLOAD_SRC) $(LIBPAYLOAD_OPTS) \ + KBUILD_DEFCONFIG=$(LIBPAYLOAD_DEFCONFIG) defconfig + +$(LIBPAYLOAD_CONFIG_H): $(LIBPAYLOAD_DOTCONFIG) + $(MAKE) -C $(LIBPAYLOAD_SRC) $(LIBPAYLOAD_OPTS) $(LIBPAYLOAD_CONFIG_H) + +oldconfig: lp-oldconfig +lp-oldconfig: + [ ! -f $(LIBPAYLOAD_DOTCONFIG) ] || \ + $(MAKE) -C $(LIBPAYLOAD_SRC) $(LIBPAYLOAD_OPTS) oldconfig + +$(LIBPAYLOAD): lp-defconfig | $(LIBPAYLOAD_CONFIG_H) + $(MAKE) -C $(LIBPAYLOAD_SRC) $(LIBPAYLOAD_OPTS) + +$(shell mkdir -p $(sort $(dir $(OBJS)))) + +.PHONY: oldconfig lp-oldconfig defconfig lp-defconfig + +else # %clean,$(MAKECMDGOALS) + +default-payload-clean: + rm -rf $(obj) $(LIBPAYLOAD_OBJ) +clean: default-payload-clean + +default-payload-distclean: clean + rm -f $(LIBPAYLOAD_DOTCONFIG) $(LIBPAYLOAD_DOTCONFIG).old +distclean: default-payload-distclean + +.PHONY: default-payload-clean clean default-payload-distclean distclean + +endif |