From 819ed3269c878b4418a9427af6ad91c95d0b8f41 Mon Sep 17 00:00:00 2001
From: Paul McCarthy <pauldmccarthy@gmail.com>
Date: Sat, 11 Dec 2021 12:59:05 +0000
Subject: [PATCH] ENH: Auto-dependency generation support for CUDA files. Only
 performed if nvcc is present. CUDA outputs can be directed into a separate
 directory, which can be specified via CUDABUILDDIR

---
 config/depend.sh | 55 ++++++++++++++++++++++++++++++++++++++++++++++++
 config/rules.mk  | 22 +++++++------------
 2 files changed, 63 insertions(+), 14 deletions(-)
 create mode 100755 config/depend.sh

diff --git a/config/depend.sh b/config/depend.sh
new file mode 100755
index 0000000..224219c
--- /dev/null
+++ b/config/depend.sh
@@ -0,0 +1,55 @@
+#!/bin/sh
+#
+# This script is called by the depend.mk rule defined in
+# $FSLDIR/config/rules.mk.
+#
+# It is assumed that this script is executed from a
+# project directory (i.e. the project directory is the cwd).
+#
+# 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.
+set -e
+
+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 nvcc is present, use it for .cu files
+    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
diff --git a/config/rules.mk b/config/rules.mk
index df832a3..edc95e4 100644
--- a/config/rules.mk
+++ b/config/rules.mk
@@ -21,20 +21,14 @@ depend:
 	${MAKE} depend.mk
 
 depend.mk:
-	@echo Building dependency file depend.mk
-	@for srcfile in `find . -name "*.c" -or -name "*.cc" -or -name "*.cxx" -or -name "*.cpp" -or -name "*.inc" -or -name "*.hpp"` verylongdummyname ; do \
-		if [ -f "$${srcfile}" ] ; then \
-			basename="$${srcfile%.*}" ; \
-			basename="$${basename#./}" ; \
-			objfile="$${basename}.o" ; \
-			depfile="$${basename}.mk" ; \
-			${CC} -MM -MT "${BUILDDIR}$${objfile}" -MF "$${depfile}" ${CPPFLAGS} ${INCFLAGS} "$${srcfile}" > /dev/null; \
-			cat "$${depfile}" >> depend.mk ; \
-			rm -f "$${depfile}" ; \
-		else \
-			touch depend.mk; \
-		fi \
-	done
+	@NVCC="${NVCC}"                 \
+     CC="${CC}"                     \
+     CPPFLAGS="${CPPFLAGS}"         \
+     INCFLAGS="${INCFLAGS}"         \
+     BUILDDIR="${BUILDDIR}"         \
+     CUDABUILDDIR="${CUDABUILDDIR}" \
+     ${FSLCONFDIR}/depend.sh
+
 
 install:
 	@${MAKE} "DESTDIR=${FSLDEVDIR}" master-install-script
-- 
GitLab