#---------------------------------------------------------------------------
#
#  Makefile for building the PyGan extension modules with pip
#  Author : A. Hebert (2024-1-7)
#
#---------------------------------------------------------------------------
#
OS = $(shell uname -s | cut -d"_" -f1)
ifeq ($(OS),AIX)
  DIRNAME = AIX
else
  DIRNAME = $(shell uname -sm | sed 's/[ ]/_/')
endif

ifeq ($(intel),1)
  ifeq ($(INTELTOOLS),)
    $(error INTELTOOLS is not set)
  endif
  COMPILER = INTELTOOLS
  lib = ../lib/$(DIRNAME)_intel
  libGan = ../../Ganlib/lib/$(DIRNAME)_intel
else
  ifeq ($(nvidia),1)
    ifeq ($(NVTOOLS),)
      $(error NVTOOLS is not set)
    endif
    COMPILER = NVTOOLS
    lib = ../lib/$(DIRNAME)_nvidia
    libGan = ../../Ganlib/lib/$(DIRNAME)_nvidia
  else
    ifeq ($(llvm),1)
      ifeq ($(LLVMTOOLS),)
        $(error LLVMTOOLS is not set)
      endif
      COMPILER = LLVMTOOLS
      lib = ../lib/$(DIRNAME)_llvm
      libGan = ../../Ganlib/lib/$(DIRNAME)_llvm
    else
      ifeq ($(FORTRANPATH),)
        $(error FORTRANPATH is not set)
      endif
      COMPILER = FORTRANPATH
      lib = ../lib/$(DIRNAME)
      libGan = ../../Ganlib/lib/$(DIRNAME)
    endif
  endif
endif
export COMPILER

all:
	$(MAKE) donjon
checkPython: ; @which python3 > /dev/null
ganlib: clean sub-make-ganlib pygan-ganlib
ifdef openmp
	@echo 'pygan_ganlib: openmp is defined'
endif
ifdef hdf5
	@echo 'pygan_ganlib: hdf5 is defined'
endif
trivac: clean sub-make-trivac pygan-trivac
ifdef openmp
	@echo 'pygan_trivac: openmp is defined'
endif
ifdef hdf5
	@echo 'pygan_trivac: hdf5 is defined'
endif
dragon: clean sub-make-dragon pygan-dragon
ifdef openmp
	@echo 'pygan_dragon: openmp is defined'
endif
ifdef hdf5
	@echo 'pygan_dragon: hdf5 is defined'
endif
donjon: clean sub-make-donjon pygan-donjon
ifdef openmp
	@echo 'pygan_donjon: openmp is defined'
endif
ifdef hdf5
	@echo 'pygan_donjon: hdf5 is defined'
endif
sub-make-ganlib:
	$(MAKE) openmp=$(openmp) -C ../../Utilib/src
	$(MAKE) openmp=$(openmp) hdf5=$(hdf5) -C ../../Ganlib/src
sub-make-trivac: sub-make-ganlib
	$(MAKE) openmp=$(openmp) hdf5=$(hdf5) -C ../../Trivac/src
sub-make-dragon: sub-make-trivac
	$(MAKE) openmp=$(openmp) hdf5=$(hdf5) -C ../../Dragon/src
sub-make-donjon: sub-make-dragon
	$(MAKE) openmp=$(openmp) hdf5=$(hdf5) -C ../../Donjon/src
libGanlib.a: $(lib)/ sub-make-ganlib
	cp $(libGan)/libGanlib.a .
	ar -d libGanlib.a xabort_c.o
	mv libGanlib.a $(lib)
$(lib)/:
	mkdir -p $(lib)/
pygan-ganlib: libGanlib.a sub-make-ganlib checkPython
	mkdir -p $(DIRNAME)
	cp *.[ch] $(DIRNAME)
	cp *.py $(DIRNAME)
	cd $(DIRNAME); ln -s setup_lcm.py setup.py; python3 -m pip install . --break-system-packages; rm setup.py
	cd $(DIRNAME); ln -s setup_lifo.py setup.py; python3 -m pip install . --break-system-packages; rm setup.py
ifdef openmp
	export CODE_EMBEDDED=GANLIB_OMP; cd $(DIRNAME); ln -s setup_cle2000.py setup.py; python3 -m pip install . --break-system-packages
else
	export CODE_EMBEDDED=GANLIB; cd $(DIRNAME); ln -s setup_cle2000.py setup.py; python3 -m pip install . --break-system-packages
endif
	/bin/rm -r $(DIRNAME)
pygan-trivac: libGanlib.a sub-make-trivac checkPython
	mkdir -p $(DIRNAME)
	cp *.[ch] $(DIRNAME)
	cp *.py $(DIRNAME)
	cd $(DIRNAME); ln -s setup_lcm.py setup.py; python3 -m pip install . --break-system-packages; rm setup.py
	cd $(DIRNAME); ln -s setup_lifo.py setup.py; python3 -m pip install . --break-system-packages; rm setup.py
ifdef openmp
	export CODE_EMBEDDED=TRIVAC_OMP; cd $(DIRNAME); ln -s setup_cle2000.py setup.py; python3 -m pip install . --break-system-packages
else
	export CODE_EMBEDDED=TRIVAC; cd $(DIRNAME); ln -s setup_cle2000.py setup.py; python3 -m pip install . --break-system-packages
endif
	/bin/rm -r $(DIRNAME)
pygan-dragon: libGanlib.a sub-make-dragon checkPython
	mkdir -p $(DIRNAME)
	cp *.[ch] $(DIRNAME)
	cp *.py $(DIRNAME)
	cd $(DIRNAME); ln -s setup_lcm.py setup.py; python3 -m pip install . --break-system-packages; rm setup.py
	cd $(DIRNAME); ln -s setup_lifo.py setup.py; python3 -m pip install . --break-system-packages; rm setup.py
ifdef openmp
	export CODE_EMBEDDED=DRAGON_OMP; cd $(DIRNAME); ln -s setup_cle2000.py setup.py; python3 -m pip install . --break-system-packages
else
	export CODE_EMBEDDED=DRAGON; cd $(DIRNAME); ln -s setup_cle2000.py setup.py; python3 -m pip install . --break-system-packages
endif
	/bin/rm -r $(DIRNAME)
pygan-donjon: libGanlib.a sub-make-donjon checkPython
	mkdir -p $(DIRNAME)
	cp *.[ch] $(DIRNAME)
	cp *.py $(DIRNAME)
	cd $(DIRNAME); ln -s setup_lcm.py setup.py; python3 -m pip install . --break-system-packages; rm setup.py
	cd $(DIRNAME); ln -s setup_lifo.py setup.py; python3 -m pip install . --break-system-packages; rm setup.py
ifdef openmp
	export CODE_EMBEDDED=DONJON_OMP; cd $(DIRNAME); ln -s setup_cle2000.py setup.py; python3 -m pip install . --break-system-packages
else
	export CODE_EMBEDDED=DONJON; cd $(DIRNAME); ln -s setup_cle2000.py setup.py; python3 -m pip install . --break-system-packages
endif
	/bin/rm -r $(DIRNAME)
clean:
	@echo 'clean PyGan'
	@echo '**********************************************'
	@echo '*** You should also clean Dragon or Donjon ***'
	@echo '**********************************************'
	/bin/rm -r -f ../lib
	/bin/rm -f sub-make*
