# makefile for building Lua (here: Agena)
# see ../INSTALL for installation instructions
# see ../Makefile and agnconf.h for further customization

# == CHANGE THE SETTINGS BELOW TO SUIT YOUR ENVIRONMENT =======================

# Your platform. See PLATS for possible values.
PLAT= none

#CC=	/usr/bin/gcc-4.8
CC= gcc
#CFLAGS= -Wall $(MYCFLAGS) -Wno-attributes -fgnu89-inline # Mac does not know inline switches
CFLAGS= -Wall -Wno-unknown-pragmas $(MYCFLAGS)
AR= ar rcu
RANLIB= ranlib
RM= rm -f
LIBS= -lm $(MYLIBS)

MYCFLAGS=
MYLDFLAGS=
MYLIBS= -lmapm -lz -lexpat -lmpfr -lpcre2-posix -lpcre2-8

WINSYSLIBS= -lole32 -luuid -lgdi32 -lpowrprof -lnetapi32 -lpsapi -liphlpapi -lmpr -lwsock32 -lm

#WINMSVCR80= -lmsvcr80

# == END OF USER SETTINGS. NO NEED TO CHANGE ANYTHING BELOW THIS LINE =========

PLATS= ansi generic linux macosx mingw posix stretch raspi solaris

LUA_A=	libagena.a
CORE_O=	lapi.o lcode.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o \
	lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o \
	lundump.o lvm.o lzio.o lset.o lseq.o lpair.o lreg.o
LIB_O=	agnxlib.o lbaselib.o ldblib.o liolib.o lmathlib.o loslib.o ltablib.o \
	lrtable.o lenviron.o lstrlib.o utils.o units.o loadlib.o linit.o agnhlps.o \
	cephes.o binio.o agnt64.o sofa.o sdncal.o iniparse.o lreglib.o registry.o \
	stack.o intvec.o dblvec.o vecoff64.o charbuf.o memfile.o lseqlib.o lsetlib.o \
	bfield.o jwent.o fzy.o tuples.o long.o rlhmath.o interp.o calc.o linalg.o \
	stats.o combinat.o numtheory.o xbase.o utf8.o llist.o bags.o lookup.o \
	numarray.o factory.o bytes.o sema.o semalib.o vecint.o jbmath.o

LUA_T=	agena
LUA_O=	agena.o

ALL_O=	$(CORE_O) $(LIB_O) $(LUA_O) $(LUAC_O)
ALL_T=	$(LUA_A) $(LUA_T)
ALL_A=	$(LUA_A)

default:	$(PLAT)

all:	$(ALL_T)

o:	$(ALL_O)

a:	$(ALL_A)

# for UNIX
$(LUA_A):	$(CORE_O) $(LIB_O)
	$(AR) $@ $? $(SYSLIBS)
	$(RANLIB) $@

$(LUA_T):	$(LUA_O) $(LUA_A)
	$(CC) -o $@ $(MYLDFLAGS) $(LUA_O) $(LUA_A) $(LIBS)

# for Windows
$(WINLUA_A):	$(CORE_O) $(LIB_O)
	$(AR) $@ $? $(WINSYSLIBS) $(MYLIBS)
	$(RANLIB) $@

$(WINLUA_T):	$(LUA_O) $(WINLUA_A)
	$(CC) -o $@ $(MYLDFLAGS) $(LUA_O) $(WINLUA_A) $(LIBS)
#$(WINMSVCR80)

#$(LUAC_T): $(LUAC_O) $(LUA_A)
#   $(CC) -o $@ $(MYLDFLAGS) $(LUAC_O) $(LUA_A) $(LIBS)

clean:
	$(RM) $(ALL_T) $(ALL_O) agena.dll agena.exe agncfg.h config config.exe libagena.so agena.res

config: config.c
	$(CC) $(CFLAGS) -o config config.c
	./config agncfg.h

depend:
	@$(CC) $(CFLAGS) -MM l*.c

