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