diff --git a/Applications/FileIO/CMakeLists.txt b/Applications/FileIO/CMakeLists.txt
index 5ab08941465cee49587895c257a1097cbffe1cee..5b9d973135fe3f991daca2a6fe77392a1255c662 100644
--- a/Applications/FileIO/CMakeLists.txt
+++ b/Applications/FileIO/CMakeLists.txt
@@ -1,24 +1,14 @@
-GET_SOURCE_FILES(SOURCES_FileIO)
-set(SOURCES ${SOURCES_FileIO})
+GET_SOURCE_FILES(SOURCES)
 if(NOT Shapelib_FOUND)
     list(REMOVE_ITEM SOURCES SHPInterface.h SHPInterface.cpp)
 endif()
-GET_SOURCE_FILES(SOURCES_BASE_XML XmlIO)
-set(SOURCES ${SOURCES} ${SOURCES_BASE_XML})
-GET_SOURCE_FILES(SOURCES_BOOST_XML XmlIO/Boost)
-set(SOURCES ${SOURCES} ${SOURCES_BOOST_XML})
 if(QT4_FOUND)
-    GET_SOURCE_FILES(SOURCES_QT_XML XmlIO/Qt)
-    set(SOURCES ${SOURCES} ${SOURCES_QT_XML})
+    APPEND_SOURCE_FILES(SOURCES XmlIO/Qt)
 endif()
-GET_SOURCE_FILES(SOURCES_RAPID_XML XmlIO/Rapid)
-set(SOURCES ${SOURCES} ${SOURCES_RAPID_XML})
-GET_SOURCE_FILES(SOURCES_GMSH Gmsh)
-set(SOURCES ${SOURCES} ${SOURCES_GMSH})
+APPEND_SOURCE_FILES(SOURCES Gmsh)
 
 if(QT4_FOUND)
-    GET_SOURCE_FILES(SOURCES_FEFLOW FEFLOW)
-    SET(SOURCES ${SOURCES} ${SOURCES_FEFLOW})
+    APPEND_SOURCE_FILES(SOURCES FEFLOW)
 endif()
 
 include(${PROJECT_SOURCE_DIR}/scripts/cmake/OGSEnabledElements.cmake)
diff --git a/BaseLib/CMakeLists.txt b/BaseLib/CMakeLists.txt
index 7ff7e6df19f5801e66eea0ffbbd43f2c0a0ed8bb..5a1bc9ee4693695e9e768e45b7ae319cbce58ab2 100644
--- a/BaseLib/CMakeLists.txt
+++ b/BaseLib/CMakeLists.txt
@@ -1,14 +1,10 @@
 GET_SOURCE_FILES(SOURCES)
-GET_SOURCE_FILES(SOURCES_IO IO)
+APPEND_SOURCE_FILES(SOURCES IO)
 
-set(SOURCES ${SOURCES} ${SOURCES_IO})
-
-GET_SOURCE_FILES(SOURCES_IO_BASE_XML IO/XmlIO)
-set(SOURCES ${SOURCES} ${SOURCES_IO_BASE_XML})
+APPEND_SOURCE_FILES(SOURCES IO/XmlIO)
 
 if(QT4_FOUND)
-    GET_SOURCE_FILES(SOURCES_IO_QT_XML IO/XmlIO/Qt)
-    set(SOURCES ${SOURCES} ${SOURCES_IO_QT_XML})
+    APPEND_SOURCE_FILES(SOURCES IO/XmlIO/Qt)
 endif()
 
 list(APPEND SOURCES "${CMAKE_CURRENT_BINARY_DIR}/BuildInfo.cpp" BuildInfo.h)
diff --git a/GeoLib/CMakeLists.txt b/GeoLib/CMakeLists.txt
index 6e563dafb967a04178adaf39a8db0f7e71f3672b..3607d0ab003fbf0567b0fa562c2dcbf21a765f8d 100644
--- a/GeoLib/CMakeLists.txt
+++ b/GeoLib/CMakeLists.txt
@@ -1,24 +1,16 @@
 # Source files
