include Make.inc
include Make.rules

ifneq ($(MAKECMDGOALS),clean)
-include version.mk
ifneq (,$(USE_GLOBUS_GPT))
-include globus_makefile.mk
else
include globus_makefile.mk.pre
endif
endif

INSTALL_BASE=${NORDUGRID_LOCATION}
INSTALL_BIN=${NORDUGRID_LOCATION}/bin
INSTALL_LIB=${NORDUGRID_LOCATION}/lib
INSTALL_SBIN=${NORDUGRID_LOCATION}/sbin
INSTALL_LIBEXEC=${NORDUGRID_LOCATION}/libexec
INSTALL_DOC=${NORDUGRID_LOCATION}/doc
INSTALL_ETC=${NORDUGRID_LOCATION}/etc
INSTALL_INCLUDE=${NORDUGRID_LOCATION}/include
#LIBS=-L${GLOBUS_LIBS} -lglobus_rsl_${GLOBUS_FLAVOR} -lglobus_common_${GLOBUS_FLAVOR} -lpthread
GM_LIBS=-L${GLOBUS_LIBS} ${GLOBUS_GM_LIBS} -lpthread
NGCOPY_LIBS=-L${GLOBUS_LIBS} ${GLOBUS_NGCOPY_LIBS} -lpthread
DOWNLOADER_LIBS=-L${GLOBUS_LIBS} ${GLOBUS_DOWNLOADER_LIBS} -lpthread
UPLOADER_LIBS=$(DOWNLOADER_LIBS)
NGPARSERSL_LIBS=-L${GLOBUS_LIBS} ${GLOBUS_NGPARSERSL_LIBS} -lpthread
UI_LIBS=-L${GLOBUS_LIBS} ${GLOBUS_UI_LIBS} -lpthread
CPPLIBS=-lstdc++
INCLUDES=-I${GLOBUS_INCLUDES}
CC=gcc
CPP=g++
LD=ld
AR=ar r
CFLAGS=-g -O0 -ansi
PROGRAMS=grid-manager globus-script-ng-submit ngcopy ngremove ngacl \
         downloader uploader ng-parse-rsl
BINARIES=grid-manager downloader uploader \
         mail/smtp-send utils/gm-jobs ngcopy ngremove ngacl
SCRIPTS=mail/smtp-send.sh PBS/cancel-pbs-job PBS/submit-pbs-job \
        PBS/parse-pbs-log PBS/scan-pbs-job
STARTERS=init/grid-manager
LIBRARIES=libui.a
DEV_LIBRARIES=libui.a
DEV_INCLUDES=ui_uploader.h ui_downloader.h

GRIDFTP_BINARIES= gridftp/gridftp-server
GRIDFTP_SCRIPTS=
GRIDFTP_STARTERS=init/gridftp-server
GRIDFTP_LIBRARIES=gridftp/fileplugin/fileplugin.so gridftp/jobplugin/jobplugin.so

GLOBUS_SCRIPTS=globus-script-ng-submit globus-script-ng-rm \
               globus-script-ng-queue globus-script-ng-poll \
               ng-parse-rsl

OBJECTS=main.o jobs/users.o jobs/states.o jobs/job.o files/info_files.o \
        files/info_types.o rsl/parse_rsl.o rsl/subst_rsl.o run/run.o \
        config/config.o misc/canonical_dir.o config/environment.o \
        transfer/replica_utils.o misc/inttostring.o misc/delete.o \
        mail/send_mail.o config/gridmap.o config/config_file.o \
        misc/stringtoint.o misc/substitute.o misc/url_options.o \
        misc/escaped.o misc/log_time.o misc/job_log.o \
        cache/cache.o cache/cache_cleaner.o
NGCOPY_OBJECTS=ngcopy.o ngremove.o ngacl.o \
        datamove/databufferpar.o \
        datamove/datahandle.o datamove/datahandle_file.o \
        datamove/datahandle_ftp.o datamove/datamove.o \
        datamove/datahandle_http.o \
        datamove/datapoint.o datamove/datapoint_rc.o datamove/datapoint_rls.o \
        misc/log_time.o transfer/replica.o \
        misc/inttostring.o misc/stringtoint.o \
        misc/url_options.o transfer/replica_utils.o \
        datamove/datacache.o cache/cache.o datamove/dataspeed.o \
        misc/globus_error_utils.o transfer/url_map.o \
        misc/mkdir_recursive.o misc/checkfile.o misc/checksum.o misc/globus_modules.o