echo:
	@echo "PLAT = $(PLAT)"
	@echo "CC = $(CC)"
	@echo "CFLAGS = $(CFLAGS)"
	@echo "AR = $(AR)"
	@echo "RANLIB = $(RANLIB)"
	@echo "RM = $(RM)"
	@echo "MYCFLAGS = $(MYCFLAGS)"
	@echo "MYLDFLAGS = $(MYLDFLAGS)"
	@echo "MYLIBS = $(MYLIBS)"

# convenience targets for popular platforms

none:
	@echo "Please choose a platform:"
	@echo "   $(PLATS)"

	$(MAKE) all MYCFLAGS=-DLUA_ANSI

generic:
	$(MAKE) all MYCFLAGS=

# recommended when compiling on Linux editions with no trunc, log2, exp2, fma, fdim, isfinite, isunordered, signbit math functions
opensuse:
	$(MAKE) all MYCFLAGS="-O2 -Wno-attributes -fgnu89-inline -DLUA_USE_LINUX -DOPENSUSE -D_FILE_OFFSET_BITS=64" MYLIBS="-Wl,-E -ldl -lreadline -lhistory -lncurses -lrt"
	strip $(LUA_T)
	$(CC) $(MYCFLAGS) -o libagena.so -shared *.o

# recommended especially with Debian distributions; for some flavours of OpenSUSE, try `make opensuse`
linux:
	$(MAKE) all MYCFLAGS="-O2 -Wno-attributes -fgnu89-inline -DLUA_USE_LINUX -D_FILE_OFFSET_BITS=64" MYLIBS="-Wl,-E -ldl -lreadline -lhistory -lncurses -lrt"
	strip $(LUA_T)
	$(CC) $(MYCFLAGS) -o libagena.so -shared *.o

# see: https://www.raspberrypi.org/forums/viewtopic.php?t=139091 plus -fPIC (is a little bit slower), -march=armv8-a is quite slow
stretch:
	$(MAKE) all MYCFLAGS="-O2 -DLUA_USE_LINUX -DLUA_RASPI_STRETCH -D_FILE_OFFSET_BITS=64 -DCPUID -Wall -fgnu89-inline -fPIC" MYLIBS="-Wl,-E -ldl -lreadline -lhistory -lncurses -lrt"
	strip $(LUA_T)
	$(CC) $(MYCFLAGS) -o libagena.so -shared *.o

raspi:
	$(MAKE) all MYCFLAGS="-O2 -DLUA_USE_LINUX -DLUA_RASPI_STRETCH -DRASPIPI -D_FILE_OFFSET_BITS=64 -Wall -fgnu89-inline -fPIC -fno-fast-math" MYLIBS="-Wl,-E -ldl -lreadline -lhistory -lncurses -lrt"
	strip $(LUA_T)
	$(CC) $(MYCFLAGS) -o libagena.so -shared *.o

# Mac OS X has LUA_USE_POPEN set implicitly
macosx:
	$(MAKE) all \
	MYCFLAGS="-O2 -DLUA_USE_LINUX -DNOINLINE -D_DIRENT_HAVE_D_TYPE -force_cpusubtype_ALL -mmacosx-version-min=10.4" \
	MYLIBS="-lreadline" \
	MYLDFLAGS="-Wl -force_cpusubtype_ALL -mmacosx-version-min=10.4"

# -O3 is much faster than -O2, -Ofast is not
mingw:
	windres agena.rc -O coff -o agena.res
	$(MAKE) "WINLUA_A=agena.dll" "WINLUA_T=agena.exe" \
	"AR=$(CC) -O3 -shared -fgnu89-inline -o" "RANLIB=strip --strip-unneeded" \
	"MYCFLAGS=-O3 -Wall -Wno-attributes -Wno-deprecated-declarations -fgnu89-inline -DLUA_BUILD_AS_DLL -D_FILE_OFFSET_BITS=64" "MYLIBS=agena.res" "MYLDFLAGS=-s" agena.exe

