From 071c19a9548dffdd58d5a715203ac908866f3ddd Mon Sep 17 00:00:00 2001
From: Lars Bilke <lars.bilke@ufz.de>
Date: Thu, 3 Dec 2020 15:45:48 +0100
Subject: [PATCH] [CMake] Use generator expression for target_link_libraries()

Removed lots of if expressions.
---
 Applications/ApplicationsLib/CMakeLists.txt   |  8 +--
 Applications/CLI/CMakeLists.txt               | 52 ++++++--------
 Applications/FileIO/CMakeLists.txt            | 20 ++----
 Applications/InSituLib/CMakeLists.txt         | 11 +--
 .../Utils/FileConverter/CMakeLists.txt        |  3 +-
 BaseLib/CMakeLists.txt                        | 16 ++---
 GeoLib/CMakeLists.txt                         | 12 ++--
 MaterialLib/CMakeLists.txt                    | 15 +++--
 MathLib/CMakeLists.txt                        | 46 ++++++-------
 MeshLib/CMakeLists.txt                        | 13 ++--
 ProcessLib/CMakeLists.txt                     | 33 ++++-----
 ProcessLib/HeatTransportBHE/CMakeLists.txt    | 13 ++--
 Tests/CMakeLists.txt                          | 67 ++++++++-----------
 13 files changed, 136 insertions(+), 173 deletions(-)

diff --git a/Applications/ApplicationsLib/CMakeLists.txt b/Applications/ApplicationsLib/CMakeLists.txt
index e446674da71..e391d9c34a3 100644
--- a/Applications/ApplicationsLib/CMakeLists.txt
+++ b/Applications/ApplicationsLib/CMakeLists.txt
@@ -13,7 +13,9 @@ target_link_libraries(ApplicationsLib
                               MeshGeoToolsLib
                               ParameterLib
                               ProcessLib
-                              spdlog::spdlog)
+                              spdlog::spdlog
+                              $<$<BOOL:${OGS_USE_PYTHON}>:pybind11::pybind11>
+)
 
 # Set cpp definitions if the cmake option is enabled for the given process.
 foreach(process ${ProcessesList})
@@ -24,7 +26,3 @@ foreach(process ${ProcessesList})
                      PROPERTY COMPILE_DEFINITIONS ${EnableProcess})
     endif()
 endforeach()
-
-if(OGS_USE_PYTHON)
-    target_link_libraries(ApplicationsLib PRIVATE pybind11::pybind11)
-endif()
diff --git a/Applications/CLI/CMakeLists.txt b/Applications/CLI/CMakeLists.txt
index 3035e44b6b7..df79fbc5e32 100644
--- a/Applications/CLI/CMakeLists.txt
+++ b/Applications/CLI/CMakeLists.txt
@@ -1,14 +1,3 @@
-add_executable(ogs ogs.cpp)
-
-target_link_libraries(ogs
-    PRIVATE
-        ApplicationsLib
-        BaseLib
-        CMakeInfoLib
-        GitInfoLib
-        ProcessLib
-)
-
 if(OGS_USE_PYTHON)
     # Troubleshooting: If you get linker errors, such as   ogs.cpp:(.text+0xb4):
     # undefined reference to `_Py_ZeroStruct' it could be that OGS is compiled
@@ -43,33 +32,34 @@ if(OGS_USE_PYTHON)
     # provides the minimal set of parameters to ensure that the code using
     # pybind11 compiles, but it does not pass these extra compiler flags (i.e.
     # this is up to you). TODO: Enable further compiler/linker flags.
-    target_link_libraries(ogs_embedded_python PUBLIC pybind11::embed)
-    target_compile_definitions(ogs_embedded_python PUBLIC OGS_USE_PYTHON)
     target_link_libraries(ogs_embedded_python
-                          PRIVATE ProcessLibBoundaryConditionPythonModule
-                                  ProcessLibSourceTermPythonModule)
-
-    target_link_libraries(ogs PRIVATE ogs_embedded_python)
-
-    if(BUILD_SHARED_LIBS)
+        PUBLIC pybind11::embed
+        PRIVATE ProcessLibBoundaryConditionPythonModule
+                ProcessLibSourceTermPythonModule
+    )
+    target_compile_definitions(ogs_embedded_python
+        PUBLIC OGS_USE_PYTHON
         # Add macro definition, because static libs make special handling
         # necessary s.t. the embedded OpenGeoSys Python module won't be removed
         # by the linker.
-        target_compile_definitions(ogs_embedded_python PRIVATE
-                                   OGS_BUILD_SHARED_LIBS)
-    endif()
+        $<$<BOOL:${BUILD_SHARED_LIBS}>:PRIVATE OGS_BUILD_SHARED_LIBS>
+    )
 endif()
 
