I am writing a simple automake example with CUDA but the implicit flags that should be added are ignored.
I have 2 files, main.cpp:
#include <stdio.h>
#include <cuda_runtime.h>
int cuda_hello_launcher();
int main() {
cuda_hello_launcher();
return 0;
}
and aux.cu:
#include <cuda_runtime.h>
#include <stdio.h>
__global__ void cuda_hello(){
printf("Hello World from GPU!\n");
}
void cuda_hello_launcher(){
cuda_hello<<<1,1>>>();
cudaDeviceSynchronize();
}
These two files are inside the src directory. I also have a Makefile.am in the src directory:
bin_PROGRAMS = cuda_automake_example
cuda_automake_example_SOURCES = main.cu aux.cpp
cuda_automake_example_LDFLAGS = $(CUDA_LIBS)
cuda_automake_example_LDADD = $(cuda_automake_example_LDFLAGS)
cuda_automake_example_CXXFLAGS = $(CUDA_INCLUDE_FLAGS) $(CUDA_LIBS)
$(info $(cuda_automake_example_CXXFLAGS))
$(info $(CUDA_INCLUDE_FLAGS))
.cu.o:
$(NVCC) -c -o $@ $<
And in the root directory (src directory is root/src): I have configure.ac:
AC_INIT([cuda_automake], [1.0], [])
AM_INIT_AUTOMAKE([foreign])
AC_PROG_CXX
AC_CONFIG_HEADERS([src/config.h])
AC_CONFIG_FILES([
Makefile
src/Makefile
])
AC_LANG_DEFINE([CUDA], [cuda], [CUDA], [CUDACXX],
[])
AC_ARG_WITH([cuda],
[AS_HELP_STRING([--with-cuda=PATH], [specify CUDA installation path])],
[with_cuda="$withval"],
[with_cuda=""])
if test -n "$with_cuda"
then
if test "$with_cuda" = yes
then
AC_MSG_ERROR([With-cuda argument requires the path to CUDA, --with-cuda=<CUDA_PATH>])
fi
if test -z "$with_cuda"
then
AC_MSG_ERROR([If you are building with CUDA GPU support, please input the CUDA path with --with-cuda=<CUDA_PATH>])
fi
# Extract the path from the "--with-cuda" argument
cuda_path=$(echo "$with_cuda" | sed 's/--with-cuda=//')
# Check if the path is valid
if test ! -d "$cuda_path"; then
AC_MSG_ERROR([The input for cuda-path=$cuda_path is not a valid directory])
fi
CUDA_INCLUDE_FLAGS="-I$with_cuda/include"
CUDA_LIBS="-L$with_cuda/lib64 -L$with_cuda/lib -lcudart"
NVCC="$with_cuda/bin/nvcc"
CUDA_PATH="$with_cuda"
else
AC_MSG_ERROR([B: $with_cuda])
fi
AC_SUBST(CUDA_INCLUDE_FLAGS)
AC_SUBST(CUDA_LIBS)
AC_SUBST(NVCC)
AC_SUBST(CUDA_PATH)
AC_OUTPUT
and a Makefile.am:
SUBDIRS = src
ACLOCAL_AMFLAGS = -I m4
When I call:
automake && autoconf && ./configure --with-cuda=/opt/nvidia/hpc_sdk/Linux_x86_64/23.3/cuda && VERBOSE=1 make
I get the following error:
Making all in src
make[1]: Entering directory '/home/primrose/Work/aux/cuda_automake/src'
-I/opt/nvidia/hpc_sdk/Linux_x86_64/23.3/cuda/include -L/opt/nvidia/hpc_sdk/Linux_x86_64/23.3/cuda/lib64 -L/opt/nvidia/hpc_sdk/Linux_x86_64/23.3/cuda/lib -lcudart
-I/opt/nvidia/hpc_sdk/Linux_x86_64/23.3/cuda/include
make all-am
make[2]: Entering directory '/home/primrose/Work/aux/cuda_automake/src'
-I/opt/nvidia/hpc_sdk/Linux_x86_64/23.3/cuda/include -L/opt/nvidia/hpc_sdk/Linux_x86_64/23.3/cuda/lib64 -L/opt/nvidia/hpc_sdk/Linux_x86_64/23.3/cuda/lib -lcudart
-I/opt/nvidia/hpc_sdk/Linux_x86_64/23.3/cuda/include
g++ -DHAVE_CONFIG_H -I. -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.cpp
main.cpp:2:10: fatal error: cuda_runtime.h: No such file or directory
2 | #include <cuda_runtime.h>
| ^~~~~~~~~~~~~~~~
compilation terminated.
make[2]: *** [Makefile:380: main.o] Error 1
make[2]: Leaving directory '/home/primrose/Work/aux/cuda_automake/src'
make[1]: *** [Makefile:270: all] Error 2
make[1]: Leaving directory '/home/primrose/Work/aux/cuda_automake/src'
make: *** [Makefile:337: all-recursive] Error 1
I would expect the target_CXXFLAGS of the target I am building also to include the include directory containing cuda_runtime.h as well as attached to the build command (the folder has cuda_runtime.h btw that is not a problem, I checked it with ls), but apparently it is not the case, why would it be so?
<target_name>_CPPFLAGS
and <target_name>_CXXFLAGS
are automatically added as C++ flags to the target.
Of course, make sure you have the correct filename extensions for the files or manually define the extensions as C++ extensions.