-GET_SOURCE_FILES(SOURCES_GeoLib)
-set(SOURCES ${SOURCES_GeoLib})
+GET_SOURCE_FILES(SOURCES)
 
-GET_SOURCE_FILES(SOURCES_IO IO)
-GET_SOURCE_FILES(SOURCES_IO_Legacy IO/Legacy)
-set(SOURCES ${SOURCES} ${SOURCES_IO} ${SOURCES_IO_Legacy})
+APPEND_SOURCE_FILES(SOURCES IO)
+APPEND_SOURCE_FILES(SOURCES IO/Legacy)
 
-GET_SOURCE_FILES(SOURCES_IO_BASE_XML IO/XmlIO)
-GET_SOURCE_FILES(SOURCES_IO_BOOST_XML IO/XmlIO/Boost)
-GET_SOURCE_FILES(SOURCES_IO_RAPID_XML IO/XmlIO/Rapid)
-set(SOURCES ${SOURCES} ${SOURCES_IO_BASE_XML} ${SOURCES_IO_BOOST_XML} ${SOURCES_IO_RAPID_XML})
+APPEND_SOURCE_FILES(SOURCES IO/XmlIO/Rapid)
+APPEND_SOURCE_FILES(SOURCES IO/XmlIO/Boost)
 
 if(QT4_FOUND)
-    GET_SOURCE_FILES(SOURCES_IO_QT_XML IO/XmlIO/Qt)
-    set(SOURCES ${SOURCES} ${SOURCES_IO_QT_XML})
+    APPEND_SOURCE_FILES(SOURCES IO/XmlIO/Qt)
 endif()
 
