#!/bin/bash

echo "Creating makefile..."

MF=Makefile

rm -f ${MF}

nvcc --version 2> /dev/null > /dev/null
if [[ $? -eq 127 ]]
then
   echo "ERROR! To continue building source nvcc is strictly required!"
fi

yacc --version 2> /dev/null > /dev/null
if [[ $? -eq 127 ]]
then
   echo "ERROR! To continue building source bison is strictly required!"
fi

flex --version 2> /dev/null >/dev/null
if [[ $? -eq 127 ]]
then
   echo "ERROR! To continue building source flex is strictly required!"
fi

echo -e "SDK_COMMON_DIR = ~/NVIDIA_GPU_Computing_SDK/C/common" >> ${MF}
echo -e "SDK_COMMON_LIB_DIR = ~/NVIDIA_GPU_Computing_SDK/C" >> ${MF}
echo -e "TOOLKIT_INC_DIR = /usr/local/cuda/3.2/cuda/include\n" >> ${MF}

echo -e "ARCH = sm_10    #use sm_20 for Fermi, sm_12 for 1.2 and sm_13 for 1.3" >> ${MF}
echo -e "CXX = nvcc" >> ${MF}
echo -e "NVCC = nvcc\n" >> ${MF}

echo -e "NVCCOPTIONS = -arch \$(ARCH) #-use_fast_math " >> ${MF}
echo -e "NVCCFLAGS = -O3 \$(NVCCOPTIONS) #-I \$(TOOLKIT_INC_DIR) -I. -I \$(SDK_COMMON_DIR)/inc/\n" >> ${MF}

echo -e "CXXFLAGS = -lstdc++ \$(NVCCFLAGS)" >> ${MF}
echo -e "NVCCLIBS = #-L \$(SDK_COMMON_LIB_DIR)/lib -lcutil -lm\n" >> ${MF}


echo -e "all: source directories\n" >> ${MF}

echo    "#------------------------------ gmsa --------------------------------"  >> ${MF}
echo -e  "source: gmsa\n" >> ${MF}
echo -ne "gmsa: "  >> ${MF}
find .  -name '*.cpp' -exec bash -c 'echo $1 | cut -c3- | head -c-5; echo -ne ".o \\\\\n\t"' {} {} \; >> ${MF}
echo -e  "main_cu.o phylip-gram.o phylip-scan.o" >> ${MF}
echo -ne "\t\t" >> ${MF}
echo -ne "  \$(NVCC) \$(NVCCFLAGS) \$(NVCCLIBS) "  >> ${MF}
#echo -n \ \ nvcc \  >> ${MF}
find . -name '*.cpp' -exec bash -c 'echo $1 | cut -c3- | head -c-5; echo -ne ".o \\\\\n\t\t"' {} {} \; >> ${MF}
echo -e "main_cu.o phylip-gram.o phylip-scan.o -ly -lfl\\" >> ${MF}
echo -e  "\t\t-o gmsa\n\n" >> ${MF}

echo    "#------------------------------ YACC -------------------------------------------"  >> ${MF}
echo    "phylip-gram.o: phylip-gram.cc phylip-gram.hh" >>${MF}
echo -e "\tgcc -lstdc++ -c phylip-gram.cc -o phylip-gram.o" >> ${MF}
echo    "phylip-scan.o: phylip-scan.cc phylip-gram.hh" >>${MF}
echo -e "\tgcc -lstdc++ -c phylip-scan.cc -o phylip-scan.o" >> ${MF}
echo    "phylip-gram.cc phylip-gram.hh: phylip-gram.y" >>${MF}
echo -e "\tyacc -d phylip-gram.y -o phylip-gram.cc" >>${MF}
echo    "phylip-scan.cc: phylip-scan.l" >>${MF}
echo -e "\tflex -o phylip-scan.cc phylip-scan.l" >>${MF}

echo    "#------------------------------ CPP --------------------------------------------"  >> ${MF}
find . -name '*.cpp' -exec bash -c 'g++ -MM $1 ; echo -e "\t\t\$(CXX) \$(CXXFLAGS)  -c $1"' {} {} \; >> ${MF}


echo    "#------------------------------ CU ---------------------------------------------"  >> ${MF}
nvcc -M main_cu.cu 2>/dev/null | egrep ^m >> ${MF}
nvcc -M main_cu.cu 2>/dev/null | egrep ^\ \ \ \ [^\/] >> ${MF}
echo -e "\n\n\n\t  \$(NVCC) \$(NVCCFLAGS)  -c main_cu.cu -o main_cu.o" >> ${MF}

echo    "#------------------------------ DIRECTORIES ------------------------------------"  >> ${MF}
echo -e "directories: results \n" >> ${MF}
echo    "results:" >> ${MF}
echo -e "\t mkdir -p results" >> ${MF}


echo    "#-------------------------------- CLEANING -------------------------------------"  >> ${MF}
echo -ne "clean: \n\trm -f " >> ${MF}
find . -name '*.cpp' -exec bash -c 'echo $1 | cut -c3- | head -c-5; echo -ne ".o \n\trm -f "' {} {} \; >> ${MF}
echo -e "gmsa" >> ${MF}
echo -e "\trm -f main_cu.o\n" >> ${MF}


echo    "#--------------------------------- OTHER ---------------------------------------"  >> ${MF}
echo    "ptx:" >> ${MF}
echo -e "\t\$(NVCC) \$(NVCCFLAGS) -c main_cu.cu --ptxas-options=-v \n" >> ${MF}

