diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6ada4b94a3b09549c9eba37295153236858ca0f8..814d42d6eba8be3221c65be08e6e3b8c1859dc85 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -42,10 +42,10 @@ endif()
 # ============================
 # MPI
 # ============================
-include(IntelMPI)
-find_package(MPI REQUIRED)
-include_directories(${MPI_INCLUDE_PATH})
-link_directories(${MPI_LIBRARY_DIRS})
+if (NOT TARGET MPI::MPI_C)
+  include(IntelMPI)
+  find_package(MPI REQUIRED)
+endif()
 
 # ========================
 # C
@@ -94,26 +94,33 @@ endif()
 # ========================
 # HMAT-OSS
 # ========================
-find_package(HMAT)
-if(HMAT_FOUND)
-  include_directories(${HMAT_INCLUDE_DIRS})
+if ( NOT TARGET HMAT::hmat )
+  find_package(HMAT)
+  if(HMAT_FOUND)
+    # set_target_properties(HMAT::hmat PROPERTIES
+    #   INTERFACE_INCLUDE_DIRECTORIES "${HMAT_INCLUDE_DIRS}"
+    #   INTERFACE_COMPILE_DEFINITIONS "${HMAT_DEFINITIONS}"
+    #   INTERFACE_LINK_DIRECTORIES "${HMAT_LIBRARY_DIRS}"
+    #   INTERFACE_LINK_LIBRARIES "hmat"
+    #   )
+    message( STATUS "HMAT: Found" )
+    set(HAVE_HMAT TRUE)
+  endif(HMAT_FOUND)
+else()
   set(HAVE_HMAT TRUE)
-endif(HMAT_FOUND)
+endif()
 
 # ========================
 # CHAMELEON
 # ========================
-find_package(PkgConfig)
-pkg_check_modules (CHAMELEON chameleon)
-if(CHAMELEON_FOUND)
-  include_directories(${CHAMELEON_INCLUDE_DIRS})
-  link_directories(${CHAMELEON_LIBRARY_DIRS})
+if ( NOT TARGET CHAMELEON::chameleon )
+  find_package(CHAMELEON)
+  if(CHAMELEON_FOUND)
+    set(HAVE_CHAMELEON TRUE)
+  endif()
+else()
   set(HAVE_CHAMELEON TRUE)
-  if (NOT MKL_FOUND)
-    find_package(LAPACKE REQUIRED)
-    include_directories(${LAPACKE_INCLUDE_DIRS})
-  endif (NOT MKL_FOUND)
-endif(CHAMELEON_FOUND)
+endif()
 
 # ========================
 # HLIBPRO
@@ -143,14 +150,18 @@ configure_file("${PROJECT_SOURCE_DIR}/CMake/config.h.in" "${CMAKE_CURRENT_BINARY
 # ============================
 file(GLOB_RECURSE TEST_SOURCES RELATIVE ${PROJECT_SOURCE_DIR} src/*.c include/*.h)
 add_executable(test_FEMBEM ${TEST_SOURCES})
-target_link_libraries(test_FEMBEM ${HMAT_LIBRARIES};${CHAMELEON_LIBRARIES};${LAPACKE_LIBRARIES};${MPI_C_LIBRARIES})
+target_link_libraries(test_FEMBEM PUBLIC
+  HMAT::hmat
+  CHAMELEON::chameleon
+  ${LAPACKE_LIBRARIES}
+  MPI::MPI_C)
 if(HLIBPRO_FOUND)
-  target_link_libraries(test_FEMBEM ${HLIBPRO_LIBRARIES})
+  target_link_libraries(test_FEMBEM PUBLIC ${HLIBPRO_LIBRARIES})
 endif(HLIBPRO_FOUND)
 if(MKL_FOUND)
     # The start-group/end-group flags must be at the end of the
     # link command line, so we must use target_link_libraries not, CMAKE_SHARED_XXX_FLAGS
-    target_link_libraries(test_FEMBEM ${_LINK_PRIVATE} ${MKL_LINKER_FLAGS})
+    target_link_libraries(test_FEMBEM PUBLIC ${_LINK_PRIVATE} ${MKL_LINKER_FLAGS})
 endif()
 set_target_properties(test_FEMBEM PROPERTIES INSTALL_RPATH_USE_LINK_PATH True )