[CMake] FindCUDA ignores project dependencies when separable compilation is on

Irwin Zaid irwin.zaid at physics.ox.ac.uk
Tue Jan 6 13:29:01 EST 2015


Okay, so I've gone and put the messages into FindCUDA.cmake. I 
specifically put them right before and after the foreach() in 
CUDA_LINK_SEPARARABLE_COMPILATION_OBJECTS. The output is the following.

Is "$<$<CONFIG:Debug>:-Xcompiler>;$<$<CONFIG:Debug>:-fPIC>" supposed to 
be that way? That looks weird.

--

going to run COMMAND /usr/local/cuda/bin/nvcc -m64;-ccbin;"/usr/bin/cc" 
-dlink 
/home/irwin/Repositories/libdynd/build/CMakeFiles/libdynd.dir/src/dynd/kernels/./libdynd_generated_assignment_kernels.cu.o;/home/irwin/Repositories/libdynd/build/CMakeFiles/libdynd.dir/src/dynd/func/./libdynd_generated_arithmetic.cu.o;/home/irwin/Repositories/libdynd/build/CMakeFiles/libdynd.dir/src/dynd/func/./libdynd_generated_elwise.cu.o;/home/irwin/Repositories/libdynd/build/CMakeFiles/libdynd.dir/src/dynd/kernels/./libdynd_generated_ckernel_builder.cu.o;/home/irwin/Repositories/libdynd/build/CMakeFiles/libdynd.dir/src/dynd/types/./libdynd_generated_dynd_complex.cu.o;/home/irwin/Repositories/libdynd/build/CMakeFiles/libdynd.dir/src/dynd/types/./libdynd_generated_dynd_float16.cu.o;/home/irwin/Repositories/libdynd/build/CMakeFiles/libdynd.dir/src/dynd/types/./libdynd_generated_dynd_float128.cu.o;/home/irwin/Repositories/libdynd/build/CMakeFiles/libdynd.dir/src/dynd/types/./libdynd_generated_dynd_int128.cu.o;/home/irwin/Repositories/libdynd/build/CMakeFiles/libdynd.dir/src/d
ynd/types/./libdynd_generated_dynd_uint128.cu.o 
-o 
/home/irwin/Repositories/libdynd/build/CMakeFiles/libdynd.dir/./libdynd_intermediate_link.o

going to run COMMAND /usr/local/cuda/bin/nvcc -m64;-ccbin;"/usr/bin/cc" 
-dlink 
/home/irwin/Repositories/libdynd/build/CMakeFiles/libdynd.dir/src/dynd/kernels/./libdynd_generated_assignment_kernels.cu.o;/home/irwin/Repositories/libdynd/build/CMakeFiles/libdynd.dir/src/dynd/func/./libdynd_generated_arithmetic.cu.o;/home/irwin/Repositories/libdynd/build/CMakeFiles/libdynd.dir/src/dynd/func/./libdynd_generated_elwise.cu.o;/home/irwin/Repositories/libdynd/build/CMakeFiles/libdynd.dir/src/dynd/kernels/./libdynd_generated_ckernel_builder.cu.o;/home/irwin/Repositories/libdynd/build/CMakeFiles/libdynd.dir/src/dynd/types/./libdynd_generated_dynd_complex.cu.o;/home/irwin/Repositories/libdynd/build/CMakeFiles/libdynd.dir/src/dynd/types/./libdynd_generated_dynd_float16.cu.o;/home/irwin/Repositories/libdynd/build/CMakeFiles/libdynd.dir/src/dynd/types/./libdynd_generated_dynd_float128.cu.o;/home/irwin/Repositories/libdynd/build/CMakeFiles/libdynd.dir/src/dynd/types/./libdynd_generated_dynd_int128.cu.o;/home/irwin/Repositories/libdynd/build/CMakeFiles/libdynd.dir/src/d
ynd/types/./libdynd_generated_dynd_uint128.cu.o 
-o 
/home/irwin/Repositories/libdynd/build/CMakeFiles/libdynd.dir/./libdynd_intermediate_link.o 
$<$<CONFIG:Debug>:-Xcompiler>;$<$<CONFIG:Debug>:-fPIC>
going to run COMMAND /usr/local/cuda/bin/nvcc -m64;-ccbin;"/usr/bin/cc" 
-dlink 
/home/irwin/Repositories/libdynd/build/tests/CMakeFiles/test_libdynd.dir/func/./test_libdynd_generated_test_apply.cu.o;/home/irwin/Repositories/libdynd/build/tests/CMakeFiles/test_libdynd.dir/func/./test_libdynd_generated_test_lift_arrfunc.cu.o 
-o 
/home/irwin/Repositories/libdynd/build/tests/CMakeFiles/test_libdynd.dir/./test_libdynd_intermediate_link.o

