From 9cf092d32e345c1f22e3eb3a5f15cf232d5ce396 Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Mon, 10 Sep 2012 23:36:15 +0200 Subject: [PATCH] Use cross compiler in build system. --- Makefile | 136 +++++++++++++++++++++++---------------- bench/.gitignore | 2 + bench/Makefile | 39 +++++++---- compiler.mak | 65 +++++++++++++++++++ crosscompilemakefile.mak | 36 ----------- dirs.mak | 119 ++++++++++++++++++++++++++++++++++ games/.gitignore | 2 + games/Makefile | 39 +++++++---- libmaxsi/Makefile | 109 ++++++++++++++++--------------- sortix/Makefile | 93 +++++++++++++------------- utils/.gitignore | 24 +++++++ utils/Makefile | 39 +++++++---- version.mak | 1 + 13 files changed, 469 insertions(+), 235 deletions(-) create mode 100644 compiler.mak delete mode 100644 crosscompilemakefile.mak create mode 100644 dirs.mak create mode 100644 version.mak diff --git a/Makefile b/Makefile index 711dfd0e..495854cb 100644 --- a/Makefile +++ b/Makefile @@ -1,36 +1,48 @@ -BITS:=$(shell getconf LONG_BIT) -ifndef CPU - ifeq ($(BITS),64) - CPU:=x64 - else - CPU:=x86 - endif - MFLAGS:=$(MFLAGS) CPU=$(CPU) -endif +include compiler.mak +include version.mak -ifndef O - O=-O2 - MFLAGS:=$(MFLAGS) 0=$(O) +ifneq ($(BUILD_LIBC),0) + MODULES:=$(MODULES) libmaxsi endif -ifndef BENCH - BENCH:=1 +ALLMODULES:=$(ALLMODULES) libmaxsi + +ifneq ($(BUILD_GAMES),0) + MODULES:=$(MODULES) games endif -ifeq ($(BENCH),1) - EXTRAMODULES:=$(EXTRAMODULES) bench +ALLMODULES:=$(ALLMODULES) games + +ifneq ($(BUILD_MKINITRD),0) + MODULES:=$(MODULES) mkinitrd endif +ALLMODULES:=$(ALLMODULES) mkinitrd + +ifneq ($(BUILD_UTILS),0) + MODULES:=$(MODULES) utils +endif +ALLMODULES:=$(ALLMODULES) utils + +ifneq ($(BUILD_BENCH),0) + MODULES:=$(MODULES) bench +endif +ALLMODULES:=$(ALLMODULES) bench + +ifneq ($(BUILD_KERNEL),0) + MODULES:=$(MODULES) sortix +endif +ALLMODULES:=$(ALLMODULES) sortix ifndef SYSROOT - SYSROOT:=$(shell pwd)/sysroot - MFLAGS:=$(MFLAGS) SYSROOT=$(SYSROOT) + SYSROOT:=$(shell pwd)/sysroot + MFLAGS:=$(MFLAGS) SYSROOT=$(SYSROOT) endif -REMOTE=192.168.2.6 -REMOTEUSER=sortie -REMOTECOPYDIR:=/home/$(REMOTEUSER)/Desktop/MaxsiOS -MODULES=libmaxsi games mkinitrd utils $(EXTRAMODULES) sortix -ALLMODULES=libmaxsi games mkinitrd utils bench sortix +ifndef PREFIXNAME + PREFIXNAME:=/ + MFLAGS:=$(MFLAGS) PREFIXNAME=$(PREFIXNAME) +endif + +include dirs.mak -VERSION=0.8dev DEBNAME:=sortix_$(VERSION)_$(CPU) DEBSRCNAME:=sortix_$(VERSION) DEBDIR:=builds/$(DEBNAME) @@ -39,42 +51,63 @@ DEBFILE:=builds/$(DEBNAME).deb PACKAGENAME:=sortix ISODIR:=builds/$(DEBNAME)-iso ISOFILE:=builds/$(DEBNAME).iso -INITRDDIR:=initrd -INITRD=sortix/sortix.initrd +INITRD=$(INSTALLBOOTDIR)/$(HOST)/sortix.initrd MFLAGS:=$(MFLAGS) VERSION=$(VERSION) all: $(INITRD) -suball: - (for D in $(MODULES); do ($(MAKE) all $(MFLAGS) --directory $$D && $(MAKE) install $(MFLAGS) --directory $$D) || exit $?; done) +.PHONY: all suball sysroot-base-headers sysroot-fsh clean distclean \ + everything everything-all-archs all-archs linecount install uninstall \ + deb debfile debsource iso run-virtualbox run-virtualbox-debug \ + clean-builds clean-sysroot -sysroot-base-headers: - (for D in libmaxsi sortix; do ($(MAKE) install-headers $(MFLAGS) --directory $$D) || exit $?; done) +suball: sysroot-base-headers + (for D in $(MODULES); do ($(MAKE) all $(MFLAGS) --directory $$D && $(MAKE) install $(MFLAGS) --directory $$D) || exit $$?; done) + +sysroot-base-headers: sysroot-fsh + (for D in libmaxsi sortix; do ($(MAKE) install-headers $(MFLAGS) --directory $$D) || exit $$?; done) + +sysroot-fsh: + mkdir -p "$(SYSROOT)" + for DIRNAME in bin boot lib include; do (\ + mkdir -p "$(SYSROOT)/$$DIRNAME" &&\ + mkdir -p "$(SYSROOT)/$$DIRNAME/$(HOST)" \ + ) || exit $$?; done; + if [ ! -e "$(SYSROOT)/usr" ]; then ln -s . "$(SYSROOT)/usr"; fi clean: - rm -rf $(SYSROOT) - rm -f $(INITRD) - rm -f initrd/* - (for D in $(ALLMODULES); do $(MAKE) clean $(MFLAGS) --directory $$D || exit $?; done) + rm -f "$(INITRD)" + rm -f sortix/sortix.initrd # Backwards compatibility, not needed for newer builds. + rm -f initrd/* # Backwards compatibility, not needed for newer builds. + (for D in $(ALLMODULES); do $(MAKE) clean $(MFLAGS) --directory $$D || exit $$?; done) -distclean: clean cleanbuilds - -cleanbuilds: +clean-builds: rm -rf builds/ rm -f sortix.iso +clean-sysroot: + rm -rf "$(SYSROOT)" + +distclean: clean clean-builds clean-sysroot + everything: all deb iso everything-all-archs: $(MAKE) clean $(MFLAGS) - $(MAKE) everything $(MFLAGS) CPU=x86 + $(MAKE) everything $(MFLAGS) HOST=i486-sortix $(MAKE) clean $(MFLAGS) - $(MAKE) everything $(MFLAGS) CPU=x64 + $(MAKE) everything $(MFLAGS) HOST=x86_64-sortix + +all-archs: + $(MAKE) clean $(MFLAGS) + $(MAKE) all $(MFLAGS) HOST=i486-sortix + $(MAKE) clean $(MFLAGS) + $(MAKE) all $(MFLAGS) HOST=x86_64-sortix # Initializing RamDisk $(INITRD): suball - mkinitrd/mkinitrd initrd -o $(INITRD) + mkinitrd/mkinitrd $(SYSROOT)/bin/$(HOST) -o $(INITRD) # Statistics linecount: @@ -92,18 +125,6 @@ install: all uninstall: rm -f /boot/sortix.bin rm -f /etc/grub.d/42_sortix - update-grub - -# Remote machine - -install-remote: all - scp -r ./ $(REMOTE):$(REMOTECOPYDIR) - scp sortix/sortix.bin root@$(REMOTE):/boot - scp $(INITRD) root@$(REMOTE):/boot - ssh root@$(REMOTE) "init 6" - -uninstall-remote: - ssh root@$(REMOTE) "rm /boot/sortix.bin" # Packaging @@ -114,7 +135,7 @@ debfile: all mkdir -p $(DEBDIR) mkdir -p $(DEBDIR)/boot cp sortix/sortix.bin $(DEBDIR)/boot - cp sortix/sortix.initrd $(DEBDIR)/boot + cp $(INITRD) $(DEBDIR)/boot expr \( `stat --printf="%s" $(DEBDIR)/boot/sortix.bin` \ + `stat --printf="%s" $(DEBDIR)/boot/sortix.initrd` \ + 1023 \) / 1024 > $(DEBDIR)/boot/deb.size @@ -137,14 +158,14 @@ debsource: all rm -rf $(DEBSRCDIR) mkdir -p $(DEBSRCDIR) for D in `ls | grep -v builds | grep -v sysroot`; do cp -r $$D $(DEBSRCDIR); done - (cd $(DEBSRCDIR) && make distclean) + (cd $(DEBSRCDIR) && make distclean SYSROOT=$(shell pwd)/$(DEBSRCDIR)/sysroot) rm -rf $(DEBSRCDIR)/sysroot (cd builds && tar cfz $(DEBSRCNAME)-src.tar.gz $(DEBSRCNAME)-src) rm -rf $(DEBSRCDIR) # Bootable images -iso: all debsource +$(ISOFILE): all debsource rm -rf $(ISODIR) mkdir -p builds mkdir -p $(ISODIR) @@ -155,8 +176,10 @@ iso: all debsource grub-mkrescue -o $(ISOFILE) $(ISODIR) rm -rf $(ISODIR) +iso: $(ISOFILE) + sortix.iso: iso - cp $(ISOFILE) sortix.iso + cp $(ISOFILE) $@ # Virtualization run-virtualbox: sortix.iso @@ -165,4 +188,3 @@ run-virtualbox: sortix.iso run-virtualbox-debug: sortix.iso virtualbox --debug --start-running --startvm sortix - diff --git a/bench/.gitignore b/bench/.gitignore index 5761abcf..9f31a783 100644 --- a/bench/.gitignore +++ b/bench/.gitignore @@ -1 +1,3 @@ *.o +benchctxswitch +benchsyscall diff --git a/bench/Makefile b/bench/Makefile index 9f50151b..673530c2 100644 --- a/bench/Makefile +++ b/bench/Makefile @@ -1,29 +1,40 @@ -# Set up variables such that we can easily cross-compile. -OSROOT=.. -include ../crosscompilemakefile.mak +include ../compiler.mak +include ../version.mak +include ../dirs.mak -CXXFLAGS:=$(CXXFLAGS) -Wall -Wextra +ifndef OPTLEVEL + OPTLEVEL=-O2 +endif -INITRDDIR:=../initrd -LOCALBINARIES:=\ +ifndef CXXFLAGS + CXXFLAGS:=$(OPTLEVEL) +endif + +CXXFLAGS:=$(CXXFLAGS) -Wall -Wextra -fno-exceptions -fno-rtti + +BINARIES:=\ benchsyscall \ benchctxswitch \ -BINARIES:=$(addprefix $(INITRDDIR)/,$(LOCALBINARIES)) +all: $(BINARIES) -all: install +.PHONY: all install uninstall clean -install: $(LOCALBINARIES) - cp $(LOCALBINARIES) $(INITRDDIR) - rm -f $(LOCALBINARIES) +install: all + mkdir -p $(INSTALLBINDIR)/$(HOST) + install $(BINARIES) $(INSTALLBINDIR)/$(HOST) + +uninstall: + for FILE in $(INSTALLBINDIR); do \ + rm -f $(INSTALLBINDIR)/$(HOST)/$$FILE; \ + done %: %.cpp - $(CXX) $(CPPFLAGS) $(CXXFLAGS) -O2 -c $< -o $@.o - $(LD) $(LDFLAGS) $@.o -o $@ $(LIBS) + $(CXX) $(CPPFLAGS) $(CXXFLAGS) $< -o $@ sh: mxsh cp $< $@ clean: - rm -f $(BINARIES) $(LOCALBINARIES) *.o + rm -f $(BINARIES) *.o diff --git a/compiler.mak b/compiler.mak new file mode 100644 index 00000000..a1dacefa --- /dev/null +++ b/compiler.mak @@ -0,0 +1,65 @@ +ifndef BITS + BITS:=$(shell getconf LONG_BIT) +endif + +ifndef HOST + ifeq ($(BITS),64) + HOST:=x86_64-sortix + else + HOST:=i486-sortix + endif + MFLAGS:=$(MFLAGS) HOST=$(HOST) +endif + +ifeq ($(HOST),i486-sortix) + CPU:=x86 +endif +ifeq ($(HOST),x86_64-sortix) + CPU:=x64 +endif + +ifndef BUILDCC + BUILDCC:=gcc +endif +ifndef BUILDCXX + BUILDCXX:=g++ +endif +ifndef BUILDAR + BUILDAR:=ar +endif +ifndef BUILDAS + BUILDAS:=as +endif +ifndef BUILDLD + BUILDAS:=ld +endif +ifndef BUILDOBJCOPY + BUILDOBJCOPY:=objcopy +endif + +ifndef HOSTCC + HOSTCC:=$(HOST)-gcc +endif +ifndef HOSTCXX + HOSTCXX:=$(HOST)-g++ +endif +ifndef HOSTAR + HOSTAR:=$(HOST)-ar +endif +ifndef HOSTAS + HOSTAS:=$(HOST)-as +endif +ifndef HOSTLD + HOSTLD:=$(HOST)-ld +endif +ifndef HOSTOBJCOPY + HOSTOBJCOPY:=$(HOST)-objcopy +endif + +CC:=$(HOSTCC) +CXX:=$(HOSTCXX) +AR=:$(HOSTAR) +AS:=$(HOSTAS) +LD:=$(HOSTLD) +OBJCOPY:=$(HOSTOBJCOPY) + diff --git a/crosscompilemakefile.mak b/crosscompilemakefile.mak deleted file mode 100644 index 89d4fabb..00000000 --- a/crosscompilemakefile.mak +++ /dev/null @@ -1,36 +0,0 @@ -ifndef CPU - CPU=x86 -endif - -ifeq ($(CPU),x86) - X86FAMILY=1 - CPUDEFINES=-DPLATFORM_X86 - CPUFLAGS=-m32 - CPULDFLAGS=-melf_i386 -endif - -ifeq ($(CPU),x64) - X86FAMILY=1 - CPUDEFINES=-DPLATFORM_X64 - CPUFLAGS=-m64 - CPULDFLAGS=-melf_x86_64 -endif - -LIBMAXSIROOT:=$(OSROOT)/libmaxsi -SORTIXROOT:=$(OSROOT)/sortix - -LIBC:=$(LIBMAXSIROOT)/start.o $(LIBMAXSIROOT)/libc.a -LIBS:=$(LIBC) - -CPPFLAGS:=$(CPUDEFINES) -U_GNU_SOURCE -Ulinux -Dsortix -FLAGS:=-nostdinc -nostdlib -nostartfiles -nodefaultlibs -INCLUDES:=-I $(LIBMAXSIROOT)/preproc -I $(SORTIXROOT)/include - -LD:=ld -LDFLAGS:=$(CPULDFLAGS) -CC:=gcc -CFLAGS:=$(CPUFLAGS) $(FLAGS) $(INCLUDES) -CXX:=g++ -CXXFLAGS:=$(CPUFLAGS) $(FLAGS) $(INCLUDES) -fno-exceptions -fno-rtti - - diff --git a/dirs.mak b/dirs.mak new file mode 100644 index 00000000..e6a1b6ef --- /dev/null +++ b/dirs.mak @@ -0,0 +1,119 @@ +ifndef SYSROOT + SYSROOT:=/ +endif + +# The locations from where the program will be invoked/run on the host machine. +# For instance, on Sortix programs are normally run from the /bin union +# directory, even though they are actually installed somewhere else. +ifndef RUNPREFIXNAME + RUNPREFIXNAME:=/ +endif +RUNPREFIXNAME:=$(shell echo "$(RUNPREFIXNAME)" | sed 's/\/\/*/\//g') + +ifndef RUNPREFIX + RUNPREFIX:=/$(RUNPREFIXNAME) +endif +RUNPREFIX:=$(shell echo "$(RUNPREFIX)" | sed 's/\/\/*/\//g') + +ifndef RUNBINDIR + RUNBINDIR:=$(RUNPREFIX)/bin +endif +RUNBINDIR:=$(shell echo "$(RUNBINDIR)" | sed 's/\/\/*/\//g') + +ifndef RUNLIBDIR + RUNLIBDIR:=$(RUNPREFIX)/lib +endif +RUNLIBDIR:=$(shell echo "$(RUNLIBDIR)" | sed 's/\/\/*/\//g') + +ifndef RUNINCLUDEDIR + RUNINCLUDEDIR:=$(RUNPREFIX)/include +endif +RUNINCLUDEDIR:=$(shell echo "$(RUNINCLUDEDIR)" | sed 's/\/\/*/\//g') + +ifndef RUNBOOTDIR + RUNBOOTDIR:=$(RUNPREFIX)/boot +endif +RUNBOOTDIR:=$(shell echo "$(RUNBOOTDIR)" | sed 's/\/\/*/\//g') + +# Where the program will be really installed on the host machine. For instance, +# on Sortix programs are run from the /bin union directory, but they are +# installed somewhere else, these variables tells where. Note that programs must +# not depend on being installed here, they should detect the proper directories +# at (preferably) runtime, or during the install configuration step when +# installed through package management. +ifndef PREFIXNAME + PREFIXNAME:=/data/local +endif +PREFIXNAME:=$(shell echo "$(PREFIXNAME)" | sed 's/\/\/*/\//g') + +ifndef PREFIX + PREFIX:=$(SYSROOT)/$(PREFIXNAME) +endif +PREFIX:=$(shell echo "$(PREFIX)" | sed 's/\/\/*/\//g') + +ifndef BINDIR + BINDIR:=$(PREFIX)/bin +endif +BINDIR:=$(shell echo "$(BINDIR)" | sed 's/\/\/*/\//g') + +ifndef LIBDIR + LIBDIR:=$(PREFIX)/lib +endif +LIBDIR:=$(shell echo "$(LIBDIR)" | sed 's/\/\/*/\//g') + +ifndef INCLUDEDIR + INCLUDEDIR:=$(PREFIX)/include +endif +INCLUDEDIR:=$(shell echo "$(INCLUDEDIR)" | sed 's/\/\/*/\//g') + +ifndef BOOTDIR + BOOTDIR:=$(PREFIX)/boot +endif +BOOTDIR:=$(shell echo "$(BOOTDIR)" | sed 's/\/\/*/\//g') + +# Where the program will be installed on the build machine. This is mostly +# useful if cross compiling or producing a software distribution image. By +# default programs will be installed in the same location as the host machine. +ifdef INSTALLPREFIX + INSTALLPREFIX_WAS_SPECIFIED=1 +endif +ifndef INSTALLPREFIX + INSTALLPREFIX:=$(PREFIX) +endif +INSTALLPREFIX:=$(shell echo "$(INSTALLPREFIX)" | sed 's/\/\/*/\//g') + +ifndef INSTALLBINDIR + ifdef INSTALLPREFIX_WAS_SPECIFIED + INSTALLBINDIR:=$(INSTALLPREFIX)/bin + else + INSTALLBINDIR:=$(BINDIR) + endif +endif +INSTALLBINDIR:=$(shell echo "$(INSTALLBINDIR)" | sed 's/\/\/*/\//g') + +ifndef INSTALLLIBDIR + ifdef INSTALLPREFIX_WAS_SPECIFIED + INSTALLLIBDIR:=$(INSTALLPREFIX)/lib + else + INSTALLLIBDIR:=$(LIBDIR) + endif +endif +INSTALLLIBDIR:=$(shell echo "$(INSTALLLIBDIR)" | sed 's/\/\/*/\//g') + +ifndef INSTALLINCLUDEDIR + ifdef INSTALLPREFIX_WAS_SPECIFIED + INSTALLINCLUDEDIR:=$(INSTALLPREFIX)/include + else + INSTALLINCLUDEDIR:=$(INCLUDEDIR) + endif +endif +INSTALLINCLUDEDIR:=$(shell echo "$(INSTALLINCLUDEDIR)" | sed 's/\/\/*/\//g') + +ifndef INSTALLBOOTDIR + ifdef INSTALLPREFIX_WAS_SPECIFIED + INSTALLBOOTDIR:=$(INSTALLPREFIX)/boot + else + INSTALLBOOTDIR:=$(BOOTDIR) + endif +endif +INSTALLBOOTDIR:=$(shell echo "$(INSTALLBOOTDIR)" | sed 's/\/\/*/\//g') diff --git a/games/.gitignore b/games/.gitignore index 89ecd713..d43d4580 100644 --- a/games/.gitignore +++ b/games/.gitignore @@ -6,3 +6,5 @@ *.a pong conway +snake +asteroids diff --git a/games/Makefile b/games/Makefile index 2aa77c37..4808f03c 100644 --- a/games/Makefile +++ b/games/Makefile @@ -1,31 +1,42 @@ -# Set up variables such that we can easily cross-compile. -OSROOT=.. -include ../crosscompilemakefile.mak +include ../compiler.mak +include ../version.mak +include ../dirs.mak -CXXFLAGS:=$(CXXFLAGS) -Wall -Wextra +ifndef OPTLEVEL + OPTLEVEL=-O2 +endif -INITRDDIR:=../initrd -LOCALBINARIES:=\ +ifndef CXXFLAGS + CXXFLAGS:=$(OPTLEVEL) +endif + +CXXFLAGS:=$(CXXFLAGS) -Wall -Wextra -fno-exceptions -fno-rtti + +BINARIES:=\ pong \ conway \ snake \ asteroids \ -BINARIES:=$(addprefix $(INITRDDIR)/,$(LOCALBINARIES)) +all: $(BINARIES) -all: install +.PHONY: all install uninstall clean -install: $(LOCALBINARIES) - cp $(LOCALBINARIES) $(INITRDDIR) - rm -f $(LOCALBINARIES) +install: all + mkdir -p $(INSTALLBINDIR)/$(HOST) + install $(BINARIES) $(INSTALLBINDIR)/$(HOST) + +uninstall: + for FILE in $(INSTALLBINDIR); do \ + rm -f $(INSTALLBINDIR)/$(HOST)/$$FILE; \ + done %: %.cpp - $(CXX) $(CPPFLAGS) $(CXXFLAGS) -O2 -c $< -o $@.o - $(LD) $(LDFLAGS) $@.o -o $@ $(LIBS) + $(CXX) $(CPPFLAGS) $(CXXFLAGS) $< -o $@ sh: mxsh cp $< $@ clean: - rm -f $(BINARIES) $(LOCALBINARIES) *.o + rm -f $(BINARIES) *.o diff --git a/libmaxsi/Makefile b/libmaxsi/Makefile index 2b85e1ea..dba099b7 100644 --- a/libmaxsi/Makefile +++ b/libmaxsi/Makefile @@ -1,29 +1,32 @@ -ifndef CPU - CPU=x86 +include ../compiler.mak +include ../version.mak +include ../dirs.mak + +ifndef OPTLEVEL + OPTLEVEL:=-O2 endif -ifeq ($(CPU),x86) - CPUDEFINES=-DPLATFORM_X86 - CPUFLAGS=-m32 - CPULDFLAGS=-melf_i386 - CPUASFLAGS=-32 +ifeq ($(DEBUG_LIBC),1) + FLAGSDEBUG=-g3 +else + FLAGSDEBUG=$(OPTLEVEL) endif -ifeq ($(CPU),x64) - CPU=x64 - CPUDEFINES=-DPLATFORM_X64 - CPUFLAGS=-fPIC -m64 -mno-red-zone - CPULDFLAGS=-melf_x86_64 - CPUASFLAGS=-64 +CPUDIR:=$(CPU) + +ifeq ($(HOST),i486-sortix) + CPUFLAGS= endif -CPPINCLUDES=-I preproc -I ../sortix/include -CPPFLAGS=-DLIBMAXSI_LIBRARY -DSORTIX -U_GNU_SOURCE $(CPUDEFINES) $(CPPINCLUDES) -FLAGS=$(CPUFLAGS) -Wall -Wextra -nostdlib -fno-builtin -nostartfiles \ - -nodefaultlibs -fno-stack-protector -nostdinc +ifeq ($(HOST),x86_64-sortix) + CPUFLAGS=-fPIC -mno-red-zone +endif + +CPPINCLUDES=-I preproc +CPPFLAGS=-DLIBMAXSI_LIBRARY -U_GNU_SOURCE $(CPUDEFINES) $(CPPINCLUDES) +FLAGS=$(CPUFLAGS) -Wall -Wextra -fno-stack-protector $(FLAGSDEBUG) CFLAGS=$(FLAGS) -std=c99 -CXXFLAGS=$(FLAGS) -std=gnu++0x -fno-exceptions -nostdinc++ -fno-rtti -LDFLAGS=$(CPULDFLAGS) +CXXFLAGS=$(FLAGS) -std=gnu++0x -fno-exceptions -fno-rtti ASFLAGS=$(CPUASFLAGS) OBJS=\ @@ -48,8 +51,8 @@ isatty.o \ kernelinfo.o \ init.o \ signal.o \ -$(CPU)/signal.o \ -$(CPU)/fork.o \ +$(CPUDIR)/signal.o \ +$(CPUDIR)/fork.o \ time.o \ random.o \ abs.o \ @@ -188,7 +191,7 @@ crc32.o \ SORTIXOBJS:=$(addprefix sortix/,$(SORTIXOBJS)) SORTIXCPPFLAGS:=-DSORTIX_KERNEL -BINS=libc.a libg.a libmaxsi.a libmaxsi-sortix.a $(CRTOBJ) +BINS=libc.a libg.a libm.a libstdc++.a libmaxsi.a libmaxsi-sortix.a $(CRTOBJ) all: $(BINS) @@ -196,36 +199,33 @@ all: $(BINS) install-lib-dirs install-libs libmaxsi.a: $(OBJS) - ar rcs libmaxsi.a $(OBJS) - -libmaxsi.so: $(OBJS) - ld $(LDFLAGS) -shared -o $@ $(OBJS) + $(HOSTAR) rcs libmaxsi.a $(OBJS) libmaxsi-sortix.a: $(SORTIXOBJS) - ar rcs libmaxsi-sortix.a $(SORTIXOBJS) + $(HOSTAR) rcs libmaxsi-sortix.a $(SORTIXOBJS) libc.a: libmaxsi.a ln -sf $< $@ -libc.so: libmaxsi.so - ln -sf $< $@ - libg.a: libc.a ln -sf $< $@ -libg.so: libc.so - ln -sf $< $@ +libm.a: + $(HOSTAR) rcs $@ -start.o: $(CPU)/start.o +libstdc++.a: + $(HOSTAR) rcs $@ + +start.o: $(CPUDIR)/start.o ln -f $< $@ -crt1.o: $(CPU)/crt1.o +crt1.o: $(CPUDIR)/crt1.o ln -f $< $@ -crti.o: $(CPU)/crti.o +crti.o: $(CPUDIR)/crti.o ln -f $< $@ -crtn.o: $(CPU)/crtn.o +crtn.o: $(CPUDIR)/crtn.o ln -f $< $@ # header preprocessing @@ -239,20 +239,20 @@ headers: $(HEADERDIRS) $(HEADERS) # standard library %.o: %.c headers - gcc -c $< -o $@ $(CPPFLAGS) $(CFLAGS) + $(HOSTCC) -c $< -o $@ $(CPPFLAGS) $(CFLAGS) %.o: %.cpp headers - g++ -c $< -o $@ $(CPPFLAGS) $(CXXFLAGS) + $(HOSTCXX) -c $< -o $@ $(CPPFLAGS) $(CXXFLAGS) %.o: %.s - as $(ASFLAGS) $< -o $@ + $(HOSTAS) $(ASFLAGS) $< -o $@ # libmaxsi-sortix sortix: mkdir -p sortix sortix/%.o: %.cpp $(HEADERS) sortix - g++ -c $< -o $@ $(CPPFLAGS) $(SORTIXCPPFLAGS) $(CXXFLAGS) + $(HOSTCXX) -c $< -o $@ $(CPPFLAGS) $(SORTIXCPPFLAGS) $(CXXFLAGS) clean: rm -f *.o sortix/*.o c/*.o x86/*.o x64/*.o *.a *.so @@ -263,19 +263,26 @@ clean: install: install-headers install-libs install-include-dirs: headers - mkdir -p $(SYSROOT)/usr/include - for D in $(UNPROCHEADERDIRS); do mkdir -p $(SYSROOT)/usr/$$D || exit $?; done + mkdir -p $(INSTALLINCLUDEDIR) + DIRS=$$(echo $(UNPROCHEADERDIRS) | \ + tr ' ' '\n' | \ + sed 's/include\/*//'); \ + for D in $$DIRS; do \ + mkdir -p $(INSTALLINCLUDEDIR)/$$D || exit $?; \ + done install-headers: install-include-dirs headers - for SRC in $(HEADERS); do DEST=`echo $$SRC | sed 's/preproc/include/'`; cp $$SRC $(SYSROOT)/usr/$$DEST || exit $?; done + for SRC in $(HEADERS); do \ + DEST=`echo $$SRC | sed 's/preproc\///'`; \ + cp -P $$SRC $(INSTALLINCLUDEDIR)/$$DEST || exit $?; \ + done -install-lib-dirs: all - mkdir -p $(SYSROOT)/usr/lib +install-lib-dirs: + mkdir -p $(INSTALLLIBDIR) + mkdir -p $(INSTALLLIBDIR)/$(HOST) -install-libs: install-lib-dirs all - for F in $(BINS); do cp -P $$F $(SYSROOT)/usr/lib || exit $?; done - touch deleteme.cpp - g++ $(CPUFLAGS) -c deleteme.cpp -o deleteme.o - for F in libgcc.so libm.so libstdc++.so; do ld $(CPULDFLAGS) -shared deleteme.o -o $(SYSROOT)/usr/lib/$$F; done - rm -f deleteme.o deleteme.cpp +install-libs: install-lib-dirs + for F in $(BINS); do \ + cp -P $$F $(INSTALLLIBDIR)/$(HOST) || exit $?; \ + done diff --git a/sortix/Makefile b/sortix/Makefile index 6e176b1d..5d5c9de2 100644 --- a/sortix/Makefile +++ b/sortix/Makefile @@ -1,31 +1,27 @@ -ifndef O - O:=-O3 -endif +include ../compiler.mak +include ../version.mak +include ../dirs.mak -ifndef CPU - CPU=x86 +ifndef OPTLEVEL + OPTLEVEL:=-O2 endif ifeq ($(CPU),x86) BUILDID=x86 X86FAMILY=1 - CPUDEFINES=-DPLATFORM_X86 - CPUFLAGS=-m32 - CPULDFLAGS=-melf_i386 - CPUASFLAGS=-32 + CPUFLAGS= + CPULDFLAGS= CPUNASMFLAGS=-felf32 - CPUOBJS=$(CPU)/boot.o $(CPU)/base.o $(CPU)/x86.o + CPUOBJS:=$(CPU)/boot.o $(CPU)/base.o $(CPU)/x86.o endif ifeq ($(CPU),x64) BUILDID=x64 X86FAMILY=1 - CPUDEFINES=-DPLATFORM_X64 - CPUFLAGS=-m64 -ffreestanding -mno-red-zone - CPULDFLAGS=-melf64-little -z max-page-size=0x1000 - CPUASFLAGS=-64 + CPUFLAGS=-ffreestanding -mno-red-zone + CPULDFLAGS=-z max-page-size=0x1000 CPUNASMFLAGS=-felf64 - CPUOBJS=$(CPU)/base.o $(CPU)/x64.o + CPUOBJS:=$(CPU)/base.o $(CPU)/x64.o endif ifdef X86FAMILY @@ -49,11 +45,7 @@ endif DIRS=. x64 x86 x86-family fs kb kb/layout -DEFINES:=-DSORTIX_KERNEL -U_GNU_SOURCE $(CPUDEFINES) -ifeq ($(JSSORTIX),1) - DEFINES:=$(DEFINES) -DPLATFORM_SERIAL -DJSSORTIX - BUILDID:=$(BUILDID)-js -endif +DEFINES:=-DSORTIX_KERNEL -U_GNU_SOURCE ifeq ($(PANIC_SHORT),1) DEFINES:=$(DEFINES) -DPANIC_SHORT endif @@ -71,22 +63,22 @@ ifdef VERSION DEFINES:=$(DEFINES) -DVERSIONSTR=\"$(VERSION)\" endif -INCLUDES=-I. -Iinclude -I../libmaxsi/preproc +INCLUDES=-I. -Iinclude CPPFLAGS=$(INCLUDES) $(DEFINES) ifeq ($(DEBUG_KERNEL),1) FLAGSDEBUG=-g3 else - FLAGSDEBUG=-s $(O) + FLAGSDEBUG=$(OPTLEVEL) endif -FLAGS=$(CPUFLAGS) -Wall -Wall -Wextra -nostdlib -fno-builtin -nostartfiles \ +FLAGS=$(CPUFLAGS) -Wall -Wall -Wextra -nostdlib -nostartfiles \ -nodefaultlibs -fno-stack-protector $(FLAGSDEBUG) CFLAGS=$(FLAGS) CXXFLAGS=$(FLAGS) -std=gnu++0x -fno-exceptions -fno-rtti -ASFLAGS=$(CPUASFLAGS) +ASFLAGS= NASMFLAGS=$(CPUNASMFLAGS) STATICLIBS=\ -../libmaxsi/libmaxsi-sortix.a \ +-lmaxsi-sortix \ HEADERDIRS:=$(shell find include -type d) HEADERS:=$(shell find include -type f) @@ -146,10 +138,10 @@ fs/initfs.o \ fs/ramfs.o \ fs/videofs.o \ ata.o \ -$(STATICLIBS) \ -end.o # Must be last, determines kernel size. -JSOBJS:=$(subst .o,-js.o,$(OBJS)) +ALLOBJS=\ +$(OBJS) \ +end.o all: sortix.bin @@ -157,26 +149,18 @@ all: sortix.bin headers: -# jssortix compilation - -jssortix: jssortix.bin - -sortix-x86-js.tmp: $(OBJS) - ld -melf_i386 -Ttext 100000 -o sortix-x86-js-internal.out $(OBJS) - objcopy -O binary sortix-x86-js-internal.out $@ - # x64 compilation x64/boot.o: x64/boot.s - as -64 $< -o $@ + $(HOSTAS) -64 $< -o $@ -sortix-x64.tmp: $(OBJS) x64/boot.o - ld -N -melf_x86_64 -Ttext 100000 -o sortix-x64-internal.out x64/boot.o $(OBJS) - objcopy sortix-x64-internal.out -O elf32-i386 sortix-x64.tmp +sortix-x64.tmp: $(ALLOBJS) x64/boot.o + $(HOSTLD) -N -melf_x86_64_sortix -Ttext 100000 -o sortix-x64-internal.out x64/boot.o $(OBJS) $(STATICLIBS) end.o + $(HOSTOBJCOPY) sortix-x64-internal.out -O elf32-i386 sortix-x64.tmp # x86 compilation -sortix-x86.tmp: $(OBJS) - ld -melf_i386 -Ttext 100000 -o $@ $(OBJS) +sortix-x86.tmp: $(ALLOBJS) + $(HOSTLD) -melf_i386_sortix -Ttext 100000 -o $@ $(OBJS) $(STATICLIBS) end.o # general rules @@ -184,10 +168,10 @@ sortix.bin: sortix-$(BUILDID).tmp cp -vu $< $@ %.o: %.cpp - g++ -c $< -o $@ $(CPPFLAGS) $(CXXFLAGS) + $(HOSTCXX) -c $< -o $@ $(CPPFLAGS) $(CXXFLAGS) %.o: %.s - as $(ASFLAGS) $< -o $@ + $(HOSTAS) $< -o $@ $(ASFLAGS) %.o: %.asm nasm $(NASMFLAGS) $< -o $@ @@ -196,15 +180,26 @@ clean: for D in $(DIRS); do rm -f $$D/*.o $$D/*.bin $$D/*.out $$D/*.tmp; done # Installation into sysroot -install: install-headers +install: install-headers install-kernel install-include-dirs: headers - for DIR in $(HEADERDIRS); do \ - mkdir -p $(SYSROOT)/usr/$$DIR; \ + mkdir -p $(INSTALLINCLUDEDIR) + DIRS=$$(echo $(HEADERDIRS) | \ + tr ' ' '\n' | \ + sed 's/include\/*//'); \ + for D in $$DIRS; do \ + mkdir -p $(INSTALLINCLUDEDIR)/$$D || exit $?; \ done install-headers: install-include-dirs headers - for FILE in $(HEADERS); do \ - cp $$FILE $(SYSROOT)/usr/$$FILE; \ + for SRC in $(HEADERS); do \ + DEST=`echo $$SRC | sed 's/include\///'`; \ + cp -P $$SRC $(INSTALLINCLUDEDIR)/$$DEST || exit $?; \ done +install-kernel: install-kernel-binary + +install-kernel-binary: + mkdir -p $(INSTALLBOOTDIR)/$(HOST) + cp -P sortix.bin $(INSTALLBOOTDIR)/$(HOST) + diff --git a/utils/.gitignore b/utils/.gitignore index 5761abcf..39e2c747 100644 --- a/utils/.gitignore +++ b/utils/.gitignore @@ -1 +1,25 @@ *.o +init +calc +cat +cp +echo +rm +sh +mxsh +clear +ls +pwd +help +uptime +memstat +chvideomode +uname +kernelinfo +editor +kill +column +pager +head +tail +type diff --git a/utils/Makefile b/utils/Makefile index 3935125b..737dc56a 100644 --- a/utils/Makefile +++ b/utils/Makefile @@ -1,11 +1,18 @@ -# Set up variables such that we can easily cross-compile. -OSROOT=.. -include ../crosscompilemakefile.mak +include ../compiler.mak +include ../version.mak +include ../dirs.mak -CXXFLAGS:=$(CXXFLAGS) -Wall -Wextra +ifndef OPTLEVEL + OPTLEVEL=-O2 +endif -INITRDDIR:=../initrd -LOCALBINARIES:=\ +ifndef CXXFLAGS + CXXFLAGS:=$(OPTLEVEL) +endif + +CXXFLAGS:=$(CXXFLAGS) -Wall -Wextra -fno-exceptions -fno-rtti + +BINARIES:=\ init \ calc \ cat \ @@ -31,21 +38,25 @@ head \ tail \ type \ -BINARIES:=$(addprefix $(INITRDDIR)/,$(LOCALBINARIES)) +all: $(BINARIES) -all: install +.PHONY: all install uninstall clean -install: $(LOCALBINARIES) - cp $(LOCALBINARIES) $(INITRDDIR) - rm -f $(LOCALBINARIES) +install: all + mkdir -p $(INSTALLBINDIR)/$(HOST) + install $(BINARIES) $(INSTALLBINDIR)/$(HOST) + +uninstall: + for FILE in $(INSTALLBINDIR); do \ + rm -f $(INSTALLBINDIR)/$(HOST)/$$FILE; \ + done %: %.cpp - $(CXX) $(CPPFLAGS) $(CXXFLAGS) -O2 -c $< -o $@.o - $(LD) $(LDFLAGS) $@.o -o $@ $(LIBS) + $(CXX) $(CPPFLAGS) $(CXXFLAGS) $< -o $@ sh: mxsh cp $< $@ clean: - rm -f $(BINARIES) $(LOCALBINARIES) *.o + rm -f $(BINARIES) *.o diff --git a/version.mak b/version.mak new file mode 100644 index 00000000..5ee5be1f --- /dev/null +++ b/version.mak @@ -0,0 +1 @@ +VERSION=0.8dev