posix:
	$(MAKE) all MYCFLAGS=-DLUA_USE_POSIX

# Agena with command line history; a GCC bug on some x86 operating systems with roundoff errors with
# doubles in various Double2BigEndian-like conversion functions neither does show up under
# Solaris 10 u6 for Sparc nor under Solaris 10 u6 for x86 (GCC 3.4.6 for x86, Sparcs with GCC 4.2.0 for
# Sun Systems and native GCC 3.4.6). However, if the bug should occur with your compiler,
# include the -DGCCROBUG switch to MYCFLAGS.
# Solaris has LUA_USE_POPEN set implicitly due to LUA_USE_POSIX
solaris:
	$(MAKE) all MYCFLAGS="-O3 -Wno-attributes -fgnu89-inline -DLUA_USE_POSIX -DLUA_USE_DLOPEN -D__EXTENSIONS__ -DLUA_USE_READLINE" \
	MYLIBS="-ldl -lreadline -lncurses -lkstat -lsocket -lnsl -lpcre2-posix -lpcre2-8 -lz -lexpat -liconv -lrt"
	strip $(LUA_T)
	gcc -o libagena.so -G -h libagena.so -O2 -fpic -lm -lc -lreadline -lncurses -lkstat -lsocket -lnsl -lpcre2-posix -lpcre2-8 -lz -lexpat -liconv -lrt *.o

# when generating the RPM and DEB files, comment all the following `install` lines except the `install:` line
install:
#	cp ./agena /usr/local/bin
#	cp ./libagena.* /usr/local/lib
#	mkdir -p /usr/local/include
#	cp ag*.h cephes.h sofa.h sdncal.h interp.h moon.h sunriset.h prepdefs.h /usr/local/include
#	mkdir -p /usr/agena
#	mkdir -p /usr/agena/lib
#	mkdir -p /usr/agena/doc
#	mkdir -p /usr/agena/share
#	mkdir -p /usr/agena/share/icons
#	mkdir -p /usr/agena/share/schemes
#	mkdir -p /usr/agena/share/scripting
#	cp ../lib/*.agn ../lib/*.so /usr/agena/lib
#	cp ../doc/agena.pdf /usr/agena/doc
#	cp ../doc/agena-crashcourse.pdf /usr/agena/doc
#	cp ../doc/agena.xls /usr/agena/doc
#	cp ../share/icons/*.gif ../share/icons/*.png ../share/icons/*.ico /usr/agena/share/icons
#	cp ../share/schemes/* /usr/agena/share/schemes
#	cp ../share/scripting/* /usr/agena/share/scripting

# list targets that do not create files (but not all makes understand .PHONY)
#.PHONY: all $(PLATS) default o a clean depend echo none

# DO NOT DELETE

lapi.o: lapi.c agena.h agnconf.h lapi.h lobject.h llimits.h ldebug.h \
	lstate.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h lstring.h ltable.h \
	lundump.h lvm.h
agnxlib.o: agnxlib.c agena.h agnconf.h agnxlib.h llimits.h
lbaselib.o: lbaselib.c lbaselib.h agena.h agnconf.h agnxlib.h agenalib.h agnhlps.h
lcode.o: lcode.c agena.h agnconf.h lcode.h llex.h lobject.h llimits.h \
	lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h ldo.h lgc.h \
	ltable.h
ldblib.o: ldblib.c agena.h agnconf.h agnxlib.h agenalib.h agnhlps.h
ldebug.o: ldebug.c agena.h agnconf.h lapi.h lobject.h llimits.h lcode.h \
	llex.h lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h ldo.h \
	lfunc.h lstring.h lgc.h ltable.h lvm.h
ldo.o: ldo.c agena.h agnconf.h ldebug.h lstate.h lobject.h llimits.h ltm.h \
	lzio.h lmem.h ldo.h lfunc.h lgc.h lopcodes.h lparser.h lstring.h \
	ltable.h lundump.h lvm.h
