1# Copyright (c) 2020 - 2024 David Guibert
2# Copyright (c) 2024 - 2025 Niclas Schroeter
3# Copyright (c) 2024 Antoine Morvan
6# SPDX-License-Identifier: Apache-2.0
8include(icon-test-setup)
10option(ENABLE_icon_gpu "Enable icon gpu parts" OFF)
11option(ENABLE_icon_large_inputs "Enable download of large inputs for icon" OFF)
12option(COPY_ICON_INPUTS "When creating the test cases, the data is copied instead of linked. Recommended if changes to i.e. namelists are planned." OFF)
13set(ICON_TESTCASE_JSON "" CACHE PATH "Absolute path ('~' not expanded) to the input json that contains information on the number of setups per test case.")
14set(ICON_USER_BUILD_WRAPPER "" CACHE STRING "Use an existing config wrapper from ICON")
16set(icon_configure_args "" CACHE STRING "Custom configure arguments for ICON")
17set(icon_build_args "" CACHE STRING "Custom Make arguments for ICON")
19set_property(GLOBAL PROPERTY icon_can_use_system TRUE)
35 set_property(GLOBAL APPEND PROPERTY icon_depends cuda)
40 find_program(ICON_EXE icon REQUIRED)
41 message(STATUS "ICON: enabled (system installed)")
42 message(STATUS "ICON: ${ICON_EXE}")
43 set_if_not_present(ENV{PATH} "$ENV{PATH}" "${ICON_EXE}")
45 message(STATUS "ICON: enabled (internally built)")
48 set(icon_depends_ep ZLIB::ZLIB SZIP::SZIP netcdf::Fortran libfyaml eccodes eccodes_f90)
49 list(APPEND icon_depends_ep openblas LibXml2::LibXml2)
51 # use configure as default build script, so that specific sites can use
52 # specific wrappers that are a lot easier to debug
53 set(ICON_BUILD_WRAPPER configure)
55 # basic libs setup needed for all ICON tests
57 list(APPEND LIBS_LIST -lxml2)
58 list(APPEND LIBS_LIST -lnetcdf)
59 list(APPEND LIBS_LIST -lnetcdff)
60 list(APPEND LIBS_LIST -lhdf5)
61 list(APPEND LIBS_LIST -lhdf5_hl)
62 list(APPEND LIBS_LIST -lfyaml)
63 list(APPEND LIBS_LIST ${BLAS_LIBRARIES_LIBS})
64 list(APPEND LIBS_LIST ${LAPACK_LIBRARIES_LIBS})
65 list(APPEND LIBS_LIST ${LAPACK_BLAS_LIBS})
66 list(APPEND LIBS_LIST -leccodes)
67 list(APPEND LIBS_LIST -leccodes_f90)
69 set(NVC_FLAGS_LIST "")
71 if(NOT ICON_USER_BUILD_WRAPPER STREQUAL "")
72 set(ICON_BUILD_WRAPPER ${ICON_USER_BUILD_WRAPPER})
75 "-I${HDF5_DIR}/include -I${NETCDF_DIR}/include -I${NETCDFF_DIR}/include -I${LIBXML2_DIR}/include/libxml2 -I${LIBFYAML_INCLUDE_DIR} -I${ECCODES_DIR}/include"
77 list(APPEND ICON_BUILD_WRAPPER "CC=${MPI_C_COMPILER}")
78 list(APPEND ICON_BUILD_WRAPPER "CFLAGS=${CFLAGS} $ENV{CFLAGS}")
79 list(APPEND ICON_BUILD_WRAPPER "CPPFLAGS=${CPPFLAGS} $ENV{CPPFLAGS} ${INCLUDE_FLAGS}")
80 list(APPEND ICON_BUILD_WRAPPER "FC=${MPI_Fortran_COMPILER}")
81 list(APPEND ICON_BUILD_WRAPPER "FCFLAGS=${FCFLAGS} $ENV{FCFLAGS} ${INCLUDE_FLAGS}")
82 list(APPEND ICON_BUILD_WRAPPER "ICON_FCFLAGS=${ICON_FCFLAGS}")
85 list(APPEND LDFLAGS_LIST -L${HDF5_DIR}/lib)
86 list(APPEND LDFLAGS_LIST -L${NETCDF_DIR}/lib)
87 list(APPEND LDFLAGS_LIST -L${NETCDFF_DIR}/lib)
88 list(APPEND LDFLAGS_LIST -L${LIBFYAML_LIB_DIR})
89 list(APPEND LDFLAGS_LIST -L${LIBXML2_DIR}/lib)
90 list(APPEND LDFLAGS_LIST ${BLAS_LINKER_FLAGS})
91 list(APPEND LDFLAGS_LIST ${LAPACK_LINKER_FLAGS})
92 list(APPEND LDFLAGS_LIST -L${ECCODES_DIR}/lib64)
94 list(APPEND LDFLAGS_LIST -L${CUDAToolkit_LIBRARY_DIR})
96 list(JOIN LDFLAGS_LIST " " LDFLAGS_)
97 list(APPEND ICON_BUILD_WRAPPER "LDFLAGS=${LDFLAGS} $ENV{LDFLAGS} ${LDFLAGS_}")
99 if(DEFINED ICON_OCEAN_FCFLAGS OR DEFINED ENV{ICON_OCEAN_FCFLAGS})
100 list(APPEND ICON_BUILD_WRAPPER "--enable-fcgroup-OCEAN=src/hamocc:src/ocean:src/sea_ice")
101 list(APPEND ICON_BUILD_WRAPPER "ICON_OCEAN_FCFLAGS=${ICON_OCEAN_FCFLAGS}")
104 list(APPEND ICON_BUILD_WRAPPER "MPI_LAUNCH=${MPIEXEC_EXECUTABLE}")
106 list(APPEND LIBS_LIST -c++libs)
107 list(APPEND LIBS_LIST -cuda)
108 if(NVCFLAGS) # this is supposed to be a list because of the
109 # space-quotation-black-magic of cmake
110 list(JOIN NVCFLAGS " " NVCFLAGS)
111 list(APPEND ICON_BUILD_WRAPPER "NVCFLAGS=${NVCFLAGS}")
113 list(APPEND ICON_BUILD_WRAPPER --enable-gpu)
114 # list(APPEND ICON_BUILD_WRAPPER --disable-openmp) # don't mix
116 list(APPEND ICON_BUILD_WRAPPER --disable-loop-exchange) # don't interfere
119 list(APPEND ICON_BUILD_WRAPPER --disable-yaxt) # yaxt is not supposed to
120 # work on the GPU, yet
122 list(APPEND ICON_BUILD_WRAPPER --disable-gpu --enable-openmp
124 list(APPEND ICON_BUILD_WRAPPER --enable-intel-consistency
125 --enable-vectorized-lrtm)
128 # my workaround for cmake's way to mess around with quotation ALL THE TIME
129 list(JOIN LIBS_LIST " " LIBS)
130 list(APPEND ICON_BUILD_WRAPPER "LIBS=${LIBS}")
131 list(APPEND ICON_BUILD_WRAPPER --enable-parallel-netcdf --enable-mpi
132 --disable-mpi-checks)
133 list(APPEND ICON_BUILD_WRAPPER --enable-grib2 --enable-ecrad)
134 list(APPEND ICON_BUILD_WRAPPER "${default_configure_args};${icon_configure_args}")
137 message("Build ICON with '${ICON_BUILD_WRAPPER}'")
139 ExternalProject_Data_Add(
141 DEPENDS ${icon_depends_ep}
145 CPATH=$ENV{CPATH} C_INCLUDE_PATH=$ENV{C_INCLUDE_PATH}
146 LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH} LIBRARY_PATH=$ENV{LIBRARY_PATH}
147 PATH=$ENV{PATH} PARALLEL_LEVEL=${BUILD_PARALLEL_LEVEL}
148 <SOURCE_DIR>/${ICON_BUILD_WRAPPER} --prefix=<INSTALL_DIR>
150 PATH=$ENV{PATH} CPATH=$ENV{CPATH} C_INCLUDE_PATH=$ENV{C_INCLUDE_PATH}
151 LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH} LIBRARY_PATH=$ENV{LIBRARY_PATH}
152 ${CMAKE_MAKE_PROGRAM} -j${BUILD_PARALLEL_LEVEL} ${default_build_args} ${icon_build_args}
153 INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} -j${BUILD_PARALLEL_LEVEL} install)
155 ExternalProject_Get_Property(icon INSTALL_DIR)
156 set(ICON_BIN_DIR "${INSTALL_DIR}/bin")
157 set_if_not_present(ENV{PATH} "$ENV{PATH}" "${ICON_BIN_DIR}")
160 #Extra grib definitions for some icon test cases, unpacked in the install
161 #directory. Use this variable in ECCODES_DEFINITION_PATH, if required.
162 set(GRIB_DEFINITIONS_DIR "${INSTALL_DIR}/share/definitions.edzw")
163 ExternalProject_Data_Add(
165 TMP_DIR tmp STAMP_DIR ${name}-stamp
166 DOWNLOAD_DIR "${DOWNLOAD_DIR}"
167 SOURCE_DIR "${GRIB_DEFINITIONS_DIR}"
169 URL DATA{downloads/definitions.edzw.tar.gz}
170 CONFIGURE_COMMAND ":"
175 set(testcase_numbers_list "")
176 if(EXISTS ${ICON_TESTCASE_JSON})
177 parse_json_for_test_numbers(${ICON_TESTCASE_JSON} testcase_numbers_list)
180 add_icon_test( "icon-test-nwp-R02B04N06multi" "test_nwp_R02B04N06multi" "${testcase_numbers_list}" )
181 add_icon_test( "icon-atm-tracer-Hadley" "atm_tracer_Hadley" "${testcase_numbers_list}" )
182 add_icon_test( "icon-aes-physics" "aes_physics" "${testcase_numbers_list}" )
183 add_icon_test( "icon-LAM" "LAM" "${testcase_numbers_list}" )
185 if(ENABLE_icon_large_inputs)
186 add_icon_test( "icon-NextGEMS-R2B8-2020" "NextGEMS_R2B8_2020" "${testcase_numbers_list}" )