Benutzer:Jidder/Makefile

Aus Lowlevel
Version vom 9. Juni 2007, 19:21 Uhr von Jidder (Diskussion | Beiträge)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu:Navigation,

Ich habe mal eine Makefile geschrieben, die das olle buildmk.sh ersetzen soll.

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 müssen .nobuild-Dateien im Verzeichnis src/modules/c, src/modules/cpp und src/modules/pas liegen, da um diese einfach so zu unterstützen zur Zeit zuviele spezielle Anpassungen notwendig sind.
  • Die Datei src/modules/lib/lostio/include/lostio_internal.h muss nach src/modules/lib/lostio/lostio_internal.h verschoben werden, selbiger Grund wie oben.
  • 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.)

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