From f82dd72ca140369ef870f804c4397ea666180c2d Mon Sep 17 00:00:00 2001
From: Chris Maffeo <cmaffeo2@illinois.edu>
Date: Fri, 11 Nov 2016 13:25:27 -0600
Subject: [PATCH] Improved build scripts

---
 .gitignore           |   4 +-
 src/BaseGrid.h       |   2 +-
 src/Makefile         |  34 ++++------
 src/RigidBodyType.cu |   2 +
 src/TAGS.sh          |   3 +
 src/cuda-test.c      |   2 +
 src/findcudalib.mk   | 155 ++++++-------------------------------------
 7 files changed, 43 insertions(+), 159 deletions(-)
 create mode 100755 src/TAGS.sh
 create mode 100644 src/cuda-test.c

diff --git a/.gitignore b/.gitignore
index 23e5af8..26565cd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,7 +3,7 @@
 *~
 .backup
 TAGS
-TAGS.sh
 .dir-locals.el
 BD_example*
-runBrownCUDA
+arbd
+runBrownCUDA
\ No newline at end of file
diff --git a/src/BaseGrid.h b/src/BaseGrid.h
index 1afc869..73d48f1 100644
--- a/src/BaseGrid.h
+++ b/src/BaseGrid.h
@@ -666,7 +666,7 @@ public:
 
   // Wrap coordinate: 0 <= x < l
   HOST DEVICE   inline int quotient(float x, float l) const {
-#ifdef __CUDA_ARCH__
+#if __CUDA_ARCH__ > 0
 	  return int(floorf( __fdividef(x,l) ));
 #else
 	  return int(floor(x/l));
diff --git a/src/Makefile b/src/Makefile
index c208421..b8da44f 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -1,30 +1,19 @@
 ### Paths, libraries, includes, options
 include ./findcudalib.mk
-CUDA_PATH ?= /usr/local/cuda-8.0
-
-$(info CUDA_PATH=$(CUDA_PATH))
 INCLUDE = $(CUDA_PATH)/include
 
+NV_FLAGS += v
 ifeq ($(dbg),1)
-	DEBUG = -g -O0
-	NV_FLAGS = -v -g -G
+	CC_FLAGS += -g -O0
+	NV_FLAGS += -g -G
 	EX_FLAGS = -O0 -m$(OS_SIZE)
 else
-	NV_FLAGS = -v
 	EX_FLAGS = -O3 -m$(OS_SIZE)
 endif
 
-CC_FLAGS = -Wall -Wno-write-strings -I$(INCLUDE) $(DEBUG) -std=c++0x -pedantic
+CC_FLAGS += -Wall -Wno-write-strings -I$(INCLUDE) -std=c++0x -pedantic
 NV_FLAGS += -lineinfo
 
-ifneq ($(MAVERICKS),)
-    CC = $(CLANG)
-    CC_FLAGS += -stdlib=libstdc++
-    NV_FLAGS += -Xcompiler -arch -Xcompiler x86_64
-else
-    CC = $(GCC)
-endif
-
 ifneq ($(DARWIN),)
     LIBRARY = $(CUDA_PATH)/lib
 else
@@ -33,13 +22,17 @@ endif
 
 # NV_FLAGS += -ftz=true			# TODO: test if this preserves accurate simulation
 
+## Find valid compute capabilities for this machine
 SMS ?= 20 30 35 37 50 52 60
-## Generate SASS code
-$(foreach SM,$(SMS), $(eval NV_FLAGS += -gencode arch=compute_$(SM),code=sm_$(SM)) )
+$(info Testing CUDA toolkit with compute capabilities SMS='$(SMS)')
+SMS := $(shell for sm in $(SMS); do $(NVCC) cuda-test.c -arch=sm_$$sm &> /dev/null && echo $$sm; done)
+
+SMPTXS ?= $(lastword $(sort $(SMS)))
+$(info Building SASS code for SMS='$(SMS)' and PTX code for '$(SMPTXS)')
 
-## Generate PTX code for highest SM architecture for future GPUs
-SM=$(lastword $(sort $(SMS)))
-NV_FLAGS += -gencode arch=compute_$(SM),code=sm_$(SM)
+## Generate SASS and PTX code
+$(foreach SM,$(SMS), $(eval NV_FLAGS += -gencode arch=compute_$(SM),code=sm_$(SM)) )
+$(foreach SM,$(SMPTXS), $(eval NV_FLAGS += -gencode arch=compute_$(SM),code=compute_$(SM)) )
 
 NVLD_FLAGS := $(NV_FLAGS) --device-link 
 LD_FLAGS = -L$(LIBRARY) -lcurand -lcudart -lcudadevrt -Wl,-rpath,$(LIBRARY)
@@ -52,7 +45,6 @@ CU_SRC := $(wildcard *.cu)
 CC_OBJ := $(patsubst %.cpp, %.o, $(CC_SRC))
 CU_OBJ := $(patsubst %.cu, %.o, $(CU_SRC))
 
-
 ### Targets
 TARGET = arbd
 
diff --git a/src/RigidBodyType.cu b/src/RigidBodyType.cu
index cc6577a..838e9cc 100644
--- a/src/RigidBodyType.cu
+++ b/src/RigidBodyType.cu
@@ -1,8 +1,10 @@
+#include <assert.h>
 #include "Configuration.h"
 #include "RigidBodyType.h"
 #include "Reservoir.h"
 #include "BaseGrid.h"
 #include "RigidBodyGrid.h"
+
 #define gpuErrchk(ans) { gpuAssert((ans), __FILE__, __LINE__); }
 inline void gpuAssert(cudaError_t code, const char *file, int line, bool abort=true) {
    if (code != cudaSuccess) {
diff --git a/src/TAGS.sh b/src/TAGS.sh
new file mode 100755
index 0000000..df6d4fa
--- /dev/null
+++ b/src/TAGS.sh
@@ -0,0 +1,3 @@
+#! /bin/bash
+# etags *.h* *.c*
+etags -l c++ *.[cChH]*
diff --git a/src/cuda-test.c b/src/cuda-test.c
new file mode 100644
index 0000000..b3456ec
--- /dev/null
+++ b/src/cuda-test.c
@@ -0,0 +1,2 @@
+#include <cuda_runtime.h>
+int main(int argc, char **argv) {}
diff --git a/src/findcudalib.mk b/src/findcudalib.mk
index 89a0683..7c78849 100644
--- a/src/findcudalib.mk
+++ b/src/findcudalib.mk
@@ -34,6 +34,17 @@
 #
 ################################################################################
 
+## Find Location of most recent CUDA Toolkit
+ifeq (,$(CUDA_PATH))
+	CUDA_PATH := $(shell echo $(wildcard /usr/local/cuda*) | tr ' ' '\n' | sort -Vr | head -n1)
+    ifeq (,$(CUDA_PATH))
+        $(info ERROR: Could not CUDA_PATH. Please pass as follows: $(MAKE) CUDA_PATH=/path/to/cuda)
+        exit
+    else 
+        $(info Using CUDA_PATH=$(CUDA_PATH))
+    endif
+endif
+
 # OS Name (Linux or Darwin)
 OSUPPER = $(shell uname -s 2>/dev/null | tr "[:lower:]" "[:upper:]")
 OSLOWER = $(shell uname -s 2>/dev/null | tr "[:upper:]" "[:lower:]")
@@ -66,6 +77,7 @@ ifneq ($(DARWIN),)
    LION        = $(strip $(findstring 10.7, $(shell egrep "<string>10\.7" /System/Library/CoreServices/SystemVersion.plist)))
    MOUNTAIN    = $(strip $(findstring 10.8, $(shell egrep "<string>10\.8" /System/Library/CoreServices/SystemVersion.plist)))
    MAVERICKS   = $(strip $(findstring 10.9, $(shell egrep "<string>10\.9" /System/Library/CoreServices/SystemVersion.plist)))
+   MAVERICKS   = $(strip $(findstring 10.9, $(shell egrep "<string>10\.9" /System/Library/CoreServices/SystemVersion.plist)))
 endif 
 
 # Common binaries
@@ -73,16 +85,16 @@ GCC   ?= g++
 CLANG ?= /usr/bin/clang++
 
 ifeq ("$(OSUPPER)","LINUX")
-     NVCC ?= $(CUDA_PATH)/bin/nvcc -ccbin $(GCC)
+	CC=$(GCC)
 else
-  # for some newer versions of XCode, CLANG is the default compiler, so we need to include this
-  ifneq ($(MAVERICKS),)
-        NVCC   ?= $(CUDA_PATH)/bin/nvcc -ccbin $(CLANG)
-        STDLIB ?= -stdlib=libstdc++
-  else
-        NVCC   ?= $(CUDA_PATH)/bin/nvcc -ccbin $(GCC)
-  endif
+    # for some newer versions of XCode, CLANG is the default compiler, so we need to include this
+    ifeq ($(shell expr `xcodebuild -version | grep -i xcode | awk '{print $$2}' | cut -d'.' -f1` \>= 5),1)
+        CC = $(CLANG)
+		CC_FLAGS += -stdlib=libstdc++
+		NV_FLAGS += -Xcompiler -arch -Xcompiler x86_64
+    endif
 endif
+NVCC ?= $(CUDA_PATH)/bin/nvcc -ccbin $(CC)
 
 # Take command line flags that override any of these settings
 ifeq ($(i386),1)
@@ -97,130 +109,3 @@ ifeq ($(ARMv7),1)
 	OS_SIZE = 32
 	OS_ARCH = armv7l
 endif
-
-ifeq ("$(OSUPPER)","LINUX")
-    # Each Linux Distribuion has a set of different paths.  This applies especially when using the Linux RPM/debian packages
-    ifeq ("$(DISTRO)","ubuntu")
-        CUDAPATH  ?= /usr/lib/nvidia-current
-        CUDALINK  ?= -L/usr/lib/nvidia-current
-        DFLT_PATH  = /usr/lib
-    endif
-    ifeq ("$(DISTRO)","kubuntu")
-        CUDAPATH  ?= /usr/lib/nvidia-current
-        CUDALINK  ?= -L/usr/lib/nvidia-current
-        DFLT_PATH  = /usr/lib
-    endif
-    ifeq ("$(DISTRO)","debian")
-        CUDAPATH  ?= /usr/lib/nvidia-current
-        CUDALINK  ?= -L/usr/lib/nvidia-current
-        DFLT_PATH  = /usr/lib
-    endif
-    ifeq ("$(DISTRO)","suse")
-      ifeq ($(OS_SIZE),64)
-        CUDAPATH  ?=
-        CUDALINK  ?=
-        DFLT_PATH  = /usr/lib64
-      else
-        CUDAPATH  ?=
-        CUDALINK  ?=
-        DFLT_PATH  = /usr/lib
-      endif
-    endif
-    ifeq ("$(DISTRO)","suse linux")
-      ifeq ($(OS_SIZE),64)
-        CUDAPATH  ?=
-        CUDALINK  ?=
-        DFLT_PATH  = /usr/lib64
-      else
-        CUDAPATH  ?=
-        CUDALINK  ?=
-        DFLT_PATH  = /usr/lib
-      endif
-    endif
-    ifeq ("$(DISTRO)","opensuse")
-      ifeq ($(OS_SIZE),64)
-        CUDAPATH  ?=
-        CUDALINK  ?=
-        DFLT_PATH  = /usr/lib64
-      else
-        CUDAPATH  ?=
-        CUDALINK  ?=
-        DFLT_PATH  = /usr/lib
-      endif
-    endif
-    ifeq ("$(DISTRO)","fedora")
-      ifeq ($(OS_SIZE),64)
-        CUDAPATH  ?= /usr/lib64/nvidia
-        CUDALINK  ?= -L/usr/lib64/nvidia
-        DFLT_PATH  = /usr/lib64
-      else
-        CUDAPATH  ?=
-        CUDALINK  ?=
-        DFLT_PATH  = /usr/lib
-      endif
-    endif
-    ifeq ("$(DISTRO)","redhat")
-      ifeq ($(OS_SIZE),64)
-        CUDAPATH  ?= /usr/lib64/nvidia
-        CUDALINK  ?= -L/usr/lib64/nvidia
-        DFLT_PATH  = /usr/lib64
-      else
-        CUDAPATH  ?=
-        CUDALINK  ?=
-        DFLT_PATH  = /usr/lib
-      endif
-    endif
-    ifeq ("$(DISTRO)","red")
-      ifeq ($(OS_SIZE),64)
-        CUDAPATH  ?= /usr/lib64/nvidia
-        CUDALINK  ?= -L/usr/lib64/nvidia
-        DFLT_PATH  = /usr/lib64
-      else
-        CUDAPATH  ?=
-        CUDALINK  ?=
-        DFLT_PATH  = /usr/lib
-      endif
-    endif
-    ifeq ("$(DISTRO)","redhatenterpriseworkstation")
-      ifeq ($(OS_SIZE),64)
-        CUDAPATH  ?= /usr/lib64/nvidia
-        CUDALINK  ?= -L/usr/lib64/nvidia
-        DFLT_PATH ?= /usr/lib64
-      else
-        CUDAPATH  ?=
-        CUDALINK  ?=
-        DFLT_PATH ?= /usr/lib
-      endif
-    endif
-    ifeq ("$(DISTRO)","centos")
-      ifeq ($(OS_SIZE),64)
-        CUDAPATH  ?= /usr/lib64/nvidia
-        CUDALINK  ?= -L/usr/lib64/nvidia
-        DFLT_PATH  = /usr/lib64
-      else
-        CUDAPATH  ?=
-        CUDALINK  ?=
-        DFLT_PATH  = /usr/lib
-      endif
-    endif
-  
-    ifeq ($(ARMv7),1)
-      CUDAPATH := /usr/arm-linux-gnueabihf/lib
-      CUDALINK := -L/usr/arm-linux-gnueabihf/lib
-      ifneq ($(TARGET_FS),) 
-        CUDAPATH += $(TARGET_FS)/usr/lib/nvidia-current
-        CUDALINK += -L$(TARGET_FS)/usr/lib/nvidia-current
-      endif 
-    endif
-
-  # Search for Linux distribution path for libcuda.so
-  CUDALIB ?= $(shell find $(CUDAPATH) $(DFLT_PATH) -name libcuda.so -print 2>/dev/null)
-
-  ifeq ("$(CUDALIB)",'')
-      $(info >>> WARNING - CUDA Driver libcuda.so is not found.  Please check and re-install the NVIDIA driver. <<<)
-      EXEC=@echo "[@]"
-  endif
-else
-  # This would be the Mac OS X path if we had to do anything special
-endif
-
-- 
GitLab