From 23254f3e62f9a44ddcfdb0a9fecf5fc0460a366c Mon Sep 17 00:00:00 2001
From: Sebastian Junges <sebastian.junges@rwth-aachen.de>
Date: Mon, 5 Dec 2016 15:14:17 +0100
Subject: [PATCH] refactoring resource management in storm cmake to allow
 easier inclusion in other projects

---
 CMakeLists.txt                        |  2 +
 resources/3rdparty/CMakeLists.txt     | 28 +++----------
 resources/cmake/macros/export.cmake   |  2 +-
 resources/cmake/macros/imported.cmake | 59 +++++++++++++++++++++++++++
 4 files changed, 67 insertions(+), 24 deletions(-)
 create mode 100644 resources/cmake/macros/imported.cmake

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 082f0689a..4e395e25d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -13,6 +13,8 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/resources/cmak
 
 include(ExternalProject)
 include(RegisterSourceGroup)
+include(imported)
+
 
 #############################################################
 ##
diff --git a/resources/3rdparty/CMakeLists.txt b/resources/3rdparty/CMakeLists.txt
index f5195c642..ce8b8da34 100644
--- a/resources/3rdparty/CMakeLists.txt
+++ b/resources/3rdparty/CMakeLists.txt
@@ -95,7 +95,8 @@ set(STORM_BOOST_INCLUDE_DIR "${Boost_INCLUDE_DIRS}")
 
 # Use the shipped version of ExprTK
 message (STATUS "Storm - Including ExprTk.")
-include_directories("${PROJECT_SOURCE_DIR}/resources/3rdparty/exprtk")
+add_imported_library_interface(ExprTk "${PROJECT_SOURCE_DIR}/resources/3rdparty/exprtk")
+list(APPEND STORM_LINK_LIBRARIES ExprTk)
 
 #############################################################
 ##
