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

Robert Maynard robert.maynard at kitware.com
Wed Jan 7 11:27:20 EST 2015


I have merged the branch into next for you.

On Tue, Jan 6, 2015 at 6:50 PM, James Bigler <jamesbigler at gmail.com> wrote:
> I've pushed a change into 'stage' [1] that I hope to get into 'next'
> (something isn't working with my ssh authentication).
>
> James
>
> [1] commit b4e54f9b8c748f78d16e9da055a7e0436d7654ef
> Author: James Bigler <@>
> Date:   Tue Jan 6 16:28:05 2015 -0700
>
>     FindCUDA: Add relevant CMAKE_{C,CXX}_FLAGS for separable compilation
>
>     Previously only the CMAKE_{C,CXX}_FLAGS_<CONFIG> flags were inspected
>     for relevant flags when compiling the intermediate link file.  We need
>     to also consider the configuration agnostic flags, CMAKE_{C,CXX}_FLAGS
>     as well.
>
>
> On Tue, Jan 6, 2015 at 4:29 PM, Irwin Zaid <irwin.zaid at physics.ox.ac.uk>
> wrote:
>>
>> 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}")
>>>
>>>
>>>
>>>
>
>
> --
>
> Powered by www.kitware.com
>
> Please keep messages on-topic and check the CMake FAQ at:
> http://www.cmake.org/Wiki/CMake_FAQ
>
> Kitware offers various services to support the CMake community. For more
> information on each offering, please visit:
>
> CMake Support: http://cmake.org/cmake/help/support.html
> CMake Consulting: http://cmake.org/cmake/help/consulting.html
> CMake Training Courses: http://cmake.org/cmake/help/training.html
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Follow this link to subscribe/unsubscribe:
> http://public.kitware.com/mailman/listinfo/cmake


More information about the CMake mailing list