From 332e7427c6ea0f5c90865f61adabbc0422cc8c51 Mon Sep 17 00:00:00 2001
From: Louis Moureaux <louis.moureaux@cern.ch>
Date: Wed, 5 Jun 2024 21:18:31 +0200
Subject: [PATCH] Build TUnfold with CMake

It looked easier than writing a Find module.
---
 .gitignore                           |  4 +-
 CMakeLists.txt                       |  9 +---
 cmake/TUnfold/CMakeLists.txt         | 68 ++++++++++++++++++++++++++++
 cmake/TUnfold/LinkDef.h.in           |  8 ++++
 cmake/TUnfold/TUnfoldConfig.cmake.in |  3 ++
 5 files changed, 84 insertions(+), 8 deletions(-)
 create mode 100644 cmake/TUnfold/CMakeLists.txt
 create mode 100644 cmake/TUnfold/LinkDef.h.in
 create mode 100644 cmake/TUnfold/TUnfoldConfig.cmake.in

diff --git a/.gitignore b/.gitignore
index 355164c..0fb8073 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,3 @@
-*/
+/*/
+!/cmake/
+*.swp
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8c5f143..45cb35c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -32,13 +32,8 @@ ExternalProject_Add(TUnfold
     URL                 https://www.desy.de/~sschmitt/TUnfold/TUnfold_V17.9.tgz
     URL_HASH            SHA256=d7f66f6a0e007eb946180643b8879bb2b8918441106bc0305b82a97391a391dc
     SOURCE_DIR          "${CMAKE_SOURCE_DIR}/TUnfold"
-    CONFIGURE_COMMAND   ""
-    BUILD_COMMAND       make lib TUNFOLDVERSION='V17'
-    BUILD_IN_SOURCE     TRUE
-    INSTALL_COMMAND     install -DT libunfold.so <INSTALL_DIR>/${CMAKE_INSTALL_LIBDIR}/libtunfold.so
-            COMMAND     install TUnfoldV17Dict_rdict.pcm <INSTALL_DIR>/${CMAKE_INSTALL_LIBDIR}/
-            COMMAND     install -d <INSTALL_DIR>/${CMAKE_INSTALL_INCLUDEDIR}/TUnfold
-            COMMAND     install ${TUNFOLD_HEADERS} <INSTALL_DIR>/${CMAKE_INSTALL_INCLUDEDIR}/TUnfold/
+    PATCH_COMMAND       "${CMAKE_COMMAND}" -E copy_directory_if_different ${CMAKE_SOURCE_DIR}/cmake/TUnfold <SOURCE_DIR>
+    CMAKE_ARGS          -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR> -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
     INSTALL_DIR         "${CMAKE_INSTALL_PREFIX}"
 )
 configure_file(tunfold.xml.in tunfold.xml)
diff --git a/cmake/TUnfold/CMakeLists.txt b/cmake/TUnfold/CMakeLists.txt
new file mode 100644
index 0000000..8da8289
--- /dev/null
+++ b/cmake/TUnfold/CMakeLists.txt
@@ -0,0 +1,68 @@
+# SPDX-License-Identifier: GPLv3-or-later
+#
+# SPDX-FileCopyrightText: Louis Moureaux <louis.moureaux@cern.ch>
+
+cmake_minimum_required(VERSION 3.17..3.26 FATAL_ERROR)
+project(TUnfold VERSION 17.9 LANGUAGES CXX)
+
+find_package(ROOT 6.24 REQUIRED)
+
+set(classes
+    TUnfoldBinning
+    TUnfoldBinningXML
+    TUnfoldDensity
+    TUnfoldIterativeEM
+    TUnfoldSys
+    TUnfold)
+
+# Library
+set(sources ${classes})
+list(TRANSFORM sources APPEND V${TUnfold_VERSION_MAJOR}.cxx)
+
+set(headers ${classes})
+list(TRANSFORM headers APPEND .h)
+
+add_library(TUnfold SHARED ${sources})
+target_sources(TUnfold PUBLIC FILE_SET HEADERS FILES ${headers})
+target_link_libraries(TUnfold PUBLIC ROOT::Hist ROOT::XMLParser)
+
+# Install
+include(GNUInstallDirs)
+set(include_dir "${CMAKE_INSTALL_INCLUDEDIR}/TUnfold")
+install(TARGETS TUnfold
+        EXPORT TUnfoldTargets
+        COMPONENT TUnfold
+        FILE_SET HEADERS DESTINATION "${include_dir}"
+        RUNTIME  DESTINATION "${CMAKE_INSTALL_LIBDIR}"
+        INCLUDES DESTINATION "${include_dir}")
+
+# Dictionary
+configure_file(LinkDef.h.in LinkDef.h)
+# https://github.com/root-project/root/issues/8308#issuecomment-1143791946
+set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
+root_generate_dictionary(TUnfoldV${TUnfold_VERSION_MAJOR}Dict
+                         ${headers}
+                         MODULE TUnfold
+                         LINKDEF "${CMAKE_CURRENT_BINARY_DIR}/LinkDef.h")
+
+# Export
+include(CMakePackageConfigHelpers)
+set(CMAKECONFIG_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/TUnfold")
+configure_package_config_file(
+    "${CMAKE_CURRENT_SOURCE_DIR}/TUnfoldConfig.cmake.in"
+    "${CMAKE_CURRENT_BINARY_DIR}/TUnfoldConfig.cmake"
+    INSTALL_DESTINATION "${CMAKECONFIG_INSTALL_DIR}"
+)
+write_basic_package_version_file(
+    TUnfoldConfigVersion.cmake
+    COMPATIBILITY SameMajorVersion
+)
+install(FILES
+        "${CMAKE_CURRENT_BINARY_DIR}/TUnfoldConfig.cmake"
+        "${CMAKE_CURRENT_BINARY_DIR}/TUnfoldConfigVersion.cmake"
+        DESTINATION "${CMAKECONFIG_INSTALL_DIR}"
+        COMPONENT Devel)
+install(EXPORT TUnfoldTargets
+        NAMESPACE TUnfold::
+        DESTINATION "${CMAKECONFIG_INSTALL_DIR}"
+        FILE TUnfoldTargets.cmake)
diff --git a/cmake/TUnfold/LinkDef.h.in b/cmake/TUnfold/LinkDef.h.in
new file mode 100644
index 0000000..a5bf752
--- /dev/null
+++ b/cmake/TUnfold/LinkDef.h.in
@@ -0,0 +1,8 @@
+#ifdef __CLING__
+#pragma link C++ class TUnfoldV@TUnfold_VERSION_MAJOR@+;
+#pragma link C++ class TUnfoldIterativeEMV@TUnfold_VERSION_MAJOR@+;
+#pragma link C++ class TUnfoldSysV@TUnfold_VERSION_MAJOR@+;
+#pragma link C++ class TUnfoldDensityV@TUnfold_VERSION_MAJOR@+;
+#pragma link C++ class TUnfoldBinningV@TUnfold_VERSION_MAJOR@+;
+#pragma link C++ class TUnfoldBinningXMLV@TUnfold_VERSION_MAJOR@+;
+#endif
diff --git a/cmake/TUnfold/TUnfoldConfig.cmake.in b/cmake/TUnfold/TUnfoldConfig.cmake.in
new file mode 100644
index 0000000..fe63780
--- /dev/null
+++ b/cmake/TUnfold/TUnfoldConfig.cmake.in
@@ -0,0 +1,3 @@
+include(CMakeFindDependencyMacro)
+find_dependency(ROOT @ROOT_VERSION@)
+include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
-- 
GitLab