GCC_CFLAGS_<arch> contains only the flags that are GCC specific, iow. flags that don't work with Clang. CFLAGS_<arch>, OTOH, contains all flags that should be used and auto- matically includes GCC_CFLAGS_<arch> if GCC is selected. Change-Id: I5ec15f169d51c7a32ca86e54a98a2ce0e3b51e6d Signed-off-by: Nico Huber <nico.h@gmx.de> Reviewed-on: https://review.coreboot.org/c/coreboot/+/62248 Reviewed-by: Thomas Heijligen <src@posteo.de> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
		
			
				
	
	
		
			161 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
			
		
		
	
	
			161 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
| # 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  = $(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)),)
 | |
| 
 | |
| -include $(LIBPAYLOAD_DOTCONFIG)
 | |
| 
 | |
| 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 += CONFIG_=CONFIG_LP_
 | |
| LIBPAYLOAD_OPTS += $(if $(CCACHE),CONFIG_LP_CCACHE=y)
 | |
| 
 | |
| ifneq ($(LIBPAYLOAD_DEFCONFIG),)
 | |
| $(LIBPAYLOAD_DOTCONFIG): $(LIBPAYLOAD_DEFCONFIG)
 | |
| 	$(MAKE) -C $(LIBPAYLOAD_SRC) $(LIBPAYLOAD_OPTS) \
 | |
| 		KBUILD_DEFCONFIG=$(LIBPAYLOAD_DEFCONFIG) defconfig
 | |
| endif
 | |
| 
 | |
| $(LIBPAYLOAD_CONFIG_H): $(LIBPAYLOAD_DOTCONFIG)
 | |
| 	$(MAKE) -C $(LIBPAYLOAD_SRC) $(LIBPAYLOAD_OPTS) $(LIBPAYLOAD_CONFIG_H)
 | |
| 
 | |
| force-relay:
 | |
| 
 | |
| lp-%: force-relay
 | |
| 	$(MAKE) -C $(LIBPAYLOAD_SRC) $(LIBPAYLOAD_OPTS) $*
 | |
| 
 | |
| $(LIBPAYLOAD): force-relay | $(LIBPAYLOAD_CONFIG_H)
 | |
| 	$(MAKE) -C $(LIBPAYLOAD_SRC) $(LIBPAYLOAD_OPTS)
 | |
| 
 | |
| $(shell mkdir -p $(sort $(dir $(OBJS))))
 | |
| 
 | |
| .PHONY: force-relay
 | |
| 
 | |
| 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
 |