diff --git a/Applications/ApplicationsLib/CMakeLists.txt b/Applications/ApplicationsLib/CMakeLists.txt
index efef4eb9b177c737b44b50d709b5740c3a4e2935..8ba2d863897854de0f68fe85313814a91fcdc697 100644
--- a/Applications/ApplicationsLib/CMakeLists.txt
+++ b/Applications/ApplicationsLib/CMakeLists.txt
@@ -16,16 +16,14 @@ target_link_libraries(
             ProcessLib
             spdlog::spdlog
             $<$<BOOL:${OGS_USE_PYTHON}>:pybind11::pybind11>
+            $<$<BOOL:${OGS_USE_PETSC}>:petsc>
 )
 
 if(OGS_USE_LIS)
     target_include_directories(ApplicationsLib PUBLIC ${LIS_INCLUDE_DIR})
 endif()
 
-target_compile_definitions(
-    ApplicationsLib PUBLIC $<$<BOOL:${USE_LIS}>:USE_LIS>
-                           $<$<BOOL:${OGS_USE_PETSC}>:USE_PETSC>
-)
+target_compile_definitions(ApplicationsLib PUBLIC $<$<BOOL:${USE_LIS}>:USE_LIS>)
 
 # Set cpp definitions if the cmake option is enabled for the given process.
 foreach(process ${_processes_list})
diff --git a/Applications/CLI/CMakeLists.txt b/Applications/CLI/CMakeLists.txt
index cfd5b09be80480d394bc2f9c2ead789cfa9cebcb..0bbbf41a4ed883532193bc6c7312a1d8ce0b362d 100644
--- a/Applications/CLI/CMakeLists.txt
+++ b/Applications/CLI/CMakeLists.txt
@@ -61,13 +61,11 @@ target_link_libraries(
             $<$<TARGET_EXISTS:ogs_embedded_python>:ogs_embedded_python>
             $<$<TARGET_EXISTS:MPI::MPI_CXX>:MPI::MPI_CXX>
             $<$<TARGET_EXISTS:InSituLib>:InSituLib>
+            $<$<TARGET_EXISTS:petsc>:petsc>
             tclap
 )
 
-target_compile_definitions(
-    ogs PRIVATE $<$<BOOL:${USE_INSITU}>:USE_INSITU>
-                $<$<BOOL:${OGS_USE_PETSC}>:USE_PETSC>
-)
+target_compile_definitions(ogs PRIVATE $<$<BOOL:${USE_INSITU}>:USE_INSITU>)
 
 # ---- Tests ----
 add_test(NAME ogs_no_args COMMAND ogs)
diff --git a/BaseLib/CMakeLists.txt b/BaseLib/CMakeLists.txt
index 77d904ff5ebc578db6db12a629734959e947622b..be3eab56e93221baca3c909dcb9bffbe3896a08d 100644
--- a/BaseLib/CMakeLists.txt
+++ b/BaseLib/CMakeLists.txt
@@ -16,10 +16,10 @@ target_link_libraries(
            $<$<BOOL:${MSVC}>:WinMM> # needed for timeGetTime
            $<$<BOOL:${OGS_BUILD_GUI}>:Qt5::Xml>
            $<$<BOOL:${OGS_BUILD_GUI}>:Qt5::XmlPatterns>
+           $<$<BOOL:${OGS_USE_PETSC}>:petsc>
     PRIVATE xmlpatch
 )
 
 target_compile_definitions(
     BaseLib PUBLIC $<$<BOOL:${OGS_FATAL_ABORT}>:OGS_FATAL_ABORT>
-    PRIVATE $<$<BOOL:${OGS_USE_PETSC}>:USE_PETSC>
 )
diff --git a/MathLib/CMakeLists.txt b/MathLib/CMakeLists.txt
index 224123d70f32811a0168f4b1d12c10e262a64b72..4f52278230d7a474e5289e4a2f5b3185c955375f 100644
--- a/MathLib/CMakeLists.txt
+++ b/MathLib/CMakeLists.txt
@@ -22,10 +22,6 @@ endif()
 
 # Create the library
 ogs_add_library(MathLib ${SOURCES})
