From 5c3112a5dd1105479ef1b5851404c94a9c859c9f Mon Sep 17 00:00:00 2001 From: Rashad Kanavath <rashad.kanavath@c-s.fr> Date: Mon, 21 Nov 2016 11:14:26 +0100 Subject: [PATCH] ENH: cleanup package and xdk for all platforms --- SuperBuild/CMake/External_pkgtools.cmake | 105 +- SuperBuild/Packaging/CMakeLists.txt | 374 ++--- ...Macros.cmake => CreateCMakeProjects.cmake} | 100 +- SuperBuild/Packaging/Files/linux_pkgsetup.in | 12 +- SuperBuild/Packaging/Files/macx_pkgsetup.in | 26 +- .../Packaging/InstallSupportFiles.cmake | 376 +++++ SuperBuild/Packaging/PackageGlobals.cmake | 120 ++ SuperBuild/Packaging/PackageHelper.cmake | 1317 ++++------------- SuperBuild/Packaging/PackageMacros.cmake | 222 +++ 9 files changed, 1339 insertions(+), 1313 deletions(-) rename SuperBuild/Packaging/{PMacros.cmake => CreateCMakeProjects.cmake} (71%) create mode 100644 SuperBuild/Packaging/InstallSupportFiles.cmake create mode 100644 SuperBuild/Packaging/PackageGlobals.cmake create mode 100755 SuperBuild/Packaging/PackageMacros.cmake diff --git a/SuperBuild/CMake/External_pkgtools.cmake b/SuperBuild/CMake/External_pkgtools.cmake index ebef802c12..fc2d24a720 100644 --- a/SuperBuild/CMake/External_pkgtools.cmake +++ b/SuperBuild/CMake/External_pkgtools.cmake @@ -1,3 +1,24 @@ + +set(PKGTOOLS_SB_PREFIX_DIR "${CMAKE_BINARY_DIR}/PACKAGE-TOOLS") + +set(PATCHELF_SOURCE_DIR "${PKGTOOLS_SB_PREFIX_DIR}/src/patchelf") +# PATCHELF_BINARY_DIR is same as PATCHELF_SOURCE_DIR +set(PATCHELF_INSTALL_DIR "${PKGTOOLS_SB_PREFIX_DIR}/install/patchelf") +set(PATCHELF_STAMP_DIR "${PKGTOOLS_SB_PREFIX_DIR}/stamp/patchelf") +set(PATCHELF_TMP_DIR "${PKGTOOLS_SB_PREFIX_DIR}/tmp/patchelf") + +#This variable is referenced in PMacros.cmake +set(PATCHELF_PROGRAM "${PATCHELF_SOURCE_DIR}/src/patchelf") + + +set(MAKESELF_SOURCE_DIR "${PKGTOOLS_SB_PREFIX_DIR}/src/makeself") +# MAKESELF_SOURCE_DIR is same as MAKESELF_BINARY_DIR and MAKESELF_INSTALL_DIR +set(MAKESELF_STAMP_DIR "${PKGTOOLS_SB_PREFIX_DIR}/stamp/makeself") +set(MAKESELF_TMP_DIR "${PKGTOOLS_SB_PREFIX_DIR}/tmp/makeself") + +#This variable is referenced in PMacros.cmake +set(MAKESELF_SCRIPT "${MAKESELF_SOURCE_DIR}/makeself.sh") + if( __EXTERNAL_PACKAGE_TOOLS__) return() else() @@ -9,57 +30,41 @@ if(WIN32) return() endif() -if(UNIX AND NOT WIN32) - - include(ExternalProject) - - set(PKGTOOLS_SB_PREFIX_DIR "${CMAKE_BINARY_DIR}/PACKAGE-TOOLS") +include(ExternalProject) - if(APPLE) - add_custom_target(PATCHELF) - else() - set(PATCHELF_INSTALL_DIR ${PKGTOOLS_SB_PREFIX_DIR}/install-patchelf) - set(PATCHELF_PROGRAM ${PATCHELF_INSTALL_DIR}/patchelf) - ExternalProject_Add(PATCHELF - PREFIX "${PKGTOOLS_SB_PREFIX_DIR}" - URL "http://nixos.org/releases/patchelf/patchelf-0.9/patchelf-0.9.tar.bz2" - URL_MD5 d02687629c7e1698a486a93a0d607947 - DOWNLOAD_DIR ${DOWNLOAD_LOCATION} - SOURCE_DIR "${PKGTOOLS_SB_PREFIX_DIR}/src-patchelf" - BINARY_DIR "${PKGTOOLS_SB_PREFIX_DIR}/build-patchelf" - TMP_DIR "${PKGTOOLS_SB_PREFIX_DIR}/tmp-patchelf" - STAMP_DIR "${PKGTOOLS_SB_PREFIX_DIR}/stamp-patchelf" - PATCH_COMMAND ${CMAKE_COMMAND} -E make_directory ${PKGTOOLS_SB_PREFIX_DIR}/install - CONFIGURE_COMMAND ${CMAKE_COMMAND} -E chdir ${PKGTOOLS_SB_PREFIX_DIR}/src-patchelf - ./configure --prefix ${PATCHELF_INSTALL_DIR} - BUILD_COMMAND ${CMAKE_COMMAND} -E chdir ${PKGTOOLS_SB_PREFIX_DIR}/src-patchelf ${CMAKE_MAKE_PROGRAM} - INSTALL_COMMAND ${CMAKE_COMMAND} -E copy ${PKGTOOLS_SB_PREFIX_DIR}/src-patchelf/src/patchelf ${PATCHELF_PROGRAM} - ) - endif(APPLE) +ExternalProject_Add(MAKESELF + PREFIX "${PKGTOOLS_SB_PREFIX_DIR}" + URL "https://www.orfeo-toolbox.org/packages/makeself-2.2.0.tar.gz" + URL_MD5 3c61df934b0c61ddcd7bd63b391e951d + DOWNLOAD_DIR "${DOWNLOAD_LOCATION}" + SOURCE_DIR "${MAKESELF_SOURCE_DIR}" + BINARY_DIR "${MAKESELF_SOURCE_DIR}" + INSTALL_DIR "${MAKESELF_SOURCE_DIR}" + STAMP_DIR "${MAKESELF_STAMP_DIR}" + TMP_DIR "${MAKESELF_TMP_DIR}" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + DEPENDS PATCHELF + ) - set(MAKESELF_INSTALL_DIR ${PKGTOOLS_SB_PREFIX_DIR}/install-makeself) - set(MAKESELF_SCRIPT ${MAKESELF_INSTALL_DIR}/makeself.sh) - set(MAKESELF_HEADER_SCRIPT ${MAKESELF_INSTALL_DIR}/makeself-header.sh) - - ExternalProject_Add(MAKESELF - PREFIX "${PKGTOOLS_SB_PREFIX_DIR}" - URL "https://www.orfeo-toolbox.org/packages/makeself-2.2.0.tar.gz" - URL_MD5 3c61df934b0c61ddcd7bd63b391e951d - DOWNLOAD_DIR ${DOWNLOAD_LOCATION} - SOURCE_DIR "${PKGTOOLS_SB_PREFIX_DIR}/src-makeself" - BINARY_DIR "${PKGTOOLS_SB_PREFIX_DIR}/build-makeself" - TMP_DIR "${PKGTOOLS_SB_PREFIX_DIR}/tmp-makeself" - STAMP_DIR "${PKGTOOLS_SB_PREFIX_DIR}/stamp-makeself" - CONFIGURE_COMMAND "" - BUILD_COMMAND ${CMAKE_COMMAND} -E copy - ${PKGTOOLS_SB_PREFIX_DIR}/src-makeself/makeself-header.sh - ${MAKESELF_HEADER_SCRIPT} - INSTALL_COMMAND ${CMAKE_COMMAND} -E copy - ${PKGTOOLS_SB_PREFIX_DIR}/src-makeself/makeself.sh - ${MAKESELF_SCRIPT} - DEPENDS PATCHELF - ) +if(APPLE) + add_custom_target(PATCHELF) + return() +endif() - add_custom_target(PACKAGE-TOOLS DEPENDS MAKESELF) +ExternalProject_Add(PATCHELF + PREFIX "${PKGTOOLS_SB_PREFIX_DIR}" + URL "http://nixos.org/releases/patchelf/patchelf-0.9/patchelf-0.9.tar.bz2" + URL_MD5 d02687629c7e1698a486a93a0d607947 + DOWNLOAD_DIR "${DOWNLOAD_LOCATION}" + SOURCE_DIR "${PATCHELF_SOURCE_DIR}" + BINARY_DIR "${PATCHELF_SOURCE_DIR}" + INSTALL_DIR "${PATCHELF_INSTALL_DIR}" + STAMP_DIR "${PATCHELF_STAMP_DIR}" + TMP_DIR "${PATCHELF_TMP_DIR}" + CONFIGURE_COMMAND "./configure" "--prefix" "${PATCHELF_INSTALL_DIR}" + INSTALL_COMMAND "" + ) -endif(UNIX AND NOT WIN32) +add_custom_target(PACKAGE-TOOLS DEPENDS MAKESELF) diff --git a/SuperBuild/Packaging/CMakeLists.txt b/SuperBuild/Packaging/CMakeLists.txt index 391bc3e2c3..3f293e52bd 100644 --- a/SuperBuild/Packaging/CMakeLists.txt +++ b/SuperBuild/Packaging/CMakeLists.txt @@ -1,185 +1,189 @@ -# cpack has a built-in target called 'package'. In our case we create two standalone installers with -# and uses a custom target named packages. - -# stop generation of msvc packages for windows. 04-apr-2016. point OTB. - -##### check if standalone project ###### -set(PACKAGE_OTB_SRC_DIR) -set(OUT_OF_SOURCE_BUILD FALSE) -if(NOT PROJECT_NAME) - cmake_minimum_required(VERSION 2.6) - include(CMakeParseArguments) - project(OTBPackaging) - - option(GENERATE_PACKAGE "Generate OTB package" ON) - option(GENERATE_XDK "Generate XDK for OTB development" OFF) - - set(OUT_OF_SOURCE_BUILD TRUE) - - if(BUILD_TESTING) - include(CTest) - endif() - - if(NOT PACKAGE_OTB_SRC_DIR) - get_filename_component(PACKAGE_OTB_SRC_DIR ${OTBPackaging_SOURCE_DIR} PATH) - get_filename_component(PACKAGE_OTB_SRC_DIR ${PACKAGE_OTB_SRC_DIR} PATH) - endif() - - option(OTB_WRAP_PYTHON "enable python wrapping" ON) - if(OTB_WRAP_PYTHON AND NOT PYTHON_EXECUTABLE) - find_package ( PythonInterp REQUIRED ) - mark_as_advanced(PYTHON_INCLUDE_DIR) - mark_as_advanced(PYTHON_LIBRARY) - endif() - - if(WIN32 AND NOT MSVC) - set(OTB_BINARY_DIR "" CACHE PATH "OTB binary directory") - set(OTB_INSTALL_DIR "" CACHE PATH "OTB install directory") - else() - set(SUPERBUILD_BINARY_DIR "" CACHE PATH "path to superbuild binary directory") - set(SUPERBUILD_INSTALL_DIR "" CACHE PATH "path to superbuild install directory") - set(DOWNLOAD_LOCATION "" CACHE PATH "path to superbuild download archives") - endif() - -else() #if(NOT PROJECT_NAME) - - # SUPERBUILD_BINARY_DIR is only set in Packaging/CMakeLists.txt and not available - # in the parent scope like others. So we need to set it as CMAKE_BINARY_DIR - # if doing packages from source tree. - set( SUPERBUILD_BINARY_DIR ${CMAKE_BINARY_DIR} ) - set( SUPERBUILD_INSTALL_DIR ${SB_INSTALL_PREFIX} ) - set( OTB_INSTALL_DIR ${CMAKE_INSTALL_PREFIX} ) - - if(NOT PACKAGE_OTB_SRC_DIR) - get_filename_component(PACKAGE_OTB_SRC_DIR ${OTB-SuperBuild_SOURCE_DIR} PATH) - endif() - -endif() - -if(NOT GENERATE_PACKAGE AND NOT GENERATE_XDK) - #well. we don't have any businees here. Let's move on.. - return() -endif() - -if(WIN32 AND NOT MSVC) - if(NOT MXE_TARGET_DIR) - message(FATAL_ERROR "you must set MXE_TARGET_DIR") - endif() -endif() - -if(NOT PACKAGE_OTB_SRC_DIR) - message(FATAL_ERROR "you must set PACKAGE_OTB_SRC_DIR") -endif() - -set(SUPERBUILD_SOURCE_DIR ${PACKAGE_OTB_SRC_DIR}/SuperBuild) - -include(${SUPERBUILD_SOURCE_DIR}/CMake/SuperBuild_Macro.cmake) -include(${PACKAGE_OTB_SRC_DIR}/CMake/OTBCheckTargetSystemArch.cmake) -include(${CMAKE_CURRENT_SOURCE_DIR}/PMacros.cmake) - -if(WIN32) - set(ZIP_EXE_NAMES 7z 7za) - find_program(ZIP_EXECUTABLE NAMES ${ZIP_EXE_NAMES}) - if(NOT ZIP_EXECUTABLE) - message(FATAL_ERROR "Cannot find 7z executable. searched names ${ZIP_EXE_NAMES}. Please add it to your path") - endif() -endif() - -if(WIN32 AND NOT MSVC) - set(required_vars - PACKAGE_OTB_SRC_DIR - OTB_BINARY_DIR - OTB_INSTALL_DIR - ) -endif() - -foreach(req - ${required_vars} - SUPERBUILD_BINARY_DIR - SUPERBUILD_INSTALL_DIR - SUPERBUILD_SOURCE_DIR - PACKAGE_OTB_SRC_DIR - OTB_TARGET_SYSTEM_ARCH - OTB_TARGET_SYSTEM_ARCH_IS_X64 - ) - if(NOT DEFINED ${req} OR "${${req}}" STREQUAL "") - message(FATAL_ERROR "you must set ${req}") - endif() - set(vars "${vars} ${req}=[${${req}}]\n") -endforeach(req) - -message("\n${vars}\n") - -set(EXTRA_CACHE_CONFIG) - -set(CMAKE_INSTALL_PREFIX "${SUPERBUILD_INSTALL_DIR}") - -set(PACKAGE_LONG_NAME OrfeoToolBox) - -# Make up part of output package file -set(PACKAGE_NAME OTB) -if(APPLE) - set(PACKAGE_PLATFORM_NAME "Darwin") -elseif(WIN32) - set(PACKAGE_PLATFORM_NAME "win") -elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux") - set(PACKAGE_PLATFORM_NAME "Linux") -endif() - -set(PACKAGE_ARCH "32") -if(OTB_TARGET_SYSTEM_ARCH_IS_X64) -set(PACKAGE_ARCH "64") -endif() - -if(MINGW) - get_filename_component(MXE_MXEROOT ${MXE_TARGET_DIR} PATH) - get_filename_component(MXE_MXEROOT ${MXE_MXEROOT} PATH) - set(EXTRA_CACHE_CONFIG - "set(CMAKE_CROSSCOMPILING TRUE) - set(WIN32 TRUE) - set(MXE_ARCH \"${MXE_ARCH}\") - set(MXE_MXEROOT \"${MXE_MXEROOT}\")" - ) - set(CMAKE_INSTALL_PREFIX "${OTB_INSTALL_DIR}") -endif() - -# get itk version from External_itk.cmake if not on mingw -# because mxe has different version -if(NOT MINGW) - get_version( - INPUT_FILE "${SUPERBUILD_SOURCE_DIR}/CMake/External_itk.cmake" - MATCH_STRINGS "SB_ITK_VERSION_MAJOR" "SB_ITK_VERSION_MINOR" - PREFIX PKG - ) -endif() - -set(PKG_ITK_SB_VERSION "${PKG_SB_ITK_VERSION_MAJOR}.${PKG_SB_ITK_VERSION_MINOR}") - -#get version of OTB from source_dir/CMakeLists.txt -get_version( - INPUT_FILE "${PACKAGE_OTB_SRC_DIR}/CMakeLists.txt" - MATCH_STRINGS "OTB_VERSION_MAJOR" "OTB_VERSION_MINOR" "OTB_VERSION_PATCH" - PREFIX PKG - ) - -set(PKG_OTB_VERSION_STRING - ${PKG_OTB_VERSION_MAJOR}.${PKG_OTB_VERSION_MINOR}.${PKG_OTB_VERSION_PATCH}) - -if(MINGW) - set(OTB_BINARY_DIR "${OTB_BINARY_DIR}") - set(OTB_INSTALL_DIR "${OTB_INSTALL_DIR}") - set(DEPENDENCIES_INSTALL_DIR "${MXE_MXEROOT}/usr/${MXE_ARCH}-w64-mingw32.shared") - set(QT_PLUGINS_DIR "${DEPENDENCIES_INSTALL_DIR}/qt/plugins") - set(QT_TRANSLATIONS_DIR "${DEPENDENCIES_INSTALL_DIR}/qt/translations") -else() #unixes - set(OTB_BINARY_DIR "${SUPERBUILD_BINARY_DIR}/OTB/build") - set(OTB_INSTALL_DIR "${SUPERBUILD_INSTALL_DIR}") - set(DEPENDENCIES_INSTALL_DIR "${SUPERBUILD_INSTALL_DIR}") - set(QT_PLUGINS_DIR "${SUPERBUILD_INSTALL_DIR}/plugins") - set(QT_TRANSLATIONS_DIR "${SUPERBUILD_INSTALL_DIR}/translations") -endif() - -macro_setup_cmake_project(OTB) -if(GENERATE_XDK) - macro_setup_cmake_project(XDK) -endif() +# cpack has a built-in target called 'package'. In our case we create two standalone installers with +# and uses a custom target named packages. + +# stop generation of msvc packages for windows. 04-apr-2016. point OTB. + +##### check if standalone project ###### +set(OUT_OF_SOURCE_BUILD FALSE) +if(NOT PROJECT_NAME) + cmake_minimum_required(VERSION 2.6) + include(CMakeParseArguments) + project(OTBPackaging) + + option(GENERATE_PACKAGE "Generate OTB package" ON) + option(GENERATE_XDK "Generate XDK for OTB development" OFF) + + set(OUT_OF_SOURCE_BUILD TRUE) + + if(BUILD_TESTING) + include(CTest) + endif() + + if(NOT PACKAGE_OTB_SRC_DIR) + get_filename_component(PACKAGE_OTB_SRC_DIR ${OTBPackaging_SOURCE_DIR} PATH) + get_filename_component(PACKAGE_OTB_SRC_DIR ${PACKAGE_OTB_SRC_DIR} PATH) + endif() + + option(OTB_WRAP_PYTHON "enable python wrapping" ON) + if(OTB_WRAP_PYTHON AND NOT PYTHON_EXECUTABLE) + find_package ( PythonInterp REQUIRED ) + mark_as_advanced(PYTHON_INCLUDE_DIR) + mark_as_advanced(PYTHON_LIBRARY) + endif() + + if(OTB_MINGW) + set(OTB_BINARY_DIR "" CACHE PATH "OTB binary directory") + set(OTB_INSTALL_DIR "" CACHE PATH "OTB install directory") + else() + set(SUPERBUILD_BINARY_DIR "" CACHE PATH "path to superbuild binary directory") + set(SUPERBUILD_INSTALL_DIR "" CACHE PATH "path to superbuild install directory") + set(DOWNLOAD_LOCATION "" CACHE PATH "path to superbuild download archives") + endif() + +else() #if(NOT PROJECT_NAME) + + # SUPERBUILD_BINARY_DIR is only set in Packaging/CMakeLists.txt and not available + # in the parent scope like others. So we need to set it as CMAKE_BINARY_DIR + # if doing packages from source tree. + set( SUPERBUILD_BINARY_DIR ${CMAKE_BINARY_DIR} ) + set( SUPERBUILD_INSTALL_DIR ${SB_INSTALL_PREFIX} ) + set( OTB_INSTALL_DIR ${CMAKE_INSTALL_PREFIX} ) + + if(NOT PACKAGE_OTB_SRC_DIR) + get_filename_component(PACKAGE_OTB_SRC_DIR ${OTB-SuperBuild_SOURCE_DIR} PATH) + endif() + +endif() + +if(NOT GENERATE_PACKAGE AND NOT GENERATE_XDK) + #well. we don't have any businees here. Let's move on.. + return() +endif() + +set(LINUX FALSE) +set(OTB_MINGW FALSE) +if(WIN32 AND NOT MSVC) + set(OTB_MINGW TRUE) +else() + if( "${CMAKE_SYSTEM_NAME}" MATCHES "Linux") + set(LINUX TRUE) + endif() +endif() + +set(SUPERBUILD_SOURCE_DIR ${PACKAGE_OTB_SRC_DIR}/SuperBuild) + +include(${SUPERBUILD_SOURCE_DIR}/CMake/SuperBuild_Macro.cmake) +include(${PACKAGE_OTB_SRC_DIR}/CMake/OTBCheckTargetSystemArch.cmake) +include(${CMAKE_CURRENT_SOURCE_DIR}/CreateCMakeProjects.cmake) + +if(WIN32) + set(ZIP_EXE_NAMES 7z 7za) + find_program(ZIP_EXECUTABLE NAMES ${ZIP_EXE_NAMES}) + if(NOT ZIP_EXECUTABLE) + message(FATAL_ERROR "Cannot find 7z executable. searched names ${ZIP_EXE_NAMES}. Please add it to your path") + endif() +endif() + +if(OTB_MINGW) + set(required_vars + OTB_BINARY_DIR + OTB_INSTALL_DIR + MXE_TARGET_DIR + ) +else() + set(required_vars + SUPERBUILD_BINARY_DIR + SUPERBUILD_INSTALL_DIR + SUPERBUILD_SOURCE_DIR + ) +endif() + +foreach(req + ${required_vars} + PACKAGE_OTB_SRC_DIR + OTB_TARGET_SYSTEM_ARCH + OTB_TARGET_SYSTEM_ARCH_IS_X64 + ) + if(NOT DEFINED ${req} OR "${${req}}" STREQUAL "") + message(FATAL_ERROR "you must set ${req}") + endif() + set(vars "${vars} ${req}=[${${req}}]\n") +endforeach(req) + +message("\n${vars}\n") + +set(PKG_OTB_DEBUG OFF) + +set(EXTRA_CACHE_CONFIG) + +set(CMAKE_INSTALL_PREFIX "${SUPERBUILD_INSTALL_DIR}") + +set(PACKAGE_LONG_NAME OrfeoToolBox) + +# Make up part of output package file +set(PACKAGE_NAME OTB) +if(APPLE) + set(PACKAGE_PLATFORM_NAME "Darwin") +elseif(WIN32) + set(PACKAGE_PLATFORM_NAME "win") +elseif(LINUX) + set(PACKAGE_PLATFORM_NAME "Linux") +endif() + +set(PACKAGE_ARCH "32") +if(OTB_TARGET_SYSTEM_ARCH_IS_X64) +set(PACKAGE_ARCH "64") +endif() + +if(OTB_MINGW) + get_filename_component(MXE_MXEROOT ${MXE_TARGET_DIR} PATH) + get_filename_component(MXE_MXEROOT ${MXE_MXEROOT} PATH) + set(EXTRA_CACHE_CONFIG + "set(CMAKE_CROSSCOMPILING TRUE) + set(WIN32 TRUE) + set(MINGW TRUE) + set(MXE_MXEROOT \"${MXE_MXEROOT}\")" + ) + set(CMAKE_INSTALL_PREFIX "${OTB_INSTALL_DIR}") +endif() + +# get itk version from External_itk.cmake if not on mingw +# because mxe has different version +if(NOT OTB_MINGW) + get_version( + INPUT_FILE "${SUPERBUILD_SOURCE_DIR}/CMake/External_itk.cmake" + MATCH_STRINGS "SB_ITK_VERSION_MAJOR" "SB_ITK_VERSION_MINOR" + PREFIX PKG + ) +endif() + +set(PKG_ITK_SB_VERSION "${PKG_SB_ITK_VERSION_MAJOR}.${PKG_SB_ITK_VERSION_MINOR}") + +#get version of OTB from source_dir/CMakeLists.txt +get_version( + INPUT_FILE "${PACKAGE_OTB_SRC_DIR}/CMakeLists.txt" + MATCH_STRINGS "OTB_VERSION_MAJOR" "OTB_VERSION_MINOR" "OTB_VERSION_PATCH" + PREFIX PKG + ) + +set(PKG_OTB_VERSION_STRING + ${PKG_OTB_VERSION_MAJOR}.${PKG_OTB_VERSION_MINOR}.${PKG_OTB_VERSION_PATCH}) + +if(OTB_MINGW) + set(OTB_BINARY_DIR "${OTB_BINARY_DIR}") + set(OTB_INSTALL_DIR "${OTB_INSTALL_DIR}") + set(DEPENDENCIES_INSTALL_DIR "${MXE_MXEROOT}/usr/${OTB_TARGET_SYSTEM_ARCH}-w64-mingw32.shared") + set(QT_PLUGINS_DIR "${DEPENDENCIES_INSTALL_DIR}/qt/plugins") + set(QT_TRANSLATIONS_DIR "${DEPENDENCIES_INSTALL_DIR}/qt/translations") +else() #unixes + set(OTB_BINARY_DIR "${SUPERBUILD_BINARY_DIR}/OTB/build") + set(OTB_INSTALL_DIR "${SUPERBUILD_INSTALL_DIR}") + set(DEPENDENCIES_INSTALL_DIR "${SUPERBUILD_INSTALL_DIR}") + set(QT_PLUGINS_DIR "${SUPERBUILD_INSTALL_DIR}/plugins") + set(QT_TRANSLATIONS_DIR "${SUPERBUILD_INSTALL_DIR}/translations") +endif() + +macro_setup_cmake_project(OTB) +if(GENERATE_XDK) + macro_setup_cmake_project(XDK) +endif() diff --git a/SuperBuild/Packaging/PMacros.cmake b/SuperBuild/Packaging/CreateCMakeProjects.cmake similarity index 71% rename from SuperBuild/Packaging/PMacros.cmake rename to SuperBuild/Packaging/CreateCMakeProjects.cmake index f2fae4528e..f68e0356a6 100644 --- a/SuperBuild/Packaging/PMacros.cmake +++ b/SuperBuild/Packaging/CreateCMakeProjects.cmake @@ -2,6 +2,8 @@ macro(macro_setup_cmake_project pkg) message( "-- Configuring ${pkg} package") + set(PATCHELF_PROGRAM) + set(MAKESELF_SCRIPT) include(${SUPERBUILD_SOURCE_DIR}/CMake/External_pkgtools.cmake) #reset it again in macro(macro_create_targets_for_package pkg) @@ -9,18 +11,18 @@ macro(macro_setup_cmake_project pkg) set(PACKAGE_PROJECT_DIR ${CMAKE_BINARY_DIR}/PACKAGE-${pkg}) execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory "${PACKAGE_PROJECT_DIR}/build") - if("${pkg}" STREQUAL "XDK") - set(archive_name ${PACKAGE_NAME}-${PKG_OTB_VERSION_STRING}-xdk-${PACKAGE_PLATFORM_NAME}${PACKAGE_ARCH}) - else() - set(archive_name ${PACKAGE_NAME}-${PKG_OTB_VERSION_STRING}-${PACKAGE_PLATFORM_NAME}${PACKAGE_ARCH}) - endif() - - if("${pkg}" STREQUAL "XDK") + if("${pkg}" STREQUAL "XDK") set(PKG_GENERATE_XDK ON) else() set(PKG_GENERATE_XDK OFF) endif() + + if(PKG_GENERATE_XDK) + set(archive_name ${PACKAGE_NAME}-${PKG_OTB_VERSION_STRING}-xdk-${PACKAGE_PLATFORM_NAME}${PACKAGE_ARCH}) + else() + set(archive_name ${PACKAGE_NAME}-${PKG_OTB_VERSION_STRING}-${PACKAGE_PLATFORM_NAME}${PACKAGE_ARCH}) + endif() #set archive name inside loop file(WRITE "${PACKAGE_PROJECT_DIR}/src/CMakeLists.txt" @@ -42,42 +44,45 @@ macro(macro_setup_cmake_project pkg) set(PKG_OTB_VERSION_PATCH \"${PKG_OTB_VERSION_PATCH}\") set(PKG_OTB_VERSION_STRING \"${PKG_OTB_VERSION_STRING}\") set(PYTHON_EXECUTABLE \"${PYTHON_EXECUTABLE}\") + set(PATCHELF_PROGRAM \"${PATCHELF_PROGRAM}\") set(PKG_GENERATE_XDK ${PKG_GENERATE_XDK}) - set(PATCHELF_PROGRAM ${PATCHELF_PROGRAM}) set(OTB_TARGET_SYSTEM_ARCH ${OTB_TARGET_SYSTEM_ARCH}) set(OTB_TARGET_SYSTEM_ARCH_IS_X64 ${OTB_TARGET_SYSTEM_ARCH_IS_X64}) set(OTB_WRAP_PYTHON ${OTB_WRAP_PYTHON}) + set(PKG_OTB_DEBUG ${PKG_OTB_DEBUG}) ${EXTRA_CACHE_CONFIG} + include(${SUPERBUILD_SOURCE_DIR}/Packaging/PackageMacros.cmake) include(${SUPERBUILD_SOURCE_DIR}/Packaging/PackageHelper.cmake) + include(${SUPERBUILD_SOURCE_DIR}/Packaging/InstallSupportFiles.cmake) + include(${SUPERBUILD_SOURCE_DIR}/Packaging/PackageGlobals.cmake) macro_super_package(STAGE_DIR \"${archive_name}\")" ) - if(UNIX) - if(APPLE) - set(README_FILE ${PACKAGE_OTB_SRC_DIR}/Documentation/Cookbook/rst/Installation_Macx.txt) - else() #not osx - set(README_FILE ${PACKAGE_OTB_SRC_DIR}/Documentation/Cookbook/rst/Installation_Linux.txt) - endif() #if(APPLE) - else() #windows - set(README_FILE ${PACKAGE_OTB_SRC_DIR}/Documentation/Cookbook/rst/Installation_Windows.txt) - endif() #if(UNIX) - - configure_file( - "${README_FILE}" - ${PACKAGE_PROJECT_DIR}/src/README - ) +if(APPLE) + set(README_FILE ${PACKAGE_OTB_SRC_DIR}/Documentation/Cookbook/rst/Installation_Macx.txt) +elseif(LINUX) #not osx + set(README_FILE ${PACKAGE_OTB_SRC_DIR}/Documentation/Cookbook/rst/Installation_Linux.txt) +elseif(WIN32) #windows + set(README_FILE ${PACKAGE_OTB_SRC_DIR}/Documentation/Cookbook/rst/Installation_Windows.txt) +endif() + +configure_file( + "${README_FILE}" + ${PACKAGE_PROJECT_DIR}/src/README + ) - macro_create_targets_for_package(${pkg}) +macro_create_targets_for_package(${pkg}) endmacro() macro(macro_create_targets_for_package pkg) if(WIN32 AND NOT MSVC) - add_custom_target(PACKAGE-${pkg}-check - COMMAND ${CMAKE_COMMAND} --build "." --target install - WORKING_DIRECTORY "${OTB_BINARY_DIR}" - ) + + add_custom_target(PACKAGE-${pkg}-check + COMMAND ${CMAKE_COMMAND} --build "." --target install + WORKING_DIRECTORY "${OTB_BINARY_DIR}" + ) else() #Using SuperBuild #For out of source build, #we assume the otb is built correctly with superbuild @@ -94,32 +99,32 @@ macro(macro_create_targets_for_package pkg) endif() add_dependencies(PACKAGE-${pkg}-check PACKAGE-TOOLS) +# add_dependencies(PACKAGE-${pkg}-check PACKAGE-${pkg}-clean) - if("${pkg}" STREQUAL "XDK") - set(PACKAGE_PLATFORM_NAME_ "xdk-${PACKAGE_PLATFORM_NAME}") - set(PKG_GENERATE_XDK ON) - else() - set(PACKAGE_PLATFORM_NAME_ "${PACKAGE_PLATFORM_NAME}") - set(PKG_GENERATE_XDK OFF) - endif() + if(NOT archive_name) + message(FATAL_ERROR "archive_name not set. Cannot continue") + endif() + set(PACKAGE_PROJECT_DIR ${CMAKE_BINARY_DIR}/PACKAGE-${pkg}) - if("${pkg}" STREQUAL "XDK") - set(archive_name ${PACKAGE_NAME}-${PKG_OTB_VERSION_STRING}-xdk-${PACKAGE_PLATFORM_NAME}${PACKAGE_ARCH}) + + if(WIN32) + set(PACKAGE_OUTPUT_FILE "${CMAKE_CURRENT_BINARY_DIR}/${archive_name}.zip") else() - set(archive_name ${PACKAGE_NAME}-${PKG_OTB_VERSION_STRING}-${PACKAGE_PLATFORM_NAME}${PACKAGE_ARCH}) + set(PACKAGE_OUTPUT_FILE "${CMAKE_CURRENT_BINARY_DIR}/${archive_name}.run") endif() - + #configure add_custom_target(PACKAGE-${pkg}-configure - COMMAND ${CMAKE_COMMAND} -E make_directory "${PACKAGE_PROJECT_DIR}/build" + COMMAND ${CMAKE_COMMAND} -E remove "${PACKAGE_OUTPUT_FILE}" + COMMAND ${CMAKE_COMMAND} -E make_directory "${PACKAGE_PROJECT_DIR}/build" WORKING_DIRECTORY "${PACKAGE_PROJECT_DIR}" COMMAND ${CMAKE_COMMAND} "-G${CMAKE_GENERATOR}" "${PACKAGE_PROJECT_DIR}/src" WORKING_DIRECTORY "${PACKAGE_PROJECT_DIR}/build" DEPENDS PACKAGE-${pkg}-check ) - +# COMMAND ${CMAKE_COMMAND} -E remove_directory "${PACKAGE_PROJECT_DIR}" #build add_custom_target(PACKAGE-${pkg}-build COMMAND ${CMAKE_COMMAND} @@ -130,13 +135,15 @@ macro(macro_create_targets_for_package pkg) #create package # creation of package is different from windows and unix like + # WORKING_DIRECTORY must be CMAKE_INSTALL_PREFIX and not + # CMAKE_CURRENT_BINARY_DIR like in unix if(WIN32) add_custom_target(PACKAGE-${pkg} COMMAND ${ZIP_EXECUTABLE} "a" "-r" "-y" - "${CMAKE_BINARY_DIR}/${archive_name}.zip" "${archive_name}/*" + "${PACKAGE_OUTPUT_FILE}" "${archive_name}/*" WORKING_DIRECTORY "${CMAKE_INSTALL_PREFIX}" DEPENDS PACKAGE-${pkg}-build - COMMENT "Creating ${CMAKE_BINARY_DIR}/${archive_name}.zip" + COMMENT "Creating ${PACKAGE_OUTPUT_FILE}" ) else() add_custom_target(PACKAGE-${pkg} @@ -150,20 +157,17 @@ macro(macro_create_targets_for_package pkg) "./pkgsetup" WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" DEPENDS PACKAGE-${pkg}-build - COMMENT "Creating ${CMAKE_CURRENT_BINARY_DIR}/${archive_name}.run" + COMMENT "Creating ${PACKAGE_OUTPUT_FILE}" ) endif() - set(PACKAGE_EXTENSION .run) - if(WIN32) - set(PACKAGE_EXTENSION .zip) - endif() + #clean add_custom_target(PACKAGE-${pkg}-clean COMMAND ${CMAKE_COMMAND} -E remove_directory "${CMAKE_BINARY_DIR}/PACKAGE-${pkg}" COMMAND ${CMAKE_COMMAND} -E remove_directory "${CMAKE_BINARY_DIR}/PACKAGE-TOOLS" - COMMAND ${CMAKE_COMMAND} -E remove "${CMAKE_BINARY_DIR}/${archive_name}${PACKAGE_EXTENSION}" + COMMAND ${CMAKE_COMMAND} -E remove "${PACKAGE_OUTPUT_FILE}" COMMAND ${CMAKE_COMMAND} "${CMAKE_BINARY_DIR}" WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" ) diff --git a/SuperBuild/Packaging/Files/linux_pkgsetup.in b/SuperBuild/Packaging/Files/linux_pkgsetup.in index 4c96ff7f2c..0204d79256 100644 --- a/SuperBuild/Packaging/Files/linux_pkgsetup.in +++ b/SuperBuild/Packaging/Files/linux_pkgsetup.in @@ -8,18 +8,20 @@ cd "$DIRNAME_0" OUT_DIR=$(pwd) -PATCH_ELF_EXE="$OUT_DIR/tools/patchelf" +PATCH_ELF_EXE="$OUT_DIR/patchelf" # No no interference with LD_LIBRARY_PATH LD_LIBRARY_PATH= echo "Configuring..." -BINARY_FILES="@VAR_IN_PKGSETUP_CONFIGURE@" +#BINARY_FILES="@VAR_IN_PKGSETUP_CONFIGURE@" +BINARY_FILES=$(find $OUT_DIR/lib $OUT_DIR/lib/otb/applications $OUT_DIR/bin -maxdepth 1 -type f -exec file {} \; | grep -i elf|cut -f1 -d':') + # run patchelf for bin_file in $BINARY_FILES; do - #echo "adding rpath to $OUT_DIR/$bin_file" - if [ -f "$OUT_DIR/$bin_file" ]; then - "$PATCH_ELF_EXE" "--set-rpath" "$OUT_DIR/lib" "$OUT_DIR/$bin_file" + #echo "adding rpath to $bin_file" + if [ -f "$bin_file" ]; then + "$PATCH_ELF_EXE" "--set-rpath" "$OUT_DIR/lib" "$bin_file" fi done diff --git a/SuperBuild/Packaging/Files/macx_pkgsetup.in b/SuperBuild/Packaging/Files/macx_pkgsetup.in index e84321c717..8c35f329a1 100755 --- a/SuperBuild/Packaging/Files/macx_pkgsetup.in +++ b/SuperBuild/Packaging/Files/macx_pkgsetup.in @@ -21,15 +21,27 @@ DYLD_LIBRARY_PATH= DYLD_FALLBACK_LIBRARY_PATH= echo "Configuring..." -BINARY_FILES="@VAR_IN_PKGSETUP_CONFIGURE@" -# #add rpath to LC_RPATH using install_name_tool -for bin_file in $BINARY_FILES; do - #echo "adding rpath to $OUT_DIR/$bin_file" - if [ -f "$OUT_DIR/$bin_file" ]; then - $INSTALL_NAME_TOOL "-add_rpath" "$OUT_DIR/lib" "$OUT_DIR/$bin_file" - fi +# #BINARY_FILES="@VAR_IN_PKGSETUP_CONFIGURE@" +# # #add rpath to LC_RPATH using install_name_tool +# for bin_file in $BINARY_FILES; do +# #echo "adding rpath to $OUT_DIR/$bin_file" +# if [ -f "$OUT_DIR/$bin_file" ]; then +# $INSTALL_NAME_TOOL "-add_rpath" "$OUT_DIR/lib" "$OUT_DIR/$bin_file" +# fi +# done + +LIBRARY_FILES=$(find "$OUT_DIR/lib/otb/applications" "$OUT_DIR/lib" -maxdepth 1 -type f) +EXE_FILES=$(find "$OUT_DIR/bin" -type f -exec file {} \; | grep -i "Mach-O*.*executable"|cut -d ':' -f1) +# run patchelf +for lib_file in $LIBRARY_FILES $EXE_FILES; do + #echo "adding rpath to $OUT_DIR/$lib_file" + if [ -f "$lib_file" ]; then + #echo "$INSTALL_NAME_TOOL -add_rpath $OUT_DIR/lib $lib_file" + $INSTALL_NAME_TOOL "-add_rpath" "$OUT_DIR/lib" "$lib_file" + fi done + LONG_VERSION_STRING=@Monteverdi_VERSION_MAJOR@.@Monteverdi_VERSION_MINOR@.@Monteverdi_VERSION_PATCH@ SHORT_VERSION_STRING=@Monteverdi_VERSION_MAJOR@.@Monteverdi_VERSION_MINOR@ diff --git a/SuperBuild/Packaging/InstallSupportFiles.cmake b/SuperBuild/Packaging/InstallSupportFiles.cmake new file mode 100644 index 0000000000..1ae083369b --- /dev/null +++ b/SuperBuild/Packaging/InstallSupportFiles.cmake @@ -0,0 +1,376 @@ +# Get the translation files coming with Qt, and install them in the bundle +# They are loaded by Monteverdi. +function(get_qt_translation_files RESULT) + # These files are the "qt_<localename>.qm" files + # They are located in QT_TRANSLATIONS_DIR, which comes from FindQt4 + file(GLOB translation_files ${QT_TRANSLATIONS_DIR}/qt_*) + + # We need to remove the "qt_help_<localename>.qm" files from this list + foreach(translation_item ${translation_files}) + if(${translation_item} MATCHES "qt_help") + list(REMOVE_ITEM translation_files ${translation_item}) + endif() + endforeach() + + set(${RESULT} ${translation_files} PARENT_SCOPE) + endfunction() + + +function(func_install_xdk_files) + + #The list of REQ_SHARE_DIR is made up from <mxe-target-dir>/share/ + #It may vary in future. I prefer not to glob on the share dir and + #end up distributing man, info etc.. which ar irrelvant for windows + foreach(REQ_SHARE_DIR + aclocal + Armadillo + applications + cmake + dbus-1 + fontconfig + libgta + locale + xml + applications + cmake + icons + OpenCV + pixmaps + pkgconfig + ) + if(EXISTS "${DEPENDENCIES_INSTALL_DIR}/share/${REQ_SHARE_DIR}") + func_install_without_message("${DEPENDENCIES_INSTALL_DIR}/share/${REQ_SHARE_DIR}" "share") + endif() + endforeach() + + file(GLOB LIB_CMAKE_DIRS "${DEPENDENCIES_INSTALL_DIR}/lib/cmake/*") + foreach(LIB_CMAKE_DIR ${LIB_CMAKE_DIRS}) + get_filename_component(LIB_CMAKE_DIR_name_we ${LIB_CMAKE_DIR} NAME_WE) + if(NOT "${LIB_CMAKE_DIR_name_we}" MATCHES "OTB") + func_install_without_message("${LIB_CMAKE_DIR}" "lib/cmake") + endif() + endforeach() + + set(QT_REQ_DIRS) + if(WIN32) + #only affects windows due to regex on dll + if(MSVC) + file(GLOB LIB_FILES "${DEPENDENCIES_INSTALL_DIR}/lib/*.lib") + else() + file(GLOB LIB_FILES "${DEPENDENCIES_INSTALL_DIR}/lib/*dll.*") + endif() + #func_lisp(LIB_FILES ) + + foreach(LIB_FILE ${LIB_FILES}) + pkg_install_rule(${LIB_FILE}) + endforeach() + + ##install(FILES ${LIB_FILES} DESTINATION ${PKG_STAGE_DIR}/lib ) + + file(GLOB ITK_EXTRA_DLL_FILES_1 "${DEPENDENCIES_INSTALL_DIR}/bin/libITK*.dll") + install(FILES ${ITK_EXTRA_DLL_FILES_1} DESTINATION ${PKG_STAGE_DIR}/bin) + + file(GLOB ITK_EXTRA_DLL_FILES_2 "${DEPENDENCIES_INSTALL_DIR}/bin/libitk*.dll") + install(FILES ${ITK_EXTRA_DLL_FILES_2} DESTINATION ${PKG_STAGE_DIR}/bin) + + file(GLOB OPENCV_EXTRA_DLL_FILES "${DEPENDENCIES_INSTALL_DIR}/bin/libopencv*.dll") + install(FILES ${OPENCV_EXTRA_DLL_FILES} DESTINATION ${PKG_STAGE_DIR}/bin) + + file(GLOB OPENCV_EXTRA_A_FILES "${DEPENDENCIES_INSTALL_DIR}/lib/libopencv*.a") + install(FILES ${OPENCV_EXTRA_A_FILES} DESTINATION ${PKG_STAGE_DIR}/lib) + + #mxe installs qt in a separate directory under install prefix. So.. + set(QT_INSTALL_DIR "${DEPENDENCIES_INSTALL_DIR}/qt") + + #qt/bin is also a special case for mxe. + file(GLOB QT_EXTRA_DLL_FILES "${DEPENDENCIES_INSTALL_DIR}/qt/bin/*.dll") + install(FILES ${QT_EXTRA_DLL_FILES} DESTINATION ${PKG_STAGE_DIR}/bin) + + #list(APPEND QT_REQ_DIRS lib) + list(APPEND QT_REQ_DIRS include) + list(APPEND QT_REQ_DIRS imports) + + else() + set( + QT_INSTALL_DIR "${DEPENDENCIES_INSTALL_DIR}") + + endif(WIN32) + + if(NOT QT_EXECUTABLES) + message(FATAL_ERROR "QT_EXECUTABLES not set") + endif() + + list(APPEND QT_REQ_DIRS mkspecs) + list(APPEND QT_REQ_DIRS plugins) + list(APPEND QT_REQ_DIRS translations) + foreach(QT_REQ_DIR ${QT_REQ_DIRS} ) + if(EXISTS "${QT_INSTALL_DIR}/${QT_REQ_DIR}") + func_install_without_message("${QT_INSTALL_DIR}/${QT_REQ_DIR}" "") + endif() + endforeach() + + # #install ${DEPENDENCIES_INSTALL_DIR}/include directory. Attention to OTB includes + file(GLOB ALL_IN_INCLUDE_DIR "${DEPENDENCIES_INSTALL_DIR}/include/*") + foreach(INCLUDE_DIR_ITEM ${ALL_IN_INCLUDE_DIR}) + get_filename_component(INCLUDE_DIR_ITEM_name ${INCLUDE_DIR_ITEM} NAME) + get_filename_component(INCLUDE_DIR_ITEM_name_we ${INCLUDE_DIR_ITEM} NAME_WE) + if(NOT "${INCLUDE_DIR_ITEM_name_we}" MATCHES "OTB|otb") + if( IS_DIRECTORY ${INCLUDE_DIR_ITEM}) + install(CODE + "message(STATUS \"Installing: ${CMAKE_INSTALL_PREFIX}/${PKG_STAGE_DIR}/include/${INCLUDE_DIR_ITEM_name}/\")" ) + install( + DIRECTORY "${INCLUDE_DIR_ITEM}" + DESTINATION "${PKG_STAGE_DIR}/include/" + MESSAGE_NEVER + ) + else() + install( + FILES "${INCLUDE_DIR_ITEM}" + DESTINATION "${PKG_STAGE_DIR}/include/" + ) + endif() #if( IS_DIRECTORY + endif() #if (NOT + endforeach() + +endfunction() #func_install_xdk_files + +function(func_install_support_files) + + #a convenient cmake var for storing <prefix>/bin + set(PKG_STAGE_BIN_DIR "${PKG_STAGE_DIR}/bin") + + #<prefix>/share for gdal data files + set(PKG_SHARE_DEST_DIR ${PKG_STAGE_DIR}/share) + + set(PKG_SHARE_SOURCE_DIR ${DEPENDENCIES_INSTALL_DIR}/share) + + set(GDAL_DATA ${PKG_SHARE_SOURCE_DIR}/gdal) + #MSVC install gdal-data in in a different directory. So we don't spoil it + if(MSVC) + set(GDAL_DATA ${DEPENDENCIES_INSTALL_DIR}/data) + endif() + + # Just check if required variables are defined. + foreach(req + DEPENDENCIES_INSTALL_DIR + PKG_STAGE_DIR + PACKAGE_SUPPORT_FILES_DIR + OTB_INSTALL_DIR + ) + if(NOT DEFINED ${req}) + message(FATAL_ERROR "you must set ${req} before calling this method") + endif() + set(vars "${vars} ${req}=[${${req}}]\n") + endforeach(req) + + # one for debugging.. + # install(CODE "message(\"CMake/PackageHelper.cmake:install_supoport_files(${outdir})\n${vars}\n\")") + if(NOT PKG_GENERATE_XDK) + func_install_otb_support_files() + + #check if monteverdi executable is built? + if(EXISTS "${OTB_INSTALL_DIR}/bin/monteverdi${EXE_EXT}") + func_install_monteverdi_support_files() + endif() + + endif() #NOT PKG_GENERATE_XDK + + ####################### install GDAL data ############################ + if(NOT EXISTS "${GDAL_DATA}/epsg.wkt") + message(FATAL_ERROR + "Cannot generate package without GDAL_DATA : ${GDAL_DATA} ${DEPENDENCIES_INSTALL_DIR}") + endif() + + install(DIRECTORY ${GDAL_DATA} DESTINATION ${PKG_SHARE_DEST_DIR}) + + ####################### install GeoTIFF data ######################## + install(DIRECTORY ${PKG_SHARE_SOURCE_DIR}/epsg_csv DESTINATION ${PKG_SHARE_DEST_DIR}) + + ####################### install OSSIM data ########################## + install(DIRECTORY ${PKG_SHARE_SOURCE_DIR}/ossim DESTINATION ${PKG_SHARE_DEST_DIR}) + + ####################### install proj share ########################## + if(EXISTS ${PKG_SHARE_SOURCE_DIR}/proj) + install(DIRECTORY ${PKG_SHARE_SOURCE_DIR}/proj DESTINATION ${PKG_SHARE_DEST_DIR}) + endif() + + set(PKG_VERSION_FILE + "${OTB_INSTALL_DIR}/share/doc/${PKG_OTB_VERSION_MAJOR}.${PKG_OTB_VERSION_MINOR}/VERSION") + + ####################### Install copyrights ########################## + if(NOT MINGW) + #install license for windows package + install(DIRECTORY ${PKG_SHARE_SOURCE_DIR}/copyright DESTINATION ${PKG_SHARE_DEST_DIR}) + install(FILES ${PKG_SHARE_SOURCE_DIR}/copyright/LICENSE DESTINATION ${PKG_STAGE_DIR}) + endif() + + ####################### Install VERSION ########################## + if(EXISTS ${PKG_VERSION_FILE} ) + install(FILES ${PKG_VERSION_FILE} DESTINATION ${PKG_STAGE_DIR}) + endif() + +endfunction() + +function(func_install_otb_support_files) + foreach(req + PKG_STAGE_DIR + OTB_INSTALL_DIR + DEPENDENCIES_INSTALL_DIR + ) + if(NOT DEFINED ${req}) + message(FATAL_ERROR "you must set ${req} before calling this method") + endif() + set(vars "${vars} ${req}=[${${req}}]\n") + endforeach(req) + + #a convenient cmake var for storing <prefix>/bin + set(PKG_STAGE_BIN_DIR "${PKG_STAGE_DIR}/bin") + + #<prefix>/share for gdal data files + set(PKG_SHARE_DEST_DIR ${PKG_STAGE_DIR}/share) + + set(PKG_SHARE_SOURCE_DIR ${DEPENDENCIES_INSTALL_DIR}/share) + + #For Unixes we make them in the *pkgsetup.in + ##################### install environment source ########################## + if(WIN32) + foreach(ENV_SOURCE_FILE + "${PACKAGE_SUPPORT_FILES_DIR}/otbenv.cmd" + "${PACKAGE_SUPPORT_FILES_DIR}/otbenv.profile") + if(EXISTS ${ENV_SOURCE_FILE}) + install(FILES ${ENV_SOURCE_FILE} DESTINATION ${PKG_STAGE_DIR}) + endif() + endforeach() + + #we need startup files for mapla monteverdi in the root directory + #For Unixes, we make them inside pkgsetup script! + foreach(exe_file mapla monteverdi) + install( + PROGRAMS ${PACKAGE_SUPPORT_FILES_DIR}/${exe_file}.bat + DESTINATION "${PKG_STAGE_DIR}" + ) + endforeach() + endif() + + ####################### install cli and gui scripts ########################### + file(GLOB PKG_APP_SCRIPTS + ${OTB_INSTALL_DIR}/bin/otbcli* + ${OTB_INSTALL_DIR}/bin/otbgui*) # + + list(LENGTH PKG_APP_SCRIPTS PKG_APP_SCRIPTS_LENGTH) + if (PKG_APP_SCRIPTS_LENGTH LESS 1) + message(WARNING "PKG_APP_SCRIPTS is empty: ${PKG_APP_SCRIPTS}") + endif() + + ##################### install cli and gui scripts ####################### + install(PROGRAMS ${PKG_APP_SCRIPTS} DESTINATION ${PKG_STAGE_BIN_DIR}) + + +endfunction() + +function(func_install_monteverdi_support_files) + + #name/ext of qt's sqlite plugin. Varies with platform/OS + if(WIN32) + set(PKG_QTSQLITE_FILENAME "qsqlite4.dll") + elseif(APPLE) + set(PKG_QTSQLITE_FILENAME "libqsqlite.dylib") + elseif("${CMAKE_SYSTEM_NAME}" MATCHES "Linux") + set(PKG_QTSQLITE_FILENAME "libqsqlite.so") + else() + message(FATAL_ERROR "func_install_monteverdi_support_files: Unknown OS/Platform") + endif() + + #root folder where qt plugins are installed + set(PKG_QTPLUGINS_DIR "${PKG_STAGE_DIR}/lib/qt4/plugins") + + #qt4's distributes some translation of common message string used in Qt. + #This are provided with any qt installation. We reuse them in otb package + #so as not to reinvent the wheels. + set(PKG_QT_TRANSLATIONS_DIR "${PKG_STAGE_DIR}/lib/qt4/translations") + + #<prefix>/share for otb i18n directory. This is different from qt's i18N directory + #which is <prefix>/share/qt4/translations. + #set(PKG_xxOTB_Ixxx18N_DIR "${PKG_STAGE_DIR}/${PKG_OTB_INSTALL_DATA_DIR}/i18n") + # we find this value by parsing ConfigureMonteverdi.h + set(ConfigureMonteverdi_H "${OTB_BINARY_DIR}/Modules/Visualization/MonteverdiCore/ConfigureMonteverdi.h") + if(NOT EXISTS "${ConfigureMonteverdi_H}") + message(FATAL_ERROR "${ConfigureMonteverdi_H} does not exists. Cannot continue") + endif() + + file( + STRINGS "${ConfigureMonteverdi_H}" + ConfigureMonteverdi_H_CONTENTS + REGEX "^#define.Monteverdi_INSTALL_DATA_DIR") + + string(REGEX REPLACE + "^#define.Monteverdi_INSTALL_DATA_DIR" "" + ConfigureMonteverdi_H_CONTENTS + ${ConfigureMonteverdi_H_CONTENTS} ) + + if(NOT ConfigureMonteverdi_H_CONTENTS) + message(FATAL_ERROR "Parse error in ${ConfigureMonteverdi_H}. Cannot continue") + endif() + + string( + REGEX REPLACE "\"" "" + PKG_OTB_INSTALL_DATA_DIR + "${ConfigureMonteverdi_H_CONTENTS}") + + if(NOT PKG_OTB_INSTALL_DATA_DIR) + message(FATAL_ERROR "parse error in ${ConfigureMonteverdi_H_CONTENTS}. Cannot continue") + endif() + + string(STRIP "${PKG_OTB_INSTALL_DATA_DIR}" PKG_OTB_INSTALL_DATA_DIR) + + set(PKG_OTB_TRANSLATIONS_DIRNAME "${PKG_OTB_INSTALL_DATA_DIR}/i18n") + + # Just check if required variables are defined. + foreach(req + PACKAGE_OTB_SRC_DIR + PACKAGE_SUPPORT_FILES_DIR + QT_PLUGINS_DIR + PKG_STAGE_BIN_DIR + PKG_QTSQLITE_FILENAME + PKG_QTPLUGINS_DIR + PKG_QT_TRANSLATIONS_DIR + PKG_OTB_TRANSLATIONS_DIRNAME + ) + if(NOT DEFINED ${req} OR "${${req}}" STREQUAL "") + message(FATAL_ERROR "you must set ${req} before calling this method") + endif() + set(vars "${vars} ${req}=[${${req}}]\n") + endforeach(req) + + #install icon file for .app file. Monteverdi and Mapla has same icon! + if(APPLE) + install(FILES ${PACKAGE_SUPPORT_FILES_DIR}/Monteverdi.icns + DESTINATION ${PKG_STAGE_DIR}) + endif() + + ####################### install sqldriver plugin ######################## + install(FILES ${QT_PLUGINS_DIR}/sqldrivers/${PKG_QTSQLITE_FILENAME} + DESTINATION ${PKG_QTPLUGINS_DIR}/sqldrivers) + + ####################### install qt4 translations ########################### + #get all translations already distributed with qt4 + get_qt_translation_files(QT_TRANSLATIONS_FILES) + + #install all files in ${QT_TRANSLATIONS_FILES} + install(FILES ${QT_TRANSLATIONS_FILES} DESTINATION ${PKG_QT_TRANSLATIONS_DIR}) + + ####################### install monteverdi translations ##################### + #translation of monteverdi specific strings + if(NOT EXISTS "${OTB_INSTALL_DIR}/${PKG_OTB_TRANSLATIONS_DIRNAME}") + message(FATAL_ERROR "Error ${OTB_INSTALL_DIR}/${PKG_OTB_TRANSLATIONS_DIRNAME} not exists") + endif() + + file(GLOB APP_TS_FILES ${PACKAGE_OTB_SRC_DIR}/i18n/*.ts) # qm files + foreach(APP_TS_FILE ${APP_TS_FILES}) + get_filename_component(APP_TS_FILENAME ${APP_TS_FILE} NAME_WE) + install(FILES ${OTB_INSTALL_DIR}/${PKG_OTB_TRANSLATIONS_DIRNAME}/${APP_TS_FILENAME}.qm + DESTINATION ${PKG_STAGE_DIR}/${PKG_OTB_TRANSLATIONS_DIRNAME} + ) + endforeach() + +endfunction() diff --git a/SuperBuild/Packaging/PackageGlobals.cmake b/SuperBuild/Packaging/PackageGlobals.cmake new file mode 100644 index 0000000000..47f8fff576 --- /dev/null +++ b/SuperBuild/Packaging/PackageGlobals.cmake @@ -0,0 +1,120 @@ +set(WINDOWS_SYSTEM_DLLS + user32.dll + gdi32.dll + shell32.dll + kernel32.dll + ws2_32.dll + wldap32.dll + ole32.dll + comdlg32.dll + shfolder.dll + secur32.dll + wsock32.dll + advapi32.dll + crypt32.dll + imm32.dll + oleaut32.dll + winmm.dll + opengl32.dll + glu32.dll + rpcrt4.dll + winspool.drv + normaliz.dll + odbc32.dll + psapi.dll + python...dll + ) + +if(MINGW) + set(WINDOWS_SYSTEM_DLLS + ${WINDOWS_SYSTEM_DLLS} + msvcrt.dll + ) +endif() + +if(PKG_GENERATE_XDK) + set(WINDOWS_SYSTEM_DLLS + ${WINDOWS_SYSTEM_DLLS} + api-ms-win-* + concrt140.dll + ucrtbase.dll + msvcp140.dll + msvrt140.dll + vcomp140.dll + ) +endif() + +set(LINUX_SYSTEM_DLLS + libm.so + libc.so + libstdc* + libgcc_s.so + librt.so + libdl.so + libpthread.so + libidn.so + libgomp.so* + ld-linux-x86-64.so* + libX11.so* + libXext.so* + libXau.so* + libXdmcp.so* + libXxf86vm.so* + libdrm.so.2 + libGL.so* + libGLU.so* + libXrender.so* + libSM.so* + libICE.so* + libXrandr.so* + libpython* + libexpat.so.0 + ) + +# libgcc_s.*dylib and other *.framework are dragged by QT +set(APPLE_SYSTEM_DLLS + libSystem.*dylib + libiconv.*dylib + libc\\+\\+.*dylib + libstdc.*dylib + libobjc.*dylib + ApplicationServices.framework + CoreFoundation.framework + CoreServices.framework + Security.framework + Carbon.framework + AppKit.framework + Foundation.framework + Python.framework + AGL.framework + OpenGL.framework + libgcc_s.*dylib + ) + +if(WIN32) + set(SYSTEM_DLLS "${WINDOWS_SYSTEM_DLLS}") +else() #case for unixes + if(APPLE) + set(SYSTEM_DLLS "${APPLE_SYSTEM_DLLS}") + else() + set(SYSTEM_DLLS "${LINUX_SYSTEM_DLLS}") + endif() +endif(WIN32) + +#superbuild cannot manage build of gtk2+ just for qt gtkstyle. +# -gtkstyle option is deactivated by default in build of QT4 +# So the list of requirements on building OTB with superbuild stays same. +#For our user base, we need monteverdi with a nice look and feel +# rather than simply X11 based windows. Hence we need -gtkstyle +# This forces us to have system gtk+ installed on the system. +# OTB package manager 'this script' will pick them up and put +# into the binary package. Below cmake variable controls the list of +#libraries coming from /usr/lib a.k.a system. +set(ALLOWED_SYSTEM_DLLS + libfreetype.so.6.* + libgthread-2.0.so.0 + libglib-2.0.so.0 + libgobject-2.0.so.0 + libXrender.so.1 + libfontconfig.so.1 + ) diff --git a/SuperBuild/Packaging/PackageHelper.cmake b/SuperBuild/Packaging/PackageHelper.cmake index 1d1aa8b624..dd43f93e5b 100644 --- a/SuperBuild/Packaging/PackageHelper.cmake +++ b/SuperBuild/Packaging/PackageHelper.cmake @@ -1,97 +1,95 @@ -#RK: TODO: do a sweep when mxe is out and msvc builds are stabilized - macro(macro_super_package) cmake_parse_arguments(PKG "" "STAGE_DIR" "" ${ARGN} ) - - if(${PKG_STAGE_DIR} STREQUAL "") + + set(LINUX FALSE) + if( "${CMAKE_SYSTEM_NAME}" MATCHES "Linux" AND NOT MINGW) + set(LINUX TRUE) + endif() + + if("${PKG_STAGE_DIR}" STREQUAL "") message(FATAL_ERROR "PKG_STAGE_DIR is empty. Just can't continue.") endif() - if(NOT WIN32 AND NOT APPLE) - if(NOT PATCHELF_PROGRAM) - message(FATAL_ERROR "PATCHELF_PROGRAM not set") - endif() + if(NOT DEPENDENCIES_INSTALL_DIR) + message(FATAL_ERROR "DEPENDENCIES_INSTALL_DIR is not set of empty") + endif() + + if(LINUX AND NOT PATCHELF_PROGRAM) + message(FATAL_ERROR "PATCHELF_PROGRAM not set") endif() set(loader_program_PATHS) - if(WIN32) - if(MSVC) - set(loader_program_names "dumpbin") - set(loader_program_PATHS) - set(LOADER_PROGRAM_ARGS "/DEPENDENTS") - else() - set(loader_program_names "${MXE_ARCH}-w64-mingw32.shared-objdump") - set(loader_program_PATHS "${MXE_MXEROOT}/usr/bin") - set(LOADER_PROGRAM_ARGS "-p") - endif() + set(eol_char "E") + if(MSVC) + set(loader_program_PATHS) + set(loader_program_names "dumpbin") + set(loader_program_args "/DEPENDENTS") + set(loader_program_regex "^ ([^ ].*[Dd][Ll][Ll])${eol_char}$") + elseif(APPLE) + set(loader_program_PATHS) + set(loader_program_names otool) + set(loader_program_args "-l" ) + set(loader_program_regex ".*name.*([ ].*dylib ).*${eol_char}$") + elseif(LINUX) + set(loader_program_PATHS) + set(loader_program_names objdump) + set(loader_program_args "-p" ) + set(loader_program_regex "^..NEEDED.*([ ].*so.*)${eol_char}$") + elseif(MINGW) + set(loader_program_PATHS "${MXE_MXEROOT}/usr/bin") + set(loader_program_names "${OTB_TARGET_SYSTEM_ARCH}-w64-mingw32.shared-objdump") + set(loader_program_args "-p") + set(loader_program_regex "^\t*DLL Name: (.*\\.[Dd][Ll][Ll])${eol_char}$") else() - if(APPLE) - set(loader_program_names otool) - set(LOADER_PROGRAM_ARGS "-l") - set(loader_program_PATHS /opt/local/bin) # a path that is already listed i path on apple - else() - set(loader_program_names objdump) - set(LOADER_PROGRAM_ARGS "-p") - set(loader_program_PATHS /usr/bin) # a path that is already listed in default path on Linux - endif() - if(NOT DEPENDENCIES_INSTALL_DIR) - message(FATAL_ERROR "DEPENDENCIES_INSTALL_DIR is not set of empty") - endif() + message(FATAL_ERROR "Unknown platform: ") endif() - + find_program(LOADER_PROGRAM "${loader_program_names}" PATHS ${loader_program_PATHS}) - if(NOT EXISTS ${LOADER_PROGRAM}) - message(FATAL_ERROR "${loader_program_names} not found in ${loader_program_PATHS}. please check LOADER_PROGRAM variable is set correctly") + if(NOT LOADER_PROGRAM) + message(FATAL_ERROR "${loader_program_names} not found in ${loader_program_PATHS}.") endif() + + include(GetPrerequisites) - execute_process( - COMMAND ${PYTHON_EXECUTABLE} - -c - "import sys; from distutils import sysconfig; print (sysconfig.get_config_var('INSTSONAME'));" - RESULT_VARIABLE python_INSTALLED_SONAME_rv - OUTPUT_VARIABLE python_INSTALLED_SONAME_ov - ) + set(LOADER_PROGRAM_ARGS ${loader_program_args}) - if(NOT python_INSTALLED_SONAME_rv EQUAL 0) - message( FATAL_ERROR - "python_INSTALLED_SONAME_rv=${python_INSTALLED_SONAME_rv}: Cannot find python library") - endif() - set(python_INSTALLED_SONAME "${python_INSTALLED_SONAME_ov}") - - include(GetPrerequisites) + # find_loader_and_args(LOADER_PROGRAM LOADER_PROGRAM_ARGS) + + find_python_soname(python_INSTALLED_SONAME) set(PKG_SEARCHDIRS) if(WIN32) if(MSVC) list(APPEND PKG_SEARCHDIRS "${DEPENDENCIES_INSTALL_DIR}/bin") #all other dlls list(APPEND PKG_SEARCHDIRS "${DEPENDENCIES_INSTALL_DIR}/lib") #Qt & Qwt dlls - if(DEFINED ENV{UniversalCRTSdkDir}) - file(TO_CMAKE_PATH "$ENV{UniversalCRTSdkDir}" UCRT_SDK_DIR) - list( - APPEND - PKG_SEARCHDIRS - "${UCRT_SDK_DIR}/Redist/ucrt/DLLs/${OTB_TARGET_SYSTEM_ARCH}" - ) #ucrt dlls - else() - message(FATAL_ERROR - "UniversalCRTSdkDir variable not set. - call vcvarsall.bat <arch> first before starting build.") - endif() - - #addtional msvc redist dll from VCINSTALLDIR - if(DEFINED ENV{VCINSTALLDIR}) - file(TO_CMAKE_PATH "$ENV{VCINSTALLDIR}" PKG_VCINSTALLDIR) - list( - APPEND - PKG_SEARCHDIRS - "${PKG_VCINSTALLDIR}/redist/${OTB_TARGET_SYSTEM_ARCH}/Microsoft.VC140.CRT/" - "${PKG_VCINSTALLDIR}/redist/${OTB_TARGET_SYSTEM_ARCH}/Microsoft.VC140.OPENMP/" - ) - else() - message(FATAL_ERROR - "VCINSTALLDIR variable not set. call vcvarsall.bat <arch> first before starting build.") - endif() + if(NOT PKG_GENERATE_XDK) + if(DEFINED ENV{UniversalCRTSdkDir}) + file(TO_CMAKE_PATH "$ENV{UniversalCRTSdkDir}" UCRT_SDK_DIR) + list( + APPEND + PKG_SEARCHDIRS + "${UCRT_SDK_DIR}/Redist/ucrt/DLLs/${OTB_TARGET_SYSTEM_ARCH}" + ) #ucrt dlls + else() + message(FATAL_ERROR + "UniversalCRTSdkDir variable not set. call vcvarsall.bat <arch> first before starting build.") + endif() + + #addtional msvc redist dll from VCINSTALLDIR + if(DEFINED ENV{VCINSTALLDIR}) + file(TO_CMAKE_PATH "$ENV{VCINSTALLDIR}" PKG_VCINSTALLDIR) + list( + APPEND + PKG_SEARCHDIRS + "${PKG_VCINSTALLDIR}/redist/${OTB_TARGET_SYSTEM_ARCH}/Microsoft.VC140.CRT" + "${PKG_VCINSTALLDIR}/redist/${OTB_TARGET_SYSTEM_ARCH}/Microsoft.VC140.OPENMP" + ) + else() + message(FATAL_ERROR + "VCINSTALLDIR variable not set. call vcvarsall.bat <arch> first before starting build.") + endif() + endif() #NOT PKG_GENERATE_XDK else() file(GLOB MXE_GCC_LIB_DIR "${DEPENDENCIES_INSTALL_DIR}/bin/gcc*") list(APPEND PKG_SEARCHDIRS ${MXE_GCC_LIB_DIR}) @@ -117,11 +115,6 @@ macro(macro_super_package) macro_empty_package_staging_directory() set(PKG_PEFILES) - if(NOT WIN32) - #NOTE: VAR_IN_PKGSETUP_CONFIGURE is copied to linux_pkgsetup.in - #during configure_file. This will be processed by func_lisp - set(VAR_IN_PKGSETUP_CONFIGURE) - endif() set(QT_EXECUTABLES) list(APPEND QT_EXECUTABLES "lrelease") @@ -132,80 +125,64 @@ macro(macro_super_package) func_prepare_package() - file(STRINGS "${CMAKE_BINARY_DIR}/install_to_bin" install_to_bin_list) - func_lisp(install_to_bin_list ) - foreach(install_to_bin_item ${install_to_bin_list}) - is_file_executable("${install_to_bin_item}" is_exe) - if(is_exe) - install(PROGRAMS "${install_to_bin_item}" DESTINATION ${PKG_STAGE_DIR}/bin) - else() - install(FILES "${install_to_bin_item}" DESTINATION ${PKG_STAGE_DIR}/bin) - endif() - endforeach() + set(program_list) + set(WITH_PYTHON "false") + if(OTB_WRAP_PYTHON) + set(WITH_PYTHON "true") + endif() + + set(IS_XDK "false") - file(STRINGS "${CMAKE_BINARY_DIR}/install_to_lib" install_to_lib_list) - func_lisp( install_to_lib_list ) - #install lib files into lib as install(FILES .. - foreach(install_to_lib_item ${install_to_lib_list}) - install(FILES "${install_to_lib_item}" DESTINATION ${PKG_STAGE_DIR}/lib) - endforeach() + if(LINUX) + set(PKGSETUP_IN_FILENAME linux_pkgsetup.in) + elseif(APPLE) + set(PKGSETUP_IN_FILENAME macx_pkgsetup.in) + endif() + + if(PKG_GENERATE_XDK) + set(IS_XDK "true") + set(WITH_PYTHON "false") + message(STATUS "OTB_WRAP_PYTHON is set. But this will not be included in XDK") + if("${PKG_ITK_SB_VERSION}" STREQUAL "") + message(FATAL_ERROR "PKG_ITK_SB_VERSION not set. This is required for XDK") + endif() + func_install_xdk_files() + endif() #PKG_GENERATE_XDK + ############# install package configure script ################ - if(UNIX AND NOT WIN32) + #if(UNIX AND NOT WIN32) + if(UNIX AND NOT WIN32) #avoid OTB stuff inside make_symlinks script file(STRINGS "${CMAKE_BINARY_DIR}/make_symlinks_temp" make_symlinks_list) - func_lisp( make_symlinks_list ) - file(WRITE ${CMAKE_BINARY_DIR}/make_symlinks "#!/usr/bin/env bash\n") +# func_lisp( make_symlinks_list ) + file(WRITE ${CMAKE_BINARY_DIR}/make_symlinks "#!/bin/sh\n") foreach(make_symlink_cmd ${make_symlinks_list}) file(APPEND ${CMAKE_BINARY_DIR}/make_symlinks "${make_symlink_cmd}\n") endforeach() - set(WITH_PYTHON "false") - if(OTB_WRAP_PYTHON) - set(WITH_PYTHON "true") - endif() - - set(IS_XDK "false") - if(PKG_GENERATE_XDK) - set(IS_XDK "true") - set(WITH_PYTHON "false") - message(STATUS "OTB_WRAP_PYTHON is set. But this will not be included in XDK") - - if("${PKG_ITK_SB_VERSION}" STREQUAL "") - message(FATAL_ERROR "PKG_ITK_SB_VERSION not set. This is required for XDK") - endif() - - #avoid OTB stuff inside pkgsetup for XDK - separate_arguments( VAR_IN_PKGSETUP_CONFIGURE ) - func_lisp( VAR_IN_PKGSETUP_CONFIGURE ) - string(REPLACE ";" " " VAR_IN_PKGSETUP_CONFIGURE "${VAR_IN_PKGSETUP_CONFIGURE}") - endif() - set(PKGSETUP_IN_FILENAME linux_pkgsetup.in) - if(APPLE) - set(PKGSETUP_IN_FILENAME macx_pkgsetup.in) - endif() - configure_file(${PACKAGE_SUPPORT_FILES_DIR}/${PKGSETUP_IN_FILENAME} ${CMAKE_BINARY_DIR}/pkgsetup @ONLY) - - install(PROGRAMS - ${CMAKE_BINARY_DIR}/pkgsetup - ${CMAKE_BINARY_DIR}/make_symlinks - DESTINATION ${PKG_STAGE_DIR} - ) - - ########### install patchelf( linux only) ################## - if(NOT APPLE) - install(PROGRAMS ${PATCHELF_PROGRAM} - DESTINATION ${PKG_STAGE_DIR}/tools) + + list(APPEND program_list "${CMAKE_BINARY_DIR}/pkgsetup") + list(APPEND program_list "${CMAKE_BINARY_DIR}/make_symlinks") + + ########### install patchelf( linux only) ################## + if(LINUX) + list(APPEND program_list "${PATCHELF_PROGRAM}") endif() - endif() # if(UNIX) - - if(PKG_GENERATE_XDK) - func_install_xdk_files() + endif() + + foreach(prog ${program_list}) + install( + PROGRAMS ${prog} + DESTINATION ${PKG_STAGE_DIR}) + endforeach() + + # We need qt.conf on windows. for macx and linux we write it # after extracting package if(WIN32 AND NOT PKG_GENERATE_XDK) @@ -221,411 +198,6 @@ macro(macro_super_package) endmacro(macro_super_package) -function(func_install_xdk_files) - - #The list of REQ_SHARE_DIR is made up from <mxe-target-dir>/share/ - #It may vary in future. I prefer not to glob on the share dir and - #end up distributing man, info etc.. which ar irrelvant for windows - foreach(REQ_SHARE_DIR - aclocal - Armadillo - applications - cmake - dbus-1 - fontconfig - libgta - locale - xml - applications - cmake - icons - OpenCV - pixmaps - pkgconfig - ) - if(EXISTS "${DEPENDENCIES_INSTALL_DIR}/share/${REQ_SHARE_DIR}") - func_install_without_message("${DEPENDENCIES_INSTALL_DIR}/share/${REQ_SHARE_DIR}" "share") - endif() - endforeach() - - file(GLOB LIB_CMAKE_DIRS "${DEPENDENCIES_INSTALL_DIR}/lib/cmake/*") - foreach(LIB_CMAKE_DIR ${LIB_CMAKE_DIRS}) - get_filename_component(LIB_CMAKE_DIR_name_we ${LIB_CMAKE_DIR} NAME_WE) - if(NOT "${LIB_CMAKE_DIR_name_we}" MATCHES "OTB") - func_install_without_message("${LIB_CMAKE_DIR}" "lib/cmake") - endif() - endforeach() - - set(QT_REQ_DIRS) - if(WIN32) - #only affects windows due to regex on dll - if(MSVC) - file(GLOB LIB_FILES "${DEPENDENCIES_INSTALL_DIR}/lib/*.lib") - else() - file(GLOB LIB_FILES "${DEPENDENCIES_INSTALL_DIR}/lib/*dll.*") - endif() - func_lisp(LIB_FILES ) - - install(FILES ${LIB_FILES} DESTINATION ${PKG_STAGE_DIR}/lib ) - - file(GLOB ITK_EXTRA_DLL_FILES_1 "${DEPENDENCIES_INSTALL_DIR}/bin/libITK*.dll") - install(FILES ${ITK_EXTRA_DLL_FILES_1} DESTINATION ${PKG_STAGE_DIR}/bin) - - file(GLOB ITK_EXTRA_DLL_FILES_2 "${DEPENDENCIES_INSTALL_DIR}/bin/libitk*.dll") - install(FILES ${ITK_EXTRA_DLL_FILES_2} DESTINATION ${PKG_STAGE_DIR}/bin) - - file(GLOB OPENCV_EXTRA_DLL_FILES "${DEPENDENCIES_INSTALL_DIR}/bin/libopencv*.dll") - install(FILES ${OPENCV_EXTRA_DLL_FILES} DESTINATION ${PKG_STAGE_DIR}/bin) - - file(GLOB OPENCV_EXTRA_A_FILES "${DEPENDENCIES_INSTALL_DIR}/lib/libopencv*.a") - install(FILES ${OPENCV_EXTRA_A_FILES} DESTINATION ${PKG_STAGE_DIR}/lib) - - #opencv cmake config files in two directories. - # ${PKG_STAGE_DIR}/lib and ${PKG_STAGE_DIR} - file(GLOB OPENCV_CONFIG_FILES_1 "${DEPENDENCIES_INSTALL_DIR}/lib/OpenCV*.cmake") - install(FILES ${OPENCV_CONFIG_FILES_1} DESTINATION ${PKG_STAGE_DIR}/lib) - - file(GLOB OPENCV_CONFIG_FILES_2 "${DEPENDENCIES_INSTALL_DIR}/OpenCV*.cmake") - install(FILES ${OPENCV_CONFIG_FILES_2} DESTINATION ${PKG_STAGE_DIR}) - - #mxe installs qt in a separate directory under install prefix. So.. - set(QT_INSTALL_DIR "${DEPENDENCIES_INSTALL_DIR}/qt") - - #qt/bin is also a special case for mxe. - file(GLOB QT_EXTRA_DLL_FILES "${DEPENDENCIES_INSTALL_DIR}/qt/bin/*.dll") - install(FILES ${QT_EXTRA_DLL_FILES} DESTINATION ${PKG_STAGE_DIR}/bin) - - #list(APPEND QT_REQ_DIRS lib) - list(APPEND QT_REQ_DIRS include) - list(APPEND QT_REQ_DIRS imports) - - else() - set( - QT_INSTALL_DIR "${DEPENDENCIES_INSTALL_DIR}") - - endif(WIN32) - - if(NOT QT_EXECUTABLES) - message(FATAL_ERROR "QT_EXECUTABLES not set") - endif() - - list(APPEND QT_REQ_DIRS mkspecs) - list(APPEND QT_REQ_DIRS plugins) - list(APPEND QT_REQ_DIRS translations) - foreach(QT_REQ_DIR ${QT_REQ_DIRS} ) - if(EXISTS "${QT_INSTALL_DIR}/${QT_REQ_DIR}") - func_install_without_message("${QT_INSTALL_DIR}/${QT_REQ_DIR}" "") - endif() - endforeach() - - # #install ${DEPENDENCIES_INSTALL_DIR}/include directory. Attention to OTB includes - file(GLOB ALL_IN_INCLUDE_DIR "${DEPENDENCIES_INSTALL_DIR}/include/*") - foreach(INCLUDE_DIR_ITEM ${ALL_IN_INCLUDE_DIR}) - get_filename_component(INCLUDE_DIR_ITEM_name ${INCLUDE_DIR_ITEM} NAME) - get_filename_component(INCLUDE_DIR_ITEM_name_we ${INCLUDE_DIR_ITEM} NAME_WE) - if(NOT "${INCLUDE_DIR_ITEM_name_we}" MATCHES "OTB|otb") - if( IS_DIRECTORY ${INCLUDE_DIR_ITEM}) - install(CODE - "message(STATUS \"Installing: ${CMAKE_INSTALL_PREFIX}/${PKG_STAGE_DIR}/include/${INCLUDE_DIR_ITEM_name}/\")" ) - install( - DIRECTORY "${INCLUDE_DIR_ITEM}" - DESTINATION "${PKG_STAGE_DIR}/include/" - MESSAGE_NEVER - ) - else() - install( - FILES "${INCLUDE_DIR_ITEM}" - DESTINATION "${PKG_STAGE_DIR}/include/" - ) - endif() #if( IS_DIRECTORY - endif() #if (NOT - endforeach() - -endfunction() #func_install_xdk_files - -function(func_install_without_message src_dir dst_dir_suffix) - set (extra_func_args ${ARGN}) - list(LENGTH extra_func_args num_extra_args) - if (${num_extra_args} GREATER 0) - list(GET extra_func_args 0 optional_msg) - endif() - - if( "${dst_dir_suffix}" STREQUAL "") - set(dst_dir "${PKG_STAGE_DIR}") - else() - set(dst_dir "${PKG_STAGE_DIR}/${dst_dir_suffix}") - endif() - - get_filename_component(src_dir_name ${src_dir} NAME) - set(install_msg "message(STATUS \"Installing: ${CMAKE_INSTALL_PREFIX}/${dst_dir}/${src_dir_name} ${optional_msg}\")") - install(CODE "${install_msg}" ) - install( - DIRECTORY ${src_dir} - DESTINATION ${dst_dir} - MESSAGE_NEVER ) -endfunction() - -function(func_install_support_files) - - #a convenient cmake var for storing <prefix>/bin - set(PKG_STAGE_BIN_DIR "${PKG_STAGE_DIR}/bin") - - #<prefix>/share for gdal data files - set(PKG_SHARE_DEST_DIR ${PKG_STAGE_DIR}/share) - - set(PKG_SHARE_SOURCE_DIR ${DEPENDENCIES_INSTALL_DIR}/share) - - set(GDAL_DATA ${PKG_SHARE_SOURCE_DIR}/gdal) - #MSVC install gdal-data in in a different directory. So we don't spoil it - if(MSVC) - set(GDAL_DATA ${DEPENDENCIES_INSTALL_DIR}/data) - endif() - - # Just check if required variables are defined. - foreach(req - DEPENDENCIES_INSTALL_DIR - OTB_APPLICATIONS_DIR - PKG_STAGE_DIR - PACKAGE_SUPPORT_FILES_DIR - OTB_INSTALL_DIR - ) - if(NOT DEFINED ${req}) - message(FATAL_ERROR "you must set ${req} before calling this method") - endif() - set(vars "${vars} ${req}=[${${req}}]\n") - endforeach(req) - - # one for debugging.. - # install(CODE "message(\"CMake/PackageHelper.cmake:install_supoport_files(${outdir})\n${vars}\n\")") - if(NOT PKG_GENERATE_XDK) - func_install_otb_support_files() - - #check if monteverdi executable is built? - if(EXISTS "${OTB_INSTALL_DIR}/bin/monteverdi${EXE_EXT}") - func_install_monteverdi_support_files() - endif() - - endif() #NOT PKG_GENERATE_XDK - - ####################### install GDAL data ############################ - if(NOT EXISTS "${GDAL_DATA}/epsg.wkt") - message(FATAL_ERROR - "Cannot generate package without GDAL_DATA : ${GDAL_DATA} ${DEPENDENCIES_INSTALL_DIR}") - endif() - - install(DIRECTORY ${GDAL_DATA} DESTINATION ${PKG_SHARE_DEST_DIR}) - - ####################### install GeoTIFF data ######################## - install(DIRECTORY ${PKG_SHARE_SOURCE_DIR}/epsg_csv DESTINATION ${PKG_SHARE_DEST_DIR}) - - ####################### install OSSIM data ########################## - install(DIRECTORY ${PKG_SHARE_SOURCE_DIR}/ossim DESTINATION ${PKG_SHARE_DEST_DIR}) - - ####################### install proj share ########################## - if(EXISTS ${PKG_SHARE_SOURCE_DIR}/proj) - install(DIRECTORY ${PKG_SHARE_SOURCE_DIR}/proj DESTINATION ${PKG_SHARE_DEST_DIR}) - endif() - - set(PKG_VERSION_FILE - "${OTB_INSTALL_DIR}/share/doc/${PKG_OTB_VERSION_MAJOR}.${PKG_OTB_VERSION_MINOR}/VERSION") - - ####################### Install copyrights ########################## - if(NOT MINGW) - #install license for windows package - install(DIRECTORY ${PKG_SHARE_SOURCE_DIR}/copyright DESTINATION ${PKG_SHARE_DEST_DIR}) - install(FILES ${PKG_SHARE_SOURCE_DIR}/copyright/LICENSE DESTINATION ${PKG_STAGE_DIR}) - endif() - - ####################### Install VERSION ########################## - if(EXISTS ${PKG_VERSION_FILE} ) - install(FILES ${PKG_VERSION_FILE} DESTINATION ${PKG_STAGE_DIR}) - endif() - -endfunction() - -function(func_install_otb_support_files) - foreach(req - PKG_STAGE_DIR - OTB_INSTALL_DIR - DEPENDENCIES_INSTALL_DIR - OTB_APPLICATIONS_DIR - ) - if(NOT DEFINED ${req}) - message(FATAL_ERROR "you must set ${req} before calling this method") - endif() - set(vars "${vars} ${req}=[${${req}}]\n") - endforeach(req) - - #a convenient cmake var for storing <prefix>/bin - set(PKG_STAGE_BIN_DIR "${PKG_STAGE_DIR}/bin") - - #root folder where otb applications are installed - set(PKG_OTBLIBS_DIR "${PKG_STAGE_DIR}/lib/otb") - - #<prefix>/share for gdal data files - set(PKG_SHARE_DEST_DIR ${PKG_STAGE_DIR}/share) - - set(PKG_SHARE_SOURCE_DIR ${DEPENDENCIES_INSTALL_DIR}/share) - - #For Unixes we make them in the *pkgsetup.in - ##################### install environment source ########################## - if(WIN32) - foreach(ENV_SOURCE_FILE - "${PACKAGE_SUPPORT_FILES_DIR}/otbenv.cmd" - "${PACKAGE_SUPPORT_FILES_DIR}/otbenv.profile") - if(EXISTS ${ENV_SOURCE_FILE}) - install(FILES ${ENV_SOURCE_FILE} DESTINATION ${PKG_STAGE_DIR}) - endif() - endforeach() - - #we need startup files for mapla monteverdi in the root directory - #For Unixes, we make them inside pkgsetup script! - foreach(exe_file mapla monteverdi) - install( - PROGRAMS ${PACKAGE_SUPPORT_FILES_DIR}/${exe_file}.bat - DESTINATION "${PKG_STAGE_DIR}" - ) - endforeach() - endif() - - ####################### install cli and gui scripts ########################### - file(GLOB PKG_APP_SCRIPTS - ${OTB_INSTALL_DIR}/bin/otbcli* - ${OTB_INSTALL_DIR}/bin/otbgui*) # - - list(LENGTH PKG_APP_SCRIPTS PKG_APP_SCRIPTS_LENGTH) - if (PKG_APP_SCRIPTS_LENGTH LESS 1) - message(WARNING "PKG_APP_SCRIPTS is empty: ${PKG_APP_SCRIPTS}") - endif() - - ##################### install cli and gui scripts ####################### - install(PROGRAMS ${PKG_APP_SCRIPTS} DESTINATION ${PKG_STAGE_BIN_DIR}) - - ####################### Install otb applications #################### - install(DIRECTORY "${OTB_APPLICATIONS_DIR}" DESTINATION ${PKG_OTBLIBS_DIR}) - -endfunction() - -function(func_install_monteverdi_support_files) - - #name/ext of qt's sqlite plugin. Varies with platform/OS - if(WIN32) - set(PKG_QTSQLITE_FILENAME "qsqlite4.dll") - elseif(APPLE) - set(PKG_QTSQLITE_FILENAME "libqsqlite.dylib") - elseif("${CMAKE_SYSTEM_NAME}" MATCHES "Linux") - set(PKG_QTSQLITE_FILENAME "libqsqlite.so") - else() - message(FATAL_ERROR "func_install_monteverdi_support_files: Unknown OS/Platform") - endif() - - #root folder where qt plugins are installed - set(PKG_QTPLUGINS_DIR "${PKG_STAGE_DIR}/lib/qt4/plugins") - - #qt4's distributes some translation of common message string used in Qt. - #This are provided with any qt installation. We reuse them in otb package - #so as not to reinvent the wheels. - set(PKG_QT_TRANSLATIONS_DIR "${PKG_STAGE_DIR}/lib/qt4/translations") - - #<prefix>/share for otb i18n directory. This is different from qt's i18N directory - #which is <prefix>/share/qt4/translations. - #set(PKG_xxOTB_Ixxx18N_DIR "${PKG_STAGE_DIR}/${PKG_OTB_INSTALL_DATA_DIR}/i18n") - # we find this value by parsing ConfigureMonteverdi.h - set(ConfigureMonteverdi_H "${OTB_BINARY_DIR}/Modules/Visualization/MonteverdiCore/ConfigureMonteverdi.h") - if(NOT EXISTS "${ConfigureMonteverdi_H}") - message(FATAL_ERROR "${ConfigureMonteverdi_H} does not exists. Cannot continue") - endif() - - file( - STRINGS "${ConfigureMonteverdi_H}" - ConfigureMonteverdi_H_CONTENTS - REGEX "^#define.Monteverdi_INSTALL_DATA_DIR") - - string(REGEX REPLACE - "^#define.Monteverdi_INSTALL_DATA_DIR" "" - ConfigureMonteverdi_H_CONTENTS - ${ConfigureMonteverdi_H_CONTENTS} ) - - if(NOT ConfigureMonteverdi_H_CONTENTS) - message(FATAL_ERROR "Parse error in ${ConfigureMonteverdi_H}. Cannot continue") - endif() - - string( - REGEX REPLACE "\"" "" - PKG_OTB_INSTALL_DATA_DIR - "${ConfigureMonteverdi_H_CONTENTS}") - - if(NOT PKG_OTB_INSTALL_DATA_DIR) - message(FATAL_ERROR "parse error in ${ConfigureMonteverdi_H_CONTENTS}. Cannot continue") - endif() - - string(STRIP "${PKG_OTB_INSTALL_DATA_DIR}" PKG_OTB_INSTALL_DATA_DIR) - - set(PKG_OTB_TRANSLATIONS_DIRNAME "${PKG_OTB_INSTALL_DATA_DIR}/i18n") - - # Just check if required variables are defined. - foreach(req - PACKAGE_OTB_SRC_DIR - PACKAGE_SUPPORT_FILES_DIR - QT_PLUGINS_DIR - PKG_STAGE_BIN_DIR - PKG_QTSQLITE_FILENAME - PKG_QTPLUGINS_DIR - PKG_QT_TRANSLATIONS_DIR - PKG_OTB_TRANSLATIONS_DIRNAME - ) - if(NOT DEFINED ${req} OR "${${req}}" STREQUAL "") - message(FATAL_ERROR "you must set ${req} before calling this method") - endif() - set(vars "${vars} ${req}=[${${req}}]\n") - endforeach(req) - - #install icon file for .app file. Monteverdi and Mapla has same icon! - if(APPLE) - install(FILES ${PACKAGE_SUPPORT_FILES_DIR}/Monteverdi.icns - DESTINATION ${PKG_STAGE_DIR}) - endif() - - ####################### install sqldriver plugin ######################## - install(FILES ${QT_PLUGINS_DIR}/sqldrivers/${PKG_QTSQLITE_FILENAME} - DESTINATION ${PKG_QTPLUGINS_DIR}/sqldrivers) - - ####################### install qt4 translations ########################### - #get all translations already distributed with qt4 - get_qt_translation_files(QT_TRANSLATIONS_FILES) - - #install all files in ${QT_TRANSLATIONS_FILES} - install(FILES ${QT_TRANSLATIONS_FILES} DESTINATION ${PKG_QT_TRANSLATIONS_DIR}) - - ####################### install monteverdi translations ##################### - #translation of monteverdi specific strings - if(NOT EXISTS "${OTB_INSTALL_DIR}/${PKG_OTB_TRANSLATIONS_DIRNAME}") - message(FATAL_ERROR "Error ${OTB_INSTALL_DIR}/${PKG_OTB_TRANSLATIONS_DIRNAME} not exists") - endif() - - file(GLOB APP_TS_FILES ${PACKAGE_OTB_SRC_DIR}/i18n/*.ts) # qm files - foreach(APP_TS_FILE ${APP_TS_FILES}) - get_filename_component(APP_TS_FILENAME ${APP_TS_FILE} NAME_WE) - install(FILES ${OTB_INSTALL_DIR}/${PKG_OTB_TRANSLATIONS_DIRNAME}/${APP_TS_FILENAME}.qm - DESTINATION ${PKG_STAGE_DIR}/${PKG_OTB_TRANSLATIONS_DIRNAME} - ) - endforeach() - -endfunction() - -macro(macro_empty_package_staging_directory) - message(STATUS "Empty package staging directory: ${CMAKE_INSTALL_PREFIX}/${PKG_STAGE_DIR}") - execute_process( - COMMAND ${CMAKE_COMMAND} - -E remove_directory - "${CMAKE_INSTALL_PREFIX}/${PKG_STAGE_DIR}" - ) -endmacro() #macro_empty_package_staging_directory - -#NOTE: -# VAR_IN_PKGSETUP_CONFIGURE cmake variable is set below. -# This is important and useful running configure_file() -# over *pkgsetup.in function(func_prepare_package) @@ -647,11 +219,8 @@ function(func_prepare_package) endif() file(WRITE ${CMAKE_BINARY_DIR}/make_symlinks_temp "") - file(WRITE ${CMAKE_BINARY_DIR}/install_to_bin "") - file(WRITE ${CMAKE_BINARY_DIR}/install_to_lib "") - #This must exist in any OTB Installation minimal or full - set(VAR_IN_PKGSETUP_CONFIGURE "bin/otbApplicationLauncherCommandLine") + #This must exist in any OTB Installation. minimal or full set(PKG_PEFILES "${OTB_INSTALL_DIR}/bin/otbApplicationLauncherCommandLine${EXE_EXT}") if(NOT EXISTS "${OTB_INSTALL_DIR}/bin/otbApplicationLauncherCommandLine${EXE_EXT}") message( @@ -680,8 +249,6 @@ function(func_prepare_package) if(NOT FOUND_${EXE_FILE}) if(EXISTS "${EXE_SEARCHDIR}/${EXE_FILE}${EXE_EXT}") set(FOUND_${EXE_FILE} TRUE) - #see the first comment about VAR_IN_PKGSETUP_CONFIGURE - set(VAR_IN_PKGSETUP_CONFIGURE "${VAR_IN_PKGSETUP_CONFIGURE} bin/${EXE_FILE}${EXE_EXT}") list(APPEND PKG_PEFILES "${EXE_SEARCHDIR}/${EXE_FILE}${EXE_EXT}") endif() endif() #(NOT FOUND_${EXE_FILE}) @@ -689,7 +256,7 @@ function(func_prepare_package) endforeach() # special case for msvc: ucrtbase.dll must be explicitly vetted. - if(MSVC) + if(MSVC AND NOT PKG_GENERATE_XDK) list(APPEND PKG_PEFILES "ucrtbase.dll") endif() @@ -700,507 +267,221 @@ function(func_prepare_package) endif() endforeach() - file(GLOB OTB_APPS_LIST "${OTB_APPLICATIONS_DIR}/otbapp_*${LIB_EXT}") # /lib/otb - - #see the first comment about VAR_IN_PKGSETUP_CONFIGURE - #NOTE: this is not used in windows yet.. - foreach(OTB_APP_SO ${OTB_APPS_LIST}) - get_filename_component(OTB_APP_SO_NAME ${OTB_APP_SO} NAME) - set(VAR_IN_PKGSETUP_CONFIGURE - "${VAR_IN_PKGSETUP_CONFIGURE} lib/otb/applications/${OTB_APP_SO_NAME}") - endforeach() + file(GLOB OTB_APPS_LIST "${OTB_APPLICATIONS_DIR}/otbapp_*${LIB_EXT}") # /lib/otb list(APPEND PKG_PEFILES ${OTB_APPS_LIST}) - if(EXISTS "${OTB_INSTALL_DIR}/lib/otb/python/_otbApplication${PYMODULE_EXT}") - #DO NOT ADD _otbApplication.* to PKG_PEFILES. we install it in next step with - # install( DIRECTORY .. - # list( - # APPEND - # PKG_PEFILES - # "${OTB_INSTALL_DIR}/lib/otb/python/_otbApplication${PYMODULE_EXT}" - # ) - install( - DIRECTORY - ${OTB_INSTALL_DIR}/lib/otb/python - DESTINATION ${PKG_STAGE_DIR}/lib/ - ) - else() - if(OTB_WRAP_PYTHON) - message(FATAL_ERROR "OTB_WRAP_PYTHON is set , but cannot find _otbApplication${PYMODULE_EXT}") + if(NOT PKG_GENERATE_XDK) + if(EXISTS "${OTB_INSTALL_DIR}/lib/otb/python/_otbApplication${PYMODULE_EXT}") + install( + DIRECTORY + ${OTB_INSTALL_DIR}/lib/otb/python + DESTINATION ${PKG_STAGE_DIR}/lib + ) + else() + if(OTB_WRAP_PYTHON) + message(FATAL_ERROR "OTB_WRAP_PYTHON is set , but cannot find _otbApplication${PYMODULE_EXT}") endif() - endif() + endif() + endif()# if(NOT PKG_GENERATE_XDK) - # Take gtk libs from system. we should fix this to take from custom - # build location - set(GTK_SYSTEM_LIBS_SEARCH_PATHS - /usr/lib - /lib64 ) func_install_support_files() - execute_process( - COMMAND ${CMAKE_COMMAND} - -E remove_directory - "${CMAKE_BINARY_DIR}/temp_so_names_dir" - ) + unset(matched_vars CACHE) + get_vars_ending_with("_USED|_RESOLVED" matched_vars) + foreach (var_to_unset IN LISTS matched_vars) + if(PKG_OTB_DEBUG) + message("unset ${var_to_unset} from cache") + endif() + unset(${var_to_unset} CACHE) + endforeach() - execute_process( - COMMAND ${CMAKE_COMMAND} - -E make_directory - "${CMAKE_BINARY_DIR}/temp_so_names_dir" - ) - - set(alldlls) - set(notfound_dlls) - #message(STATUS "Processing start") + foreach(infile ${PKG_PEFILES}) - get_filename_component(bn ${infile} NAME) - func_process_deps(${bn}) - endforeach() - #message(STATUS "Processing done") - list(REMOVE_DUPLICATES notfound_dlls) - if(UNIX AND NOT APPLE) - foreach(allowed_system_dll ${ALLOWED_SYSTEM_DLLS}) - list (FIND notfound_dlls "${allowed_system_dll}" found_index) - if(${found_index} GREATER -1) - #find_file (<VAR> NAMES name PATHS paths... NO_DEFAULT_PATH) - find_file ( ${allowed_system_dll}_abs_path NAMES ${allowed_system_dll} - PATHS ${GTK_SYSTEM_LIBS_SEARCH_PATHS} NO_DEFAULT_PATH) - if(${allowed_system_dll}_abs_path) - file(GLOB fff "${${allowed_system_dll}_abs_path}*") - foreach(f ${fff}) - func_is_file_a_symbolic_link("${f}" is_symlink linked_to_file) - if(is_symlink) - get_filename_component(name_of_f ${f} NAME) - file(APPEND - ${CMAKE_BINARY_DIR}/make_symlinks_temp - "ln -sf $OUT_DIR/lib/gtk/${linked_to_file} $OUT_DIR/lib/gtk/${name_of_f}\n" - ) - else() # is_symlink - install(FILES ${f} DESTINATION ${PKG_STAGE_DIR}/lib/gtk) - endif() - endforeach() - list(REMOVE_ITEM notfound_dlls "${allowed_system_dll}") - endif() - endif() - endforeach() - endif() #UNIX AND NOT APPLE - - list(LENGTH notfound_dlls nos) - if(${nos} GREATER 0) - message(FATAL_ERROR "Following dlls were not found: ${notfound_dlls}. Please consider adding their paths to PKG_SEARCHDIRS when calling macro_super_package macro.") - endif() #( ${nos} GREATER 0) - - file(GLOB temp_files "${CMAKE_BINARY_DIR}/temp_so_names_dir/*") # /lib/otb - foreach(temp_file ${temp_files}) - get_filename_component(basename_of_temp_file ${temp_file} NAME) - set(VAR_IN_PKGSETUP_CONFIGURE "${VAR_IN_PKGSETUP_CONFIGURE} lib/${basename_of_temp_file}") + get_filename_component(bn ${infile} NAME) + func_process_deps(${bn}) endforeach() - #remove this temporary directory - execute_process(COMMAND ${CMAKE_COMMAND} -E remove_directory "${CMAKE_BINARY_DIR}/temp_so_names_dir") - - set(VAR_IN_PKGSETUP_CONFIGURE "${VAR_IN_PKGSETUP_CONFIGURE}" PARENT_SCOPE) - + endfunction() #func_prepare_package -function(func_process_deps infile) - - if(APPLE) - if( "${infile}" MATCHES "@rpath") - string(REGEX REPLACE "@rpath." "" infile "${infile}") - endif() - endif() - if(WIN32) - string(TOLOWER "${infile}" infile_lower ) - endif() - - # is_system_dll is first pass check the file is not a system dll - # there is a second pass after looking all searchdirs which is where - # we make the call to list it as not-found-dlls - is_system_dll(is_system "${infile}") - if(EXISTS ${infile} AND NOT is_system) - if(APPLE) - # We want all non-system deps to start with rpath - message(FATAL_ERROR "Found dependency without @rpath : ${infile}") - endif() - get_filename_component(infile ${infile} NAME) +function(func_process_deps input_file) + + search_library(${input_file} PKG_SEARCHDIRS input_file_full_path) + if(NOT input_file_full_path) + message(FATAL_ERROR "${input_file} not found. searched in ${PKG_SEARCHDIRS}") endif() - - get_filename_component(bn ${infile} NAME) - - list_contains(contains "${bn}" "${alldlls}") - if(NOT contains) - set(DLL_FOUND FALSE) - - foreach(SEARCHDIR ${PKG_SEARCHDIRS}) - if(NOT DLL_FOUND) - if(WIN32) - if(NOT EXISTS ${SEARCHDIR}/${infile} ) - if(EXISTS ${SEARCHDIR}/${infile_lower} ) - set(infile ${infile_lower}) - endif() - endif() - endif() - if(EXISTS ${SEARCHDIR}/${infile}) - set(DLL_FOUND TRUE) - message(STATUS "Processing ${SEARCHDIR}/${infile}") - - is_file_executable("${SEARCHDIR}/${infile}" is_executable) - if(is_executable) - file(APPEND ${CMAKE_BINARY_DIR}/install_to_${DEST_BIN_DIR} "${SEARCHDIR}/${infile}\n") - else(is_executable) - get_filename_component(bn_we ${infile} NAME_WE) - file(GLOB sofiles "${SEARCHDIR}/${bn_we}*") - foreach(sofile ${sofiles}) - get_filename_component(sofile_ext ${sofile} EXT) - set(is_valid TRUE) - if ("${sofile_ext}" MATCHES ".la" - OR "${sofile_ext}" MATCHES ".prl" - OR "${sofile_ext}" MATCHES ".a") - set(is_valid FALSE) - endif() - if(is_valid) - get_filename_component(basename_of_sofile ${sofile} NAME) - func_is_file_a_symbolic_link("${sofile}" is_symlink linked_to_file) - if(is_symlink) - # NOTE: $OUT_DIR is set actually in pkgsetup.in. So don't try - # any pre-mature optimization on that variable names - file(APPEND - ${CMAKE_BINARY_DIR}/make_symlinks_temp - "ln -sf $OUT_DIR/lib/${linked_to_file} $OUT_DIR/lib/${basename_of_sofile}\n" - ) - # message("${sofile} is a symlink to ${linked_to_file}") - else() # is_symlink - if(NOT "${basename_of_sofile}" MATCHES "otbapp_") - if( NOT IS_DIRECTORY ${sofile} ) - file(APPEND ${CMAKE_BINARY_DIR}/install_to_${DEST_LIB_DIR} "${sofile}\n") - #just install the so file to <staging-dir>/lib - #install(FILES "${sofile}" DESTINATION ${PKG_STAGE_DIR}/lib MESSAGE_NEVER) - # Finally touch a file in temp directory for globbing later - # message("touching ${basename_of_sofile}") - execute_process(COMMAND ${CMAKE_COMMAND} -E touch "${CMAKE_BINARY_DIR}/temp_so_names_dir/${basename_of_sofile}") - endif() # ( EXISTS ${SEARCHDIR}/${sofile} ) - endif() # if(.. MATCHES "otbapp_") - endif() # is_symlink - endif() #is_valid - endforeach() - endif(is_executable) - execute_process( - COMMAND ${LOADER_PROGRAM} ${LOADER_PROGRAM_ARGS} "${SEARCHDIR}/${infile}" - RESULT_VARIABLE loader_rv - OUTPUT_VARIABLE loader_ov - ERROR_VARIABLE loader_ev - ) - if(loader_rv) - message(FATAL_ERROR "loader_ev=${loader_ev}\n PACKAGE-OTB: result_variable is '${loader_rv}'") - endif() - if(WIN32) - if(MSVC) - #skip entries from section 'delay load dependencies' - string(REGEX MATCHALL - "Image.has.the.following.dependencies.(.*[Dd][Ll][Ll])" loader_ov "${loader_ov}") - string(REGEX REPLACE - "Image.has.the.following.dependencies.." "" loader_ov "${loader_ov}") - #beware of .DLL and .dll - string(REGEX REPLACE ".DLL" ".dll" loader_ov "${loader_ov}") - #convert to cmake list - string(REGEX REPLACE ".dll" ".dll;" needed_dlls "${loader_ov}") - else() - string(REGEX MATCHALL "DLL.Name..[A-Za-z(0-9\\.0-9)+_\\-]*" loader_ov "${loader_ov}") - string(REGEX REPLACE "DLL.Name.." "" needed_dlls "${loader_ov}") - endif() - else() #case for unixes - if(APPLE) - string(REGEX REPLACE "[^\n]+cmd LC_LOAD_DYLIB\n[^\n]+\n[^\n]+name ([^\n]+).\\(offset[^\n]+\n" "rpath \\1\n" loader_ov "${loader_ov}") - string(REGEX MATCHALL "rpath [^\n]+" loader_ov "${loader_ov}") - string(REGEX REPLACE "rpath " "" needed_dlls "${loader_ov}") - else(APPLE) - string(REGEX MATCHALL "NEEDED\\ *[A-Za-z(0-9\\.0-9)+_\\-]*" loader_ov "${loader_ov}") - string(REGEX REPLACE "NEEDED" "" needed_dlls "${loader_ov}") - endif(APPLE) - endif() - - foreach(needed_dll ${needed_dlls}) - string(STRIP ${needed_dll} needed_dll) - func_process_deps(${needed_dll}) - endforeach() - endif() - endif(NOT DLL_FOUND) - endforeach() - - if(NOT DLL_FOUND) - is_system_dll(iss "${infile}") - if(NOT iss) - set(notfound_dlls "${notfound_dlls};${infile}") - endif() - else(NOT DLL_FOUND) - set( alldlls "${alldlls};${bn}" PARENT_SCOPE ) - endif(NOT DLL_FOUND) - set(notfound_dlls "${notfound_dlls}" PARENT_SCOPE ) + + message("Processing ${input_file_full_path}") + + is_file_executable("${input_file_full_path}" is_executable) + if(is_executable) + file(APPEND ${CMAKE_BINARY_DIR}/install_to_${DEST_BIN_DIR} "${input_file_full_path}\n") + else(is_executable) + + if(UNIX) + # Deal with symlinks. + # For any valid symlinks, (see 'not_valid' below) + # we append ln -s source target commands to a file + # That file is executed during installation. + get_filename_component(bn_we ${input_file_full_path} NAME_WE) + get_filename_component(bn_path ${input_file_full_path} PATH) + + file(GLOB sofiles "${bn_path}/${bn_we}*") + foreach(sofile ${sofiles}) + get_filename_component(basename_of_sofile ${sofile} NAME) + get_filename_component(sofile_ext ${sofile} EXT) + set(not_valid FALSE) + if( "${sofile_ext}" MATCHES ".la" + OR "${sofile_ext}" MATCHES ".prl" + OR "${sofile_ext}" MATCHES ".a" + OR IS_DIRECTORY "${sofile}" ) + set(not_valid TRUE) + endif() + + if(not_valid) + continue() + endif() + + func_is_file_a_symbolic_link("${sofile}" is_symlink linked_to_file) + + if(is_symlink) + add_to_symlink_list("${linked_to_file}" "${basename_of_sofile}") + endif() # is_symlink + + endforeach() + + endif(UNIX) + endif(is_executable) + + set(raw_items) + + execute_process( + COMMAND ${LOADER_PROGRAM} ${LOADER_PROGRAM_ARGS} "${input_file_full_path}" + RESULT_VARIABLE loader_rv + OUTPUT_VARIABLE loader_ov + ERROR_VARIABLE loader_ev + ) + + if(loader_rv) + message(FATAL_ERROR "loader_ev=${loader_ev}\n PACKAGE-OTB: result_variable is '${loader_rv}'") endif() -endfunction() #function(func_process_deps infile) - -# The below function is modified from GetPrerequisities.cmake -# which is distributed with CMake. -function(func_is_file_a_symbolic_link file result_var1 result_var2) - # - # A file is not executable until proven otherwise: - # - set(${result_var1} 0 PARENT_SCOPE) - set(${result_var2} "" PARENT_SCOPE) - - get_filename_component(file_full "${file}" ABSOLUTE) - string(TOLOWER "${file_full}" file_full_lower) + string(REPLACE ";" "\\;" candidates "${loader_ov}") + string(REPLACE "\n" "${eol_char};" candidates "${candidates}") + + get_filename_component(bn_name ${input_file_full_path} NAME) + set(${bn_name}_USED TRUE CACHE INTERNAL "") - # If file name ends in .exe on Windows, *assume* executable: - # - if(WIN32 AND NOT UNIX) - if("${file_full_lower}" MATCHES "\\.lnk$") - set(${result_var1} 1 PARENT_SCOPE) - #Assuming the file is linked to a file with same name without .lnk extension - get_filename_component(name_we_lnk "${file_full_lower}" NAME_WE) - set(${result_var2} "${name_we_lnk}" PARENT_SCOPE) - return() + foreach(candidate ${candidates}) + if(NOT candidate) + continue() endif() - - # A clause could be added here that uses output or return value of dumpbin - # to determine ${result_var}. In 99%+? practical cases, the exe name - # match will be sufficient... - # - endif() - - # Use the information returned from the Unix shell command "file" to - # determine if ${file_full} should be considered an executable file... - # - # If the file command's output contains "executable" and does *not* contain - # "text" then it is likely an executable suitable for prerequisite analysis - # via the get_prerequisites macro. - # - if(UNIX) - if(NOT file_cmd) - find_program(file_cmd "file") - mark_as_advanced(file_cmd) + if(NOT "${candidate}" MATCHES "${loader_program_regex}") + continue() endif() - - if(file_cmd) - execute_process(COMMAND "${file_cmd}" "${file_full}" - RESULT_VARIABLE file_rv - OUTPUT_VARIABLE file_ov - ERROR_VARIABLE file_ev - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - if(NOT file_rv STREQUAL "0") - message(FATAL_ERROR "${file_cmd} failed: ${file_rv}\n${file_ev}") - endif() - - # Replace the name of the file in the output with a placeholder token - # (the string " _file_full_ ") so that just in case the path name of - # the file contains the word "text" or "executable" we are not fooled - # into thinking "the wrong thing" because the file name matches the - # other 'file' command output we are looking for... - # - string(REPLACE "${file_full}" " _file_full_ " file_ov "${file_ov}") - string(TOLOWER "${file_ov}" file_ov_lower) - - #message(FATAL_ERROR "file_ov='${file_ov}'") - if("${file_ov_lower}" MATCHES "symbolic link") - #message(STATUS "symbolic link!") - set(${result_var1} 1 PARENT_SCOPE) - #Now find where the symlink is linked to. - #Do a regex replace - if(UNIX) - if(APPLE) - string(REGEX REPLACE "_file_full_*.*symbolic.link.to." - "" symlinked_to ${file_ov}) - else(APPLE) - string(REGEX REPLACE "_file_full_*.*symbolic.link.to.." - "" symlinked_to ${file_ov}) - endif(APPLE) - endif(UNIX) - #Take out last character which is a single quote - string(REPLACE "'" "" symlinked_to "${symlinked_to}") - #strip for our own sanity - string(STRIP ${symlinked_to} symlinked_to) - set(${result_var2} "${symlinked_to}" PARENT_SCOPE) - #message(FATAL_ERROR "${file_full} is symlinked_to ${symlinked_to}") - return() + + string(REGEX REPLACE "${loader_program_regex}" "\\1" raw_item "${candidate}") + + if(NOT raw_item) + continue() + endif() + + string(STRIP ${raw_item} raw_item) + set(is_system FALSE) + setif_value_in_list(is_system "${raw_item}" SYSTEM_DLLS) + + if(APPLE AND NOT is_system) + if("${raw_item}" MATCHES "@rpath") + string(REGEX REPLACE "@rpath." "" raw_item "${raw_item}") + else() + message(FATAL_ERROR "'${raw_item}' does not have @rpath") endif() - - else() - message(STATUS "warning: No 'file' command, skipping execute_process...") endif() - endif() -endfunction() - -macro(is_system_dll matched value) - set(${matched}) - string(TOLOWER ${value} value_) - foreach (pattern ${SYSTEM_DLLS}) - string(TOLOWER ${pattern} pattern_) - if("${value_}" MATCHES "${pattern_}") - set(${matched} TRUE) - endif() - endforeach() -endmacro() - -macro(list_contains var value) - set(${var}) - foreach(value2 ${ARGN}) - if(${value} STREQUAL ${value2}) - set(${var} TRUE) + + if(is_system OR ${raw_item}_RESOLVED OR ${raw_item}_USED) + continue() endif() - endforeach(value2) -endmacro() - -# Get the translation files coming with Qt, and install them in the bundle -# They are loaded by Monteverdi. -function(get_qt_translation_files RESULT) - # These files are the "qt_<localename>.qm" files - # They are located in QT_TRANSLATIONS_DIR, which comes from FindQt4 - file(GLOB translation_files ${QT_TRANSLATIONS_DIR}/qt_*) - - # We need to remove the "qt_help_<localename>.qm" files from this list - foreach(translation_item ${translation_files}) - if(${translation_item} MATCHES "qt_help") - list(REMOVE_ITEM translation_files ${translation_item}) - endif() - endforeach() - - set(${RESULT} ${translation_files} PARENT_SCOPE) -endfunction() - -#func_lisp: - A list_process function (func_lisp) -#This method process the input list inplace. -#It first remove all entries in the list starting with otbapp_* -#Then when generating XDK package it also remove -#the all OTB and Monteverdi binaries are lib. -#Value of PKG_GENERATE_XDK is set already -#The final list is use to create install() commands later -function(func_lisp install_list ) - foreach(install_list_item ${${install_list}}) - get_filename_component(install_list_item_NAME_WE ${install_list_item} NAME_WE) - #MUST remove otb applications. Installed later in otb_support_files function - #message("${install_list_item}") - if ("${install_list_item_NAME_WE}" MATCHES "otbapp_*") - list(REMOVE_ITEM ${install_list} "${install_list_item}") + + if(PKG_OTB_DEBUG) + message("${raw_item} is not resolved, used. ${raw_item}_RESOLVED | ${raw_item}_USED") endif() - - if(PKG_GENERATE_XDK) - if ("${install_list_item_NAME_WE}" - MATCHES - "libOTB|libotb|otbApp|otbTest|libMonteverdi|monteverdi|mapla|iceViewer" - ) - list(REMOVE_ITEM ${install_list} "${install_list_item}") + + list(APPEND raw_items ${raw_item}) + + endforeach() + + if(PKG_OTB_DEBUG) + message(FATAL_ERROR "raw_items=${raw_items}") + endif(PKG_OTB_DEBUG) + + if(raw_items) + list(REVERSE raw_items) + foreach(item ${raw_items}) + search_library(${item} PKG_SEARCHDIRS item_full_path) + set(is_a_symlink FALSE) + set(item_target_file) + func_is_file_a_symbolic_link("${item_full_path}" is_a_symlink item_target_file) + if(is_a_symlink) + set(${item}_RESOLVED TRUE CACHE INTERNAL "") + set(item ${item_target_file}) endif() - endif() + func_process_deps(${item}) endforeach() +endif() -# message(FATAL_ERROR "install_list=${${install_list}}") - set(${install_list} "${${install_list}}" PARENT_SCOPE) +set(${bn_name}_RESOLVED TRUE CACHE INTERNAL "") -endfunction() # func_lisp +pkg_install_rule(${input_file_full_path}) -set(WINDOWS_SYSTEM_DLLS - user32.dll - gdi32.dll - shell32.dll - kernel32.dll - ws2_32.dll - wldap32.dll - ole32.dll - comdlg32.dll - shfolder.dll - secur32.dll - wsock32.dll - advapi32.dll - crypt32.dll - imm32.dll - oleaut32.dll - winmm.dll - opengl32.dll - glu32.dll - rpcrt4.dll - winspool.drv - normaliz.dll - odbc32.dll - psapi.dll - python...dll - Image.has.the.following.delay.load - ) -set(LINUX_SYSTEM_DLLS - libm.so - libc.so - libstdc* - libgcc_s.so - librt.so - libdl.so - libpthread.so - libidn.so - libgomp.so* - ld-linux-x86-64.so* - libX11.so* - libXext.so* - libXau.so* - libXdmcp.so* - libXxf86vm.so* - libdrm.so.2 - libGL.so* - libGLU.so* - libXrender.so* - libSM.so* - libICE.so* - libXrandr.so* - libpython* - ) +endfunction() #function(func_process_deps infile) + +function(pkg_install_rule src_file) -# libgcc_s.*dylib and other *.framework are dragged by QT -set(APPLE_SYSTEM_DLLS - libSystem.*dylib - libiconv.*dylib - libc\\+\\+.*dylib - libstdc.*dylib - libobjc.*dylib - ApplicationServices.framework - CoreFoundation.framework - CoreServices.framework - Security.framework - Carbon.framework - AppKit.framework - Foundation.framework - Python.framework - AGL.framework - OpenGL.framework - libgcc_s.*dylib - ) + get_filename_component(src_file_EXT ${src_file} EXT) + get_filename_component(src_file_NAME ${src_file} NAME) -if(WIN32) - set(SYSTEM_DLLS "${WINDOWS_SYSTEM_DLLS}") -else() #case for unixes - if(APPLE) - set(SYSTEM_DLLS "${APPLE_SYSTEM_DLLS}") + set(file_type PROGRAMS) + if(NOT src_file_EXT) + set(output_dir "bin") + elseif("${src_file_EXT}" MATCHES "(.[Dd][Ll][Ll]|.exe)") + set(output_dir "bin") + elseif("${src_file_EXT}" MATCHES "(.lib|.so|.dylib)") + set(output_dir "lib") + set(file_type FILES) else() - set(SYSTEM_DLLS "${LINUX_SYSTEM_DLLS}") + message(FATAL_ERROR "unreachable code") + endif() + + setif_value_in_list(is_gtk_lib "${src_file_NAME}" ALLOWED_SYSTEM_DLLS) + if(is_gtk_lib) + set(output_dir "lib/gtk") endif() -endif(WIN32) + + #special case + if("${src_file_NAME}" MATCHES "^otbapp_") + set(output_dir "lib/otb/applications") + set(file_type PROGRAMS) + endif() + + set(SKIP_INSTALL FALSE) + if(PKG_GENERATE_XDK) + if ("${src_file_NAME}" + MATCHES + "libOTB|libotb|otbApp|otbapp_|otbTest|libMonteverdi|monteverdi|mapla|iceViewer" + ) + set(SKIP_INSTALL TRUE) + endif() + endif() + + if(NOT SKIP_INSTALL) + install(${file_type} + "${src_file}" + DESTINATION + "${PKG_STAGE_DIR}/${output_dir}") + endif() + +endfunction() -#superbuild cannot manage build of gtk2+ just for qt gtkstyle. -# -gtkstyle option is deactivated by default in build of QT4 -# So the list of requirements on building OTB with superbuild stays same. -#For our user base, we need monteverdi with a nice look and feel -# rather than simply X11 based windows. Hence we need -gtkstyle -# This forces us to have system gtk+ installed on the system. -# OTB package manager 'this script' will pick them up and put -# into the binary package. Below cmake variable controls the list of -#libraries coming from /usr/lib a.k.a system. -set(ALLOWED_SYSTEM_DLLS - libfreetype.so.6 - libgthread-2.0.so.0 - libglib-2.0.so.0 - libgobject-2.0.so.0 - libXrender.so.1 - libfontconfig.so.1 - ) diff --git a/SuperBuild/Packaging/PackageMacros.cmake b/SuperBuild/Packaging/PackageMacros.cmake new file mode 100755 index 0000000000..7a7725dd77 --- /dev/null +++ b/SuperBuild/Packaging/PackageMacros.cmake @@ -0,0 +1,222 @@ +function(find_python_soname result) +set(${result} PARENT_SCOPE) + execute_process( + COMMAND ${PYTHON_EXECUTABLE} + -c + "import sys; from distutils import sysconfig; print (sysconfig.get_config_var('INSTSONAME'));" + RESULT_VARIABLE python_INSTALLED_SONAME_rv + OUTPUT_VARIABLE python_INSTALLED_SONAME_ov + ) + + if(NOT python_INSTALLED_SONAME_rv EQUAL 0) + message( FATAL_ERROR + "python_INSTALLED_SONAME_rv=${python_INSTALLED_SONAME_rv}: Cannot find python library") + endif() + set(${result} "${python_INSTALLED_SONAME_ov}" PARENT_SCOPE) +endfunction() + + +function(func_install_without_message src_dir dst_dir_suffix) + set (extra_func_args ${ARGN}) + list(LENGTH extra_func_args num_extra_args) + if (${num_extra_args} GREATER 0) + list(GET extra_func_args 0 optional_msg) + endif() + + if( "${dst_dir_suffix}" STREQUAL "") + set(dst_dir "${PKG_STAGE_DIR}") + else() + set(dst_dir "${PKG_STAGE_DIR}/${dst_dir_suffix}") + endif() + + get_filename_component(src_dir_name ${src_dir} NAME) + set(install_msg "message(STATUS \"Installing: ${CMAKE_INSTALL_PREFIX}/${dst_dir}/${src_dir_name} ${optional_msg}\")") + install(CODE "${install_msg}" ) + install( + DIRECTORY ${src_dir} + DESTINATION ${dst_dir} + MESSAGE_NEVER ) +endfunction() #func_install_without_message + + +macro(macro_empty_package_staging_directory) + message(STATUS "Empty package staging directory: ${CMAKE_INSTALL_PREFIX}/${PKG_STAGE_DIR}") + execute_process( + COMMAND ${CMAKE_COMMAND} + -E remove_directory + "${CMAKE_INSTALL_PREFIX}/${PKG_STAGE_DIR}" + ) +endmacro() #macro_empty_package_staging_directory + + +function(search_library input_file pkg_searchdirs result) + set(${result} "" PARENT_SCOPE) + set(found_lib FALSE) + foreach(SEARCHDIR ${${pkg_searchdirs}}) + if(EXISTS ${SEARCHDIR}/${input_file} ) + set(${result} "${SEARCHDIR}/${input_file}" PARENT_SCOPE) + return() + endif() + + string(TOLOWER "${input_file}" input_file_lower ) + if(EXISTS ${SEARCHDIR}/${input_file_lower}) + set(${result} "${SEARCHDIR}/${input_file_lower}" PARENT_SCOPE) + return() + endif() + endforeach() + + if(NOT found_lib) + check_for_gtk_libs(${input_file} gtk_lib_full_path) + if(gtk_lib_full_path) + set(${result} "${gtk_lib_full_path}" PARENT_SCOPE) + endif() + endif() + +endfunction() + +macro(add_to_symlink_list src_file target_file) + # NOTE: $OUT_DIR is set actually in pkgsetup.in. So don't try + # any pre-mature optimization on that variable names + file(APPEND + ${CMAKE_BINARY_DIR}/make_symlinks_temp + "ln -sf $OUT_DIR/lib/${src_file} $OUT_DIR/lib/${target_file}\n" + ) +endmacro() + +function(check_for_gtk_libs input_file result) + # Take gtk libs from system. we should fix this to take from custom + # build location + set(GTK_LIBS_SEARCH_PATHS + /usr/lib64 + /lib64 + ) + + set(${result} "" PARENT_SCOPE) + if(NOT LINUX) + return() + endif() + + + setif_value_in_list(is_allowed "${input_file}" ALLOWED_SYSTEM_DLLS) + if(NOT is_allowed) + return() + endif() + + foreach( search_path ${GTK_LIBS_SEARCH_PATHS}) + if(EXISTS ${search_path}/${input_file} ) + set(${result} ${search_path}/${input_file} PARENT_SCOPE) + endif() + endforeach() + +endfunction() + + +# The below function is modified from GetPrerequisities.cmake +# which is distributed with CMake. +function(func_is_file_a_symbolic_link file result_var1 result_var2) + # + # A file is not executable until proven otherwise: + # + set(${result_var1} 0 PARENT_SCOPE) + set(${result_var2} "" PARENT_SCOPE) + + get_filename_component(file_full "${file}" ABSOLUTE) + string(TOLOWER "${file_full}" file_full_lower) + + # If file name ends in .exe on Windows, *assume* executable: + # + if(WIN32 AND NOT UNIX) + if("${file_full_lower}" MATCHES "\\.lnk$") + set(${result_var1} 1 PARENT_SCOPE) + #Assuming the file is linked to a file with same name without .lnk extension + get_filename_component(name_we_lnk "${file_full_lower}" NAME_WE) + set(${result_var2} "${name_we_lnk}" PARENT_SCOPE) + return() + endif() + + # A clause could be added here that uses output or return value of dumpbin + # to determine ${result_var}. In 99%+? practical cases, the exe name + # match will be sufficient... + # + endif() + + # Use the information returned from the Unix shell command "file" to + # determine if ${file_full} should be considered an executable file... + # + # If the file command's output contains "executable" and does *not* contain + # "text" then it is likely an executable suitable for prerequisite analysis + # via the get_prerequisites macro. + # + if(UNIX) + if(NOT file_cmd) + find_program(file_cmd "file") + mark_as_advanced(file_cmd) + endif() + + if(file_cmd) + execute_process(COMMAND "${file_cmd}" "${file_full}" + RESULT_VARIABLE file_rv + OUTPUT_VARIABLE file_ov + ERROR_VARIABLE file_ev + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + if(NOT file_rv STREQUAL "0") + message(FATAL_ERROR "${file_cmd} failed: ${file_rv}\n${file_ev}") + endif() + + # Replace the name of the file in the output with a placeholder token + # (the string " _file_full_ ") so that just in case the path name of + # the file contains the word "text" or "executable" we are not fooled + # into thinking "the wrong thing" because the file name matches the + # other 'file' command output we are looking for... + # + string(REPLACE "${file_full}" " _file_full_ " file_ov "${file_ov}") + string(TOLOWER "${file_ov}" file_ov_lower) + + #message(FATAL_ERROR "file_ov='${file_ov}'") + if("${file_ov_lower}" MATCHES "symbolic link") + #message(STATUS "symbolic link!") + set(${result_var1} 1 PARENT_SCOPE) + #Now find where the symlink is linked to. + #Do a regex replace + if(UNIX) + if(APPLE) + string(REGEX REPLACE "_file_full_*.*symbolic.link.to." + "" symlinked_to ${file_ov}) + else(APPLE) + string(REGEX REPLACE "_file_full_*.*symbolic.link.to.." + "" symlinked_to ${file_ov}) + endif(APPLE) + endif(UNIX) + #Take out last character which is a single quote + string(REPLACE "'" "" symlinked_to "${symlinked_to}") + #strip for our own sanity + string(STRIP ${symlinked_to} symlinked_to) + set(${result_var2} "${symlinked_to}" PARENT_SCOPE) + #message(FATAL_ERROR "${file_full} is symlinked_to ${symlinked_to}") + return() + endif() + + else() + message(STATUS "warning: No 'file' command, skipping execute_process...") + endif() + endif() +endfunction() + +macro(setif_value_in_list matched value list) + set(${matched}) + string(TOLOWER ${value} value_) + foreach (pattern ${${list}}) + string(TOLOWER ${pattern} pattern_) + if("${value_}" MATCHES "${pattern_}") + set(${matched} TRUE) + endif() + endforeach() +#message("'${value}' not found in ${list}") +endmacro() + +function (get_vars_ending_with suffix result) + get_cmake_property(all_cmake_vars VARIABLES) + string (REGEX MATCHALL "(^|;)[A-Za-z0-9_\\.\\-]*(${suffix})" _matchedVars "${all_cmake_vars}") + set (${result} ${_matchedVars} PARENT_SCOPE) +endfunction() -- GitLab