-GET_SOURCE_FILES(SOURCES_IO_GMSHIO IO/Gmsh)
-set(SOURCES ${SOURCES} ${SOURCES_IO_GMSHIO})
-
 # Create the library
 add_library(GeoLib ${SOURCES}
     ${CMAKE_CURRENT_SOURCE_DIR}/../ThirdParty/tetgen/predicates.cxx
diff --git a/MaterialLib/CMakeLists.txt b/MaterialLib/CMakeLists.txt
index a3a7536d90948486b2e83c2f656446e00cb2c2a9..3e0702b3c81f5a967e1681c36da7ffc6f03d51b4 100644
--- a/MaterialLib/CMakeLists.txt
+++ b/MaterialLib/CMakeLists.txt
@@ -1,11 +1,8 @@
-# Source files
 GET_SOURCE_FILES(SOURCES)
-GET_SOURCE_FILES(SOURCES_ADSORPTION Adsorption)
-set(SOURCES ${SOURCES} ${SOURCES_ADSORPTION})
-
+APPEND_SOURCE_FILES(SOURCES Adsorption)
 APPEND_SOURCE_FILES(SOURCES SolidModels)
 
-add_library(MaterialLib ${SOURCES} )
+add_library(MaterialLib ${SOURCES})
 target_link_libraries(MaterialLib
     BaseLib
 )
diff --git a/MathLib/CMakeLists.txt b/MathLib/CMakeLists.txt
index 3d77de3e611aa3f365884f43555a81be6e808d73..b0b5e5a54dc8e61dca0958fcdf74bb4d6288ce4c 100644
--- a/MathLib/CMakeLists.txt
+++ b/MathLib/CMakeLists.txt
@@ -1,46 +1,27 @@
 #Source files grouped by a directory
-GET_SOURCE_FILES(SOURCES_MATHLIB)
-set(SOURCES ${SOURCES_MATHLIB})
+GET_SOURCE_FILES(SOURCES)
 
-GET_SOURCE_FILES(SOURCES_INTERPOLATIONALGORITHMS InterpolationAlgorithms)
-set(SOURCES ${SOURCES} ${SOURCES_INTERPOLATIONALGORITHMS})
-
-GET_SOURCE_FILES(SOURCES_INTEGRATION Integration)
-set(SOURCES ${SOURCES} ${SOURCES_INTEGRATION})
-
-GET_SOURCE_FILES(SOURCES_LINALG LinAlg)
-set(SOURCES ${SOURCES} ${SOURCES_LINALG})
-
-GET_SOURCE_FILES(SOURCES_LINALG_DENSE LinAlg/Dense)
-set(SOURCES ${SOURCES} ${SOURCES_LINALG_DENSE})
-
-GET_SOURCE_FILES(SOURCES_LINALG_SOLVERS LinAlg/Solvers)
-set(SOURCES ${SOURCES} ${SOURCES_LINALG_SOLVERS})
-
-GET_SOURCE_FILES(SOURCES_ODE ODE)
-set(SOURCES ${SOURCES} ${SOURCES_ODE})
+APPEND_SOURCE_FILES(SOURCES InterpolationAlgorithms)
+APPEND_SOURCE_FILES(SOURCES Integration)
+APPEND_SOURCE_FILES(SOURCES LinAlg)
+APPEND_SOURCE_FILES(SOURCES LinAlg/Dense)
+APPEND_SOURCE_FILES(SOURCES LinAlg/Solvers)
+APPEND_SOURCE_FILES(SOURCES ODE)
+APPEND_SOURCE_FILES(SOURCES Nonlinear)
 
 if(OGS_USE_EIGEN)
-    GET_SOURCE_FILES(SOURCES_LINALG_EIGEN LinAlg/Eigen)
-    set(SOURCES ${SOURCES} ${SOURCES_LINALG_EIGEN})
+    APPEND_SOURCE_FILES(SOURCES LinAlg/Eigen)
 endif()
 
 if(OGS_USE_LIS)
-    GET_SOURCE_FILES(SOURCES_LINALG_LIS LinAlg/Lis)
-    set(SOURCES ${SOURCES} ${SOURCES_LINALG_LIS})
-    GET_SOURCE_FILES(SOURCES_LINALG_EIGENLIS LinAlg/EigenLis)
-    set(SOURCES ${SOURCES} ${SOURCES_LINALG_EIGENLIS})
+    APPEND_SOURCE_FILES(SOURCES LinAlg/Lis)
+    APPEND_SOURCE_FILES(SOURCES LinAlg/EigenLis)
 endif()
 
 if(OGS_USE_PETSC)
-    GET_SOURCE_FILES(SOURCES_LINALG_PETSC LinAlg/PETSc)
-    set(SOURCES ${SOURCES} ${SOURCES_LINALG_PETSC})
+    APPEND_SOURCE_FILES(SOURCES LinAlg/PETSc)
 endif()
 
-GET_SOURCE_FILES(SOURCES_NONLINEAR Nonlinear)
-set(SOURCES ${SOURCES} ${SOURCES_NONLINEAR})
-
-
 # Create the library
 add_library(MathLib ${SOURCES})
 
diff --git a/MeshGeoToolsLib/CMakeLists.txt b/MeshGeoToolsLib/CMakeLists.txt
index d1bbdc54b976551bb1eac352b7b94e0394a153e7..e54377fa1adc471858eae1413ddcb53c7de9b57b 100644
--- a/MeshGeoToolsLib/CMakeLists.txt
+++ b/MeshGeoToolsLib/CMakeLists.txt
@@ -1,8 +1,8 @@
 # Source files
-GET_SOURCE_FILES(SOURCES_MeshGeoToolsLib)
+GET_SOURCE_FILES(SOURCES)
 
 # Create the library
-add_library(MeshGeoToolsLib ${SOURCES_MeshGeoToolsLib})
+add_library(MeshGeoToolsLib ${SOURCES})
 
 target_link_libraries(MeshGeoToolsLib
     BaseLib
diff --git a/MeshLib/CMakeLists.txt b/MeshLib/CMakeLists.txt
index a6e3926b582b466bffa284c8226b69e11b5d2228..45929e8c9e08d8609f36968aaf757c98e8a8c64b 100644
--- a/MeshLib/CMakeLists.txt
+++ b/MeshLib/CMakeLists.txt
@@ -1,29 +1,23 @@
-# Source files
-GET_SOURCE_FILES(SOURCES_MESHLIB)
+GET_SOURCE_FILES(SOURCES)
 
 # It should be removed too for other MPI based DDC approach in future.
 if(NOT OGS_USE_PETSC)
-    list(REMOVE_ITEM SOURCES_MESHLIB NodePartitionedMesh.h)
+    list(REMOVE_ITEM SOURCES NodePartitionedMesh.h)
 endif()
 
-GET_SOURCE_FILES(SOURCES_ELEMENTS Elements)
-GET_SOURCE_FILES(SOURCES_EDITING MeshEditing)
-GET_SOURCE_FILES(SOURCES_GENERATORS MeshGenerators)
-GET_SOURCE_FILES(SOURCES_SEARCH MeshSearch)
-GET_SOURCE_FILES(SOURCES_IO IO)
-GET_SOURCE_FILES(SOURCES_IO_LEGACY IO/Legacy)
-GET_SOURCE_FILES(SOURCES_IO_VTKIO IO/VtkIO)
-GET_SOURCE_FILES(SOURCES_QUALITY MeshQuality)
-GET_SOURCE_FILES(SOURCES_VTK Vtk)
-
-set(SOURCES ${SOURCES_MESHLIB} ${SOURCES_ELEMENTS} ${SOURCES_EDITING}
-    ${SOURCES_GENERATORS} ${SOURCES_QUALITY} ${SOURCES_SEARCH}
-    ${SOURCES_IO} ${SOURCES_IO_LEGACY}  ${SOURCES_IO_VTKIO} ${SOURCES_VTK})
+APPEND_SOURCE_FILES(SOURCES MeshEditing)
+APPEND_SOURCE_FILES(SOURCES MeshGenerators)
+APPEND_SOURCE_FILES(SOURCES MeshSearch)
+APPEND_SOURCE_FILES(SOURCES Elements)
+APPEND_SOURCE_FILES(SOURCES IO)
+APPEND_SOURCE_FILES(SOURCES IO/Legacy)
+APPEND_SOURCE_FILES(SOURCES IO/VtkIO)
+APPEND_SOURCE_FILES(SOURCES MeshQuality)
+APPEND_SOURCE_FILES(SOURCES Vtk)
 
 # It could be used for other MPI based DDC approach in future.
 if(OGS_USE_PETSC)
-    GET_SOURCE_FILES(SOURCES_MPI_IO IO/MPI_IO)
-    set(SOURCES ${SOURCES} ${SOURCES_MPI_IO})
+    APPEND_SOURCE_FILES(SOURCES IO/MPI_IO)
 endif()
 
 # Create the library
diff --git a/NumLib/CMakeLists.txt b/NumLib/CMakeLists.txt
index b23206f9fd9053f15e8aea5b150bd607265fee34..57dc953798a702c0512552b51d42d2bc7844b90e 100644
--- a/NumLib/CMakeLists.txt
+++ b/NumLib/CMakeLists.txt
@@ -1,38 +1,18 @@
-#Source files grouped by a directory
-GET_SOURCE_FILES(SOURCES_NUMLIB)
-set(SOURCES ${SOURCES_NUMLIB})
-
-GET_SOURCE_FILES(SOURCES_ASSEMBLER Assembler)
-set(SOURCES ${SOURCES} ${SOURCES_ASSEMBLER})
-GET_SOURCE_FILES(SOURCES_DOF DOF)
-set(SOURCES ${SOURCES} ${SOURCES_DOF})
-
-GET_SOURCE_FILES(SOURCES_FEM Fem)
-set(SOURCES ${SOURCES} ${SOURCES_FEM})
-GET_SOURCE_FILES(SOURCES_FEM_COORDINATESMAPPING Fem/CoordinatesMapping)
-set(SOURCES ${SOURCES} ${SOURCES_FEM_COORDINATESMAPPING})
-GET_SOURCE_FILES(SOURCES_FEM_FINTIEELEMENT Fem/FiniteElement)
-set(SOURCES ${SOURCES} ${SOURCES_FEM_FINTIEELEMENT})
-GET_SOURCE_FILES(SOURCES_FEM_INTEGRATION Fem/Integration)
-set(SOURCES ${SOURCES} ${SOURCES_FEM_INTEGRATION})
-GET_SOURCE_FILES(SOURCES_FEM_SHAPEFUNCTION Fem/ShapeFunction)
-set(SOURCES ${SOURCES} ${SOURCES_FEM_SHAPEFUNCTION})
-
-GET_SOURCE_FILES(SOURCES_TIMESTEP TimeStepping)
-GET_SOURCE_FILES(SOURCES_TIMESTEP_ALGORITHMS TimeStepping/Algorithms)
-set(SOURCES ${SOURCES} ${SOURCES_TIMESTEP} ${SOURCES_TIMESTEP_ALGORITHMS})
-
-GET_SOURCE_FILES(SOURCES_FUNCTION Function)
-set(SOURCES ${SOURCES} ${SOURCES_FUNCTION})
-GET_SOURCE_FILES(SOURCES_DISTRIBUTION Distribution)
-set(SOURCES ${SOURCES} ${SOURCES_DISTRIBUTION})
-
-GET_SOURCE_FILES(SOURCES_ODESOLVER ODESolver)
-set(SOURCES ${SOURCES} ${SOURCES_ODESOLVER})
-
-GET_SOURCE_FILES(SOURCES_EXTRAPOLATION Extrapolation)
-set(SOURCES ${SOURCES} ${SOURCES_EXTRAPOLATION})
-
+GET_SOURCE_FILES(SOURCES)
+
+APPEND_SOURCE_FILES(SOURCES Assembler)
+APPEND_SOURCE_FILES(SOURCES DOF)
+APPEND_SOURCE_FILES(SOURCES Fem)
+APPEND_SOURCE_FILES(SOURCES Fem/CoordinatesMapping)
+APPEND_SOURCE_FILES(SOURCES Fem/FiniteElement)
+APPEND_SOURCE_FILES(SOURCES Fem/Integration)
+APPEND_SOURCE_FILES(SOURCES Fem/ShapeFunction)
+APPEND_SOURCE_FILES(SOURCES TimeStepping)
+APPEND_SOURCE_FILES(SOURCES TimeStepping/Algorithms)
+APPEND_SOURCE_FILES(SOURCES Function)
+APPEND_SOURCE_FILES(SOURCES Distribution)
+APPEND_SOURCE_FILES(SOURCES ODESolver)
+APPEND_SOURCE_FILES(SOURCES Extrapolation)
 
 # Create the library
 add_library(NumLib ${SOURCES})
diff --git a/scripts/cmake/Functions.cmake b/scripts/cmake/Functions.cmake
index fcbf1d19dfd58f40fdd84ab9f1f89f669f4c67ad..0c372bbe64710ea398fb1c82766f7da3570c17ed 100644
--- a/scripts/cmake/Functions.cmake
+++ b/scripts/cmake/Functions.cmake
@@ -19,6 +19,10 @@ macro(GET_SOURCE_FILES SOURCE_FILES)
     file(GLOB GET_SOURCE_FILES_SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${DIR}/*.cpp)
 
     set(${SOURCE_FILES} ${GET_SOURCE_FILES_HEADERS} ${GET_SOURCE_FILES_TEMPLATES} ${GET_SOURCE_FILES_SOURCES})
+    list(LENGTH ${SOURCE_FILES} NUM_FILES)
+    if(${NUM_FILES} EQUAL 0)
+        message(FATAL_ERROR "No source files found in ${DIR}")
+    endif()
 
     # Adapt DIR var to backslash syntax of SOURCE_GROUP cmd
     if(${ARGC} EQUAL 2)