From: =?utf-8?q?Timo_R=C3=B6hling?= <roehling@debian.org>
Date: Tue, 3 Aug 2021 20:00:55 +0200
Subject: Build and export shared library

---
 CMakeLists.txt                   | 21 +++++++++++++++++++++
 Source/UnitTest/cmake_core.cmake |  1 -
 Source/astcenc.h                 |  6 +++++-
 Source/cmake_core.cmake          | 24 +++++++++++++++++++++---
 4 files changed, 47 insertions(+), 5 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9392299..2c1639b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -26,6 +26,10 @@ endif()
 
 project(astcencoder VERSION 4.2.0)
 
+include(GNUInstallDirs)
+find_path(stb_INCLUDE_DIR NAMES stb.h PATH_SUFFIXES stb)
+find_package(ZLIB REQUIRED)
+
 set(CMAKE_CXX_STANDARD 14)
 set(CMAKE_CXX_STANDARD_REQUIRED ON)
 set(CMAKE_CXX_EXTENSIONS OFF)
@@ -211,6 +215,23 @@ printopt("Unit tests     " ${UNITTEST})
 # Subcomponents
 add_subdirectory(Source)
 
+include(CMakePackageConfigHelpers)
+configure_package_config_file(debian/extra/config.cmake.in astcencConfig.cmake
+    INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/astcenc
+    NO_SET_AND_CHECK_MACRO
+    NO_CHECK_REQUIRED_COMPONENTS_MACRO
+)
+write_basic_package_version_file(astcencConfigVersion.cmake
+    VERSION ${ASTCENC_VERSION}
+    COMPATIBILITY SameMinorVersion
+)
+install(FILES Source/astcenc.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
+install(EXPORT astcencTargets NAMESPACE astcenc:: DESTINATION
+    ${CMAKE_INSTALL_LIBDIR}/cmake/astcenc)
+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/astcencConfig.cmake
+    ${CMAKE_CURRENT_BINARY_DIR}/astcencConfigVersion.cmake DESTINATION
+    ${CMAKE_INSTALL_LIBDIR}/cmake/astcenc)
+
 # Configure package archive
 if(PACKAGE)
     if("${MACOS_BUILD}")
diff --git a/Source/UnitTest/cmake_core.cmake b/Source/UnitTest/cmake_core.cmake
index 2f7955b..1da3230 100644
--- a/Source/UnitTest/cmake_core.cmake
+++ b/Source/UnitTest/cmake_core.cmake
@@ -135,4 +135,3 @@ target_link_libraries(${ASTC_TEST}
 add_test(NAME ${ASTC_TEST}
          COMMAND ${ASTC_TEST})
 
-install(TARGETS ${ASTC_TEST} DESTINATION ${PACKAGE_ROOT})
diff --git a/Source/astcenc.h b/Source/astcenc.h
index 56f1ad8..7258173 100644
--- a/Source/astcenc.h
+++ b/Source/astcenc.h
@@ -164,7 +164,11 @@
 
 #if defined(ASTCENC_DYNAMIC_LIBRARY)
 	#if defined(_MSC_VER)
-		#define ASTCENC_PUBLIC extern "C" __declspec(dllexport)
+        #if defined(ASTCENC_EXPORTS)
+		    #define ASTCENC_PUBLIC extern "C" __declspec(dllexport)
+        #else
+            #define ASTCENC_PUBLIC extern "C" __declspec(dllimport)
+        #endif
 	#else
 		#define ASTCENC_PUBLIC extern "C" __attribute__ ((visibility ("default")))
 	#endif
diff --git a/Source/cmake_core.cmake b/Source/cmake_core.cmake
index a95362c..02b3485 100644
--- a/Source/cmake_core.cmake
+++ b/Source/cmake_core.cmake
@@ -26,7 +26,6 @@ set(CMAKE_THREAD_PREFER_PTHREAD ON)
 find_package(Threads REQUIRED)
 
 add_library(${ASTC_TARGET}-static
-    STATIC
         astcenc_averages_and_directions.cpp
         astcenc_block_sizes.cpp
         astcenc_color_quantize.cpp
@@ -51,10 +50,18 @@ add_library(${ASTC_TARGET}-static
         astcenc_weight_align.cpp
         astcenc_weight_quant_xfer_tables.cpp)
 
+if(BUILD_SHARED_LIBS)
+    target_compile_definitions(${ASTC_TARGET}-static
+        PUBLIC
+            ASTCENC_DYNAMIC_LIBRARY
+        PRIVATE
+            ASTCENC_EXPORTS)
+endif()
+
 target_include_directories(${ASTC_TARGET}-static
     PUBLIC
         $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
-        $<INSTALL_INTERFACE:.>)
+        $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
 
 if(${CLI})
     add_executable(${ASTC_TARGET}
@@ -66,8 +73,10 @@ if(${CLI})
         astcenccli_toplevel.cpp
         astcenccli_toplevel_help.cpp)
 
+    target_include_directories(${ASTC_TARGET} PRIVATE ${stb_INCLUDE_DIR})
     target_link_libraries(${ASTC_TARGET}
         PRIVATE
+            ZLIB::ZLIB
             ${ASTC_TARGET}-static)
 endif()
 
@@ -303,6 +312,15 @@ astcenc_set_properties(${ASTC_TARGET}-static)
         PRIVATE
             $<$<CXX_COMPILER_ID:MSVC>:/W4>)
 
+set_target_properties(${ASTC_TARGET}-static
+    PROPERTIES
+        OUTPUT_NAME ${ASTC_TARGET}
+        EXPORT_NAME ${ASTC_TARGET}
+        VERSION ${ASTCENC_VERSION}
+        SOVERSION ${ASTCENC_SOVERSION}
+)
+install(TARGETS ${ASTC_TARGET}-static DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT astcencTargets)
+
 if(${CLI})
     astcenc_set_properties(${ASTC_TARGET})
 
@@ -321,5 +339,5 @@ if(${CLI})
         PRIVATE
             ${CMAKE_CURRENT_BINARY_DIR})
 
-    install(TARGETS ${ASTC_TARGET} DESTINATION ${PACKAGE_ROOT})
+    install(TARGETS ${ASTC_TARGET} DESTINATION ${CMAKE_INSTALL_BINDIR})
 endif()