DOWNLOADER_OBJECTS=downloader.o \
        datamove/databuffer.o datamove/databufferpar.o \
        datamove/datahandle.o datamove/datahandle_file.o \
        datamove/datahandle_ftp.o datamove/datamove.o \
        datamove/datahandle_http.o datamove/datamovepar.o \
        datamove/datapoint.o datamove/datapoint_rc.o datamove/datapoint_rls.o \
        misc/log_time.o transfer/replica.o \
        misc/inttostring.o misc/stringtoint.o \
        misc/url_options.o transfer/replica_utils.o \
        datamove/datacache.o cache/cache.o datamove/dataspeed.o \
        misc/globus_error_utils.o transfer/url_map.o \
        misc/delete.o jobs/job.o transfer/proxy.o config/config_map.o \
        jobs/users.o misc/escaped.o files/info_files.o files/info_types.o\
        config/environment.o config/config.o run/run.o misc/canonical_dir.o \
        misc/mkdir_recursive.o misc/checkfile.o misc/checksum.o misc/globus_modules.o
UPLOADER_OBJECTS=uploader.o \
        datamove/databuffer.o datamove/databufferpar.o \
        datamove/datahandle.o datamove/datahandle_file.o \
        datamove/datahandle_ftp.o datamove/datamove.o \
        datamove/datahandle_http.o datamove/datamovepar.o \
        datamove/datapoint.o datamove/datapoint_rc.o datamove/datapoint_rls.o \
        misc/log_time.o transfer/replica.o \
        misc/inttostring.o misc/stringtoint.o \
        misc/url_options.o transfer/replica_utils.o \
        datamove/datacache.o cache/cache.o datamove/dataspeed.o \
        misc/globus_error_utils.o transfer/url_map.o \
        misc/delete.o jobs/job.o transfer/proxy.o config/config_map.o \
        jobs/users.o misc/escaped.o files/info_files.o files/info_types.o \
        config/environment.o config/config.o run/run.o misc/canonical_dir.o \
        misc/mkdir_recursive.o misc/checkfile.o misc/checksum.o misc/globus_modules.o
NGPARSERSL_OBJECTS=ng_parse_rsl.o rsl/parse_rsl.o files/info_files.o \
        files/info_types.o jobs/users.o run/run.o \
        config/config.o config/environment.o \
        misc/canonical_dir.o transfer/replica_utils.o \
        misc/delete.o config/config_pre.o misc/stringtoint.o \
        config/gridmap.o misc/substitute.o misc/inttostring.o \
        rsl/subst_rsl.o misc/url_options.o misc/escaped.o misc/log_time.o
LIBUI_OBJECTS=ui_downloader.o ui_uploader.o \
        files/info_files.o files/info_types.o \
        misc/inttostring.o misc/delete.o misc/stringtoint.o \
        misc/canonical_dir.o misc/mkdir_recursive.o misc/log_time.o \
        misc/globus_error_utils.o misc/url_options.o misc/checkfile.o \
        transfer/check.o transfer/ftpsubmit.o transfer/lister.o \
        transfer/url_map.o transfer/replica_utils.o transfer/replica.o \
        jobs/users.o \
        run/run.o \
        config/config.o config/environment.o \
        datamove/datamovepar.o datamove/datamove.o datamove/datapoint.o \
        datamove/datapoint_rc.o datamove/datapoint_rls.o \
        datamove/datahandle.o datamove/datahandle_file.o \
        datamove/datahandle_ftp.o datamove/datahandle_http.o \
        datamove/databufferpar.o datamove/dataspeed.o \
        datamove/datacache.o \
        misc/checksum.o misc/globus_modules.o misc/escaped.o \
        cache/cache.o
