-
Notifications
You must be signed in to change notification settings - Fork 146
/
Copy pathCMakeLists.txt
179 lines (158 loc) · 6.22 KB
/
CMakeLists.txt
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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
cmake_minimum_required(VERSION 3.25...3.29)
#[=============================================================================[
# Basic project definition #
]=============================================================================]
list(APPEND CMAKE_MESSAGE_CONTEXT Wannier90)
project(Wannier90
VERSION 4.0.0
DESCRIPTION "Compute maximally-localised Wannier functions."
HOMEPAGE_URL https://www.wannier90.org
LANGUAGES Fortran C
)
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS OFF)
if (NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif ()
#[=============================================================================[
# Options #
]=============================================================================]
option(WANNIER90_MPI "Wannier90: Build with MPI support" OFF)
option(WANNIER90_SHARED_LIBS "Wannier90: Build library as a shared library" ${PROJECT_IS_TOP_LEVEL})
option(WANNIER90_INSTALL "Wannier90: Install files" ${PROJECT_IS_TOP_LEVEL})
option(WANNIER90_TEST "Wannier90: Build test-suite" ${PROJECT_IS_TOP_LEVEL})
#[=============================================================================[
# Project configuration #
]=============================================================================]
if (NOT CMAKE_Fortran_MODULE_DIRECTORY)
set(CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/fortran_mods)
endif ()
set(BUILD_SHARED_LIBS ${WANNIER90_SHARED_LIBS})
if (WANNIER90_INSTALL)
include(GNUInstallDirs)
include(CMakePackageConfigHelpers)
# CMake does not properly support fortran module installation paths.
# https://gitlab.kitware.com/cmake/cmake/-/issues/19608
# https://discourse.cmake.org/t/api-design-c-modules-source-listings-and-interface-properties/5389/14
# Note: This does not follow fortran-stdlib format, instead it follows Fedora guidelines
# https://pagure.io/packaging-committee/issue/1334
cmake_path(APPEND CMAKE_INSTALL_LIBDIR "${CMAKE_Fortran_COMPILER_ID}-${CMAKE_Fortran_COMPILER_VERSION}" modules
OUTPUT_VARIABLE _DEFAULT_CMAKE_INSTALL_MODULEDIR
)
set(CMAKE_INSTALL_MODULEDIR ${_DEFAULT_CMAKE_INSTALL_MODULEDIR}
CACHE STRING
"Fortran module installation path (Not a cmake native variable)"
)
cmake_path(IS_ABSOLUTE CMAKE_INSTALL_MODULEDIR _is_absolute)
if (_is_absolute)
set(CMAKE_INSTALL_FULL_MODULEDIR ${CMAKE_INSTALL_MODULEDIR})
else ()
cmake_path(APPEND CMAKE_INSTALL_PREFIX ${CMAKE_INSTALL_MODULEDIR}
OUTPUT_VARIABLE CMAKE_INSTALL_FULL_MODULEDIR
)
endif ()
endif ()
## Populate variables for FetchContent and sub-projects
# All variables have to be consistent with CMakeExtraUtilsConfig.cmake
set(Wannier90_MPI ${WANNIER90_WITH_MPI})
#[=============================================================================[
# External packages #
]=============================================================================]
## Third-party libraries
find_package(BLAS REQUIRED)
find_package(LAPACK REQUIRED)
if (WANNIER90_MPI)
find_package(MPI REQUIRED COMPONENTS Fortran)
# TODO: Use mpi_f08 instead. Tests are not adapted yet
# if (NOT MPI_Fortran_HAVE_F08_MODULE)
# message(SEND_ERROR "mpi_f08 module is required for building Wannier90 with MPI")
# endif ()
endif ()
#[=============================================================================[
# Main definition #
]=============================================================================]
## Main targets
add_executable(Wannier90_exe)
set_target_properties(Wannier90_exe PROPERTIES
OUTPUT_NAME wannier90
EXPORT_NAME exe
SUFFIX .x
)
add_executable(Wannier90::exe ALIAS Wannier90_exe)
add_executable(Wannier90_post)
set_target_properties(Wannier90_post PROPERTIES
OUTPUT_NAME postw90
EXPORT_NAME post
SUFFIX .x
)
add_executable(Wannier90::post ALIAS Wannier90_post)
add_library(Wannier90_lib)
set_target_properties(Wannier90_lib PROPERTIES
OUTPUT_NAME wannier90
EXPORT_NAME wannier90
VERSION ${PROJECT_VERSION}
SOVERSION ${PROJECT_VERSION_MAJOR}
)
add_library(Wannier90::wannier90 ALIAS Wannier90_lib)
## Main implementations
add_subdirectory(src)
## Testing
if (WANNIER90_TEST)
enable_testing()
## Define compiled support programs
# TODO: These should be moved outside of src and hard coded path?
add_executable(w90chk2chk.x src/w90chk2chk.F90)
add_executable(w90spn2spn.x src/w90spn2spn.F90)
target_link_libraries(w90chk2chk.x PRIVATE Wannier90_lib)
target_link_libraries(w90spn2spn.x PRIVATE Wannier90_lib)
add_subdirectory(test-suite)
endif ()
#[=============================================================================[
# Install or Export #
]=============================================================================]
## Installs
if (WANNIER90_INSTALL)
configure_file(cmake/wannier90.pc.in wannier90.pc)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/wannier90.pc
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
COMPONENT Wannier90_Development
)
write_basic_package_version_file(
${CMAKE_CURRENT_BINARY_DIR}/Wannier90ConfigVersion.cmake
VERSION ${PROJECT_VERSION}
COMPATIBILITY SameMajorVersion
)
configure_package_config_file(
cmake/Wannier90Config.cmake.in
Wannier90Config.cmake
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Wannier90
)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/Wannier90ConfigVersion.cmake
${CMAKE_CURRENT_BINARY_DIR}/Wannier90Config.cmake
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Wannier90
COMPONENT Spglib_Development
)
install(EXPORT Wannier90Targets
FILE Wannier90Targets.cmake
NAMESPACE Wannier90::
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Wannier90
COMPONENT Wannier90_Development
)
export(EXPORT Wannier90Targets
FILE Wannier90Targets.cmake
NAMESPACE Wannier90::
)
endif ()
## Make project available to FetchContent
if (NOT PROJECT_IS_TOP_LEVEL)
# Propagate variables for FetchContent
return(PROPAGATE
Wannier90_VERSION
Wannier90_VERSION_MAJOR
Wannier90_VERSION_MINOR
Wannier90_VERSION_PATCH
Wannier90_VERSION_TWEAK
Wannier90_MPI
)
endif ()