-if(OGS_USE_PETSC)
-    target_link_libraries(ogs PRIVATE ${PETSC_LIBRARIES})
-endif()
-if(OGS_USE_MPI AND TARGET MPI::MPI_CXX)
-    target_link_libraries(ogs PRIVATE MPI::MPI_CXX)
-endif()
+add_executable(ogs ogs.cpp)
 
-if(OGS_INSITU)
-    target_link_libraries(ogs PRIVATE InSituLib)
-endif()
+target_link_libraries(ogs
+    PRIVATE
+        ApplicationsLib
+        BaseLib
+        CMakeInfoLib
+        GitInfoLib
+        ProcessLib
+        $<$<BOOL:${OGS_USE_PETSC}>:${PETSC_LIBRARIES}>
+        $<$<TARGET_EXISTS:ogs_embedded_python>:ogs_embedded_python>
+        $<$<TARGET_EXISTS:MPI::MPI_CXX>:MPI::MPI_CXX>
+        $<$<TARGET_EXISTS:InSituLib>:InSituLib>
+)
 
 # ---- Tests ----
 add_test(NAME ogs_no_args COMMAND ogs)
diff --git a/Applications/FileIO/CMakeLists.txt b/Applications/FileIO/CMakeLists.txt
index d3d3d45f551..b4f5777133b 100644
--- a/Applications/FileIO/CMakeLists.txt
+++ b/Applications/FileIO/CMakeLists.txt
@@ -29,20 +29,12 @@ target_link_libraries(ApplicationsFileIO
                              DataHolderLib
                              GeoLib
                              MathLib
-                      PRIVATE MeshLib GitInfoLib std::filesystem spdlog::spdlog)
-
-if(OGS_BUILD_GUI)
-    # Needed for the XmlPrjInterface, which links the DE/Base/OGSError.h.
-    target_link_libraries(ApplicationsFileIO PUBLIC QtBase)
-endif()
-
-if(Shapelib_FOUND)
-    target_link_libraries(ApplicationsFileIO PRIVATE ${Shapelib_LIBRARIES})
-endif()
-
-if(OGS_BUILD_SWMM)
-    target_link_libraries(ApplicationsFileIO PRIVATE SwmmInterface)
-endif()
+                             # Needed for the XmlPrjInterface, which links the DE/Base/OGSError.h.
+                             $<$<BOOL:${OGS_BUILD_GUI}>:QtBase>
+                             $<$<BOOL:${Shapelib_FOUND}>:${Shapelib_LIBRARIES}>
+                             $<$<TARGET_EXISTS:SwmmInterface>:SwmmInterface>
+                      PRIVATE MeshLib GitInfoLib std::filesystem spdlog::spdlog
+)
 
 configure_file(XmlIO/OpenGeoSysCND.xsd
                ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/OpenGeoSysCND.xsd COPYONLY)
diff --git a/Applications/InSituLib/CMakeLists.txt b/Applications/InSituLib/CMakeLists.txt
index 9fe55669685..e42084487e2 100644
--- a/Applications/InSituLib/CMakeLists.txt
+++ b/Applications/InSituLib/CMakeLists.txt
@@ -8,10 +8,11 @@ if(BUILD_SHARED_LIBS)
 endif()
 
 target_link_libraries(InSituLib
+    PUBLIC
+        BaseLib
     INTERFACE
-      VTK::PythonUsed
+        VTK::PythonUsed
     PRIVATE
-      ParaView::PythonCatalyst
-      VTK::CommonDataModel)
-
-target_link_libraries(InSituLib PUBLIC BaseLib PRIVATE MeshLib)
+        MeshLib
+        ParaView::PythonCatalyst
+        VTK::CommonDataModel)
diff --git a/Applications/Utils/FileConverter/CMakeLists.txt b/Applications/Utils/FileConverter/CMakeLists.txt
index 4d5aec825fb..26e2ccaffe9 100644
--- a/Applications/Utils/FileConverter/CMakeLists.txt
+++ b/Applications/Utils/FileConverter/CMakeLists.txt
@@ -46,7 +46,8 @@ if(TARGET NetCdfConverter)
                           ${NETCDF_LIBRARIES_CXX}
                           ${NETCDF_LIBRARIES_C}
                           ${HDF5_HL_LIBRARIES}
-                          ${HDF5_LIBRARIES})
+                          ${HDF5_LIBRARIES}
+    )
     if(OGS_USE_CONAN AND MSVC)
         target_link_libraries(NetCdfConverter ${CONAN_LIBS})
     endif()
