INSTALL=install
prefix=/opt/diet
# Set the following to install to a different root
#DESTDIR=/tmp/fefix
# Set the following to use the diet libc

path = $(subst :, ,$(PATH))
diet_path = $(foreach dir,$(path),$(wildcard $(dir)/diet))
ifeq ($(strip $(diet_path)),)
ifneq ($(wildcard /opt/diet/bin/diet),)
DIET=/opt/diet/bin/diet
else
DIET=
endif
else
DIET:=$(strip $(diet_path))
endif

ifneq ($(DIET),)
DIET+=-Os
endif

libowfat_path = $(strip $(foreach dir,../libowfat*,$(wildcard $(dir)/textcode.h)))
ifneq ($(libowfat_path),)
CFLAGS+=$(foreach fnord,$(libowfat_path),-I$(dir $(fnord)))
LDFLAGS+=$(foreach fnord,$(libowfat_path),-L$(dir $(fnord)))
endif

CC=gcc

FLAGS=

PRGS=sync echo chroot mkdir rmdir mknod pwd true false clear chown chgrp \
chmod sleep tty tar basename df tee uname arch hostname env time dirname \
domainname id ln mv cp yes which cat rm wc ls whoami mkfifo head install \
sosrm soscp sosmv sosln soslns md5sum sleep2 allinone uniq tr mesg du \
uuencode uudecode nohup nice cmp mktemp truncate strings test date \
printenv chrootuid renice

OS:=$(shell uname)
ifeq ($(OS),Linux)
PRGS+=chvt dmesg kill dd write tail mount pivot_root insmod rmmod \
lsmod touch umount ldd
endif

ARCH:=$(shell uname -m | sed 's/i[4-9]86/i386/')

OBJDIR:=bin-$(ARCH)
TARGETS=$(patsubst %,$(OBJDIR)/%,$(PRGS))

all: sepcode $(OBJDIR) $(TARGETS)

CFLAGS=-pipe -Os -fomit-frame-pointer -fPIC -fpie -W -Wall -Wextra

CROSS=

#CFLAGS=-pipe -g

$(OBJDIR):
	@mkdir -p $(OBJDIR)

sepcode:
	if $(DIET) $(CROSS)$(CC) $(CFLAGS) $(FLAGS) -Wl,-z,noseparate-code -o true true.c ; then echo -Wl,-z,noseparate-code 2>/dev/null; fi > sepcode
	rm -f true

ldsepcode: sepcode
	if test -s sepcode ; then echo -z noseparate-code ; fi > ldsepcode

$(OBJDIR)/%.o: %.c
	@test -d $(OBJDIR) || mkdir $(OBJDIR)
	$(DIET) $(CROSS)$(CC) $(CFLAGS) $(FLAGS) -c $< -o $@
	$(CROSS)strip -x -R .comment -R .note $@

$(OBJDIR)/%.o: %.S
	@test -d $(OBJDIR) || mkdir $(OBJDIR)
	$(DIET) $(CROSS)$(CC) -pipe -c $< -o $@

$(OBJDIR)/%: $(OBJDIR)/%.o sepcode
	$(DIET) $(CROSS)$(CC) $(LDFLAGS) -o $@ $< $(shell cat sepcode)
	$(CROSS)strip -R .note -R .comment $@

$(OBJDIR)/cp: $(OBJDIR)/mv
	ln -s mv $@

$(OBJDIR)/chgrp: $(OBJDIR)/chown
	-ln -s chown $@

$(OBJDIR)/mkfifo: $(OBJDIR)/mknod
	ln -s mknod $@

$(OBJDIR)/mknod.o $(OBJDIR)/mkdir.o $(OBJDIR)/chmod.o: error.c parsemode.c

$(OBJDIR)/install.o: parsemode.c

$(OBJDIR)/install.o $(OBJDIR)/chown.o: openreadclose.c split.c mygetpwnam.c mygetgrnam.c

$(OBJDIR)/tar.o $(OBJDIR)/id.o $(OBJDIR)/chown.o: split.c mygetgrnam.c mygetpwnam.c

$(OBJDIR)/ls.o: embfeatures.h

$(OBJDIR)/touch.o: error.c

$(OBJDIR)/test.o: fmt_ulong.c scan_uint.c scan_int.c

$(OBJDIR)/ldd: $(OBJDIR)/ldd.o sepcode
	$(DIET) $(CROSS)$(CC) -o $@ $< $(LDFLAGS) -lowfat $(shell cat sepcode)
	$(CROSS)strip -R .note -R .comment $@

ifeq ($(ARCH),i386)
$(OBJDIR)/true.o: true.S
	$(CROSS)$(CC) -c -o $@ $^

$(OBJDIR)/true: $(OBJDIR)/true.o ldsepcode
	$(CROSS)$(LD) -m elf_i386 -s -o $@ $< $(shell cat ldsepcode)

$(OBJDIR)/false.o: false.S
	$(CROSS)$(CC) -c -o $@ $^

$(OBJDIR)/false: $(OBJDIR)/false.o ldsepcode
	$(CROSS)$(LD) -m elf_i386 -s -o $@ $< $(shell cat ldsepcode)
endif

ifeq ($(ARCH),x86_64)
$(OBJDIR)/true.o: true.S
	$(CROSS)$(CC) -c -o $@ $^

$(OBJDIR)/false.o: false.S
	$(CROSS)$(CC) -c -o $@ $^

$(OBJDIR)/true: $(OBJDIR)/true.o ldsepcode
	$(CROSS)$(LD) -s -o $@ $< $(shell cat ldsepcode)

$(OBJDIR)/false: $(OBJDIR)/false.o ldsepcode
	$(CROSS)$(LD) -s -o $@ $< $(shell cat ldsepcode)
endif


clean:
	rm -rf *.o bin-* $(PRGS) sepcode ldsepcode

VERSION=embutils-$(shell head -n 1 CHANGES|sed 's/://')
CURNAME=$(notdir $(shell pwd))

rename:
	if test $(CURNAME) != $(VERSION); then cd .. && mv $(CURNAME) $(VERSION); fi

tarball: rename
	cd .. && tar cvvf $(VERSION).tar.bz2 --use=bzip2 --exclude CVS --exclude bin-* $(VERSION)

alpha sparc ppc arm:
	$(MAKE) ARCH=$@ CROSS=$@-linux-

i386:
ifeq ($(shell uname -m),x86_64)
	$(MAKE) ARCH=i386 CC="gcc -m32"
else
	$(MAKE) ARCH=$@ CROSS=$@-linux-
endif

mips:
	$(MAKE) ARCH=$@ CROSS=$@-linux-gnu-

cross:
	$(MAKE) arm sparc ppc alpha i386 mips

.PHONY: install

install: $(TARGETS)
	test -d $(DESTDIR)$(prefix)/bin || mkdir -p $(DESTDIR)$(prefix)/bin
	$(INSTALL) $(TARGETS) $(DESTDIR)$(prefix)/bin
	-ln -f $(DESTDIR)$(prefix)/bin/chown $(DESTDIR)$(prefix)/bin/chgrp
	-ln -f $(DESTDIR)$(prefix)/bin/mv $(DESTDIR)$(prefix)/bin/cp
	-ln -f $(DESTDIR)$(prefix)/bin/mknod $(DESTDIR)$(prefix)/bin/mkfifo

uninstall:
	rm -f $(patsubst %,$(DESTDIR)$(prefix)/bin/%,$(PRGS))
