From: =?utf-8?q?Timo_R=C3=B6hling?= <timo.roehling@fkie.fraunhofer.de>
Date: Fri, 13 Mar 2020 21:57:20 +0100
Subject: Build both single and double precision version

---
 CMakeLists.txt                | 53 ++++++++++++++++++++++++++-----------------
 tinyobjloader-config.cmake.in |  7 +++++-
 tinyobjloader.pc.in           |  4 ++--
 3 files changed, 40 insertions(+), 24 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5226a95..c0ae54c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -7,8 +7,6 @@ set(TINYOBJLOADER_SOVERSION 2rc13)
 set(TINYOBJLOADER_VERSION 2.0.0-rc.13)
 set(PY_TARGET "pytinyobjloader")
 
-#optional double precision support
-option(TINYOBJLOADER_USE_DOUBLE "Build library with double precision instead of single (float)" OFF)
 option(TINYOBJLOADER_WITH_PYTHON "Build Python module(for developer). Use pyproject.toml/setup.py to build Python module for end-users" OFF)
 option(TINYOBJLOADER_PREFER_LOCAL_PYTHON_INSTALLATION
       "Prefer locally-installed Python interpreter than system or conda/brew installed Python. Please specify your Python interpreter   with `Python3_EXECUTABLE` cmake option if you enable this option."
@@ -19,11 +17,6 @@ list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/sanitizers)
 find_package(Sanitizers) # Address sanitizer (-DSANITIZE_ADDRESS=ON)
 
 
-if(TINYOBJLOADER_USE_DOUBLE)
-  set(LIBRARY_NAME ${PROJECT_NAME}_double)
-else()
-  set(LIBRARY_NAME ${PROJECT_NAME})
-endif()
 
 #Folder Shortcuts
 set(TINYOBJLOADEREXAMPLES_DIR ${CMAKE_CURRENT_SOURCE_DIR}/examples)
@@ -83,38 +76,49 @@ endif()
 
 
 
-add_library(${LIBRARY_NAME} ${tinyobjloader-Source})
-add_sanitizers(${LIBRARY_NAME})
+add_library(${PROJECT_NAME} ${tinyobjloader-Source})
+add_library(${PROJECT_NAME}::${PROJECT_NAME} ALIAS ${PROJECT_NAME})
+add_library(${PROJECT_NAME}_double ${tinyobjloader-Source})
+add_library(${PROJECT_NAME}::${PROJECT_NAME}_double ALIAS ${PROJECT_NAME}_double)
 
 if(BUILD_SHARED_LIBS)