diff --git a/BaseLib/CMakeLists.txt b/BaseLib/CMakeLists.txt
index a6ec0001192..e4165f9e1b5 100644
--- a/BaseLib/CMakeLists.txt
+++ b/BaseLib/CMakeLists.txt
@@ -8,13 +8,9 @@ endif()
 # Create the library
 ogs_add_library(BaseLib ${SOURCES})
 
-target_link_libraries(BaseLib PUBLIC Boost::boost spdlog::spdlog
-                                     std::filesystem)
-
-if(MSVC)
-    target_link_libraries(BaseLib PUBLIC WinMM) # needed for timeGetTime
-endif()
-
-if(OGS_BUILD_GUI)
-    target_link_libraries(BaseLib PUBLIC Qt5::Xml Qt5::XmlPatterns)
-endif()
+target_link_libraries(BaseLib PUBLIC Boost::boost
+                                     spdlog::spdlog
+                                     std::filesystem
+                                     $<$<BOOL:${MSVC}>:WinMM> # needed for timeGetTime
+                                     $<$<BOOL:${OGS_BUILD_GUI}>:"Qt5::Xml Qt5::XmlPatterns">
+)
diff --git a/GeoLib/CMakeLists.txt b/GeoLib/CMakeLists.txt
index 0168f1789fa..11f7f7f97a1 100644
--- a/GeoLib/CMakeLists.txt
+++ b/GeoLib/CMakeLists.txt
@@ -12,11 +12,13 @@ endif()
 # Create the library
 ogs_add_library(GeoLib ${SOURCES})
 
-target_link_libraries(GeoLib PUBLIC BaseLib MathLib PRIVATE tet spdlog::spdlog)
-
-if(OGS_BUILD_GUI)
-    target_link_libraries(GeoLib PUBLIC Qt5::Xml Qt5::XmlPatterns)
-endif()
+target_link_libraries(GeoLib
+    PUBLIC BaseLib
+           MathLib
+           $<$<BOOL:${OGS_BUILD_GUI}>:"Qt5::Xml Qt5::XmlPatterns">
+    PRIVATE tet
+            spdlog::spdlog
+)
 
 configure_file(IO/XmlIO/OpenGeoSysGLI.xsd
                ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/OpenGeoSysGLI.xsd COPYONLY)
diff --git a/MaterialLib/CMakeLists.txt b/MaterialLib/CMakeLists.txt
index 6817abbfad6..f54fe6f13ed 100644
--- a/MaterialLib/CMakeLists.txt
+++ b/MaterialLib/CMakeLists.txt
@@ -41,9 +41,12 @@ include(GenerateExportHeader)
 generate_export_header(MaterialLib)
 target_include_directories(MaterialLib PUBLIC ${CMAKE_CURRENT_BINARY_DIR})
 
-target_link_libraries(MaterialLib PRIVATE MathLib MeshLib ParameterLib
-    spdlog::spdlog)
-
-if(OGS_USE_MFRONT)
-    target_link_libraries(MaterialLib PUBLIC MaterialLib_SolidModels_MFront)
-endif()
+target_link_libraries(MaterialLib
+    PUBLIC
+        $<$<TARGET_EXISTS:MaterialLib_SolidModels_MFront>:MaterialLib_SolidModels_MFront>
+    PRIVATE
+        MathLib
+        MeshLib
+        ParameterLib
+        spdlog::spdlog
+)
diff --git a/MathLib/CMakeLists.txt b/MathLib/CMakeLists.txt
index 0a1a2bbeec6..ef8fde0cee9 100644
--- a/MathLib/CMakeLists.txt
+++ b/MathLib/CMakeLists.txt
@@ -26,33 +26,25 @@ endif()
 
 # Create the library
 ogs_add_library(MathLib ${SOURCES})
-target_include_directories(MathLib PUBLIC ${CMAKE_CURRENT_BINARY_DIR})
+target_include_directories(MathLib
+    PUBLIC
+        ${CMAKE_CURRENT_BINARY_DIR}
+        $<$<BOOL:${OGS_USE_PETSC}>:${PETSC_INCLUDE_DIRS}>
+    PRIVATE
+        $<$<BOOL:${CVODE_FOUND}>:${CVODE_INCLUDE_DIRS}>
+)
 
 set_target_properties(MathLib PROPERTIES LINKER_LANGUAGE CXX)
 
