[CMake] Installation corrupts library on OS X

Clinton Stimpson clinton at elemtech.com
Tue Oct 21 13:31:00 EDT 2014


On Tuesday, October 21, 2014 06:52:58 PM Filipe Maia wrote:
> CMake's FindCUDA.cmake module adds the rpath when run on Mac OSX
> (from FindCUDA.cmake):
> 
> if(APPLE)
>   # We need to add the path to cudart to the linker using rpath, since the
>   # library name for the cuda libraries is prepended with @rpath.
>   if(CUDA_BUILD_EMULATION AND CUDA_CUDARTEMU_LIBRARY)
>     get_filename_component(_cuda_path_to_cudart "${CUDA_CUDARTEMU_LIBRARY}"
> PATH)
>   else()
>     get_filename_component(_cuda_path_to_cudart "${CUDA_CUDART_LIBRARY}"
> PATH)
>   endif()
>   if(_cuda_path_to_cudart)
>     list(APPEND CUDA_LIBRARIES -Wl,-rpath "-Wl,${_cuda_path_to_cudart}")
>   endif()
> endif()
> 
> This causes this problem for anything built with CUDA support
> (e.g. CUDA_ADD_EXECUTABLE), by having one rpath from the CUDA module and
> another one from cmake trying its automagic.
> The rpath should probably be removed from the module.

Oh!  It comes from Modules/FindCUDA.cmake.  That does need fixed.
Does the attached patch fix your problem?

Clint



> On Tue, Oct 14, 2014 at 9:56 PM, Clinton Stimpson <clinton at elemtech.com>
> 
> wrote:
> > On Tuesday, October 14, 2014 12:10:36 PM Peter Eastman wrote:
> > > Hi Clint,
> > > 
> > > In my case, it wasn't anything like that.  I was only specifying
> > > /usr/local/cuda/lib once.  More specifically, my CMakeLists.txt
> > > specified
> > > 
> > > TARGET_LINK_LIBRARIES(${SHARED_TARGET} ${CUDA_LIBRARIES})
> > > 
> > > where CUDA_LIBRARIES is
> > > 
> > > /usr/local/cuda/lib/libcudart.dylib-Wl,-rpath-Wl,/usr/local/cuda/lib
> > 
> > Since CMake 2.8.12, CMake will automatically figure out the
> > -Wl,-rpath-Wl,/usr/local/cuda/lib part for
> > /usr/local/cuda/lib/libcudart.dylib.
> > 
> > So, the duplicate comes from CMake adding it once, and you adding it once.
> > 
> > You should be able to remove any -Wl,-rpath flags that you add manually
> > with
> > CMake 2.8.12 and newer, and let CMake take care of that for you.
> > 
> > > This library also linked against another of my libraries, that also
> > 
> > happened
> > 
> > > to link against CUDA.  So that's why it was getting referenced twice:
> > once
> > 
> > > directly, and once indirectly via a second library.
> > > 
> > > In any case, it's not clear to me why CMake is calling
> > > "install_name_tool
> > > -delete_rpath".  Everything works fine without doing that.  And when you
> > 
> > do
> > 
> > > it, that breaks things.
> > 
> > CMake calls "install_name_tool -delete_rpath" at install time to remove
> > the
> > build rpaths and add install rpaths as specified by the INSTALL_RPATH
> > target
> > property.
> > 
> > For more details and examples:
> > http://www.kitware.com/blog/home/post/510
> > http://www.cmake.org/Wiki/CMake_RPATH_handling
> > 
> > Clint
> > 
> > > Peter
> > > 
> > > On Oct 14, 2014, at 11:06 AM, Clinton Stimpson <clinton at elemtech.com>
> > 
> > wrote:
> > > > Here's a simple way to reproduce from the command line:
> > > > 
> > > > echo "void foo() {}" > lib.c
> > > > gcc -dynamiclib -o libtest.dylib -Wl,-rpath,/usr/lib
> > 
> > -Wl,-rpath,/usr/lib
> > 
> > > > lib.c install_name_tool -delete_rpath /usr/lib libtest.dylib
> > > > otool -L libtest.dylib
> > > > 
> > > >  # gives me the error: "load command 13 size zero (can't advance to
> > 
> > other
> > 
> > > > load commands)"
> > > > 
> > > > At install time, CMake will call "install_name_tool -delete_rpath ...
> > 
> > " as
> > 
> > > > needed.
> > > > 
> > > > I can't get into Apple's bug tracker.  I don't know why.  When I try
> > > > to
> > > > log
> > > > in, it comes back with a generic error and it asks me to email them
> > 
> > with
> > 
> > > > details about the error.
> > > > 
> > > > When I do the same on Linux, the GNU linker will consolidate the
> > 
> > duplicate
> > 
> > > > paths.
> > > > 
> > > > Thanks!
> > > > 
> > > > Clint
> > 
> > --
> > Clinton Stimpson
> > Elemental Technologies, Inc
> > Computational Simulation Software, LLC
> > www.csimsoft.com
> > --
> > 
> > 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
-------------- next part --------------
diff --git a/Modules/FindCUDA.cmake b/Modules/FindCUDA.cmake
index 2e2b21c..3dd975c 100644
--- a/Modules/FindCUDA.cmake
+++ b/Modules/FindCUDA.cmake
@@ -703,18 +703,6 @@ if(CUDA_BUILD_EMULATION AND CUDA_CUDARTEMU_LIBRARY)
 else()
   set(CUDA_LIBRARIES ${CUDA_CUDART_LIBRARY})
 endif()
-if(APPLE)
-  # We need to add the path to cudart to the linker using rpath, since the
-  # library name for the cuda libraries is prepended with @rpath.
-  if(CUDA_BUILD_EMULATION AND CUDA_CUDARTEMU_LIBRARY)
-    get_filename_component(_cuda_path_to_cudart "${CUDA_CUDARTEMU_LIBRARY}" PATH)
-  else()
-    get_filename_component(_cuda_path_to_cudart "${CUDA_CUDART_LIBRARY}" PATH)
-  endif()
-  if(_cuda_path_to_cudart)
-    list(APPEND CUDA_LIBRARIES -Wl,-rpath "-Wl,${_cuda_path_to_cudart}")
-  endif()
-endif()
 
 # 1.1 toolkit on linux doesn't appear to have a separate library on
 # some platforms.


More information about the CMake mailing list