## ## This file is part of the coreboot project. ## ## coreboot build system Lbuild ## ## Copyright (C) 2007 coresystems GmbH ## (Written by Stefan Reinauer for coresystems GmbH) ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ## VERSION = 3 PATCHLEVEL = 0 # Set the sublevel version string from the highest revision number # of the checked out files. SUBLEVEL := "$(shell svnversion -cn . \ | sed -e "s/.*://" -e "s/\([0-9]*\).*/\1/")" have_dotconfig := $(wildcard .config) src := $(shell pwd) obj := $(shell pwd)/build export src obj # Do not print "Entering directory ...". MAKEFLAGS += --no-print-directory CC ?= gcc CFLAGS := -Os -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \ -Werror-implicit-function-declaration -Wstrict-aliasing \ -fno-common -ffreestanding -fno-builtin -fomit-frame-pointer \ -mpreferred-stack-boundary=2 -mregparm=3 -pipe # FIXME: Does stack boundary or regparm break the code on real hardware? HOSTCC := $(CC) HOSTCXX := g++ HOSTCFLAGS := -Wall -Wstrict-prototypes -g -fomit-frame-pointer \ -Wno-unused -Wno-sign-compare LEX := flex LYX := lyx DOXYGEN := doxygen DOXYGEN_OUTPUT_DIR := doxygen # Make is silent per default, but 'make V=1' will show all compiler calls. ifneq ($(V),1) Q := @ endif KERNELVERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL) export KERNELVERSION ifeq ($(strip $(have_dotconfig)),) all: $(Q)printf "Please run make menuconfig, xconfig or config first.\n" else include $(src)/.config include $(shell scanbuild=$(CONFIG_SCAN_BUILD) $(src)/util/xcompile/xcompile > $(src)/.xcompile || \ { echo "complete\\ toolchain" && rm -f $(src)/.xcompile && exit 1; }; echo $(src)/.xcompile) ifneq ($(CONFIG_LOCALVERSION),"") COREBOOT_EXTRA_VERSION := -$(shell echo $(CONFIG_LOCALVERSION)) endif all: prepare prepare2 $(obj)/coreboot.rom $(Q)printf " DONE\n" ARCH:=$(shell echo $(CONFIG_ARCH)) MAINBOARDDIR=$(shell echo $(CONFIG_MAINBOARD_DIR)) export MAINBOARDDIR COREBOOTINCLUDE := -I$(src) -Iinclude \ -I$(src)/include \ -I$(src)/include/arch/$(ARCH)/ \ -I$(src)/mainboard/$(MAINBOARDDIR)/ \ -include $(obj)/config.h CC := $(CC_$(ARCH)) AS := $(AS_$(ARCH)) LD := $(LD_$(ARCH)) NM := $(NM_$(ARCH)) OBJCOPY := $(OBJCOPY_$(ARCH)) OBJDUMP := $(OBJDUMP_$(ARCH)) READELF := $(READELF_$(ARCH)) AR := $(AR_$(ARCH)) CFLAGS += $(CFLAGS_$(ARCH)) CPPFLAGS := $(COREBOOTINCLUDE) CFLAGS += $(COREBOOTINCLUDE) # Note: This _must_ come after 'CC' is set for the second time in this # Makefile (see above), otherwise the build would break if 'gcc' isn't # the compiler actually used for the build (e.g. on cross compiler setups). CFLAGS += -nostdinc -isystem `$(CC) -print-file-name=include` include lib/Makefile include device/Makefile include mainboard/$(MAINBOARDDIR)/Makefile include Rules.make include northbridge/*/*/Makefile include southbridge/*/*/Makefile include superio/*/*/Makefile include arch/$(ARCH)/Makefile endif include util/Makefile doc: $(Q)$(LYX) -e pdf doc/design/newboot.lyx doxy: doxygen doxygen: $(Q)$(DOXYGEN) util/doxygen/Doxyfile.coreboot prepare: $(Q)mkdir -p $(obj) # FIXME: If .config changed, a rebuild is required. prepare2: $(Q)printf " CP $(subst $(shell pwd)/,,$(obj)/config.h)\n" $(Q)cp $(src)/.tmpconfig.h $(obj)/config.h $(Q)printf " GEN $(subst $(shell pwd)/,,$(obj)/build.h)\n" $(Q)printf "#define COREBOOT_VERSION \"$(KERNELVERSION)\"\n" > $(obj)/build.h $(Q)printf "#define COREBOOT_EXTRA_VERSION \"$(COREBOOT_EXTRA_VERSION)\"\n" >> $(obj)/build.h $(Q)printf "#define COREBOOT_BUILD \"`LANG= date`\"\n" >> $(obj)/build.h $(Q)printf "\n" >> $(obj)/build.h $(Q)printf "#define COREBOOT_COMPILER \"$(shell LANG= $(CC) --version | head -n1)\"\n" >> $(obj)/build.h $(Q)printf "#define COREBOOT_ASSEMBLER \"$(shell LANG= $(AS) --version | head -n1)\"\n" >> $(obj)/build.h $(Q)printf "#define COREBOOT_LINKER \"$(shell LANG= $(LD) --version | head -n1)\"\n" >> $(obj)/build.h $(Q)printf "#define COREBOOT_COMPILE_TIME \"`LANG= date +%T`\"\n" >> $(obj)/build.h $(Q)printf "#define COREBOOT_COMPILE_BY \"$(shell PATH=$$PATH:/usr/ucb whoami)\"\n" >> $(obj)/build.h $(Q)printf "#define COREBOOT_COMPILE_HOST \"$(shell hostname)\"\n" >> $(obj)/build.h $(Q)printf "#define COREBOOT_COMPILE_DOMAIN \"$(shell test `uname -s` = "Linux" && dnsdomainname || domainname)\"\n" >> $(obj)/build.h clean: $(Q)printf " CLEAN $(subst $(shell pwd)/,,$(obj))\n" $(Q)rm -rf $(obj) $(Q)printf " CLEAN $(subst $(shell pwd)/,,$(DOXYGEN_OUTPUT_DIR))\n" $(Q)rm -rf $(DOXYGEN_OUTPUT_DIR) $(Q)printf " CLEAN doc/design/newboot.pdf\n" $(Q)rm -f doc/design/newboot.pdf distclean: clean $(Q)printf " CLEAN .kconfig.d .config .tmpconfig.h .config.old .xcompile\n" $(Q)rm -f .kconfig.d .config .tmpconfig.h .config.old .xcompile %.o: %.c $(Q)printf " CC $(subst $(shell pwd)/,,$(@))\n" $(Q)$(CC) $(CFLAGS) -o $@ -c $< .PHONY: doc doxygen depends prepare prepare2 clean distclean