Skip to content

Commit 5ba87f8

Browse files
authored
Merge pull request #17 from ACCESS-NRI/development
Add CMake build system and Pkgconf pc file
2 parents 6ec0812 + 52f7f1b commit 5ba87f8

File tree

3 files changed

+177
-0
lines changed

3 files changed

+177
-0
lines changed

CMakeLists.txt

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
# https://cmake.org/cmake/help/v3.6/module/FindPkgConfig.html
2+
# 3.11: add_library() doesn't require dummy source
3+
# 3.12: target_link_libraries() supports OBJECT targets
4+
# 3.20: cmake_path()
5+
cmake_minimum_required(VERSION 3.20)
6+
project(GFDLGTracers
7+
VERSION 2024.08.1
8+
DESCRIPTION "GFDLGTracers contains a collection of tracers and associated code for use with the MOM and GOLD ocean models."
9+
LANGUAGES Fortran
10+
)
11+
12+
include(GNUInstallDirs)
13+
include(CMakePackageConfigHelpers)
14+
include(CheckFortranCompilerFlag)
15+
16+
if(NOT CMAKE_BUILD_TYPE MATCHES "^(Debug|Release|RelWithDebInfo|MinSizeRel)$")
17+
message(STATUS "Setting build type to 'Relwithdebinfo' as none was specified.")
18+
set(CMAKE_BUILD_TYPE
19+
"Relwithdebinfo"
20+
CACHE STRING "Choose the type of build." FORCE)
21+
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
22+
endif()
23+
24+
if(NOT CMAKE_Fortran_COMPILER_ID MATCHES "^(Intel|GNU)$")
25+
message(
26+
WARNING "Compiler not officially supported: ${CMAKE_Fortran_COMPILER_ID}")
27+
endif()
28+
29+
cmake_path(APPEND CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR} "include")
30+
31+
option(BUILD_SHARED_LIBS "Build shared/dynamic libraries" OFF)
32+
33+
################################################################################
34+
# Fortran
35+
################################################################################
36+
37+
if(CMAKE_Fortran_COMPILER_ID MATCHES "GNU")
38+
39+
# Copied from MOM5/bin/mkmf.template.nci.gfortran
40+
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fcray-pointer -fdefault-real-8 -ffree-line-length-none -fno-range-check -Waliasing -Wampersand -Warray-bounds -Wcharacter-truncation -Wconversion -Wline-truncation -Wintrinsics-std -Wsurprising -Wno-tabs -Wunderflow -Wunused-parameter -Wintrinsic-shadow -Wno-align-commons")
41+
check_fortran_compiler_flag("-fallow-invalid-boz" _boz_flag)
42+
check_fortran_compiler_flag("-fallow-argument-mismatch" _argmis_flag)
43+
if(_boz_flag)
44+
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fallow-invalid-boz" )
45+
endif()
46+
if(_argmis_flag)
47+
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fallow-argument-mismatch" )
48+
endif()
49+
set(CMAKE_Fortran_FLAGS_RELEASE "-O2")
50+
set(CMAKE_Fortran_FLAGS_RELWITHDEBINFO "-g")
51+
set(CMAKE_Fortran_FLAGS_DEBUG "-O0 -g -W -fbounds-check")
52+
53+
elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "Intel")
54+
55+
# Copied from MOM5/bin/mkmf.template.nci
56+
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fno-alias -safe-cray-ptr -fpe0 -ftz -assume byterecl -i4 -r8 -traceback -nowarn -check noarg_temp_created -assume nobuffered_io -convert big_endian -grecord-gcc-switches -fp-model precise -fp-model source -align all")
57+
set(CMAKE_Fortran_FLAGS_RELEASE "-g3 -O2 -xCORE-AVX2 -debug all -check none")
58+
set(CMAKE_Fortran_FLAGS_RELWITHDEBINFO "-g3 -O2 -xCORE-AVX2 -debug all -check none")
59+
set(CMAKE_Fortran_FLAGS_DEBUG "-g3 -O0 -debug all -check -check noarg_temp_created -check nopointer -warn -warn noerrors -ftrapuv")
60+
61+
elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "IntelLLVM")
62+
63+
# Copied from MOM5/bin/mkmf.template.nci
64+
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fno-alias -safe-cray-ptr -fpe0 -ftz -assume byterecl -i4 -r8 -traceback -nowarn -check noarg_temp_created -assume nobuffered_io -convert big_endian -grecord-gcc-switches -fp-model precise -fp-model source -align all")
65+
set(CMAKE_Fortran_FLAGS_RELEASE "-g3 -O2 -xCORE-AVX2 -debug all -check none")
66+
set(CMAKE_Fortran_FLAGS_RELWITHDEBINFO "-g3 -O2 -xCORE-AVX2 -debug all -check none")
67+
set(CMAKE_Fortran_FLAGS_DEBUG "-g3 -O0 -debug all -check -check noarg_temp_created -check nopointer -warn -warn noerrors -ftrapuv")
68+
69+
else()
70+
message(WARNING "Fortran compiler with ID ${CMAKE_Fortran_COMPILER_ID} will be used with CMake default options")
71+
endif()
72+
73+
################################################################################
74+
75+
find_package(MPI REQUIRED COMPONENTS Fortran)
76+
find_package(FMS REQUIRED COMPONENTS R8)
77+
find_package(mocsy REQUIRED)
78+
79+
add_library(gtracers)
80+
81+
target_sources(gtracers PRIVATE
82+
generic_tracers/FMS_coupler_util.F90
83+
generic_tracers/FMS_ocmip2_co2calc.F90
84+
generic_tracers/generic_abiotic.F90
85+
generic_tracers/generic_age.F90
86+
generic_tracers/generic_argon.F90
87+
generic_tracers/generic_BLING.F90
88+
generic_tracers/generic_blres.F90
89+
generic_tracers/generic_CFC.F90
90+
generic_tracers/generic_COBALT.F90
91+
generic_tracers/generic_ERGOM.F90
92+
generic_tracers/generic_miniBLING.F90
93+
generic_tracers/generic_SF6.F90
94+
generic_tracers/generic_TOPAZ.F90
95+
generic_tracers/generic_tracer.F90
96+
generic_tracers/generic_tracer_utils.F90
97+
generic_tracers/generic_WOMBATlite.F90
98+
generic_tracers/generic_WOMBATmid.F90
99+
)
100+
101+
set_target_properties(gtracers PROPERTIES POSITION_INDEPENDENT_CODE ${BUILD_SHARED_LIBS})
102+
103+
# "Creating CMake Libraries - That others can find and use."
104+
# https://www.youtube.com/watch?v=08f5Dav72aE
105+
target_include_directories(gtracers
106+
PUBLIC
107+
# Generic Tracers has no header files but creates modules
108+
# "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/generic_tracers>"
109+
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>"
110+
)
111+
112+
target_link_libraries(gtracers PUBLIC
113+
FMS::fms_r8
114+
mocsy::mocsy)
115+
116+
install(TARGETS gtracers
117+
EXPORT GFDLGTracersTargets)
118+
119+
install(DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}/ TYPE INCLUDE)
120+
121+
install(EXPORT GFDLGTracersTargets
122+
FILE GFDLGTracersTargets.cmake
123+
NAMESPACE GFDLGTracers::
124+
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/GFDLGTracers
125+
)
126+
127+
configure_package_config_file(
128+
cmake/GFDLGTracersConfig.cmake.in
129+
"${CMAKE_CURRENT_BINARY_DIR}/GFDLGTracersConfig.cmake"
130+
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/GFDLGTracers
131+
)
132+
133+
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/GFDLGTracersConfig.cmake
134+
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/GFDLGTracers
135+
)
136+
137+
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/GFDLGTracers.pc.in
138+
${CMAKE_CURRENT_BINARY_DIR}/GFDLGTracers.pc @ONLY)
139+
140+
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/GFDLGTracers.pc
141+
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
142+
COMPONENT utilities)