UI_OBJECTS=\
        files/info_files.o files/info_types.o \
        misc/inttostring.o misc/delete.o misc/stringtoint.o \
        misc/canonical_dir.o misc/mkdir_recursive.o misc/log_time.o \
        misc/globus_error_utils.o misc/url_options.o misc/checkfile.o \
        transfer/ftpsubmit.o transfer/lister.o \
        transfer/url_map.o transfer/replica_utils.o transfer/replica.o \
        jobs/users.o \
        run/run.o \
        config/config.o config/environment.o \
        datamove/datamovepar.o datamove/datamove.o datamove/datapoint.o \
        datamove/datapoint_rc.o datamove/datapoint_rls.o \
        datamove/datahandle.o datamove/datahandle_file.o \
        datamove/datahandle_ftp.o datamove/datahandle_http.o \
        datamove/databufferpar.o datamove/dataspeed.o \
        datamove/datacache.o \
        misc/checksum.o misc/globus_modules.o misc/escaped.o \
        cache/cache.o

SUBDIRS=transfer rsl PBS config init mail utils rcutils auth https

CLIENT_STATIC_LIBRARIES=libui.a
CLIENT_SHARED_LIBRARIES=
CLIENT_LIBRARIES=${CLIENT_SHARED_LIBRARIES} ${CLIENT_STATIC_LIBRARIES}
CLIENT_INCLUDES=ui_uploader.h ui_downloader.h
CLIENT_SUBDIRS=transfer rcutils
CLIENT_PROGRAMS=ngcopy ngremove ngacl

all: ${PROGRAMS} ${LIBRARIES} all-gridftp
	@set -e ; \
	for dir in ${SUBDIRS} ; do \
	  echo "Making in $$dir" ; \
	  make -C $$dir all ; \
	done

globus_makefile.mk:
	@export GLOBUS_LOCATION=$(GLOBUS_LOCATION) ; \
	${USE_GLOBUS_GPT} \
	-flavor=${GLOBUS_FLAVOR} globus_rsl globus_common | \
	grep '^GLOBUS_PKG_LIBS' | sed 's/^GLOBUS_PKG_LIBS/GLOBUS_GM_LIBS/' \
	>globus_makefile.mk ; \
	RESULT=$$? ; \
	if [ $$RESULT -ne 0 ] ; then rm -f globus_makefile.mk ; fi ; \
	exit $$RESULT
	@export GLOBUS_LOCATION=$(GLOBUS_LOCATION) ; \
	${USE_GLOBUS_GPT} \
	-flavor=${GLOBUS_FLAVOR} globus_replica_catalog globus_ftp_client globus_gass_transfer globus_common $(GLOBUS_RLS_OBJECT) | \
	grep '^GLOBUS_PKG_LIBS' | sed 's/^GLOBUS_PKG_LIBS/GLOBUS_NGCOPY_LIBS/' \
	>>globus_makefile.mk ; \
	RESULT=$$? ; \
	if [ $$RESULT -ne 0 ] ; then rm -f globus_makefile.mk ; fi ; \
	exit $$RESULT
	@export GLOBUS_LOCATION=$(GLOBUS_LOCATION) ; \
	${USE_GLOBUS_GPT} \
	-flavor=${GLOBUS_FLAVOR} globus_replica_catalog globus_ftp_client globus_gass_transfer globus_common $(GLOBUS_RLS_OBJECT) | \
	grep '^GLOBUS_PKG_LIBS' | sed 's/^GLOBUS_PKG_LIBS/GLOBUS_DOWNLOADER_LIBS/' \
	>>globus_makefile.mk ; \
	RESULT=$$? ; \
	if [ $$RESULT -ne 0 ] ; then rm -f globus_makefile.mk ; fi ; \
	exit $$RESULT
	@export GLOBUS_LOCATION=$(GLOBUS_LOCATION) ; \
	${USE_GLOBUS_GPT} -flavor=${GLOBUS_FLAVOR} globus_rsl globus_common | \
	grep '^GLOBUS_PKG_LIBS' | sed 's/^GLOBUS_PKG_LIBS/GLOBUS_NGPARSERSL_LIBS/' \
	>>globus_makefile.mk ; \
	RESULT=$$? ; \
	if [ $$RESULT -ne 0 ] ; then rm -f globus_makefile.mk ; fi ; \
	exit $$RESULT
	@export GLOBUS_LOCATION=$(GLOBUS_LOCATION) ; \
	${USE_GLOBUS_GPT} \
	-flavor=${GLOBUS_FLAVOR} globus_replica_catalog globus_ftp_client globus_gass_transfer globus_common globus_gram_client $(GLOBUS_RLS_OBJECT) | \
	grep '^GLOBUS_PKG_LIBS' | sed 's/^GLOBUS_PKG_LIBS/GLOBUS_UI_LIBS/' \
	>>globus_makefile.mk ; \
	RESULT=$$? ; \
	if [ $$RESULT -ne 0 ] ; then rm -f globus_makefile.mk ; fi ; \
	exit $$RESULT

