-
Notifications
You must be signed in to change notification settings - Fork 0
/
Makefile
182 lines (154 loc) · 4.84 KB
/
Makefile
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
171
172
173
174
175
176
177
178
179
180
181
#
# arcOS
# Copyright (C) 2017 Jose Abreu <[email protected]>
# Version information
ARCOS_VERSION = 0
ARCOS_SUBVERSION = 1
# Variables
srcdir := .
outfile := $(srcdir)/arcOS
outtmp := $(srcdir)/.arcOS.tmp
outtmp-with-syms := $(srcdir)/.arcOS.tmp.2
outmap := $(srcdir)/.arcOS.map.tmp
finalmap := $(srcdir)/arcOS.map
export srcdir
# Tools
autoconf-bin = $(srcdir)/tools/autoconf/autoconf
autoconf-in = $(srcdir)/.config
autoconf-out = $(srcdir)/include/generated/autoconf.h
ksyms-bin = $(srcdir)/tools/ksyms/ksyms
ksyms-in = $(outmap)
ksyms-out = $(srcdir)/.ksyms.c
ksyms-obj-out = $(srcdir)/.ksyms.o
# Outputed objects in tools folder (to clean)
tools-bins = $(autoconf-bin) $(ksyms-bin)
tools-bins := $(strip $(tools-bins))
# Outputed objects in root folder (to clean)
outfiles = $(outfile) $(outtmp) $(outtmp-with-syms) $(outmap) $(ksyms-out)
outfiles += $(ksyms-obj-out) $(finalmap)
outfiles := $(strip $(outfiles))
# Flags
MAKEFLAGS += -rR --include-dir=$(CURDIR) --no-print-directory --quiet
CFLAGS = -Wall -Wmissing-prototypes -Wstrict-prototypes -Wno-unused-value \
-Wno-unused-parameter -Wno-missing-field-initializers -std=gnu89
CFLAGS += -DARCOS_VERSION=$(ARCOS_VERSION) \
-DARCOS_SUBVERSION=$(ARCOS_SUBVERSION)
CFLAGS += -I$(srcdir)/include -include $(autoconf-out)
LDFLAGS = -Map $(finalmap)
HOSTCFLAGS = -g -Wall
export MAKEFLAGS
export CFLAGS
export LDFLAGS
export HOSTCFLAGS
# Executables
LD = $(patsubst "%",%,$(CONFIG_CROSS_COMPILE))ld
CC = $(patsubst "%",%,$(CONFIG_CROSS_COMPILE))gcc
AR = $(patsubst "%",%,$(CONFIG_CROSS_COMPILE))ar
NM = $(patsubst "%",%,$(CONFIG_CROSS_COMPILE))nm
LIBGCC = $(shell $(CC) --print-libgcc-file-name)
HOSTLD = ld
HOSTCC = gcc
export LD
export CC
export AR
export HOSTLD
export HOSTCC
# Build options
include $(srcdir)/.config
LDFLAGS += -T arch/$(patsubst "%",%,$(CONFIG_ARCH))/kernel/arch-linker.lds
CFLAGS += -I$(srcdir)/arch/$(patsubst "%",%,$(CONFIG_ARCH))/include
# Arch flags
-include arch/$(patsubst "%",%,$(CONFIG_ARCH))/Makefile.flags
CFLAGS += $(cflags-y)
# Build dependent gcc flags
ifdef CONFIG_FRAME_POINTER
CFLAGS += -fno-omit-frame-pointer -fno-optimize-sibling-calls
else
CFLAGS += -fomit-frame-pointer
endif
export LDFLAGS
export CFLAGS
# Directories
arch-y := arch/
kernel-y := kernel/
mm-y := mm/
drivers-y := drivers/
apps-$(CONFIG_APPS) := apps/
lib-y := lib/
tools-y := tools/
build-dirs := $(patsubst %/, %, $(filter %/, $(arch-y) $(kernel-y) \
$(mm-y) $(drivers-y) $(apps-y) $(lib-y)))
tools-dirs := $(patsubst %/, %, $(filter %/, $(tools-y)))
all-dirs := $(sort $(build-dirs) $(patsubst %/,%,$(filter %/, $(arch-) \
$(kernel-) $(mm-) $(drivers-) $(apps-) $(lib-))))
clean-dirs := $(addprefix _clean_, $(all-dirs) $(tools-y))
# Files
arch-y := $(patsubst %/, %/built-in.o, $(arch-y))
drivers-y := $(patsubst %/, %/built-in.o, $(drivers-y))
kernel-y := $(patsubst %/, %/built-in.o, $(kernel-y))
mm-y := $(patsubst %/, %/built-in.o, $(mm-y))
apps-y := $(patsubst %/, %/built-in.o, $(apps-y))
lib-y := $(patsubst %/, %/lib.a, $(lib-y))
lib-y += $(LIBGCC)
all-y := $(arch-y) $(kernel-y) $(mm-y) $(drivers-y) $(apps-y) $(lib-y)
# Compilation rules
PHONY := all
all: info prepare build prelink dosyms link
PHONY += info
info:
@echo 'Compiling using gcc: $(CC)'
@echo 'Compiling using ld: $(LD)'
@echo 'Using libgcc: $(LIBGCC)'
PHONY += prepare
prepare: $(tools-dirs)
$(autoconf-bin) $(autoconf-in) $(autoconf-out)
PHONY += $(tools-dirs)
$(tools-dirs):
@$(MAKE) -f $(srcdir)/build/Makefile.tools dir=$@
PHONY += build
build: $(build-dirs)
PHONY += $(build-dirs)
$(build-dirs):
@$(MAKE) -f $(srcdir)/build/Makefile.build dir=$@
PHONY += prelink
prelink:
@echo ' LD $(outtmp)'
@$(LD) $(LDFLAGS) -o $(outtmp) $(strip $(all-y))
@echo ' MAP $(outtmp)'
@$(NM) -n $(outtmp) > $(outmap)
PHONY += dosyms
dosyms:
@echo ' SYMS $(outtmp)'
$(ksyms-bin) $(ksyms-in) $(ksyms-out)
@echo ' CC $(ksyms-out)'
@$(CC) $(CFLAGS) -c -o $(ksyms-obj-out) $(ksyms-out)
@echo ' LD $(outtmp-with-syms)'
@$(LD) $(LDFLAGS) -o $(outtmp-with-syms) $(strip $(all-y)) $(ksyms-obj-out)
@echo ' MAP $(outtmp-with-syms)'
@$(NM) -n $(outtmp-with-syms) > $(outmap)
@echo ' SYMS $(outtmp-with-syms)'
@$(ksyms-bin) $(ksyms-in) $(ksyms-out)
@echo ' CC $(ksyms-out)'
@$(CC) $(CFLAGS) -c -o $(ksyms-obj-out) $(ksyms-out)
PHONY += link
link:
@echo ' LD $(outfile)'
@$(LD) $(LDFLAGS) -o $(outfile) $(strip $(all-y)) $(ksyms-obj-out)
PHONY += clean
clean: $(clean-dirs)
$(if $(wildcard $(tools-bins)), \
@rm $(tools-bins))
$(if $(wildcard $(outfiles)), \
@rm $(wildcard $(outfiles)))
PHONY += clean-dirs
$(clean-dirs):
@$(MAKE) -f $(srcdir)/build/Makefile.clean dir=$(patsubst _clean_%,%,$@)
PHONY += help
help:
@echo 'arcOS make targets'
@echo '------------------'
@echo ' all - Make kernel and drivers'
@echo ' clean - Remove generated files'
@echo ''
@echo 'For more information see README.txt'
.PHONY: $(PHONY)