[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