
LIB_OBJS = disassembler.o pcode.o decode0.o decode1.o decode_fields32.o decode2.o mnemonics.o encodings.o

# machine readable architecture
PATH_MRA := $(HOME)/Downloads/A64_ISA_xml_v86A-2020-03/ISA_A64_xml_v86A-2020-03

#CPPFLAGS =
CPPFLAGS = -g -std=c++11

#$(info $(GENERATED_OBJECTS))

.PHONY: all clean

GENERATED_HEADERS = encodings.h encodings.cpp mnemonics.h mnemonics.cpp decode_fields32.h decode_fields32.cpp

all: spec.txt $(GENERATED_HEADERS) decode2.cpp decode2.o libdisasm.a gofer.so cmdline

libdisasm.a: $(LIB_OBJS)
	ar rvs libdisasm.a $(LIB_OBJS)

a64_disasm.dylib: $(LIB_OBJS)
	g++ -shared $(LIB_OBJS) -o a64_disasm.dylib

disassembler.o: disassembler.cpp disassembler.h encodings.h mnemonics.h
	g++ -c $(CPPFLAGS) disassembler.cpp -o disassembler.o

spec.txt: gen_spec_txt.py
	./gen_spec_txt.py > spec.txt

pcode.o: pcode.cpp pcode.h
	g++ -c $(CPPFLAGS) pcode.cpp -o pcode.o

decode0.o: decode0.cpp decode1.h
	g++ -c $(CPPFLAGS) decode0.cpp -o decode0.o

decode1.o: decode1.cpp decode2.h
	g++ -c $(CPPFLAGS) decode1.cpp -o decode1.o

decode_fields32.o: decode_fields32.cpp
	g++ -c $(CPPFLAGS) decode_fields32.cpp -o decode_fields32.o

decode0.cpp: gen_decode0.py gen_common.py ./pcode_parser/codegencpp.py
	./gen_decode0.py cpp > decode0.cpp

decode1.cpp: gen_decode1.py gen_common.py ./pcode_parser/codegencpp.py
	./gen_decode1.py cpp > decode1.cpp

decode1.h: gen_decode1.py gen_common.py
	./gen_decode1.py h > decode1.h

decode2.h: gen_decode2.py gen_common.py
	./gen_decode2.py h > decode2.h

decode2.cpp: decode2.h gen_decode2.py spec.txt ./pcode_parser/codegencpp.py
	./gen_decode2.py cpp > decode2.cpp

decode_fields32.cpp: gen_misc.py gen_common.py
	./gen_misc.py decode_fields32 > decode_fields32.cpp

decode_fields32.h:
	echo 'void decode_fields32(enum ENCODING enc, decoded *dec);' > decode_fields32.h

#------------------------------------------------------------------------------
# encodings .h/.cpp, mnemonics .h/.cpp
#------------------------------------------------------------------------------

mnemonics.h: gen_misc.py
	./gen_misc.py enum_mnemonics > mnemonics.h
	echo 'const char *mnem_to_str(enum MNEMONIC);' >> mnemonics.h

mnemonics.cpp: gen_misc.py
	echo '#include "mnemonics.h"' > mnemonics.cpp
	./gen_misc.py mnem_to_str >> mnemonics.cpp

encodings.h: gen_misc.py
	./gen_misc.py encodings > encodings.h
	echo 'const char *enc_to_str(enum ENCODING);' >> encodings.h
	echo 'const char *enc_to_xml(enum ENCODING);' >> encodings.h
	echo 'enum MNEMONIC enc_to_mnem(enum ENCODING);' >> encodings.h

encodings.cpp: gen_misc.py
	echo '#include "mnemonics.h"' > encodings.cpp
	echo '#include "encodings.h"' >> encodings.cpp
	./gen_misc.py enc_to_str >> encodings.cpp
	./gen_misc.py enc_to_xml >> encodings.cpp
	./gen_misc.py enc_to_mnem >> encodings.cpp

#------------------------------------------------------------------------------
# test tools
#------------------------------------------------------------------------------

gofer.so: gofer.cpp libdisasm.a
	g++ $(CPPFLAGS) \
		-lcapstone libdisasm.a \
		-shared -o gofer.so gofer.cpp \
		-Wl,-headerpad_max_install_names
	install_name_tool -change libcapstone.3.dylib /usr/local/lib/libcapstone.3.dylib gofer.so
	#install_name_tool -add_rpath `pwd` gofer.so

cmdline: cmdline.cpp libdisasm.a
	g++ $(CPPFLAGS) cmdline.cpp libdisasm.a -o cmdline

%.o: %.cpp
	g++ -c $(CPPFLAGS) $< -o $@

clean:
	rm -f decode0.cpp decode1.cpp decode1.h decode2.h encodings.h encodings.cpp mnemonics.h mnemonics.cpp decode_fields32.cpp decode_fields32.h *.o
	rm -f $(LEAF_SRCS)

