#
# USAGE: make [CC=<compiler>] GPS_SRC_BASE=<path to the gps sources>
#

CC=gcc
GNAT_RTS:=$(shell gnatls -v | grep adalib | sed -e "s/^[ ]*//" | head -1)
GNAT_BASE_PATH=$(shell which gnat | sed -e "s/bin.gnat//")
C_OBJECTS = set_std_prefix.o update_path.o run_path_option.o os-utils.o link_max.o objlist_file.o gnatcoll_support.o separate_run_path_option.o
ADA2JAVA=$(shell which ada2java)
ADA2JAVA_PATH=$(shell dirname $(ADA2JAVA))/..
GPS_SRC_BASE=../gps
GNAT_SRC_BASE=../gnat
OBJECT_DIR=$(shell echo "`pwd`/obj")
BUILD=Debug

include $(GPS_SRC_BASE)/Makefile.gnat

ifeq ($(GPS_SRC_BASE),)
   GPS_SRC_BASE=gps_sources
endif

ifeq ($(JAVA_SRC_BASE),)
   JAVA_SRC_BASE=ada2java_sources
endif

ifeq ($(OS),Windows_NT)
	MANAGE_SEGV_HANDLER=
	JAVA_OS_DIR=win32
	OUTPUT=gnatbench.dll
	GCCLIBS=-lgcc -lgcc_eh
	FPIC=
	NOSTDLIB=
	STATIC_LIBGCC=-static-libgcc
	LIBGNAT="$(GNAT_RTS)/libgnarl.a $(GNAT_RTS)/libgnat.a"
	LN=cp
	MACHINE_FLAG=-mwindow
else
	MANAGE_SEGV_HANDLER=-D__MANAGE_SEGV_HANDLER__
	OUTPUT=libgnatbench.so
	FPIC=-fPIC
	NOSTDLIB=-nostdlib
	STATIC_LIBGCC=
	ADA_OBJECTS_PATH=$(shell pwd)/adalib
	LIBGNAT=adalib/libgnarl.a adalib/libgnat.a
	LN=ln
	MACHINE_FLAG=

	ifeq (${shell uname}, SunOS)
		JAVA_OS_DIR=solaris
		GCCLIBS=-lgcc -lgcc_eh
	else
		JAVA_OS_DIR=linux
	        # Add -lpthread here: the gnatbench library uses tasking
        	# and this seems needed to compile against the proper version
        	# of the library under old versions of Linux.
		GCCLIBS=-lgcc -lgcc_eh -lpthread
	endif
endif

all: adalib lib-obj wrapper

clean:
	gnatclean -Pgnatbench_dll -XGPS_SRC_BASE=$(GPS_SRC_BASE)
	gnatclean -Ptest/test
	gnatclean -Pbinding -XGPS_SRC_BASE=$(GPS_SRC_BASE)
	$(RM) lib/$(OUTPUT)
	$(RM) *.o
	rm $(GPS_SRC_BASE)/gnat/*	

gnatcoll_support.o: $(GPS_SRC_BASE)/gnatlib/src/gnatcoll_support.c
	gcc -c $(FPIC) $(GPS_SRC_BASE)/gnatlib/src/gnatcoll_support.c
	
%.o: c_stubs/%.c
	gcc -c $(FPIC) $<
	
force:
	

lib-obj: $(C_OBJECTS)
	# Workaround against a bug that prevents building twice in the same
	# environment
	rm -f $(OBJECT_DIR)/b~*
	Object_Dir=$(OBJECT_DIR) && \
	export Object_Dir && \
	gnatmake -c $(FPIC) -a -u -P $(ADA2JAVA_PATH)/lib/gnat/jni.gpr -XBuild=$(BUILD) -XExternal_Build=false && \
	gnatmake -c $(FPIC) -u -P $(ADA2JAVA_PATH)/lib/gnat/ajis.gpr -XBuild=$(BUILD) -XExternal_Build=false && \
	gnatmake -c $(FPIC) -u -P gnatbench_dll.gpr -XBuild=$(BUILD) -XGPS_SRC_BASE=$(GPS_SRC_BASE) && \
	gnatmake -c $(FPIC) -u -P binding.gpr -XBuild=$(BUILD) -XGPS_SRC_BASE=$(GPS_SRC_BASE) && \
	cd obj; gnatbind -o b~gnatbench_dll.adb -Lgnatbench_dll -aO../adalib *.ali; cd .. && \
	gcc -c $(FPIC) -O obj/b~gnatbench_dll.adb -o obj/b~gnatbench_dll.o && \
	echo $(MACHINE_FLAG) -v -shared $(NOSTDLIB) $(STATIC_LIBGCC) -o lib/$(OUTPUT) obj/*.o $(C_OBJECTS) $(LIBGNAT) $(GCCLIBS) > args.resp && \
	gcc @args.resp

wrapper: $(C_OBJECTS)
	gnatmake -XGPS_SRC_BASE=$(GPS_SRC_BASE) -Pgnatwrapper/gnatwrapper -largs $(C_OBJECTS)

adalib:
ifneq ($(OS),Windows_NT)
	# On linux / solaris, we have to recompile libgnat in order to ensure
	# that it is compiled with -fPIC. We don't do that on windows, since
	# -fPIC is irrelevant there.
	mkdir adalib
	cp $(GNAT_RTS)/Makefile.adalib adalib
	$(MAKE) -C adalib -f Makefile.adalib ROOT="$(GNAT_BASE_PATH)" CFLAGS="-O2 $(FPIC)"
endif

tests:
	gprmake -Ptest/test -XGPS_SRC_BASE=$(GPS_SRC_BASE) main.adb \
             -largs -L`pwd`/lib/ -lgps -lutil

import: do_links
	ADA2JAVA_PATH=$(ADA2JAVA_PATH) \
	GPS_SRC_BASE=$(GPS_SRC_BASE) \
	GNAT_SRC_BASE=$(GNAT_SRC_BASE) sh import.sh

do_links:
	-@$(foreach f,$(GNAT_SOURCES), \
	  $(LN) $(GNAT_SRC_BASE)/$(f) $(GPS_SRC_BASE)/gnat > /dev/null 2>&1 ;)
	@sed -e 's/GNAT.Command_Line/GComLin/g' $(GNAT_SRC_BASE)/g-comlin.ads > $(GPS_SRC_BASE)/gnat/gcomlin.ads
	@sed -e 's/GNAT.Command_Line/GComLin/g' $(GNAT_SRC_BASE)/g-comlin.adb > $(GPS_SRC_BASE)/gnat/gcomlin.adb
	@(cd $(GPS_SRC_BASE)/gnat && gnatmake xsnamest && ./xsnamest && mv snames.ns snames.ads && mv snames.nb snames.adb) 

install_binding:
	rm -rf ../com.adacore.gnatbench.library/binding/
	mkdir ../com.adacore.gnatbench.library/binding/
	cp -r binding/com/ ../com.adacore.gnatbench.library/binding/
	cp -r $(ADA2JAVA_PATH)/lib/ajis.jar ../com.adacore.gnatbench.library/

install_dll: all
	cp lib/$(OUTPUT) ../com.adacore.gnatbench.library/

install: install_dll install_binding         

