summaryrefslogtreecommitdiffstats
path: root/Makefile
blob: ae1c2f6f0363d81f34beae657405b89c3fb30429 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
##
## This file is part of the coreboot project.
##
## coreboot build system Lbuild
##
## Copyright (C) 2007 coresystems GmbH
## (Written by Stefan Reinauer <stepan@coresystems.de> 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     := gcc
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

include $(shell $(src)/util/xcompile/xcompile > $(src)/.xcompile || \
	{ echo "complete\\ toolchain" && rm -f $(src)/.xcompile && exit 1; }; echo $(src)/.xcompile)

ifeq ($(strip $(have_dotconfig)),)

all:
	$(Q)printf "Please run make menuconfig, xconfig or config first.\n"

else

include $(src)/.config

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