diff --git a/cmake/build_type_compiler_flags.cmake b/cmake/build_type_compiler_flags.cmake new file mode 100644 index 00000000..0bd4e25c --- /dev/null +++ b/cmake/build_type_compiler_flags.cmake @@ -0,0 +1,58 @@ +# (C) Copyright 2026 UCAR +# +# This software is licensed under the terms of the Apache Licence Version 2.0 +# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. + + +# IntelLLVM +if(CMAKE_CXX_COMPILER_ID STREQUAL IntelLLVM) + set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "Release C++ compiler flags" FORCE) + set(CMAKE_CXX_FLAGS_BIT "-O2 -DNDEBUG" CACHE STRING "Bit-reproducible C++ compiler flags" FORCE) + set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g -traceback" CACHE STRING "Debug C++ compiler flags" FORCE) + set(CMAKE_CXX_FLAGS_PRODUCTION "-O3 -g" CACHE STRING "Production C++ compiler flags" FORCE) + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g -DNDEBUG" CACHE STRING "Release-with-debug-info C++ compiler flags" FORCE) +endif() +if(CMAKE_C_COMPILER_ID STREQUAL IntelLLVM) + set(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "Release C compiler flags" FORCE) + set(CMAKE_C_FLAGS_BIT "-O2 -DNDEBUG" CACHE STRING "Bit-reproducible C compiler flags" FORCE) + set(CMAKE_C_FLAGS_DEBUG "-O0 -g -traceback" CACHE STRING "Debug C compiler flags" FORCE) + set(CMAKE_C_FLAGS_PRODUCTION "-O3 -g" CACHE STRING "Production C compiler flags" FORCE) + set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g -DNDEBUG" CACHE STRING "Release-with-debug-info C compiler flags" FORCE) +endif() +if(CMAKE_Fortran_COMPILER_ID STREQUAL IntelLLVM) + set(Fortran_AUTOMATIC_ARRAYS_LIMIT 32768) # (32 kb) + math(EXPR Fortran_AUTOMATIC_ARRAYS_LIMIT_KB "${Fortran_AUTOMATIC_ARRAYS_LIMIT}/1024") + + set(Fortran_FLAG_STACK_ARRAYS "-no-heap-arrays") + set(Fortran_FLAG_AUTOMATIC_ARRAYS "-heap-arrays ${Fortran_AUTOMATIC_ARRAYS_LIMIT_KB}") + + set(CMAKE_Fortran_FLAGS_RELEASE "-O3 -DNDEBUG -unroll -inline ${Fortran_FLAG_AUTOMATIC_ARRAYS}" CACHE STRING "Release Fortran flags" FORCE) + set(CMAKE_Fortran_FLAGS_RELWITHDEBINFO "-O2 -g -DNDEBUG ${Fortran_FLAG_AUTOMATIC_ARRAYS}" CACHE STRING "Release-with-debug-info Fortran flags" FORCE) + set(CMAKE_Fortran_FLAGS_BIT "-O2 -DNDEBUG -unroll -inline ${Fortran_FLAG_AUTOMATIC_ARRAYS}" CACHE STRING "Bit-reproducible Fortran flags" FORCE) + set(CMAKE_Fortran_FLAGS_DEBUG "-O0 -g -traceback ${Fortran_FLAG_AUTOMATIC_ARRAYS} -check all" CACHE STRING "Debug Fortran flags" FORCE) + set(CMAKE_Fortran_FLAGS_PRODUCTION "-O3 -g ${Fortran_FLAG_AUTOMATIC_ARRAYS}" CACHE STRING "Production Fortran compiler flags" FORCE) +endif() + + +# NVHPC +if(CMAKE_CXX_COMPILER_ID STREQUAL NVHPC) + set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "Release C++ compiler flags" FORCE) + set(CMAKE_CXX_FLAGS_BIT "-O2 -DNDEBUG" CACHE STRING "Bit-reproducible C++ compiler flags" FORCE) + set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g -traceback" CACHE STRING "Debug C++ compiler flags" FORCE) + set(CMAKE_CXX_FLAGS_PRODUCTION "-O3 -g" CACHE STRING "Production C++ compiler flags" FORCE) + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g -DNDEBUG" CACHE STRING "Release-with-debug-info C++ compiler flags" FORCE) +endif() +if(CMAKE_C_COMPILER_ID STREQUAL NVHPC) + set(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "Release C compiler flags" FORCE) + set(CMAKE_C_FLAGS_BIT "-O2 -DNDEBUG" CACHE STRING "Bit-reproducible C compiler flags" FORCE) + set(CMAKE_C_FLAGS_DEBUG "-O0 -g -traceback" CACHE STRING "Debug C compiler flags" FORCE) + set(CMAKE_C_FLAGS_PRODUCTION "-O3 -g" CACHE STRING "Production C compiler flags" FORCE) + set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g -DNDEBUG" CACHE STRING "Release-with-debug-info C compiler flags" FORCE) +endif() +if(CMAKE_Fortran_COMPILER_ID STREQUAL NVHPC) + set(CMAKE_Fortran_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "Release Fortran compiler flags" FORCE) + set(CMAKE_Fortran_FLAGS_BIT "-O2 -DNDEBUG" CACHE STRING "Bit-reproducible Fortran compiler flags" FORCE) + set(CMAKE_Fortran_FLAGS_DEBUG "-O0 -g -traceback" CACHE STRING "Debug Fortran compiler flags" FORCE) + set(CMAKE_Fortran_FLAGS_PRODUCTION "-O3 -g" CACHE STRING "Production Fortran compiler flags" FORCE) + set(CMAKE_Fortran_FLAGS_RELWITHDEBINFO "-O2 -g -DNDEBUG" CACHE STRING "Release-with-debug-info Fortran compiler flags" FORCE) +endif() diff --git a/cmake/compiler_flags_Cray_Fortran.cmake b/cmake/compiler_flags_Cray_Fortran.cmake deleted file mode 100644 index cdca7bca..00000000 --- a/cmake/compiler_flags_Cray_Fortran.cmake +++ /dev/null @@ -1,56 +0,0 @@ -# (C) Copyright 2009-2016 ECMWF. -# -# This software is licensed under the terms of the Apache Licence Version 2.0 -# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. -# In applying this licence, ECMWF does not waive the privileges and immunities -# granted to it by virtue of its status as an intergovernmental organisation nor -# does it submit to any jurisdiction. - -#################################################################### -# FLAGS COMMON TO ALL BUILD TYPES -#################################################################### -set( CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -emf -rmoid -lhugetlbfs") - -if( HAVE_OMP ) - set( CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -homp") -else( ) - set( CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -hnoomp") -endif( ) - -#################################################################### -# RELEASE FLAGS -#################################################################### - -set( CMAKE_Fortran_FLAGS_RELEASE "-O3 -hfp3 -hscalar3 -hvector3 -hPIC" ) - -#################################################################### -# DEBUG FLAGS -#################################################################### - -set( CMAKE_Fortran_FLAGS_DEBUG "-O0 -Gfast -Ktrap=fp" ) - -#################################################################### -# BIT REPRODUCIBLE FLAGS -#################################################################### - -set( CMAKE_Fortran_FLAGS_BIT "-O2 -hflex_mp=conservative -hadd_paren -hfp1" ) - -#################################################################### -# LINK FLAGS -#################################################################### - -set( CMAKE_Fortran_LINK_FLAGS "-Wl,-Map,loadmap" ) - -#################################################################### - -# Meaning of flags -# ---------------- -# -hfp3 : Special optimisation for floating points -# -Ktrap=fp : Abort on NaN -# -R b : Bounds checking -# -hflex_mp=conservative -hfp1 : Obtain bit-reproducible results -# -hflex_mp=intolerant -hfp2 : Obtain bit-reproducible results (also) -# -hadd_paren : encourage left to right fp evaluation -# -hscalarN , -hvectorN : optimisation for scalar and vectorisation -# -homp/-hnoomp : Enable/Disable OpenMP -# -rmoi : create compiler listing diff --git a/cmake/compiler_flags_GNU_Fortran.cmake b/cmake/compiler_flags_GNU_Fortran.cmake deleted file mode 100644 index b7283f09..00000000 --- a/cmake/compiler_flags_GNU_Fortran.cmake +++ /dev/null @@ -1,50 +0,0 @@ -# (C) Copyright 2009-2016 ECMWF. -# -# This software is licensed under the terms of the Apache Licence Version 2.0 -# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. -# In applying this licence, ECMWF does not waive the privileges and immunities -# granted to it by virtue of its status as an intergovernmental organisation nor -# does it submit to any jurisdiction. - -#################################################################### -# FLAGS COMMON TO ALL BUILD TYPES -#################################################################### - -if( HAVE_AUTOPROFILE ) - set( CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -finstrument-functions") -endif( ) - -set( CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -D_REAL8_ -ffree-line-length-none") - -#################################################################### -# RELEASE FLAGS -#################################################################### - -set( CMAKE_Fortran_FLAGS_RELEASE "-O3 -funroll-all-loops -fopenmp -finline-functions ") - -#################################################################### -# DEBUG FLAGS -#################################################################### - -set( CMAKE_Fortran_FLAGS_DEBUG "-O0 -g -fcheck=bounds -ffpe-trap=invalid,zero,overflow -fbacktrace" ) - -#################################################################### -# BIT REPRODUCIBLE FLAGS -#################################################################### - -set( CMAKE_Fortran_FLAGS_BIT "-O2 -funroll-all-loops -finline-functions" ) - -#################################################################### -# LINK FLAGS -#################################################################### - -set( CMAKE_Fortran_LINK_FLAGS "-fopenmp" ) - -#################################################################### - -# Meaning of flags -# ---------------- -# -fstack-arrays : Allocate automatic arrays on the stack (needs large stacksize!!!) -# -funroll-all-loops : Unroll all loops -# -fcheck=bounds : Bounds checking - diff --git a/cmake/compiler_flags_IntelLLVM_Fortran.cmake b/cmake/compiler_flags_IntelLLVM_Fortran.cmake deleted file mode 100644 index 289ffb68..00000000 --- a/cmake/compiler_flags_IntelLLVM_Fortran.cmake +++ /dev/null @@ -1,51 +0,0 @@ -#################################################################### -# FLAGS COMMON TO ALL BUILD TYPES -#################################################################### - -set( CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -assume byterecl" ) - -if( HAVE_AUTOPROFILE ) - set( CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -finstrument-functions" ) -endif() - -#################################################################### -# RELEASE FLAGS -#################################################################### - -set( CMAKE_Fortran_FLAGS_RELEASE - "-O3 -unroll -no-heap-arrays -assume byterecl -qopenmp" ) - -#################################################################### -# DEBUG FLAGS -#################################################################### - -set( CMAKE_Fortran_FLAGS_DEBUG - "-O0 -g -check bounds -traceback -warn all -no-heap-arrays -fpe0 -ftz -check all -assume byterecl -qopenmp" ) - -#################################################################### -# RELWITHDEBINFO FLAGS -#################################################################### - -set( CMAKE_Fortran_FLAGS_RELWITHDEBINFO - "-g -O0 -traceback -fno-openmp" ) -# "-O2 -g -DNDEBUG -check bounds -traceback -no-heap-arrays -assume byterecl -qopenmp" ) - -#################################################################### -# BIT REPRODUCIBLE FLAGS -#################################################################### - -set( CMAKE_Fortran_FLAGS_BIT - "-O2 -no-heap-arrays -fp-model strict -assume byterecl -qopenmp" ) - -#################################################################### -# LINK FLAGS -#################################################################### - -set( CMAKE_Fortran_LINK_FLAGS ) - -#################################################################### -# Notes: -# - `-qopenmp` enables OpenMP for `ifx`, including linking the necessary runtime -# - For GPU offload: Add `-fopenmp-targets=spir64` (Intel GPU) or `-fopenmp-targets=nvptx64-nvidia-cuda` (NVIDIA) -# - Reproducibility: `-fp-model strict` ensures bitwise results but may hurt perf -# - Consider `-diag-disable=10448` if `ifx` emits unnecessary diagnostic noise diff --git a/cmake/compiler_flags_Intel_Fortran.cmake b/cmake/compiler_flags_Intel_Fortran.cmake deleted file mode 100644 index 4fba04ed..00000000 --- a/cmake/compiler_flags_Intel_Fortran.cmake +++ /dev/null @@ -1,43 +0,0 @@ -#################################################################### -# FLAGS COMMON TO ALL BUILD TYPES -#################################################################### - -set( CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -assume byterecl") - -if( HAVE_AUTOPROFILE ) - set( CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -finstrument-functions") -endif( ) - -#################################################################### -# RELEASE FLAGS -#################################################################### - -set( CMAKE_Fortran_FLAGS_RELEASE "-O3 -ip -unroll -inline -no-heap-arrays" ) - -#################################################################### -# DEBUG FLAGS -#################################################################### - -set( CMAKE_Fortran_FLAGS_DEBUG "-O0 -g -check bounds -traceback -warn -heap-arrays -fpe-all=0 -fpe:0 -ftz -check all -no-inline" ) - -#################################################################### -# RELEASE WITH DEBUG INFO FLAGS -#################################################################### - -set( CMAKE_Fortran_FLAGS_RELWITHDEBINFO "-O3 -ip -unroll -inline -g -DNDEBUG -check bounds -traceback -no-heap-arrays -assume byterecl" ) - -#################################################################### -# BIT REPRODUCIBLE FLAGS -#################################################################### - -set( CMAKE_Fortran_FLAGS_BIT "-O2 -ip -ipo -unroll -inline -no-heap-arrays" ) - -#################################################################### -# LINK FLAGS -#################################################################### - -set( CMAKE_Fortran_LINK_FLAGS "" ) - -#################################################################### - - diff --git a/cmake/compiler_flags_XL_Fortran.cmake b/cmake/compiler_flags_XL_Fortran.cmake deleted file mode 100644 index 6eecf0ee..00000000 --- a/cmake/compiler_flags_XL_Fortran.cmake +++ /dev/null @@ -1,59 +0,0 @@ -# (C) Copyright 2009-2016 ECMWF. -# -# This software is licensed under the terms of the Apache Licence Version 2.0 -# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. -# In applying this licence, ECMWF does not waive the privileges and immunities -# granted to it by virtue of its status as an intergovernmental organisation nor -# does it submit to any jurisdiction. - - -# WARNING!! -# Following has not been thoroughly tested. Take these flags with grain of salt - - -# Without following line, compile flags are appended to link flags -set( CMAKE_Fortran_LINK_EXECUTABLE " -o ") - -#################################################################### -# FLAGS COMMON TO ALL BUILD TYPES -#################################################################### - -if( ${HAVE_OMP} ) - set( CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -qsmp=omp" ) - set( CMAKE_Fortran_LINK_FLAGS "${CMAKE_Fortran_LINK_FLAGS} -qsmp=omp" ) -else( ) - set( CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -qsmp=noomp" ) - set( CMAKE_Fortran_LINK_FLAGS "${CMAKE_Fortran_LINK_FLAGS} -qsmp=noomp" ) -endif( ) - -set( CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -qfree=F90 -qsuffix=cpp=F90 -qextname -q64=largetype -qarch=pwr5 -g -qsource,list -qsaveopt -NS32648" ) - -#################################################################### -# RELEASE FLAGS -#################################################################### - -set( CMAKE_Fortran_FLAGS_RELEASE "-O3 -qstrict" ) - -#################################################################### -# DEBUG FLAGS -#################################################################### - -set( CMAKE_Fortran_FLAGS_DEBUG "-O0" ) - -#################################################################### -# BIT REPRODUCIBLE FLAGS -#################################################################### - -set( CMAKE_Fortran_FLAGS_BIT "-O3 -qstrict" ) - -#################################################################### -# LINK FLAGS -#################################################################### - -set( CMAKE_Fortran_LINK_FLAGS "${CMAKE_Fortran_LINK_FLAGS} -b64 -bbigtoc -bmaxstack:0x800000000 -bloadmap:map -bmap:map") - -#################################################################### - -# Meaning of flags -# ---------------- -# todo diff --git a/cmake/crtm_compiler_flags.cmake b/cmake/crtm_compiler_flags.cmake index 187a6458..7b356e86 100644 --- a/cmake/crtm_compiler_flags.cmake +++ b/cmake/crtm_compiler_flags.cmake @@ -1,37 +1,27 @@ +# (C) Copyright 2026 UCAR +# +# This software is licensed under the terms of the Apache Licence Version 2.0 +# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. -if( NOT CMAKE_BUILD_TYPE MATCHES "Debug" ) - add_definitions( -DNDEBUG ) -endif() - -####################################################################################### -# Fortran -####################################################################################### - -message(STATUS "Compiler ID: ${CMAKE_Fortran_COMPILER_ID}") -message(STATUS "Compiler: ${CMAKE_Fortran_COMPILER}") - -set(CMAKE_FORTRAN_STANDARD 08) -set(CMAKE_FORTRAN_STANDARD_REQUIRED ON) -set(CMAKE_FORTRAN_EXTENSIONS OFF) - -if( CMAKE_Fortran_COMPILER_ID STREQUAL "GNU" ) - include( compiler_flags_GNU_Fortran ) -elseif( CMAKE_Fortran_COMPILER_ID STREQUAL "IntelLLVM" ) - include( compiler_flags_IntelLLVM_Fortran ) +# Set compiler flags for basic build types, +# for compilers where this is not provided by ecbuild. +include(build_type_compiler_flags) -elseif( CMAKE_Fortran_COMPILER_ID STREQUAL "Intel" ) - include( compiler_flags_Intel_Fortran ) +# Set JEDI's common compiler flags +include(jedi_common_compiler_flags) -elseif( CMAKE_Fortran_COMPILER_ID STREQUAL "PGI" OR CMAKE_Fortran_COMPILER_ID STREQUAL "NVHPC" ) - include( compiler_flags_NVHPC_Fortran ) - -elseif( CMAKE_Fortran_COMPILER_ID STREQUAL "XL" ) - include( compiler_flags_XL_Fortran ) - -elseif( CMAKE_Fortran_COMPILER_ID STREQUAL "Cray" ) - include( compiler_flags_Cray_Fortran ) - -else() - message( STATUS "Fortran compiler with ID ${CMAKE_Fortran_COMPILER_ID} will be used with CMake default options") +# Set CRTM-specific compiler flags +if(CMAKE_Fortran_COMPILER_ID STREQUAL GNU) + ecbuild_add_fortran_flags("-ffree-line-length-none") +endif() +if(CMAKE_Fortran_COMPILER_ID STREQUAL Intel) + ecbuild_add_fortran_flags("-assume byterecl") +endif() +if(CMAKE_Fortran_COMPILER_ID STREQUAL IntelLLVM) + # to match historical behavior, disable RelWithDebugInfo optimization for IntelLLVM + # TODO: determine source of problem and resolve in a more elegant way, then return + # to default compiler flags so that RELWITHDEBINFO does what it says + set( CMAKE_Fortran_FLAGS_RELWITHDEBINFO "-O0 -g -DNDEBUG -traceback -heap-arrays 32" ) + ecbuild_add_fortran_flags("-assume byterecl") endif() diff --git a/cmake/jedi_common_compiler_flags.cmake b/cmake/jedi_common_compiler_flags.cmake new file mode 100644 index 00000000..bc564329 --- /dev/null +++ b/cmake/jedi_common_compiler_flags.cmake @@ -0,0 +1,85 @@ +# (C) Copyright 2026 UCAR +# +# This software is licensed under the terms of the Apache Licence Version 2.0 +# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. + + +# Flags exposed via configuration options +ecbuild_add_option(FEATURE WARNINGS + DEFAULT ON + DESCRIPTION "Add warnings to compiler") + +if(HAVE_WARNINGS) + ecbuild_add_cxx_flags("-Wall" NO_FAIL) + ecbuild_add_cxx_flags("-Wno-sign-compare" NO_FAIL) + #ecbuild_add_cxx_flags("-Wextra" NO_FAIL) # JEDI as a whole is not ready to enable these yet + + #ecbuild_add_fortran_flags("-Wall" NO_FAIL) # gfortran + if(CMAKE_Fortran_COMPILER_ID MATCHES Intel) # Intel or IntelLLVM + ecbuild_add_fortran_flags("-warn") + endif() +endif() + + +# Configure C++ flags + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +# Clang, Cray -> ecbuild defaults + +# GCC +if(CMAKE_CXX_COMPILER_ID STREQUAL GNU) + ecbuild_add_cxx_flags("-ftrapv" BUILD DEBUG) # trap on signed integer overflow +endif() + +# Intel +if(CMAKE_CXX_COMPILER_ID STREQUAL Intel) + ecbuild_add_cxx_flags("-fp-trap=common -fp-model=precise" BUILD DEBUG) +endif() +if(CMAKE_CXX_COMPILER_ID STREQUAL IntelLLVM) + ecbuild_add_cxx_flags("-fp-model=precise" BUILD DEBUG) +endif() + +# NVHPC +if(CMAKE_CXX_COMPILER_ID STREQUAL NVHPC) + ecbuild_add_cxx_flags("-Mbounds -Mchkstk -Ktrap=fp" BUILD DEBUG) +endif() + +# Configure C flags + +set(CMAKE_C_STANDARD 11) +set(CMAKE_C_STANDARD_REQUIRED ON) +set(CMAKE_C_EXTENSIONS OFF) + + +# Configure Fortran flags + +set(CMAKE_FORTRAN_STANDARD 08) +set(CMAKE_FORTRAN_STANDARD_REQUIRED ON) +set(CMAKE_FORTRAN_EXTENSIONS OFF) + +# Cray -> ecbuild defaults + +# GCC +if(CMAKE_Fortran_COMPILER_ID STREQUAL GNU) + ecbuild_add_fortran_flags("-ffpe-trap=invalid,zero,overflow" BUILD DEBUG) +endif() + +# Intel +if(CMAKE_Fortran_COMPILER_ID MATCHES Intel) # Intel or IntelLLVM + ecbuild_add_fortran_flags("-ftrapuv -fp-model=precise -fpe-all=0" BUILD DEBUG) +endif() + +# NAG +if(CMAKE_Fortran_COMPILER_ID STREQUAL NAG) + set(FORTRAN_LINKER_LANGUAGE "CXX") +endif() + +# NVHPC +if(CMAKE_Fortran_COMPILER_ID STREQUAL NVHPC) + ecbuild_add_fortran_flags("-Mpreprocess") + ecbuild_add_fortran_flags("-Mbounds -Mchkstk -Ktrap=fp" BUILD DEBUG) +endif() +