-target_link_libraries(
-    MathLib
-    PUBLIC BaseLib ${OpenMP_CXX_LIBRARIES}
-    PRIVATE spdlog::spdlog)
-
-if(CVODE_FOUND)
-    target_include_directories(MathLib PRIVATE ${CVODE_INCLUDE_DIRS})
-    target_link_libraries(MathLib PUBLIC ${CVODE_LIBRARIES})
-endif()
-
-if(LAPACK_FOUND)
-    target_link_libraries(MathLib PUBLIC ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES})
-endif()
-
-if(OGS_USE_LIS)
-    target_link_libraries(MathLib PUBLIC ${LIS_LIBRARIES})
-endif()
-
-if(OGS_USE_MKL)
-    target_link_libraries(MathLib PUBLIC ${MKL_LIBRARIES})
-endif()
-
-if(OGS_USE_PETSC)
-    target_include_directories(MathLib PUBLIC ${PETSC_INCLUDE_DIRS})
-    target_link_libraries(MathLib PUBLIC ${PETSC_LIBRARIES})
-endif()
+target_link_libraries(MathLib
+    PUBLIC
+        BaseLib
+        ${OpenMP_CXX_LIBRARIES}
+        $<$<BOOL:${CVODE_FOUND}>:${CVODE_LIBRARIES}>
+        $<$<BOOL:${LAPACK_FOUND}>:${BLAS_LIBRARIES} ${LAPACK_LIBRARIES}>
+        $<$<BOOL:${OGS_USE_LIS}>:${LIS_LIBRARIES}>
+        $<$<BOOL:${OGS_USE_MKL}>:${MKL_LIBRARIES}>
+        $<$<BOOL:${OGS_USE_PETSC}>:${PETSC_LIBRARIES}>
+    PRIVATE
+        spdlog::spdlog
+)
diff --git a/MeshLib/CMakeLists.txt b/MeshLib/CMakeLists.txt
index e73de0542b3..492ef483a57 100644
--- a/MeshLib/CMakeLists.txt
+++ b/MeshLib/CMakeLists.txt
@@ -31,14 +31,11 @@ target_link_libraries(
     PUBLIC
         BaseLib GeoLib GitInfoLib MathLib ${VTK_LIBRARIES}
         $<$<TARGET_EXISTS:OgsXdmf>:OgsXdmf>
-    PRIVATE spdlog::spdlog)
-
-if(OGS_USE_MPI AND TARGET MPI::MPI_CXX)
-    target_link_libraries(MeshLib PUBLIC MPI::MPI_CXX)
-endif()
-if(OGS_USE_PETSC)
-    target_link_libraries(ogs PRIVATE ${PETSC_LIBRARIES})
-endif()
+        $<$<TARGET_EXISTS:MPI::MPI_CXX>:MPI::MPI_CXX>
+    PRIVATE
+        spdlog::spdlog
+        $<$<BOOL:${OGS_USE_PETSC}>:${PETSC_LIBRARIES}>
+)
 
 if($ENV{VTK_USE_64BIT_IDS})
     target_compile_definitions(MeshLib PUBLIC VTK_USE_64BIT_IDS)
diff --git a/ProcessLib/CMakeLists.txt b/ProcessLib/CMakeLists.txt
index 82d61309df0..168d26f8729 100644
--- a/ProcessLib/CMakeLists.txt
+++ b/ProcessLib/CMakeLists.txt
@@ -19,24 +19,25 @@ append_source_files(SOURCES Utils)
 
 ogs_add_library(ProcessLib ${SOURCES})
 
-target_link_libraries(
-    ProcessLib
-    PUBLIC BaseLib MaterialLib MathLib MeshGeoToolsLib MeshLib NumLib
-    PRIVATE ParameterLib GitInfoLib spdlog::spdlog)
-
-if (OGS_BUILD_PROCESS_ComponentTransport
-    OR OGS_BUILD_PROCESS_RichardsComponentTransport)
-    target_link_libraries(ProcessLib PUBLIC ChemistryLib)
-endif()
-
 if(OGS_USE_PYTHON)
     add_subdirectory(BoundaryCondition/Python)
-    target_link_libraries(ProcessLib PUBLIC ProcessLibBoundaryConditionPython)
-
     add_subdirectory(SourceTerms/Python)
-    target_link_libraries(ProcessLib PUBLIC ProcessLibSourceTermPython)
 endif()
 
