1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mirrors-WRF

Клонировать/Скачать
CMakeLists.txt 56 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 22.06.2025 15:06 3b05f82
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096
```cmake
cmake_minimum_required(VERSION 3.20)
project(WRF)
enable_language(C)
enable_language(CXX)
enable_language(Fortran)
set(EXPORT_NAME ${PROJECT_NAME})
if(DEFINED CMAKE_TOOLCHAIN_FILE)
set(WRF_CONFIG ${CMAKE_TOOLCHAIN_FILE})
# сообщение(СТАТУС "Загрузка файла конфигурации... : ${WRF_CONFIG}")
# include(${WRF_CONFIG})
endif()
# Импортируем базовые флаги, удаляем любой импортированный флаг выпуска
# мы сами будем управлять этим с помощью WRF_FCOPTIM/WRF_FCNOOPT
set(CMAKE_Fortran_FLAGS_RELEASE "" CACHE STRING "" FORCE)
set(CMAKE_C_FLAGS_RELEASE "" CACHE STRING "" FORCE)
# list(APPEND CMAKE_MODULE_PATH)
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/ ${PROJECT_SOURCE_DIR}/cmake/modules)
# Используем пути к библиотекам как rpaths
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
set(CMAKE_Fortran_PREPROCESS ON)
# Это всегда задается
list(APPEND CMAKE_C_PREPROCESSOR_FLAGS -P -nostdinc -traditional)
include(CMakePackageConfigHelpers)
include(CheckIPOSupported)
# Помощники WRF
include(c_preproc)
include(m4_preproc)
include(target_copy)
include(confcheck)
include(gitinfo)
include(printOption)
include(target_source_properties)
include(wrf_case_setup)
include(wrf_get_version)
check_ipo_supported(RESULT IPO_SUPPORT)
# Сначала получаем информацию о коммите Git
wrf_git_commit(
RESULT_VAR GIT_VERSION
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
)
# Настроим файл для использования
configure_file(
${PROJECT_SOURCE_DIR}/cmake/template/commit_decl.cmake
${PROJECT_BINARY_DIR}/inc/commit_decl
@ONLY
)
# Получаем информацию о версии
wrf_get_version(${PROJECT_SOURCE_DIR}/README)
################################################################################
##
## Опции, которые могут быть настроены пользователем
##
################################################################################
# Настройка режима
``````cmake
set(OPTIMIZATION_LEVEL "")
set(WRF_OS "")
set(WRF_MACH "")
``````cmake
if ("${CMAKE_BUILD_TYPE}" STREQUAL "")
set(CMAKE_BUILD_TYPE Release)
message(STATUS "Установлено значение по умолчанию для типа сборки: ${CMAKE_BUILD_TYPE}")
endif()
################################################################################
## Выбор ядра WRF
################################################################################
set(WRF_CORE_OPTIONS
# Здесь перечислены опции
ARW
CONVERT # Этот вариант существует в процессе сборки, но отсутствует в конфигурации
DA # Вариант директории данных
DA_4D_VAR
PLUS
)
``````cmake
set(WRF_CORE "" CACHE STRING "WRF_CORE")
if("${WRF_CORE}" STREQUAL "")
# Установка значения по умолчанию для WRF_CORE
list(GET WRF_CORE_OPTIONS 0 WRF_CORE)
endif()
################################################################################
## Выбор вложения WRF
################################################################################
set(WRF_NESTING_OPTIONS
# Варианты выбора
NONE
BASIC
MOVES
VORTEX
)
set(WRF_NESTING "" CACHE STRING "WRF_NESTING")
if("${WRF_NESTING}" STREQUAL "")
# Установка значения по умолчанию для WRF_NESTING
list(GET WRF_NESTING_OPTIONS 0 WRF_NESTING)
endif()
################################################################################
## Выбор случая WRF
##!TODO Возможно, когда-нибудь сделаем так, чтобы этот выбор не требовался и все варианты всегда строились?
################################################################################
set(WRF_CASE_OPTIONS
# Варианты выбора
EM_REAL # сделать это значением по умолчанию
# EM_IDEAL # Теоретически возможно, но кто-то строит это? Это не целевой вариант в make
EM_FIRE
EM_SCM_XY
EM_TROPICAL_CYCLONE
EM_HELDSUAREZ
)
``` # Эти являются подкатегориями идеального - держите их ниже в списке
EM_B_WAVE # Держите это здесь, так как это используется для проверки индекса
EM_GRAV2D_X
EM_HILL2D_X
EM_LES
EM_QUARTER_SS
EM_SEABREEZE2D_X
EM_CONVRAD
EM_SQUALL2D_X
EM_SQUALL2D_Y
# Нет выбранного случая, для ситуаций, где мы не компилируем ARW
NONE
)
set(WRF_CASE "" CACHE STRING "WRF_CASE")
if("${WRF_CASE}" STREQUAL "")
# Установка значения по умолчанию для WRF_CASE
list(GET WRF_CASE_OPTIONS 0 WRF_CASE)
endif()# НЕ ИСПОЛЬЗУЙТЕ OPTION — ОН НЕ РАБОТАЕТ КАК ОЖИДАЕТСЯ ДАЖЕ ПРИ ОЧИЩЕНИИ КЭША — ВЫ БЫЛИ ОПРЕВЕЧЕНЫ
# Если вы добавите что-либо здесь, описание должно быть самоидентификацией — это помогает скрипту конфигурации
set(USE_DOUBLE OFF CACHE BOOL "USE_DOUBLE")
set(USE_MPI OFF CACHE BOOL "USE_MPI")
set(USE_OPENMP OFF CACHE BOOL "USE_OPENMP")
set(USE_HDF5 OFF CACHE BOOL "USE_HDF5")
set(USE_JASPER OFF CACHE BOOL "USE_JASPER")
set(USE_PIO OFF CACHE BOOL "USE_PIO")
set(USE_IPO OFF CACHE BOOL "USE_IPO")
``````plaintext
set( ВКЛЮЧИТЬ_ХЕМ OFF CACHE BOOL "ВКЛЮЧИТЬ_ХЕМ" )
set( ВКЛЮЧИТЬ_CMAQ OFF CACHE BOOL "ВКЛЮЧИТЬ_CMAQ" )
set( ВКЛЮЧИТЬ_CTSM OFF CACHE BOOL "ВКЛЮЧИТЬ_CTSM" )
set( ВКЛЮЧИТЬ_DFI_RADAR OFF CACHE BOOL "ВКЛЮЧИТЬ_DFI_RADAR" )
set( ВКЛЮЧИТЬ_ГИДРО OFF CACHE BOOL "ВКЛЮЧИТЬ_ГИДРО" )
set( ВКЛЮЧИТЬ_KPP OFF CACHE BOOL "ВКЛЮЧИТЬ_KPP" )
set( ВКЛЮЧИТЬ_MARS OFF CACHE BOOL "ВКЛЮЧИТЬ_MARS" )
set( ВКЛЮЧИТЬ_ТЕРРАЙН OFF CACHE BOOL "ВКЛЮЧИТЬ_ТЕРРАЙН" )
set( ВКЛЮЧИТЬ_ТИТАН OFF CACHE BOOL "ВКЛЮЧИТЬ_ТИТАН" )
set( ВКЛЮЧИТЬ_ВЕНУС OFF CACHE BOOL "ВКЛЮЧИТЬ_ВЕНУС" )
```# Что же делают эти определения, если они всегда включены????
set( USE_ALLOCATABLES ON CACHE BOOL "USE_ALLOCATABLES" )
set( wrfmodel ON CACHE BOOL "wrfmodel" )
set( GRIB1 ON CACHE BOOL "GRIB1" )
set( INTIO ON CACHE BOOL "INTIO" )
set( KEEP_INT_AROUND ON CACHE BOOL "KEEP_INT_AROUND" )
set( LIMIT_ARGS ON CACHE BOOL "LIMIT_ARGS" )# Как мы хотим лучше всего подходить к этим опциям? Переменные окружения не являются лучшим решением
set(WRFIO_NCD_NO_LARGE_FILE_SUPPORT OFF CACHE BOOL "WRFIO_NCD_NO_LARGE_FILE_SUPPORT")
set(FORCE_NETCDF_CLASSIC OFF CACHE BOOL "FORCE_NETCDF_CLASSIC")
set(BUILD_RRTMG_FAST OFF CACHE BOOL "BUILD_RRTMG_FAST")
set(BUILD_RRTMK OFF CACHE BOOL "BUILD_RRTMK")
set(BUILD_SBM_FAST ON CACHE BOOL "BUILD_SBM_FAST")
set(SHOW_ALL_VARS_USED OFF CACHE BOOL "SHOW_ALL_VARS_USED")
# TODO исследовать, нужна ли установка
# Не кэшировано, не может быть изменено, не трогайте
set(USE_M4 ON)
# То же самое - что же делают эти определения, если они всегда включены????
set(NMM_CORE OFF)
set(NETCDF ON)
# Особым внутренним флагом для профилирования компиляции
set(PROFILE_COMPILATION OFF CACHE BOOL "PROFILE_COMPILATION")
# Из arch/preamble
#### Единственное место для определения общего количества доменов. Вам нужно
#### по крайней мере 1 + 2*(общее количество вложенных сетей). Например, 1 грубая
#### сетка + три тонкие сетки = 1 + 2(3) = 7, поэтому MAX_DOMAINS=7.
set(MAX_DOMAINS_F 21)
#### Длина буфера DM для конфигурационных флагов.
set(CONFIG_BUF_LEN 65536)
#### Размер масок битов (в 4-байтовых целых числах) для масок потоков для WRF I/O
set(MAX_HISTORY 25)
set(IWORDSIZE 4)
set(DWORDSIZE 8)
set(LWORDSIZE 4)
# Чтобы ограничить генерацию KPP, чтобы она не потребляла огромное количество памяти
if(NOT DEFINED MAX_KPP_GEN_THREADS)
# Одно ядро занимает около 4,75 ГБ
set(MAX_KPP_GEN_THREADS 2)
endif()########################
################################################################################
##
## Загрузка выбранных опций и любой вспомогательной логики
##
################################################################################ Проверка опций WRF
if ( NOT ${WRF_CORE} IN_LIST WRF_CORE_OPTIONS )
message( FATAL_ERROR "Неизвестная опция WRF Core: ${WRF_CORE}" )
endif()
if ( NOT ${WRF_CORE} STREQUAL "ARW" )
message( STATUS "Все не-ARW ядра требуют использования указателей в структуре состояния сетки" )
set( USE_ALLOCATABLES OFF CACHE BOOL "Требуется конфигурацией" FORCE )
endif()
if ( NOT ${WRF_NESTING} IN_LIST WRF_NESTING_OPTIONS )
message( FATAL_ERROR "Неизвестная опция WRF Nesting: ${WRF_NESTING}" )
endif()
if ( NOT ${WRF_CASE} IN_LIST WRF_CASE_OPTIONS )
message( FATAL_ERROR "Неизвестная опция WRF Case: ${WRF_CASE}" )
endif()
# Обработка выбора
set( EM_CORE 1 )
# Гораздо проще записать это как обычную логику, а не как выражение генератора
if( ${WRF_CORE} STREQUAL "CONVERT" OR ${WRF_CORE} STREQUAL "COAMPS" )
set( EM_CORE 0 )
endif()
set( MOVE_NESTS 0 )
# Гораздо проще записать это как обычную логику, а не как выражение генератора
if( ${WRF_NESTING} STREQUAL "MOVES" OR ${WRF_NESTING} STREQUAL "VORTEX" )
set( MOVE_NESTS 1 )
endif()
if ( ${ENABLE_KPP} AND NOT ${ENABLE_CHEM} )
message( WARNING "ENABLE_KPP требует ENABLE_CHEM, но она не установлена, игнорируется" )
set( ENABLE_KPP OFF CACHE BOOL "Принудительно игнорируется конфигурацией" FORCE )
endif()
# Дополнительная информация о типе случая, который мы компилируем
string( TOLOWER ${WRF_CASE} WRF_CASE_FOLDER )
string( REPLACE "em_" "" WRF_CASE_MODULE ${WRF_CASE_FOLDER} )# Определение специализированного идеального случая или общего
list(FIND WRF_CASE_OPTIONS EM_B_WAVE START_GENERAL_IDEAL_CASE_IDX)
list(FIND WRF_CASE_OPTIONS "${WRF_CASE}" CURRENT_CASE_IDX)
set(WRF_GENERAL_IDEAL_CASE TRUE)
if (${CURRENT_CASE_IDX} LESS ${START_GENERAL_IDEAL_CASE_IDX})
set(WRF_GENERAL_IDEAL_CASE FALSE)
endif()```cmake
if (NOT ${WRFIO_NCD_NO_LARGE_FILE_SUPPORT})
message(STATUS "Поддержка больших файлов netCDF не отключена, если доступна, будет использована")
endif()
# Вариант с гидро опциями требует MPI
if (${ENABLE_HYDRO} AND NOT ${USE_MPI})
message(STATUS "WRF Hydro требует использование MPI")
set(USE_MPI ON CACHE BOOL "Требуется конфигурацией" FORCE)
endif()# Обработка двойной точности — выполняется здесь вместо файла конфигурации config.cmake toolchain
# поскольку логика двойной точности является кошмаром
list(FIND WRF_CORE_OPTIONS ${WRF_CORE} CURRENT_WRF_CORE_IDX)
list(FIND WRF_CORE_OPTIONS "DA" START_DA_IDX)
# DA + WRF PLUS ядра требуют двойной точности
if (${CURRENT_WRF_CORE_IDX} GREATER_EQUAL ${START_DA_IDX} AND NOT ${USE_DOUBLE})
# if (
# ${CMAKE_Fortran_COMPILER_ID} STREQUAL "GNU" OR
# ${CMAKE_Fortran_COMPILER_ID} STREQUAL "Fujitsu"
# )
message(STATUS "DA и PLUS ядра требуют двойной точности")
set(USE_DOUBLE ON CACHE BOOL "Требуется конфигурацией" FORCE)
# endif()
endif()```cmake
if (${USE_DOUBLE})
set(RWORDSIZE 8)
if (${BUILD_SBM_FAST})
set(BUILD_SBM_FAST OFF CACHE BOOL "Требуется конфигурацией" FORCE)
message(STATUS "BUILD_SBM_FAST не поддерживает double, отключено")
endif()
else()
set(RWORDSIZE 4)
endif()
math(EXPR RWORDSIZE_B "8 * ${RWORDSIZE}")
# Проверка использования IPO
if (${USE_IPO})
if (NOT ${IPO_SUPPORT})
message(STATUS "IPO/LTO не поддерживаются, запрос проигнорирован")
set(USE_IPO OFF CACHE BOOL "Требуется конфигурацией" FORCE)
endif()
endif()
```################################################################################
##
## Выполнение проверки внешних репозиториев с помощью manage_externals
##
################################################################################
message(STATUS "Выполняется проверка внешних репозиториев через manage_externals")
set(LOG_FILE ${CMAKE_CURRENT_BINARY_DIR}/checkout_externals.log)
execute_process(
COMMAND
${PROJECT_SOURCE_DIR}/tools/manage_externals/checkout_external --externals ${PROJECT_SOURCE_DIR}/arch/Externals.cfg
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
RESULT_VARIABLE MANAGE_EXTERNALS_STATUS
OUTPUT_FILE ${LOG_FILE}
ERROR_FILE ${LOG_FILE}
)
if (${MANAGE_EXTERNALS_STATUS} AND NOT ${MANAGE_EXTERNALS_STATUS} EQUAL 0)
message(FATAL_ERROR "Не удалось выполнить проверку внешних репозиториев через manage_externals")
else()
message(STATUS "Завершена проверка внешних репозиториев через manage_externals")
endif()
```################################################################################
##
## Создаем наши флаги / свойства определений и переменные для хранения информации
##
################################################################################
define_target_source_properties(
PROPERTIES
COMPILE_OPTIONS_OPTIMIZATION # Управление флагами оптимизации
COMPILE_OPTIONS_CONFCHECK # Происходят из проверок конфигурации системы
COMPILE_OPTIONS_OPTIONS # Происходят из опций
COMPILE_OPTIONS_Fortran_PRECISION # Управление точностью с плавающей запятой в Fortran
COMPILE_OPTIONS_Fortran_LINE_LENGTH # Длина строки в Fortran для компиляторов, которые требуют этого
) COMPILE_OPTIONS_DIAGNOSTICS # Дополнительные флаги для диагностики
COMPILE_OPTIONS_SUPPRESS_ERRORS # ЯВНО подавляют ошибки, ИСПОЛЬЗУЙТЕ ОСТОРОЖНО!!!
COMPILE_OPTIONS_SUPPRESS_WARNINGS # Подавление предупреждений, попытайтесь исправить до того, как они станут ошибками
COMPILE_OPTIONS_STANZA # Любые оставшиеся флаги, импортированные через стансу
COMPILE_DEFINITIONS_CONFCHECK # Происходят из проверок конфигурации системы
COMPILE_DEFINITIONS_OPTIONS # Все, что происходит из опций
COMPILE_DEFINITIONS_STANZA # Любые оставшиеся определения, импортированные через стансу
)# Эти будут объединены в одном месте для быстрого доступа
set(PROJECT_COMPILE_OPTIONS "")
set(PROJECT_COMPILE_DEFINITIONS "")# Создаем эти переменные как проектные, чтобы они могли использоваться повторно
set(PROJECT_COMPILE_OPTIONS_OPTIMIZATION "")
set(PROJECT_COMPILE_OPTIONS_CONFCHECK "")
set(PROJECT_COMPILE_OPTIONS_OPTIONS "")
set(PROJECT_COMPILE_OPTIONS_Fortran_PRECISION "")
set(PROJECT_COMPILE_OPTIONS_Fortran_LINE_LENGTH "")
set(PROJECT_COMPILE_OPTIONS_DIAGNOSTICS "")
set(PROJECT_COMPILE_OPTIONS_SUPPRESS_ERRORS "")
set(PROJECT_COMPILE_OPTIONS_SUPPRESS_WARNINGS "")
set(PROJECT_COMPILE_OPTIONS_STANZA "")
set(PROJECT_COMPILE_DEFINITIONS_CONFCHECK "")
set(PROJECT_COMPILE_DEFINITIONS_OPTIONS "")
set(PROJECT_COMPILE_DEFINITIONS_STANZA ${WRF_ARCH_LOCAL})
# Делаем эти импортированные переменные удобнее для использования в genexp
separate_arguments(WRF_FCOPTIM)
separate_arguments(WRF_FCNOOPT)
################################################################################
##
## Теперь находим пакеты, для которых может быть выполнено кросс-компиляция
##
################################################################################
# Если включена вложенность, DM_PARALLEL должно быть установлено, но если это не MPI-компиляция,
# нам нужно заменить его использование
list(FIND WRF_NESTING_OPTIONS ${WRF_NESTING} CURRENT_NESTING_IDX)
# Если используется MPI или вложенность
set(USE_RSL_LITE OFF)
if(${USE_MPI})
# После многочисленной отладки, если используются MPI_<LANG>_COMPILER
# https://cmake.org/cmake/help/latest/module/FindMPI.html#variables-for-locating-mpi
# логика поиска создает путаницу, используя <mpi> -show[me]
# Что может или может не быть загрязнено окружением
# Это все еще технически находит MPI, но вывод непонятен
# говоря что-то вроде hdf5 или pthread
# Предоставляем любые языковые флаги для проверки
if(DEFINED WRF_MPI_Fortran_FLAGS AND NOT "${WRF_MPI_Fortran_FLAGS}" STREQUAL "")
set(MPI_Fortran_COMPILER_FLAGS ${WRF_MPI_Fortran_FLAGS})
endif() if(DEFINED WRF_MPI_C_FLAGS AND NOT "${WRF_MPI_C_FLAGS}" STREQUAL "")
set(MPI_C_COMPILER_FLAGS ${WRF_MPI_C_FLAGS})
endif()
find_package(MPI REQUIRED COMPONENTS Fortran C)
list(APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS
USE_MPI=1
DM_PARALLEL
) # Проверка, не включил ли MPI все свои флаги IPO из-за жесткого кодирования флагов оболочки
# https://www.open-mpi.org/faq/?category=mpi-apps#why-no-rpath LOL!
# Цитата: "По умолчанию Open MPI старается не включать никакие ненужные флаги в компиляторы-оболочки"
# Ладно, конечно. Может быть, это конфигурация библиотек дистрибутива, которая добавляет все эти лишние флаги
if(NOT ${USE_IPO})
# Получаем информацию о компиляции
message(STATUS "Проверка необходимости использования IPO для MPI")
foreach(IPO_FLAG IN LISTS CMAKE_Fortran_COMPILE_OPTIONS_IPO)
string(FIND "${MPI_Fortran_COMPILE_OPTIONS}" ${IPO_FLAG} MPI_FORCE_IPO)
# Обратите внимание, что мы не используем IN_LIST, так как некоторые настройки IPO могут не совпадать точно (например, -flto vs -flto=auto)
if(NOT ${MPI_FORCE_IPO} EQUAL -1)
# Найден флаг IPO
if(${IPO_SUPPORT})
message(STATUS "ЗАМЕЧАНИЕ: ${MPI_Fortran_COMPILER} требует включения флагов IPO, вынуждает использовать USE_IPO=ON")
set(USE_IPO ON CACHE BOOL "Требуется MPI" FORCE)
break()
else()
message(FATAL_ERROR "${MPI_Fortran_COMPILER} требует поддержку IPO, но выбранный компилятор ее не поддерживает, что приведет к ошибке прилинковки")
endif()
endif()
endforeach()
endif()
set(USE_RSL_LITE ON)
# Мы знаем, что NONE является нулевым индексом, поэтому сравниваем с ним
elseif(${CURRENT_NESTING_IDX} GREATER 0)
list(APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS
DM_PARALLEL
STUBMPI
)
set(USE_RSL_LITE ON)
endif()```cmake
if (${USE_OPENMP})
find_package(OpenMP REQUIRED COMPONENTS Fortran C)
list(APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS
USE_OPENMP=1
SM_PARALLEL
)
endif()
if (${USE_M4})
find_program(
M4_PROGRAM
m4
REQUIRED
)
set(M4_FLAGS ${WRF_M4_FLAGS} -Uinclude -Uindex -Ulen)
endif()
# У HDF5 есть некоторые странные особенности между версиями, где регистр букв изменился
# Опционально
if (${USE_HDF5})
find_package(HDF5)
endif()
# Опционально для grib2
if (${USE_JASPER})
find_package(Jasper 1.900.1...<1.900.24)
endif()
# Опционально
if (${USE_PIO})
find_package(PIO QUIET)
endif()
if (${ENABLE_TERRAIN})
find_package(RPC)
endif()
if (${ENABLE_CTSM})
# Будет нужен наш собственный finder
# find_package(CTSM REQUIRED)
endif()
if (${ENABLE_KPP})
find_package(BISON REQUIRED)
find_package(FLEX REQUIRED)
if (${FLEX_FOUND} AND "${FLEX_LIBRARIES}" STREQUAL "FL_LIBRARY-NOTFOUND")
message(FATAL_ERROR
"Выполнено обнаружение исполняемого файла Flex, но библиотеки не найдены. Пожалуйста, предоставьте поисковый путь для обоих "
"\n"
"См. https://cmake.org/cmake/help/latest/command/find_package.html для получения дополнительной информации "
"о предоставлении подходящего пути"
)
endif()
endif()
# Будет нужен наш собственный finder
# find_package(GPFS REQUIRED)
# Включён легковесный finder, но нам действительно следует перейти к использованию конфигурации netCDF от UniData
# Причина, почему это два отдельных пакета, а не компоненты одного большего пакета, заключается в том, что так UniData
# распределила конфигурации cmake для каждого отдельного пакета
find_package(netCDF REQUIRED)
find_package(netCDF-Fortran REQUIRED)
```# Здесь следует использовать проверку версий, а не в find_package для управления WRF, позволяющего использовать более старые версии при необходимости
if (NOT ${FORCE_NETCDF_CLASSIC})
if (NOT netCDF_VERSION GREATER_EQUAL "4.1.3")
set(NC4_MISSING_REASON "(версия < 4.1.3)")
elseif (NOT ${netCDF_HAS_NC4})
set(NC4_MISSING_REASON "(не построен с поддержкой nc4)")
endif()
if (DEFINED NC4_MISSING_REASON)
message(STATUS "Обнаруженный netCDF не поддерживает функции NC4 ${NC4_MISSING_REASON}, принудительно используется классический netcdf")
message(STATUS " Чтобы отключить это сообщение, убедитесь, что используемый netCDF имеет возможности nc4 или укажите FORCE_NETCDF_CLASSIC")
set(FORCE_NETCDF_CLASSIC ON CACHE BOOL "Требуется для обнаруженного netCDF" FORCE)
endif()
endif()
find_package(pnetCDF QUIET)
# Попытка найти zlib, упакованного вместе с netcdf
set(ZLIB_ROOT ${netCDF_PREFIX})
find_package(ZLIB REQUIRED)
find_package(CURL REQUIRED)
################################################################################
##
## Вывести окончательный набор опций для использования
## НЕ МЕНЯТЬ ОПЦИИ ПОД ЗАМКАМИ
##
################################################################################
if (DEFINED CMAKE_TOOLCHAIN_FILE)
print_option(WRF_CONFIG 20 ${BOLD_CYAN})
endif()
print_option(CMAKE_BUILD_TYPE 20 ${BOLD_CYAN})
print_option(WRF_CORE 20 ${BOLD_CYAN})
print_option(WRF_NESTING 20 ${BOLD_CYAN})
print_option(WRF_CASE 20 ${BOLD_CYAN})
print_option(USE_DOUBLE 20)
print_option(USE_MPI 20)
print_option(USE_OPENMP 20)
print_option(USE_IPO 20)
print_option(ENABLE_CHEM 20)
print_option(ENABLE_CLM 20)
print_option(ENABLE_CMAQ 20)
print_option(ENABLE_DFI_RADAR 20)
print_option(ENABLE_HYDRO 20)
print_option(ENABLE_KPP 20)
print_option(ENABLE_MARS 20)
print_option(ENABLE_TERRAIN 20)
print_option(ENABLE_TITAN 20)
print_option(ENABLE_VENUS 20)print_option( USE_ALLOCATABLES 20 )
print_option( wrfmodel 20 )
print_option( GRIB1 20 )
print_option( INTIO 20 )
print_option( KEEP_INT_AROUND 20 )
print_option( LIMIT_ARGS 20 )
print_option( FORCE_NETCDF_CLASSIC 20 )
print_option( BUILD_RRTMG_FAST 20 )
print_option( BUILD_RRTMK 20 )
print_option( BUILD_SBM_FAST 20 )
print_option( SHOW_ALL_VARS_USED 20 )
print_option( WRFIO_NCD_NO_LARGE_FILE_SUPPORT 36 )
################################################################################
##
## Установка любых глобальных опций CMake, принимаемых конкретной конфигурацией
##
################################################################################
set( CMAKE_INTERPROCEDURAL_OPTIMIZATION ${USE_IPO} )
################################################################################
##
## Проверка конфигурации на наличие функций и внутренних особенностей
##
################################################################################
add_subdirectory( confcheck )
################################################################################
##
## Адаптация флагов в зависимости от используемого компилятора и связщика
##
################################################################################# Получение текущих флагов сборки и помещение их в нужное место
if ( "${CMAKE_BUILD_TYPE}" STREQUAL "Release" )
set( PROJECT_COMPILE_OPTIONS_OPTIMIZATION $<$<COMPILE_LANGUAGE:Fortran>:${WRF_FCOPTIM}> )
# else()
# # Предполагаем, что нет оптимизации
# set( PROJECT_COMPILE_OPTIONS_OPTIMIZATION $<$<COMPILE_LANGUAGE:Fortran>:${WRF_FCNOOPT}> )
endif()
```# Это действительно ужасно, но такова цена поддержки многих способов сказать одно и то же
# https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_COMPILER_ID.html
list(APPEND PROJECT_COMPILE_OPTIONS_Fortran_PRECISION
# Используйте "" и ; специально для правильной оценки
# "$<$<COMPILE_LANG_AND_ID:Fortran,Absoft>:>" #@ Absoft Fortran
# "$<$<COMPILE_LANG_AND_ID:Fortran,ADSP>:>" #@ Analog VisualDSP++
# "$<$<COMPILE_LANG_AND_ID:Fortran,AppleClang>:>" #@ Apple Clang
# "$<$<COMPILE_LANG_AND_ID:Fortran,ARMCC>:>" #@ ARM Compiler
# "$<$<COMPILE_LANG_AND_ID:Fortran,ARMClang>:>" #@ ARM Compiler based on Clang
# "$<$<COMPILE_LANG_AND_ID:Fortran,Bruce>:>" #@ Bruce C Compiler
# "$<$<COMPILE_LANG_AND_ID:Fortran,CCur>:>" #@ Concurrent Fortran
# "$<$<COMPILE_LANG_AND_ID:Fortran,Clang>:>" #@ LLVM Clang
"$<$<COMPILE_LANG_AND_ID:Fortran,Cray>:-s;integer32;-s;real${RWORDSIZE_B}>" #@ Cray Compiler
# "$<$<COMPILE_LANG_AND_ID:Fortran,Embarcadero>:>" #@ Embarcadero
"$<$<AND:$<BOOL:${USE_DOUBLE}>,$<COMPILE_LANG_AND_ID:Fortran,Flang>>:-fdefault-real-${RWORDSIZE}>" #@ Classic Flang Fortran Compiler
# "$<$<COMPILE_LANG_AND_ID:Fortran,LLVMFlang>:>" #@ LLVM Flang Fortran Compiler
"$<$<COMPILE_LANG_AND_ID:Fortran,Fujitsu>:-CcdRR${RWORDSIZE}>" #@ Fujitsu HPC compiler (Trad mode)
# "$<$<COMPILE_LANG_AND_ID:Fortran,FujitsuClang>:>" #@ Fujitsu HPC compiler (Clang mode)
"$<$<COMPILE_LANG_AND_ID:Fortran,G95>:-r${RWORDSIZE};-i4>" #@ G95 Fortran
) "$<$<AND:$<BOOL:${USE_DOUBLE}>,$<COMPILE_LANG_AND_ID:Fortran,GNU>>:-fdefault-real-${RWORDSIZE}>" #@ GNU Compiler Collection
# "$<$<COMPILE_LANG_AND_ID:Fortran,GHS>:>" #@ Green Hills Software
# "$<$<COMPILE_LANG_AND_ID:Fortran,HP>:>" #@ Hewlett-Packard Compiler
# "$<$<COMPILE_LANG_AND_ID:Fortran,IAR>:>" #@ IAR Systems
) "$<$<COMPILE_LANG_AND_ID:Fortran,Intel>:-real-size;${RWORDSIZE_B};-i4>" #@ Интел Классический Компилятор
"$<$<COMPILE_LANG_AND_ID:Fortran,IntelLLVM>:-real-size;${RWORDSIZE_B};-i4>" #@ Интел LLVM-Основанный Компилятор
# "$<$<COMPILE_LANG_AND_ID:Fortran,LCC>:>" #@ Компилятор MCST Эльбрус C/C++/Fortran
# "$<$<COMPILE_LANG_AND_ID:Fortran,MSVC>:>" #@ Microsoft Visual Studio
"$<$<COMPILE_LANG_AND_ID:Fortran,NVHPC>:-r${RWORDSIZE};-i4>" #@ Компилятор NVIDIA HPC
# "$<$<COMPILE_LANG_AND_ID:Fortran,NVIDIA>:>" #@ Компилятор NVIDIA CUDA
# "$<$<COMPILE_LANG_AND_ID:Fortran,OpenWatcom>:>" #@ Компилятор Open Watcom
"$<$<COMPILE_LANG_AND_ID:Fortran,PGI>:-r${RWORDSIZE};-i4>" #@ Компилятор The Portland Group
"$<$<COMPILE_LANG_AND_ID:Fortran,PathScale>:-r${RWORDSIZE};-i4>" #@ Компилятор PathScale
# "$<$<COMPILE_LANG_AND_ID:Fortran,SDCC>:>" #@ Компилятор Small Device C
# "$<$<COMPILE_LANG_AND_ID:Fortran,SunPro>:>" #@ Компилятор Oracle Solaris Studio
# "$<$<COMPILE_LANG_AND_ID:Fortran,Tasking>:>" #@ Компилятор Tasking Compiler Toolsets
# "$<$<COMPILE_LANG_AND_ID:Fortran,TI>:>" #@ Компилятор Texas Instruments
# "$<$<COMPILE_LANG_AND_ID:Fortran,TinyCC>:>" #@ Компилятор Tiny C
"$<$<COMPILE_LANG_AND_ID:Fortran,XL>:-qrealsize=${RWORDSIZE};-qintsize=4>" #@ Компилятор IBM XL # "$<$<COMPILE_LANG_AND_ID:Fortran,XLClang>:>" #@ Compiler IBM Clang-based XL
# "$<$<COMPILE_LANG_AND_ID:Fortran,IBMClang>:>" #@ Compiler IBM LLVM-based
# Todo найти как обрабатывать выбор по умолчанию или добавить новые идентификаторы компиляторов
# неизвестно, как добавить поддержку для sxf90
)```markdown
list( APPEND PROJECT_COMPILE_OPTIONS_Fortran_LINE_LENGTH
# длины строк
"$<$<COMPILE_LANG_AND_ID:Fortran,GNU>:-ffree-line-length-none>" #@ GNU Compiler Collection
)# https://stackoverflow.com/a/53155812
# set(Fortran_COMPILER_ID ${CMAKE_Fortran_COMPILER_ID})
# message(STATUS "Set Fortran_COMPILER_ID to : ${Fortran_COMPILER_ID}")
list(APPEND PROJECT_COMPILE_OPTIONS_SUPPRESS_WARNINGS
# Используйте "" и ; специально для правильной оценки
"$<$<COMPILE_LANG_AND_ID:Fortran,Intel>:-diag-disable;6843>"
)
list(APPEND PROJECT_COMPILE_OPTIONS_SUPPRESS_ERRORS
$<$<AND:$<COMPILE_LANG_AND_ID:Fortran,GNU>,$<VERSION_GREATER_EQUAL:${CMAKE_Fortran_COMPILER_VERSION},10>>:-fallow-argument-mismatch>
$<$<AND:$<COMPILE_LANG_AND_ID:Fortran,GNU>,$<VERSION_GREATER_EQUAL:${CMAKE_Fortran_COMPILER_VERSION},10>>:-fallow-invalid-boz>
$<$<AND:$<COMPILE_LANG_AND_ID:Fortran,GNU>,$<VERSION_GREATER_EQUAL:${CMAKE_Fortran_COMPILER_VERSION},10>>:-ffree-line-length-none>
)
if(${PROFILE_COMPILATION})
message(STATUS "Попытка добавить профилирование компиляции...")
list(APPEND PROJECT_COMPILE_OPTIONS_DIAGNOSTICS $<$<COMPILE_LANG_AND_ID:Fortran,GNU>:-ftime-report>)
endif()
list(APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS
MAX_DOMAINS_F=${MAX_DOMAINS_F}
CONFIG_BUF_LEN=${CONFIG_BUF_LEN}
MAX_HISTORY=${MAX_HISTORY}
IWORDSIZE=${IWORDSIZE}
DWORDSIZE=${DWORDSIZE}
LWORDSIZE=${LWORDSIZE}
RWORDSIZE=${RWORDSIZE}
# Всегда устанавливается
NMM_MAX_DIM=2600
NETCDF
#!TODO Измените это на confcheck
# NONSTANDARD_SYSTEM_SUBR # Для теперь пусть это придет из станса
EM_CORE=${EM_CORE})```diff
)
```Определяется только если установлено, это используется для #ifdef/#ifndef препроцессоров
# в коде, так как CMake не может обрабатывать практически ни один другой
# https://gitlab.kitware.com/cmake/cmake/-/issues/17398
if (${USE_DOUBLE})
list(APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS DOUBLE_PRECISION)
endif()
if (${ENABLE_CHEM})
list(APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS WRF_CHEM)
if (${ENABLE_KPP})
list(APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS WRF_KPP)
endif()
endif()
if (${ENABLE_CHEM})
list(APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS BUILD_CHEM=1)
endif()
if (${ENABLE_CMAQ})
list(APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS WRF_CMAQ=Yöntem=1)
endif()
if (${ENABLE_DFI_RADAR})
list(APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS WRF_DFI_RADAR=1)
endif()
if (${ENABLE_TITAN})
list(APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS WRF_TITAN=1)
endif()
if (${ENABLE_MARS})
list(APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS WRF_MARS=1)
endif()
if (${ENABLE_VENUS})
list(APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS WRF_VENUS=1)
endif()
if (${ENABLE_HYDRO})
list(APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS WRF_HYDRO=1)
endif()
```# Исправление ошибки в строке "WRF_CMAQ= Yöntем=1" на "WRF_CMAQ=1"
if ( ${ENABLE_CMAQ} )
list( APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS WRF_CMAQ=1 )
endif()# Потому что снова нам нужны два определения для управления одним и тем же
if ( ${ENABLE_CTSM} )
list( APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS WRF_USE_CTSM )
else()
#!TODO есть некоторые файлы, которые полагаются на то, что это равно 1, но это никогда не устанавливается системой сборки legacy make
list( APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS WRF_USE_CLM )
endif()
# Если вы принудительно включили классический режим или нет поддержки nc-4, включаем классический режим
if ( ${FORCE_NETCDF_CLASSIC} OR ( NOT ${netCDF_HAS_NC4} ) )
list( APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS NETCDF_classic=1 )
endif()
if ( ${WRFIO_NCD_NO_LARGE_FILE_SUPPORT} OR ( NOT ${netCDF_LARGE_FILE_SUPPORT} ) )
list( APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS WRFIO_NCD_NO_LARGE_FILE_SUPPORT= Yöntем=1 )
endif()
# Возможно, потребуется проверка для WRFIO_ncdpar_LARGE_FILE_SUPPORT
# Теперь устанавливаем противоположное значение в других определениях, потому что почему бы и нет :)
if ( ( NOT ${FORCE_NETCDF_CLASSIC} ) AND ${netCDF_HAS_NC4} )
list( APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS USE_NETCDF4_FEATURES=1 )
endif()
if ( ( NOT ${WRFIO_NCD_NO_LARGE_FILE_SUPPORT} ) AND ${netCDF_LARGE_FILE_SUPPORT} )
list( APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS WRFIO_NCD_LARGE_FILE_SUPPORT=1 )
endif()
# Логику можно упростить до проверки доступности RPC, но для ясности
# Необходимо ли это действительно проверять наличие EM_CORE (Config.pl:443)
# если (не (включено terrain и rpc_found)) то
# list( APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS LANDREAD_STUB )
# endif()
if ( ${ENABLE_TERRAIN} AND ${MOVE_NESTS} )
list( APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS TERRAIN_AND_LANDUSE )
else ()
list( APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS LANDREAD_STUB )
endif()```markdown
if (${USE_ALLOCATABLES})
list(APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS USE_ALLOCATABLES)
endif()
if (${wrfmodel})
list(APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS wrfmodel)
endif()
if (${GRIB1})
list(APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS GRIB1)
endif()
if (${INTIO})
list(APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS INTIO)
endif()
if (${KEEP_INT_AROUND})
list(APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS KEEP_INT_AROUND)
endif()
if (${LIMIT_ARGS})
list(APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS LIMIT_ARGS)
endif()
if (${BUILD_RRTMG_FAST})
list(APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS BUILD_RRTMG_FAST=1)
else()
list(APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS BUILD_RRTMG_FAST=0)
endif()
if (${BUILD_RRTMK})
list(APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS BUILD_RRTMK=1)
else()
list(APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS BUILD_RRTMK=0)
endif()
if (${BUILD_SBM_FAST})
list(APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS BUILD_SBM_FAST=1)
else()
list(APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS BUILD_SBM_FAST=0)
endif()
if (${SHOW_ALL_VARS_USED})
list(APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS SHOW_ALL_VARS_USED=1)
else()
list(APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS SHOW_ALL_VARS_USED=0)
endif()
if (${NMM_CORE})
list(APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS NMM_CORE=1)
else()
list(APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS NMM_CORE=0)
endif()
if ("${WRF_CORE}" STREQUAL "PLUS")
list(APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS WRFPLUS=1)
else()
list(APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS WRFPLUS=0)
endif()
if ("${WRF_CORE}" STREQUAL "DA_CORE" OR "${WRF_CORE}" STREQUAL "DA_4D_VAR")
list(APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS DA_CORE=1)
else()
list(APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS DA_CORE=0)
endif()
# DFI_RADAR=$<BOOL:${NMM_CORE}>
# Опции размещения
if (${MOVE_NESTS})
list(APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS MOVE_NESTS)
endif()
if ("${WRF_NESTING}" STREQUAL "VORTEX")
list(APPEND PROJECT_COMPILE_DEFINITIONS_OPTIONS VORTEX_CENTER)
endif()
```# Проверка конфигурации
if (NOT ${Fortran_2003_IEEE})
list(APPEND PROJECT_COMPILE_DEFINITIONS_CONFCHECK NO_IEEE_MODULE)
endif()
if (NOT ${Fortran_2003_ISO_C})
list(APPEND PROJECT_COMPILE_DEFINITIONS_CONFCHECK NO_ISO_C_SUPPORT)
endif()
# Если очистка завершается неудачно, проверьте, можно ли перейти к fflush, и если нет, отсутствие поддержки
if (NOT ${Fortran_2003_FLUSH})
if ("${Fortran_2003_FFLUSH}")
list(APPEND PROJECT_COMPILE_DEFINITIONS_CONFCHECK USE_FFLUSH)
else()
list(APPEND PROJECT_COMPILE_DEFINITIONS_CONFCHECK NO_FLUSH_SUPPORT)
endif()
endif()
if (NOT ${Fortran_2003_GAMMA})
list(APPEND PROJECT_COMPILE_DEFINITIONS_CONFCHECK NO_GAMMA_SUPPORT)
endif()
``````plaintext
#!TODO Оставляем как есть в WRF на данный момент, но следует расследовать, почему мы этого не делаем
# https://stackoverflow.com/a/1035713
# Если fseeko64 успешен, используем это, иначе проверяем, можем ли мы вернуться к fseeko, и если нет, просто используем fseek
if ( "${FSEEKO64}" OR "${FSEEKO}" )
list( APPEND PROJECT_COMPILE_DEFINITIONS_CONFCHECK _FILE_OFFSET_BITS=64 _LARGEFILE_SOURCE=1 )
if ( "${FSEEKO64}" )
list( APPEND PROJECT_COMPILE_DEFINITIONS_CONFCHECK FSEEKO64_OK )
elseif ( "${FSEEKO}" )
list( APPEND PROJECT_COMPILE_DEFINITIONS_CONFCHECK FSEEKO_OK )
endif()
endif()
```
# Не уверен, что эти строки используются сейчас...
# $<$<BOOL:${MPI2_SUPPORT}>:MPI2_SUPPORT=$<BOOL:${MPI2_SUPPORT}>>
# $<$<BOOL:${MPI2_THREAD_SUPPORT}>:MPI2_THREAD_SUPPORT=$<BOOL:${MPI2_THREAD_SUPPORT}>># Аккумулирование опций и определений
list(APPEND PROJECT_COMPILE_OPTIONS
${PROJECT_COMPILE_OPTIONS_OPTIMIZATION}
${PROJECT_COMPILE_OPTIONS_CONFCHECK}
${PROJECT_COMPILE_OPTIONS_OPTIONS}
${PROJECT_COMPILE_OPTIONS_Fortran_PRECISION}
${PROJECT_COMPILE_OPTIONS_Fortran_LINE_LENGTH}
${PROJECT_COMPILE_OPTIONS_DIAGNOSTICS}
${PROJECT_COMPILE_OPTIONS_SUPPRESS_ERRORS}
${PROJECT_COMPILE_OPTIONS_SUPPRESS_WARNINGS}
${PROJECT_COMPILE_OPTIONS_STANZA}
)
list(APPEND PROJECT_COMPILE_DEFINITIONS
${PROJECT_COMPILE_DEFINITIONS_CONFCHECK}
${PROJECT_COMPILE_DEFINITIONS_OPTIONS}
${PROJECT_COMPILE_DEFINITIONS_STANZA}
)
################################################################################
##
## НЕ МЕНЯЙТЕ PROJECT_COMPILE_* ПОД ЗАПРЕТОМ
##
################################################################################
# Создание основной цели
add_library(${PROJECT_NAME}_Core STATIC)set_target_properties(
${PROJECT_NAME}_Core
PROPERTIES
COMPILE_OPTIONS_OPTIMIZATION "${PROJECT_COMPILE_OPTIONS_OPTIMIZATION}"
COMPILE_OPTIONS_CONFCHECK "${PROJECT_COMPILE_OPTIONS_CONFCHECK}"
COMPILE_OPTIONS_OPTIONS "${PROJECT_COMPILE_OPTIONS_OPTIONS}"
COMPILE_OPTIONS_Fortran_PRECISION "${PROJECT_COMPILE_OPTIONS_Fortran_PRECISION}"
COMPILE_OPTIONS_Fortran_LINE_LENGTH "${PROJECT_COMPILE_OPTIONS_Fortran_LINE_LENGTH}"
COMPILE_OPTIONS_DIAGNOSTICS "${PROJECT_COMPILE_OPTIONS_DIAGNOSTICS}"
COMPILE_OPTIONS_SUPPRESS_ERRORS "${PROJECT_COMPILE_OPTIONS_SUPPRESS_ERRORS}"
COMPILE_OPTIONS_SUPPRESS_WARNINGS "${PROJECT_COMPILE_OPTIONS_SUPPRESS_WARNINGS}"
COMPILE_OPTIONS_STANZA "${PROJECT_COMPILE_OPTIONS_STANZA}"
# Мы не используем определения компиляции из-за отсутствия учета файлов источника в CMake
)# Не применяйте эти опции или определения пока, дайте возможность добавлять файлы и устанавливать свои собственные свойства# Дополнительно к основному, или скорее должно быть так, некоторые вещи в внешнем являются действительно частью WRF, а другие — исходный код из истинно внешних репозиториев — хотя бы и старых версий
add_subdirectory(external)
add_subdirectory(tools)
# add_dependencies() не поддерживает генераторные выражения, поэтому отложите всё, что можно, до этапа связывания
add_dependencies(
${PROJECT_NAME}_Core
# Так много вещей зависит от этого, что я добавляю зависимость здесь
registry_code
)
# Добавьте непосредственно в основной
add_subdirectory(phys)
add_subdirectory(share)
add_subdirectory(frame)
add_subdirectory(inc)
if(${ENABLE_CHEM})
add_subdirectory(chem)
endif()
if(${ENABLE_HYDRO})
add_subdirectory(hydro)
endif()
if(${WRF_CORE} STREQUAL "PLUS")
add_subdirectory(wrftladj)
endif()
add_subdirectory(dyn_em)
add_subdirectory(main)
################################################################################
# Добавьте подкаталог с информацией о случае
################################################################################
if(${CURRENT_WRF_CORE_IDX} GREATER_EQUAL ${START_DA_IDX})
message(STATUS "DA или PLUS сборка, выбор WRF_CASE игннорируется")
else()
add_subdirectory(test/${WRF_CASE_FOLDER})
endif()
################################################################################
##
## НЕ добавляйте источники после этой точки
##
################################################################################# Соберите информацию о компиляции и примените
apply_target_source_properties(
TARGETS ${PROJECT_NAME}_Core
PROPERTIES
COMPILE_OPTIONS_OPTIMIZATION
COMPILE_OPTIONS_CONFCHECK
COMPILE_OPTIONS_OPTIONS
COMPILE_OPTIONS_Fortran_PRECISION
COMPILE_OPTIONS_Fortran_LINE_LENGTH
COMPILE_OPTIONS_DIAGNOSTICS
COMPILE_OPTIONS_SUPPRESS_ERRORS
COMPILE_OPTIONS_SUPPRESS_WARNINGS
COMPILE_OPTIONS_STANZA
AS_PROPERTY COMPILE_OPTIONS
)```cmake
target_compile_definitions(
${PROJECT_NAME}_Core
PRIVATE
${PROJECT_COMPILE_DEFINITIONS_CONFCHECK}
${PROJECT_COMPILE_DEFINITIONS_OPTIONS}
${PROJECT_COMPILE_DEFINITIONS_STANZA}
)```target_include_directories(
${PROJECT_NAME}_Core
PUBLIC
# Сначала указываем директории модулей, чтобы компилятор не путался
# в том, что "ещё не скомпилировано" — да, оно уже скомпилировано
# Эти пути уже настроены для установки в указанное место
$<TARGET_PROPERTY:esmf_time_f90,Fortran_MODULE_DIRECTORY>
$<TARGET_PROPERTY:io_grib_share,Fortran_MODULE_DIRECTORY>
$<TARGET_PROPERTY:io_grib1,Fortran_MODULE_DIRECTORY>
$<TARGET_PROPERTY:fftpack5,Fortran_MODULE_DIRECTORY>
$<TARGET_PROPERTY:io_netcdf,Fortran_MODULE_DIRECTORY>
$<TARGET_PROPERTY:io_int,Fortran_MODULE_DIRECTORY>
$<TARGET_PROPERTY:${PROJECT_NAME}_Core,Fortran_MODULE_DIRECTORY>
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/inc>
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/frame>
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/external/ioapi_share>
$<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/inc>
$<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/frame>
) # Для установки интерфейса включения, то есть при использовании внешними инструментами
# такими как WPS
# $<INSTALL_INTERFACE::${PROJECT_SOURCE_DIR}>
$<INSTALL_INTERFACE:include/inc>
$<INSTALL_INTERFACE:include/frame>
$<INSTALL_INTERFACE:include/external/ioapi_share>
)
``` # Может существовать или может не существовать
$<$<TARGET_EXISTS:atm_ocn>$<TARGET_PROPERTY:atm_ocn,Fortran_MODULE_DIRECTORY>>
$<$<TARGET_EXISTS:io_adios2>$<TARGET_PROPERTY:io_adios2,Fortran_MODULE_DIRECTORY>>
$<$<TARGET_EXISTS:io_esmf>$<TARGET_PROPERTY:io_esmf,Fortran_MODULE_DIRECTORY>>
$<$<TARGET_EXISTS:io_pio>$<TARGET_PROPERTY:io_pio,Fortran_MODULE_DIRECTORY>>
$<$<TARGET_EXISTS:io_netcdfpar>$<TARGET_PROPERTY:io_netcdfpar,Fortran_MODULE_DIRECTORY>>
$<$<TARGET_EXISTS:io_pnetcdf>$<TARGET_PROPERTY:io_pnetcdf,Fortran_MODULE_DIRECTORY>>
$<$<TARGET_EXISTS:io_phdf5>$<TARGET_PROPERTY:io_phdf5,Fortran_MODULE_DIRECTORY>>
$<$<TARGET_EXISTS:g2lib>$<TARGET_PROPERTY:g2lib,Fortran_MODULE_DIRECTORY>>
$<$<TARGET_EXISTS:bacio-1.3>$<TARGET_PROPERTY:bacio-1.3,Fortran_MODULE_DIRECTORY>>```cmake
# Настройка ядра
set_target_properties(
${PROJECT_NAME}_Core
PROPERTIES
# Просто выгрузите всё здесь
Fortran_MODULE_DIRECTORY ${CMAKE_INSTALL_PREFIX}/modules/
Fortran_FORMAT FREE
EXPORT_PROPERTIES Fortran_MODULE_DIRECTORY
)
target_link_options( ${PROJECT_NAME}_Core PRIVATE ${WRF_LINK_FLAGS} )```cmake
target_link_libraries(${PROJECT_NAME}_Core
PUBLIC
netCDF::netcdff
${pnetCDF_LIBRARIES}
$<$<BOOL:${USE_MPI}>:$<TARGET_NAME_IF_EXISTS:MPI::MPI_Fortran>>
$<$<BOOL:${USE_OPENMP}>:$<TARGET_NAME_IF_EXISTS:OpenMP::OpenMP_Fortran>>
# Это добавит зависимости целей, если они существуют
$<TARGET_NAME_IF_EXISTS:Jasper::Jasper>
$<TARGET_NAME_IF_EXISTS:HDF5::HDF5>
$<TARGET_NAME_IF_EXISTS:ZLIB::ZLIB>
$<TARGET_NAME_IF_EXISTS:CURL::libcurl>
$<TARGET_NAME_IF_EXISTS:RPC::RPC>
PRIVATE)
# "Внешние" библиотеки ввода/вывода
esmf_time_f90
io_grib1
grib1_util
MEL_grib1
WGRIB
``` io_grib_share
fftpack5
$<TARGET_NAME_IF_EXISTS:wrfhydro>
$<TARGET_NAME_IF_EXISTS:atm_ocn>
$<TARGET_NAME_IF_EXISTS:io_adios2>
$<TARGET_NAME_IF_EXISTS:io_esmf>
$<TARGET_NAME_IF_EXISTS:io_pio>
io_int
io_netcdf
$<TARGET_NAME_IF_EXISTS:io_netcdfpar>
$<TARGET_NAME_IF_EXISTS:io_pnetcdf>
$<TARGET_NAME_IF_EXISTS:io_phdf5>
$<TARGET_NAME_IF_EXISTS:g2lib>
$<TARGET_NAME_IF_EXISTS:bacio-1.3>
$<TARGET_NAME_IF_EXISTS:rsl_lite>
)
################################################################################
##
## Установка и экспорт
##
################################################################################
set( CONFIG_INSTALL_DIRECTORY lib/cmake/${PROJECT_NAME} )
install(
TARGETS ${PROJECT_NAME}_Core
EXPORT ${EXPORT_NAME}Targets
RUNTIME DESTINATION bin/
ARCHIVE DESTINATION lib/
LIBRARY DESTINATION lib/
)
# Экспорт в пространство имён
install(
EXPORT ${EXPORT_NAME}Targets
DESTINATION ${CONFIG_INSTALL_DIRECTORY}
FILE ${EXPORT_NAME}Targets.cmake
NAMESPACE ${EXPORT_NAME}::
)
configure_package_config_file(
${PROJECT_SOURCE_DIR}/cmake/template/${EXPORT_NAME}Config.cmake.in
${CMAKE_BINARY_DIR}/${EXPORT_NAME}Config.cmake
INSTALL_DESTINATION ${CONFIG_INSTALL_DIRECTORY}
)write_basic_package_version_file(
${CMAKE_BINARY_DIR}/${EXPORT_NAME}ConfigVersion.cmake
VERSION ${PROJECT_VERSION}
# TODO Проверьте, является ли этот тип версионирования тем, который нам нужен
COMPATIBILITY SameMinorVersion
)
install(
FILES
${CMAKE_BINARY_DIR}/${EXPORT_NAME}Config.cmake
${CMAKE_BINARY_DIR}/${EXPORT_NAME}ConfigVersion.cmake
DESTINATION ${CONFIG_INSTALL_DIRECTORY}
)# Установка некоторых вспомогательных файлов для тех, кто использует эту сборку как часть своего кода
set(
DIRECTORY
# Заключительный слеш важен
${PROJECT_SOURCE_DIR}/cmake/modules/
COMPONENT helpers
TARGET share
FILE_MATCHES
PATTERN "*.cmake"
)
set(
FILES
${PROJECT_SOURCE_DIR}/cmake/confcheck.cmake
${PROJECT_SOURCE_DIR}/cmake/gitinfo.cmake
${PROJECT_SOURCE_DIR}/cmake/printOption.cmake
${PROJECT_SOURCE_DIR}/cmake/wrf_get_version.cmake
COMPONENT helpers
TARGET share
)

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/mirrors-WRF.git
git@api.gitlife.ru:oschina-mirror/mirrors-WRF.git
oschina-mirror
mirrors-WRF
mirrors-WRF
master