From a709a89b27b41dfb24b71cbfc08c11fdbe95436b Mon Sep 17 00:00:00 2001
From: Aaron Bray <aaron.bray@kitware.com>
Date: Tue, 24 Mar 2020 21:46:21 -0400
Subject: [PATCH] Cmake updates for proper generation of iMSTKConfig.cmake

---
 CMake/External/CMakeLists.txt                 |  13 +-
 CMake/External/External_Assimp.cmake          |   2 +-
 CMake/External/External_Eigen3.cmake          |   7 +-
 CMake/External/External_FTD2XX.cmake          |   2 +-
 ..._GoogleTest.cmake => External_GTest.cmake} |   6 +-
 CMake/External/External_LibNiFalcon.cmake     |   2 +-
 CMake/External/External_Libusb.cmake          |   2 +-
 CMake/External/External_OpenHaptics.cmake     |   2 +-
 CMake/External/External_PThreads.cmake        |   2 +-
 CMake/External/External_SCCD.cmake            |   2 +-
 CMake/External/External_SFML.cmake            |   2 +-
 CMake/External/External_VRPN.cmake            |   2 +-
 CMake/External/External_VTK.cmake             |   6 +-
 CMake/External/External_VegaFEM.cmake         |   7 +-
 CMake/External/External_Vulkan.cmake          |   2 +-
 CMake/External/External_g3log.cmake           |   2 +-
 CMake/External/External_glfw.cmake            |   2 +-
 CMake/External/External_gli.cmake             |   2 +-
 CMake/External/External_glm.cmake             |   2 +-
 CMake/External/External_imgui.cmake           |   2 +-
 CMake/External/External_openvr.cmake          |   3 +-
 CMake/External/External_tbb.cmake             |   2 +-
 CMake/FindGoogleMock.cmake                    |  12 --
 CMake/FindGoogleTest.cmake                    |  13 --
 CMake/Findglm.cmake                           |   9 --
 CMake/Utilities/imstkAddExecutable.cmake      |   2 +-
 CMake/Utilities/imstkAddLibrary.cmake         |  14 +-
 CMake/Utilities/imstkAddTest.cmake            |   4 +-
 CMake/Utilities/imstkFind.cmake               |  13 +-
 CMakeLists.txt                                | 103 +++++++-----
 iMSTKConfig.cmake.in                          | 152 +++++++++++-------
 31 files changed, 220 insertions(+), 176 deletions(-)
 rename CMake/External/{External_GoogleTest.cmake => External_GTest.cmake} (74%)
 delete mode 100644 CMake/FindGoogleMock.cmake
 delete mode 100644 CMake/FindGoogleTest.cmake
 delete mode 100644 CMake/Findglm.cmake

diff --git a/CMake/External/CMakeLists.txt b/CMake/External/CMakeLists.txt
index f800cd99a..f668d532d 100644
--- a/CMake/External/CMakeLists.txt
+++ b/CMake/External/CMakeLists.txt
@@ -91,16 +91,21 @@ ExternalProject_Add( ${PROJECT_NAME}
   BINARY_DIR ${CMAKE_BINARY_DIR}/Innerbuild
   ${COMMON_CMAKE_EP_ARGS}
   CMAKE_ARGS
-    -DEigen3_DIR:PATH=${Eigen3_DIR}
-    -DVTK_DIR:PATH=${VTK_DIR}
+    -D${PROJECT_NAME}_SUPERBUILD:BOOL=OFF
     -D${PROJECT_NAME}_BUILD_EXAMPLES:BOOL=${${PROJECT_NAME}_BUILD_EXAMPLES}
     -D${PROJECT_NAME}_BUILD_TESTING:BOOL=${${PROJECT_NAME}_BUILD_TESTING}
-    -DPHYSX_CONFIGURATION:STRING=${${PROJECT_NAME}_PHYSX_CONFIGURATION}
-    -D${PROJECT_NAME}_SUPERBUILD:BOOL=OFF
     -D${PROJECT_NAME}_USE_OpenHaptics:BOOL=${${PROJECT_NAME}_USE_OpenHaptics}
     -D${PROJECT_NAME}_USE_Vulkan:BOOL=${${PROJECT_NAME}_USE_Vulkan}
     -D${PROJECT_NAME}_ENABLE_AUDIO:BOOL=${${PROJECT_NAME}_ENABLE_AUDIO}
     -D${PROJECT_NAME}_ENABLE_VR:BOOL=${${PROJECT_NAME}_ENABLE_VR}
+    # External Libraries
+    -DEigen3_DIR:PATH=${Eigen3_DIR}
+    -Dglm_DIR:PATH=${glm_DIR}
+    -DGTest_DIR:PATH=${GTest_DIR}
+    -DVegaFEM_DIR:PATH=${VegaFEM_DIR}
+    -DVTK_DIR:PATH=${VTK_DIR}
+    # I don't think this is needed by the inner build
+    # -DPHYSX_CONFIGURATION:STRING=${${PROJECT_NAME}_PHYSX_CONFIGURATION}
   DEPENDS ${${PROJECT_NAME}_DEPENDENCIES}
   PATCH_COMMAND 
     COMMAND ${VTK_PATCH_COMMAND}
diff --git a/CMake/External/External_Assimp.cmake b/CMake/External/External_Assimp.cmake
index a4a6ee1a9..aaca9c075 100644
--- a/CMake/External/External_Assimp.cmake
+++ b/CMake/External/External_Assimp.cmake
@@ -14,4 +14,4 @@ imstk_add_external_project( Assimp
   RELATIVE_INCLUDE_PATH "include"
   #DEPENDENCIES ""
   #VERBOSE
-  )
\ No newline at end of file
+)
diff --git a/CMake/External/External_Eigen3.cmake b/CMake/External/External_Eigen3.cmake
index cf37a35d6..f86d8b8f7 100644
--- a/CMake/External/External_Eigen3.cmake
+++ b/CMake/External/External_Eigen3.cmake
@@ -10,5 +10,8 @@ imstk_add_external_project( Eigen3
   RELATIVE_INCLUDE_PATH ""
   DEPENDENCIES ""
   #VERBOSE
-  )
-set(Eigen3_DIR ${PhysX_INSTALL_DIR}/install/share/eigen3/cmake)
\ No newline at end of file
+)
+if(NOT USE_SYSTEM_Eigen3)
+  set(Eigen3_DIR ${CMAKE_INSTALL_PREFIX}/share/eigen3/cmake)
+  #message(STATUS "Eigen3_DIR : ${Eigen3_DIR}")
+endif()
diff --git a/CMake/External/External_FTD2XX.cmake b/CMake/External/External_FTD2XX.cmake
index 0de1d0f1b..533ad866d 100644
--- a/CMake/External/External_FTD2XX.cmake
+++ b/CMake/External/External_FTD2XX.cmake
@@ -53,4 +53,4 @@ imstk_add_external_project( FTD2XX
     COMMAND ${copy_ftd2xx_dll_command}
   RELATIVE_INCLUDE_PATH "/"
   #VERBOSE
-  )
+)
diff --git a/CMake/External/External_GoogleTest.cmake b/CMake/External/External_GTest.cmake
similarity index 74%
rename from CMake/External/External_GoogleTest.cmake
rename to CMake/External/External_GTest.cmake
index 5f306e963..1376e836a 100644
--- a/CMake/External/External_GoogleTest.cmake
+++ b/CMake/External/External_GTest.cmake
@@ -2,7 +2,7 @@
 # Add External Project
 #-----------------------------------------------------------------------------
 include(imstkAddExternalProject)