ldump.o: ldump.c agena.h agnconf.h lobject.h llimits.h lstate.h ltm.h \
  lzio.h lmem.h lundump.h
lfunc.o: lfunc.c agena.h agnconf.h lfunc.h lobject.h llimits.h lgc.h lmem.h \
	lstate.h ltm.h lzio.h
lgc.o: lgc.c agena.h agnconf.h ldebug.h lstate.h lobject.h llimits.h ltm.h \
	lzio.h lmem.h ldo.h lfunc.h lgc.h lstring.h ltable.h
linit.o: linit.c agena.h agnconf.h agenalib.h agnxlib.h
liolib.o: liolib.c agena.h agnconf.h agnxlib.h agenalib.h
llex.o: llex.c agena.h agnconf.h ldo.h lobject.h llimits.h lstate.h ltm.h \
	lzio.h lmem.h llex.h lparser.h lstring.h lgc.h ltable.h
lmathlib.o: lmathlib.c agena.h agnxlib.h agenalib.h agnconf.h agncmpt.h sunpro.h
lmem.o: lmem.c agena.h agnconf.h ldebug.h lstate.h lobject.h llimits.h \
	ltm.h lzio.h lmem.h ldo.h
loadlib.o: loadlib.c agnxlib.h agena.h agnconf.h lobject.h llimits.h \
	agenalib.h
lobject.o: lobject.c agena.h agnconf.h ldo.h lobject.h llimits.h lstate.h \
	ltm.h lzio.h lmem.h lstring.h lgc.h lvm.h
lopcodes.o: lopcodes.c lopcodes.h llimits.h agena.h agnconf.h
loslib.o: loslib.c agena.h agnconf.h agnxlib.h agenalib.h agnhlps.h
lparser.o: lparser.c agena.h agnconf.h lcode.h llex.h lobject.h llimits.h \
	lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h ldo.h \
	lfunc.h lstring.h lgc.h ltable.h agnhlps.h
lrtable.o:	lrtable.c agena.h agnxlib.h agenalib.h
lenviron.o:	lenviron.c agena.h agnxlib.h agenalib.h
lstate.o: lstate.c agena.h agnconf.h ldebug.h lstate.h lobject.h llimits.h \
	ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h llex.h lstring.h ltable.h
lstring.o: lstring.c agena.h agnconf.h lmem.h llimits.h lobject.h lstate.h \
	ltm.h lzio.h lstring.h lgc.h
lstrlib.o: lstrlib.c agena.h agnconf.h agnxlib.h agenalib.h lstrlib.h agnhlps.h jwent.h
ltable.o: ltable.c agena.h agnconf.h ldebug.h lstate.h lobject.h llimits.h \
	ltm.h lzio.h lmem.h ldo.h lgc.h ltable.h
ltablib.o: ltablib.c agena.h agnconf.h agnxlib.h agenalib.h
lreglib.o: lreglib.c agena.h agnxlib.h agenalib.h
lseqlib.o: lseqlib.c agena.h agnxlib.h agenalib.h
lsetlib.o: lsetlib.c agena.h agnxlib.h agenalib.h
lreg.o: lreg.c agena.h ldebug.h lstate.h lobject.h llimits.h \
	ltm.h lzio.h lmem.h ldo.h lgc.h lreg.h
ltm.o: ltm.c agena.h agnconf.h lobject.h llimits.h lstate.h ltm.h lzio.h \
	lmem.h lstring.h lgc.h ltable.h
agena.o: agena.c agena.h agnconf.h agnxlib.h agenalib.h
lundump.o: lundump.c agena.h agnconf.h ldebug.h lstate.h lobject.h \
  llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lstring.h lgc.h lundump.h
