# Written by Emily. Any copyright is dedicated to the public domain.

# Super simple makefile which builds the BSD configuration.
# Well, not SUPER simple. We do some tests to see if this platform has clang.
# As of OpenBSD 6.4, it's missing on UltraSparc (and probably will be forever).
#
# We are fine with old-fashioned GCC too, we don't need egcc.
# If you really want to build with egcc (or use gcc on a system with clang) you
# can do something like this:
#
# `make CC=egcc CXX=egcc` to build using egcc.
# `make CC=gcc` to force using gcc instead of clang.
#
# You could also do pcc etc. The one bit of magic is that if gcc is CC, then we
# search for g++ rather than clang++ first thing.

all: librejoy.so

OBJECTS=rejoy.o rejoy_c.o unix/rejoy_unix.o unix/rejoy_unix_core.o bsd/rejoy_bsd.o bsd/rejoy_bsd_core.o

# Headers which 'all' C++ files need. This is SUPER coarse dependency tracking.
CHEADERS=rejoy_hat.h rejoy_config.h rejoy_export.h
CXXHEADERS=rejoy.hpp rejoy_hat.h rejoy_private.hpp rejoy_config.h rejoy_export.h

UNIXCHEADERS=$(CHEADERS) unix/rejoy_unix_core.h
UNIXCXXHEADERS=$(CXXHEADERS) unix/rejoy_unix_core.h unix/rejoy_unix.hpp
BSDCHEADERS=$(CHEADERS) bsd/rejoy_bsd_core.h
BSDCXXHEADERS=$(UNIXCXXHEADERS) bsd/rejoy_bsd_core.h bsd/rejoy_bsd.hpp

CFINDER=which clang 2>/dev/null || which gcc 2>/dev/null || echo cc

CFOUND!=case `uname -m` in *sparc*) which gcc 2>/dev/null || ${CFINDER} ;; *) ${CFINDER} ;; esac
CC?=${CFOUND}

CXXFINDER=which clang++ 2>/dev/null || which g++ 2>/dev/null || echo c++
CXXFOUND!=if [ "${CFOUND}" = "gcc" ] ; then which g++ 2>/dev/null || ${CXXFINDER} ; else ${CXXFINDER} ; fi
CXX?=${CXXFOUND}

LINKER?=${CXX}

FPICFLAGFOUND!= case `uname -m` in *sparc*) echo -fpic ;; *amd64* | *86*) echo -fPIC ;; esac
FPICFLAG?=${FPICFLAGFOUND}

CCFLAGS?=-Wall -Wextra -pedantic -Werror -fomit-frame-pointer -g ${FPICFLAG}
CCFLAGS+=-DREJOY_DRIVER_BSD=1

CFLAGS:=${CCFLAGS} -ansi
CXXFLAGS:=${CCFLAGS} -std=c++98 -fno-rtti -fno-exceptions

librejoy.so: ${OBJECTS}
	${LINKER} ${FPICFLAG} -g -shared -lusbhid ${OBJECTS} -o librejoy.so

rejoy.o: rejoy.cpp ${CXXHEADERS}
	${CXX} ${CXXFLAGS} -c rejoy.cpp -o rejoy.o

rejoy_c.o: rejoy_c.cpp rejoy_c.h ${CXXHEADERS}
	${CXX} ${CXXFLAGS} -c rejoy_c.cpp -o rejoy_c.o

unix/rejoy_unix.o: unix/rejoy_unix.cpp ${UNIXCXXHEADERS}
	${CXX} ${CXXFLAGS} -c unix/rejoy_unix.cpp -o unix/rejoy_unix.o

unix/rejoy_unix_core.o: unix/rejoy_unix_core.c ${UNIXCHEADERS}
	${CC} ${CFLAGS} -c unix/rejoy_unix_core.c -o unix/rejoy_unix_core.o

bsd/rejoy_bsd.o: bsd/rejoy_bsd.cpp ${BSDCXXHEADERS}
	${CXX} ${CXXFLAGS} -c bsd/rejoy_bsd.cpp -o bsd/rejoy_bsd.o

bsd/rejoy_bsd_core.o: bsd/rejoy_bsd_core.c ${BSDHEADERS}
	${CC} ${CFLAGS} -c bsd/rejoy_bsd_core.c -o bsd/rejoy_bsd_core.o

clean:
	rm ${OBJECTS} librejoy.so