-imstk_add_external_project( GoogleTest
+imstk_add_external_project( GTest
   URL https://github.com/google/googletest/archive/release-1.10.0.zip
   URL_MD5 82358affdd7ab94854c8ee73a180fc53
   CMAKE_CACHE_ARGS
@@ -13,3 +13,7 @@ imstk_add_external_project( GoogleTest
   RELATIVE_INCLUDE_PATH ""
   #VERBOSE
   )
+if(NOT USE_SYSTEM_GTest)
+  set(GTest_DIR ${CMAKE_INSTALL_PREFIX}/lib/cmake/GTest)
+  message(STATUS "GTest_DIR : ${GTest_DIR}")
+endif()
diff --git a/CMake/External/External_LibNiFalcon.cmake b/CMake/External/External_LibNiFalcon.cmake
index 1c4e34344..2d8a7b06d 100644
--- a/CMake/External/External_LibNiFalcon.cmake
+++ b/CMake/External/External_LibNiFalcon.cmake
@@ -18,4 +18,4 @@ imstk_add_external_project( LibNiFalcon
   DEPENDENCIES ${LIBNIFALCON_DEPENDENCIES}
   RELATIVE_INCLUDE_PATH "include/ftd2xx"
   #VERBOSE
-  )
\ No newline at end of file
+)
diff --git a/CMake/External/External_Libusb.cmake b/CMake/External/External_Libusb.cmake
index 70cfe21be..047f5a0c3 100644
--- a/CMake/External/External_Libusb.cmake
+++ b/CMake/External/External_Libusb.cmake
@@ -53,4 +53,4 @@ imstk_add_external_project( Libusb
     COMMAND ${copy_libusb_dll_command}
   RELATIVE_INCLUDE_PATH "include/libusb-1.0"
   #VERBOSE
-  )
+)
diff --git a/CMake/External/External_OpenHaptics.cmake b/CMake/External/External_OpenHaptics.cmake
index 9f5dc72fc..d7cd1dcdc 100644
--- a/CMake/External/External_OpenHaptics.cmake
+++ b/CMake/External/External_OpenHaptics.cmake
@@ -46,4 +46,4 @@ imstk_add_external_project( OpenHaptics
     COMMAND ${CMAKE_COMMAND} -E copy ${open_haptics_util_libs_dir}/hlu.${lib_ext} ${open_haptics_libs_dest}
   RELATIVE_INCLUDE_PATH "/"
   #VERBOSE
-  )
+)
diff --git a/CMake/External/External_PThreads.cmake b/CMake/External/External_PThreads.cmake
index e44e2eeed..328630d21 100644
--- a/CMake/External/External_PThreads.cmake
+++ b/CMake/External/External_PThreads.cmake
@@ -11,4 +11,4 @@ imstk_add_external_project( PThreads
   RELATIVE_INCLUDE_PATH "include"
   DEPENDENCIES ""
   #VERBOSE
-  )
\ No newline at end of file
+)
diff --git a/CMake/External/External_SCCD.cmake b/CMake/External/External_SCCD.cmake
index 622efe0a3..8eeb8e9c5 100644
--- a/CMake/External/External_SCCD.cmake
+++ b/CMake/External/External_SCCD.cmake
@@ -40,4 +40,4 @@ imstk_add_external_project( SCCD
   DEPENDENCIES
     Eigen3
   #VERBOSE
-  )
+)
diff --git a/CMake/External/External_SFML.cmake b/CMake/External/External_SFML.cmake
index 0cfc452f7..fd54e7fba 100644
--- a/CMake/External/External_SFML.cmake
+++ b/CMake/External/External_SFML.cmake
@@ -15,4 +15,4 @@ imstk_add_external_project( SFML
   #DEPENDENCIES ""
   #RELATIVE_INCLUDE_PATH ""
   #VERBOSE
-  )
\ No newline at end of file
+)
diff --git a/CMake/External/External_VRPN.cmake b/CMake/External/External_VRPN.cmake
index ee0b1aa3c..021fcf912 100644
--- a/CMake/External/External_VRPN.cmake
+++ b/CMake/External/External_VRPN.cmake
@@ -55,4 +55,4 @@ imstk_add_external_project( VRPN
   DEPENDENCIES ${VRPN_DEPENDENCIES}
   RELATIVE_INCLUDE_PATH ""
   #VERBOSE
-  )
+)
diff --git a/CMake/External/External_VTK.cmake b/CMake/External/External_VTK.cmake
index 33f260d5c..694102835 100644
--- a/CMake/External/External_VTK.cmake
+++ b/CMake/External/External_VTK.cmake
@@ -89,4 +89,8 @@ imstk_add_external_project( VTK
   DEPENDENCIES ${VTK_DEPENDENCIES}
   RELATIVE_INCLUDE_PATH ""
   #VERBOSE
-  )
+)
+if(NOT USE_SYSTEM_VTK)
+  set(VTK_DIR ${CMAKE_INSTALL_PREFIX}/lib/cmake/vtk-8.2)
+  message(STATUS "VTK_DIR : ${VTK_DIR}")
+endif()
diff --git a/CMake/External/External_VegaFEM.cmake b/CMake/External/External_VegaFEM.cmake
index 386cbdcdc..7165effa2 100644
--- a/CMake/External/External_VegaFEM.cmake
+++ b/CMake/External/External_VegaFEM.cmake
@@ -18,4 +18,9 @@ imstk_add_external_project( VegaFEM
   DEPENDENCIES ${VegaFEM_DEPENDENCIES}
   RELATIVE_INCLUDE_PATH ""
   #VERBOSE
-  )
+)
+if(NOT USE_SYSTEM_VegaFEM)
+  set(VegaFEM_DIR ${CMAKE_INSTALL_PREFIX}/lib/cmake/VegaFEM)
+  message(STATUS "VegaFEM_DIR : ${VegaFEM_DIR}")
+endif()
+
diff --git a/CMake/External/External_Vulkan.cmake b/CMake/External/External_Vulkan.cmake
index 617fc84dd..bd69429f5 100644
--- a/CMake/External/External_Vulkan.cmake
+++ b/CMake/External/External_Vulkan.cmake
@@ -34,4 +34,4 @@ imstk_add_external_project( Vulkan
     COMMAND ${CMAKE_COMMAND} -E copy_directory ${vulkan_bin_dir} ${vulkan_bin_dest}
   RELATIVE_INCLUDE_PATH "/"
   #VERBOSE
-  )
+)
diff --git a/CMake/External/External_g3log.cmake b/CMake/External/External_g3log.cmake
index d3e66c75c..7c4766a3b 100644
--- a/CMake/External/External_g3log.cmake
+++ b/CMake/External/External_g3log.cmake
@@ -32,4 +32,4 @@ imstk_add_external_project( g3log
   RELATIVE_INCLUDE_PATH "src"
   DEPENDENCIES ""
   #VERBOSE
-  )
+)
diff --git a/CMake/External/External_glfw.cmake b/CMake/External/External_glfw.cmake
index 0425b4414..ee9acff81 100644
--- a/CMake/External/External_glfw.cmake
+++ b/CMake/External/External_glfw.cmake
@@ -12,4 +12,4 @@ imstk_add_external_project( glfw
   RELATIVE_INCLUDE_PATH ""
   DEPENDENCIES ""
   #VERBOSE
-  )
+)
diff --git a/CMake/External/External_gli.cmake b/CMake/External/External_gli.cmake
index 0027d3916..04c14650e 100644
--- a/CMake/External/External_gli.cmake
+++ b/CMake/External/External_gli.cmake
@@ -8,4 +8,4 @@ imstk_add_external_project( gli
   RELATIVE_INCLUDE_PATH ""
   DEPENDENCIES ""
   #VERBOSE
-  )
+)
diff --git a/CMake/External/External_glm.cmake b/CMake/External/External_glm.cmake
index 29089bcb5..c371bc4f9 100644
--- a/CMake/External/External_glm.cmake
+++ b/CMake/External/External_glm.cmake
@@ -8,4 +8,4 @@ imstk_add_external_project( glm
   RELATIVE_INCLUDE_PATH ""
   DEPENDENCIES ""
   #VERBOSE
-  )
+)
diff --git a/CMake/External/External_imgui.cmake b/CMake/External/External_imgui.cmake
index 8c3f484de..e2ca532eb 100644
--- a/CMake/External/External_imgui.cmake
+++ b/CMake/External/External_imgui.cmake
@@ -31,4 +31,4 @@ imstk_add_external_project( imgui
   RELATIVE_INCLUDE_PATH ""
   DEPENDENCIES ""
   #VERBOSE
-  )
+)
diff --git a/CMake/External/External_openvr.cmake b/CMake/External/External_openvr.cmake
index f6b689116..2437d8b4e 100644
--- a/CMake/External/External_openvr.cmake
+++ b/CMake/External/External_openvr.cmake
@@ -65,4 +65,5 @@ imstk_add_external_project( openvr
     COMMAND ${copy_openvr_dll_command}
   RELATIVE_INCLUDE_PATH "headers"
   #VERBOSE
-  )
+)
+
diff --git a/CMake/External/External_tbb.cmake b/CMake/External/External_tbb.cmake
index f6d303dd0..576917acd 100644
--- a/CMake/External/External_tbb.cmake
+++ b/CMake/External/External_tbb.cmake
@@ -9,4 +9,4 @@ imstk_add_external_project(tbb
     -DTBB_BUILD_TESTS:BOOL=OFF
   RELATIVE_INCLUDE_PATH ""
   #VERBOSE
-  )
\ No newline at end of file
+)
diff --git a/CMake/FindGoogleMock.cmake b/CMake/FindGoogleMock.cmake
deleted file mode 100644
index 5be0566c0..000000000
--- a/CMake/FindGoogleMock.cmake
+++ /dev/null
@@ -1,12 +0,0 @@
-include(imstkFind)
-#-----------------------------------------------------------------------------
-# Find All Headers and Libraries for GoogleMock
-#-----------------------------------------------------------------------------
-
-imstk_find_header(GoogleMock gmock/gmock.h)
-imstk_find_libary(GoogleMock gmock)
-imstk_find_libary(GoogleMock gmock_main)
-imstk_find_package(GoogleMock)
-
-#message(STATUS "GoogleMock include : ${GOOGLEMOCK_INCLUDE_DIRS}")
-#message(STATUS "GoogleMock libraries : ${GOOGLEMOCK_LIBRARIES}")
diff --git a/CMake/FindGoogleTest.cmake b/CMake/FindGoogleTest.cmake
deleted file mode 100644
index 366d85231..000000000
--- a/CMake/FindGoogleTest.cmake
+++ /dev/null
@@ -1,13 +0,0 @@
-include(imstkFind)
-#-----------------------------------------------------------------------------
-# Find All Headers and Libraries for GoogleTest
-#-----------------------------------------------------------------------------
-
-imstk_find_header(GoogleTest gtest/gtest.h)
-imstk_find_libary(GoogleTest gtest)
-imstk_find_libary(GoogleTest gtest_main)
-imstk_find_package(GoogleTest)
-
-#message(STATUS "GoogleTest include : ${GOOGLETEST_INCLUDE_DIRS}")
-#message(STATUS "GoogleTest libraries : ${GOOGLETEST_LIBRARIES}")
-
diff --git a/CMake/Findglm.cmake b/CMake/Findglm.cmake
deleted file mode 100644
index 9857d9c58..000000000
--- a/CMake/Findglm.cmake
+++ /dev/null
@@ -1,9 +0,0 @@
-include(imstkFind)
-#-----------------------------------------------------------------------------
-# Find All Headers and Libraries for glm
-#-----------------------------------------------------------------------------
-
-imstk_find_header(glm glm/glm.hpp)
-imstk_find_header_package(glm)
-
-#message(STATUS "glm include : ${GLM_INCLUDE_DIRS}")
diff --git a/CMake/Utilities/imstkAddExecutable.cmake b/CMake/Utilities/imstkAddExecutable.cmake
index 833f250c9..7b86bfe3a 100644
--- a/CMake/Utilities/imstkAddExecutable.cmake
+++ b/CMake/Utilities/imstkAddExecutable.cmake
@@ -12,5 +12,5 @@ macro(imstk_add_executable target)
   set_target_properties(${target} PROPERTIES
     DEBUG_POSTFIX "${CMAKE_DEBUG_POSTFIX}")
   add_custom_command(TARGET ${target} POST_BUILD
-                   COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${target}> ${iMSTK_INSTALL_BIN_DIR})
+                   COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${target}> ${CMAKE_INSTALL_PREFIX}/bin)
 endmacro()
