# Make rules for FSL projects
#
# Automatic GNU make rules are used for compiling C and C++ files.

all:

help:
	@echo " make         Rebuild project targets";
	@echo " make clean   Remove executables, libraries and object files";
	@echo " make install Install into your local FSLDEVDIR";

clean:
	${RM} -f *.o *.a *.so *.exe depend.mk \
      ${XFILES} ${FXFILES} ${SOFILES} ${AFILES} ${TESTXFILES}

insertcopyright:
	${FSLDIR}/share/fsl/sbin/insertcopyright * */*

depend:
	${RM} -f depend.mk
	${MAKE} depend.mk

# Automatically generate Make rules and dependencies for
# all source files in the project. This creates a file
# called depend.mk which contains a rule for every object
# file to be compiled, which has all header files
# that the source file includes as dependencies. If
# object files are to be saved into a separate build
# directory, the project Makefile should set the BUILDDIR
# variable.
#
# If the NVCC environment variable is set to a nvcc compiler,
# rules are generated for CUDA .cu files. If CUDA object files
# are to be saved into a separate build directory, the project
# Makefile should set the CUDABUILDDIR variable.
depend.mk:
	@echo "Building dependency file depend.mk" ; \
	srcfiles=`find . -name "*.c"  -or -name "*.cc"  -or -name "*.cxx" -or -name "*.cpp" -or -name "*.inc" -or -name "*.hpp" -or -name "*.cu"` ; \
	for srcfile in $${srcfiles} dummyname; do                                \
	  if [ -f "$${srcfile}" ]; then                                          \
	    srcfile="$${srcfile#./}"                                           ; \
	    prefix="$${srcfile%.*}"                                            ; \
	    basename="$${prefix##*/}"                                          ; \
	    objfile="$${basename}.o"                                           ; \
	    depfile="$${basename}.mk"                                          ; \
	    if [ "$${srcfile%.cu}" = "$${prefix}" ]; then                        \
	      if [ -f "${NVCC}" ]; then                                          \
	        ${NVCC} -MM -MT "${CUDABUILDDIR}$${objfile}" -MF "$${depfile}"   \
	                ${CPPFLAGS} ${INCFLAGS} "$${srcfile}" > /dev/null 2>&1 ; \
	      fi                                                               ; \
	    else                                                                 \
	      ${CC} -MM -MT "${BUILDDIR}$${objfile}" -MF "$${depfile}"           \
	            ${CPPFLAGS} ${INCFLAGS} "$${srcfile}" > /dev/null 2>&1     ; \
	    fi                                                                 ; \
	    if [ -f "$${depfile}" ]; then                                        \
	      cat "$${depfile}" >> depend.mk                                   ; \
	      rm -f "$${depfile}"                                              ; \
	    fi                                                                 ; \
	  else                                                                   \
	    touch depend.mk                                                    ; \
	  fi                                                                   ; \
	done

install:
	@${MAKE} "DESTDIR=${FSLDEVDIR}" master-install-script

master-install-script:
	@if [ "X${PROJNAME}X" = XX ] ; then \
		echo " " ; \
		echo "No PROJNAME defined in the Makefile" ; \
		echo "    ... aborting install" ; \
		echo " " ; \
		exit 4 ; \
	fi;
	@${MAKE} all
	@${MAKE} exeinstall
	@${MAKE} hdrinstall
	@${MAKE} libinstall
	@${MAKE} tclinstall
	@${MAKE} pyinstall
	@${MAKE} datainstall

# Generic routine used to install
# XFILES, PYFILES, SCRIPTS, etc etc
# Expects four arguments:
#  - $1: Label, just used to print a descriptive message
#  - $2: Destination directory for installation
#  - $3: Permission mask to apply to all installed files (e.g. 0755)
#  - $4: Space-separated list of target files/directories to install
define _x_install =
	if ! echo $(wildcard $(4)) | grep -q -e "^ *$$"; then \
		echo Installing $(1) ; \
		${MKDIR} -p -m 0755 $(2) ; \
	fi
	for target in $(4) verylongdummyname ; do \
		if [ -f $$target ] ; then \
			echo ${INSTALL} -m $(3) $$target $(2)/ ; \
			${INSTALL}      -m $(3) $$target $(2)/ ; \
		elif [ -d $$target ]; then \
			echo ${CP} -r $$target $(2)/ ; \
		 	${CP}      -r $$target $(2)/ ; \
		 	find $(2)/`basename $$target` -type d -exec chmod 0755 {} \; ; \
		 	find $(2)/`basename $$target` -type f -exec chmod $(3) {} \; ; \
		fi; \
	done;
endef

# Installs PYFILES into $FSLDIR/etc/fsl/python/$PROJNAME/
pyinstall:
	@${MKDIR} -p -m 0755 $(dest_PYDIR)
	@$(call _x_install,"python scripts",${dest_PYDIR}/${PROJNAME}/,0644,${PYFILES})

# Installs AFILES and SOFILES into $FSLDIR/lib/
libinstall:
	@${MKDIR} -p -m 0755 $(dest_LIBDIR)
	@$(call _x_install,"library files",${dest_LIBDIR},0644,${AFILES} ${SOFILES})

# Installs:
#  - HFILES into $FSLDIR/include/$PROJNAME/
#  - GLOBALHFILES into $FSLDIR/include/
hdrinstall:
	@${MKDIR} -p -m 0755 $(dest_INCDIR)
	@$(call _x_install,"header files",${dest_INCDIR}/${PROJNAME}/,0644,${HFILES})
	@$(call _x_install,"global header files",${dest_INCDIR}/,0644,${GLOBALHFILES})

# Installs DATAFILES into $FSLDIR/data/$PROJNAME/
datainstall:
	@${MKDIR} -p -m 0755 $(dest_DATADIR)
	@$(call _x_install,"data files",${dest_DATADIR}/${PROJNAME}/,0644,${DATAFILES})

# Installs:
#   - XFILES into $FSLDIR/bin/
#   - SCRIPTS into $FSLDIR/bin/
exeinstall:
	@${MKDIR} -p -m 0755 $(dest_BINDIR)
	@$(call _x_install,"binaries",${dest_BINDIR}/,0755,${XFILES})
	@$(call _x_install,"scripts",${dest_BINDIR}/,0755,${SCRIPTS})


# Installs:
#  - TCLFILES into $FSLDIR/tcl/
#  - RUNTCLS into $FSLDIR/bin/
tclinstall:
	@${MKDIR} -p -m 0755 $(dest_TCLDIR)
	@${MKDIR} -p -m 0755 $(dest_BINDIR)
	@$(call _x_install,"tcl scripts",${dest_TCLDIR}/,0755,${TCLFILES})
	@# create RUNTCLS links
	@for lntarget in ${RUNTCLS} verylongdummyname ; do \
		if [ $$lntarget != verylongdummyname ] ; then \
			if [ `uname` = Darwin -o X`uname | grep CYGWIN`X != XX ] ; then \
				lntarget=$${lntarget}_gui ; \
			fi ; \
			cd ${dest_BINDIR} ; ${RM} -f $$lntarget ; \
			ln -s Runtcl $$lntarget ; \
			echo ln -s Runtcl $$lntarget ; \
		fi \
	done
	@# index installed TCL files
	@install_yn=no;
	@for tclfile in ${TCLFILES} verylongdummyname ; do \
		if [ -e $$tclfile ] ; then \
			install_yn=yes; \
		fi; \
	done;
	@if [ $$install_yn = "yes" ] ; then \
		(cd ${dest_TCLDIR} ; echo 'auto_mkindex . *.tcl' | ${TCLSH} ) \
	fi

include depend.mk