blob: 13068dbc5b8ea3f07aac70d0d69d5d648f17226c [file] [log] [blame]
#-*- 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 $@