diff --git a/CMake/Utilities/imstkAddLibrary.cmake b/CMake/Utilities/imstkAddLibrary.cmake
index 205657d4c..3b6c47a00 100644
--- a/CMake/Utilities/imstkAddLibrary.cmake
+++ b/CMake/Utilities/imstkAddLibrary.cmake
@@ -69,7 +69,7 @@ function(imstk_add_library target)
     list(APPEND ${target}_LIBRARIES "${d}")
   endforeach()
   #message(STATUS "${target} using libraries : ${${target}_LIBRARIES}")
-  target_link_libraries( ${target}
+  target_link_libraries( ${target} PUBLIC
     ${${target}_LIBRARIES}
     )
 
@@ -78,7 +78,7 @@ function(imstk_add_library target)
   #-----------------------------------------------------------------------------
   target_include_directories( ${target} PUBLIC
     ${target_BUILD_INTERFACE_LIST}
-    $<INSTALL_INTERFACE:${iMSTK_INSTALL_INCLUDE_DIR}>
+    $<INSTALL_INTERFACE:${${PROJECT_NAME}_INSTALL_FOLDER}>
     )
 
   #-----------------------------------------------------------------------------
@@ -95,17 +95,17 @@ function(imstk_add_library target)
   #-----------------------------------------------------------------------------
   install( FILES
     ${target_H_FILES}
-    DESTINATION ${iMSTK_INSTALL_INCLUDE_DIR}
+    DESTINATION include
     COMPONENT Development
     )
 
   #-----------------------------------------------------------------------------
   # Install library
   #-----------------------------------------------------------------------------
-  install( TARGETS ${target} EXPORT iMSTK_TARGETS
-    RUNTIME DESTINATION ${iMSTK_INSTALL_BIN_DIR} COMPONENT RuntimeLibraries
-    LIBRARY DESTINATION ${iMSTK_INSTALL_LIB_DIR} COMPONENT RuntimeLibraries
-    ARCHIVE DESTINATION ${iMSTK_INSTALL_LIB_DIR} COMPONENT Development
+  install( TARGETS ${target} EXPORT ${PROJECT_NAME}Targets
+    RUNTIME DESTINATION bin COMPONENT RuntimeLibraries
+    LIBRARY DESTINATION lib COMPONENT RuntimeLibraries
+    ARCHIVE DESTINATION lib COMPONENT Development
     )
 	
 	
diff --git a/CMake/Utilities/imstkAddTest.cmake b/CMake/Utilities/imstkAddTest.cmake
index 53d783c4f..20c49cd26 100644
--- a/CMake/Utilities/imstkAddTest.cmake
+++ b/CMake/Utilities/imstkAddTest.cmake
@@ -38,7 +38,7 @@ function(GTEST_ADD_TESTS executable extra_args)
             continue()
           endif()
           add_test(NAME ${test_name} COMMAND ${executable} ${extra_args} --gtest_filter=${test_name} WORKING_DIRECTORY ${CMAKE_INSTALL_PREFIX}/bin) # changed here
-		  
+
         endforeach()
     endforeach()
 endfunction()
@@ -118,7 +118,7 @@ function(imstk_add_test target)
   # Link test driver against current target, gtest and pthread
   target_link_libraries(${test_driver_executable}
     ${target}
-    ${GOOGLETEST_LIBRARIES}
+    GTest::gtest
     Threads::Threads
   )
   
diff --git a/CMake/Utilities/imstkFind.cmake b/CMake/Utilities/imstkFind.cmake
index c35d4cff1..d92d5f597 100644
--- a/CMake/Utilities/imstkFind.cmake
+++ b/CMake/Utilities/imstkFind.cmake
@@ -1,4 +1,7 @@
 include(FindPackageHandleStandardArgs)
+if(NOT PACKAGE_PREFIX_DIR)
+  set(PACKAGE_PREFIX_DIR ${CMAKE_INSTALL_PREFIX})
+endif()
 #-----------------------------------------------------------------------------
 # Look for header directory
 #-----------------------------------------------------------------------------
@@ -27,9 +30,9 @@ macro(imstk_find_header package header)
     if(${package}_ROOT_DIR)
       set(_SEARCH_DIR ${${package}_ROOT_DIR}/${sub_dir})
     else()
-      set(_SEARCH_DIR ${CMAKE_INSTALL_PREFIX}/include/${sub_dir})
+      set(_SEARCH_DIR ${PACKAGE_PREFIX_DIR}/include/${sub_dir})
     endif()
-    #message(STATUS "Searching for : ${_SEARCH_DIR}/${header}")
+    message(STATUS "Searching for : ${_SEARCH_DIR}/${header}")
 
     find_path(${package}_INCLUDE_DIR
       NAMES
@@ -45,7 +48,7 @@ macro(imstk_find_header package header)
         ${header}
     )
   endif()
-  #message(STATUS "Found it : ${${package}_INCLUDE_DIR}/${header}")
+  message(STATUS "Found it : ${${package}_INCLUDE_DIR}/${header}")
   
 
   if (EXISTS ${${package}_INCLUDE_DIR}/${header})
@@ -55,7 +58,7 @@ macro(imstk_find_header package header)
   else()
     message(FATAL_ERROR "Could not find ${${package}_INCLUDE_DIR}/${header}")
   endif()
-  #message(STATUS "${package}_INCLUDE_DIRS : ${${package}_INCLUDE_DIRS}")
+  message(STATUS "${package}_INCLUDE_DIRS : ${${package}_INCLUDE_DIRS}")
   unset(${package}_INCLUDE_DIR CACHE)
 endmacro()
 
@@ -99,7 +102,7 @@ macro(imstk_find_libary package library)
       endif()
       #message(STATUS "Looking for ${package} libs in ${_SEARCH_DIR}")
     else()
-      set(_SEARCH_DIR ${CMAKE_INSTALL_PREFIX}/lib)
+      set(_SEARCH_DIR ${PACKAGE_PREFIX_DIR}/lib)
     endif()
     
     
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ecc53f55d..2e519907a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -25,19 +25,14 @@ set(CMAKE_PREFIX_PATH ${CMAKE_INSTALL_PREFIX})
 #-----------------------------------------------------------------------------
 # Project install directories
 #-----------------------------------------------------------------------------
-if(APPLE)
-  set(${PROJECT_NAME}_INSTALL_ROOT "${CMAKE_INSTALL_PREFIX}/${${PROJECT_NAME}_MAIN_PROJECT_APPLICATION_NAME}.app/Contents") # Set to create Bundle
-else()
-  set(${PROJECT_NAME}_INSTALL_ROOT "${CMAKE_INSTALL_PREFIX}")
+if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
+  set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/install CACHE PATH "Install location" FORCE)
 endif()
-set(${PROJECT_NAME}_INSTALL_BIN_DIR "${${PROJECT_NAME}_INSTALL_ROOT}/bin")
-set(${PROJECT_NAME}_INSTALL_LIB_DIR "${${PROJECT_NAME}_INSTALL_ROOT}/lib")
-set(${PROJECT_NAME}_INSTALL_INCLUDE_DIR "${${PROJECT_NAME}_INSTALL_ROOT}/include/imstk-${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}")
-set(${PROJECT_NAME}_INSTALL_SHARE_DIR "${${PROJECT_NAME}_INSTALL_ROOT}")
+set(CMAKE_PREFIX_PATH ${CMAKE_INSTALL_PREFIX})
 # Let's go ahead and make these directories
-file(MAKE_DIRECTORY ${${PROJECT_NAME}_INSTALL_BIN_DIR})
-file(MAKE_DIRECTORY ${${PROJECT_NAME}_INSTALL_LIB_DIR})
-file(MAKE_DIRECTORY ${${PROJECT_NAME}_INSTALL_SHARE_DIR})
+file(MAKE_DIRECTORY ${CMAKE_INSTALL_PREFIX}/bin)
+file(MAKE_DIRECTORY ${CMAKE_INSTALL_PREFIX}/include)
+file(MAKE_DIRECTORY ${CMAKE_INSTALL_PREFIX}/lib)
 
 #-----------------------------------------------------------------------------
 # Update CMake module path & cmake dir
@@ -111,6 +106,7 @@ if(${PROJECT_NAME}_SUPERBUILD)
   endif()
 
   option(${PROJECT_NAME}_USE_Vulkan "Use the custom Vulkan renderer." OFF)
+  option(${PROJECT_NAME}_USE_OpenHaptics "Use OpenHaptic Support." OFF)
 
   imstk_define_dependency(Assimp)
   imstk_define_dependency(Eigen3)
@@ -152,7 +148,7 @@ if(${PROJECT_NAME}_SUPERBUILD)
   endif()
 
   if(${PROJECT_NAME}_BUILD_TESTING)
-    imstk_define_dependency(GoogleTest)
+    imstk_define_dependency(GTest)
 
     #-----------------------------------------------------------------------------
     # Allow CTest to cover Innerbuild
@@ -180,7 +176,6 @@ if(${PROJECT_NAME}_SUPERBUILD)
 
 endif()
 
-
 #-----------------------------------------------------------------------------
 #                               INNERBUILD
 #-----------------------------------------------------------------------------
@@ -189,7 +184,8 @@ endif()
 # Find external dependencies
 #-----------------------------------------------------------------------------
 include(imstkFind)
-
+# Set where to look for packages (If not using system)
+set(PACKAGE_PREFIX_DIR ${CMAKE_INSTALL_PREFIX})
 
 # Assimp
 find_package( Assimp REQUIRED )
@@ -313,10 +309,7 @@ endif(Uncrustify_EXECUTABLE)
 
 # Google Test
 if(${PROJECT_NAME}_BUILD_TESTING)
-  find_package( GoogleTest REQUIRED )
-  include_directories(${GOOGLETEST_INCLUDE_DIRS})
-  find_package( GoogleMock REQUIRED )
-  include_directories(${GOOGLEMOCK_INCLUDE_DIRS})
+  find_package( GTest REQUIRED NO_DEFAULT_PATH)
 endif()
 
 #-----------------------------------------------------------------------------
@@ -340,6 +333,9 @@ if(${PROJECT_NAME}_BUILD_TESTING OR ${PROJECT_NAME}_BUILD_EXAMPLES)
   CopyAndCompileShaders()
 endif()
 
+# Folder name to put our headers/cmake config files under
+set(${PROJECT_NAME}_INSTALL_FOLDER ${PROJECT_NAME}-${${PROJECT_NAME}_VERSION_MAJOR}.${${PROJECT_NAME}_VERSION_MINOR})
+
 #--------------------------------------------------------------------------
 # Add Source code subdirectories
 #--------------------------------------------------------------------------
@@ -383,6 +379,17 @@ if(NOT WIN32)
     )
 endif()
 
