aboutsummaryrefslogtreecommitdiff
path: root/cmake/Win32Cleanup.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'cmake/Win32Cleanup.cmake')
-rw-r--r--cmake/Win32Cleanup.cmake37
1 files changed, 37 insertions, 0 deletions
diff --git a/cmake/Win32Cleanup.cmake b/cmake/Win32Cleanup.cmake
new file mode 100644
index 0000000..be53ef8
--- /dev/null
+++ b/cmake/Win32Cleanup.cmake
@@ -0,0 +1,37 @@
+# To be run from cmake_install.cmake, eradicates all unreferenced libraries.
+# CMake 3.9.6 has a parsing bug with ENCODING UTF-8.
+cmake_minimum_required (VERSION 3.10)
+
+# CPack runs this almost without any CMake variables at all
+# (cmStateSnapshot::SetDefaultDefinitions(), CMAKE_INSTALL_PREFIX, [DESTDIR])
+set (installdir "${CMAKE_INSTALL_PREFIX}")
+if (NOT installdir OR installdir MATCHES "^/usr(/|$)")
+ return ()
+endif ()
+
+# The function is recursive and CMake has tragic scoping behaviour;
+# environment variables are truly global there, in the absence of a cache
+unset (ENV{seen})
+function (expand path)
+ set (seen $ENV{seen})
+ if (path IN_LIST seen OR NOT EXISTS "${path}")
+ return ()
+ endif ()
+
+ set (ENV{seen} "$ENV{seen};${path}")
+ file (STRINGS "${path}" strings REGEX "[.][Dd][Ll][Ll]$" ENCODING UTF-8)
+ foreach (string ${strings})
+ string (REGEX MATCH "[-.+_a-zA-Z0-9]+$" word "${string}")
+ expand ("${installdir}/${word}")
+ endforeach ()
+endfunction ()
+
+file (GLOB roots LIST_DIRECTORIES false "${installdir}/*.[Ee][Xx][Ee]"
+ "${installdir}/lib/gdk-pixbuf-2.0/2.10.0/loaders/*.[Dd][Ll][Ll]")
+foreach (binary ${roots})
+ expand ("${binary}")
+endforeach ()
+
+file (GLOB libraries LIST_DIRECTORIES false "${installdir}/*.[Dd][Ll][Ll]")
+list (REMOVE_ITEM libraries $ENV{seen})
+file (REMOVE ${libraries})