[CMake] FindCUDA ignores project dependencies when separable compilation is on
Irwin Zaid
irwin.zaid at physics.ox.ac.uk
Tue Jan 6 18:29:25 EST 2015
Okay, so to conclude:
Should we make a PR to include your patched code so CMAKE_CXX_FLAGS just works? I think this makes sense, as I would never have thought to do the DEBUG / RELEASE stuff. I can do the PR, unless you want to.
And, of course, thanks for all your help!
Irwin
James Bigler wrote:
> Right, if you don't specify the CMAKE_BUILD_TYPE you are only getting
> the CMAKE_CXX_FLAGS and none of the build type specific flags such as
> CMAKE_CXX_FLAGS_DEBUG.
>
> There is still the issue that I wasn't bringing in the CMAKE_CXX_FLAGS
> (which is why my patch helped).
>
> James
>
> On Tue, Jan 6, 2015 at 1:32 PM, Irwin Zaid
> <irwin.zaid at physics.ox.ac.uk <mailto:irwin.zaid at physics.ox.ac.uk>> wrote:
>
> Wait, hold on. The -fPIC does get passed to everything if I set
> the build mode to Debug by passing -DCMAKE_BUILD_TYPE=Debug to
> CMake. Is that what I should be doing? (Sorry about that, if yes.)
>
> If that's the case, what is the correct way to get -fPIC passed to
> the intermediate linking? Am I meant to always build in Debug mode
> just for that?
>
> Irwin
>
> Irwin Zaid wrote:
>
> I just double-checked. The -fPIC is definitely there for each
> individual
> object file, but not for the *_intermediate_link.o.
>
> Irwin
>
> James Bigler wrote:
>
>
> James
>
> On Jan 6, 2015, at 11:29 AM, Irwin
> Zaid<irwin.zaid at physics.ox.ac.__uk
> <mailto:irwin.zaid at physics.ox.ac.uk>> wrote:
>
> 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.
>
> Yeah. That looks right. It means the argument will only be
> run when the build configuration matches DEBUG. This is
> less exciting for Makefiles builds since there is only one
> configuration preset at a time, but for things like Visual
> Studio where you have multiple build configs from a single
> CMake configure this makes a custom command for each
> without having to rely on scripts to dispatch the correct
> command (that's how the rest of FindCUDA works by the way).
>
> As far as the rest of these, I'm concerned the fPIC flag
> comes and goes. Perhaps something is modifying the flags.
> Do the commands with fPIC actually get run with fPIC (use
> make VERBOSE=1)?
>
> --
>
> 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
> <http://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_d
>
> y
>
> nd_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
> <http://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_d
>
> y
>
> nd_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>
> <mailto: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>>
> <mailto:irwin.zaid at physics.ox.
> <mailto:irwin.zaid at physics.ox.>____ac.uk
> <http://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