lvm.o: lvm.c lvm.h agena.h agnconf.h agnhlps.h ldebug.h lstate.h lobject.h llimits.h ltm.h \
	lzio.h lmem.h ldo.h lfunc.h lgc.h lcode.h llex.h lopcodes.h lstring.h ltable.h lset.h \
	lseq.h lreg.h lpair.h lcomplex.h lstrlib.h sunpro.h charbuf.h intvec.h
lzio.o: lzio.c agena.h agnconf.h llimits.h lmem.h lstate.h lobject.h ltm.h \
	lzio.h
cephes.o: cephes.c cephes.h
jbmath.o:	jbmath.c jbmath.h
agnhlps.o: agnhlps.c agnt64.h agnhlps.h agnconf.h llimits.h agena.h agncmpt.h cephes.h
utils.o: utils.c agena.h agnxlib.h agenalib.h
units.o: units.c agena.h agnxlib.h agenalib.h
agnt64.o: agnt64.c agnt64_l.h agnt64_c.h
sofa.o: sofa.c sofa.h
sdncal.o: sdncal.c sdncal.h
intvec.o:	intvec.c intvec.h agnhlps.h
dblvec.o:	dblvec.c dblvec.h agnhlps.h
vecoff64.o: vecoff64.c vecoff64.h
charbuf.o:	charbuf.c charbuf.h
iniparse.o:	iniparse.c iniparse.h
lset.o: lset.c agena.h ldebug.h lstate.h lobject.h \
	lmem.h ldo.h lgc.h lset.h
lseq.o: lseq.c agena.h ldebug.h lstate.h lobject.h lmem.h ldo.h lgc.h \
	lseq.h
lpair.o: lpair.c agena.h ldebug.h lstate.h lobject.h lmem.h ldo.h lgc.h \
	lpair.h
binio.o: binio.c agena.h agnxlib.h agenalib.h agnhlps.h
registry.o: registry.c agena.h agnxlib.h agenalib.h agncmpt.h
stack.o: stack.c agena.h agnxlib.h agenalib.h
memfile.o: memfile.c agena.h agnxlib.h agenalib.h
bfield.o: bfield.c agena.h agnxlib.h agenalib.h
jwent.o: jwent.c jwent.h
fzy.o:	fzy.c fzy.h agena.h agnxlib.h agenalib.h lucase.def
tuples.o: tuples.c agena.h agnxlib.h agenalib.h
long.o:	long.c agena.h agnxlib.h agenalib.h agnhlps.h
rlhmath.o: rlhmath.c rlhmath.h agnhlps.h
interp.o: interp.c interp.h
calc.o: calc.c agena.h agnxlib.h agenalib.h agnhlps.h cephes.h interp.h rlhmath.h
linalg.o: linalg.c agena.h agnxlib.h agenalib.h
stats.o: stats.c agena.h agnxlib.h agenalib.h cephes.h jbmath.h
combinat.o: combinat.c agena.h agnxlib.h agenalib.h
numtheory.o: numtheory.c agena.h agnxlib.h agenalib.h
xbase.o: xbase.c agena.h agnxlib.h agenalib.h
utf8.o: utf8.c lprefix.h agena.h agnconf.h agnxlib.h agenalib.h
llist.o:	llist.c agena.h agnxlib.h agenalib.h
bags.o: bags.c agena.h agnxlib.h agenalib.h
lookup.o: lookup.c lbaselib.h agena.h agnxlib.h agenalib.h
numarray.o:	numarray.c agena.h agnxlib.h agenalib.h agnhlps.h
factory.o:	factory.c agena.h agnxlib.h agenalib.h agnhlps.h
bytes.o:	bytes.c agena.h agnxlib.h agenalib.h agnhlps.h
semalib.o:	semalib.c semalib.h
sema.o:	sema.c semalib.h semalib.c agena.h agnxlib.h agenalib.h agnhlps.h
vecint.o:	vecint.c vecint.h intvec.h agena.h agnxlib.h agenalib.h agnhlps.h

# (end of Makefile)


