#  Top level -*- Makefile -*- for GHDL.
#  Copyright (C) 2002 - 2014 Tristan Gingold
#
#  GHDL is free software; you can redistribute it and/or modify it under
#  the terms of the GNU General Public License as published by the Free
#  Software Foundation; either version 2, or (at your option) any later
#  version.
#
#  GHDL is distributed in the hope that it will be useful, but WITHOUT ANY
#  WARRANTY; without even the implied warranty of MERCHANTABILITY or
#  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
#  for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with GCC; see the file COPYING.  If not, write to the Free
#  Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#  02111-1307, USA.
CC=@CC@
CXX=@CXX@
build=@build@
srcdir=@srcdir@
abs_srcdir=@abs_srcdir@
GNATMAKE=@GNATMAKE@
prefix=@prefix@
backend=@backend@
libdirsuffix=@libdirsuffix@
libdirreverse=@libdirreverse@
EXEEXT=@EXEEXT@
SOEXT=@SOEXT@
PIC_FLAGS=@PIC_FLAGS@
gcc_src_dir=@gcc_src_dir@
LLVM_CONFIG=@llvm_config@
LDFLAGS=@LDFLAGS@
LIBBACKTRACE=@backtrace_lib@
llvm_be=@llvm_be@
build_mode=@build_mode@
enable_werror=@enable_werror@
enable_checks=@enable_checks@
enable_openieee=@enable_openieee@

INSTALL_PROGRAM=install -m 755
INSTALL_DATA=install -m 644
PWD?=$(shell pwd)
DESTDIR=
bindir=$(prefix)/bin
libdir=$(prefix)/lib
incdir=$(prefix)/include
MKDIR=mkdir
LN=ln -s
CP=cp
MV=mv
SED=sed
GRT_RANLIB=ranlib

VHDL_LIB_DIR=$(prefix)/$(libdirsuffix)

ifeq "$(enable_checks)" "true"
 # Debug + checks
 OPT_FLAGS=-g
 ADA_FLAGS=-gnata
 LIB_CFLAGS=
else
 # Optimize + no checks
 ADA_FLAGS+=-gnatpn
 OPT_FLAGS+=-O
 LIB_CFLAGS=-O
endif

# Profiling.
#ADA_FLAGS+=-gnatn
#OPT_FLAGS+=-pg -O

# Coverage
ifeq "$(build_mode)" "coverage"
OPT_FLAGS+=-fprofile-arcs -ftest-coverage
endif

GNATFLAGS=-gnaty3befhkmr -gnatwa -gnatf -gnat05 $(OPT_FLAGS) $(ADA_FLAGS)
GRT_FLAGS=$(OPT_FLAGS)

WARN_CFLAGS=-Wall

GNAT_BARGS=-bargs -E

# Warnings as errors.  Comment this line if a warning looks not valid.
ifeq "$(enable_werror)" "true"
GNATFLAGS+=-gnatwe
endif

target=$(build)
#target=i686-pc-linux-gnu
#target=x86_64-pc-linux-gnu
#target=i686-apple-darwin
#target=x86_64-apple-darwin
#target=i386-pc-mingw32

ifeq ($(SOEXT),.so)
SHLIB_FLAGS=-Wl,-soname,$@
else ifeq ($(SOEXT),.dll)
SHLIB_FLAGS=
else ifeq ($(SOEXT),.dylib)
# Allow the use of -rpath in executable
SHLIB_FLAGS=-Wl,-install_name,@rpath/$@
endif

# Flags for libraries
LIBSRC_DIR:=$(srcdir)/libraries
LIBDST_DIR:=$(libdirsuffix)

LIBVHDL_FLAGS_TO_PASS=\
 LIBSRC_DIR="$(LIBSRC_DIR)" \
 LIBDST_DIR="$(LIBDST_DIR)" \
 enable_openieee="$(enable_openieee)" \
 LN="$(LN)" CP="$(CP)" MKDIR="$(MKDIR)"

all: Makefile all.$(backend)

install: install.$(backend)

check: check.$(backend)

copy-sources: copy-sources.$(backend)

libs: libs.vhdl.$(backend)