GFDLGTracers.pc.in

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
prefix="@CMAKE_INSTALL_PREFIX@"
2+
exec_prefix="${prefix}"
3+
libdir="${prefix}/@CMAKE_INSTALL_LIBDIR@"
4+
includedir="${prefix}/include"
5+
6+
Name: GFDLGTracers
7+
Description: @CMAKE_PROJECT_DESCRIPTION@
8+
Version: @PROJECT_VERSION@
9+
Requires.private: mocsy
10+
Fflags: -I"${includedir}"
11+
Libs: -L"${libdir}" -lgtracers

cmake/GFDLGTracersConfig.cmake.in

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# Copyright ACCESS-NRI and contributors. See the top-level LICENSE file for details.
2+
3+
@PACKAGE_INIT@
4+
5+
if(NOT GFDLGTracers_FIND_QUIETLY)
6+
message(STATUS "Found GFDLGTracers: ${PACKAGE_PREFIX_DIR}")
7+
endif()
8+
9+
include(CMakeFindDependencyMacro)
10+
11+
# Request components
12+
set(_required_components ${GFDLGTracers_FIND_COMPONENTS})
13+
14+
find_dependency(MPI REQUIRED COMPONENTS Fortran)
15+
find_dependency(fms COMPONENTS R8 REQUIRED)
16+
find_dependency(mocsy REQUIRED)
17+
18+
# Run the normal Targets.cmake
19+
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR})
20+
include("${CMAKE_CURRENT_LIST_DIR}/GFDLGTracersTargets.cmake")
21+
list(REMOVE_ITEM CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR})
22+
23+
# Check the requested components are valid
24+
check_required_components(_required_components)

0 commit comments

Comments
 (0)