#$Id: makefile,v 1.57 2018/06/21 10:58:44 sofc Exp $
httpd_conf := $(shell locate httpd.conf | grep -P '.conf$$')
centos := $(shell uname -r | perl -ne '{/\.(el\d+)\./; print $$1};print "\n";')
ifeq ($(httpd_conf),)
else
	cgi := $(shell grep -P '^[\s\t]*ScriptAlias' $(httpd_conf) | perl -e 'while ($$v = <>){chomp $$v; $$v =~ /\"([\w\-\/]+)\"/; print $$1};')
	html := $(shell grep -P '^[\s\t]*DocumentRoot' $(httpd_conf) | perl -e 'while ($$v = <>){chomp $$v; $$v =~ /\"([\w\-\/]+)\"/; print $$1};')
	user := $(shell grep -P '^[\s\t]*User\b' $(httpd_conf) | perl -e 'while ($$v = <>){chomp $$v; $$v =~ /(\w+)$$/; print $$1;};')
	group := $(shell grep -P '^[\s\t]*Group\b' $(httpd_conf) | perl -e 'while ($$v = <>){chomp $$v; $$v =~ /(\w+)$$/; print $$1;};')
endif
libdir := $(shell locate CGI.pm | perl -e 'while (<>){if(/(.*)\/CGI.pm/){print $$1;exit;}}')
yum := $(shell type yum 2> /dev/null)

LIBS = Debug.pm SemaforeFile.pm SocketClient.pm LATEX.pm ElchemeaConfig.pm
IMP = Base.pm Complex.pm Device.pm Header.pm IMPCGI.pm Model.pm RQ.pm W.pm H.pm
PROGS = LATEX-server z_to_i2b ps2png
SUBDIRS = 

.PHONEY: libs implibs dist CPAN test clean

version := $(shell perl get_version.pl)
dist_version := $(shell perl -e 'use Impedance::Header; print $$Impedance::Header::VERSION')

all:
ifeq ($(httpd_conf),)
else
	./set_web.pl Impedance/Header.pm
	chmod 644 Impedance/Header.pm
	mv Impedance/Header.pm.new Impedance/Header.pm
	chmod 644 Impedance/Header.pm
endif
	@echo ""
	@echo ""
	@echo "    Elchemea Analytics installer"
	@echo ""
	@echo ""
	@for i in $(SUBDIRS); do \
	echo "make all in $$i..."; \
	(cd $$i; $(MAKE) $(MFLAGS) $(MYMAKEFLAGS) all); done
ifeq ($(httpd_conf),)
	@echo "Web server not found, only command line install possible!"
	@echo "make install_cmdonly will install files in the following directories:"
else
	@echo "Web server user and group is (according to $(httpd_conf)):"
	@echo "user: $(user)"
	@echo "group: $(group)"
	@echo "Document root is: $(html)"
	@echo "CGI script dir is: $(cgi)"
	@echo "make install will install files in the following directories:"
	@echo "$(cgi)/analytic/"
	@echo "$(html)/analytic/"
endif
	@echo "/usr/local/bin/analytic/"
	@echo "/home/analytic/"
	@echo ""
	@echo ""
ifeq ($(httpd_conf),)
	@echo "Nothing more to do here, run 'make install_cmdonly' as root."
else
	@echo "Nothing more to do here, run 'make install' as root."
	@echo "If python is not installed (or old) use 'make install_nopython' instead."
	@echo "To test if the python libraries can be installed run 'make python' as root."
endif
	@echo ""
	@echo ""
	@echo "If SELinux is installed and running in enforcing mode, you mai need to run"
	@echo "'make fix_SELinux' after installation is complete."

/usr/local/bin/batchfit.pl:
	ln -s /usr/local/bin/analytic/batchfit.pl /usr/local/bin/batchfit.pl

fix_SELinux:
	setsebool -P httpd_can_network_connect on
	chcon -R -t httpd_sys_script_exec_t /usr/local/bin/analytic
	chcon -t httpd_sys_content_t /var/lock/
	chcon -R -t httpd_sys_content_t /var/lock/SemaforeFile/
	chcon -t httpd_sys_content_t /home/analytic/analytic_build

/etc/yum.repos.d/ScientificLinux.repo:
ifeq ($(yum),)
	@echo "Skipping update of python, no yum..." 
else
ifeq ($(centos),'el7')
	@echo "Skipping update of python as this is CentOS7, manual install nescesarry!"
else
	yum -y install numpy
	yum -y install scipy
endif
endif

python:
ifeq ($(yum),)
	@echo "Skipping update of python, no yum..." 
else
	yum -y install numpy
	yum -y install scipy
endif

