Admin Panel

# simple libnix Makefile.gcc6 - for Bebbo's gcc-6

MAJOR=0
MINOR=1

PREFIX ?= /opt/amiga

CFLAGS ?= -Os -fomit-frame-pointer

uname := $(shell uname)
root ?= $(shell echo $$PWD)
export root

target ?= m68k-amigaos
 
MAKEFILES=$(root)/Makefile.gcc6

# special path handling for msys2 started from Eclipse
ifneq (,$(findstring MSYS_NT,$(uname)))
ifneq (,$(findstring /cygdrive/,$(root)))
troot := $(root)
tdrive := $(word 2,$(subst /, ,$(troot)))
root = $(subst /cygdrive/$(tdrive)/,$(tdrive):/,$(troot))
endif
endif

ifneq (,$(lib))
ifeq (,$(libname))
libname=$(lib)
endif
-include $(root)/sources/$(lib)/steal.me
endif

# use nix13 or nix20
ifeq (,$(lc))
CC = $(target)-gcc
AR = $(target)-ar
AS = $(target)-as

VARIANTS_TO_BUILD = info lib libb libm020 libm020bb libm020bb32 libm881 libm020bb881 libm020bb32881
LIBS_TO_BUILD ?= libnix libnix13 libnix20 libnixmain libnix_main libm libsocket libstub
STARTUPS ?= lib/devinit.o lib/libinit.o lib/libinitb.o lib/libinitr.o lib/ncrt0.o lib/nbcrt0.o lib/nlbcrt0.o lib/nrcrt0.o lib/nlrcrt0.o lib/init_shared.o

ifneq (,$(lib))
crt = -mcrt=nix13
ifeq (nix20,$(lib))
crt  = -noixemul
endif
ifeq (socket,$(lib))
crt = -noixemul
endif
CFLAGS += $(crt)
endif
else
CC = m68k-elf-gcc
AR = m68k-elf-ar
AS = m68k-elf-as

TGT = --defsym __elf__=1
VARIANTS_TO_BUILD ?= info libm020
LIBS_TO_BUILD = libc libm
STARTUPS ?= lib/ncrt0.o

endif

# extend CFLAGS on first invokation
ifeq (,$(kind))

CFLAGS += -I$(root)/sources/headers -fno-builtin -ffast-math -D__libnix__

ifneq (,$(lc))
CFLAGS += -D__libnix__
endif
endif

.PHONY: all one rest clean install install_one

.PHONY: lib libb libm020 libm020bb libm020bb32 libm881 libm020bb881 libm020bb32881 lc
all: $(VARIANTS_TO_BUILD)

# the desired kinds to be build
lib: $(STARTUPS)
	@mkdir -p $@
	$(MAKE) one kind=$@
	if [ -e lib/libstubs.a ] && [ "$$($(AR) t lib/libstubs.a | grep __initlib)" != "" ]; then rm -f lib/libstubs.a; fi
		
libb:
	@mkdir -p $@
	$(MAKE) one kind=$@ flags="-fbaserel"
		
libm020:
	@mkdir -p $@
	$(MAKE) one kind=$@ flags="-m68020"

libm020bb:
	@mkdir -p $@
	$(MAKE) one kind=$@ flags="-fbaserel -m68020"

libm020bb32:
	@mkdir -p $@
	$(MAKE) one kind=$@ flags="-fbaserel32 -m68020"

libm881:
	@mkdir -p $@
	$(MAKE) one kind=$@ flags="-m68020 -m68881 -mhard-float" LIBS_TO_BUILD=libm

libm020bb881:
	@mkdir -p $@
	$(MAKE) one kind=$@ flags="-fbaserel -m68020 -m68881 -mhard-float" LIBS_TO_BUILD=libm

libm020bb32881:
	@mkdir -p $@
	$(MAKE) one kind=$@ flags="-fbaserel32 -m68020 -m68881 -mhard-float" LIBS_TO_BUILD=libm

# the libs to build for each kind
one: $(LIBS_TO_BUILD)