-  set_target_properties(${LIBRARY_NAME} PROPERTIES
+  set_target_properties(${PROJECT_NAME} ${PROJECT_NAME}_double PROPERTIES
     SOVERSION ${TINYOBJLOADER_SOVERSION}
     WINDOWS_EXPORT_ALL_SYMBOLS ON
   )
+else()
+  set_target_properties(${PROJECT_NAME} ${PROJECT_NAME}_double PROPERTIES
+    POSITION_INDEPENDENT_CODE ON
+  )
 endif()
 
-if(TINYOBJLOADER_USE_DOUBLE)
-  target_compile_definitions(${LIBRARY_NAME} PUBLIC TINYOBJLOADER_USE_DOUBLE)
-endif()
+target_compile_definitions(${PROJECT_NAME}_double PUBLIC TINYOBJLOADER_USE_DOUBLE)
 
-set_target_properties(${LIBRARY_NAME} PROPERTIES VERSION ${TINYOBJLOADER_VERSION})
+set_target_properties(${PROJECT_NAME} ${PROJECT_NAME}_double PROPERTIES
+	VERSION ${TINYOBJLOADER_VERSION}
+	VISIBILITY_INLINES_HIDDEN ON
+)
 
-target_include_directories(${LIBRARY_NAME} INTERFACE
+target_include_directories(${PROJECT_NAME} INTERFACE
+  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
+  $<INSTALL_INTERFACE:${TINYOBJLOADER_INCLUDE_DIR}>
+  )
+target_include_directories(${PROJECT_NAME}_double INTERFACE
   $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
   $<INSTALL_INTERFACE:${TINYOBJLOADER_INCLUDE_DIR}>
   )
 
-export(TARGETS ${LIBRARY_NAME} FILE ${PROJECT_NAME}-targets.cmake)
+export(TARGETS ${PROJECT_NAME} ${PROJECT_NAME}_double FILE ${PROJECT_NAME}-targets.cmake)
 
 if(TINYOBJLOADER_BUILD_TEST_LOADER)
   add_executable(test_loader ${tinyobjloader-Example-Source})
-  target_link_libraries(test_loader ${LIBRARY_NAME})
+  target_link_libraries(test_loader ${PROJECT_NAME})
 endif()
 
 option(TINYOBJLOADER_BUILD_OBJ_STICHER "Build OBJ Sticher Application" OFF)
 if(TINYOBJLOADER_BUILD_OBJ_STICHER)
   add_executable(obj_sticher ${tinyobjloader-examples-objsticher})
-  target_link_libraries(obj_sticher ${LIBRARY_NAME})
+  target_link_libraries(obj_sticher ${PROJECT_NAME})
 
   install(TARGETS
     obj_sticher
@@ -163,7 +167,13 @@ write_basic_package_version_file(${PROJECT_NAME}-config-version.cmake
   )
 
 #pkg-config file
+set(LIBRARY_NAME ${PROJECT_NAME})
+set(TINYOBJLOADER_USE_DOUBLE)
+configure_file(${PROJECT_NAME}.pc.in ${LIBRARY_NAME}.pc @ONLY)
+set(LIBRARY_NAME ${PROJECT_NAME}_double)
+set(TINYOBJLOADER_USE_DOUBLE " -DTINYOBJLOADER_USE_DOUBLE")
 configure_file(${PROJECT_NAME}.pc.in ${LIBRARY_NAME}.pc @ONLY)
+unset(LIBRARY_NAME)
 
 if(DEFINED ENV{LIB_FUZZING_ENGINE})
   add_executable(fuzz_ParseFromString fuzzer/fuzz_ParseFromString.cc)
@@ -172,7 +182,7 @@ endif()
 
 #Installation
 install(TARGETS
-  ${LIBRARY_NAME}
+  ${PROJECT_NAME} ${PROJECT_NAME}_double
   EXPORT ${PROJECT_NAME}-targets
   DESTINATION
   ${TINYOBJLOADER_LIBRARY_DIR}
@@ -184,7 +194,7 @@ install(TARGETS
 install(EXPORT
   ${PROJECT_NAME}-targets
   NAMESPACE
-  tinyobjloader::
+  ${PROJECT_NAME}::
   DESTINATION
   ${TINYOBJLOADER_CMAKE_DIR}
   )
@@ -205,7 +215,8 @@ install(FILES
   ${TINYOBJLOADER_CMAKE_DIR}
   )
 install(FILES
-  "${CMAKE_CURRENT_BINARY_DIR}/${LIBRARY_NAME}.pc"
+  "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc"
+  "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_double.pc"
   DESTINATION
   ${TINYOBJLOADER_PKGCONFIG_DIR}
   )
diff --git a/tinyobjloader-config.cmake.in b/tinyobjloader-config.cmake.in
index 91f01b0..43b75d0 100644
--- a/tinyobjloader-config.cmake.in
+++ b/tinyobjloader-config.cmake.in
@@ -4,6 +4,11 @@ set(TINYOBJLOADER_VERSION "@TINYOBJLOADER_VERSION@")
 
 set_and_check(TINYOBJLOADER_INCLUDE_DIRS "@PACKAGE_TINYOBJLOADER_INCLUDE_DIR@")
 set_and_check(TINYOBJLOADER_LIBRARY_DIRS "@PACKAGE_TINYOBJLOADER_LIBRARY_DIR@")
-set(TINYOBJLOADER_LIBRARIES @LIBRARY_NAME@)
+set(TINYOBJLOADER_LIBRARIES @PROJECT_NAME@::@PROJECT_NAME@)
 
 include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@-targets.cmake")
+
+include(FindPackageHandleStandardArgs)
+set(@PROJECT_NAME@_CONFIG ${CMAKE_CURRENT_LIST_FILE})
+find_package_handle_standard_args(@PROJECT_NAME@ CONFIG_MODE)
+
diff --git a/tinyobjloader.pc.in b/tinyobjloader.pc.in
index 048a287..ce4f685 100644
--- a/tinyobjloader.pc.in
+++ b/tinyobjloader.pc.in
@@ -7,9 +7,9 @@ exec_prefix=${prefix}
 libdir=${prefix}/@TINYOBJLOADER_LIBRARY_DIR@
 includedir=${prefix}/@TINYOBJLOADER_INCLUDE_DIR@
 
-Name: @PROJECT_NAME@
+Name: @LIBRARY_NAME@
 Description: Tiny but powerful single file wavefront obj loader
 URL: https://syoyo.github.io/tinyobjloader/
 Version: @TINYOBJLOADER_VERSION@
 Libs: -L${libdir} -l@LIBRARY_NAME@
-Cflags: -I${includedir}
+Cflags: -I${includedir}@TINYOBJLOADER_USE_DOUBLE@
