[cmake-developers] [CMake 0012382]: fixup_bundle_item dies on libraries copied to a directory outside bundle directory

Mantis Bug Tracker mantis at public.kitware.com
Tue Aug 2 18:47:05 EDT 2011


The following issue has been SUBMITTED. 
====================================================================== 
http://public.kitware.com/Bug/view.php?id=12382 
====================================================================== 
Reported By:                Gregory Crosswhite
Assigned To:                
====================================================================== 
Project:                    CMake
Issue ID:                   12382
Category:                   Modules
Reproducibility:            always
Severity:                   minor
Priority:                   normal
Status:                     new
====================================================================== 
Date Submitted:             2011-08-02 18:47 EDT
Last Modified:              2011-08-02 18:47 EDT
====================================================================== 
Summary:                    fixup_bundle_item dies on libraries copied to a
directory outside bundle directory
Description: 
When using a Linux-style layout for the installation with bin/, lib/, etc. and
directing the required shared libraries to be installed in lib/ instead of bin/,
fixup_bundle_item does not recognize that they have been installed into the
bundle and reports a fatal error.

The problem comes from the fact that when calling fixup_bundle on an executable
in the bin/ directory, fixup_bundle sets the bundle directory to bin/ which is a
sibling but not a parent of lib/, and so fixup_bundle_item does not recognize
that the library it is fixing up has already been put in the bundle.

Steps to Reproduce: 
The attached file has an example setup that triggers the issue;  inside the
ZIPfile are three files which are listed below:

===== CMakeLists.txt =====
cmake_minimum_required(VERSION 2.8.5)

set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/bundle)

find_package( Boost COMPONENTS thread REQUIRED )
link_directories ( ${Boost_LIBRARY_DIRS} )
include_directories ( ${Boost_INCLUDE_DIRS} )

add_executable(hello hello)
target_link_libraries(hello ${Boost_LIBRARIES})
install (TARGETS hello RUNTIME DESTINATION bin)

configure_file(
    ${CMAKE_SOURCE_DIR}/FixBundle.cmake.in
    ${CMAKE_BINARY_DIR}/FixBundle.cmake
    @ONLY
)
install(SCRIPT ${CMAKE_BINARY_DIR}/FixBundle.cmake)

===== FixBundle.cmake =====
include (BundleUtilities)

function(gp_item_default_embedded_path item default_embedded_path_var)
  set(${default_embedded_path_var} "@executable_path/../lib" PARENT_SCOPE)
endfunction(gp_item_default_embedded_path)

fixup_bundle("${CMAKE_INSTALL_PREFIX}/bin/hello${CMAKE_EXECUTABLE_SUFFIX}" ""
"@LIBRARY_OUTPUT_PATH@")
===== hello.cpp =====
#include <iostream>

using namespace std;

int main() {
  cout << "Hello, world!" << endl;
  return 0;
}
======================

Note that hello.cpp doesn't use Boost, I just included the dependency in order
to make sure that an external non-system shared library was pulled in.
====================================================================== 

Issue History 
Date Modified    Username       Field                    Change               
====================================================================== 
2011-08-02 18:47 Gregory CrosswhiteNew Issue                                    
2011-08-02 18:47 Gregory CrosswhiteFile Added: cmake-issue-example.zip          
         
======================================================================




More information about the cmake-developers mailing list