mitsuba/data/cmake/packaging/MtsFixupBundle.cmake.in

134 lines
5.3 KiB
CMake

# Fixup bundle script generated at configure time. It expects that the
# following variables are set:
# BUILD_GUI
# MTS_LIBPATHS (the result of calling mts_library_paths)
# MTS_BUNDLE_NAME
# MTS_EXE_DEST
# MTS_LIB_DEST
# MTS_PLUGIN_DEST
# MTS_PYTHON_DEST
message (STATUS "Running Mitsuba Fixup Bundle script...")
# Copy the stand alone dynamic libraries into @executable_path/../Frameworks
# instead of the default @executable_path/../MacOS.
if (APPLE)
# gp_item_default_embedded_path item default_embedded_path_var
#
# Return the path that others should refer to the item by when the item
# is embedded inside a bundle.
#
# Override on a per-project basis by providing a project-specific
# gp_item_default_embedded_path_override function
#
function (gp_item_default_embedded_path_override item default_embedded_path_var)
if(item MATCHES "\\.dylib$" AND ${${default_embedded_path_var}} STREQUAL "@executable_path/../MacOS")
set(path "@executable_path/../Frameworks")
set(${default_embedded_path_var} "${path}" PARENT_SCOPE)
endif()
endfunction ()
# GP_RESOLVE_ITEM(<context> <item> <exepath> <dirs> <resolved_item_var> <resolved_var>)
#
# Resolve an item into an existing full path file.
# Override on a per-project basis by providing a project-specific
# gp_resolve_item_override function.
#
function (gp_resolve_item_override context item exepath dirs resolved_item_var resolved_var)
set (dependency_dest "${CMAKE_INSTALL_PREFIX}/@MTS_LIB_DEST@")
if (item MATCHES "^libmitsuba.+\\.dylib$")
# Since the bundle script runs after installation, the mitsuba libraries
# are already in their destination location
set (ri "${dependency_dest}/${item}")
set (${resolved_item_var} "${ri}" PARENT_SCOPE)
set (${resolved_var} 1 PARENT_SCOPE)
elseif (item MATCHES "^@rpath/.+")
# The first time CMake call this function, the dependencies have not been
# copied. In the first pass they will be resolved to their external
# locations so that they may be copied into the bundle. In the fixup pass
# they will be resolved to their embedded locations
foreach(depdir "${dependency_dest}" ${dirs})
string (REGEX REPLACE "^@rpath/(.+)" "\@depdir\@/\\1" ri_temp "${item}")
string (CONFIGURE "${ri_temp}" ri @ONLY)
if(EXISTS "${ri}")
set (${resolved_item_var} "${ri}" PARENT_SCOPE)
set (${resolved_var} 1 PARENT_SCOPE)
return()
endif()
endforeach()
elseif (item MATCHES "^@(executable|loader)_path/\\.\\./[Ff]rameworks/.+")
# The same applies for the frameworks
foreach(depdir "${dependency_dest}" ${dirs})
string (REGEX REPLACE "^@(executable|loader)_path/\\.\\./[Ff]rameworks/(.+)" "\@depdir\@/\\2" ri_temp "${item}")
string (CONFIGURE "${ri_temp}" ri @ONLY)
if(EXISTS "${ri}")
set (${resolved_item_var} "${ri}" PARENT_SCOPE)
set (${resolved_var} 1 PARENT_SCOPE)
return()
endif()
endforeach()
endif ()
endfunction ()
# As of CMake 2.8.5 there seems to be a bug: the override version only takes
# two arguments: the resolved filename and type_var
function (gp_resolved_file_type_override file type_var)
if ("${${type_var}}" STREQUAL "other")
set (base_preffix "${CMAKE_INSTALL_PREFIX}/@MTS_LIB_DEST@/")
string (LENGTH "${base_preffix}" min_embedded_len)
string (LENGTH "${file}" file_len)
if (file_len GREATER min_embedded_len)
string(SUBSTRING "${file}" 0 ${min_embedded_len} file_substr)
if (file_substr STREQUAL base_preffix)
set (${type_var} "embedded" PARENT_SCOPE)
endif ()
endif ()
endif()
endfunction ()
elseif (WIN32)
# Resolve the python library as a system component
function (gp_resolve_item_override context item exepath dirs resolved_item_var resolved_var)
if (item MATCHES "^python[23][0-9]\\.dll$")
set (ri "C:/Windows/System32/${item}")
set (${resolved_item_var} "${ri}" PARENT_SCOPE)
set (${resolved_var} 1 PARENT_SCOPE)
endif ()
endfunction ()
endif ()
# Get all the installed mitsuba and Qt plugins
file (GLOB MTSPLUGINS
"${CMAKE_INSTALL_PREFIX}/@MTS_PLUGIN_DEST@/*${CMAKE_SHARED_LIBRARY_SUFFIX}")
file (GLOB_RECURSE QTPLUGINS
"${CMAKE_INSTALL_PREFIX}/@MTS_QT_PLUGIN_DEST@/*${CMAKE_SHARED_LIBRARY_SUFFIX}")
# Get the python bindings as well
file (GLOB PYBINDINGS "${CMAKE_INSTALL_PREFIX}/@MTS_PYTHON_DEST@/*")
# Get an executable or just the bundle name for fixup
if (NOT DEFINED BUILD_GUI)
set (BUILD_GUI @BUILD_GUI@)
endif ()
if (NOT APPLE OR NOT BUILD_GUI)
get_filename_component(EXEDIR "${CMAKE_INSTALL_PREFIX}/@MTS_EXE_DEST@" ABSOLUTE)
file (GLOB mts_exes "${EXEDIR}/mts*${CMAKE_EXECUTABLE_SUFFIX}")
list (GET mts_exes 0 APP)
else ()
get_filename_component(APP "${CMAKE_INSTALL_PREFIX}/@MTS_BUNDLE_NAME@" ABSOLUTE)
endif ()
set (libpaths "@MTS_LIBPATHS@")
# Use our custom version of fixup_bundle, which supports @rpath on OS X
list(APPEND CMAKE_MODULE_PATH "@CMAKE_MODULE_PATH@")
include("MtsBundleUtilities")
if(APPLE)
set(BU_CHMOD_BUNDLE_ITEMS ON)
endif()
mts_fixup_bundle("${APP}" "${MTSPLUGINS};${QTPLUGINS};${PYBINDINGS}" "${libpaths}")