going to run COMMAND /usr/local/cuda/bin/nvcc -m64;-ccbin;"/usr/bin/cc" 
-dlink 
/home/irwin/Repositories/libdynd/build/tests/CMakeFiles/test_libdynd.dir/func/./test_libdynd_generated_test_apply.cu.o;/home/irwin/Repositories/libdynd/build/tests/CMakeFiles/test_libdynd.dir/func/./test_libdynd_generated_test_lift_arrfunc.cu.o 
-o 
/home/irwin/Repositories/libdynd/build/tests/CMakeFiles/test_libdynd.dir/./test_libdynd_intermediate_link.o 
$<$<CONFIG:Debug>:-Xcompiler>;$<$<CONFIG:Debug>:-fPIC>

James Bigler wrote:
> I meant putting messages into FindCUDA.cmake itself.
>
> Only certain flags are propagated for the intermediate link file
> compilation, because I've had a lot of trouble over the years for
> propagating all the host flags. This set of flags is filtered by the
> function _cuda_get_important_host_flags. Right now only the
> CMAKE_CXX_FLAGS_*CONFIG* are being processed. None of the flags in the
> configuration free variable are passed. That was the "patch" I wanted
> you to try. Why -fPIC in the configuration specific CMAKE_CXX_FLAGS
> wasn't working, I'm not sure. The code is there to do it.
>
> On Tue, Jan 6, 2015 at 10:05 AM, Irwin Zaid <irwin.zaid at physics.ox.ac.uk
> <mailto:irwin.zaid at physics.ox.ac.uk>> wrote:
>
>     Right, when I modify FindCUDA.cmake as you describe everything
>     works. So that's good.
>
>     Without doing that, I still don't see CMAKE_CXX_FLAGS_DEBUG
>     propagating its flags to the intermediate link file. Did you mean to
>     put message commands into CUDA_LINK_SEPARABLE___COMPILATION_OBJECTS
>     itself? When I put them into my main CMakeLists.txt, nothing is
>     printed for ${nvcc_flags} or the other variables.
>
>     James Bigler wrote:
>
>         On Tue, Jan 6, 2015 at 8:54 AM, Irwin Zaid
>         <irwin.zaid at physics.ox.ac.uk
>         <mailto:irwin.zaid at physics.ox.ac.uk>
>         <mailto:irwin.zaid at physics.ox.__ac.uk
>         <mailto:irwin.zaid at physics.ox.ac.uk>>> wrote:
>
>         Okay, an update on this.
>
>         2) This is trickier and, unfortunately, still not working. We are
>         already adding -fPIC to CMAKE_CXX_FLAGS, should that not be
>         enough? I also tried adding it to both CMAKE_CXX_FLAGS_DEBUG and
>         CMAKE_CXX_FLAGS_RELEASE, with no effect.
>
>         Looking into FindCUDA.CMake at
>         CUDA_LINK_SEPARABLE_____COMPILATION_OBJECTS, I find code very
>         similar to what you are describing. Are you saying that in
>         addition to what is below, we need to add what you proposed? This
>         is what I see.
>
>         --
>
>
>         It can be put here (before this foreach).
>
>         foreach(config ${CUDA_configuration_types})
>         string(TOUPPER ${config} config_upper)
>         # Add config specific flags
>         foreach(f ${CUDA_NVCC_FLAGS_${config_____upper}})
>         list(APPEND config_specific_flags $<$<CONFIG:${config}>:${f}>)
>         endforeach()
>         set(important_host_flags)
>         _cuda_get_important_host_____flags(important_host_flags
>         ${CMAKE_${CUDA_C_OR_CXX}_____FLAGS_${config_upper}})
>         foreach(f ${important_host_flags})
>         list(APPEND flags $<$<CONFIG:${config}>:-____Xcompiler>
>         $<$<CONFIG:${config}>:${f}>)
>         endforeach()
>         endforeach()
>
>
>         Or it can be put here (or after the foreach).
>
>         I'm concerned that the flag didn't show up after adding it to
>         the _DEBUG or _RELEASE variants. If you could add a few message
>         commands around that might help see what is going on. The flag
>         needs to be propagated.
>
>         You could sprinkle a few commands like this:
>         message("going to run COMMAND ${CUDA_NVCC_EXECUTABLE}
>         ${nvcc_flags} -dlink ${object_files} -o ${output_file}
>         ${flags}")
>
>
>


More information about the CMake mailing list