.if ${MACHINE_ARCH} == amd64
CC+= -m32
.endif

LIBS_O=	bzero64_tramp.o bcopy64_tramp.o memset64_tramp.o emm64_syscall.o emm64_mmap64.o emm64_msync64.o emm64_munmap64.o tramp64.o
LIBS_SO=bzero64_tramp.o bcopy64_tramp.o memset64_tramp.o emm64_syscall.So emm64_mmap64.So emm64_msync64.So emm64_munmap64.So tramp64.o

all:	libemm64.a libemm64.so test_bcopy64 test_bzero64 test_memset64 test_emm64 test_bz64

# bcopy
test_bcopy64:	call_bcopy64.o libemm64.so
	${CC} ${CFLAGS} -o test_bcopy64 call_bcopy64.o libemm64.so

bcopy64_tramp.o:	bcopy64_tramp.S
	${CC} ${CFLAGS} -c bcopy64_tramp.S

call_bcopy64.o:	call_bcopy64.c libemm64.h
	${CC} ${CFLAGS} -g -c call_bcopy64.c

# bzero
test_bzero64:	call_bzero64.o libemm64.so
	${CC} ${CFLAGS} -o test_bzero64 call_bzero64.o libemm64.so

bzero64_tramp.o:	bzero64_tramp.S
	${CC} ${CFLAGS} -c bzero64_tramp.S

call_bzero64.o:	call_bzero64.c libemm64.h
	${CC} ${CFLAGS} -g -c call_bzero64.c

# memset
test_memset64:	call_memset64.o libemm64.so
	${CC} ${CFLAGS} -o test_memset64 call_memset64.o libemm64.so

memset64_tramp.o:	memset64_tramp.S
	${CC} ${CFLAGS} -c memset64_tramp.S

call_memset64.o:	call_memset64.c libemm64.h
	${CC} ${CFLAGS} -g -c call_memset64.c

# Generic C wrapper
test_bz64:	bz64.o call_bz64.o tramp64.o
	${CC} ${CFLAGS} -o test_bz64 bz64.o call_bz64.o tramp64.o

tramp64.o:	tramp64.S
	${CC} ${CFLAGS} -c tramp64.S

bz64.o:	bz64.c
	${CC} ${CFLAGS} -m64 -g -c bz64.c

call_bz64.o: call_bz64.c libemm64.h
	${CC} ${CFLAGS} -c call_bz64.c

# emm64
test_emm64:	emm64.o libemm64.so
	${CC} ${CFLAGS} -o test_emm64 emm64.o libemm64.so

emm64.o:	emm64.c libemm64.h emm64_syscall.h
	${CC} ${CFLAGS} -g -c emm64.c

# emm64 lib functions
emm64_syscall.o: emm64_syscall.c libemm64.h emm64_syscall.h
	${CC} ${CFLAGS} -g -c emm64_syscall.c

emm64_syscall.So: emm64_syscall.c libemm64.h emm64_syscall.h
	${CC} ${CFLAGS} -fpic -DPIC -g -c -o emm64_syscall.So emm64_syscall.c

emm64_mmap64.o: emm64_mmap64.c libemm64.h emm64_syscall.h
	${CC} ${CFLAGS} -g -c emm64_mmap64.c

emm64_mmap64.So: emm64_mmap64.c libemm64.h emm64_syscall.h
	${CC} ${CFLAGS} -fpic -DPIC -g -c -o emm64_mmap64.So emm64_mmap64.c

emm64_msync64.o: emm64_msync64.c libemm64.h emm64_syscall.h
	${CC} ${CFLAGS} -g -c emm64_msync64.c

emm64_msync64.So: emm64_msync64.c libemm64.h emm64_syscall.h
	${CC} ${CFLAGS} -fpic -DPIC -g -c -o emm64_msync64.So emm64_msync64.c

emm64_munmap64.o: emm64_munmap64.c libemm64.h emm64_syscall.h
	${CC} ${CFLAGS} -g -c emm64_munmap64.c

emm64_munmap64.So: emm64_munmap64.c libemm64.h emm64_syscall.h
	${CC} ${CFLAGS} -fpic -DPIC -g -c -o emm64_munmap64.So emm64_munmap64.c

# dlsym64 etc
libdl64.a: dlfunc64.o
	ar cq libdl64.a dlfunc64.o

libdl64.so: dlfunc64.So
	${CC} ${CFLAGS} -shared -Wl,-x,--soname,libdl64.so.1 -o libdl64.so.1 dlfunc64.So
	ln -sf libdl64.so.1 libdl64.so

dlfunc64.o: dlfunc64.c libemm64.h
	${CC} ${CFLAGS} -g -c dlfunc64.c

dlfunc64.So: dlfunc64.c libemm64.h
	${CC} ${CFLAGS} -fpic -DPIC -g -c -o dlfunc64.So dlfunc64.c


# libs
libemm64.a: ${LIBS_O}
	ar cq libemm64.a ${LIBS_O}

# The tramp functions are all internally 100% PIC.
libemm64.so: ${LIBS_SO}
	${CC} ${CFLAGS} -shared -Wl,-x,--soname,libemm64.so.1 -o libemm64.so.1 ${LIBS_SO}
	ln -sf libemm64.so.1 libemm64.so

# misc
clean:
	rm -f test_bcopy64 bcopy64_tramp.o call_bcopy64.o
	rm -f test_bzero64 bzero64_tramp.o call_bzero64.o
	rm -f test_memset64 memset64_tramp.o call_memset64.o
	rm -f libemm64.a libemm64.so libemm64.so.1
	rm -rf FreeBSD.*.package libemm64-*.tgz
	rm -f test_emm64 emm64.o
	rm -f test_bz64 call_bz64.o tramp64.o
	rm -f ${LIBS_O} ${LIBS_SO}