./config.status: $(srcdir)/configure
	@if [ -e $@ ]; then \
	  echo "./config.status --reconfigure"; \
	  ./config.status --reconfigure; \
	else \
	  echo "config.status is lost, please configure manually" ; \
	  exit 1; \
	fi

Makefile: $(srcdir)/Makefile.in ./config.status
	./config.status

GHDL_COMMON_INCFLAGS=-aI$(srcdir)/src -aI$(srcdir)/src/vhdl -aI$(srcdir)/src/grt -aI$(srcdir)/src/psl -aI$(srcdir)/src/vhdl/translate

GRTSRCDIR=$(abs_srcdir)/src/grt
include $(GRTSRCDIR)/Makefile.inc

version.tmp: $(srcdir)/src/version.in force
#	Create version.tmp from version.in, using git date/hash
	if [ -d $(srcdir)/.git ]; then \
	  desc=`cd $(srcdir); git describe --dirty`; \
	  $(SED) -e "s/[(].*[)]/($$desc)/" < $< > $@; \
	else \
	  $(CP) $< $@; \
	fi

version.ads: version.tmp
#	Change version.ads only if version.tmp has been modified to avoid
#	useless rebuild.
	if [ ! -r $@ ] || ! cmp $< $@ > /dev/null; then $(CP) $< $@; fi

#################### For mcode backend ##############################

all.mcode: ghdl_mcode$(EXEEXT) libs.vhdl.mcode all.vpi

GHDL_MCODE_INCFLAGS=$(GHDL_COMMON_INCFLAGS) -aI$(srcdir)/src/ghdldrv -aI$(srcdir)/src/ortho -aI$(srcdir)/src/ortho/mcode

ghdl_mcode$(EXEEXT): GRT_FLAGS+=-DWITH_GNAT_RUN_TIME
ghdl_mcode$(EXEEXT): $(GRT_ADD_OBJS) $(GRT_SRC_DEPS) $(ORTHO_DEPS) \
            memsegs_c.o chkstk.o version.ads force
	$(GNATMAKE) -o $@ $(GHDL_MCODE_INCFLAGS) $(GNATFLAGS) -gnatw.A ghdl_jit.adb $(GNAT_BARGS) -largs memsegs_c.o chkstk.o $(GRT_ADD_OBJS) $(LDFLAGS) $(GNAT_LARGS) $(subst @,$(GRTSRCDIR),$(GRT_EXTRA_LIB))

memsegs_c.o: $(srcdir)/src/ortho/mcode/memsegs_c.c
	$(CC) -c $(OPT_FLAGS) -o $@ $<

libs.vhdl.mcode: ghdl_mcode$(EXEEXT)
	$(MAKE) -f $(srcdir)/libraries/Makefile.inc $(LIBVHDL_FLAGS_TO_PASS) GHDL=$(PWD)/ghdl_mcode$(EXEEXT) GHDL_FLAGS="" VHDL_COPY_OBJS=no vhdl.libs.all

install.mcode.program: install.dirs ghdl_mcode$(EXEEXT)
	$(INSTALL_PROGRAM) ghdl_mcode$(EXEEXT) $(DESTDIR)$(bindir)/ghdl$(EXEEXT)

install.mcode: install.mcode.program install.vhdllib install.vpi

oread-mcode$(EXEEXT): force
	$(MAKE) -f $(srcdir)/src/ortho/mcode/Makefile \
	 ortho_srcdir=$(srcdir)/src/ortho ortho_exec=$@ \
	 GNAT_FLAGS="-aI$(srcdir)/src/ortho/oread $(GNATFLAGS)" all

#################### For gcc backend ##############################

gcc_vhdl_dir=$(gcc_src_dir)/gcc/vhdl

all.gcc:
	@echo "For installing sources in gcc, do:"
	@echo "1) make copy-sources"
	@echo "2) configure, build and install gcc"
	@echo "3) make ghdllib"
	@echo "4) make install"

