summaryrefslogtreecommitdiffstats
path: root/src/Makefile
diff options
context:
space:
mode:
Diffstat (limited to 'src/Makefile')
-rw-r--r--src/Makefile152
1 files changed, 141 insertions, 11 deletions
diff --git a/src/Makefile b/src/Makefile
index afb1618e..7d7d76d4 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -1,15 +1,145 @@
-# Override ARCH here or on the command line
-# ARCH=i386
-# Additionally you can supply extra compilation arguments, e.g. for x86_64
-# EXTRA_CFLAGS=-m32
-# EXTRA_ASFLAGS=--32
-# EXTRA_LDFLAGS=-m elf_i386
+# Initialise variables that get added to throughout the various Makefiles
+#
+MAKEDEPS := Makefile .toolcheck
+SRCDIRS :=
+SRCS :=
+NON_AUTO_SRCS :=
+DRIVERS :=
+ROMS :=
+MEDIA :=
+NON_AUTO_MEDIA :=
+
+# Grab the central Config file.
+#
+MAKEDEPS += Config
+include Config
+
+# If no architecture is specified in Config or on the command-line,
+# use that of the build machine.
+#
ifndef ARCH
-ARCH:=$(shell uname -m | sed -e s,i[3456789]86,i386,)
+ARCH := $(shell uname -m | sed -e s,i[3456789]86,i386,)
endif
-MAKEDEPS:=
-SUFFIXES:=
-include Config
+# Drag in architecture-specific Config
+#
+MAKEDEPS += arch/$(ARCH)/Config
include arch/$(ARCH)/Config
-include Makefile.main
+
+# If invoked with no build target, print out a helpfully suggestive
+# message.
+#
+noargs : blib
+ @echo '===================================================='
+ @echo 'No target specified. To specify a target, do: '
+ @echo
+ @echo ' $(MAKE) bin/<rom-name>.<output-format> '
+ @echo
+ @echo 'where <output-format> is one of [z]{$(MEDIA) }'
+ @echo
+ @echo 'or: '
+ @echo
+ @echo ' $(MAKE) all<output-format>s'
+ @echo
+ @echo 'to generate all possible images of format <output-format>'
+ @echo
+ @echo 'For example, '
+ @echo
+ @echo ' make allzroms '
+ @echo
+ @echo 'will generate all possible .zrom (rom burnable) images, and'
+ @echo
+ @echo ' make allzdsks'
+ @echo
+ @echo 'will generate all possible .zdsk (bootable floppy) images, or'
+ @echo
+ @echo '===================================================='
+ @exit 1
+
+# Locations of utilities
+#
+HOST_CC ?= gcc
+CPP ?= gcc -E -Wp,-Wall
+RM ?= rm -f
+TOUCH ?= touch
+MKDIR ?= mkdir
+PERL ?= /usr/bin/perl
+CC ?= $(CROSS_COMPILE)gcc
+AS ?= $(CROSS_COMPILE)as
+LD ?= $(CROSS_COMPILE)ld
+SIZE ?= $(CROSS_COMPILE)size
+AR ?= $(CROSS_COMPILE)ar
+RANLIB ?= $(CROSS_COMPILE)ranlib
+OBJCOPY ?= $(CROSS_COMPILE)objcopy
+PARSEROM ?= $(PERL) ./util/parserom.pl
+MAKEROM ?= $(PERL) ./util/makerom.pl
+NRV2B ?= ./util/nrv2b
+
+# Location to place generated files
+#
+BIN ?= bin
+
+# Library containing all compiled objects
+BLIB = $(BIN)/blib.a
+
+# Common flags
+#
+CFLAGS += -I include -I arch/$(ARCH)/include -DARCH=$(ARCH)
+CFLAGS += -Os -ffreestanding
+CFLAGS += -Wall -W -Wno-format
+CFLAGS += $(EXTRA_CFLAGS)
+ASFLAGS += $(EXTRA_ASFLAGS)
+LDFLAGS += $(EXTRA_LDFLAGS)
+
+# CFLAGS for specific object types
+#
+CFLAGS_c +=
+CFLAGS_S += -DASSEMBLY
+
+# CFLAGS for specific object files. You can define
+# e.g. CFLAGS_rtl8139, and have those flags automatically used when
+# compiling bin/rtl8139.o.
+#
+OBJ_CFLAGS = $(CFLAGS_$(basename $(@F))) \
+ -DOBJECT=$(subst -,_,$(basename $(@F)))
+$(BIN)/%.flags :
+ @echo $(OBJ_CFLAGS)
+
+# Rules for specific object types.
+#
+COMPILE_c = $(CC) $(CFLAGS) $(CFLAGS_c) $(OBJ_CFLAGS)
+RULE_c = $(COMPILE_c) -c $< -o $@
+RULE_c_to_s = $(COMPILE_c) -S -c $< -o $@
+RULE_c_to_c = $(COMPILE_c) -E -c $< > $@
+
+PREPROCESS_S = $(CPP) $(CFLAGS) $(CFLAGS_S) $(OBJ_CFLAGS)
+ASSEMBLE_S = $(AS) $(ASFLAGS)
+RULE_S = $(PREPROCESS_S) $< | $(ASSEMBLE_S) -o $@
+RULE_S_to_s = $(PREPROCESS_S) $< > $@
+
+DEBUG_TARGETS += c s
+
+# SRCDIRS lists all directories containing source files.
+#
+SRCDIRS += core drivers/net drivers/disk
+
+# NON_AUTO_SRCS lists files that are excluded from the normal
+# automatic build system.
+#
+NON_AUTO_SRCS += core/elf_loader.c
+
+# Rules for finalising files. TGT_MAKEROM_FLAGS is defined as part of
+# the automatic build system and varies by target; it includes the
+# "-p 0x1234,0x5678" string to set the PCI IDs.
+#
+FINALISE_rom = $(MAKEROM) $(MAKEROM_FLAGS) $(TGT_MAKEROM_FLAGS) \
+ -i$(IDENT) $@
+
+# Drag in architecture-specific Makefile
+#
+MAKEDEPS += arch/$(ARCH)/Makefile
+include arch/$(ARCH)/Makefile
+
+# Drag in the automatic build system and other housekeeping functions
+MAKEDEPS += Makefile.housekeeping
+include Makefile.housekeeping