client: ${CLIENT_PROGRAMS} ${CLIENT_LIBRARIES}
	@set -e ; \
	for dir in ${CLIENT_SUBDIRS} ; do \
	  echo "Making in $$dir" ; \
	  make -C $$dir client ; \
	done

client-static: ${CLIENT_PROGRAMS} ${CLIENT_STATIC_LIBRARIES}
	@set -e ; \
	for dir in ${CLIENT_SUBDIRS} ; do \
	  echo "Making in $$dir" ; \
	  make -C $$dir client-static ; \
	done

all-gridftp:
	@set -e; \
	make -C gridftp all ; \
	make -C init all ; \
	make -C config all

grid-manager: ${OBJECTS}
	${CC} -o grid-manager ${OBJECTS} ${GM_LIBS} -Wl,-Bstatic ${CPPLIBS} -Wl,-Bdynamic

test: test.o libui.a
	${CC} -o test test.o -L. -lui \
	-L$(GLOBUS_LOCATION)/lib \
	-lglobus_replica_catalog_$(GLOBUS_FLAVOR) \
	-lglobus_gass_copy_$(GLOBUS_FLAVOR)  \
	-lglobus_ftp_client_$(GLOBUS_FLAVOR) \
	-lglobus_ftp_control_$(GLOBUS_FLAVOR) \
	-lglobus_io_$(GLOBUS_FLAVOR) \
	-lglobus_common_$(GLOBUS_FLAVOR) \
	-Wl,-Bstatic ${CPPLIBS} -Wl,-Bdynamic

ngcopy: ${NGCOPY_OBJECTS}
	${CC} -o ngcopy ${NGCOPY_OBJECTS} ${NGCOPY_LIBS} -Wl,-Bstatic ${CPPLIBS} -Wl,-Bdynamic

ngremove: ngcopy
	rm -f $@
	ln -s ngcopy $@

ngacl: ngcopy
	rm -f $@
	ln -s ngcopy $@

downloader: ${DOWNLOADER_OBJECTS}
	${CC} -o downloader ${DOWNLOADER_OBJECTS} ${DOWNLOADER_LIBS} -Wl,-Bstatic ${CPPLIBS} -Wl,-Bdynamic

uploader: ${UPLOADER_OBJECTS}
	${CC} -o uploader ${UPLOADER_OBJECTS} ${UPLOADER_LIBS} -Wl,-Bstatic ${CPPLIBS} -Wl,-Bdynamic

ng-parse-rsl: ${NGPARSERSL_OBJECTS}
	${CC} -o ng-parse-rsl ${NGPARSERSL_OBJECTS} ${NGPARSERSL_LIBS} -Wl,-Bstatic ${CPPLIBS} -Wl,-Bdynamic

libui.a: ${LIBUI_OBJECTS}
	ar r libui.a ${LIBUI_OBJECTS}

libui.so: ${LIBUI_OBJECTS}
	${CC} -shared -o libui.so ${LIBUI_OBJECTS}

ui-uploader: ui_uploader.cc ${UI_OBJECTS}
	${CPP} -D__CREATE_EXEC__ ${CFLAGS} ${DEFINES} ${INCLUDES} ui_uploader.cc -o $@ ${UI_OBJECTS} ${UI_LIBS}

