| #-*- Makefile -*- |
| |
| ## Defaults for user settings, see MkRules.dist for descriptions. Rtools42 |
| ## assumes that the compiler toolchain (e.g. gcc, as, ...) is on PATH |
| LOCAL_SOFT ?= $(shell which `echo $(CC) | sed -e 's/ .*//g'` | sed -e 's!/bin/[^/]\+!!g') |
| EXT_LIBS ?= $(LOCAL_SOFT) |
| G_FLAG ?= -gdwarf-2 |
| USE_ATLAS ?= NO |
| ATLAS_PATH ?= |
| MULTI ?= |
| TOOL_PATH ?= |
| BINPREF ?= |
| BINPREF64 ?= |
| COMPILED_BY ?= gcc-$(shell $(CC) --version | egrep -o "([0-9]{1,}\.){2,}[0-9]{1,}") |
| M_ARCH ?= |
| AS_ARCH ?= |
| RC_ARCH ?= |
| DT_ARCH ?= |
| WIN ?= 64 |
| USE_ICU ?= YES |
| ICU_PATH ?= |
| ICU_LIBS ?= -lsicuin -lsicuuc $(EXT_LIBS)/lib/sicudt.a -lstdc++ |
| USE_CAIRO ?= YES |
| CAIRO_CPPFLAGS ?= -I$(EXT_LIBS)/include/cairo |
| CAIRO_LIBS ?= "-lcairo -lfontconfig -lfreetype -lpng -lpixman-1 -lexpat -lharfbuzz -lbz2 -lintl -lz -liconv -lgdi32 -lmsimg32" |
| CURL_CA_BUNDLE ?= |
| USE_LIBCURL = yes |
| CURL_LIBS ?= -lcurl -lzstd -lrtmp -lssl -lssh2 -lgcrypt -lcrypto -lgdi32 -lz -lws2_32 -lgdi32 -lcrypt32 -lidn2 -lunistring -liconv -lgpg-error -lwldap32 -lwinmm |
| |
| BUILD_HTML ?= NO |
| MIKTEX ?= TRUE |
| TEXI2ANY ?= texi2any |
| TEXI2DVI = env COMSPEC= texi2dvi |
| MAKEINFO = texi2any |
| EOPTS ?= -mfpmath=sse -msse2 -mstackrealign |
| OPENMP ?= -fopenmp |
| PTHREAD ?= -pthread |
| ISDIR ?= C:/Program Files (x86)/Inno Setup 6 |
| QPDF ?= |
| HOME32 ?= |
| DLLs32 ?= |
| DLLs64 ?= |
| WIX3DIR ?= |
| WIX_PERSONAL ?= 0 |
| |
| ## =============== end of user setting defaults =================== |
| |
| |
| ifeq "$(MULTI)" "64" |
| WIN = 64 |
| M_ARCH = -m64 |
| AS_ARCH = --64 |
| RC_ARCH = -F pe-x86-64 |
| DT_ARCH = -m i386:x86-64 --as-flags --64 |
| BINPREF64 = $(TOOL_PATH) |
| endif |
| ifeq "$(MULTI)" "32" |
| WIN = 32 |
| # these are normally the defaults |
| M_ARCH = -m32 |
| AS_ARCH = --32 |
| RC_ARCH = -F pe-i386 |
| DT_ARCH = -m i386 --as-flags --32 |
| BINPREF = $(TOOL_PATH) |
| endif |
| |
| |
| ifeq "$(WIN)" "64" |
| R_ARCH = /x64 |
| arch_DEFS = -DR_ARCH='"x64"' |
| BINPREF = $(BINPREF64) |
| SYMPAT = 's/^.* [BCDRT] / /p' |
| NM_FILTER ?= | $(SED) -e '/[.]refptr[.]/d' -e '/[.]weak[.]/d' |
| else |
| R_ARCH = /i386 |
| arch_DEFS = -DR_ARCH='"i386"' |
| SYMPAT = 's/^.* [BCDRT] _/ /p' |
| endif |
| |
| ## -std=c99 would force __STRICT_ANSI__ disabling strdup etc, and also alloca |
| C99FLAG=-std=gnu99 |
| |
| ## earlier Rtools needed -sjlj; the alternative is -dw2, which failed building R. |
| GCC4_SUFF= |
| |
| BINDIR=bin$(R_ARCH) |
| |
| ifdef USE_IMPLIBS |
| IMPDIR=lib |
| else |
| IMPDIR=$(BINDIR) |
| endif |
| |
| AR = $(BINPREF)ar |
| CAT=cat |
| CC=$(BINPREF)gcc$(GCC4_SUFF) $(C99FLAG) $(M_ARCH) |
| CP=cp |
| # as set by make |
| CPP=$(CC) -E |
| DLL=$(CC) |
| DLLTOOL=$(BINPREF)dlltool |
| ## some versions have trouble with paths, so we always need this |
| ## even for native builds |
| DLLTOOLFLAGS=--as $(BINPREF)as $(DT_ARCH) -k |
| ECHO=echo |
| FC=$(BINPREF)gfortran$(GCC4_SUFF) $(M_ARCH) |
| FLIBS=-lgfortran -lquadmath |
| LINKER=$(MAIN_LD) |
| MAIN_LD=$(CC) |
| ## MAKEINFO = $(TEXI2ANY) |
| MKDIR=mkdir |
| NM=$(BINPREF)nm |
| RANLIB = $(BINPREF)ranlib |
| RESCOMP=$(BINPREF)windres $(RC_ARCH) |
| SHLIB_LD=$(CC) |
| SHLIB_LDFLAGS=-shared |
| |
| ## If the Fortran compiler is gfortran >= 7, add |
| ## -fno-optimize-sibling-calls to avoid recent gfortran optimizations |
| ## that break with LAPACK/BLAS-style passing of length-1 strings |
| ## (without hidden arguments giving their lengths). |
| ## |
| ## One could also use -ftail-call-workaround=2, which would be less |
| ## restrictive, and has been added after the breakages were discovered. |
| ## However, it is documented that this option may be removed in the future. |
| ## https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90329 |
| |
| GFVER = $(shell echo "__GNUC__" | $(FC) -E -P -) |
| GF7OPTS = |
| ifneq ($(GFVER),"") |
| GF7OPTS = $(shell [ $(GFVER) -ge 7 ] && echo "-fno-optimize-sibling-calls") |
| endif |
| |
| ifneq "$(LTO)" "" |
| AR = $(BINPREF)gcc-ar |
| NM = $(BINPREF)gcc-nm |
| RANLIB = $(BINPREF)gcc-ranlib |
| DLLFLAGS += $(CFLAGS) |
| endif |
| |
| # as set by make |
| RM=rm -f |
| SED=sed |
| SORT=sort |
| |
| .SUFFIXES: |
| .SUFFIXES: .c .cc .cpp .C .f .o .a .def .exp .dll .exe .d .f90 .f95 .m .S |
| |
| .c.d: |
| @echo "making $@ from $<" |
| @$(CC) -MM $(CPPFLAGS) $($*-CPPFLAGS) $(DEFINES) $< -o $@ |
| |
| .c.o: |
| $(CC) $(CPPFLAGS) $($*-CPPFLAGS) $(CFLAGS) $($*-CFLAGS) $(DEFINES) -c $< -o $@ |
| |
| .f.o: |
| $(FC) $(FFLAGS) $($*-FFLAGS) -c $< -o $@ |
| |
| ## $($*-LINKFLAGS) is used for Rgui Rterm and Rscript |
| %.exe: |
| $(LINKER) $(LINKFLAGS) $($*-LINKFLAGS) -o $@ $^ $($*-LIBS) $(LIBS) |
| |
| ## It does little sense to have $($*-DLLFLAGS) here (and not in etc/Makeconf) |
| ## $($*-DLLLIBS) is used for R and lapack |
| %.dll: |
| @$(ECHO) EXPORTS > $*.def |
| @$(NM) $^ | $(SED) -n $(SYMPAT) $(NM_FILTER) >> $*.def |
| $(DLL) -shared $(DLLFLAGS) $($*-DLLFLAGS) -o $@ $*.def $^ $($*-DLLLIBS) $(DLLLIBS) |
| @$(RM) $*.def |
| |
| ## It does no sense to have $($*-DLLTOOLFLAGS) here, and it is unused. |
| lib%.dll.a: %.def |
| $(DLLTOOL) $(DLLTOOLFLAGS) $($*-DLLTOOLFLAGS) --dllname $*.dll --input-def $*.def --output-lib $@ |
| |
| %.a: |
| # @$(ECHO) -------- Building $@ from $^ -------- |
| @$(RM) $@ |
| $(AR) crs $@ $^ |
| |
| %.o: %.rc |
| $(RESCOMP) $(RESFLAGS) $($*-RESFLAGS) -i $< -o $@ |