python_old: /etc/yum.repos.d/ScientificLinux.repo 

CPAN: 
	cpan HTML::Parser
	cpan HTTP::Config
	cpan File::ReadBackwards
	cpan IO::Interface
	cpan IO::AtomicFile
	cpan Math::Complex
	cpan LWP::Simple
	cpan Class::Inspector
	cpan File::Touch
	cpan Unicode::String
ifeq ($(yum),)
	apt-get install libssl-dev
else
	yum install openssl-devel
endif
	cpan IO::Socket::SSL

install: python install_nopython

/var/lock/SemaforeFile:
	test -d /var/lock/SemaforeFile || mkdir /var/lock/SemaforeFile
	chmod 775 /var/lock/SemaforeFile
	chgrp lock /var/lock/SemaforeFile

dirs: /var/lock/SemaforeFile /usr/local/bin/analytic /home/analytic

install_cmdonly: CPAN dirs /usr/bin/latex implibs c_libs /usr/local/bin/batchfit.pl
ifeq ($(yum),)
	apt-get install gnuplot
else
	yum -y update gnuplot
endif
	@for i in $(SUBDIRS); do \
	echo "Installing in $$i..."; \
	(cd $$i; $(MAKE) $(MFLAGS) $(MYMAKEFLAGS) install); done
	cp analytic_build /home/analytic/
	cp update_host.txt /home/analytic/
	echo 'Cmdonly' > /home/analytic/install_mode.txt
	cp -R bin/* /usr/local/bin/analytic/

update_cmdonly: CPAN dirs /usr/bin/latex implibs c_libs /usr/local/bin/batchfit.pl
ifeq ($(yum),)
	@echo "No yum, skipping update of gnuplot!"
else
	yum -y update gnuplot
endif
	@for i in $(SUBDIRS); do \
	echo "Installing in $$i..."; \
	(cd $$i; $(MAKE) $(MFLAGS) $(MYMAKEFLAGS) update); done
	cp analytic_build /home/analytic/
	cp update_host.txt /home/analytic/
	cp -R bin/* /usr/local/bin/analytic/
	chmod 775 /var/lock/SemaforeFile
	chgrp lock /var/lock/SemaforeFile

install_nopython: CPAN dirs /usr/bin/latex $(html)/analytic/png $(cgi)/analytic implibs c_libs $(html)/index.html start_servers  /usr/local/bin/batchfit.pl
ifeq ($(centos),el7)
	bash centos7_fixprivatetmp.bash
endif
	@for i in $(SUBDIRS); do \
	echo "Installing in $$i..."; \
	(cd $$i; $(MAKE) $(MFLAGS) $(MYMAKEFLAGS) install); done
	cp analytic_build /home/analytic/
	cp update_host.txt /home/analytic/
	echo 'Full' > /home/analytic/install_mode.txt
	cp -R cgi/*.cgi $(cgi)/analytic/
	cp -R html/* $(html)/analytic/
	cp -R bin/* /usr/local/bin/analytic/
	@echo "Configuring automatic server start..."
	echo "/usr/local/bin/analytic/start_servers & " >> /etc/rc.local
	/usr/local/bin/analytic/start_servers &


update: CPAN dirs $(html)/analytic/png $(cgi)/analytic implibs c_libs $(html)/index.html start_servers /usr/local/bin/batchfit.pl
ifeq ($(yum),)
	@echo "No yum, skipping update..."
else
	yum -y update tetex tetex-fonts tetex-dvips tetex-latex ghostscript gnuplot
endif
	@for i in $(SUBDIRS); do \
	echo "Installing in $$i..."; \
	(cd $$i; $(MAKE) $(MFLAGS) $(MYMAKEFLAGS) update); done
	cp analytic_build /home/analytic/
	cp update_host.txt /home/analytic/
	cp -R cgi/*.cgi $(cgi)/analytic/
	cp -R html/* $(html)/analytic/
	cp -R bin/* /usr/local/bin/analytic/
	chmod 775 /var/lock/SemaforeFile
	chgrp lock /var/lock/SemaforeFile

start_servers: /usr/local/bin/analytic /usr/local/bin/analytic/start_servers

$(html)/index.html:
	cp index.html $(html)/index.html
	@echo "Copying index.html to default location!"

/usr/local/bin/analytic/start_servers:
	@echo "Creating start_servers file for automatic server start"
	@echo "/bin/su $(user) -s /bin/sh -c 'cd /tmp; /usr/local/bin/analytic/LATEX-server &'" > start_servers
	chmod 700 start_servers
	cp start_servers /usr/local/bin/analytic/
	rm -rf start_servers

/var/lock/SemaforeFile/:
	test -d /var/lock/SemaforeFile || mkdir /var/lock/SemaforeFile
	chmod 775 /var/lock/SemaforeFile
	chgrp lock /var/lock/SemaforeFile
	touch /var/lock/SemaforeFile/SemaforeFile.lock
	chmod 666 /var/lock/SemaforeFile/SemaforeFile.lock

/usr/bin/latex:
ifeq ($(yum),)
	@echo "No yum, skipping autoinstall of latex..."
else
	yum -y install tetex tetex-fonts tetex-dvips tetex-latex ghostscript gnuplot
endif

c_libs:
	for file in $(LIBS); do \
		cp libs/$$file $(libdir)/; \
	done

$(libdir)/Impedance:
	test -d $(libdir)/Impedance/ || mkdir $(libdir)/Impedance/

implibs: $(libdir)/Impedance
	for file in $(IMP); do \
		cp Impedance/$$file $(libdir)/Impedance/; \
	done

test:
	@echo "Testing makefile"
	@echo ""
	@echo "Current version:"
	@echo "ElchemeaAnalytic-$(version)"
	@echo "Current build:"
	@cat analytic_build 

$(cgi)/analytic: 
	test -d $(cgi)/analytic || mkdir $(cgi)/analytic

/home/analytic: 
	test -d /home/analytic || mkdir /home/analytic

$(html)/analytic: 
	test -d $(html)/analytic || mkdir $(html)/analytic

$(html)/analytic/png: $(html)/analytic
	test -d $(html)/analytic/png || mkdir $(html)/analytic/png
	chmod 777 $(html)/analytic/png

/usr/local/bin/analytic:
	test -d /usr/local/bin/analytic || mkdir /usr/local/bin/analytic
	chown $(user):$(group) /usr/local/bin/analytic

install_all: CPAN all test install

clean:
	rm -rf start_servers
	@for i in $(SUBDIRS); do \
	echo "Clearing in $$i..."; \
	(cd $$i; $(MAKE) $(MFLAGS) $(MYMAKEFLAGS) clean); done


uninstall:
	rm -rf /home/analytic
ifeq ($(httpd_conf),)
else
	rm -rf $(cgi)/analytic
	rm -rf $(html)/analytic
endif
	rm -rf /usr/local/bin/analytic
	if test !-d /usr/local/bin/elchemea/; \
		then if test !-d /usr/local/bin/celltest/; \
			for file in $(LIBS); do \
			rm $(libdir)/$$file; \
			done \
		fi \
	fi
	rm -rf $(libdir)/Impedance/
	@echo "Uninstall complete!"


## Only used by software distributor ##
dist_common: clean
	@echo "Retrieving latest committed files . . . ."
	for file in $(PROGS); do \
		co bin/$$file; \
	done
	rm -rf batchtest/*.png
	rm -rf batchtest/*.log
	co bin/*.pl
	co bin/*.py
	co libs/*.pm
	co cgi/*.cgi
	co html/*.js
	co html/*.css
	co Impedance/*.pm
	@echo "Incrementing build number";
	../incr_analytic_nr.pl
	@cat analytic_build
	cp analytic_build /home/analytic/
	(cd manual; $(MAKE) $(MFLAGS) $(MYMAKEFLAGS) all)
	cp manual/manual.pdf html/manual.pdf

## Only used by software distributor ##
dist: dist_common
	@echo "Building distribution tar file . . ."
	tar --exclude=RCS -czf ../ElchemeaAnalytic-$(dist_version).tgz ../ElchemeaAnalytic
	cp ../ElchemeaAnalytic-$(dist_version).tgz /home/http/html/dist/
	rm -rf /home/http/html/dist/ElchemeaAnalytic-$(dist_version)-unstable.tgz

## Only used by software distributor ##
test_dist: dist_common
	@echo "Building distribution tar file . . ."
	tar --exclude=RCS -czf ../ElchemeaAnalytic-$(dist_version)-unstable.tgz ../ElchemeaAnalytic
	cp ../ElchemeaAnalytic-$(dist_version)-unstable.tgz /home/http/html/dist/

## Only used by software distributor ##
publish:
	md5sum ../ElchemeaAnalytic-$(dist_version).tgz > md5.txt
	mv md5.txt ../
	sed -i 's/\.\.\///' ../md5.txt
	scp ../ElchemeaAnalytic-$(dist_version).tgz sofc@www.elchemea.dk:/var/www/html/dist/
	scp ../md5.txt sofc@www.elchemea.dk:/var/www/html/dist/
	scp /home/http/html/dist/analytic_version.txt sofc@www.elchemea.dk:/var/www/html/dist/
	scp manual/manual.pdf sofc@www.elchemea.dk:/var/www/html/dist/

