Benutzer:Jidder/Makefile

Aus Lowlevel
Wechseln zu:Navigation,

Ich habe mal eine Makefile geschrieben, die das olle buildmk.sh ersetzen soll. Ziel meiner Makefile ist den Kompiliervorgang zu beschleunigen, und dabei trotzdem möglichst flexibel und einfach zu handhaben wie buildmk.sh zu sein.

Die Makefile ist so gebaut, dass am Quelltextbaum kaum Änderungen nötig sind. Ein paar Sachen, die man allerdings beachten muss:

  • .nobuild-Dateien müssen jetzt folgenden Inhalt haben:
$(eval $(NOBUILD))
  • Zur Zeit (Revision 485) müssen .nobuild-Dateien in den Verzeichnissen src/modules/c, src/modules/cpp, src/modules/keyboard, src/modules/pas, src/modules/vga, und src/modules/videodriver liegen.
  • Die Datei src/modules/lib/lostio/include/lostio_internal.h muss nach src/modules/lib/lostio/lostio_internal.h verschoben werden.
  • Die Dateien in src/modules/lib/init/zlib/ müssen nach src/modules/lib/init/ verschoben werden.
  • tests.mod heisst jetzt automatisch testlib.mod, die alte explizite Benennung stimmt nicht mit dem Verzeichnisnamen überein.

Ich steig schon lange nicht mehr wirklich durch LOST durch. Wenn jemand bessere Funktionalitätstests der Binaries machen kann als testlib.mod auszuführen, wäre das praktisch.

Diese Makefile erfordert mindestens GNU Make Version 3.80. (MinGW-Nutzer haben nur Version 3.79.1. Workaround: Das von Make von cygwin mit dem zusätzlichen Parameter CC=gcc)

Usage

  • Datei namens Makefile.Jidder in trunk erstellen
  • Untenstehenden Kram reinkopieren
  • make -f Makefile.Jidder
  • Den Reflex einen Kaffee zu holen unterdrücken, denn es dauert gar nicht so lang
  • make internal_image (oder die Dateien in build irgendwie anders auf ein Image popeln.)


Todo

  • Module c und cpp wieder unterstützen
  • Dependencies

      1. Experimentelle Makefile von Jidder. Bei Problemen: pech :P ^^
  1. .nobuild-Dateien müssen folgendes enthalten: $(eval $(NOBUILD))

LDFLAGS_KERNEL := -T src/kernel/src/kernel.ld LDFLAGS_MODULES := -m elf_i386 -Ttext=0x40000000

CPPFLAGS += -Isrc/include -Isrc/include/arch/i386

  1. Alle Module im Verzeichnis src/modules

MODULES := $(filter-out include lib,$(notdir $(wildcard src/modules/*)))

all: lib kernel modules

clean: -rm -f $(ALL_LIBS) build/lost.krn $(ALL_MODULES) $(ALL_OBJS)


      1. Eine Regel für .asm-Dateien, da es keine eingebaute gibt

NASM := nasm NASMFLAGS := -f elf

%.o: %.asm $(NASM) $(NASMFLAGS) $< -o $@


      1. Hilfsfunktionen/-makros
  1. Unterstützte Dateiendungen

EXTENSIONS := .asm .S .c .cpp

  1. $(call SOURCE_FILES,dir) gibt alle Quelltext-Dateien im Verzeichnis dir zurück

SOURCE_FILES = $(wildcard $(addprefix $(1)/*,$(EXTENSIONS)))

  1. $(call OBJECT_FILES,foo.c bar.asm baz.cpp) gibt "foo.o bar.o baz.o" zurück

OBJECT_FILES = $(addsuffix .o,$(basename $(1)))

  1. $(call SOURCE_FILES,dir/*) gibt alle Quelltext-Dateien in den Unterverzeichnissen von dir zurück

SOURCE_FILES_WILDCARD = $(foreach dir,$(wildcard $(1)),$(call SOURCE_FILES,$(dir)))


      1. Kernel

kernel: build/lost.krn

KERNEL_SRC = $(call SOURCE_FILES,src/kernel/src) $(call SOURCE_FILES_WILDCARD,src/kernel/src/*) KERNEL_OBJS = $(call OBJECT_FILES,$(KERNEL_SRC)) ALL_OBJS += $(KERNEL_OBJS) build/lost.krn: $(KERNEL_OBJS) src/lib/library.a ld -o $@ $(LDFLAGS_KERNEL) $^ build/lost.krn: CPPFLAGS += -Isrc/kernel/include


      1. Module

modules: $(MODULE_LIBS) $(MODULES:%=build/%.mod) modules: CPPFLAGS += -Isrc/modules/include

define MODULE_template NOBUILD = build/$(1).mod: nobuild ; $(1)_SRC := $(call SOURCE_FILES,src/modules/$(1)) $(1)_OBJS := $$(call OBJECT_FILES,$$($(1)_SRC)) build/$(1).mod: CPPFLAGS += -Isrc/modules/$(1)/include build/$(1).mod: $$($(1)_OBJS) src/modules/lib/library.a ld $(LDFLAGS_MODULES) $$^ -o $$@ -include src/modules/$(1)/.nobuild ALL_OBJS += $$($(1)_OBJS) ALL_MODULES += build/$(1).mod endef

$(foreach module,$(MODULES),$(eval $(call MODULE_template,$(module))))

nobuild:


      1. Libraries

lib: src/lib/library.a src/modules/lib/library.a

      1. Library die in den Kernel und die Module gelinkt wird

LIB_SRC = $(call SOURCE_FILES,src/lib) $(call SOURCE_FILES_WILDCARD,src/lib/*) LIB_OBJS = $(call OBJECT_FILES,$(LIB_SRC)) ALL_OBJS += $(LIB_OBJS) ALL_LIBS += src/lib/library.a src/lib/library.a: $(LIB_OBJS) $(AR) rs $@ $^

      1. Library die nur in die Module gelinkt wird

MODULES_LIB_SRC = $(call SOURCE_FILES,src/modules/lib) $(call SOURCE_FILES_WILDCARD,src/modules/lib/*) $(call SOURCE_FILES_WILDCARD,src/modules/lib/*/*) MODULES_LIB_OBJS = $(call OBJECT_FILES,$(MODULES_LIB_SRC)) ALL_OBJS += $(MODULES_LIB_OBJS) ALL_LIBS += src/modules/lib/library.a src/modules/lib/library.a: $(MODULES_LIB_OBJS) $(LIB_OBJS) $(AR) rs $@ $^ src/modules/lib/library.a: CPPFLAGS += -Isrc/modules/include