ifeq ($(shell uname -m), x86_64)
ifeq ($(shell [ -d /lib64 ] && echo 64), 64)
CFLAGS = -m32 -march=i686 -mcpu=pentium4 -fomit-frame-pointer
CPPFLAGS = -m32
LDFLAGS = -melf_i386
endif
else # ! x86_64

ifeq ($(shell uname -m), i686)
CFLAGS = -march=i686 -mcpu=i686 -fomit-frame-pointer
CPPFLAGS = -m32
LDFLAGS = -melf_i386
else # ! i686

ifeq ($(shell uname -m), ppc64)
# mcpu means march and mtune means mcpu, oh well
CFLAGS = -m32 -mcpu=750 -mtune=970
CPPFLAGS = -m32
LDFLAGS = -melf32ppclinux
else # ! ppc64

ifeq ($(shell uname -m), ppc)
# mcpu means march and mtune means mcpu, oh well
CFLAGS = -mcpu=750 -mtune=970
CPPFLAGS = -m32
LDFLAGS = -melf32ppclinux
endif # ppc

endif # ppc64
endif # i686
endif # x86_64

CFLAGS += -fno-common -O2 -Wall -Iglibc -I.
CPPFLAGS += -Iglibc -I.
LDFLAGS += -O2

CC = $(CROSS_COMPILE)gcc
CPP = $(CROSS_COMPILE)cpp
LD = $(CROSS_COMPILE)ld

OBJCOPY = $(CROSS_COMPILE)objcopy

LIBGCC = $(shell $(CC) $(CFLAGS) -print-libgcc-file-name)
LIBM = $(shell $(CC) $(CFLAGS) -print-file-name=libm.a)
LIBC = $(shell $(CC) $(CFLAGS) -print-file-name=libc.a)

seccomp-loader: seccomp-loader.c seccomp-loader.h
	$(CC) $(CFLAGS) $< -o $@

seccomp_test: seccomp-loader bytecode.text.bin bytecode.data.bin bytecode-malicious.text.bin bytecode-malicious.data.bin

PROJECTS = $(filter-out projects/CVS,$(wildcard projects/*))

$(patsubst %, _clean_%, $(PROJECTS)):
	$(MAKE) CPUSHARE_CORE=`pwd` -C $(patsubst _clean_%, %, $@) clean

$(patsubst %, _build_%, $(PROJECTS)):
	$(MAKE) CPUSHARE_CORE=`pwd` -C $(patsubst _build_%, %, $@) cpushare

cpushare: seccomp-loader seccomp_test $(patsubst %, _build_%, $(PROJECTS))

bytecode.o: bytecode.c seccomp-loader.h
	$(CC) -c $(CFLAGS) $< -o $@

bytecode-malicious.o: bytecode.c seccomp-loader.h
	$(CC) -c $(CFLAGS) -DMALICIOUS $< -o $@

bytecode.lds.s: bytecode.lds.S seccomp-loader.h
	$(CPP) $(CPPFLAGS) $< -o $@

bytecode.lds: bytecode.lds.s
	grep -A100000000 SECTION $< > $@

bytecode: bytecode.o bytecode.lds
	$(LD) $(LDFLAGS) -static -T bytecode.lds $< --start-group $(LIBGCC) $(LIBC) $(LIBM) --end-group -o $@

bytecode-malicious: bytecode-malicious.o bytecode.lds
	$(LD) $(LDFLAGS) -static -T bytecode.lds $< --start-group $(LIBGCC) $(LIBC) $(LIBM) --end-group -o $@

bytecode.text.bin: bytecode
	$(OBJCOPY) -O binary $< -j .text $@

bytecode.data.bin: bytecode
	$(OBJCOPY) -O binary $< -j .data $@

bytecode-malicious.text.bin: bytecode-malicious
	$(OBJCOPY) -O binary $< -j .text $@

bytecode-malicious.data.bin: bytecode-malicious
	$(OBJCOPY) -O binary $< -j .data $@

clean: $(patsubst %, _clean_%, $(PROJECTS))
	-rm -r *.o seccomp-loader bytecode bytecode-malicious bytecode.lds bytecode.lds.s \
	*~ *.{text,data,seccomp}.bin *.pyc cpushare.tap cpushare-*.log* cpushare-*.pid cache/* \
	twisted/plugins/dropin.cache twisted/plugins/*.pyc

.PHONY: clean
