CUBATURE_DIR=libcubature
CUBA_DIR=Cuba

R_INC_FLAG=-I"$(R_INCLUDE_DIR)"
PKG_CPPFLAGS=-I. -I../inst/include -I../../inst/include -I./src/common -D_R_INTERFACE
PKG_LIBS=-L./$(CUBATURE_DIR) -L./$(CUBA_DIR) -lcubature -lcuba

# Recursively glob the sources that determine whether libcubature.a /
# libcuba.a are up-to-date. When any of these change, make re-runs
# the corresponding sub-make. No hand-maintained list.
CUBATURE_SOURCES=$(wildcard $(CUBATURE_DIR)/*.c $(CUBATURE_DIR)/*.h)
CUBA_SOURCES=$(wildcard $(CUBA_DIR)/src/*/*.c $(CUBA_DIR)/src/*/*.h $(CUBA_DIR)/src/common/*.c $(CUBA_DIR)/*.h)

CUBATURE_LIB=$(CUBATURE_DIR)/libcubature.a
CUBA_LIB=$(CUBA_DIR)/libcuba.a

# The Rcpp wrappers pull symbols in via LinkingTo headers at compile
# time and via -lcubature / -lcuba at link time. We force the static
# libraries to be built before the corresponding .o files by adding
# an explicit dependency; R's default $(SHLIB): $(OBJECTS) rule then
# links everything together. The $(SHLIB) line is needed to set the
# default goal (otherwise the first .o target below becomes it and
# make stops after building just one object).
$(SHLIB): Rcpp-cubature.o Rcpp-Cuba.o RcppExports.o cubature_init.o

Rcpp-cubature.o: $(CUBATURE_LIB)
RcppExports.o:   $(CUBATURE_LIB) $(CUBA_LIB)
Rcpp-Cuba.o:     $(CUBA_LIB)

$(CUBATURE_LIB): $(CUBATURE_SOURCES)
	cd $(CUBATURE_DIR) && \
	  $(MAKE) libcubature.a \
	    CC="$(CC)" \
	    CFLAGS="$(CPPFLAGS) $(PKG_CPPFLAGS) $(R_INC_FLAG) $(CFLAGS) $(CPICFLAGS)" \
	    AR="$(AR)" RANLIB="$(RANLIB)"

$(CUBA_LIB): $(CUBA_SOURCES)
	cd $(CUBA_DIR) && \
	  ./configure $(R_CONFIGURE_FLAGS) && \
	  $(MAKE) libcuba.a \
	    CC="$(CC)" \
	    CFLAGS="$(CPPFLAGS) $(PKG_CPPFLAGS) $(R_INC_FLAG) $(CFLAGS) $(CPICFLAGS)" \
	    AR="$(AR)" ARFLAGS="-rv" RANLIB="$(RANLIB)"

clean:
	rm -f Rcpp-cubature.o RcppExports.o cubature.so Rcpp-Cuba.o cubature_init.o
	rm -f $(CUBATURE_DIR)/*.o $(CUBATURE_LIB)
	rm -f $(CUBA_DIR)/*.o $(CUBA_LIB)