@@ -124,7 +125,8 @@ list(APPEND STORM_RESOURCES_HEADERS "${CMAKE_BINARY_DIR}/include/resources/3rdpa
 
 #use the shipped version of modernjson
 message (STATUS "Storm - Including ModernJSON.")
-include_directories("${PROJECT_SOURCE_DIR}/resources/3rdparty/modernjson/src/")
+add_imported_library_interface(ModernJSON "${PROJECT_SOURCE_DIR}/resources/3rdparty/modernjson/src/")
+list(APPEND STORM_LINK_LIBRARIES ModernJSON)
 
 #############################################################
 ##
@@ -218,7 +220,7 @@ if(USE_CARL)
         message(STATUS "Storm - Use system version of carl.")
         message(STATUS "Storm - Linking with carl ${carl_VERSION} (CARL_USE_CLN_NUMBERS: ${CARL_USE_CLN_NUMBERS}).")
         include_directories("${carl_INCLUDE_DIR}")
-        list(APPEND STORM_LINK_LIBRARIES ${carl_LIBRARIES})
+        list(APPEND STORM_LINK_LIBRARIES lib_carl)
     else()
         message(STATUS "Storm - Using shipped version of carl.")
         set(CARL_BUILD_COMMAND make lib_carl)
@@ -295,26 +297,6 @@ endif()
 
 
 
-#############################################################
-##
-##      GiNaC
-##
-#############################################################
-
-find_package(GiNaC QUIET)
-
-if(GINAC_FOUND)
-    set(STORM_HAVE_GINAC ON)
-    message(STATUS "Storm - Linking with GiNaC ${GINAC_VERSION_STRING}.")
-    # Right now only link with GiNaC for carl
-    #include_directories("${GINAC_INCLUDE_DIR}")
-    list(APPEND STORM_LINK_LIBRARIES ${GINAC_LIBRARIES})
-else()
-    set(STORM_HAVE_GINAC OFF)
-    #TODO: Check if CARL actually requires the use of GiNaC
-endif()
-
-
 #############################################################
 ##
 ##	gmp
diff --git a/resources/cmake/macros/export.cmake b/resources/cmake/macros/export.cmake
index 1a064fe77..ea977b70c 100644
--- a/resources/cmake/macros/export.cmake
+++ b/resources/cmake/macros/export.cmake
@@ -16,7 +16,7 @@ endforeach()
 
 include(CMakePackageConfigHelpers)
 
-set(CONF_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}/src")
+set(CONF_INCLUDE_DIRS "${CMAKE_BINARY_DIR}/include/")
 message("CMAKE_INSTALL_DIR: ${CMAKE_INSTALL_DIR}")
 configure_package_config_file(
         resources/cmake/stormConfig.cmake.in
diff --git a/resources/cmake/macros/imported.cmake b/resources/cmake/macros/imported.cmake
new file mode 100644
index 000000000..305d589f9
--- /dev/null
+++ b/resources/cmake/macros/imported.cmake
@@ -0,0 +1,59 @@
+# copied from CARL
+
+
+macro(add_imported_library_interface name include)
+	add_library(${name} INTERFACE IMPORTED)
+	set_target_properties(${name} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${include}")
+endmacro(add_imported_library_interface)
+
+macro(add_imported_library name type lib include)
+	# Workaround from https://cmake.org/Bug/view.php?id=15052
+	file(MAKE_DIRECTORY "${include}")
+	if("${lib}" STREQUAL "")
+		if("${type}" STREQUAL "SHARED")
+			add_library(${name} INTERFACE IMPORTED)
+			set_target_properties(${name} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${include}")
+		endif()
+	else()
+		add_library(${name}_${type} ${type} IMPORTED)
+		set_target_properties(${name}_${type} PROPERTIES IMPORTED_LOCATION "${lib}")
+		set_target_properties(${name}_${type} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${include}")
+	endif()
+endmacro(add_imported_library)
+
+macro(export_option name)
+	list(APPEND EXPORTED_OPTIONS "${name}")
+endmacro(export_option)
+
+macro(export_target output TARGET)
+	get_target_property(TYPE ${TARGET} TYPE)
+	if(TYPE STREQUAL "SHARED_LIBRARY")
+		get_target_property(LOCATION ${TARGET} IMPORTED_LOCATION)
+		get_target_property(INCLUDE ${TARGET} INTERFACE_INCLUDE_DIRECTORIES)
+		set(${output} "${${output}}
+add_library(${TARGET} SHARED IMPORTED)
+set_target_properties(${TARGET} PROPERTIES IMPORTED_LOCATION \"${LOCATION}\")
+set_target_properties(${TARGET} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES \"${INCLUDE}\")
+")
+	elseif(TYPE STREQUAL "STATIC_LIBRARY")
+		get_target_property(LOCATION ${TARGET} IMPORTED_LOCATION)
+		get_target_property(INCLUDE ${TARGET} INTERFACE_INCLUDE_DIRECTORIES)
+		set(${output} "${${output}}
+add_library(${TARGET} STATIC IMPORTED)
+set_target_properties(${TARGET} PROPERTIES IMPORTED_LOCATION \"${LOCATION}\")
+set_target_properties(${TARGET} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES \"${INCLUDE}\")
+")
+		if(NOT "${ARGN}" STREQUAL "")
+			set(${output} "${${output}}set_target_properties(${TARGET} PROPERTIES IMPORTED_LINK_INTERFACE_LIBRARIES \"${ARGN}\")
+")
+		endif()
+	elseif(TYPE STREQUAL "INTERFACE_LIBRARY")
+		get_target_property(INCLUDE ${TARGET} INTERFACE_INCLUDE_DIRECTORIES)
+		set(${output} "${${output}}
+add_library(${TARGET} INTERFACE IMPORTED)
+set_target_properties(${TARGET} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES \"${INCLUDE}\")
+")
+	else()
+		message(STATUS "Unknown type ${TYPE}")
+	endif()
+endmacro(export_target)