globus-script-ng-submit: globus-script-ng-submit.in
	@cat globus-script-ng-submit.in | sed '\
	  s#@nordugrid_location@#${NORDUGRID_LOCATION}#\
	' > globus-script-ng-submit
	@chmod a+x globus-script-ng-submit

clean: clean-gridftp
	@for dir in ${SUBDIRS} ; do \
	  echo "Making in $$dir" ; \
	  make -C $$dir clean ; \
	done
	@rm -f ${PROGRAMS} ${LIBRARIES} ${OBJECTS} ${NGCOPY_OBJECTS} ${NGPARSERSL_OBJECTS} ${DOWNLOADER_OBJECTS} ${UPLOADER_OBJECTS} ${LIBUI_OBJECTS} globus_makefile.mk

clean-gridftp:
	make -C gridftp clean

install: ${PROGRAMS} install-gridftp
	@set -e ; \
	mkdir -p ${INSTALL_BASE} ; \
	mkdir -p ${INSTALL_BIN} ; \
	mkdir -p ${INSTALL_SBIN} ; \
	mkdir -p ${INSTALL_ETC} ; \
	mkdir -p ${INSTALL_INCLUDE} ; \
	mkdir -p ${INSTALL_LIB} ; \
	for dir in ${SUBDIRS} ; do \
	  echo "Making in $$dir" ; \
	  make -C $$dir install ; \
	done ; \
	cp -f ${BINARIES} ${INSTALL_BIN}/ ; \
	cp -f ${SCRIPTS} ${INSTALL_BIN}/ ; \
	cp -f ${STARTERS} ${INSTALL_SBIN}/ ; \
	cp -f ${DEV_LIBRARIES} ${INSTALL_LIB}/ ; \
	for name in ${DEV_INCLUDES} ; do \
	bname=`basename $$name` ; \
	grep -v '^#ifdef' $${name} | grep -v '^#endif' > ${INSTALL_INCLUDE}/$${bname} ; \
	done ; \
	cp -f config/grid-manager.conf ${INSTALL_ETC}/grid-manager.conf.template ; \
	cp -f ${GLOBUS_SCRIPTS} ${GLOBUS_LOCATION}/libexec/

install-gridftp:
	@make -C gridftp install
	@make -C init install
	@make -C config install
	mkdir -p ${INSTALL_BASE}
	mkdir -p ${INSTALL_BIN}
	mkdir -p ${INSTALL_SBIN}
	mkdir -p ${INSTALL_ETC}
	mkdir -p ${INSTALL_LIB}
	cp -f ${GRIDFTP_BINARIES} ${INSTALL_BIN}/
	cp -f ${GRIDFTP_STARTERS} ${INSTALL_SBIN}/
	cp -f ${GRIDFTP_LIBRARIES} ${INSTALL_LIB}/
	cp -f config/gridftp-server.conf ${INSTALL_ETC}/gridftp-server.conf.template

install-client: install-client-common
	@cp -f ${CLIENT_PROGRAMS} ${CLIENT_LIBRARIES} ${INSTALL_LIB}/

install-client-static: install-client-common
	@cp -f ${CLIENT_PROGRAMS} ${CLIENT_STATIC_LIBRARIES} ${INSTALL_LIB}/

install-client-common:
	@set -e ; \
	mkdir -p ${INSTALL_BASE} ; \
	mkdir -p ${INSTALL_BIN} ; \
	mkdir -p ${INSTALL_INCLUDE} ; \
	mkdir -p ${INSTALL_LIB} ; \
	for dir in ${CLIENT_SUBDIRS} ; do \
	  echo "Making in $$dir" ; \
	  make -C $$dir install-client ; \
	done ; \
	for name in ${CLIENT_INCLUDES} ; do \
	bname=`basename $$name` ; \
	grep -v '^#ifdef' $${name} | grep -v '^#endif' > ${INSTALL_INCLUDE}/$${bname} ; \
	done

version.mk:
	@if [ -f CVS/Tag ]; then \
		echo VERSION=`cat CVS/Tag | cut -f2- -d_ | sed s/_/./g` \
		> version.mk; \
	else \
		echo VERSION=untagged > version.mk; \
	fi