+#--------------------------------------------------------------------------
+# Install Find Modules
+#--------------------------------------------------------------------------
+set(${PROJECT_NAME}_INSTALL_CONFIG_DIR "lib/cmake/${${PROJECT_NAME}_INSTALL_FOLDER}")
+file(MAKE_DIRECTORY ${CMAKE_INSTALL_PREFIX}/${${PROJECT_NAME}_INSTALL_CONFIG_DIR}/modules)
+file(GLOB modules ${CMAKE_SOURCE_DIR}/CMake/Find*.cmake)
+foreach(module ${modules})
+  install(FILES ${module} DESTINATION "${${PROJECT_NAME}_INSTALL_CONFIG_DIR}/modules")
+endforeach()
+install(FILES ${CMAKE_SOURCE_DIR}/CMake/Utilities/imstkFind.cmake DESTINATION "${${PROJECT_NAME}_INSTALL_CONFIG_DIR}/modules")
+
 #--------------------------------------------------------------------------
 # Innerbuild dummy test
 #--------------------------------------------------------------------------
@@ -394,38 +401,56 @@ add_test(
 #--------------------------------------------------------------------------
 # Export Targets
 #--------------------------------------------------------------------------
+# This variable controls the prefix used to generate the following files:
+#  ${PROJECT_NAME}ConfigVersion.cmake
+#  ${PROJECT_NAME}Config.cmake
+#  ${PROJECT_NAME}Targets.cmake
+# and it also used to initialize ${PROJECT_NAME}_INSTALL_CONFIG_DIR value.
+set(export_config_name ${PROJECT_NAME})
 string(TOLOWER "${PROJECT_NAME}" PROJECT_NAMESPACE)
 set(PROJECT_NAMESPACE "${PROJECT_NAMESPACE}::")
-
+#------------------------------------------------------------------------------
+# Configure ${PROJECT_NAME}ConfigVersion.cmake common to build and install tree
 include(CMakePackageConfigHelpers)
+set(config_version_file ${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake)
 write_basic_package_version_file(
-  "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
-  VERSION ${Upstream_VERSION}
+  ${config_version_file}
+  VERSION "${${PROJECT_NAME}_VERSION}"
   COMPATIBILITY AnyNewerVersion
   )
-export(EXPORT ${PROJECT_NAME}_TARGETS
+#------------------------------------------------------------------------------
+# Export '${PROJECT_NAME}Targets.cmake' for a build tree
+export(
+  EXPORT ${PROJECT_NAME}Targets
   FILE ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Targets.cmake
   NAMESPACE ${PROJECT_NAMESPACE}
   )
-configure_file(${PROJECT_NAME}Config.cmake.in
-  "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
-  @ONLY
+# Configure '${PROJECT_NAME}Config.cmake' for a build tree
+set(build_config ${CMAKE_BINARY_DIR}/${PROJECT_NAME}Config.cmake)
+configure_package_config_file(
+  ${PROJECT_NAME}Config.cmake.in
+  ${build_config}
+  INSTALL_DESTINATION "${PROJECT_BINARY_DIR}"
   )
 
-install(EXPORT ${PROJECT_NAME}_TARGETS
-  FILE
-    ${PROJECT_NAME}Targets.cmake
-  NAMESPACE
-    ${PROJECT_NAMESPACE}
-  DESTINATION
-    ${${PROJECT_NAME}_INSTALL_SHARE_DIR}
+#------------------------------------------------------------------------------
+# Export '${PROJECT_NAME}Targets.cmake' for an install tree
+install(
+  EXPORT ${PROJECT_NAME}Targets
+  FILE ${PROJECT_NAME}Targets.cmake
+  NAMESPACE ${PROJECT_NAMESPACE}
+  DESTINATION ${${PROJECT_NAME}_INSTALL_CONFIG_DIR}
+  )
+  
+set(install_config ${PROJECT_BINARY_DIR}/CMakeFiles/${PROJECT_NAME}Config.cmake)
+configure_package_config_file(
+  ${PROJECT_NAME}Config.cmake.in 
+  ${install_config}
+  INSTALL_DESTINATION ${${PROJECT_NAME}_INSTALL_CONFIG_DIR}
   )
+
+# Install config files
 install(
-  FILES
-    "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
-    "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
-  DESTINATION
-    ${${PROJECT_NAME}_INSTALL_SHARE_DIR}
-  COMPONENT
-    Devel
+  FILES ${config_version_file} ${install_config}
+  DESTINATION "${${PROJECT_NAME}_INSTALL_CONFIG_DIR}"
   )
diff --git a/iMSTKConfig.cmake.in b/iMSTKConfig.cmake.in
index 90b11ba31..29d8ef227 100644
--- a/iMSTKConfig.cmake.in
+++ b/iMSTKConfig.cmake.in
@@ -1,98 +1,126 @@
-# Include and library paths
-set(CMAKE_INCLUDE_PATH "@CMAKE_INCLUDE_PATH@")
-set(CMAKE_LIBRARY_PATH "@CMAKE_LIBRARY_PATH@")
-
-# Path to iMSTK source directory
-set(iMSTK_SOURCE_DIR "@CMAKE_CURRENT_SOURCE_DIR@")
-set(iMSTK_BINARY_DIR "@CMAKE_BINARY_DIR@")
-set(iMSTK_INSTALL_ROOT "@iMSTK_INSTALL_ROOT@")
-
-# Update CMake module path
-list(INSERT CMAKE_MODULE_PATH 0 "${iMSTK_SOURCE_DIR}/CMake")
-list(INSERT CMAKE_MODULE_PATH 1 "${iMSTK_SOURCE_DIR}/CMake/Utilities")
-
-# The Find scripts use cmake variables so overwrite them
-set(CMAKE_INSTALL_PREFIX_CACHE ${CMAKE_INSTALL_PREFIX})
-set(CMAKE_BINARY_DIR_CACHE ${CMAKE_BINARY_DIR})
-set(CMAKE_DEBUG_POSTFIX_CACHE ${CMAKE_DEBUG_POSTFIX})
-
-set(CMAKE_INSTALL_PREFIX ${iMSTK_INSTALL_ROOT} CACHE STRING "" FORCE)
-mark_as_advanced(CMAKE_INSTALL_PREFIX)
-set(CMAKE_BINARY_DIR ${iMSTK_BINARY_DIR} CACHE STRING "" FORCE)
-mark_as_advanced(CMAKE_BINARY_DIR)
-set(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "" FORCE)
-mark_as_advanced(CMAKE_DEBUG_POSTFIX)
+@PACKAGE_INIT@
+
+set(export_config_name "@export_config_name@")
+
+set_and_check(${export_config_name}Targets "${CMAKE_CURRENT_LIST_DIR}/${export_config_name}Targets.cmake")
+
+include(${${export_config_name}Targets})
+include(CMakeFindDependencyMacro)
 
 # iMSTK settings
-set(iMSTK_USE_OpenHaptics @iMSTK_USE_OpenHaptics@)
+set(iMSTK_ENABLE_VR @iMSTK_ENABLE_VR@)
 set(iMSTK_USE_Vulkan @iMSTK_USE_Vulkan@)
-set(VegaFEM_DIR "@VegaFEM_DIR@")
-set(VTK_DIR "@VTK_DIR@")
+set(iMSTK_USE_OpenHaptics @iMSTK_USE_OpenHaptics@)
+set(iMSTK_BUILD_TESTING @iMSTK_BUILD_TESTING@)
+
+# Use the iMSTK modules to find all required packages
+set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/modules")
+include(${CMAKE_CURRENT_LIST_DIR}/modules/imstkFind)
+include(CMakeFindDependencyMacro)
 
 # Assimp
 find_package( Assimp REQUIRED )
 
+# Eigen3
+set(Eigen3_DIR @Eigen3_DIR@)
+find_dependency( Eigen3 REQUIRED )
+
+# FTD2XX
+if(WIN32)
+  find_package( FTD2XX REQUIRED )
+endif()
+
 # g3log
 find_package( g3log REQUIRED )
-include_directories( ${g3log_INCLUDE_DIR} )
 
 # glm
-find_package( glm REQUIRED )
-
-if(iMSTK_USE_Vulkan)
-  # glfw
-  find_package( glfw REQUIRED )
+set(glm_DIR @glm_DIR@)
+find_dependency( glm REQUIRED )
 
-  # gli
-  find_package( gli REQUIRED )
+# GTest
+if(iMSTK_BUILD_TESTING)
+  set(GTest_DIR @GTest_DIR@)
+  find_dependency( GTest REQUIRED NO_DEFAULT_PATH )
 endif()
 
-# Eigen
-find_package( Eigen3 3.3 REQUIRED )
-include_directories( ${Eigen_INCLUDE_DIR} )
-
 # imgui
 find_package( imgui REQUIRED )
-include_directories( ${imgui_INCLUDE_DIR} )
+
+# LibNiFalcon
+find_package( LibNiFalcon REQUIRED)
+
+# Libusb
+find_package( Libusb REQUIRED)
+
+# OpenVR
+if(iMSTK_ENABLE_VR)
+  add_definitions( -DiMSTK_ENABLE_VR )
+  find_package( openvr REQUIRED )
+else()
 
 # PhysX
 find_package(PhysX REQUIRED)
-include_directories(${PHYSX_INCLUDE_DIRS})
-
-# SCCD
+#
+#SCCD
 find_package( SCCD REQUIRED )
-include_directories( ${SCCD_INCLUDE_DIR} )
+
+# SFML
+if(WIN32)
+  find_package( SFML REQUIRED )
+  add_definitions( -DiMSTK_AUDIO_ENABLED )
+endif()
 
 # tbb
 find_package(tbb REQUIRED)
-include_directories(${TBB_INCLUDE_DIR})
 if (MSVC)
   add_definitions(-D__TBB_NO_IMPLICIT_LINKAGE=1)
 endif()
 
 # VegaFEM
-find_package( VegaFEM REQUIRED CONFIG )
-
-# VTK
-find_package( VTK REQUIRED CONFIG )
-include( ${VTK_USE_FILE} )
+set(VegaFEM_DIR "@VegaFEM_DIR@")
+find_dependency( VegaFEM REQUIRED CONFIG )
 
 # VRPN
 find_package( VRPN REQUIRED )
-include_directories( ${VRPN_INCLUDE_DIRS} )
-add_definitions( -DVRPN_USE_LIBNIFALCON )
 if(iMSTK_USE_OpenHaptics)
+  find_package( OpenHapticsSDK REQUIRED )
   add_definitions( -DiMSTK_USE_OPENHAPTICS )
-  add_definitions( -DVRPN_USE_PHANTOM_SERVER )
-else()
-  remove_definitions( -DiMSTK_USE_OPENHAPTICS )
-  remove_definitions( -DVRPN_USE_PHANTOM_SERVER )
 endif()
 
-# iMSTK
-#link_directories(@CMAKE_LIBRARY_PATH@)
-include("@CMAKE_CURRENT_BINARY_DIR@/iMSTKTargets.cmake")
+# VTK
+set(VTK_DIR @VTK_DIR@)
+find_dependency(VTK CONFIG)
+if (VTK_VERSION VERSION_LESS "8.90")
+  # Modules are linked via `vtkCommonCore`
+  # VTK_DEFINITIONS has autoinit information
+  find_dependency (VTK REQUIRED)
+  include(${VTK_USE_FILE})
+else()
+  # modules are linked via `VTK::CommonCore`
+  # vtk_module_autoinit is needed
+  find_dependency(VTK COMPONENTS
+    CommonCore
+    CommonDataModel
+    FiltersGeneral
+    FiltersSources
+    IOExport
+    IOImport
+    IOPLY
+    IOParallel
+    IOParallelXML
+    ImagingCore
+    InteractionStyle
+    RenderingAnnotation
+    RenderingCore
+    RenderingOpenGL2
+    RenderingVolume
+    RenderingVolumeOpenGL2
+endif()
 
-set(CMAKE_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX_CACHE} CACHE STRING "" FORCE)
-set(CMAKE_BINARY_DIR ${CMAKE_BINARY_DIR_CACHE} CACHE STRING "" FORCE)
-set(CMAKE_DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX_CACHE} CACHE STRING "" FORCE)
\ No newline at end of file
+# glfw, gli
+if(iMSTK_USE_Vulkan)
+  find_package( glfw REQUIRED )
+  find_package( gli REQUIRED )
+  find_package( VulkanSDK REQUIRED)
+  add_definitions( -DiMSTK_USE_Vulkan )
+endif()
-- 
GitLab