[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