# install all kinds into the prefix
.PHONY: install_lib install_libb install_libm020 install_libm020bb install_libm020bb32 install_libm881 install_libm020bb881 install_libm020bb32881  
install: install_lib install_libb install_libm020 install_libm020bb install_libm020bb32 install_libm881 install_libm020bb881 install_libm020bb32881
	cp $(root)/mkstub $(PREFIX)/bin
	
install_lib:
	$(MAKE) install_one kind=lib to=""
	mv $(PREFIX)/$(target)/libnix/lib/libstubs.a $(PREFIX)/$(target)/lib/ 
install_libb: 
	$(MAKE) install_one kind=libb to="libb/"
install_libm020:
	$(MAKE) install_one kind=libm020 to="libm020/"
install_libm020bb:
	$(MAKE) install_one kind=libm020bb to="libb/libm020/"
install_libm020bb32:
	$(MAKE) install_one kind=libm020bb32 to="libb32/libm020/"
install_libm881:
	$(MAKE) install_one kind=libm881 to="libm020/libm881/"
install_libm020bb881:
	$(MAKE) install_one kind=libm020bb881 to="libb/libm020/libm881/"
install_libm020bb32881:
	$(MAKE) install_one kind=libm020bb32881 to="libb32/libm020/libm881/"
install_libm060:
	$(MAKE) install_one kind=libm060 to="libm060/"
install_libm060bb:
	$(MAKE) install_one kind=libm060bb to="libb/libm060/"
install_libm060bb32:
	$(MAKE) install_one kind=libm060bb32 to="libb32/libm060/"

