diff --git a/com.oracle.truffle.r.native/builtinlibs/Makefile b/com.oracle.truffle.r.native/builtinlibs/Makefile index f5b3a9f996158edd33a8606568e5f96688d69a60..f052790aaf0fa82891c25af4c8f3aea1bf358538 100644 --- a/com.oracle.truffle.r.native/builtinlibs/Makefile +++ b/com.oracle.truffle.r.native/builtinlibs/Makefile @@ -33,29 +33,27 @@ endif .PHONY: all clean cleanlib cleanobj force libr -all: linked $(LIB_APPL) libr +LIBDIR = $(abspath $(TOPDIR)/../lib) +LIB_APPL := $(LIBDIR)/libappl$(DYLIB_EXT) + +all: $(LIB_APPL) libr SRC = src OBJ = lib -LIBDIR = $(abspath $(TOPDIR)/../lib) -LINKED_C_FILES = interv.c -GNUR_LINKED_C_FILES = $(addprefix $(GNUR_HOME)/src/appl/, $(LINKED_C_FILES)) -NON_LOCAL_C_SOURCES = $(addprefix $(SRC)/, $(LINKED_C_FILES)) -C_LOCAL_SOURCES = $(filter-out $(NON_LOCAL_C_SOURCES),$(wildcard $(SRC)/*.c)) -C_SOURCES := $(NON_LOCAL_C_SOURCES) $(C_LOCAL_SOURCES) +GNUR_SRC = $(GNUR_HOME)/src/appl +GNUR_C_FILES = interv.c +GNUR_C_OBJECTS := $(addprefix $(OBJ)/, $(GNUR_C_FILES:.c=.o)) + +C_SOURCES := $(wildcard $(SRC)/*.c) C_OBJECTS := $(subst $(SRC),$(OBJ),$(C_SOURCES:.c=.o)) -F_OBJECTS := $(wildcard $(GNUR_HOME)/src/appl/d*.o) -LIB_APPL := $(LIBDIR)/libappl$(DYLIB_EXT) +# the Fortran sources are not recompiled +F_OBJECTS := $(wildcard $(GNUR_HOME)/src/appl/d*.o) -$(LIB_APPL): $(C_OBJECTS) $(F_OBJECTS) +$(LIB_APPL): $(C_OBJECTS) $(GNUR_C_OBJECTS) $(F_OBJECTS) Makefile mkdir -p $(LIBDIR) - $(DYLIB_LD) $(DYLIB_LDFLAGS) -o $(LIB_APPL) $(C_OBJECTS) $(F_OBJECTS) $(LIBS) - -linked: $(GNUR_LINKED_C_FILES) - $(foreach file,$(LINKED_C_FILES),ln -sf $(GNUR_HOME)/src/appl/$(file) $(SRC)/$(file);) - touch linked + $(DYLIB_LD) $(DYLIB_LDFLAGS) -o $(LIB_APPL) $(C_OBJECTS) $(GNUR_C_OBJECTS) $(F_OBJECTS) $(LIBS) $(C_OBJECTS): | $(OBJ) @@ -77,7 +75,7 @@ $(LIB_R): $(OBJ)/xerbla.o $(DYLIB_LD) $(DYLIB_LDFLAGS) -o $(LIB_R) -current_version $(R_VERSION) -compatibility_version $(R_VERSION) $(OBJ)/xerbla.o cleanlibr: - rm -f $(LIB_R) + rm -f $(LIBDIR)/libR.* else libr: @@ -91,12 +89,14 @@ FFI_INCLUDES = -I$(TOPDIR)/include -I$(TOPDIR)/include/R_ext $(OBJ)/%.o: $(SRC)/%.c $(CC) $(CFLAGS) $(FFI_INCLUDES) -c $< -o $@ +$(OBJ)/%.o: $(GNUR_SRC)/%.c + $(CC) $(CFLAGS) $(FFI_INCLUDES) -c $< -o $@ + cleanlib: rm -f $(LIBDIR)/libappl.* -clean: cleanobj cleanlibr +clean: cleanobj cleanlib cleanlibr cleanobj: - rm -f linked rm -f $(OBJ)/*.o - rm -f $(SRC)/$(LINKED_C_FILES) + diff --git a/com.oracle.truffle.r.native/library/lib.mk b/com.oracle.truffle.r.native/library/lib.mk index 6812f369bde1640fd37bfded38562670fe4825a4..085e5fa43163fc40ab8719348c9774235a3a1396 100644 --- a/com.oracle.truffle.r.native/library/lib.mk +++ b/com.oracle.truffle.r.native/library/lib.mk @@ -31,6 +31,10 @@ # define LIB_PKG_PRE and for post processing define LIB_PKG_POST in its Makefile. # If a package-specfic clean is needed it should define CLEAN_PKG +# A package may include C and Fortran code compiled directly from the GnuR code base, +# but using FastR headers. This is handled by the package defining the variables +# GNUR_C_OBJECTS and GNUR_F_OBJECTS before including this file. + ifneq ($(MAKECMDGOALS),clean) include $(TOPDIR)/platform.mk endif @@ -45,6 +49,7 @@ endif SRC = src OBJ = lib +GNUR_SRC = $(GNUR_HOME)/src/library/$(PKG)/src C_SOURCES := $(wildcard $(SRC)/*.c) @@ -78,7 +83,7 @@ libcommon: $(PKGDIR) $(PKGDIR): $(GNUR_HOME)/library/$(PKG) (cd $(GNUR_HOME)/library; tar cf - $(PKG)) | (cd $(FASTR_LIBRARY_DIR); tar xf -) - touch $(FASTR_LIBRARY_DIR)/$(PKG) + touch $(PKGDIR) $(C_OBJECTS): | $(OBJ) @@ -87,19 +92,11 @@ $(F_OBJECTS): | $(OBJ) $(OBJ): mkdir -p $(OBJ) -$(LIB_PKG): $(C_OBJECTS) $(F_OBJECTS) $(PKGDIR) +$(LIB_PKG): $(C_OBJECTS) $(F_OBJECTS) $(GNUR_C_OBJECTS) $(GNUR_F_OBJECTS) $(PKGDIR) mkdir -p $(LIBDIR) - $(DYLIB_LD) $(DYLIB_LDFLAGS) -o $(LIB_PKG) $(C_OBJECTS) $(F_OBJECTS) $(PKG_LIBS) + $(DYLIB_LD) $(DYLIB_LDFLAGS) -o $(LIB_PKG) $(C_OBJECTS) $(F_OBJECTS) $(GNUR_C_OBJECTS) $(GNUR_F_OBJECTS) $(PKG_LIBS) mkdir -p $(FASTR_LIBRARY_DIR)/$(PKG)/libs cp $(LIB_PKG) $(FASTR_LIBRARY_DIR)/$(PKG)/libs -# find a way to move into stats makefile (using LIB_PKG_POST) -ifeq ($(OS_NAME),Darwin) -ifeq ($(PACKAGE),stats) - install_name_tool -change libRblas.dylib $(FASTR_R_HOME)/lib/libRblas.dylib $(FASTR_LIBRARY_DIR)/$(PKG)/libs/$(PKG).so - install_name_tool -change libRlapack.dylib $(FASTR_R_HOME)/lib/libRlapack.dylib $(FASTR_LIBRARY_DIR)/$(PKG)/libs/$(PKG).so - install_name_tool -change libappl.dylib $(FASTR_R_HOME)/lib/libappl.dylib $(FASTR_LIBRARY_DIR)/$(PKG)/libs/$(PKG).so -endif -endif $(OBJ)/%.o: $(SRC)/%.c $(H_SOURCES) $(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@ diff --git a/com.oracle.truffle.r.native/library/stats/Makefile b/com.oracle.truffle.r.native/library/stats/Makefile index f9ff70fe64c5eb5b1e5962648e3809c73863e077..969795ea25f7586973830eb6859387d39bcdfbfc 100644 --- a/com.oracle.truffle.r.native/library/stats/Makefile +++ b/com.oracle.truffle.r.native/library/stats/Makefile @@ -24,14 +24,14 @@ # Completeness of the stats package is a work in progress # Currently we compile a subset of the .c and .f files from the # GnuR stats library source - those that do not depend on GnuR internals (always true for .f) -# A first step in the build is to make symbolic links to those files and also to -# do some necessary modofications to a copy of fft.c. +# Also do some necessary modifications to a copy of fft.c. -.PHONY: cleanpkg +.PHONY: cleanpkg nametool GNUR_FFT = $(addprefix $(GNUR_HOME)/src/library/stats/src/, fft.c) - -LIB_PKG_PRE = $(addprefix $(OBJ)/, fft.o) linked +FFT_OBJECT = $(addprefix $(OBJ)/, fft.o) +LIB_PKG_PRE = $(FFT_OBJECT) +LIB_PKG_POST = nametool CLEAN_PKG := cleanpkg @@ -42,37 +42,37 @@ endif PKG_LIBS := $(LAPACK_LIBS) $(BLAS_LIBS) -lappl -L$(FASTR_LIB_DIR) $(FLIBS) -include ../lib.mk +OBJ = lib -LINKED_F_FILES = bsplvd.f bvalue.f bvalus.f eureka.f hclust.f kmns.f lminfl.f loessf.f ppr.f qsbart.f sgram.f \ +GNUR_F_FILES = bsplvd.f bvalue.f bvalus.f eureka.f hclust.f kmns.f lminfl.f loessf.f ppr.f qsbart.f sgram.f \ sinerp.f sslvrg.f stl.f stxwx.f -GNUR_LINKED_F_FILES = $(addprefix $(GNUR_HOME)/src/library/stats/src/, $(LINKED_F_FILES)) -LINKED_C_FILES = isoreg.c kmeans.c loessc.c monoSpl.c sbart.c -GNUR_LINKED_C_FILES = $(addprefix $(GNUR_HOME)/src/library/stats/src/, $(LINKED_C_FILES)) +GNUR_F_OBJECTS = $(addprefix $(OBJ)/, $(GNUR_F_FILES:.f=.o)) -linked: $(GNUR_LINKED_F_FILES) $(GNUR_LINKED_C_FILES) - $(foreach file,$(LINKED_C_FILES),ln -sf $(GNUR_HOME)/src/library/stats/src/$(file) $(SRC)/$(file);) - $(foreach file,$(LINKED_F_FILES),ln -sf $(GNUR_HOME)/src/library/stats/src/$(file) $(SRC)/$(file) ;) - touch linked +GNUR_C_FILES = isoreg.c kmeans.c loessc.c monoSpl.c sbart.c -# this dance ensures that C_SOURCES is set correctly regardless of whether the linked/modified files -# have been created or not (C_SOURCES will have been set in ../lib.mk) -NON_LOCAL_C_SOURCES = $(addprefix $(SRC)/, $(LINKED_C_FILES)) -C_LOCAL_SOURCES = $(filter-out $(NON_LOCAL_C_SOURCES),$(wildcard $(SRC)/*.c)) -C_SOURCES := $(NON_LOCAL_C_SOURCES) $(C_LOCAL_SOURCES) +GNUR_C_OBJECTS := $(addprefix $(OBJ)/, $(GNUR_C_FILES:.c=.o)) $(FFT_OBJECT) -#$(info NON_LOCAL_C_SOURCES=$(NON_LOCAL_C_SOURCES)) -#$(info LOCAL_C_SOURCES=$(C_LOCAL_SOURCES)) -#$(info C_SOURCES=$(C_SOURCES)) +include ../lib.mk $(C_OBJECTS): | $(OBJ) $(SRC)/fft.c: $(GNUR_FFT) src/ed_fft ed $(GNUR_FFT) < src/ed_fft +$(OBJ)/%.o: $(GNUR_SRC)/%.c + $(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@ + +$(OBJ)/%.o: $(GNUR_SRC)/%.f + $(F77) $(FFLAGS) $(FPICFLAGS) -c $< -o $@ + +# ensure that the references to Rblas, Rlapack and appl are absolute +nametool: +ifeq ($(OS_NAME),Darwin) + install_name_tool -change libRblas.dylib $(FASTR_R_HOME)/lib/libRblas.dylib $(FASTR_LIBRARY_DIR)/$(PKG)/libs/$(PKG).so + install_name_tool -change libRlapack.dylib $(FASTR_R_HOME)/lib/libRlapack.dylib $(FASTR_LIBRARY_DIR)/$(PKG)/libs/$(PKG).so + install_name_tool -change libappl.dylib $(FASTR_R_HOME)/lib/libappl.dylib $(FASTR_LIBRARY_DIR)/$(PKG)/libs/$(PKG).so +endif + cleanpkg: - rm -f linked rm -f $(SRC)/fft.c - rm -f $(NON_LOCAL_C_SOURCES) - rm -f $(addprefix $(SRC)/, $(LINKED_F_FILES))