diff --git a/BaseLib/DebugTools.h b/BaseLib/DebugTools.h index 13a06a9307fd59eabf7757f379c178ddb41f5151..be80c7ebaae92b29a66b74c5002a29f5815b17bd 100644 --- a/BaseLib/DebugTools.h +++ b/BaseLib/DebugTools.h @@ -13,8 +13,9 @@ #pragma once -#include <ostream> #include <algorithm> +#include <iterator> +#include <ostream> #include <vector> template<typename T> diff --git a/BaseLib/reorderVector.h b/BaseLib/reorderVector.h index b5add30f5ea11deb59495d52fb7d75b7737224ed..23d42727ebc4cea09a8a990edf9e65cb56c4a1ad 100644 --- a/BaseLib/reorderVector.h +++ b/BaseLib/reorderVector.h @@ -13,6 +13,8 @@ #pragma once +#include <vector> + namespace BaseLib { /** diff --git a/CMakeLists.txt b/CMakeLists.txt index b3e61d4f6c181492860857613e081e5b2270cbd2..2b2543286e4c0b3cc10b69317b6e88723b71c21f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -181,6 +181,8 @@ option(OGS_ENABLE_ELEMENT_CUBOID "Build FEM elements for cuboids (quads, hexahe option(OGS_ENABLE_ELEMENT_PRISM "Build FEM elements for prisms." ON) option(OGS_ENABLE_ELEMENT_PYRAMID "Build FEM elements for pyramids." ON) +option(OGS_CHECK_HEADER_COMPILATION "Check header for standalone compilation." OFF) + ################### ### Definitions ### ################### @@ -263,6 +265,8 @@ include_directories( SYSTEM ${CMAKE_CURRENT_SOURCE_DIR}/ThirdParty/autocheck/inc include_directories( SYSTEM ${CMAKE_CURRENT_SOURCE_DIR}/ThirdParty/tclap/include ) include_directories(SYSTEM ${CMAKE_CURRENT_SOURCE_DIR}/ThirdParty/vtkGUISupportQt) +include(scripts/cmake/CheckHeaderCompilation.cmake) + add_subdirectory( Applications ) add_subdirectory( BaseLib ) # TODO This is a hack but we have to make sure that Boost is built first @@ -292,5 +296,7 @@ endif() # OGS_BUILD_TESTS configure_file("${CMAKE_CURRENT_SOURCE_DIR}/BaseLib/BuildInfo.cpp.in" "${CMAKE_CURRENT_BINARY_DIR}/BaseLib/BuildInfo.cpp" @ONLY) +check_header_compilation() + include(scripts/cmake/MarkVariablesAdvanced.cmake) unset(PRE_INSTALL_RUN CACHE) diff --git a/GeoLib/QuadTree.h b/GeoLib/QuadTree.h index c6572dfcb09efcee5b713dcc51157c5e0549a1cb..4d78eee59d10f01a9203a426d7d4b37fa67217d7 100644 --- a/GeoLib/QuadTree.h +++ b/GeoLib/QuadTree.h @@ -14,10 +14,11 @@ #pragma once +#include <cassert> #include <limits> +#include <utility> #include <logog/include/logog.hpp> -#include <utility> namespace GeoLib { diff --git a/Jenkinsfile b/Jenkinsfile index acbbdc2c7fbdb1034f19463de61968e613ee4163..327348f7bd39c0a34ca30f9b8e10869864c9fcbd 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -307,6 +307,33 @@ pipeline { stage('Master') { when { environment name: 'JOB_NAME', value: 'ufz/ogs/master' } parallel { + // ************************ Check-Header ******************************* + stage('Check-Header') { + agent { + dockerfile { + filename 'Dockerfile.gcc.minimal' + dir 'scripts/docker' + label 'docker' + args '-v ccache:/home/jenkins/cache/ccache -v conan-cache:/home/jenkins/cache/conan' + additionalBuildArgs '--pull' + } + } + steps { + script { + lock(resource: "conanCache-${env.NODE_NAME}") { + sh 'find $CONAN_USER_HOME -name "system_reqs.txt" -exec rm {} \\;' + configure { + cmakeOptions = + '-DOGS_USE_CONAN=ON ' + + '-DOGS_CONAN_BUILD=never ' + config = 'Debug' + } + } + build { target = 'check-header' } + } + } + post { always { dir('build') { deleteDir() } } } + } // ************************* Deploy Web ******************************** stage('Deploy Web') { agent any diff --git a/MaterialLib/Adsorption/ReactionSinusoidal.h b/MaterialLib/Adsorption/ReactionSinusoidal.h index f0b3b0fda80a6e5a801c4edff3462127bb7007fe..47bfab022dcb62b635aee1835070da7d9a885938 100644 --- a/MaterialLib/Adsorption/ReactionSinusoidal.h +++ b/MaterialLib/Adsorption/ReactionSinusoidal.h @@ -13,6 +13,7 @@ #include "Reaction.h" #include "BaseLib/ConfigTree.h" +#include "BaseLib/Error.h" #include "BaseLib/StringTools.h" namespace Adsorption diff --git a/MaterialLib/PorousMedium/UnsaturatedProperty/CapillaryPressure/CapillaryPressureSaturation.h b/MaterialLib/PorousMedium/UnsaturatedProperty/CapillaryPressure/CapillaryPressureSaturation.h index e4eb317ecd1c64051f1f64bd2a7358d872cec99b..a8fe13a4b8faf4a6d9f5897c42c7add5171966b2 100644 --- a/MaterialLib/PorousMedium/UnsaturatedProperty/CapillaryPressure/CapillaryPressureSaturation.h +++ b/MaterialLib/PorousMedium/UnsaturatedProperty/CapillaryPressure/CapillaryPressureSaturation.h @@ -11,6 +11,7 @@ #pragma once +#include <limits> #include <string> namespace MaterialLib diff --git a/NumLib/Assembler/SerialExecutor.h b/NumLib/Assembler/SerialExecutor.h index 6ba4c6fe15b8595cdca8d856420ea0e62fe291c2..6ddfb3a47ba24ef1e517ce53a46473a3d7fa3cbe 100644 --- a/NumLib/Assembler/SerialExecutor.h +++ b/NumLib/Assembler/SerialExecutor.h @@ -12,6 +12,9 @@ #pragma once +#include <cstddef> +#include <utility> + namespace NumLib { diff --git a/NumLib/Fem/Integration/IntegrationGaussPrism.h b/NumLib/Fem/Integration/IntegrationGaussPrism.h index 19463f316ad47ded60c17fea6019826c57bb469c..6e97ee22ac1e28093fe798e7bc116055b806518d 100644 --- a/NumLib/Fem/Integration/IntegrationGaussPrism.h +++ b/NumLib/Fem/Integration/IntegrationGaussPrism.h @@ -9,6 +9,7 @@ #pragma once +#include "MathLib/TemplateWeightedPoint.h" #include "MathLib/Integration/GaussLegendre.h" #include "MathLib/Integration/GaussLegendreTri.h" diff --git a/NumLib/Fem/Integration/IntegrationGaussPyramid.h b/NumLib/Fem/Integration/IntegrationGaussPyramid.h index 91e1244aab394bdb91f1b7e806d7de6d168fce83..ad737e50b38f5b06d9f742bea5e8f0680c509073 100644 --- a/NumLib/Fem/Integration/IntegrationGaussPyramid.h +++ b/NumLib/Fem/Integration/IntegrationGaussPyramid.h @@ -9,6 +9,7 @@ #pragma once +#include "MathLib/TemplateWeightedPoint.h" #include "MathLib/Integration/GaussLegendrePyramid.h" namespace NumLib diff --git a/NumLib/Fem/Integration/IntegrationGaussTet.h b/NumLib/Fem/Integration/IntegrationGaussTet.h index e698dc357fe2b5ad81980d03a6a6bce6d09bc0b4..537f6d9940ba9d1c320172cd69a9add0d0da813c 100644 --- a/NumLib/Fem/Integration/IntegrationGaussTet.h +++ b/NumLib/Fem/Integration/IntegrationGaussTet.h @@ -9,6 +9,7 @@ #pragma once +#include "MathLib/TemplateWeightedPoint.h" #include "MathLib/Integration/GaussLegendreTet.h" namespace NumLib diff --git a/NumLib/Fem/Integration/IntegrationGaussTri.h b/NumLib/Fem/Integration/IntegrationGaussTri.h index 3af4e898d4b2ec6ebda96c57144ca8056cd3bcda..687663440b535b1da0185bbd7232215a924d4f93 100644 --- a/NumLib/Fem/Integration/IntegrationGaussTri.h +++ b/NumLib/Fem/Integration/IntegrationGaussTri.h @@ -14,6 +14,7 @@ #pragma once +#include "MathLib/TemplateWeightedPoint.h" #include "MathLib/Integration/GaussLegendreTri.h" namespace NumLib diff --git a/NumLib/Fem/Integration/IntegrationPoint.h b/NumLib/Fem/Integration/IntegrationPoint.h index 12c95a68c15885593fa8f3b807e14ff9be2e98ae..d8a5f859a126229aebac141efd745cb9c0ea46ff 100644 --- a/NumLib/Fem/Integration/IntegrationPoint.h +++ b/NumLib/Fem/Integration/IntegrationPoint.h @@ -9,6 +9,8 @@ #pragma once +#include "MathLib/TemplateWeightedPoint.h" + namespace NumLib { /// Integration rule for point elements. diff --git a/ProcessLib/BoundaryCondition/GenericNaturalBoundaryConditionLocalAssembler.h b/ProcessLib/BoundaryCondition/GenericNaturalBoundaryConditionLocalAssembler.h index 4d37ae2394f299132cd049340b9e5062611bf611..219085cfc062f1d2a36ed66822919d96fc5f4128 100644 --- a/ProcessLib/BoundaryCondition/GenericNaturalBoundaryConditionLocalAssembler.h +++ b/ProcessLib/BoundaryCondition/GenericNaturalBoundaryConditionLocalAssembler.h @@ -9,6 +9,7 @@ #pragma once +#include "NumLib/DOF/LocalToGlobalIndexMap.h" #include "NumLib/Fem/ShapeMatrixPolicy.h" #include "ProcessLib/Utils/InitShapeMatrices.h" diff --git a/ProcessLib/BoundaryCondition/GenericNonuniformNaturalBoundaryConditionLocalAssembler.h b/ProcessLib/BoundaryCondition/GenericNonuniformNaturalBoundaryConditionLocalAssembler.h index 1c353a4601dd3a5004aea8f04fd6ae24661cd23c..72929d11a5e3fb97a71905bb7c08464627d09230 100644 --- a/ProcessLib/BoundaryCondition/GenericNonuniformNaturalBoundaryConditionLocalAssembler.h +++ b/ProcessLib/BoundaryCondition/GenericNonuniformNaturalBoundaryConditionLocalAssembler.h @@ -9,6 +9,7 @@ #pragma once +#include "NumLib/DOF/LocalToGlobalIndexMap.h" #include "NumLib/Fem/ShapeMatrixPolicy.h" #include "ProcessLib/Utils/InitShapeMatrices.h" diff --git a/ProcessLib/BoundaryCondition/NormalTractionBoundaryConditionLocalAssembler.h b/ProcessLib/BoundaryCondition/NormalTractionBoundaryConditionLocalAssembler.h index e5b23b82033c45e14bb1b6ae32c837d55181c9aa..e296fa1071d80b2852adfbbc4f6a750fd32ea4a4 100644 --- a/ProcessLib/BoundaryCondition/NormalTractionBoundaryConditionLocalAssembler.h +++ b/ProcessLib/BoundaryCondition/NormalTractionBoundaryConditionLocalAssembler.h @@ -10,6 +10,7 @@ #pragma once +#include "MeshLib/Elements/FaceRule.h" #include "MathLib/LinAlg/Eigen/EigenMapTools.h" #include "NumLib/DOF/DOFTableUtil.h" #include "ProcessLib/Parameter/Parameter.h" diff --git a/ProcessLib/CalculateSurfaceFlux/CalculateSurfaceFluxLocalAssembler.h b/ProcessLib/CalculateSurfaceFlux/CalculateSurfaceFluxLocalAssembler.h index 871804f0a93225c9467601e8b352daa13a4b2f56..b463710650f693c1bcfca5a2fd97d28434f62bc4 100644 --- a/ProcessLib/CalculateSurfaceFlux/CalculateSurfaceFluxLocalAssembler.h +++ b/ProcessLib/CalculateSurfaceFlux/CalculateSurfaceFluxLocalAssembler.h @@ -12,8 +12,9 @@ #include "NumLib/Fem/ShapeMatrixPolicy.h" #include "NumLib/DOF/DOFTableUtil.h" -#include "ProcessLib/Parameter/Parameter.h" +#include "ProcessLib/Process.h" +#include "ProcessLib/Parameter/Parameter.h" #include "ProcessLib/Utils/InitShapeMatrices.h" #include "MapBulkElementPoint.h" diff --git a/ProcessLib/Deformation/LinearBMatrix.h b/ProcessLib/Deformation/LinearBMatrix.h index cbf3a087fd64b565df76653e6b500f7474542612..07fa2032cb760c9e250a96a3ac5afa560da2e188 100644 --- a/ProcessLib/Deformation/LinearBMatrix.h +++ b/ProcessLib/Deformation/LinearBMatrix.h @@ -9,6 +9,8 @@ #pragma once +#include "ProcessLib/Deformation/BMatrixPolicy.h" + #include <cmath> namespace ProcessLib diff --git a/ProcessLib/HT/HTLocalAssemblerInterface.h b/ProcessLib/HT/HTLocalAssemblerInterface.h index cd600c317362e75d51b26df2da94b66df7cbe28f..c0d8761f5b319d3e351c957462b895b7a0f9ca3d 100644 --- a/ProcessLib/HT/HTLocalAssemblerInterface.h +++ b/ProcessLib/HT/HTLocalAssemblerInterface.h @@ -11,6 +11,7 @@ #pragma once +#include "NumLib/Extrapolation/ExtrapolatableElement.h" #include "NumLib/Function/Interpolation.h" #include "ProcessLib/LocalAssemblerInterface.h" #include "MathLib/LinAlg/Eigen/EigenMapTools.h" @@ -71,4 +72,4 @@ protected: }; } // namespace HT -} // namespace ProcessLib \ No newline at end of file +} // namespace ProcessLib diff --git a/ProcessLib/HydroMechanics/HydroMechanicsProcessData.h b/ProcessLib/HydroMechanics/HydroMechanicsProcessData.h index a5b69d82bf62ca857db16aa697ea77e3dd299e66..b8c7b006d3250a4c93d6370a256898af1f86623d 100644 --- a/ProcessLib/HydroMechanics/HydroMechanicsProcessData.h +++ b/ProcessLib/HydroMechanics/HydroMechanicsProcessData.h @@ -9,6 +9,11 @@ #pragma once +#include "ProcessLib/Parameter/Parameter.h" + +#include <memory> +#include <utility> + #include <Eigen/Dense> namespace MaterialLib diff --git a/ProcessLib/HydroMechanics/LocalAssemblerInterface.h b/ProcessLib/HydroMechanics/LocalAssemblerInterface.h index a71b74122e2d1df108af8e519db9ee43dd57b814..fb41eea21637ca0d1b81c4983fe010309e5c525a 100644 --- a/ProcessLib/HydroMechanics/LocalAssemblerInterface.h +++ b/ProcessLib/HydroMechanics/LocalAssemblerInterface.h @@ -9,6 +9,7 @@ #pragma once +#include "NumLib/Extrapolation/ExtrapolatableElement.h" #include "ProcessLib/LocalAssemblerInterface.h" namespace ProcessLib diff --git a/ProcessLib/LIE/SmallDeformation/LocalAssembler/SecondaryData.h b/ProcessLib/LIE/SmallDeformation/LocalAssembler/SecondaryData.h index 4920d2dbbbfd831bd6ab6e784f35311e3f406529..804efe03754a388ec0fa3b858a062442b20f383d 100644 --- a/ProcessLib/LIE/SmallDeformation/LocalAssembler/SecondaryData.h +++ b/ProcessLib/LIE/SmallDeformation/LocalAssembler/SecondaryData.h @@ -9,6 +9,12 @@ #pragma once +#include <vector> + +#include <Eigen/Eigen> + +#include "NumLib/Fem/CoordinatesMapping/ShapeMatrices.h" + namespace ProcessLib { namespace LIE diff --git a/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler.h b/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler.h index f0b1de80875bbbcb8cfecd1784a1a9019f8bdd65..c31f992becb5ea6a1f1b23e04ae8b087f34df7e2 100644 --- a/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler.h +++ b/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler.h @@ -17,6 +17,8 @@ #include <vector> #include <typeindex> +#include "MaterialLib/PorousMedium/Permeability/Permeability.h" +#include "MaterialLib/PorousMedium/Storage/Storage.h" #include "MathLib/LinAlg/Eigen/EigenMapTools.h" #include "NumLib/Extrapolation/ExtrapolatableElement.h" #include "NumLib/DOF/DOFTableUtil.h" diff --git a/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.h b/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.h index c15e63b5a50564ade46165798234dee4757804c4..bafb35327de3896175649b9e922939c41b9a4b50 100644 --- a/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.h +++ b/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.h @@ -18,21 +18,9 @@ #include "MaterialLib/Fluid/FluidProperty.h" #include "MaterialLib/Fluid/FluidProperties/FluidProperties.h" - -namespace MaterialLib -{ -namespace Fluid -{ -class FluidProperties; -} - -namespace PorousMedium -{ -class Permeability; -class Porosity; -class Storage; -} -} +#include "MaterialLib/PorousMedium/Permeability/Permeability.h" +#include "MaterialLib/PorousMedium/Porosity/Porosity.h" +#include "MaterialLib/PorousMedium/Storage/Storage.h" namespace BaseLib { diff --git a/ProcessLib/LocalAssemblerTraits.h b/ProcessLib/LocalAssemblerTraits.h index c628a15b0b4865db51da8a1955620ae848e6662b..44f0e6cea68f25b856ce5ebc452a0fc8e3cc7bb3 100644 --- a/ProcessLib/LocalAssemblerTraits.h +++ b/ProcessLib/LocalAssemblerTraits.h @@ -9,6 +9,11 @@ #pragma once +#include "NumLib/Fem/ShapeMatrixPolicy.h" + +#include <cassert> +#include <type_traits> + namespace ProcessLib { diff --git a/ProcessLib/PhaseField/PhaseFieldFEM.h b/ProcessLib/PhaseField/PhaseFieldFEM.h index 336306dd8f4d45bb0caa9865da57c1d627362371..f4fcd3e3aae3a666b2dff1f216bf852c3f8d6ad1 100644 --- a/ProcessLib/PhaseField/PhaseFieldFEM.h +++ b/ProcessLib/PhaseField/PhaseFieldFEM.h @@ -18,6 +18,7 @@ #include "NumLib/Fem/ShapeMatrixPolicy.h" #include "ProcessLib/Deformation/BMatrixPolicy.h" #include "ProcessLib/Deformation/LinearBMatrix.h" +#include "ProcessLib/Parameter/SpatialPosition.h" #include "ProcessLib/Utils/InitShapeMatrices.h" #include "LocalAssemblerInterface.h" diff --git a/ProcessLib/PhaseField/PhaseFieldProcessData.h b/ProcessLib/PhaseField/PhaseFieldProcessData.h index e044afb037a5f28483eadd01652304ea721461cd..7184f64298b4c091e92e005d3fc42b423484360e 100644 --- a/ProcessLib/PhaseField/PhaseFieldProcessData.h +++ b/ProcessLib/PhaseField/PhaseFieldProcessData.h @@ -9,6 +9,11 @@ #pragma once +#include <Eigen/Eigen> + +#include <memory> +#include <utility> + namespace MaterialLib { namespace Solids diff --git a/ProcessLib/SecondaryVariableContext.h b/ProcessLib/SecondaryVariableContext.h index 6f1a517751fcac536444bbd54862b09ca31a8680..c568106df8bbae64108aad4d5323016710a3e4c2 100644 --- a/ProcessLib/SecondaryVariableContext.h +++ b/ProcessLib/SecondaryVariableContext.h @@ -9,6 +9,8 @@ #pragma once +#include "MathLib/LinAlg/GlobalMatrixVectorTypes.h" + namespace ProcessLib { /*! Provides a "global" context, e.g., for NamedFunction's. diff --git a/ProcessLib/SmallDeformation/SmallDeformationProcessData.h b/ProcessLib/SmallDeformation/SmallDeformationProcessData.h index 9704c081edd54d314f88d4bad3055330f5d0ebc1..6d3545a7949f883b8baff08ebf7bbb5dd273b461 100644 --- a/ProcessLib/SmallDeformation/SmallDeformationProcessData.h +++ b/ProcessLib/SmallDeformation/SmallDeformationProcessData.h @@ -9,6 +9,13 @@ #pragma once +#include <memory> +#include <utility> + +#include <Eigen/Eigen> + +#include "ProcessLib/Parameter/Parameter.h" + namespace MaterialLib { namespace Solids diff --git a/ProcessLib/TES/TESLocalAssembler.h b/ProcessLib/TES/TESLocalAssembler.h index 74e7973c0ec3562f5d021ef1b29b90ced638560e..f96b6635ad8424cd51669b249f7b8ee9dcb55453 100644 --- a/ProcessLib/TES/TESLocalAssembler.h +++ b/ProcessLib/TES/TESLocalAssembler.h @@ -14,6 +14,7 @@ #include "ProcessLib/LocalAssemblerInterface.h" #include "NumLib/Extrapolation/ExtrapolatableElement.h" +#include "MeshLib/Elements/Element.h" #include "TESAssemblyParams.h" #include "TESLocalAssemblerInner-fwd.h" diff --git a/ProcessLib/ThermoMechanics/ThermoMechanicsProcessData.h b/ProcessLib/ThermoMechanics/ThermoMechanicsProcessData.h index 600fcd4449d71799adbc787c0eff5c668cf40594..00c47f122f1479267fe4071471ff007c5ea50382 100644 --- a/ProcessLib/ThermoMechanics/ThermoMechanicsProcessData.h +++ b/ProcessLib/ThermoMechanics/ThermoMechanicsProcessData.h @@ -9,6 +9,13 @@ #pragma once +#include <memory> +#include <utility> + +#include <Eigen/Eigen> + +#include "ProcessLib/Parameter/Parameter.h" + namespace MaterialLib { namespace Solids diff --git a/ProcessLib/VariableTransformation.h b/ProcessLib/VariableTransformation.h index b96d20806e2020ad1dcc825dd7416b9b2ec12965..9202b58e6e573edac1ecfcf97f04cf8587c19bbd 100644 --- a/ProcessLib/VariableTransformation.h +++ b/ProcessLib/VariableTransformation.h @@ -12,6 +12,8 @@ #pragma once +#include <cmath> + namespace ProcessLib { diff --git a/scripts/cmake/CheckHeaderCompilation.cmake b/scripts/cmake/CheckHeaderCompilation.cmake new file mode 100644 index 0000000000000000000000000000000000000000..3db37b4938b8deba5828e5355ffd561f8270fb16 --- /dev/null +++ b/scripts/cmake/CheckHeaderCompilation.cmake @@ -0,0 +1,95 @@ +# Supply include directories and compiler flags +get_directory_property(INCLUDE_DIRS INCLUDE_DIRECTORIES) +set(CMAKE_REQUIRED_FLAGS "-c -std=gnu++14") +set(CMAKE_REQUIRED_QUIET TRUE) + +add_custom_target(check-header + COMMAND ${CMAKE_COMMAND} -E remove CMakeFiles/CMakeError.log + COMMAND ${CMAKE_COMMAND} . -DOGS_CHECK_HEADER_COMPILATION=ON + COMMAND ${CMAKE_COMMAND} . -DOGS_CHECK_HEADER_COMPILATION=OFF || true + COMMAND if [ -f CMakeFiles/CMakeError.log ]\; then cat CMakeFiles/CMakeError.log\; return 1\; else return 0\; fi\; + WORKING_DIRECTOY ${PROJECT_BINARY_DIR} + COMMENT "Checking header files" + USES_TERMINAL +) + +# Checks header for standalone compilation +function(_check_header_compilation TARGET) + + get_target_property(SOURCE_FILES ${TARGET} SOURCES) + get_target_property(SOURCE_DIR ${TARGET} SOURCE_DIR) + + get_directory_property(DEFS DIRECTORY ${SOURCE_DIR} COMPILE_DEFINITIONS) + foreach(DEF ${DEFS}) + if(${DEF} MATCHES ".*[0-9]\\(.*") + continue() + endif() + list(APPEND DEFS_CLEANED "-D${DEF}") + endforeach() + + get_target_property(INCLUDE_DIRS ${TARGET} INCLUDE_DIRECTORIES) + get_target_property(LINK_LIBS ${TARGET} LINK_LIBRARIES) + foreach(LIB ${LINK_LIBS}) + if(NOT TARGET ${LIB}) # Ignore non-existing targets + continue() + endif() + get_target_property(TARGET_INCLUDE_DIRS ${LIB} INCLUDE_DIRECTORIES) + if(TARGET_INCLUDE_DIRS) + list(APPEND INCLUDE_DIRS ${TARGET_INCLUDE_DIRS}) + endif() + endforeach() + list(REMOVE_DUPLICATES INCLUDE_DIRS) + + string(REPLACE "${PROJECT_SOURCE_DIR}/" "" DIRECTORY ${SOURCE_DIR}) + message(STATUS "Checking header compilation for ${DIRECTORY} ...") + include(CheckCXXSourceCompiles) + + set(CMAKE_REQUIRED_INCLUDES ${INCLUDE_DIRS} ${SOURCE_DIR}) + set(CMAKE_REQUIRED_DEFINITIONS ${DEFS_CLEANED}) + + foreach(FILE ${SOURCE_FILES}) + + if(NOT "${FILE}" MATCHES ".*\\.h") # Check only header files + continue() + endif() + if("${FILE}" MATCHES ".*-impl\\.h") # Ignore *-impl.h files + continue() + endif() + + check_cxx_source_compiles( + " + #include \"${FILE}\" + int main() { return 0; } + " + COMPILES + ) + + if(NOT COMPILES) + set(HEADER_COMPILE_ERROR TRUE CACHE INTERNAL "") + string(REPLACE "${PROJECT_SOURCE_DIR}/" "" FILE_SHORT ${FILE}) + message(STATUS " Compilation failed for ${FILE_SHORT}") + endif() + unset(COMPILES CACHE) + + endforeach() +endfunction() + +function(check_header_compilation) + if(NOT OGS_CHECK_HEADER_COMPILATION) + return() + endif() + set(HEADER_COMPILE_ERROR FALSE CACHE INTERNAL "") + + _check_header_compilation(BaseLib) + _check_header_compilation(GeoLib) + _check_header_compilation(MaterialLib) + _check_header_compilation(MathLib) + _check_header_compilation(MeshGeoToolsLib) + _check_header_compilation(MeshLib) + _check_header_compilation(NumLib) + _check_header_compilation(ProcessLib) + + if(HEADER_COMPILE_ERROR) + message(FATAL_ERROR "... header compilation check failed, see CMakeFiles/CMakeError.log for details!") + endif() +endfunction()