diff --git a/CMakeLists.txt b/CMakeLists.txt
index fda59429eec07dbc1c47d97474c651f877cb5f9a..b3102216022dbffab49604330787d9944cabfc83 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -17,8 +17,8 @@ project(ADIOS2 VERSION 2.0.0)
 #------------------------------------------------------------------------------#
 # Some boilerplate to setup nice output directories
 #------------------------------------------------------------------------------#
-
 include(GNUInstallDirs)
+set(CMAKE_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake/adios2")
 
 list(INSERT CMAKE_MODULE_PATH 0 "${ADIOS2_SOURCE_DIR}/cmake")
 if(NOT CMAKE_ARCHIVE_OUTPUT_DIRECTORY)
@@ -55,14 +55,19 @@ include(CMakeDependentOption)
 
 # Setup shared library / -fPIC stuff
 get_property(SHARED_LIBS_SUPPORTED GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS)
-cmake_dependent_option(ADIOS2_BUILD_SHARED_LIBS
-  "Whether or not to build shared libraries" ON
-  "SHARED_LIBS_SUPPORTED" OFF)
+option(BUILD_SHARED_LIBS "Build shared libraries (so/dylib/dll)." ${SHARED_LIBS_SUPPORTED})
+if(NOT SHARED_LIBS_SUPPORTED)
+  if(BUILD_SHARED_LIBS)
+    message(WARNING "A shared library build was requested but is not supported on this platform / compiler.  Unexpected build results will likely occur")
+  endif()
+  set(BUILD_SHARED_LIBS OFF CACHE BOOL
+    "Build shared libraries (so/dylib/dll)." FORCE
+  )
+endif()
+
 cmake_dependent_option(ADIOS2_ENABLE_PIC
   "Build with Position Independent Code" ON
   "SHARED_LIBS_SUPPORTED" OFF)
-set(BUILD_SHARED_LIBS ${ADIOS2_BUILD_SHARED_LIBS})
-
 if(ADIOS2_ENABLE_PIC)
   set(CMAKE_POSITION_INDEPENDENT_CODE ON)
 endif()
@@ -83,9 +88,8 @@ if(ADIOS2_HAVE_MPI)
   add_definitions(-DOMPI_SKIP_MPICXX)
 endif()
 
-GenerateADIOSConfig(MPI ZFP BZip2 ADIOS1 HDF5 DataMan Python SysVShMem)
-install(
-  FILES ${ADIOS2_BINARY_DIR}/adios2/ADIOSConfig.h
+GenerateADIOSHeaderConfig(MPI ZFP BZip2 ADIOS1 HDF5 DataMan Python SysVShMem)
+install(FILES ${ADIOS2_BINARY_DIR}/source/adios2/ADIOSConfig.h
   DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/adios2
 )
 
@@ -125,6 +129,11 @@ if(BUILD_TESTING)
   add_subdirectory(testing)
 endif()
 
+#------------------------------------------------------------------------------#
+# Generating package configs
+#------------------------------------------------------------------------------#
+GenerateADIOSPackageConfig()
+
 #------------------------------------------------------------------------------#
 # Configuration summary
 #------------------------------------------------------------------------------#
diff --git a/bindings/python/CMakeLists.txt b/bindings/python/CMakeLists.txt
index 854a2c628004e5228d62d40663f58ec1a3957456..79b64eed86296603ce4ebd27dfcda7c774d41599 100644
--- a/bindings/python/CMakeLists.txt
+++ b/bindings/python/CMakeLists.txt
@@ -28,14 +28,11 @@ endif()
 string(REGEX REPLACE "^${PYTHON_PREFIX}/" ""
   CMAKE_INSTALL_PYTHONDIR "${PYTHON_SITE_PACKAGES}"
 )
-set(CMAKE_INSTALL_PYTHONDIR "${CMAKE_INSTALL_PYTHONDIR}"
-  CACHE INTERNAL "" FORCE
-)
 set_target_properties(adios2py PROPERTIES
   OUTPUT_NAME adios2
   LIBRARY_OUTPUT_DIRECTORY ${ADIOS2_BINARY_DIR}/${CMAKE_INSTALL_PYTHONDIR}
   RUNTIME_OUTPUT_DIRECTORY ${ADIOS2_BINARY_DIR}/${CMAKE_INSTALL_PYTHONDIR}
 )
-install(TARGETS adios2py
+install(TARGETS adios2py 
   DESTINATION ${CMAKE_INSTALL_PYTHONDIR}
 )
diff --git a/cmake/ADIOS2Config.cmake.in b/cmake/ADIOS2Config.cmake.in
new file mode 100644
index 0000000000000000000000000000000000000000..58d1afed260763478f50c88dff25746abbb736a9
--- /dev/null
+++ b/cmake/ADIOS2Config.cmake.in
@@ -0,0 +1,2 @@
+list(INSERT CMAKE_MODULE_PATH 0 "@ADIOS2_SOURCE_DIR@/cmake")
+include("${CMAKE_CURRENT_LIST_DIR}/ADIOS2ConfigCommon.cmake")
diff --git a/cmake/ADIOS2ConfigCommon.cmake.in b/cmake/ADIOS2ConfigCommon.cmake.in
new file mode 100644
index 0000000000000000000000000000000000000000..4e108bf2b80465fdf3c138744c84fa985b36df3b
--- /dev/null
+++ b/cmake/ADIOS2ConfigCommon.cmake.in
@@ -0,0 +1,46 @@
+cmake_minimum_required(VERSION 3.5)
+
+include(CMakeFindDependencyMacro)
+
+if(NOT @BUILD_SHARED_LIBS@)
+  set(ADIOS2_HAVE_BZip2 @ADIOS2_HAVE_BZip2@)
+  if(ADIOS2_HAVE_BZip2)
+    find_dependency(BZip2)
+  endif()
+
+  set(ADIOS2_HAVE_ZFP @ADIOS2_HAVE_ZFP@)
+  if(ADIOS2_HAVE_ZFP)
+    find_dependency(ZFP)
+  endif()
+
+  set(ADIOS2_HAVE_MPI @ADIOS2_HAVE_MPI@)
+  if(ADIOS2_HAVE_MPI)
+    find_dependency(MPI)
+  endif()
+
+  set(ADIOS2_HAVE_ZeroMQ @ADIOS2_HAVE_ZeroMQ@)
+  if(ADIOS2_HAVE_ZeroMQ)
+    find_dependency(ZeroMQ)
+  endif()
+
+  set(ADIOS2_HAVE_HDF5 @ADIOS2_HAVE_HDF5@)
+  if(ADIOS2_HAVE_HDF5)
+    find_dependency(HDF5 COMPONENTS C)
+  endif()
+
+  set(ADIOS2_HAVE_ADIOS1 @ADIOS2_HAVE_ADIOS1@)
+  if(ADIOS2_HAVE_ADIOS1)
+    if(ADIOS2_HAVE_MPI)
+      find_dependency(ADIOS1 1.12.0)
+    else()
+      find_dependency(ADIOS1 1.12.0 sequential)
+    endif()
+  endif()
+endif()
+
+include("${CMAKE_CURRENT_LIST_DIR}/ADIOS2ConfigVersion.cmake")
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(ADIOS2 DEFAULT_MESSAGE ADIOS2_VERSION)
+
+include("${CMAKE_CURRENT_LIST_DIR}/ADIOS2Targets.cmake")
diff --git a/cmake/ADIOS2ConfigInstall.cmake.in b/cmake/ADIOS2ConfigInstall.cmake.in
new file mode 100644
index 0000000000000000000000000000000000000000..b2c1c180d6d3ff2ff6c7770ee25306d402fea365
--- /dev/null
+++ b/cmake/ADIOS2ConfigInstall.cmake.in
@@ -0,0 +1,2 @@
+list(INSERT CMAKE_MODULE_PATH 0 "${CMAKE_CURRENT_LIST_DIR}/Modules")
+include("${CMAKE_CURRENT_LIST_DIR}/ADIOS2ConfigCommon.cmake")
diff --git a/cmake/ADIOSFunctions.cmake b/cmake/ADIOSFunctions.cmake
index 37b4cf2e02b2d01c9267f51e1a742efd752ab491..14f070fe2ad00dace4fcbf0fc0fc800402121fdd 100644
--- a/cmake/ADIOSFunctions.cmake
+++ b/cmake/ADIOSFunctions.cmake
@@ -3,22 +3,6 @@
 # accompanying file Copyright.txt for details.
 #------------------------------------------------------------------------------#
 
-function(GenerateADIOSConfig)
-  foreach(OPT IN LISTS ARGN)
-    string(TOUPPER ${OPT} OPT_UPPER)
-    if(ADIOS2_HAVE_${OPT})
-      set(ADIOS2_HAVE_${OPT_UPPER} 1)
-    else()
-      set(ADIOS2_HAVE_${OPT_UPPER})
-    endif()
-  endforeach()
-
-  configure_file(
-    ${ADIOS2_SOURCE_DIR}/source/adios2/ADIOSConfig.h.in
-    ${ADIOS2_BINARY_DIR}/adios2/ADIOSConfig.h
-  )
-endfunction()
-
 function(adios_option name description default)
   set(ADIOS2_USE_${name} ${default} CACHE STRING "${description}")
   set_property(CACHE ADIOS2_USE_${name} PROPERTY
@@ -46,3 +30,92 @@ function(python_add_test name script)
     ENVIRONMENT "PYTHONPATH=${ADIOS2_BINARY_DIR}/${CMAKE_INSTALL_PYTHONDIR}:$ENV{PYTHONPATH}"
   )
 endfunction()
+
+function(GenerateADIOSHeaderConfig)
+  foreach(OPT IN LISTS ARGN)
+    string(TOUPPER ${OPT} OPT_UPPER)
+    if(ADIOS2_HAVE_${OPT})
+      set(ADIOS2_HAVE_${OPT_UPPER} 1)
+    else()
+      set(ADIOS2_HAVE_${OPT_UPPER})
+    endif()
+  endforeach()
+
+  configure_file(
+    ${ADIOS2_SOURCE_DIR}/source/adios2/ADIOSConfig.h.in
+    ${ADIOS2_BINARY_DIR}/source/adios2/ADIOSConfig.h
+  )
+endfunction()
+
+function(GenerateADIOSPackageConfig)
+  include(CMakePackageConfigHelpers)
+
+  # Build interface configs
+  write_basic_package_version_file(
+    ${ADIOS2_BINARY_DIR}/ADIOS2ConfigVersion.cmake
+    COMPATIBILITY AnyNewerVersion
+  )
+  export(EXPORT adios2Exports
+    FILE ${ADIOS2_BINARY_DIR}/ADIOS2Targets.cmake
+    NAMESPACE adios2::
+  )
+  configure_file(
+    ${ADIOS2_SOURCE_DIR}/cmake/ADIOS2ConfigCommon.cmake.in
+    ${ADIOS2_BINARY_DIR}/ADIOS2ConfigCommon.cmake
+    @ONLY
+  )
+  configure_file(
+    ${ADIOS2_SOURCE_DIR}/cmake/ADIOS2Config.cmake.in
+    ${ADIOS2_BINARY_DIR}/ADIOS2Config.cmake
+    @ONLY
+  )
+
+  # Install interface configs
+  install(
+    FILES
+      ${ADIOS2_BINARY_DIR}/ADIOS2ConfigVersion.cmake
+      ${ADIOS2_BINARY_DIR}/ADIOS2ConfigCommon.cmake
+    DESTINATION ${CMAKE_INSTALL_CMAKEDIR}
+  )
+  install(EXPORT adios2Exports
+    FILE ADIOS2Targets.cmake
+    NAMESPACE adios2::
+    DESTINATION ${CMAKE_INSTALL_CMAKEDIR}
+  )
+  configure_file(
+    ${ADIOS2_SOURCE_DIR}/cmake/ADIOS2ConfigInstall.cmake.in
+    ${ADIOS2_BINARY_DIR}/ADIOS2ConfigInstall.cmake
+    @ONLY
+  )
+  install(FILES ${ADIOS2_BINARY_DIR}/ADIOS2ConfigInstall.cmake
+    RENAME ADIOS2Config.cmake
+    DESTINATION ${CMAKE_INSTALL_CMAKEDIR}
+  )
+
+  # Install helper find modules if needed
+  if(NOT BUILD_SHARED_LIBS)
+    if(ADIOS2_HAVE_BZip2)
+    install(FILES cmake/FindBZip2.cmake
+      DESTINATION ${CMAKE_INSTALL_CMAKEDIR}/Modules
+    )
+    install(FILES cmake/upstream/FindBZip2.cmake
+      DESTINATION ${CMAKE_INSTALL_CMAKEDIR}/Modules/upstream
+    )
+    endif()
+    if(ADIOS2_HAVE_ZFP)
+      install(FILES cmake/FindZFP.cmake
+        DESTINATION ${CMAKE_INSTALL_CMAKEDIR}/Modules
+      )
+    endif()
+    if(ADIOS2_HAVE_ZeroMQ)
+      install(FILES cmake/FindZeroMQ.cmake
+        DESTINATION ${CMAKE_INSTALL_CMAKEDIR}/Modules
+      )
+    endif()
+    if(ADIOS2_HAVE_ADIOS1)
+      install(FILES cmake/FindADIOS1.cmake
+        DESTINATION ${CMAKE_INSTALL_CMAKEDIR}/Modules
+      )
+    endif()
+  endif()
+endfunction()
diff --git a/cmake/DetectOptions.cmake b/cmake/DetectOptions.cmake
index 29237fcc40c2de892369101077f23c1b880161f3..eeff01f4fe581f4c40343fec4efa27581a259486 100644
--- a/cmake/DetectOptions.cmake
+++ b/cmake/DetectOptions.cmake
@@ -3,6 +3,10 @@
 # accompanying file Copyright.txt for details.
 #------------------------------------------------------------------------------#
 
+# We'll need to install the private find modules to ensure our import libs
+# are properly resovled
+set(adios2_find_modules)
+
 # This file contains the option and dependency logic.  The configuration
 # options are designed to be tertiary: ON, OFF, or AUTO.  If AUTO, we try to
 # determine if dependencies are available and enable the option if we find
@@ -121,5 +125,5 @@ if(ADIOS2_USE_SysVShMem STREQUAL AUTO)
     set(ADIOS2_HAVE_SysVShMem OFF)
   endif()
 elseif(ADIOS2_USE_SysVShMem)
-  set(ADIOS2_HAVE_SysVShMem)
-endif()
\ No newline at end of file
+  set(ADIOS2_HAVE_SysVShMem TRUE)
+endif()
diff --git a/source/adios2/CMakeLists.txt b/source/adios2/CMakeLists.txt
index 3787518f992972d8d2dd1d63a0a15a4b6a702620..6c77dc0ce4f39d81faf0f75a551d27f4ce30e264 100644
--- a/source/adios2/CMakeLists.txt
+++ b/source/adios2/CMakeLists.txt
@@ -44,9 +44,8 @@ add_library(adios2
 target_include_directories(adios2
   PUBLIC
     $<BUILD_INTERFACE:${ADIOS2_SOURCE_DIR}/source>
-    $<BUILD_INTERFACE:${ADIOS2_BINARY_DIR}>
-    $<INSTALL_INTERFACE:include>
-  PRIVATE ${ADIOS2_SOURCE_DIR}/source
+    $<BUILD_INTERFACE:${ADIOS2_BINARY_DIR}/source>
+    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
 )
 target_link_libraries(adios2 PRIVATE adios2sys pugixml)
 
@@ -139,19 +138,16 @@ set_target_properties(adios2 PROPERTIES
   SOVERSION ${ADIOS2_VERSION_MAJOR}
 )
 
-install(
-  FILES ADIOSMacros.h ADIOSTypes.h ADIOSMPICommOnly.h
+install(FILES ADIOSMacros.h ADIOSTypes.h ADIOSMPICommOnly.h
   DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/adios2
 )
-install(
-  DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/core
+install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/core
   DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/adios2
   FILES_MATCHING REGEX "[^/]*\.(h|inl)$"
 )
 
 # Library installation
-install(
-  TARGETS adios2 EXPORT adios2
+install(TARGETS adios2 EXPORT adios2Exports
   RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
   LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
   ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
diff --git a/source/dataman/CMakeLists.txt b/source/dataman/CMakeLists.txt
index 9dcfdef1a6cbbcc75d0a9484ade25c8c322f9eaa..acd59dde91950ab570f1741a64b034ea7067ea55 100644
--- a/source/dataman/CMakeLists.txt
+++ b/source/dataman/CMakeLists.txt
@@ -10,31 +10,42 @@ if(MSVC)
   message(FATAL_ERROR "DataMan is not currently compatible with MSVC")
 endif()
 
-set(dataman_targets)
-
 add_library(dataman
   DataManBase.cpp DataManBase.h
   DataMan.cpp DataMan.h
   CacheMan.cpp CacheMan.h
 )
-target_include_directories(dataman PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
+target_include_directories(dataman
+  PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
+)
 target_link_libraries(dataman
   PRIVATE adios2sys
   PUBLIC NLohmannJson
 )
-list(APPEND dataman_targets dataman)
+set_target_properties(dataman PROPERTIES
+  VERSION ${ADIOS2_VERSION}
+  SOVERSION ${ADIOS2_VERSION_MAJOR}
+)
+install(TARGETS dataman EXPORT adios2Exports
+  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+  LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+  ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+  INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dataman
+)
 
 # Add the dataman plugins as MODULE libraries instead of SHARED libraries.
 # MODULE libraries are designed to be plugins, i.e. shared libs that nobody
 # else links to.
 
+set(dataman_modules)
+
 add_library(dumpman MODULE DumpMan.h DumpMan.cpp)
 target_link_libraries(dumpman PRIVATE dataman)
-list(APPEND dataman_targets dumpman)
+list(APPEND dataman_modules dumpman)
 
 add_library(temporalman MODULE TemporalMan.h TemporalMan.cpp)
 target_link_libraries(temporalman PRIVATE dataman)
-list(APPEND dataman_targets temporalman)
+list(APPEND dataman_modules temporalman)
 
 if(ADIOS2_HAVE_ZeroMQ)
   find_package(ZeroMQ REQUIRED)
@@ -44,14 +55,14 @@ if(ADIOS2_HAVE_ZeroMQ)
     ZmqMan.h ZmqMan.cpp
   )
   target_link_libraries(zmqman PRIVATE dataman ZeroMQ::ZMQ)
-  list(APPEND dataman_targets zmqman)
+  list(APPEND dataman_modules zmqman)
 
   add_library(mdtmman MODULE
     StreamMan.h StreamMan.cpp
     MdtmMan.h MdtmMan.cpp
   )
   target_link_libraries(mdtmman PRIVATE dataman ZeroMQ::ZMQ)
-  list(APPEND dataman_targets mdtmman)
+  list(APPEND dataman_modules mdtmman)
 endif()
 
 if(ADIOS2_HAVE_ZFP)
@@ -60,18 +71,10 @@ if(ADIOS2_HAVE_ZFP)
   add_library(zfpman MODULE ZfpMan.h ZfpMan.cpp)
   target_link_libraries(zfpman PRIVATE dataman zfp::zfp)
 
-  list(APPEND dataman_targets zfpman)
+  list(APPEND dataman_modules zfpman)
 endif()
 
-# Library versioning like this only makes sense for libdataman.  The others are plugins
-# loaded via dlopen.
-set_target_properties(dataman PROPERTIES
-  VERSION ${ADIOS2_VERSION}
-  SOVERSION ${ADIOS2_VERSION_MAJOR}
-)
-
-install(
-  TARGETS ${dataman_targets} EXPORT adios2
+install(TARGETS ${dataman_modules}
   RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
   LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
   ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
diff --git a/thirdparty/KWSys/CMakeLists.txt b/thirdparty/KWSys/CMakeLists.txt
index c0e95036c4934402c6bf24acc1d3ddb87c756265..600c5c9b4b33e07316486b5f2aaba8ac85d00fe8 100644
--- a/thirdparty/KWSys/CMakeLists.txt
+++ b/thirdparty/KWSys/CMakeLists.txt
@@ -4,5 +4,7 @@ set(KWSYS_USE_RegularExpression ON)
 set(KWSYS_USE_SystemTools ON)
 set(KWSYS_BUILD_SHARED ${ADIOS2_BUILD_SHARED_LIBS})
 set(KWSYS_SPLIT_OBJECTS_FROM_INTERFACE ON)
+set(KWSYS_INSTALL_EXPORT_NAME adios2Exports)
+set(KWSYS_INSTALL_LIB_DIR ${CMAKE_INSTALL_LIBDIR})
 
-add_subdirectory(adios2sys EXCLUDE_FROM_ALL)
+add_subdirectory(adios2sys)
diff --git a/thirdparty/KWSys/adios2sys/CMakeLists.txt b/thirdparty/KWSys/adios2sys/CMakeLists.txt
index 5d5fa9df510129a61de7a5fd92bf3dcd2d3246c2..e9bae831c62bfbac1020833ef1cae45303be1a67 100644
--- a/thirdparty/KWSys/adios2sys/CMakeLists.txt
+++ b/thirdparty/KWSys/adios2sys/CMakeLists.txt
@@ -886,12 +886,16 @@ IF(KWSYS_C_SRCS OR KWSYS_CXX_SRCS)
   # Set up include usage requirement
   IF(COMMAND TARGET_INCLUDE_DIRECTORIES)
     TARGET_INCLUDE_DIRECTORIES(${KWSYS_TARGET_INTERFACE} INTERFACE
-      ${CMAKE_CURRENT_BINARY_DIR})
+      $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>)
+    IF(KWSYS_INSTALL_INCLUDE_DIR)
+      TARGET_INCLUDE_DIRECTORIES(${KWSYS_TARGET_INTERFACE} INTERFACE
+        $<INSTALL_INTERFACE:${KWSYS_INSTALL_INCLUDE_DIR}>)
+    ENDIF()
   ENDIF()
 
   # Create an install target for the library.
   IF(KWSYS_INSTALL_LIBRARY_RULE)
-    INSTALL(TARGETS ${KWSYS_TARGET_INTERFACE} ${KWSYS_INSTALL_LIBRARY_RULE})
+    INSTALL(TARGETS ${KWSYS_TARGET_LINK} ${KWSYS_TARGET_INTERFACE} ${KWSYS_INSTALL_LIBRARY_RULE})
   ENDIF()
 ENDIF()
 
@@ -930,6 +934,16 @@ IF(KWSYS_ENABLE_C AND KWSYS_C_SRCS)
       ${KWSYS_PROPERTIES_C})
   ENDIF()
 
+  # Set up include usage requirement
+  IF(COMMAND TARGET_INCLUDE_DIRECTORIES)
+    TARGET_INCLUDE_DIRECTORIES(${KWSYS_TARGET_C_INTERFACE} INTERFACE
+      $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>)
+    IF(KWSYS_INSTALL_INCLUDE_DIR)
+      TARGET_INCLUDE_DIRECTORIES(${KWSYS_TARGET_C_INTERFACE} INTERFACE
+        $<INSTALL_INTERFACE:${KWSYS_INSTALL_INCLUDE_DIR}>)
+    ENDIF()
+  ENDIF()
+
   # Create an install target for the library.
   IF(KWSYS_INSTALL_LIBRARY_RULE)
     INSTALL(TARGETS ${KWSYS_TARGET_C_INTERFACE} ${KWSYS_INSTALL_LIBRARY_RULE})
diff --git a/thirdparty/NLohmannJson/CMakeLists.txt b/thirdparty/NLohmannJson/CMakeLists.txt
index 7aaef186fef9b708ed4c3ed97fbb11e38253a0a6..7a340d53da828daaf02622a85b1371fe4994012d 100644
--- a/thirdparty/NLohmannJson/CMakeLists.txt
+++ b/thirdparty/NLohmannJson/CMakeLists.txt
@@ -1,4 +1 @@
-add_library(NLohmannJson INTERFACE)
-target_include_directories(NLohmannJson
-  INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/json/src
-)
+add_subdirectory(json)
diff --git a/thirdparty/NLohmannJson/json/CMakeLists.txt b/thirdparty/NLohmannJson/json/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..9e34ce3a003f818936381f990c2020114f7f4ffc
--- /dev/null
+++ b/thirdparty/NLohmannJson/json/CMakeLists.txt
@@ -0,0 +1,5 @@
+add_library(NLohmannJson INTERFACE)
+target_include_directories(NLohmannJson INTERFACE
+  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
+)
+install(TARGETS NLohmannJson EXPORT adios2Exports)
diff --git a/thirdparty/pugixml/CMakeLists.txt b/thirdparty/pugixml/CMakeLists.txt
index 07a05515c27e26dd2e9187e75def9dcb50b51163..7cc8a3d5957e2d0bd50f4d430a24069d23b5c6d6 100644
--- a/thirdparty/pugixml/CMakeLists.txt
+++ b/thirdparty/pugixml/CMakeLists.txt
@@ -1,12 +1 @@
-# This is an extremely simple and tiny library.  Rather than build it
-# seperately we'll just create an interface library containing the sources and
-# headers
-add_library(pugixml INTERFACE)
-target_sources(pugixml INTERFACE
-  ${CMAKE_CURRENT_SOURCE_DIR}/pugixml/src/pugiconfig.hpp
-  ${CMAKE_CURRENT_SOURCE_DIR}/pugixml/src/pugixml.hpp
-  ${CMAKE_CURRENT_SOURCE_DIR}/pugixml/src/pugixml.cpp
-)
-target_include_directories(pugixml INTERFACE
-  ${CMAKE_CURRENT_SOURCE_DIR}/pugixml/src
-)
+add_subdirectory(pugixml)
diff --git a/thirdparty/pugixml/pugixml/CMakeLists.txt b/thirdparty/pugixml/pugixml/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..0ff662a9eb74587dd06152ce711631e471107d32
--- /dev/null
+++ b/thirdparty/pugixml/pugixml/CMakeLists.txt
@@ -0,0 +1,10 @@
+add_library(pugixml INTERFACE)
+target_sources(pugixml INTERFACE
+  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/pugiconfig.hpp>
+  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/pugixml.hpp>
+  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/pugixml.cpp>
+)
+target_include_directories(pugixml INTERFACE
+  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
+)
+install(TARGETS pugixml EXPORT adios2Exports)