#Dependencies, must be sourced before any make command: 
#  . .setenv.dot
#
#Targets:
#  versiontag: update VERSION tag file from git (NOT working on AIX)
#  all, allaix: build everything (allaix on AIX)
#  libs, force_libs: build librarys
#  allabs: build binary abs
#  allrcs, force_allrcs: build RCS dir from SRC
#  allssm, ssm_all, ssm_arch, force_ssm: build ssm pkg
#  install: install ssm pkg and create bundle with dependencies
#  clean, distclean: remove build and dist directories
#
#User Vars:
#  ROOTWORKDIR : optionaly force build in another dir  (not local)
#  VERSION : optionaly force version number
#  SSMDEPOTDIR:   where ssmpkg will be stored
#  SSMINSTALLDIR: install path for SSM bundles/domains/packages
#  SSMPREFIX:     path prefix (from SSMINSTALLDIR) [e.g. GEM/)
#  SSMBNDL_X:     x/ for experiemental/dev versions
#
#  Mandatory User's vars,    See: Makefile.dirs.km
#  Optional User's vars,     See: include/recettes 
#  ARCH Specific var&rules,  See: include/Makefile_$(BASE_ARCH)
#  SRC subdir specific vars, See: $(SRCDIR0)/*/mes_recettes
#
#Users Targets:
#  Will make "allbin" from: include/cibles

TOPDIR = $(PWD)
ROOTWORKDIR = $(TOPDIR)

VERSION = _unknown_
SSMARCH = _unknown_

.PHONY: all allaix all_Linux all_Linux_x86-64 all_AIX all_AIX-powerpc7
all: versiontag allssm
allaix: allssm #git not being functional on AIX, versiontag file needs to be produced on Linux
all_Linux: all
all_Linux_x86-64: all
all_AIX: allaix
all_AIX-powerpc7: allaix

include $(TOPDIR)/Makefile.base.mk
include $(TOPDIR)/include/cibles

# Distribution dest dir, used to make the SSM packages
DISTDIRROOT = $(ROOTWORKDIR)/__dist__
#For an ssm pck of type multi, DISTDIRALL=DISTDIRARCH=$(DISTDIRROOT)_multi
#DISTDIRALL = $(DISTDIRROOT)/multi
#DISTDIRARCH = $(DISTDIRALL)
DISTDIRALL = $(DISTDIRROOT)/all
DISTDIRARCH = $(DISTDIRROOT)/$(BASE_ARCH)
DISTDIRSSM = $(DISTDIRALL)

BINDIRALL = $(DISTDIRALL)/bin
BINDIRARCH = $(DISTDIRARCH)/bin
SRCDIR = $(DISTDIRALL)/src
INCDIR = $(DISTDIRALL)/include
MODDIRROOT = $(DISTDIRARCH)/include
MODDIR = $(MODDIRROOT)/$(EC_ARCH)
LIBDIRROOT = $(DISTDIRARCH)/lib
LIBDIR = $(LIBDIRROOT)/$(EC_ARCH)

# Build/working directory
BUILDDIRROOT = $(ROOTWORKDIR)/__build__
BUILDDIRALL = $(BUILDDIRROOT)/all
BUILDDIRARCH = $(BUILDDIRROOT)/$(EC_ARCH)

# 
INCPATH = $(MODDIR) $(INCDIR)/$(BASE_ARCH) $(INCDIR) $(EC_INCLUDE_PATH)
LIBPATH = $(LIBDIR) $(EC_LD_LIBRARY_PATH)

DOT_VERSION_FILE = $(LIBDIR)/.VERSION

# Location of make/targets helper scripts
UTILSBIN = $(modelutils)/bin