-if(OGS_INSITU)
-    target_link_libraries(ProcessLib PRIVATE InSituLib)
-endif()
+target_link_libraries(ProcessLib
+    PUBLIC
+        BaseLib
+        MaterialLib
+        MathLib
+        MeshGeoToolsLib
+        MeshLib
+        NumLib
+        $<$<OR:$<BOOL:${OGS_BUILD_PROCESS_ComponentTransport}>,$<BOOL:${OGS_BUILD_PROCESS_RichardsComponentTransport}>>:ChemistryLib>
+        $<$<TARGET_EXISTS:ProcessLibBoundaryConditionPython>:ProcessLibBoundaryConditionPython>
+        $<$<TARGET_EXISTS:ProcessLibSourceTermPython>:ProcessLibSourceTermPython>
+    PRIVATE
+        ParameterLib
+        GitInfoLib
+        spdlog::spdlog
+        $<$<TARGET_EXISTS:InSituLib>:InSituLib>
+)
diff --git a/ProcessLib/HeatTransportBHE/CMakeLists.txt b/ProcessLib/HeatTransportBHE/CMakeLists.txt
index 29edec17081..bd5e6cdbd04 100644
--- a/ProcessLib/HeatTransportBHE/CMakeLists.txt
+++ b/ProcessLib/HeatTransportBHE/CMakeLists.txt
@@ -5,12 +5,13 @@ append_source_files(SOURCES LocalAssemblers)
 
 ogs_add_library(HeatTransportBHE ${SOURCES})
 
-target_link_libraries(HeatTransportBHE PUBLIC ProcessLib)
-if (OGS_USE_PYTHON)
-    target_link_libraries(HeatTransportBHE PRIVATE pybind11::pybind11)
-endif()
-
-target_link_libraries(HeatTransportBHE PUBLIC ProcessLib PRIVATE ParameterLib)
+target_link_libraries(HeatTransportBHE
+    PUBLIC
+        ProcessLib
+    PRIVATE
+    ParameterLib
+    $<$<TARGET_EXISTS:pybind11::pybind11>:pybind11::pybind11>
+)
 
 if(BUILD_TESTING)
     include(Tests.cmake)
diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt
index f3e902b7904..c1eb51b9474 100644
--- a/Tests/CMakeLists.txt
+++ b/Tests/CMakeLists.txt
@@ -49,49 +49,38 @@ add_executable(testrunner ${TEST_SOURCES})
 set_target_properties(testrunner PROPERTIES FOLDER Testing)
 
 target_link_libraries(testrunner
-                      ApplicationsFileIO
-                      gtest
-                      MeshGeoToolsLib
-                      MaterialLib
-                      MeshLib
-                      NumLib
-                      ParameterLib
-                      ProcessLib
-                      TestInfoLib
-                      Threads::Threads
-                      ${VTK_LIBRARIES})
-
-if(OGS_BUILD_PROCESS_LIE)
-    target_link_libraries(testrunner LIE)
-endif()
-
-if(OGS_USE_PETSC)
-    target_link_libraries(testrunner ${PETSC_LIBRARIES})
-endif()
-
-if(OGS_USE_MPI)
-    target_link_libraries(testrunner MPI::MPI_CXX)
-endif()
-
-if(OGS_BUILD_SWMM)
-    target_link_libraries(testrunner SwmmInterface)
-endif()
-
-if(OGS_INSITU)
-    target_link_libraries(testrunner InSituLib)
-endif()
+    PRIVATE
+        ApplicationsFileIO
+        gtest
+        MeshGeoToolsLib
+        MaterialLib
+        MeshLib
+        NumLib
+        ParameterLib
+        ProcessLib
+        TestInfoLib
+        Threads::Threads
+        ${VTK_LIBRARIES}
+        $<$<TARGET_EXISTS:LIE>:LIE>
+        $<$<TARGET_EXISTS:MPI::MPI_CXX>:MPI::MPI_CXX>
+        $<$<TARGET_EXISTS:SwmmInterface>:SwmmInterface>
+        $<$<TARGET_EXISTS:InSituLib>:InSituLib>
+        $<$<BOOL:${OGS_USE_PETSC}>:${PETSC_LIBRARIES}>
+)
 
 if(OGS_BUILD_GUI)
     target_link_libraries(testrunner
-                          GitInfoLib
-                          Qt5::Core
-                          Qt5::Gui
-                          Qt5::Xml
-                          Qt5::Network
-                          VtkVis
-                          QtDataView)
+        PRIVATE
+            GitInfoLib
+            Qt5::Core
+            Qt5::Gui
+            Qt5::Xml
+            Qt5::Network
+            VtkVis
+            QtDataView
+    )
     if(GEOTIFF_FOUND)
-        target_link_libraries(testrunner ${GEOTIFF_LIBRARIES})
+        target_link_libraries(testrunner PRIVATE ${GEOTIFF_LIBRARIES})
     endif()
 endif()
 
-- 
GitLab