-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
140 lines (112 loc) · 5.17 KB
/
CMakeLists.txt
File metadata and controls
140 lines (112 loc) · 5.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
cmake_minimum_required (VERSION 3.14)
if (NOT DEFINED PROJECT_NAME)
set(CPRNC_STANDALONE TRUE)
endif()
project (cprnc Fortran C)
include (CheckFunctionExists)
include (ExternalProject)
#===== Local modules =====
list (APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
#==============================================================================
# DEFINE THE TARGET
#==============================================================================
set (CPRNC_Fortran_SRCS cprnc.F90 filestruct.F90 prec.F90 utils.F90)
set (CPRNC_GenF90_SRCS compare_vars_mod.F90)
set (CPRNC_Fortran_MODS ${CMAKE_CURRENT_BINARY_DIR}/compare_vars_mod.mod
${CMAKE_CURRENT_BINARY_DIR}/filestruct.mod
${CMAKE_CURRENT_BINARY_DIR}/prec.mod)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
# Compiler-specific compile options
if ("${CMAKE_Fortran_COMPILER_ID}" STREQUAL "GNU")
set (CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -ffree-line-length-none")
endif()
if (CMAKE_BUILD_TYPE STREQUAL "DEBUG")
set (CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -O0 -g")
endif()
#==============================================================================
# DEFINE THE DEPENDENCIES
#==============================================================================
#===== genf90 =====
if (DEFINED GENF90_PATH)
# If GENF90_PATH is defined, the target may also already be defined
if (NOT TARGET genf90)
add_custom_target(genf90
DEPENDS ${GENF90_PATH}/genf90.pl)
endif()
else ()
ExternalProject_Add (genf90
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/genf90
GIT_REPOSITORY https://github.com/PARALLELIO/genf90
GIT_TAG genf90_200608
UPDATE_COMMAND ""
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND "")
ExternalProject_Get_Property (genf90 SOURCE_DIR)
set (GENF90_PATH ${SOURCE_DIR})
unset (SOURCE_DIR)
endif ()
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/run_tests
DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_CURRENT_SOURCE_DIR}/test_inputs ${CMAKE_CURRENT_BINARY_DIR}/test_inputs)
#===== Fortran Source Generation with GenF90 =====
foreach (SRC_FILE IN LISTS CPRNC_GenF90_SRCS)
add_custom_command (OUTPUT ${SRC_FILE}
COMMAND ${GENF90_PATH}/genf90.pl
${CMAKE_CURRENT_SOURCE_DIR}/${SRC_FILE}.in > ${SRC_FILE}
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${SRC_FILE}.in genf90)
endforeach ()
# Try to find NetCDF dependency. Try standard find_package first.
find_package(NetCDF QUIET COMPONENTS C Fortran)
if (NetCDF_C_FOUND AND NetCDF_Fortran_FOUND)
if(TARGET NetCDF::NetCDF_Fortran)
set(CPRNC_NETCDF_FORTRAN_LIB NetCDF::NetCDF_Fortran)
set(CPRNC_NETCDF_C_LIB NetCDF::NetCDF_C)
else()
# We used an old-school find netcdf module. Make the target here
add_library(netcdf_cprnc INTERFACE)
target_link_libraries(netcdf_cprnc INTERFACE ${NetCDF_Fortran_LIBRARIES};${NetCDF_C_LIBRARIES})
target_include_directories(netcdf_cprnc INTERFACE ${NetCDF_Fortran_INCLUDE_DIRS};${NetCDF_C_INCLUDE_DIRS})
set(CPRNC_NETCDF_FORTRAN_LIB netcdf_cprnc)
endif()
else ()
# If netcdf is not installed as a CMake pkg, the find_package above will fail,
# but netcdf may still be installed in the <PackageName>_ROOT folders
find_library(NetCDF_C_LIBRARIES netcdf HINTS ${NetCDF_C_ROOT} PATH_SUFFIXES lib lib64)
find_library(NetCDF_Fortran_LIBRARIES netcdff HINTS ${NetCDF_Fortran_ROOT} PATH_SUFFIXES lib lib64)
find_path(NetCDF_C_INCLUDE_DIRS netcdf.h HINTS ${NetCDF_C_ROOT} PATH_SUFFIXES include)
find_path(NetCDF_Fortran_INCLUDE_DIRS netcdf.mod HINTS ${NetCDF_Fortran_ROOT} PATH_SUFFIXES include)
if (NetCDF_C_LIBRARIES AND NetCDF_Fortran_LIBRARIES AND
NetCDF_C_INCLUDE_DIRS AND NetCDF_Fortran_INCLUDE_DIRS)
add_library(netcdf_cprnc INTERFACE)
target_link_libraries(netcdf_cprnc INTERFACE ${NetCDF_Fortran_LIBRARIES};${NetCDF_C_LIBRARIES})
target_include_directories(netcdf_cprnc INTERFACE ${NetCDF_Fortran_INCLUDE_DIRS};${NetCDF_C_INCLUDE_DIRS})
set(CPRNC_NETCDF_FORTRAN_LIB netcdf_cprnc)
else()
message(STATUS "NetCDF was not found, falling back on pkg-config")
find_package(PkgConfig REQUIRED)
#===== NetCDF =====
pkg_check_modules(NetCDF REQUIRED IMPORTED_TARGET netcdf)
#===== NetCDF-Fortran =====
pkg_check_modules(NetCDF_Fortran REQUIRED IMPORTED_TARGET netcdf-fortran)
set(CPRNC_NETCDF_FORTRAN_LIB PkgConfig::NetCDF_Fortran)
set(CPRNC_NETCDF_C_LIB PkgConfig::NetCDF)
endif()
endif()
add_executable (cprnc ${CPRNC_Fortran_SRCS} ${CPRNC_GenF90_SRCS})
target_include_directories(cprnc PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
add_dependencies (cprnc genf90)
# Always use -fPIC
set_property(TARGET cprnc PROPERTY POSITION_INDEPENDENT_CODE ON)
target_link_libraries (cprnc
PUBLIC ${CPRNC_NETCDF_FORTRAN_LIB} ${CPRNC_NETCDF_C_LIB})
# We do not want cprnc injecting ctests into parent projects
if (CPRNC_STANDALONE)
enable_testing()
add_test(NAME run_tests COMMAND run_tests -outdir tmp)
endif()
#==============================================================================
# DEFINE THE INSTALL
#==============================================================================
# Executable
install (TARGETS cprnc DESTINATION bin)