# .PHONY: git_checkout_tag
# git_checkout_tag:
# 	set -e ; \
# 	if [[ "x$(VERSION)" == "x" || "x$(VERSION)" == "x_unknown_" ]] ; then \
# 		echo "ERROR: VERSION= is a mandatory argument"; \
# 		echo "USAGE: $(MAKE) $@ VERSION=SOME_VERSION_NUMBER"; \
# 		exit 1 ; \
# 	fi; \
# 	git checkout $(LIBNAME)_$(VERSION) -b $(LIBNAME)_$(VERSION)-branch ;\
# 	$(MAKE) versiontag

# .PHONY: git_checkin_tag
# git_checkin_tag:
# 	set -e ; \
# 	if [[ "x$(VERSION)" == "x" || "x$(VERSION)" == "x_unknown_" ]] ; then \
# 		echo "ERROR VERSION= is a mandatory argument"; \
# 		echo "USAGE: $(MAKE) $@ VERSION=SOME_VERSION_NUMBER"; \
# 		exit 1 ; \
# 	fi; \
# 	echo $(VERSION) > $(TOPDIR)/VERSION ;\
# 	git commit -a ;\
# 	git tag $(LIBNAME)_$(VERSION) ;\
# 	git push --all ;\
# 	git push --tags


VERSION: #TODO: honor "make ... VERSION=..."
	version=`$(UTILSBIN)/mu.git_tag_echo | cut -d_ -f2` ;\
	if [ x$$version != x ] ; then \
		echo "echo $$version \> $(TOPDIR)/VERSION" ;\
		echo $$version > $(TOPDIR)/VERSION ;\
	else \
		echo "ERROR: Cannot get version info" ;\
		exit 1 ;\
	fi

.PHONY: versiontag
versiontag:
	rm -f $(TOPDIR)/VERSION ;\
	$(MAKE) VERSION

$(LIBDIR)/.VERSION:
	$(UTILSBIN)/mu.mk_version_file $(LIBNAME) $(VERSION) $(LIBDIR) sh s
$(MODDIR)/$(LIBNAME)_version.dot:
	$(UTILSBIN)/mu.mk_version_file $(LIBNAME) $(VERSION) $(MODDIR) sh ;\
	$(UTILSBIN)/mu.mk_version_file $(LIBNAME) $(VERSION) $(MODDIR) c ;\
	$(UTILSBIN)/mu.mk_version_file $(LIBNAME) $(VERSION) $(MODDIR) f

.PHONY: versionfile
versionfile: VERSION
	version=`cat $(TOPDIR)/VERSION` ;\
	$(MAKE) $(LIBDIR)/.VERSION VERSION=$$version ;\
	$(MAKE) $(MODDIR)/$(LIBNAME)_version.dot VERSION=$$version


$(BINDIRARCH):
	mkdir -p $(BINDIRARCH) 2>/dev/null || true
$(BINDIRALL):
	mkdir -p $(BINDIRALL) 2>/dev/null || true ; \
	$(MAKE) dist_update_bin
$(SRCDIR):
	mkdir -p $(SRCDIR) 2>/dev/null || true ; \
	$(MAKE) dist_update_src
$(INCDIR):
	mkdir -p $(INCDIR) 2>/dev/null || true ; \
	$(MAKE) dist_update_inc
$(MODDIR):
	mkdir -p $(MODDIR) 2>/dev/null || true;\
	cd $(MODDIRROOT) && ln -s ./$(EC_ARCH)/. `echo $(EC_ARCH) | tr '/' '_'` 2>/dev/null || true
$(LIBDIR):
	mkdir -p $(LIBDIR) 2>/dev/null || true ;\
	cd $(LIBDIRROOT) && ln -s ./$(EC_ARCH)/. `echo $(EC_ARCH) | tr '/' '_'` 2>/dev/null || true


.PHONY: distdir update_src
distdir: $(BINDIRARCH) $(BINDIRALL) $(SRCDIR) $(INCDIR) $(MODDIR) $(LIBDIR)

.PHONY: distdir dist_update dist_update_src dist_update_bin dist_update_inc
dist_update_src: $(SRCDIR)
	for dir in $(SUBDIRS_SRC) ; do\
		rsync -a --delete $(SRCDIR0)/$$dir $(SRCDIR) ;\
	done
	find $(SRCDIR) -type f -exec chmod a-wx {} \;