copy-sources.gcc: version.ads
	$(RM) -rf $(gcc_vhdl_dir)
	$(MKDIR) $(gcc_vhdl_dir)
	$(CP) -p version.ads $(gcc_vhdl_dir)
	$(CP) -p $(srcdir)/src/*.ad? $(gcc_vhdl_dir)
	$(CP) -p $(srcdir)/src/vhdl/*.ad? $(gcc_vhdl_dir)
	$(CP) -p $(srcdir)/src/vhdl/translate/*.ad? $(gcc_vhdl_dir)
	$(CP) -p $(srcdir)/src/psl/*.ad? $(gcc_vhdl_dir)
	$(CP) -p $(srcdir)/src/grt/grt.ad? $(gcc_vhdl_dir)
	$(CP) -p $(srcdir)/src/grt/grt-fcvt.ad? $(gcc_vhdl_dir)
	$(CP) -p $(srcdir)/src/ortho/*.ad? $(gcc_vhdl_dir)
	$(CP) -p $(srcdir)/src/ortho/gcc/*.ad? $(gcc_vhdl_dir)
	$(CP) -p $(srcdir)/src/ortho/gcc/*.c $(gcc_vhdl_dir)
	$(CP) -p $(srcdir)/src/ortho/gcc/*.opt $(gcc_vhdl_dir)
	base_ver=`cat $(gcc_src_dir)/gcc/BASE-VER`; \
	case $$base_ver in \
	 4.9*)     gcc_ortho_lang=ortho-lang-49.c ;; \
	 5.*)      gcc_ortho_lang=ortho-lang-5.c ;; \
	 6 | 6.*)  gcc_ortho_lang=ortho-lang-6.c ;; \
	 7.*)      gcc_ortho_lang=ortho-lang-7.c ;; \
	 *) echo "Mismatch gcc version from $(gcc_src_dir)"; \
	    echo "Need gcc version 4.9.x, 5.x, 6.x or 7.x"; \
	    exit 1 ;; \
	esac; \
	$(CP) -p $(srcdir)/src/ortho/gcc/$$gcc_ortho_lang \
	  $(gcc_vhdl_dir)/ortho-lang.c
	$(CP) -p $(srcdir)/doc/ghdl.texi $(srcdir)/doc/ghdl.1 $(gcc_vhdl_dir)
	$(MKDIR) $(gcc_vhdl_dir)/ghdldrv
	$(CP) -pR $(srcdir)/src/ghdldrv/*.ad? $(gcc_vhdl_dir)/ghdldrv
	$(CP) -p $(srcdir)/dist/gcc/Make-lang.in $(gcc_vhdl_dir)
	$(CP) -p $(srcdir)/dist/gcc/config-lang.in $(gcc_vhdl_dir)
	$(CP) -p $(srcdir)/dist/gcc/lang-options.h $(gcc_vhdl_dir)
	$(CP) -p $(srcdir)/dist/gcc/lang-specs.h $(gcc_vhdl_dir)

# To build vhdl libs using a non-installed ghdl, define GHDL_GCC_BIN to the
# path of ghdl and GHDL1_GCC_BIN to path of ghdl1
GHDL_GCC_BIN=$(bindir)/ghdl$(EXEEXT)
GHDL1_GCC_BIN=  # --GHDL1=/path/to/ghdl1

libs.vhdl.gcc:
	$(MAKE) -f $(srcdir)/libraries/Makefile.inc $(LIBVHDL_FLAGS_TO_PASS) GHDL="$(GHDL_GCC_BIN)" GHDL_FLAGS="$(GHDL1_GCC_BIN) $(LIB_CFLAGS)" vhdl.libs.all libs.vhdl.standard

ghdllib: libs.vhdl.gcc $(libdirsuffix)/libgrt.a

install.gcc: install.vhdllib install.grt install.vpi

#################### For gcc backend - development only (local build) ####

GHDL_GCC_INCFLAGS=$(GHDL_COMMON_INCFLAGS)

ghdl1-gcc$(EXEEXT): version.ads force
	$(MAKE) -f $(srcdir)/src/ortho/gcc/Makefile \
	 ortho_srcdir=$(srcdir)/src/ortho ortho_exec=$@ \
	 GNAT_FLAGS="$(GHDL_GCC_INCFLAGS) $(GNATFLAGS)" all

ghdl_gcc$(EXEEXT): version.ads force
	$(GNATMAKE) $(GHDL_GCC_INCFLAGS) -aI$(srcdir)/src/ghdldrv \
	 $(GNATFLAGS) ghdl_gcc $(GNAT_BARGS) -largs $(GNAT_LARGS)

libs.vhdl.local_gcc: ghdl_gcc$(EXEEXT) ghdl1-gcc$(EXEEXT)
	$(MAKE) -f $(srcdir)/libraries/Makefile.inc $(LIBVHDL_FLAGS_TO_PASS) GHDL=$(PWD)/ghdl_gcc$(EXEEXT) GHDL_FLAGS="--GHDL1=$(PWD)/ghdl1-gcc$(EXEEXT) $(LIB_CFLAGS)" vhdl.libs.all libs.vhdl.standard

ghdl1-debug$(EXEEXT): version.ads force
	$(MAKE) -f $(srcdir)/src/ortho/debug/Makefile \
	 ortho_srcdir=$(srcdir)/src/ortho ortho_exec=$@ \
	 GNAT_FLAGS="$(GHDL_GCC_INCFLAGS) $(GNATFLAGS)" \
	 GNATMAKE="$(GNATMAKE)" all

oread-gcc$(EXEEXT): force
	$(MAKE) -f $(srcdir)/src/ortho/gcc/Makefile \
	 ortho_srcdir=$(srcdir)/src/ortho ortho_exec=$@ \
	 GNAT_FLAGS="-aI$(srcdir)/src/ortho/oread $(GNATFLAGS)" all

#################### For llvm backend ##############################

GHDL_LLVM_INCFLAGS=$(GHDL_COMMON_INCFLAGS) -aI$(srcdir)/src/ghdldrv -aI$(srcdir)/src/ortho -aI$(srcdir)/src/ortho/$(llvm_be)

all.llvm: ghdl1-llvm$(EXEEXT) ghdl_llvm$(EXEEXT) grt-all libs.vhdl.llvm all.vpi

all.llvm_jit: ghdl_llvm_jit$(EXEEXT)

ghdl_llvm_jit$(EXEEXT): GRT_FLAGS+=-DWITH_GNAT_RUN_TIME
ghdl_llvm_jit$(EXEEXT): $(GRT_ADD_OBJS) $(GRT_SRC_DEPS) $(ORTHO_DEPS) \
               llvm-cbindings.o version.ads force
	$(GNATMAKE) -o $@ $(GHDL_LLVM_INCFLAGS) $(GNATFLAGS) ghdl_jit.adb \
	 $(GNAT_BARGS) -largs llvm-cbindings.o $(GNAT_LARGS) $(GRT_ADD_OBJS) \
	 $(subst @,$(GRTSRCDIR),$(GRT_EXTRA_LIB)) --LINK=$(CXX) \
	 `$(LLVM_CONFIG) --ldflags --libs --system-libs` $(LDFLAGS)

llvm-cbindings.o: $(srcdir)/src/ortho/$(llvm_be)/llvm-cbindings.cpp
	$(CXX) -c `$(LLVM_CONFIG) --includedir --cxxflags` \
	  $(OPT_FLAGS) -o $@ $<

libs.vhdl.llvmjit: ghdl_llvm_jit$(EXEEXT)
	$(MAKE) -f $(srcdir)/libraries/Makefile.inc $(LIBVHDL_FLAGS_TO_PASS) GHDL=$(PWD)/ghdl_llvm$(EXEEXT) GHDL_FLAGS="" VHDLLIBS_COPY_OBJS=no vhdl.libs.all

libs.vhdl.llvm: ghdl_llvm$(EXEEXT) ghdl1-llvm$(EXEEXT)
	$(MAKE) -f $(srcdir)/libraries/Makefile.inc $(LIBVHDL_FLAGS_TO_PASS) GHDL=$(PWD)/ghdl_llvm$(EXEEXT) GHDL_FLAGS="--GHDL1=$(PWD)/ghdl1-llvm$(EXEEXT) $(LIB_CFLAGS)" vhdl.libs.all libs.vhdl.standard

ghdl_llvm$(EXEEXT): version.ads force
	$(GNATMAKE) $(GHDL_LLVM_INCFLAGS) -aI$(srcdir)/src/ghdldrv $(GNATFLAGS)\
	 ghdl_llvm $(GNAT_BARGS) -largs $(LDFLAGS) $(GNAT_LARGS)

ghdl1-llvm$(EXEEXT): version.ads force
	$(MAKE) -f $(srcdir)/src/ortho/$(llvm_be)/Makefile \
	 ortho_srcdir=$(srcdir)/src/ortho ortho_exec=$@ \
	 GNAT_FLAGS="$(GHDL_LLVM_INCFLAGS) $(GNATFLAGS)" LDFLAGS="$(LDFLAGS)" \
	 LLVM_CONFIG="$(LLVM_CONFIG)" CXX="$(CXX)" \
	 all

oread-llvm$(EXEEXT): force
	$(MAKE) -f $(srcdir)/src/ortho/$(llvm_be)/Makefile \
	 ortho_srcdir=$(srcdir)/src/ortho ortho_exec=$@ \
	 GNATMAKE="$(GNATMAKE)" \
	 GNAT_FLAGS="-aI$(srcdir)/src/ortho/oread $(GNATFLAGS)" \
	 LLVM_CONFIG="$(LLVM_CONFIG)" CXX="$(CXX)"

install.llvm.program: install.dirs ghdl1-llvm$(EXEEXT) ghdl_llvm$(EXEEXT)
	$(INSTALL_PROGRAM) ghdl_llvm$(EXEEXT) $(DESTDIR)$(bindir)/ghdl$(EXEEXT)
	$(INSTALL_PROGRAM) ghdl1-llvm$(EXEEXT) $(DESTDIR)$(bindir)/ghdl1-llvm$(EXEEXT)

install.llvm: install.llvm.program install.vhdllib install.grt install.vpi

################ For simul (no code generation, interpretation) ##########

GHDL_SIMUL_INCFLAGS=$(GHDL_COMMON_INCFLAGS) -aI$(srcdir)/src/ghdldrv -aI$(srcdir)/src/vhdl/simulate -aI$(srcdir)/src/synth

ghdl_simul$(EXEEXT): $(GRT_ADD_OBJS) $(GRT_SRC_DEPS) version.ads force
	$(GNATMAKE) $(GHDL_SIMUL_INCFLAGS) $(GNATFLAGS) -gnat12 ghdl_simul $(GNAT_BARGS) -largs $(GNAT_LARGS) $(GRT_ADD_OBJS) $(subst @,$(GRTSRCDIR),$(GRT_EXTRA_LIB))

libs.vhdl.simul: ghdl_simul$(EXEEXT)
	$(MAKE) -f $(srcdir)/libraries/Makefile.inc $(LIBVHDL_FLAGS_TO_PASS) GHDL=$(PWD)/ghdl_simul$(EXEEXT) GHDL_FLAGS="" VHDLLIBS_COPY_OBJS=no vhdl.libs.all

################ libghdl (library for the vhdl part) ####################

LIBGHDL_INCFLAGS=$(GHDL_COMMON_INCFLAGS) -aI$(srcdir)/src/vhdl/python -aI$(srcdir)/src/ghdldrv

libghdl$(SOEXT): $(GRT_SRC_DEPS) version.ads force
	$(GNATMAKE) -I- -aI. -D pic -z libghdl -o $@ $(GNATFLAGS) $(PIC_FLAGS) -gnat05 $(LIBGHDL_INCFLAGS) -bargs -shared -Llibghdl_ -largs -shared $(SHLIB_FLAGS)

################ ghdlsynth library ######################################

GHDL_SYNTHLIB_INCFLAGS=$(GHDL_COMMON_INCFLAGS) -aI$(srcdir)/src/synth -aI$(srcdir)/src/ghdldrv -aI$(srcdir)/src/vhdl/simulate

libghdlsynth.a: $(GRT_ADD_OBJS) $(GRT_SRC_DEPS) version.ads force
	$(GNATMAKE) -c libghdlsynth $(GNATFLAGS) -gnat12 $(GHDL_SYNTHLIB_INCFLAGS)
	gnatbind -Llibghdlsynth_ libghdlsynth.ali -O > ghdlsynth.files
#	Extract link options, be sure to link statically with libgnat
	gnatbind -Llibghdlsynth_ libghdlsynth.ali -K -Z | sed -e '\@adalib/$$@s/-L//' -e '\@adalib/@s@adalib/@adalib/libgnat.a@' -e '/-lgnat/d' > ghdlsynth.link
	$(GNATMAKE) -c b~libghdlsynth.adb
	$(RM) -f $@
	ar rc $@ b~libghdlsynth.o `cat ghdlsynth.files` $(GRT_ADD_OBJS)

libghdlsynth$(SOEXT): $(GRT_ADD_SHOBJS) $(GRT_SRC_DEPS) version.ads force
	$(GNATMAKE) -I- -aI. -D pic -z libghdlsynth -o $@ $(GNATFLAGS) $(PIC_FLAGS) -gnat12 $(GHDL_SYNTHLIB_INCFLAGS) -bargs -shared -Llibghdlsynth_ -largs -shared $(GRT_ADD_SHOBJS) $(SHLIB_FLAGS)

install.libghdlsynth: install.libghdlsynth.include install.libghdlsynth.static install.libghdlsynth.shared

install.libghdlsynth.include: install.dirs
	$(INSTALL_DATA) -p $(srcdir)/src/synth/ghdlsynth.h $(DESTDIR)$(incdir)/
	$(INSTALL_DATA) -p $(srcdir)/src/synth/ghdlsynth_gates.h $(DESTDIR)$(incdir)/

install.libghdlsynth.static: libghdlsynth.a install.libghdlsynth.include
	$(INSTALL_DATA) -p libghdlsynth.a $(DESTDIR)$(libdir)/
	$(INSTALL_DATA) -p ghdlsynth.link $(DESTDIR)$(libdir)/

install.libghdlsynth.shared: libghdlsynth$(SOEXT) install.libghdlsynth.include
	$(INSTALL_DATA) -p libghdlsynth$(SOEXT) $(DESTDIR)$(libdir)/

################ ghwdump #################################################

GHWDUMP_OBJS=ghwdump.o ghwlib.o

ghwdump: $(GHWDUMP_OBJS)
	$(CC) -o $@ $(GHWDUMP_OBJS)

ghwdump.o: $(srcdir)/src/grt/ghwdump.c $(srcdir)/src/grt/ghwlib.h
	$(CC) -c -o $@ $< $(OPT_FLAGS) $(WARN_CFLAGS)

ghwlib.o: $(srcdir)/src/grt/ghwlib.c $(srcdir)/src/grt/ghwlib.h
	$(CC) -c -o $@ $< $(OPT_FLAGS) $(WARN_CFLAGS)

############### grt #####################################################

install.grt: $(libdirsuffix)/libgrt.a $(libdirsuffix)/grt.lst install.dirs
	$(INSTALL_DATA) $(libdirsuffix)/libgrt.a $(DESTDIR)$(VHDL_LIB_DIR)/libgrt.a
	$(INSTALL_DATA) $(libdirsuffix)/grt.lst $(DESTDIR)$(VHDL_LIB_DIR)/grt.lst
	$(INSTALL_DATA) $(GRTSRCDIR)/grt.ver $(DESTDIR)$(VHDL_LIB_DIR)/grt.ver
	test "x$(LIBBACKTRACE)" = x || test "x$(backend)" = xgcc || \
	  $(INSTALL_DATA) $(LIBBACKTRACE) $(DESTDIR)$(VHDL_LIB_DIR)/libbacktrace.a

################ VPI #####################################################

vpi_thunk.o: $(GRTSRCDIR)/vpi_thunk.c $(GRTSRCDIR)/vpi_thunk.h
#	Do not use OPT_FLAGS (do not enable coverage)
	$(CC) -c -o $@ $< $(PIC_FLAGS) -O $(WARN_CFLAGS)

libghdlvpi$(SOEXT): vpi_thunk.o
	$(CC) -o $@ $< -shared $(SHLIB_FLAGS)

all.vpi: libghdlvpi$(SOEXT)

install.vpi: all.vpi install.dirs
	$(INSTALL_DATA) -p libghdlvpi$(SOEXT) $(DESTDIR)$(libdir)/
	$(INSTALL_DATA) -p $(GRTSRCDIR)/vpi_user.h $(DESTDIR)$(incdir)/

################ Libraries ###############################################

LIBSRC_DIR:=$(srcdir)/libraries
LIBDST_DIR:=$(libdirsuffix)

VHDLLIB_SUBDIRS_COMMON= src/std src/synopsys src/openieee \
  v87/std v87/ieee v87/synopsys \
  v93/std v93/ieee v93/synopsys \
  v08/std

VHDLLIB_SUBDIRS_FULL= src/ieee src/vital95 src/vital2000 src/mentor \
  src/ieee2008 \
  v93/mentor v08/ieee v08/synopsys

ifeq ($(enable_openieee),false)
VHDLLIB_SUBDIRS=$(VHDLLIB_SUBDIRS_COMMON) $(VHDLLIB_SUBDIRS_FULL)
else
VHDLLIB_SUBDIRS=$(VHDLLIB_SUBDIRS_COMMON)
endif

install.dirs:
#	Use -p to create parents and to avoid error if existing.
	$(MKDIR) -p $(DESTDIR)$(prefix)
	$(MKDIR) -p $(DESTDIR)$(bindir)
	$(MKDIR) -p $(DESTDIR)$(libdir)
	$(MKDIR) -p $(DESTDIR)$(prefix)/$(libdirsuffix)
	$(MKDIR) -p $(DESTDIR)$(incdir)

install.vhdllib: install.dirs
#	Libraries (only if not empty)
	for d in $(VHDLLIB_SUBDIRS); do \
	  $(MKDIR) -p $(DESTDIR)$(VHDL_LIB_DIR)/$$d; \
	  $(INSTALL_DATA) -p \
	    $(LIBDST_DIR)/$$d/* $(DESTDIR)$(VHDL_LIB_DIR)/$$d; \
	done
#	ANSI color
	$(INSTALL_DATA) -p \
	    $(srcdir)/dist/ansi_color.sh $(DESTDIR)$(VHDL_LIB_DIR)/;
#	Vendors scripts
	$(MKDIR) -p $(DESTDIR)$(VHDL_LIB_DIR)/vendors
	$(INSTALL_DATA) -p \
	    $(LIBSRC_DIR)/vendors/* $(DESTDIR)$(VHDL_LIB_DIR)/vendors/
	$(INSTALL_PROGRAM) -p \
	    $(LIBSRC_DIR)/vendors/*.sh $(DESTDIR)$(VHDL_LIB_DIR)/vendors/

####################### clean ############################################

clean: force
	$(RM) -f *.o *.ali b~*.ad? *~ *.d b__*.ad? *.a *.so *.deps *.bexch version.* *.dll *.dylib
	$(RM) -f ghdl_gcc$(EXEEXT) ghdl_mcode$(EXEEXT) ghdl$(EXEEXT) ghdl_llvm$(EXEEXT) ghdl_llvm_jit$(EXEEXT) ghdl_simul$(EXEEXT)
	$(RM) -f ghdl1-gcc$(EXEEXT) ghdl1-llvm$(EXEEXT) ghdl1-debug$(EXEEXT)
	$(RM) -f grt/run-bind.ad? grt.lst grt/grt-files grt/grt-files.in
	$(RM) -f grt/*.o grt/*.ali
	$(RM) -rf lib
	$(MAKE) create-dirs

distclean: clean
	$(RM) -f default_paths.ads ortho_code-x86-flags.ads
	$(RM) -f grt/grt-backtrace-impl.ads
	$(RM) -f Makefile config.status ghdl.gpr

clean-c: force
	$(RM) -f memsegs_c.o chkstk.o jumps.o times.o grt-cbinding.o grt-cvpi.o
	$(RM) -f fstapi.o fastlz.o lz4.o
	$(RM) -f pic/times.o pic/grt-cvpi.o pic/jumps.o

create-dirs: force
	for d in $(VHDLLIB_SUBDIRS); do \
	  $(MKDIR) -p $(LIBDST_DIR)/$$d; \
	done

# Remove non GPL compatible source files
clean-pure-gpl:
#       IEEE 1164 or vital libraries aren't GPL compatible
	$(RM) -rf libraries/ieee libraries/ieee2008
	$(RM) -rf libraries/vital95 libraries/vital2000
#	Don't promote deprecated mentor libraries; synopsys one is ok
	$(RM) -rf libraries/mentor
#	The GNA testsuite contains open-source reproducer that may not be GPL.
	$(RM) -rf testsuite/gna

force:

.PHONY: force clean distclean clean-c clean-pure-gpl