2011-02-22 15:35:05 +01:00
##
## This file is part of the coreboot project.
##
## Copyright (C) 2011 secunet Security Networks AG
##
## 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; version 2 of the License.
##
## 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
##
#######################################################################
# misleadingly named, this is the coreboot version
2011-08-26 21:57:53 +02:00
export KERNELVERSION := $ ( shell if [ - d " $ (top)/.git " - a - f " `which git` " ]; then git describe -- dirty ; else echo unknown ; fi )
2011-02-22 15:35:05 +01:00
#######################################################################
# Basic component discovery
ARCHDIR - $ ( CONFIG_ARCH_X86 ) := x86
MAINBOARDDIR = $ ( call strip_quotes , $ ( CONFIG_MAINBOARD_DIR ))
export MAINBOARDDIR
2012-04-19 11:00:06 +02:00
## Final build results, which CBFSTOOL uses to create the final
## rom image file, are placed under $(objcbfs).
## These typically have suffixes .debug .elf .bin and .map
export objcbfs := $ ( obj ) / cbfs / $ ( CONFIG_CBFS_PREFIX )
## Based on the active configuration, Makefile conditionally collects
## the required assembly includes and saves them in a file.
## Such files that do not have a clear one-to-one relation to a source
## file under src/ are placed and built under $(objgenerated)
export objgenerated := $ ( obj ) / generated
2011-02-22 15:35:05 +01:00
#######################################################################
# root rule to resolve if in build mode (ie. configuration exists)
real - target : $ ( obj ) / config . h coreboot
2012-04-19 11:00:06 +02:00
coreboot : build - dirs $ ( obj ) / coreboot . rom
2011-02-22 15:35:05 +01:00
#######################################################################
# our phony targets
2012-04-19 11:00:06 +02:00
PHONY += clean - abuild coreboot lint lint - stable build - dirs
2011-02-22 15:35:05 +01:00
#######################################################################
# root source directories of coreboot
2011-12-01 16:49:43 +01:00
subdirs - y := src / lib src / boot src / console src / devices src / ec src / southbridge
subdirs - y += src / northbridge src / superio src / drivers src / cpu src / vendorcode
2012-03-09 10:53:52 +01:00
subdirs - y += util / cbfstool util / sconfig util / nvramtool
2011-02-22 15:35:05 +01:00
subdirs - y += src / arch / $ ( ARCHDIR - y )
subdirs - y += src / mainboard / $ ( MAINBOARDDIR )
2011-09-02 09:57:01 +02:00
subdirs - y += site - local
2011-02-22 15:35:05 +01:00
#######################################################################
# Add source classes and their build options
classes - y := ramstage romstage driver smm
romstage - c - ccopts :=- D__PRE_RAM__
2011-04-10 06:15:23 +02:00
romstage - S - ccopts :=- D__PRE_RAM__
2011-09-02 23:23:41 +02:00
ifeq ( $ ( CONFIG_TRACE ), y )
ramstage - c - ccopts := - finstrument - functions
endif
2012-04-30 21:06:10 +02:00
ifeq ( $ ( CONFIG_USE_BLOBS ), y )
forgetthis := $ ( shell git submodule update -- init -- checkout 3 rdparty )
else
ifeq ( $ ( CONFIG_REQUIRES_BLOB ), y )
$ ( error Your current configuration requires binary - only components , but you did not choose to use them )
endif
endif
2011-04-15 00:28:00 +02:00
smm - c - ccopts :=- D__SMM__
smm - S - ccopts :=- D__SMM__
2011-02-22 15:35:05 +01:00
2012-04-02 22:24:04 +02:00
# SMM TSEG base is dynamic
ifeq ( $ ( CONFIG_SMM_TSEG ), y )
smm - c - ccopts += - fpic
endif
2011-03-08 21:49:18 +01:00
ramstage - c - deps := $ $ ( OPTION_TABLE_H )
romstage - c - deps := $ $ ( OPTION_TABLE_H )
2011-02-22 15:35:05 +01:00
#######################################################################
# Add handler to compile ACPI's ASL
define ramstage - objs_asl_template
2011-03-29 11:01:10 +02:00
$ ( obj ) / $ ( 1 ) . ramstage . o : src / $ ( 1 ) . asl $ ( obj ) / config . h
2011-02-22 15:35:05 +01:00
@ printf " IASL $ $ (subst $ (top)/,, $ $ (@)) \n "
2012-02-16 18:43:25 +01:00
$ ( CC ) - x assembler - with - cpp - E - MMD - MT $ $ ( @ ) - D__ACPI__ - P - include $ ( abspath $ ( obj ) / config . h ) - I $ ( src ) - I $ ( src ) / include - I $ ( src ) / arch / $ ( ARCHDIR - y ) / include - I $ ( src ) / mainboard / $ ( MAINBOARDDIR ) $ $ < - o $ $ ( basename $ $ @ ) . asl
2011-08-09 00:07:50 +02:00
cd $ $ ( dir $ $ @ ); $ ( IASL ) - p $ $ ( notdir $ $ @ ) - tc $ $ ( notdir $ $ ( basename $ $ @ )) . asl
2011-06-01 21:54:16 +02:00
mv $ $ ( basename $ $ @ ) . hex $ $ ( basename $ $ @ ) . c
2011-02-22 15:35:05 +01:00
$ ( CC ) $ $ ( CFLAGS ) $ $ ( if $ $ ( subst dsdt ,, $ $ ( basename $ $ ( notdir $ ( 1 )))), - DAmlCode = AmlCode_ $ $ ( basename $ $ ( notdir $ ( 1 )))) - c - o $ $ @ $ $ ( basename $ $ @ ) . c
# keep %.o: %.c rule from catching the temporary .c file after a make clean
mv $ $ ( basename $ $ @ ) . c $ $ ( basename $ $ @ ) . hex
endef
2012-03-09 12:30:07 +01:00
#######################################################################
# Parse plaintext cmos defaults into binary format
# arg1: source file
# arg2: binary file name
cbfs - files - processor - nvramtool = \
$ ( eval $ ( 2 ) : $ ( 1 ) $ ( src ) / mainboard / $ ( MAINBOARDDIR ) / cmos . layout | $ ( objutil ) / nvramtool / nvramtool ; \
printf " CREATE $ (2) (from $ (1)) \n " ; $ ( objutil ) / nvramtool / nvramtool - y $ ( src ) / mainboard / $ ( MAINBOARDDIR ) / cmos . layout - D $ ( 2 ) . tmp - p $ ( 1 ) && mv $ ( 2 ) . tmp $ ( 2 ))
2012-04-30 23:15:17 +02:00
#######################################################################
# Link VSA binary to ELF-ish stage
# arg1: source file
# arg2: binary file name
cbfs - files - processor - vsa = \
$ ( eval $ ( 2 ) : $ ( 1 ) ; \
printf " CREATE $ (2) (from $ (1)) \n " ; $ ( OBJCOPY ) -- set - start 0x20 -- adjust - vma 0x60000 - I binary - O elf32 - i386 - B i386 $ ( 1 ) $ ( 2 ) . tmp && $ ( LD ) - m elf_i386 - e 0x60020 -- section - start . data = 0x60000 $ ( 2 ) . tmp - o $ ( 2 ))
2011-02-22 15:35:05 +01:00
#######################################################################
# Add handler for arbitrary files in CBFS
$ ( call add - special - class , cbfs - files )
cbfs - files - handler = \
2012-03-09 12:30:07 +01:00
$ ( eval tmp - cbfs - method := $ ( word 2 , $ ( subst : , , $ ( $ ( 2 ) - file )))) \
$ ( eval $ ( 2 ) - file := $ ( word 1 , $ ( subst : , , $ ( $ ( 2 ) - file )))) \
2011-02-22 15:35:05 +01:00
$ ( if $ ( wildcard $ ( 1 ) $ ( $ ( 2 ) - file )), \
$ ( eval tmp - cbfs - file := $ ( wildcard $ ( 1 ) $ ( $ ( 2 ) - file ))), \
$ ( eval tmp - cbfs - file := $ ( $ ( 2 ) - file ))) \
2012-03-09 12:30:07 +01:00
$ ( if $ ( tmp - cbfs - method ), \
$ ( eval tmp - old - cbfs - file := $ ( tmp - cbfs - file )) \
$ ( eval tmp - cbfs - file := $ ( shell mktemp $ ( obj ) / mainboard / $ ( MAINBOARDDIR ) / cbfs - file . XXXXXX ) . out ) \
$ ( call cbfs - files - processor - $ ( tmp - cbfs - method ), $ ( tmp - old - cbfs - file ), $ ( tmp - cbfs - file ))) \
2011-02-22 15:35:05 +01:00
$ ( eval cbfs - files += $ ( tmp - cbfs - file ) | $ ( 2 ) | $ ( $ ( 2 ) - type ) | $ ( $ ( 2 ) - position )) \
$ ( eval $ ( 2 ) - name := ) \
$ ( eval $ ( 2 ) - type := ) \
$ ( eval $ ( 2 ) - position := )
#######################################################################
# a variety of flags for our build
2011-05-02 21:53:04 +02:00
CBFS_COMPRESS_FLAG :=
ifeq ( $ ( CONFIG_COMPRESS_RAMSTAGE ), y )
2011-02-22 15:35:05 +01:00
CBFS_COMPRESS_FLAG := l
2011-05-02 21:53:04 +02:00
endif
2011-02-22 15:35:05 +01:00
CBFS_PAYLOAD_COMPRESS_FLAG :=
CBFS_PAYLOAD_COMPRESS_NAME := none
ifeq ( $ ( CONFIG_COMPRESSED_PAYLOAD_LZMA ), y )
CBFS_PAYLOAD_COMPRESS_FLAG := l
CBFS_PAYLOAD_COMPRESS_NAME := LZMA
endif
ifneq ( $ ( CONFIG_LOCALVERSION ), " " )
COREBOOT_EXTRA_VERSION := - $ ( call strip_quotes , $ ( CONFIG_LOCALVERSION ))
endif
INCLUDES := - Isrc - Isrc / include - I $ ( obj ) - Isrc / arch / $ ( ARCHDIR - y ) / include
INCLUDES += - Isrc / devices / oprom / include
# abspath is a workaround for romcc
INCLUDES += - include $ ( abspath $ ( obj ) / config . h )
2011-05-05 18:45:36 +02:00
CFLAGS = $ ( INCLUDES ) - Os - pipe - g - nostdinc
2011-02-22 15:35:05 +01:00
CFLAGS += - nostdlib - Wall - Wundef - Wstrict - prototypes - Wmissing - prototypes
CFLAGS += - Wwrite - strings - Wredundant - decls - Wno - trigraphs
CFLAGS += - Wstrict - aliasing - Wshadow
ifeq ( $ ( CONFIG_WARNINGS_ARE_ERRORS ), y )
CFLAGS += - Werror
endif
CFLAGS += - fno - common - ffreestanding - fno - builtin - fomit - frame - pointer
additional - dirs := $ ( objutil ) / cbfstool $ ( objutil ) / romcc $ ( objutil ) / options
#######################################################################
# generate build support files
$ ( obj ) / build . h : . xcompile
@ printf " GEN build.h \n "
rm - f $ ( obj ) / build . h
printf " /* build system definitions (autogenerated) */ \n " > $ ( obj ) / build . ht
printf " #ifndef __BUILD_H \n " >> $ ( obj ) / build . ht
printf " #define __BUILD_H \n \n " >> $ ( obj ) / build . ht
2011-03-17 08:47:49 +01:00
printf " #define COREBOOT_VERSION \" $ (KERNELVERSION) \" \n " >> $ ( obj ) / build . ht
2011-02-22 15:35:05 +01:00
printf " #define COREBOOT_EXTRA_VERSION \" $ (COREBOOT_EXTRA_VERSION) \" \n " >> $ ( obj ) / build . ht
printf " #define COREBOOT_BUILD \" `LANG= date` \" \n " >> $ ( obj ) / build . ht
2011-08-14 20:56:34 +02:00
printf " #define COREBOOT_DMI_DATE \" `LANG= date + " % m /% d /% Y " ` \" \n " >> $ ( obj ) / build . ht
2011-02-22 15:35:05 +01:00
printf " \n " >> $ ( obj ) / build . ht
printf " #define COREBOOT_COMPILER \" $ (shell LANG= $ (CC) --version | head -n1) \" \n " >> $ ( obj ) / build . ht
printf " #define COREBOOT_ASSEMBLER \" $ (shell LANG= $ (AS) --version | head -n1) \" \n " >> $ ( obj ) / build . ht
printf " #define COREBOOT_LINKER \" $ (shell LANG= $ (LD) --version | head -n1) \" \n " >> $ ( obj ) / build . ht
printf " #define COREBOOT_COMPILE_TIME \" `LANG= date +%T` \" \n " >> $ ( obj ) / build . ht
printf " #define COREBOOT_COMPILE_BY \" $ (subst \ ,@, $ (shell PATH= $ $PATH :/usr/ucb whoami)) \" \n " >> $ ( obj ) / build . ht
printf " #define COREBOOT_COMPILE_HOST \" $ (shell hostname -s 2>/dev/null) \" \n " >> $ ( obj ) / build . ht
printf " #define COREBOOT_COMPILE_DOMAIN \" $ (shell test `uname -s` = " Linux " && dnsdomainname || domainname 2>/dev/null) \" \n " >> $ ( obj ) / build . ht
printf " #endif \n " >> $ ( obj ) / build . ht
mv $ ( obj ) / build . ht $ ( obj ) / build . h
$ ( obj ) / ldoptions : $ ( obj ) / config . h
awk '/^#define ([^"])* ([^"])*$$/ {gsub("\\r","",$$3); print $$2 " = " $$3 ";";}' $ < > $ @
2012-04-19 11:00:06 +02:00
build - dirs :
mkdir - p $ ( objcbfs ) $ ( objgenerated )
2011-02-22 15:35:05 +01:00
#######################################################################
# Build the tools
CBFSTOOL := $ ( obj ) / cbfstool
$ ( CBFSTOOL ) : $ ( objutil ) / cbfstool / cbfstool
cp $ < $ @
_WINCHECK = $ ( shell uname - o 2 > / dev / null )
STACK =
ifeq ( $ ( _WINCHECK ), Msys )
STACK =- Wl , -- stack , 16384000
endif
ifeq ( $ ( _WINCHECK ), Cygwin )
STACK =- Wl , -- stack , 16384000
endif
ROMCC := $ ( objutil ) / romcc / romcc
$ ( ROMCC ) : $ ( top ) / util / romcc / romcc . c
@ printf " HOSTCC $ (subst $ (obj)/,, $ (@)) (this may take a while) \n "
@ # Note: Adding -O2 here might cause problems. For details see:
@ # http://www.coreboot.org/pipermail/coreboot/2010-February/055825.html
$ ( HOSTCC ) - g $ ( STACK ) - Wall - o $ @ $ <
#######################################################################
# needed objects that every mainboard uses
# Creation of these is architecture and mainboard independent
$ ( obj ) / mainboard / $ ( MAINBOARDDIR ) / static . c : $ ( src ) / mainboard / $ ( MAINBOARDDIR ) / devicetree . cb $ ( objutil ) / sconfig / sconfig
@ printf " SCONFIG $ (subst $ (src)/,, $ (<)) \n "
mkdir - p $ ( obj ) / mainboard / $ ( MAINBOARDDIR )
$ ( objutil ) / sconfig / sconfig $ ( MAINBOARDDIR ) $ ( obj ) / mainboard / $ ( MAINBOARDDIR )
ramstage - y += $ ( obj ) / mainboard / $ ( MAINBOARDDIR ) / static . c
$ ( objutil ) /%. o : $ ( objutil ) /%. c
@ printf " HOSTCC $ (subst $ (objutil)/,, $ (@)) \n "
$ ( HOSTCC ) - MMD - I $ ( subst $ ( objutil ) / , util / , $ ( dir $ < )) - I $ ( dir $ < ) $ ( HOSTCFLAGS ) - c - o $ @ $ <
2011-05-21 01:08:12 +02:00
$ ( obj ) /%. ramstage . o $ ( abspath $ ( obj )) /%. ramstage . o : $ ( obj ) /%. c $ ( obj ) / config . h $ ( OPTION_TABLE_H )
2011-02-22 15:35:05 +01:00
@ printf " CC $ (subst $ (obj)/,, $ (@)) \n "
$ ( CC ) - MMD $ ( CFLAGS ) - c - o $ @ $ <
#######################################################################
# Clean up rules
clean - abuild :
rm - rf coreboot - builds
clean - for - update - target :
rm - f $ ( obj ) / coreboot_ram * $ ( obj ) / coreboot . romstage $ ( obj ) / coreboot . pre * $ ( obj ) / coreboot . bootblock $ ( obj ) / coreboot . a
rm - rf $ ( obj ) / bootblock * $ ( obj ) / romstage * $ ( obj ) / location .*
rm - f $ ( obj ) / option_table .* $ ( obj ) / crt0 . S $ ( obj ) / ldscript
rm - f $ ( obj ) / mainboard / $ ( MAINBOARDDIR ) / static . c $ ( obj ) / mainboard / $ ( MAINBOARDDIR ) / config . py $ ( obj ) / mainboard / $ ( MAINBOARDDIR ) / static . dot
rm - f $ ( obj ) / mainboard / $ ( MAINBOARDDIR ) / crt0 . s $ ( obj ) / mainboard / $ ( MAINBOARDDIR ) / crt0 . disasm
rm - f $ ( obj ) / mainboard / $ ( MAINBOARDDIR ) / romstage . inc
rm - f $ ( obj ) / mainboard / $ ( MAINBOARDDIR ) / bootblock .* $ ( obj ) / mainboard / $ ( MAINBOARDDIR ) / dsdt .*
rm - f $ ( obj ) / cpu / x86 / smm / smm_bin . c $ ( obj ) / cpu / x86 / smm / smm .* $ ( obj ) / cpu / x86 / smm / smm
2012-03-20 00:32:33 +01:00
$ ( MAKE ) - C payloads / external / SeaBIOS - f Makefile . inc clean OUT = $ ( abspath $ ( obj )) HOSTCC = " $ (HOSTCC) " CC = " $ (CC) " LD = " $ (LD) "
2011-02-22 15:35:05 +01:00
clean - target :
rm - f $ ( obj ) / coreboot *
#######################################################################
# Development utilities
printcrt0s :
@ echo crt0s = $ ( crt0s )
@ echo ldscripts = $ ( ldscripts )
update :
dongle . py - c / dev / term / 1 $ ( obj ) / coreboot . rom EOF
2012-02-25 19:42:59 +01:00
lint lint - stable :
2011-02-22 15:35:05 +01:00
FAILED = 0 ; LINTLOG = `mktemp` ; \
2012-02-25 19:42:59 +01:00
for script in util / lint / $ @-* ; do \
2011-02-22 15:35:05 +01:00
echo ; echo `basename $$script` ; \
grep " ^# DESCR: " $$script | sed " s,.*DESCR: *,, " ; \
echo ======== ; \
$$script > $$LINTLOG ; \
2012-03-09 23:02:09 +01:00
if [ `cat $$LINTLOG | wc -l` - eq 0 ]; then \
2011-02-22 15:35:05 +01:00
printf " success \n \n " ; \
else \
echo test failed : ; \
cat $$LINTLOG ; \
rm - f $$LINTLOG ; \
FAILED = $ $ (( $$FAILED + 1 )); \
fi ; \
echo ======== ; \
done ; \
test $$FAILED - eq 0 || { echo " ERROR: $ $FAILED test(s) failed. " && exit 1 ; }; \
rm - f $$LINTLOG
2011-05-16 17:32:28 +02:00
2011-06-05 15:15:49 +02:00
gitconfig :
2012-02-25 19:52:45 +01:00
for hook in commit - msg pre - commit ; do if ! [ - x . git / hooks / $$hook ]; then cp util / gitconfig / $$hook . git / hooks / $$hook ; chmod + x . git / hooks / $$hook ; fi ; done
2011-06-05 15:15:49 +02:00
( git config -- global user . name >/ dev / null && git config -- global user . email >/ dev / null ) || ( printf 'Please configure your name and email in git:\n\n git config --global user.name "Your Name Comes Here"\n git config --global user.email your.email@example.com\n' ; exit 1 )
2011-05-16 17:32:28 +02:00
crossgcc : clean - for - update
2011-06-09 05:06:25 +02:00
$ ( MAKE ) - C util / crossgcc build - without - gdb
crosstools : clean - for - update
2011-05-16 17:32:28 +02:00
$ ( MAKE ) - C util / crossgcc build
crossgcc - clean : clean - for - update
$ ( MAKE ) - C util / crossgcc clean