[cmake-developers] Linking projects with no C or CPP files

James Bigler jamesbigler at gmail.com
Thu Sep 12 17:36:38 EDT 2013


On Thu, Sep 12, 2013 at 3:28 PM, James Bigler <jamesbigler at gmail.com> wrote:

> On Thu, Sep 12, 2013 at 3:07 PM, Brad King <brad.king at kitware.com> wrote:
>
>> On 09/12/2013 04:57 PM, James Bigler wrote:
>> > This seems kind of confusing when the default for all the other VS
>> > generators is to link in the output of the custom command.  Does
>> > that not seem like a problem?
>>
>> The goal is to link all .obj files listed in the target exactly once.
>> According to Tests/ExternalOBJ/CMakeLists.txt this is tested and
>> works everywhere:
>>
>> ------------------------------------------------------------------------
>>  # Test creation of external objects by custom commands.
>>  set(CUSTOM_OBJECT
>>    ${CMAKE_CURRENT_BINARY_DIR}/custom_object${CMAKE_C_OUTPUT_EXTENSION})
>>  add_custom_command(
>>    OUTPUT ${CUSTOM_OBJECT}
>>    COMMAND ${CMAKE_COMMAND} -E copy ${EXTERNAL_OBJECT} ${CUSTOM_OBJECT}
>>    DEPENDS ${EXTERNAL_OBJECT}
>>    )
>>
>>  message("${EXTERNAL_OBJECT}")
>>  # Build an executable using the external object file.
>>  add_executable(ExternalOBJ executable.cxx ${CUSTOM_OBJECT})
>>  # A bug showed up in VS2010 where an object file that was
>>  # part of a custom commad output worked, but ones that were
>>  # not didn't work.  So, repeat the executable using the object
>>  # directly and not from the output of the copy.
>>  add_executable(ExternalOBJ2 executable.cxx ${EXTERNAL_OBJECT})
>> ------------------------------------------------------------------------
>>
>> Special changes were needed to work around VS 10 and 11 behavior of
>> automatically linking custom command outputs that are objects.
>> I do not think that happens with VS < 10.  In VS 10 we let it link
>> the custom command output and reference the .obj as <None>.  In
>> VS 11 we set LinkObjects to false in the custom command and refer
>> to the .obj with <Object>.  This is all tested as shown above.
>>
>> I do not see how MAIN_DEPENDENCY can influence this.  It only affects
>> where the custom command is attached.
>>
>> -Brad
>>
>
> You are correct.  I'm doing more investigation on how to fix this, and I
> discovered that MAIN_DEPENDENCY isn't directly the problem, but it is
> related.
>
> I discovered a long time ago that VS would link the output of a custom
> command.  When I used MAIN_DEPENDENCY it would link the custom command to
> the .cu file and I didn't need to add the obj file to the project anymore.
>  This was great for VS versions that didn't have source groupings.  Now I
> only had .cu files without a bunch of .obj files laying around.  I also set
> the EXTERNAL_OBJECT property on the obj files even though they weren't
> always added.  You could for example not attach the build rules to the .cu
> files and the obj files would be added to the project.
>
> I think this could work a little better if you allowed linking of the
> output of a custom command if MAIN_DEPENDENCY is set and the output of that
> command is only OBJ files or files that have the EXTERNAL_OBJECT property
> set to true.
>
> What do you think?  It would be backward compatible and allow the fix you
> already have.
>
> James
>

I should also point out that whatever solution comes into being, it should
get integrated into 2.8.12 since this affects FindCUDA.cmake.  Here's a
current work around, though it might need to do something with version
numbers.

@@ -1398,9 +1398,12 @@
       set(cuda_add_generated_file TRUE)

       if(NOT compile_to_ptx AND CMAKE_GENERATOR MATCHES "Visual Studio"
AND CUDA_ATTACH_VS_BUILD_RULE_TO_CUDA_FILE)
-        # Visual Studio 8 crashes when you close the solution when you
don't add the object file.
-        if(NOT CMAKE_GENERATOR MATCHES "Visual Studio 8")
+        # Visual Studio 8 crashes when you close the solution when you
don't add the
+        # object file.  CMake's Visual Studio 11 generator doesn't
automatically link in
+        # the output of custom commands, so you need to add the object
file to the project
+        # in order to get them linked in.
+        if(NOT CMAKE_GENERATOR MATCHES "Visual Studio 8" AND NOT
CMAKE_GENERATOR MATCHES "Visual Studio 11")
           set(cuda_add_generated_file FALSE)
         endif()
       endif()
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake-developers/attachments/20130912/89b39d22/attachment.html>


More information about the cmake-developers mailing list