# I've been working on this.  It might not build at the moment, without some manual tweaking or fetching of files.  *WIP*, remember?

CC=cc
OPTS=-g -Wall -Wno-unused-but-set-variable -I../perms
GCCOPTS=-g -Wall -fsanitize=address -fstack-protector-strong -I../perms
CLANGOPTS=-g -Wall -fsanitize=bounds,undefined -fstack-protector-strong -I../perms
TCCOPTS=-g -Wall -b -fsanitize=address -fstack-protector-strong -I../perms

all: icode2ast
	cd pass2test ; ../icode2ast pass2.icd > pass2.out.c ; cd .. ; tail -8 pass2test/pass2.out.c
	echo All up to date

# The project builds in under 3 seconds on my old i686 system with both gcc and clang, so I really don't see a need for anything more complex than this:
icode2ast: main.c icode2ast.c icode2ast.h  showicode.c showicode.h  icode2ast_data.c icode2ast_data.h  filter.h filter.c  stack.h stack.c  genimp.c  errorf.c errorf.h  genc.c  genc.h  pass1-flat.c imptoc.h impsig.h tables.h  pass1-flat.c imptoc.h impsig.h tables.h  Makefile ../perms/perms.h impsup-signals.c impsig.h pathopen.c pathopen.h systemf.c
	$(CC) $(OPTS) -o icode2ast main.c icode2ast.c icode2ast_data.c showicode.c filter.c stack.c genimp.c errorf.c genc.c pass1-flat.c impsup-signals.c pathopen.c systemf.c -lm

trace-dwarf: main.c icode2ast.c icode2ast.h  showicode.c showicode.h  icode2ast_data.c icode2ast_data.h  filter.h filter.c  stack.h stack.c  genimp.c  errorf.c errorf.h  genc.c  genc.h  pass1-flat.c imptoc.h impsig.h tables.h  pass1-flat.c imptoc.h impsig.h tables.h  Makefile ../perms/perms.h impsup-signals.c impsig.h pathopen.c pathopen.h systemf.c cygprofile-dwarf.c
	gcc $(GCCOPTS) -g -gpubnames -rdynamic -O0 -finstrument-functions -o icode2ast main.c icode2ast.c icode2ast_data.c showicode.c filter.c stack.c genimp.c errorf.c genc.c pass1-flat.c impsup-signals.c pathopen.c systemf.c cygprofile-dwarf.c -ldl -lm

trace:
	bash -c 'gcc -g -Wall -Wno-unused-but-set-variable -fsanitize=address -I../perms \
	-fstack-protector-strong -gpubnames -rdynamic -O0 -finstrument-functions \
	-DASAN_BUILD -include <(echo -e '\''#ifndef ASAN_CONFIG_GUARD\n#define ASAN_CONFIG_GUARD\n__attribute__((no_instrument_function)) const char* __asan_default_options() { return "detect_leaks=0"; }\n#endif'\'') \
	cygprofile-elf.c main.c icode2ast.c icode2ast_data.c showicode.c filter.c stack.c genimp.c errorf.c genc.c pass1-flat.c impsup-signals.c pathopen.c systemf.c \
	-o icode2ast \
	-ldl -lbacktrace -lm'

gcc: main.c icode2ast.c icode2ast.h  showicode.c showicode.h  icode2ast_data.c icode2ast_data.h  filter.h filter.c  stack.h stack.c  genimp.c  errorf.c errorf.h  genc.c  genc.h  pass1-flat.c imptoc.h impsig.h tables.h  pass1-flat.c imptoc.h impsig.h tables.h  Makefile ../perms/perms.h impsup-signals.c impsig.h pathopen.c pathopen.h systemf.c
	gcc $(GCCOPTS) -o icode2ast main.c icode2ast.c icode2ast_data.c showicode.c filter.c stack.c genimp.c errorf.c genc.c pass1-flat.c impsup-signals.c pathopen.c systemf.c -lm

clang: main.c icode2ast.c icode2ast.h  showicode.c showicode.h  icode2ast_data.c icode2ast_data.h  filter.h filter.c  stack.h stack.c  genimp.c  errorf.c errorf.h  genc.c  genc.h  pass1-flat.c imptoc.h impsig.h tables.h  pass1-flat.c imptoc.h impsig.h tables.h  Makefile ../perms/perms.h impsup-signals.c impsig.h pathopen.c pathopen.h systemf.c
	clang $(CLANGOPTS) -o icode2ast main.c icode2ast.c icode2ast_data.c showicode.c filter.c stack.c genimp.c errorf.c genc.c pass1-flat.c impsup-signals.c pathopen.c systemf.c -lm

tcc: main.c icode2ast.c icode2ast.h  showicode.c showicode.h  icode2ast_data.c icode2ast_data.h  filter.h filter.c  stack.h stack.c  genimp.c  errorf.c errorf.h  genc.c  genc.h  pass1-flat.c imptoc.h impsig.h tables.h  pass1-flat.c imptoc.h impsig.h tables.h  Makefile ../perms/perms.h impsup-signals.c impsig.h pathopen.c pathopen.h systemf.c
	tcc $(TCCOPTS) -o icode2ast main.c icode2ast.c icode2ast_data.c showicode.c filter.c stack.c genimp.c errorf.c genc.c pass1-flat.c impsup-signals.c pathopen.c systemf.c -lm

clean:
	rm -f icode2ast *~ *.o

pass2.c.html: icode2ast
	./icode2ast pass2test/pass2.icd > pass2test/pass2.out.c
	ctohtml pass2test/pass2.out.c > pass2.c.html

upload: # pass2.c.html
	rsync -avz --update Makefile errorf.c errorf.h filter.c filter.h genimp.c genimp.h genc.c genc.h icode2ast.c icode2ast_data.c icode2ast_data.h icode2ast.h main.c showicode.c showicode.h stack.c stack.h pass1-flat.c imptoc.h impsig.h tables.h systemf.c pathopen.h pathopen.c impsup-signals.c cygprofile-elf.c README.txt README-CURRENT-BUGS.txt DOWNLOAD.sh decode-arch.sh decode-arch.c TEST.sh test pass2test gtoal@gtoal.com:history.dcs.ed.ac.uk/archive/languages/imp77-tmp/gtoal/icode2ast/
	# rsync -avz --update pass2.c.html gtoal@gtoal.com:history.dcs.ed.ac.uk/archive/languages/imp77-tmp/gtoal/icode2ast/
	tar -cvf test.tar TEST.sh test/*.imp test/*.imp.html \
	         test/*.i386 test/*.i686 test/*.arm7hf test/*.aarch64 test/*.x86_64 test/*.riscv64 test/*.mips test/*.powerpc test/*.sparc64 test/*.s390x test/*.m68k test/*.c.html test/*.out.c
	ecce TEST.log.html TEST.log.html2 < TEST.ecc > /dev/null 2> /dev/null
	scp TEST.log.html2 gtoal@gtoal.com:history.dcs.ed.ac.uk/archive/languages/imp77-tmp/gtoal/icode2ast/TEST.log.html
	rsync -av TEST.log test.tar gtoal@gtoal.com:history.dcs.ed.ac.uk/archive/languages/imp77-tmp/gtoal/icode2ast/