# install the files for the given $(kind) into $(to)
install_one:
	mkdir -p $(PREFIX)/$(target)/libnix/lib/$(to)
	rsync $(kind)/*.a $(PREFIX)/$(target)/libnix/lib/$(to) --exclude=$(kind)/libstubs.a
	find $(kind) -maxdepth 1 -name "*.o" -exec cp {} $(PREFIX)/$(target)/libnix/lib/$(to) \;

# startup stuff
.PHONY: libdir
libdir:
	@mkdir -p lib

lib/devinit.o: $(root)/sources/startup/devinit.c libdir
	$(CC) -c $(CFLAGS) $(flags) $< -o $@

lib/libinit.o: $(root)/sources/startup/libinit.c libdir
	$(CC) -c $(CFLAGS) $(flags) $< -o $@

lib/libinitb.o: $(root)/sources/startup/libinit.c libdir
	$(CC) -c $(CFLAGS) $(flags) -D__BASEREL__ $< -o $@

lib/libinitr.o: $(root)/sources/startup/libinitr.c libdir
	$(CC) -c $(CFLAGS) $(flags) $< -o $@

lib/ncrt0.o: $(root)/sources/startup/ncrt0.S libdir
	$(AS) $(TGT) -m68000 $< -o $@

lib/xcrt0.o: $(root)/sources/startup/xcrt0.S libdir
	$(AS) $(TGT) -m68000 $< -o $@

lib/nbcrt0.o: $(root)/sources/startup/nbcrt0.S libdir
	$(AS) -m68000 $< -o $@

lib/nlbcrt0.o: $(root)/sources/startup/nlbcrt0.S libdir
	$(AS) -m68020 $< -o $@

lib/nrcrt0.o: $(root)/sources/startup/nrcrt0.S libdir
	$(AS) -m68000 $< -o $@

lib/nlrcrt0.o: $(root)/sources/startup/nlrcrt0.S libdir
	$(AS) -m68020 $< -o $@

lib/init_shared.o: $(root)/sources/startup/init_shared.c libdir
	$(CC) $(CFLAGS) -fbaserel -m68000 -Os -c $< -o $@ 

.PHONY: libnix libnix13 libnix20 libnixmain libnix_main libm libsocket
libnix:
	$(MAKE) -C $(kind) rest libnix.a lib=nix
libnix13:
	$(MAKE) -C $(kind) rest libnix13.a lib=nix13
libnix20:
	$(MAKE) -C $(kind) rest libnix20.a lib=nix20
libnixmain:
	$(MAKE) -C $(kind) libnixmain.a lib=nixmain
libm:
	$(MAKE) -C $(kind) libm.a lib=math libname=m flags="$(flags) -DFULL_SPECIFIERS"
libsocket:
	$(MAKE) -C $(kind) libsocket.a lib=socket

libstub:
	$(MAKE) -C $(kind) libstubs.a lib=stubs

libc: $(STARTUPS)
	$(MAKE) -C lib kind=lib libstubs.a lib=stubs
	$(MAKE) -C $(lc) kind=$(lc) rest libnix.a lib=nix
	$(MAKE) -C $(lc) kind=$(lc) rest libnix20.a lib=nix20
	$(MAKE) -C $(lc) kind=$(lc) rest libnixmain.a lib=nixmain
	-rm lib/stubs/*_list__.o
	if [ ! -e  $(lc)/libc.a ]; then $(AR) rcs $(lc)/libc.a; touch -t 0001010000 $(lc)/libc.a; fi
	$(AR) rcs $(lc)/libc.a \
	$$(find ./$(lc)/nix/* -name '*.o' -newer $(lc)/libc.a) \
	$$(find ./lib/stubs/* -name '*.o' -newer $(lc)/libc.a) \
	$$(find ./$(lc)/nixmain/* -name '*.o' -newer $(lc)/libc.a) \
	$$(find ./$(lc)/nix20/* -name '*.o' -newer $(lc)/libc.a)

rest: detach.o

detach.o: $(root)/sources/misc/detach.c
	$(CC) -c -Os -fomit-frame-pointer $(flags) $^ -o $@

# build the lib base on $(lib), $(kind) and $(flags)
lib$(libname).a: $(shell find $(root)/sources/$(lib)/* -name '*.c') $(stolen) $(shell find $(root)/sources/headers/* -name '*.h') $(root)/Makefile.gcc6
	@mkdir -p $(lib)
	@echo compiling for $(kind)/$@ using $(CC) -c $(CFLAGS) $(flags)
	@touch -t 0001010000 $(lib)/stamp && if [ -e $@ ]; then touch -r $@ $(lib)/stamp; fi
	@if [ "$$(find $(root)/sources/headers/* -newer $(lib)/stamp)" != "" ]; then rm -f $(lib)/*.o $@; touch -t 0001010000 $(lib)/stamp; fi
	@if [ "$$(find $(root)/Makefile.gcc6 -newer $(lib)/stamp)" != "" ]; then rm -f $(lib)/*.o $@; touch -t 0001010000 $(lib)/stamp; fi
	@cd $(lib) && files="$$(find $^ -name '*.c' -newer stamp)" && echo "$(CC) -c $(CFLAGS) $(flags) $$files" && \
	$(CC) -c $(CFLAGS) $(flags) $$files
	@#echo archive $(kind)/$@
	@$(AR) rcs $@ $$(find ./$(lib)/* -name '*.o' -newer $(lib)/stamp)

libb/libnix4.library:
	cd libb && $(root)/preplib
	cd libb && $(root)/mkstub libnix4 libnix.def $$(cat ofiles.txt | xargs)
	cd libb && $(CC) -shared -noixemul $$(cat ofiles.txt | xargs) \
	libnix4-support/export*.o \
	-o libnix4.library \
	-Wl,-ulibVersionMajor=$(MAJOR),-ulibVersionMinor=$(MINOR),-ulibName=libnix4 \
	$(STRIP)
	$(AR) rcs libb/libnix4.a lib/nix/__initlibraries.o lib/nix/__initcpp.o lib/nix20/__nocommandline.o lib/nixmain/__stdiowin.o
	rsync libb/libnix4.a $(PREFIX)/$(target)/libnix/lib/
	rsync libb/libnix4.library $(PREFIX)/$(target)/libnix/

# cleanup
clean:
	find * -name '*.o' -delete
	find * -name '*.a' -delete
	find * -name stamp -delete

info:
	@echo "$(uname)"
	@echo "root=$(root)"