dist_update_bin: $(SRCBIN)
	rsync -a --delete $(BINDIR0)/ $(BINDIRALL)/ ;\
	find $(BINDIRALL) -type f -exec chmod a-w+x {} \;
dist_update_inc: $(INCDIR)
	rsync -a --delete $(INCDIR0)/ $(INCDIR)/
	find $(INCDIR) -type f -exec chmod a-wx {} \;
dist_update: dist_update_src dist_update_bin dist_update_inc

$(BUILDDIRALL):
	mkdir -p $(BUILDDIRALL) 2>/dev/null || true ; \
	$(MAKE) build_update_all
$(BUILDDIRARCH):
	mkdir -p $(BUILDDIRARCH) 2>/dev/null || true ; \
	$(MAKE) build_update_arch
BUILDDIRARCHDEP:
	for dir in $(SUBDIRS_LIB) ; do\
		(cd $(BUILDDIRARCH)/$$dir ;\
		ln -s $(TOPDIR)/Makefile.subdir.mk Makefile 2>/dev/null || true ;\
		touch mes_recettes Makefile.dep.mk ;\
		$(MAKE) _dep TOPDIR=$(TOPDIR) ) ;\
	done


.PHONY: builddir builddirallonly build_update build_update_all build_update_arch
builddir: $(BUILDDIRARCH) $(BUILDDIRALL) BUILDDIRARCHDEP
builddirallonly: $(BUILDDIRALL)
build_update_all: $(BUILDDIRALL)
	for dir in $(SUBDIRS_SRC) ; do\
		rsync -a --delete $(SRCDIR0)/$$dir $(BUILDDIRALL) ;\
	done
build_update_arch: $(BUILDDIRARCH)
	for dir in $(SUBDIRS_SRC) ; do\
		rsync -a  $(SRCDIR0)/$$dir $(BUILDDIRARCH) ;\
	done
build_update: build_update_all build_update_arch


.PHONY: objects
objects: distdir builddir versionfile build_update
	for dir in $(SUBDIRS_LIB) ; do\
		(cd $(BUILDDIRARCH)/$$dir && \
		$(MAKE) _objects \
			EC_INCLUDE_PATH="$(INCPATH)" \
			TOPDIR=$(PWD)) ;\
	done


$(LIBDIR)/lib$(LIBNAME).a: 
	cd $(LIBDIR) ;\
	for libnm in $(SUBDIRS_MERGE) ; do \
		ar x lib$(LIBNAME)_$$libnm.a ;\
	done ;\
	ar rv $(LIBDIR)/lib$(LIBNAME).a *.o ;\
	rm -f *.o

.PHONY: libs force_libs
libs:  distdir builddir versionfile build_update
	version=`cat $(TOPDIR)/VERSION` ;\
	for dir in $(SUBDIRS_LIB) ; do\
		(cd $(BUILDDIRARCH)/$$dir ;\
		$(MAKE) $(LIBDIR)/lib$(LIBNAME)_$$dir.a \
			EC_INCLUDE_PATH="$(INCPATH)" TOPDIR=$(TOPDIR) \
			LIBDIR=$(LIBDIR) MODDIR=$(MODDIR) LIBNAME="$(LIBNAME)_$$dir") ;\
		(cd $(LIBDIR) ;\
		ln -s ./lib$(LIBNAME)_$$dir.a lib$(LIBNAME)_$${dir}_$${version}.a) 2>/dev/null || true ;\
		ls -l $(LIBDIR)/lib$(LIBNAME)_$$dir.a ;\
	done ;\
	$(MAKE) $(LIBDIR)/lib$(LIBNAME).a ;\
	(cd $(LIBDIR) ;\
	ln -s ./lib$(LIBNAME).a lib$(LIBNAME)_$${version}.a) 2>/dev/null || true ;\
	ls -l $(LIBDIR)/lib$(LIBNAME).a
