X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=payloads%2Flibpayload%2FMakefile;h=b976baa1d1e7d08b5dced15ac37f25a19a417735;hb=b3db79e9965cb290615a02b324648bc64f805660;hp=959f968f83bc311e540130ab5184b871ae007c1c;hpb=3995593b6861e62b6a97207d5d6e28385be229bf;p=coreboot.git diff --git a/payloads/libpayload/Makefile b/payloads/libpayload/Makefile index 959f968f8..b976baa1d 100644 --- a/payloads/libpayload/Makefile +++ b/payloads/libpayload/Makefile @@ -1,7 +1,10 @@ ## -## This file is part of the libpayload project. +## This file is part of the coreboot project. ## ## Copyright (C) 2008 Advanced Micro Devices, Inc. +## Copyright (C) 2008 Uwe Hermann +## Copyright (C) 2009-2010 coresystems GmbH +## Copyright (C) 2011 secunet Security Networks AG ## ## Redistribution and use in source and binary forms, with or without ## modification, are permitted provided that the following conditions @@ -27,82 +30,250 @@ ## SUCH DAMAGE. ## -BASE_DIR=$(shell pwd) -KCONFIG_DIR=util/kconfig +ifeq ($(INNER_SCANBUILD),y) +CC_real:=$(CC) +endif -ifeq (.config, $(wildcard .config)) -dot-config := 1 -else -dot-config := 0 -config-targets := 1 +$(if $(wildcard .xcompile),,$(eval $(shell bash util/xcompile/xcompile > .xcompile))) +include .xcompile + +ifeq ($(INNER_SCANBUILD),y) +CC:=$(CC_real) +HOSTCC:=$(CC_real) --hostcc +HOSTCXX:=$(CC_real) --hostcxx endif -ifneq ($(filter textconfig oldconfig defconfig menuconfig,$(MAKECMDGOALS)),) -config-targets := 1 -dot-config := 0 +export top := $(CURDIR) +export src := src +export srck := $(top)/util/kconfig +export obj ?= build +export objutil ?= $(obj)/util +export objk := $(objutil)/kconfig + + +export KCONFIG_AUTOHEADER := $(obj)/config.h +export KCONFIG_AUTOCONFIG := $(obj)/auto.conf + +# directory containing the toplevel Makefile.inc +TOPLEVEL := . + +CONFIG_SHELL := sh +KBUILD_DEFCONFIG := configs/defconfig +UNAME_RELEASE := $(shell uname -r) +DOTCONFIG ?= .config +KCONFIG_CONFIG = $(DOTCONFIG) +export KCONFIG_CONFIG +HAVE_DOTCONFIG := $(wildcard $(DOTCONFIG)) +MAKEFLAGS += -rR --no-print-directory + +# Make is silent per default, but 'make V=1' will show all compiler calls. +Q:=@ +ifneq ($(V),1) +ifneq ($(Q),) +.SILENT: endif +endif + +CPP:= $(CC) -x assembler-with-cpp -DASSEMBLY -E +HOSTCC = gcc +HOSTCXX = g++ +HOSTCFLAGS := -I$(srck) -I$(objk) -g +HOSTCXXFLAGS := -I$(srck) -I$(objk) +LIBGCC_FILE_NAME := $(shell test -r `$(CC) -print-libgcc-file-name` && $(CC) -print-libgcc-file-name) -ifeq ($(dot-config),0) -all: .config +DOXYGEN := doxygen +DOXYGEN_OUTPUT_DIR := doxygen + +all: real-all + +# This include must come _before_ the pattern rules below! +# Order _does_ matter for pattern rules. +include util/kconfig/Makefile + +# Three cases where we don't need fully populated $(obj) lists: +# 1. when no .config exists +# 2. when make config (in any flavour) is run +# 3. when make distclean is run +# Don't waste time on reading all Makefile.incs in these cases +ifeq ($(strip $(HAVE_DOTCONFIG)),) +NOCOMPILE:=1 +endif +ifneq ($(MAKECMDGOALS),) +ifneq ($(filter %config distclean,$(MAKECMDGOALS)),) +NOCOMPILE:=1 +endif +endif + +ifeq ($(NOCOMPILE),1) +include $(TOPLEVEL)/Makefile.inc +real-all: config -.config: oldconfig - @echo "Configuration completed - type make to build libpayload" else --include .config + +include $(HAVE_DOTCONFIG) + +ifneq ($(INNER_SCANBUILD),y) +ifeq ($(CONFIG_COMPILER_LLVM_CLANG),y) +CC:=clang -m32 +HOSTCC:=clang endif +endif + +ifeq ($(CONFIG_CCACHE),y) +CCACHE:=$(word 1,$(wildcard $(addsuffix /ccache,$(subst :, ,$(PATH))))) +ifeq ($(CCACHE),) +$(error ccache selected, but not found in PATH) +endif +CCACHE:=CCACHE_COMPILERCHECK=content CCACHE_BASEDIR=$(top) $(CCACHE) +CC := $(CCACHE) $(CC) +HOSTCC := $(CCACHE) $(HOSTCC) +HOSTCXX := $(CCACHE) $(HOSTCXX) +ROMCC := $(CCACHE) $(ROMCC) +endif + +strip_quotes = $(subst ",,$(subst \",,$(1))) -PLATFORM-$(CONFIG_TARGET_I386) += i386/Makefile.inc -TARGETS-y := +# The primary target needs to be here before we include the +# other files -BUILD-y := crypto/Makefile.inc libc/Makefile.inc drivers/Makefile.inc -BUILD-$(CONFIG_TINYCURSES) += curses/Makefile.inc +ifeq ($(INNER_SCANBUILD),y) +CONFIG_SCANBUILD_ENABLE:= +endif + +ifeq ($(CONFIG_SCANBUILD_ENABLE),y) +ifneq ($(CONFIG_SCANBUILD_REPORT_LOCATION),) +CONFIG_SCANBUILD_REPORT_LOCATION:=-o $(CONFIG_SCANBUILD_REPORT_LOCATION) +endif +real-all: + echo '#!/bin/sh' > .ccwrap + echo 'CC="$(CC)"' >> .ccwrap + echo 'if [ "$$1" = "--hostcc" ]; then shift; CC="$(HOSTCC)"; fi' >> .ccwrap + echo 'if [ "$$1" = "--hostcxx" ]; then shift; CC="$(HOSTCXX)"; fi' >> .ccwrap + echo 'eval $$CC $$*' >> .ccwrap + chmod +x .ccwrap + scan-build $(CONFIG_SCANBUILD_REPORT_LOCATION) -analyze-headers --use-cc=$(top)/.ccwrap --use-c++=$(top)/.ccwrap $(MAKE) INNER_SCANBUILD=y +else +real-all: real-target +endif -include $(PLATFORM-y) $(BUILD-y) +# must come rather early +.SECONDEXPANSION: -INCLUDES := -I./include -INCLUDES += -I$(shell $(CC) -print-search-dirs | head -n 1 | cut -d' ' -f2)include -# TODO: Re-add -Os as soon as we find out why it caused problems. -CFLAGS := -Wall -Werror -fno-stack-protector -nostdinc $(INCLUDES) +$(obj)/config.h: + $(MAKE) oldconfig -libpayload.a: $(TARGETS-y) - $(AR) rc $@ $(TARGETS-y) +# Add a new class of source/object files to the build system +add-class= \ + $(eval $(1)-srcs:=) \ + $(eval $(1)-objs:=) \ + $(eval classes+=$(1)) -%.o: %.c - $(CC) -m32 $(CFLAGS) -c -o $@ $< +# Special classes are managed types with special behaviour +# On parse time, for each entry in variable $(1)-y +# a handler $(1)-handler is executed with the arguments: +# * $(1): directory the parser is in +# * $(2): current entry +add-special-class= \ + $(eval $(1):=) \ + $(eval special-classes+=$(1)) -%.o: %.S - $(AS) --32 -o $@ $< +# Clean -y variables, include Makefile.inc +# Add paths to files in X-y to X-srcs +# Add subdirs-y to subdirs +includemakefiles= \ + $(foreach class,classes subdirs $(classes) $(special-classes), $(eval $(class)-y:=)) \ + $(eval -include $(1)) \ + $(foreach class,$(classes-y), $(call add-class,$(class))) \ + $(foreach class,$(classes), \ + $(eval $(class)-srcs+= \ + $$(subst $(top)/,, \ + $$(abspath $$(addprefix $(dir $(1)),$$($(class)-y)))))) \ + $(foreach special,$(special-classes), \ + $(foreach item,$($(special)-y), $(call $(special)-handler,$(dir $(1)),$(item)))) \ + $(eval subdirs+=$$(subst $(CURDIR)/,,$$(abspath $$(addprefix $(dir $(1)),$$(subdirs-y))))) -clean: - @ rm -f $(TARGETS-y) - @ rm -f libpayload.a +# For each path in $(subdirs) call includemakefiles +# Repeat until subdirs is empty +evaluate_subdirs= \ + $(eval cursubdirs:=$(subdirs)) \ + $(eval subdirs:=) \ + $(foreach dir,$(cursubdirs), \ + $(eval $(call includemakefiles,$(dir)/Makefile.inc))) \ + $(if $(subdirs),$(eval $(call evaluate_subdirs))) -distclean: clean - @ make -C $(KCONFIG_DIR) clean - @ rm -f $(KCONFIG_DIR)/lxdialog/lxdialog - @ rm -f .config .kconfig.d include/autoconf.h - -ifeq ($(config-targets),1) +# collect all object files eligible for building +subdirs:=$(TOPLEVEL) +$(eval $(call evaluate_subdirs)) -$(KCONFIG_DIR)/conf: - make -C $(KCONFIG_DIR) conf +src-to-obj=$(addsuffix .$(1).o, $(basename $(addprefix $(obj)/, $($(1)-srcs)))) +$(foreach class,$(classes),$(eval $(class)-objs:=$(call src-to-obj,$(class)))) -$(KCONFIG_DIR)/mconf: - make -C $(KCONFIG_DIR) mconf +allsrcs:=$(foreach var, $(addsuffix -srcs,$(classes)), $($(var))) +allobjs:=$(foreach var, $(addsuffix -objs,$(classes)), $($(var))) +alldirs:=$(sort $(abspath $(dir $(allobjs)))) -$(KCONFIG_DIR)/lxdialog/lxdialog: - make -C $(KCONFIG_DIR)/lxdialog lxdialog +# macro to define template macros that are used by use_template macro +define create_cc_template +# $1 obj class +# $2 source suffix (c, S) +# $3 additional compiler flags +# $4 additional dependencies +ifn$(EMPTY)def $(1)-objs_$(2)_template +de$(EMPTY)fine $(1)-objs_$(2)_template +$(obj)/$$(1).$(1).o: $$(1).$(2) $(obj)/config.h $(4) + @printf " CC $$$$(subst $$$$(obj)/,,$$$$(@))\n" + $(CC) $(3) -MMD $$$$(CFLAGS) -c -o $$$$@ $$$$< +en$(EMPTY)def +end$(EMPTY)if +endef -textconfig: $(KCONFIG_DIR)/conf - @$(KCONFIG_DIR)/conf $(BASE_DIR)/Config.in +filetypes-of-class=$(subst .,,$(sort $(suffix $($(1)-srcs)))) +$(foreach class,$(classes), \ + $(foreach type,$(call filetypes-of-class,$(class)), \ + $(eval $(call create_cc_template,$(class),$(type),$($(class)-$(type)-ccopts),$($(class)-$(type)-deps))))) -oldconfig: $(KCONFIG_DIR)/conf - @$(KCONFIG_DIR)/conf -o $(BASE_DIR)/Config.in +foreach-src=$(foreach file,$($(1)-srcs),$(eval $(call $(1)-objs_$(subst .,,$(suffix $(file)))_template,$(basename $(file))))) +$(eval $(foreach class,$(classes),$(call foreach-src,$(class)))) -defconfig: $(KCONFIG_DIR)/conf - @$(KCONFIG_DIR)/conf -d $(BASE_DIR)/Config.in +DEPENDENCIES = $(allobjs:.o=.d) +-include $(DEPENDENCIES) -menuconfig: $(KCONFIG_DIR)/lxdialog/lxdialog $(KCONFIG_DIR)/mconf - @$(KCONFIG_DIR)/mconf $(BASE_DIR)/Config.in +printall: + @$(foreach class,$(classes),echo $(class)-objs:=$($(class)-objs); ) + @echo alldirs:=$(alldirs) + @echo allsrcs=$(allsrcs) + @echo DEPENDENCIES=$(DEPENDENCIES) + @echo LIBGCC_FILE_NAME=$(LIBGCC_FILE_NAME) + @$(foreach class,$(special-classes),echo $(class):='$($(class))'; ) endif + +$(shell mkdir -p $(obj) $(objutil)/kconfig/lxdialog $(additional-dirs) $(alldirs)) + +cscope: + cscope -bR + +doxy: doxygen +doxygen: + $(DOXYGEN) Doxyfile + +doxyclean: doxygen-clean +doxygen-clean: + rm -rf $(DOXYGEN_OUTPUT_DIR) + +clean-for-update: doxygen-clean clean-for-update-target + rm -f $(allobjs) .xcompile + rm -f $(DEPENDENCIES) + rmdir -p $(alldirs) 2>/dev/null >/dev/null || true + +clean: clean-for-update clean-target + rm -f .ccwrap + +clean-cscope: + rm -f cscope.out + +distclean: clean-cscope + rm -rf $(obj) + rm -f .config .config.old ..config.tmp .kconfig.d .tmpconfig* .ccwrap .xcompile + +.PHONY: $(PHONY) clean clean-cscope cscope distclean doxygen doxy .xcompile