# determine OS: Linux vs. Windows (mingw)
SYS := $(shell gcc -dumpmachine)

ifneq (, $(findstring mingw, $(SYS)))
	# Windows MinGW
	CC			= C:/Rtools/mingw64/bin/gcc.exe
	CFLAGS		= -std=gnu99 -O2
	R_C_HEADER	= C:/"Program Files"/R/R-4.0.2/include
	DLL_BLAS	= C:/"Program Files"/R/R-4.0.2/bin/x64/Rblas.dll
	DLL_LAPACK	= C:/"Program Files"/R/R-4.0.2/bin/x64/Rlapack.dll
	DLL_R		= C:/"Program Files"/R/R-4.0.2/bin/x64/R.dll
else
	# Linux
	CC			= gcc
	CFLAGS		= -g -std=gnu99 -O2
	R_C_HEADER	= /usr/share/R/include/
	DLL_BLAS	= /usr/lib/x86_64-linux-gnu/libblas.so
	DLL_LAPACK	= /usr/lib/x86_64-linux-gnu/liblapack.so
	DLL_R		= /usr/lib/R/lib/libR.so
endif

# link
ifneq (, $(findstring mingw, $(SYS)))
# Windows MinGW
wbacon: wbacon.o wbacon_error.o wbacon_reg.o wquantile.o fitwls.o \
    partial_sort.o median.o
	$(CC) -fopenmp -shared -o $@.dll $@.o $(DLL_BLAS) $(DLL_LAPACK) $(DLL_R) \
	wbacon_error.o wquantile.o wbacon_reg.o fitwls.o partial_sort.o median.o
else
# Linux
wbacon: wbacon.o wbacon_reg.o wbacon_error.o wquantile.o fitwls.o \
    partial_sort.o median.o
	$(CC) -fopenmp -shared -L $(DLL_BLAS) $(DLL_LAPACK) $(DLL_R) -o $@.so $@.o \
	wbacon_error.o wquantile.o wbacon_reg.o fitwls.o partial_sort.o \
    median.o -lm -lblas -llapack -lR
endif

# compile
wbacon.o: wbacon.c
	$(CC) -fopenmp -Wall -pedantic -I $(R_C_HEADER) -c $*.c $(CFLAGS)

# compile (with -fpic flag for position independent code, otherwise
# 'CBACON_ERROR_STRINGS' is not relocatable)
wbacon_error.o: wbacon_error.c
	$(CC) -fpic -Wall -pedantic -I $(R_C_HEADER) -c $*.c $(CFLAGS)

# compile
wbacon_reg.o: wbacon_reg.c
	$(CC) -fopenmp -Wall -pedantic -I $(R_C_HEADER) -c $*.c $(CFLAGS)

# compile
wquantile.o: wquantile.c
	$(CC) -Wall -pedantic -I $(R_C_HEADER) -c $*.c $(CFLAGS)

# compile
fitwls.o: fitwls.c
	$(CC) -fopenmp -Wall -pedantic -I $(R_C_HEADER) -c $*.c $(CFLAGS)

# compile
partial_sort.o: partial_sort.c
	$(CC) -Wall -pedantic -I $(R_C_HEADER) -c $*.c $(CFLAGS)

# compile
median.o: median.c
	$(CC) -Wall -pedantic -I $(R_C_HEADER) -c $*.c $(CFLAGS)

# housekeeping (using make clean)
.PHONY: clean
clean:
	rm wbacon.o wquantile.o fitwls.o partial_sort.o wbacon_reg.o \
    wbacon_error.o median.o
