Skip to content
Open
35 changes: 35 additions & 0 deletions cmake/SCHISM.homebrew.gfortran-clang
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# CMake presets for compiling on a Homebrew (Linux/macOS) system
#
# SPDX-FileCopyrightText: 2024-2025 Helmholtz-Zentrum hereon GmbH
# SPDX-License-Identifier: CC0-1.0
# SPDX-FileContributor: Carsten Lemmen <carsten.lemmen@hereon.de>
#
# Prerequisites:
# brew install llvm gfortran cmake make
#

# Detect Homebrew prefix for macOS and Linux
if(EXISTS /opt/homebrew)
set(HOMEBREW_PREFIX /opt/homebrew)
elseif(EXISTS $ENV{HOME}/.linuxbrew)
set(HOMEBREW_PREFIX $ENV{HOME}/.linuxbrew)
elseif(EXISTS /home/linuxbrew/.linuxbrew)
set(HOMEBREW_PREFIX /home/linuxbrew/.linuxbrew)
elseif(EXISTS /usr/local)
set(HOMEBREW_PREFIX /usr/local)
else()
message(FATAL_ERROR "Homebrew prefix not found.")
endif()

# Set parallel compilers from Homebrew MPI wrappers
set(CMAKE_Fortran_COMPILER ${HOMEBREW_PREFIX}/bin/mpifort CACHE PATH "Path to parallel Fortran compiler")
set(CMAKE_C_COMPILER ${HOMEBREW_PREFIX}/bin/mpicc CACHE PATH "Path to parallel C compiler")
set(CMAKE_CXX_COMPILER ${HOMEBREW_PREFIX}/bin/mpicxx CACHE PATH "Path to parallel C++ compiler")

# Fortran compiler flags
set(CMAKE_Fortran_FLAGS "-ffree-line-length-none -fallow-argument-mismatch" CACHE STRING "Fortran flags" FORCE)
set(CMAKE_Fortran_FLAGS_RELEASE "-O2 -ffree-line-length-none -static-libgfortran -finit-local-zero" CACHE STRING "Fortran release flags" FORCE)

# NetCDF library paths (Homebrew default prefix)
set(NetCDF_FORTRAN_DIR ${HOMEBREW_PREFIX} CACHE PATH "Path to NetCDF Fortran library")
set(NetCDF_C_DIR ${HOMEBREW_PREFIX} CACHE PATH "Path to NetCDF C library")
22 changes: 10 additions & 12 deletions cmake/SCHISM.local.conda
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,19 @@
# SPDX-License-Identifier: CC0-1.0
# SPDX-FileContributor Carsten Lemmen <carsten.lemmen@hereon.de

message(WARNING "If you get an error 'Error copying Fortran module' with uppercase/lowercase mismatch, then try setting the CMAKE_C_PREPROCESS_FLAG to an empty string in cmake/SCHISMCompile.cmake")
if(NOT DEFINED ENV{CONDA_PREFIX})
message(FATAL_ERROR "CONDA_PREFIX is not set. Please activate your conda environment before configuring.")
endif()

set(CMAKE_Fortran_COMPILER $ENV{CONDA_PREFIX}/bin/mpifort CACHE PATH "Path to parallel Fortran compiler")
set(CMAKE_C_COMPILER $ENV{CONDA_PREFIX}/bin/mpicc CACHE PATH "Path to parallel C compiler")
set(CMAKE_CXX_COMPILER $ENV{CONDA_PREFIX}/bin/mpicxx CACHE PATH "Path to parallel C++ compiler")
set(PARMETIS_ROOT $ENV{CONDA_PREFIX} CACHE PATH "Root path for external (par)metis")

set_source_files_properties(
*.F90
PROPERTIES Fortran_PREPROCESS ON
)

# Fix gfortran/clang for conda environments
if("${CMAKE_Fortran_COMPILER_ID}" STREQUAL "GNU")
if("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang")
set( C_PREPROCESS_FLAG "" CACHE STRING "C Preprocessor Flag")
endif()
# Prefer conda parmetis by defining PARMETIS_ROOT if it is installed in conda.
# Validation is leveraged to the FindParMETIS cmake module
if(EXISTS "$ENV{CONDA_PREFIX}/include/parmetis.h")
message(STATUS "Found ParMETIS header in conda environment; setting PARMETIS_ROOT to $ENV{CONDA_PREFIX}")
set(PARMETIS_ROOT "$ENV{CONDA_PREFIX}" CACHE PATH "Root path for external (par)metis")
else()
message(STATUS "ParMETIS header not found in conda environment; PARMETIS_ROOT not set")
endif()
19 changes: 11 additions & 8 deletions cmake/SCHISMCompile.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -32,17 +32,20 @@ if("${CMAKE_Fortran_COMPILER_ID}" STREQUAL "PGI")
set( C_PREPROCESS_FLAG "-Mpreprocess" CACHE STRING "C Preprocessor Flag")
endif()

# Both Clang and GNU compilers need an empty C_PREPROCESS_FLAG
if("${CMAKE_Fortran_COMPILER_ID}" STREQUAL "GNU")
set (SCHISM_GFORTRAN_OPTIONS " -ffree-line-length-none")
set( CMAKE_Fortran_FLAGS_RELEASE_INIT "-O2 ${SCHISM_GFORTRAN_OPTIONS}")
set( CMAKE_Fortran_FLAGS_DEBUG_INIT "-g ${SCHISM_GFORTRAN_OPTIONS}")
set( CMAKE_Fortran_FLAGS_RELWITHDEBINFO_INIT "-O2 -g ${SCHISM_GFORTRAN_OPTIONS}")
unset( C_PREPROCESS_FLAG CACHE)
if("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang")
set( C_PREPROCESS_FLAG "--preprocess" CACHE STRING "C Preprocessor Flag")
elseif("${CMAKE_C_COMPILER_ID}" STREQUAL "AppleClang")
set( C_PREPROCESS_FLAG "--preprocess" CACHE STRING "C Preprocessor Flag")
else()
set( C_PREPROCESS_FLAG "-cpp" CACHE STRING "C Preprocessor Flag")
endif()
set( C_PREPROCESS_FLAG "" CACHE STRING "C Preprocessor Flag")
endif()

if("${CMAKE_Fortran_COMPILER_ID}" STREQUAL "FLANG")
set (SCHISM_FLANG_OPTIONS " -Mfreeform -Mstandard")
set( CMAKE_Fortran_FLAGS_RELEASE_INIT "-O2 ${SCHISM_FLANG_OPTIONS}")
set( CMAKE_Fortran_FLAGS_DEBUG_INIT "-g ${SCHISM_FLANG_OPTIONS}")
set( CMAKE_Fortran_FLAGS_RELWITHDEBINFO_INIT "-O2 -g ${SCHISM_FLANG_OPTIONS}")
set( C_PREPROCESS_FLAG "" CACHE STRING "C Preprocessor Flag")
endif()