force_libs: 
	rm -f $(LIBDIR)/*.a  2>/dev/null || true ;\
	$(MAKE) libs


.PHONY: allabs
allabs: libs
	$(MAKE) allbin

$(DISTDIRALL)/RCS:
	mkdir -p $(DISTDIRALL)/RCS 2>/dev/null || true ; \
	cd $(TOPDIR)/include ;\
	cp .[rc]* $(DISTDIRALL)/RCS 2>/dev/null || true ; \
	for item in `ls -1 recettes* cibles* 2>/dev/null`; do \
		cp $$item $(DISTDIRALL)/RCS/.$$item  2>/dev/null || true ;\
	done ;\
	ls -ld $(DISTDIRALL)/RCS ;\
	for dir in $(SUBDIRS_SRC) ; do \
		$(UTILSBIN)/mu.src2rcs $(BUILDDIRALL)/$$dir ;\
		rm -rf $(DISTDIRALL)/RCS_`echo $$dir | tr 'a-z' 'A-Z'` ;\
		mv $(BUILDDIRALL)/$$dir/RCS $(DISTDIRALL)/RCS_`echo $$dir | tr 'a-z' 'A-Z'` ;\
		ls -ld $(DISTDIRALL)/RCS_`echo $$dir | tr 'a-z' 'A-Z'` ;\
	done ;\

.PHONY: allrcs force_allrcs
allrcs: build_update_all $(DISTDIRALL)/RCS
force_allrcs:
	rm -rf $(DISTDIRALL)/RCS*  2>/dev/null || true ;\
	$(MAKE) allrcs


BUILDINFO:
	echo "Dependencies (s.ssmuse.dot): " > $@
	cat ssmuse_dependencies.bndl >> $@


$(SSMDEPOTDIR)/$(LIBNAME)_$(VERSION)_$(SSMARCH).ssm:
	$(MAKE) BUILDINFO distdir rcs libs allabs ;\
	$(UTILSBIN)/mu.mk_ssm_pkg \
		-s $(DISTDIRSSM) -r $(SSMDEPOTDIR) \
		-t $(SSMPKGDIR)/PKG_V998V_multi.ssm \
		-n $(LIBNAME) -v $(VERSION) -a $(SSMARCH) \
		-b $(TOPDIR)/BUILDINFO -d $(TOPDIR)/DESCRIPTION 

.PHONY: allssm ssm_all ssm_arch force_ssm
allssm: ssm_all ssm_arch
force_ssm: VERSION
	version=`cat $(TOPDIR)/VERSION` ;\
	rm -f $(SSMDEPOTDIR)/$(LIBNAME)_$${version}_*.ssm 2>/dev/null || true ;\
	$(MAKE) allssm

ssm_all: VERSION
	version=`cat $(TOPDIR)/VERSION` ;\
	ssmarch=all ;\
	$(MAKE) $(SSMDEPOTDIR)/$(LIBNAME)_$${version}_$${ssmarch}.ssm \
		VERSION=$${version} SSMARCH=$${ssmarch} DISTDIRSSM=$(DISTDIRALL);\
	ls -l $(SSMDEPOTDIR)/$(LIBNAME)_$${version}_$${ssmarch}.ssm

ssm_multi: VERSION
	version=`cat $(TOPDIR)/VERSION` ;\
	ssmarch=multi ;\
	$(MAKE) $(SSMDEPOTDIR)/$(LIBNAME)_$${version}_$${ssmarch}.ssm \
		VERSION=$${version} SSMARCH=$${ssmarch} DISTDIRSSM=$(DISTDIRALL);\
	ls -l $(SSMDEPOTDIR)/$(LIBNAME)_$${version}_$${ssmarch}.ssm

ssm_arch: VERSION
	version="`cat $(TOPDIR)/VERSION`" ;\
	ssmarch="`$(UTILSBIN)/mu.ssmarch`" ;\
	$(MAKE) $(SSMDEPOTDIR)/$(LIBNAME)_$${version}_$${ssmarch}.ssm \
		VERSION=$${version} SSMARCH=$${ssmarch} DISTDIRSSM=$(DISTDIRARCH);\
	ls -l $(SSMDEPOTDIR)/$(LIBNAME)_$${version}_$${ssmarch}.ssm


$(SSMINSTALLDIR)/$(SSMPREFIXDOMFULL)$(LIBNAME)/$(VERSION)/etc/ssm.d:
	mkdir -p $(SSMINSTALLDIR)/$(SSMPREFIXDOMFULL)$(LIBNAME)/$(VERSION) 2>/dev/null || true ;\
	mydomain=`true_path $(SSMINSTALLDIR)/$(SSMPREFIXDOMFULL)$(LIBNAME)/$(VERSION)` ;\
	ssm created -d $${mydomain} --defaultRepositorySource $(SSMDEPOTDIR) --yes ;\
	[[ ! -e $${mydomain}/.SsmDepot ]] && echo $(SSMDEPOTDIR) > $${mydomain}/.SsmDepot

#TODO: lock/unlock domain/pkg
$(SSMINSTALLDIR)/$(SSMPREFIXDOMFULL)$(LIBNAME)/$(VERSION)/$(LIBNAME)_$(VERSION)_$(SSMARCH): 
	mydomain=`true_path $(SSMINSTALLDIR)/$(SSMPREFIXDOMFULL)$(LIBNAME)/$(VERSION)` ;\
	(cd $${mydomain} ;\
	ssm install -d $${mydomain} -p $(LIBNAME)_$(VERSION)_$(SSMARCH) --yes --skipOnInstalled ;\
	ssm publish -d $${mydomain} -p $(LIBNAME)_$(VERSION)_$(SSMARCH) --yes --skipOnPublished)

$(SSMINSTALLDIR)/$(SSMPREFIXFULL)$(LIBNAME)/$(VERSION).bndl:
	mkdir -p $(SSMINSTALLDIR)/$(SSMPREFIXFULL)$(LIBNAME) 2>/dev/null || true ;\
	cat $(SSMDEPENDENCIES) > $(SSMINSTALLDIR)/$(SSMPREFIXFULL)$(LIBNAME)/$(VERSION).bndl ;\
	echo $(SSMPREFIXDOMFULL)$(LIBNAME)/$(VERSION) >> $(SSMINSTALLDIR)/$(SSMPREFIXFULL)$(LIBNAME)/$(VERSION).bndl ;\
	ls -l $(SSMINSTALLDIR)/$(SSMPREFIXFULL)$(LIBNAME)/$(VERSION).bndl

.PHONY: install install_domain install_pkg install_bndl
install_domain: $(SSMINSTALLDIR)/$(SSMPREFIXDOMFULL)$(LIBNAME)/$(VERSION)/etc/ssm.d
install_pkg: install_domain $(SSMINSTALLDIR)/$(SSMPREFIXDOMFULL)$(LIBNAME)/$(VERSION)/$(LIBNAME)_$(VERSION)_$(SSMARCH)
install_bndl: install_domain $(SSMINSTALLDIR)/$(SSMPREFIXFULL)$(LIBNAME)/$(VERSION).bndl
install: allssm
	version="`cat $(TOPDIR)/VERSION`" ;\
	for pkg in `ls -1 $(SSMDEPOTDIR)/$(LIBNAME)_$${version}_*.ssm` ; do \
		ssmarch=$${pkg##*_} ; ssmarch=$${ssmarch%.*};\
		$(MAKE) install_pkg VERSION=$${version} SSMARCH=$${ssmarch} ;\
	done ;\
	$(MAKE) install_bndl VERSION=$${version}

#TODO: make alltests

.PHONY: clean distclean
clean:
	rm -rf $(BUILDDIRROOT) 2> /dev/null || true
distclean: clean
	rm -rf $(DISTDIRROOT) 2> /dev/null || true
