aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlbert Ziegenhagel <albert.ziegenhagel@outlook.com>2017-08-10 11:56:23 +0200
committerAlbert Ziegenhagel <albert.ziegenhagel@outlook.com>2017-08-10 11:56:23 +0200
commitc344e708ec292ac8269819c2e384d7d3aef329c4 (patch)
tree26ad287d54edb8d203fc39c9809d8bb65197aea0
parent614218c18cdc361a394a06180a7b646d42b9843c (diff)
downloadvcpkg-c344e708ec292ac8269819c2e384d7d3aef329c4.tar.gz
vcpkg-c344e708ec292ac8269819c2e384d7d3aef329c4.zip
[vtk] fix issue where release libraries are referenced from VTK debug build
-rw-r--r--ports/vtk/CleanLibraryList.cmake77
-rw-r--r--ports/vtk/dont-define-ssize_t.patch13
-rw-r--r--ports/vtk/portfile.cmake104
-rw-r--r--ports/vtk/use-fixed-find-hdf5.patch20
4 files changed, 199 insertions, 15 deletions
diff --git a/ports/vtk/CleanLibraryList.cmake b/ports/vtk/CleanLibraryList.cmake
new file mode 100644
index 000000000..899039e44
--- /dev/null
+++ b/ports/vtk/CleanLibraryList.cmake
@@ -0,0 +1,77 @@
+# - A smarter replacement for list(REMOVE_DUPLICATES) for library lists
+#
+# Note that, in the case of cyclic link dependencies, you _do_ actually need
+# a library in a list multiple times. So, only use this function when you know
+# that the dependency graph is acyclic.
+#
+# clean_library_list(<listvar> <_default>) - where
+# listvar is the name of a destination variable, and the the source, and
+# it is followed by either "debug", "optimized" or "general" which will be
+# applied to libraries without any prefix.
+#
+# Removes duplicates from the list, leaving only the last instance, while
+# preserving the meaning of the "optimized", "debug", and "general" labeling.
+# (Libraries listed as general are listed in the result instead as optimized and
+# debug)
+#
+# Requires CMake 2.6 or newer (uses the 'function' command)
+#
+# Original Author:
+# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
+# http://academic.cleardefinition.com
+# Iowa State University HCI Graduate Program/VRAC
+#
+# Copyright Iowa State University 2009-2010.
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+
+if(__clean_library_list)
+ return()
+endif()
+set(__clean_library_list YES)
+
+function(clean_library_list _var _default)
+ set(_work ${${_var}})
+ if(_work)
+ # Turn each of optimized, debug, and general into flags
+ # prefixed on their respective library (combining list items)
+ string(REGEX REPLACE "optimized;" "1CLL%O%" _work "${_work}")
+ string(REGEX REPLACE "debug;" "1CLL%D%" _work "${_work}")
+ string(REGEX REPLACE "general;" "1CLL%G%" _work "${_work}")
+
+ # Any library that doesn't have a prefix is _default, and a general
+ # library is both debug and optimized so stdize it
+ set(_std)
+ foreach(_lib ${_work})
+ if(NOT "${_lib}" MATCHES "^1CLL%.%")
+ if("${_default}" STREQUAL "optimized")
+ list(APPEND _std "1CLL%O%${_lib}")
+ elseif("${_default}" STREQUAL "debug")
+ list(APPEND _std "1CLL%D%${_lib}")
+ else()
+ list(APPEND _std "1CLL%D%${_lib}" "1CLL%O%${_lib}")
+ endif()
+ elseif("${_lib}" MATCHES "^1CLL%G%")
+ string(REPLACE "1CLL%G%" "" _justlib "${_lib}")
+ list(APPEND _std "1CLL%D%${_justlib}" "1CLL%O%${_justlib}")
+ else()
+ list(APPEND _std "${_lib}")
+ endif()
+ endforeach()
+
+ # REMOVE_DUPLICATES leaves the first - so we reverse before and after
+ # to keep the last, instead
+ list(REVERSE _std)
+ list(REMOVE_DUPLICATES _std)
+ list(REVERSE _std)
+
+ # Split list items back out again: turn prefixes into the
+ # library type flags.
+ string(REGEX REPLACE "1CLL%D%" "debug;" _std "${_std}")
+ string(REGEX REPLACE "1CLL%O%" "optimized;" _std "${_std}")
+
+ # Return _std
+ set(${_var} ${_std} PARENT_SCOPE)
+ endif()
+endfunction()
diff --git a/ports/vtk/dont-define-ssize_t.patch b/ports/vtk/dont-define-ssize_t.patch
new file mode 100644
index 000000000..ba9b5e605
--- /dev/null
+++ b/ports/vtk/dont-define-ssize_t.patch
@@ -0,0 +1,13 @@
+diff --git a/ThirdParty/netcdf/vtknetcdf/ncconfig.h.in b/ThirdParty/netcdf/vtknetcdf/ncconfig.h.in
+index 0a19c41..0d92371 100644
+--- a/ThirdParty/netcdf/vtknetcdf/ncconfig.h.in
++++ b/ThirdParty/netcdf/vtknetcdf/ncconfig.h.in
+@@ -110,7 +110,7 @@
+ #cmakedefine HAVE_LIBHDF5_HL
+
+ /* Define to `int' if system doesn't define. */
+-#cmakedefine ssize_t @ssize_t@
++/* #cmakedefine ssize_t @ssize_t@ */
+
+ /* Define to `int' if system doesn't define. */
+ #cmakedefine ptrdiff_t @ptrdiff_t@
diff --git a/ports/vtk/portfile.cmake b/ports/vtk/portfile.cmake
index 0e6e551f2..65f2a428e 100644
--- a/ports/vtk/portfile.cmake
+++ b/ports/vtk/portfile.cmake
@@ -11,6 +11,20 @@ vcpkg_from_github(
vcpkg_apply_patches(
SOURCE_PATH ${SOURCE_PATH}
PATCHES
+ # Disable ssize_t because this can conflict with ssize_t that is defined on windows.
+ ${CMAKE_CURRENT_LIST_DIR}/dont-define-ssize_t.patch
+
+ # We force CMake to use it's own version of the FindHDF5 module since newer versions
+ # shipped with CMake behave differently. E.g. the one shipped with CMake 3.9 always
+ # only finds the release libraries, but not the debug libraries.
+ # The file shipped with CMake allows us to set the libraries explicitly as it is done below.
+ # Maybe in the future we can disable the patch and use the new version shipped with CMake
+ # together with the hdf5-config.cmake that is written by HDF5 itself, but currently VTK
+ # disables taking the config into account explicitly.
+ ${CMAKE_CURRENT_LIST_DIR}/use-fixed-find-hdf5.patch
+
+ # We disable a workaround in the VTK CMake scripts that can lead to the fact that a dependency
+ # will link to both, the debug and the release library.
${CMAKE_CURRENT_LIST_DIR}/disable-workaround-findhdf5.patch
)
@@ -60,25 +74,82 @@ vcpkg_configure_cmake(
vcpkg_install_cmake()
vcpkg_copy_pdbs()
-# Remove tools from the bin directory.
-# We make sure no references to the deleted files are left in the CMake config files.
-file(READ ${CURRENT_PACKAGES_DIR}/share/vtk/VTKTargets-release.cmake VTK_TARGETS_RELEASE_MODULE)
-string(REPLACE "list\(APPEND _IMPORT_CHECK_FILES_FOR_vtkEncodeString" "#list(APPEND _IMPORT_CHECK_FILES_FOR_vtkEncodeString" VTK_TARGETS_RELEASE_MODULE "${VTK_TARGETS_RELEASE_MODULE}")
-string(REPLACE "list\(APPEND _IMPORT_CHECK_FILES_FOR_vtkHashSource" "#list(APPEND _IMPORT_CHECK_FILES_FOR_vtkHashSource" VTK_TARGETS_RELEASE_MODULE "${VTK_TARGETS_RELEASE_MODULE}")
-file(WRITE ${CURRENT_PACKAGES_DIR}/share/vtk/VTKTargets-release.cmake "${VTK_TARGETS_RELEASE_MODULE}")
+vcpkg_fixup_cmake_targets()
-file(READ ${CURRENT_PACKAGES_DIR}/debug/share/vtk/VTKTargets-debug.cmake VTK_TARGETS_DEBUG_MODULE)
-string(REPLACE "\${_IMPORT_PREFIX}" "\${_IMPORT_PREFIX}/debug" VTK_TARGETS_DEBUG_MODULE "${VTK_TARGETS_DEBUG_MODULE}")
-string(REPLACE "list\(APPEND _IMPORT_CHECK_FILES_FOR_vtkEncodeString" "#list(APPEND _IMPORT_CHECK_FILES_FOR_vtkEncodeString" VTK_TARGETS_DEBUG_MODULE "${VTK_TARGETS_DEBUG_MODULE}")
-string(REPLACE "list\(APPEND _IMPORT_CHECK_FILES_FOR_vtkHashSource" "#list(APPEND _IMPORT_CHECK_FILES_FOR_vtkHashSource" VTK_TARGETS_DEBUG_MODULE "${VTK_TARGETS_DEBUG_MODULE}")
-file(WRITE ${CURRENT_PACKAGES_DIR}/share/vtk/VTKTargets-debug.cmake "${VTK_TARGETS_DEBUG_MODULE}")
+# For VTK vcpkg_fixup_cmake_targets is not enough:
+# Files for system third party dependencies are written to modules that
+# are located in the paths `share/vtk/Modules` and `debug/share/vtk/Modules`.
+# In the release folder, only the release libraries are referenced (e.g. "C:/vcpkg/installed/x64-windows/lib/zlib.lib").
+# But in the debug folder both libraries (e.g. "optimized;C:/vcpkg/installed/x64-windows/lib/zlib.lib;debug;C:/vcpkg/installed/x64-windows/debug/lib/zlibd.lib")
+# or only the debug library (e.g. "C:/vcpkg/installed/x64-windows/debug/lib/hdf5_D.lib") is referenced.
+# This is because VCPKG appends only the release library prefix (.../x64-windows/lib)
+# when configuring release but both (.../x64-windows/lib and .../x64-windows/debug/lib)
+# when configuring debug.
+# Now if we delete the debug/share/Modules folder and just leave share/Modules, a library
+# that links to VTK will always use the release third party dependencies, even if
+# debug VTK is used.
+#
+# The following code merges the libraries from both release and debug:
-file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/share)
-file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include)
+include(${CMAKE_CURRENT_LIST_DIR}/CleanLibraryList.cmake)
+
+function(_vtk_combine_third_party_libraries MODULE_NAME)
+ set(MODULE_LIBRARIES_REGEX "set\\(${MODULE_NAME}_LIBRARIES \"([^\"]*)\"\\)")
+
+ # Read release libraries
+ file(READ "${CURRENT_PACKAGES_DIR}/share/vtk/Modules/${MODULE_NAME}.cmake" RELEASE_MODULE_CONTENT)
+ if("${RELEASE_MODULE_CONTENT}" MATCHES "${MODULE_LIBRARIES_REGEX}")
+ set(RELEASE_LIBRARY_LIST "${CMAKE_MATCH_1}")
+ clean_library_list(RELEASE_LIBRARY_LIST "optimized")
+ else()
+ message(FATAL_ERROR "Could not extract module libraries for ${MODULE_NAME}")
+ endif()
+
+ # Read debug libraries
+ file(READ "${CURRENT_PACKAGES_DIR}/debug/share/vtk/Modules/${MODULE_NAME}.cmake" DEBUG_MODULE_CONTENT)
+ if("${DEBUG_MODULE_CONTENT}" MATCHES "${MODULE_LIBRARIES_REGEX}")
+ set(DEBUG_LIBRARY_LIST "${CMAKE_MATCH_1}")
+ clean_library_list(DEBUG_LIBRARY_LIST "debug")
+ else()
+ message(FATAL_ERROR "Could not extract module libraries for ${MODULE_NAME}")
+ endif()
+
+ # Combine libraries
+ set(LIBRARY_LIST ${RELEASE_LIBRARY_LIST} ${DEBUG_LIBRARY_LIST})
+ clean_library_list(LIBRARY_LIST "general")
+
+ # Write combined libraries back
+ string(REGEX REPLACE "${MODULE_LIBRARIES_REGEX}"
+ "set(${MODULE_NAME}_LIBRARIES \"${LIBRARY_LIST}\")"
+ RELEASE_MODULE_CONTENT
+ "${RELEASE_MODULE_CONTENT}"
+ )
+ file(WRITE "${CURRENT_PACKAGES_DIR}/share/vtk/Modules/${MODULE_NAME}.cmake" "${RELEASE_MODULE_CONTENT}")
+endfunction()
+
+# IMPORTANT: Please make sure to extend this list whenever a new library is marked `USE_SYSTEM` in the configure step above!
+set(SYSTEM_THIRD_PARTY_MODULES
+ vtkexpat
+ vtkfreetype
+ vtkglew
+ vtkhdf5
+ vtkjsoncpp
+ vtklibxml2
+ vtkpng
+ vtktiff
+ vtkzlib
+)
+
+foreach(MODULE IN LISTS SYSTEM_THIRD_PARTY_MODULES)
+ _vtk_combine_third_party_libraries("${MODULE}")
+endforeach()
+
+
+file(MAKE_DIRECTORY ${CURRENT_PACKAGES_DIR}/tools)
+file(RENAME ${CURRENT_PACKAGES_DIR}/bin/vtkEncodeString-8.0.exe ${CURRENT_PACKAGES_DIR}/tools/vtkEncodeString-8.0.exe)
+file(RENAME ${CURRENT_PACKAGES_DIR}/bin/vtkHashSource-8.0.exe ${CURRENT_PACKAGES_DIR}/tools/vtkHashSource-8.0.exe)
if(VCPKG_LIBRARY_LINKAGE STREQUAL dynamic)
- file(REMOVE ${CURRENT_PACKAGES_DIR}/bin/vtkEncodeString-8.0.exe)
- file(REMOVE ${CURRENT_PACKAGES_DIR}/bin/vtkHashSource-8.0.exe)
file(REMOVE ${CURRENT_PACKAGES_DIR}/debug/bin/vtkEncodeString-8.0.exe)
file(REMOVE ${CURRENT_PACKAGES_DIR}/debug/bin/vtkHashSource-8.0.exe)
else()
@@ -87,6 +158,9 @@ else()
file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/bin)
endif()
+file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include)
+file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/share)
+
# Handle copyright
file(COPY ${SOURCE_PATH}/Copyright.txt DESTINATION ${CURRENT_PACKAGES_DIR}/share/vtk)
file(RENAME ${CURRENT_PACKAGES_DIR}/share/vtk/Copyright.txt ${CURRENT_PACKAGES_DIR}/share/vtk/copyright)
diff --git a/ports/vtk/use-fixed-find-hdf5.patch b/ports/vtk/use-fixed-find-hdf5.patch
new file mode 100644
index 000000000..762a9ab07
--- /dev/null
+++ b/ports/vtk/use-fixed-find-hdf5.patch
@@ -0,0 +1,20 @@
+diff --git a/CMake/FindHDF5.cmake b/CMake/FindHDF5.cmake
+index 6d558e39b1..9511e9a1ad 100644
+--- a/CMake/FindHDF5.cmake
++++ b/CMake/FindHDF5.cmake
+@@ -3,11 +3,11 @@
+ # (BUG #0014363).
+
+ # include the default FindHDF5.cmake.
+-if(CMAKE_VERSION VERSION_LESS 3.6.1)
++#if(CMAKE_VERSION VERSION_LESS 3.6.1)
+ include(${CMAKE_CURRENT_LIST_DIR}/NewCMake/FindHDF5.cmake)
+-else()
+- include(${CMAKE_ROOT}/Modules/FindHDF5.cmake)
+-endif()
++#else()
++# include(${CMAKE_ROOT}/Modules/FindHDF5.cmake)
++#endif()
+
+ if(HDF5_FOUND AND (HDF5_IS_PARALLEL OR HDF5_ENABLE_PARALLEL))
+ include(vtkMPI)