-target_include_directories(
-    MathLib PUBLIC ${CMAKE_CURRENT_BINARY_DIR}
-                   $<$<BOOL:${OGS_USE_PETSC}>:${PETSC_INCLUDE_DIRS}>
-)
 
 set_target_properties(MathLib PROPERTIES LINKER_LANGUAGE CXX)
 
@@ -36,13 +32,11 @@ target_link_libraries(
            $<$<TARGET_EXISTS:LAPACK::LAPACK>:LAPACK::LAPACK>
            $<$<BOOL:${OGS_USE_LIS}>:${LIS_LIBRARIES}>
            $<$<BOOL:${OGS_USE_CVODE}>:CVODE::CVODE>
+           $<$<BOOL:${OGS_USE_PETSC}>:petsc>
            Eigen3::Eigen
     PRIVATE spdlog::spdlog
 )
 
-if(OGS_USE_PETSC)
-    target_link_libraries(MathLib PUBLIC ${PETSC_LIBRARIES})
-endif()
 if(OGS_USE_LIS)
     target_include_directories(MathLib PUBLIC ${LIS_INCLUDE_DIR})
 endif()
@@ -55,7 +49,6 @@ target_compile_definitions(
     MathLib
     PUBLIC
         $<$<BOOL:${USE_LIS}>:USE_LIS>
-        $<$<BOOL:${OGS_USE_PETSC}>:USE_PETSC>
         $<$<BOOL:${OGS_USE_CVODE}>:CVODE_FOUND>
         $<$<BOOL:${EIGEN_NO_DEBUG}>:EIGEN_NO_DEBUG>
         $<$<BOOL:${EIGEN_DONT_VECTORIZE}>:EIGEN_DONT_VECTORIZE>
diff --git a/MeshLib/CMakeLists.txt b/MeshLib/CMakeLists.txt
index 04c4e50e1c3a7f63e816364e43b90c86daae4591..e88a2e9cfc44fc4b8f7e98d008207cb342bcb5a5 100644
--- a/MeshLib/CMakeLists.txt
+++ b/MeshLib/CMakeLists.txt
@@ -41,6 +41,7 @@ target_link_libraries(
            ${VTK_LIBRARIES}
            $<$<TARGET_EXISTS:OgsXdmf>:OgsXdmf>
            $<$<TARGET_EXISTS:MPI::MPI_CXX>:MPI::MPI_CXX>
+           $<$<TARGET_EXISTS:petsc>:petsc>
     PRIVATE spdlog::spdlog
 )
 
@@ -49,7 +50,6 @@ target_include_directories(MeshLib PUBLIC ${VTK_INCLUDE_DIRS})
 target_compile_definitions(
     MeshLib
     PUBLIC
-        $<$<BOOL:${OGS_USE_PETSC}>:USE_PETSC>
         $<$<AND:$<BOOL:$ENV{VTK_USE_64BIT_IDS}>,$<NOT:$<BOOL:VTK_ADDED>>>:VTK_USE_64BIT_IDS>
     PRIVATE $<$<BOOL:${OGS_USE_XDMF}>:OGS_USE_XDMF>
 )
diff --git a/NumLib/CMakeLists.txt b/NumLib/CMakeLists.txt
index b846cf5cc004a3b26d3ff1a940df7abd72986fc9..6fd30aa6110a1e49bd2f69a6b7d6f078049d88db 100644
--- a/NumLib/CMakeLists.txt
+++ b/NumLib/CMakeLists.txt
@@ -15,12 +15,9 @@ append_source_files(SOURCES Extrapolation)
 
 # Create the library
 ogs_add_library(NumLib ${SOURCES})
-if(OGS_USE_PETSC)
-    target_compile_definitions(NumLib PUBLIC USE_PETSC)
-endif()
 set_target_properties(NumLib PROPERTIES LINKER_LANGUAGE CXX)
 
 target_link_libraries(
-    NumLib PUBLIC BaseLib GeoLib MathLib MeshLib PRIVATE MeshGeoToolsLib
-                                                         spdlog::spdlog
+    NumLib PUBLIC BaseLib GeoLib MathLib MeshLib $<$<TARGET_EXISTS:petsc>:petsc>
+    PRIVATE MeshGeoToolsLib spdlog::spdlog
 )
diff --git a/ProcessLib/CMakeLists.txt b/ProcessLib/CMakeLists.txt
index aec3f549ad967e498caeeb0115e3cef11e39750c..e9d496842f9affba359948c2197ea0c85176721c 100644
--- a/ProcessLib/CMakeLists.txt
+++ b/ProcessLib/CMakeLists.txt
@@ -33,6 +33,7 @@ target_link_libraries(
         NumLib
         $<$<TARGET_EXISTS:ProcessLibBoundaryConditionPython>:ProcessLibBoundaryConditionPython>
         $<$<TARGET_EXISTS:ProcessLibSourceTermPython>:ProcessLibSourceTermPython>
+        $<$<TARGET_EXISTS:petsc>:petsc>
         nlohmann_json
     PRIVATE ParameterLib GitInfoLib spdlog::spdlog
             $<$<TARGET_EXISTS:InSituLib>:InSituLib>
@@ -40,8 +41,7 @@ target_link_libraries(
 
 target_compile_definitions(
     ProcessLib
-    PUBLIC $<$<BOOL:${OGS_USE_PETSC}>:USE_PETSC>
-           $<$<BOOL:${OGS_USE_XDMF}>:OGS_USE_XDMF>
+    PUBLIC $<$<BOOL:${OGS_USE_XDMF}>:OGS_USE_XDMF>
            # Enabled elements
            OGS_MAX_ELEMENT_DIM=${OGS_MAX_ELEMENT_DIM}
            OGS_MAX_ELEMENT_ORDER=${OGS_MAX_ELEMENT_ORDER}
diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt
index d9b3e85e6d1501144c14fe3e2ec32dd7a9a5d25f..308443f97056f2cfe7aa5bc791403fd6d5ba445d 100644
--- a/Tests/CMakeLists.txt
+++ b/Tests/CMakeLists.txt
@@ -80,12 +80,9 @@ target_link_libraries(
             $<$<TARGET_EXISTS:MPI::MPI_CXX>:MPI::MPI_CXX>
             $<$<TARGET_EXISTS:SwmmInterface>:SwmmInterface>
             $<$<TARGET_EXISTS:InSituLib>:InSituLib>
+            $<$<TARGET_EXISTS:petsc>:petsc>
 )
 
-if(OGS_USE_PETSC)
-    target_link_libraries(testrunner PRIVATE ${PETSC_LIBRARIES})
-endif()
-
 if(OGS_BUILD_GUI)
     target_compile_definitions(testrunner PUBLIC OGS_BUILD_GUI)
     target_link_libraries(
diff --git a/scripts/cmake/Find.cmake b/scripts/cmake/Find.cmake
index c9cbd7f54ed3f3af5d2b6fd497da14c471d758f0..faac5224537537f452df9509c46b017b6ea35110 100644
--- a/scripts/cmake/Find.cmake
+++ b/scripts/cmake/Find.cmake
@@ -133,7 +133,10 @@ if(OGS_USE_PETSC)
 
     find_package(PETSc ${ogs.minimum_version.petsc} REQUIRED)
 
-    include_directories(SYSTEM ${PETSC_INCLUDES})
+    add_library(petsc SHARED IMPORTED)
+    target_include_directories(petsc INTERFACE ${PETSC_INCLUDES})
+    set_target_properties(petsc PROPERTIES IMPORTED_LOCATION ${PETSC_LIBRARIES})
+    target_compile_definitions(petsc INTERFACE USE_PETSC)
 endif()
 
 # Check MPI package