File: CMakeLists.txt

package info (click to toggle)
fenics-dolfinx 1%3A0.9.0-11
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 5,376 kB
  • sloc: cpp: 33,701; python: 22,338; makefile: 230; sh: 171; xml: 55
file content (377 lines) | stat: -rw-r--r-- 11,529 bytes parent folder | download | duplicates (4)
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
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
# ------------------------------------------------------------------------------
include(GNUInstallDirs)

# ------------------------------------------------------------------------------
# Declare the library (target) and set C++ standard
add_library(dolfinx)
target_compile_features(dolfinx PUBLIC cxx_std_20)

if(PETSC_SCALAR_COMPLEX OR HAVE_SCALAR_COMPLEX)
  set(LIB_NAME_EXT "_complex")
else()
  set(LIB_NAME_EXT "_real")
endif()
set_target_properties(dolfinx PROPERTIES OUTPUT_NAME "dolfinx${LIB_NAME_EXT}")

# ------------------------------------------------------------------------------
# Add source files to the target
set(DOLFINX_DIRS
    common
    fem
    geometry
    graph
    io
    la
    mesh
    nls
    refinement
)

# Add source to dolfinx target, and get sets of header files
foreach(DIR ${DOLFINX_DIRS})
  add_subdirectory(${DIR})
endforeach()

# Set target include location (for build and installed)
target_include_directories(
  dolfinx
  PUBLIC
    $<INSTALL_INTERFACE:include>
    "$<BUILD_INTERFACE:${DOLFINX_SOURCE_DIR};${DOLFINX_SOURCE_DIR}/dolfinx>"
)

# ------------------------------------------------------------------------------
# Configure the common/version.h file
configure_file(
  ${CMAKE_CURRENT_SOURCE_DIR}/common/version.h.in common/version.h @ONLY
)

# ------------------------------------------------------------------------------
# Set target properties
set_target_properties(
  dolfinx
  PROPERTIES VERSION ${DOLFINX_VERSION}
             SOVERSION ${DOLFINX_VERSION_MAJOR}.${DOLFINX_VERSION_MINOR}
)

# Add git revision flag to the one affected file
set_source_files_properties(
  common/defines.cpp
  PROPERTIES
    COMPILE_DEFINITIONS
    "UFCX_SIGNATURE=\"${UFCX_SIGNATURE}\";DOLFINX_GIT_COMMIT_HASH=\"${GIT_COMMIT_HASH}\""
)

# ------------------------------------------------------------------------------
# Set compiler options and definitions

# Set 'Developer' build type flags
target_compile_options(
  dolfinx PRIVATE $<$<CONFIG:Developer>:${DOLFINX_CXX_DEVELOPER_FLAGS}>
)

# Add version to definitions (public)
target_compile_definitions(dolfinx PUBLIC DOLFINX_VERSION="${DOLFINX_VERSION}")

# MSVC does not support the optional C99 _Complex type. Consequently, ufcx.h
# does not contain tabulate_tensor_complex* functions when built with MSVC. On
# MSVC this DOLFINX macro is set and this removes all calls to
# tabulate_tensor_complex*.
if(MSVC)
  target_compile_definitions(dolfinx PUBLIC DOLFINX_NO_STDC_COMPLEX_KERNELS)
endif()

# ------------------------------------------------------------------------------
# Add include directories and libraries of required packages

# pugixml (see https://pugixml.org/docs/manual.html#v1.11)
if(TARGET pugixml::pugixml)
  target_link_libraries(dolfinx PUBLIC pugixml::pugixml)
else()
  target_link_libraries(dolfinx PUBLIC pugixml)
endif()

# UFCx
if(TARGET ufcx::ufcx)
  target_link_libraries(dolfinx PUBLIC ufcx::ufcx)
else()
  target_include_directories(dolfinx SYSTEM PUBLIC ${UFCX_INCLUDE_DIRS})
endif()

# Basix
target_link_libraries(dolfinx PUBLIC Basix::basix)

# Boost
target_link_libraries(dolfinx PUBLIC Boost::headers)
target_link_libraries(dolfinx PUBLIC Boost::timer)

# MPI
target_link_libraries(dolfinx PUBLIC MPI::MPI_CXX)

target_link_libraries(dolfinx PUBLIC spdlog::spdlog)

# HDF5
target_link_libraries(dolfinx PUBLIC hdf5::hdf5)

# ------------------------------------------------------------------------------
# Optional packages

# ADIOS2
if(ADIOS2_FOUND)
  target_compile_definitions(dolfinx PUBLIC HAS_ADIOS2)
  target_link_libraries(dolfinx PUBLIC adios2::cxx11_mpi)
endif()

# PETSc
if(DOLFINX_ENABLE_PETSC AND PETSC_FOUND)
  target_link_libraries(dolfinx PUBLIC PkgConfig::PETSC)
  target_compile_definitions(dolfinx PUBLIC HAS_PETSC)
endif()

# SLEPC
if(DOLFINX_ENABLE_SLEPC AND SLEPC_FOUND)
  target_link_libraries(dolfinx PUBLIC PkgConfig::SLEPC)
  target_compile_definitions(dolfinx PUBLIC HAS_SLEPC)
endif()

# SCOTCH
if(DOLFINX_ENABLE_SCOTCH AND SCOTCH_FOUND)
  target_compile_definitions(dolfinx PUBLIC HAS_PTSCOTCH)
  target_link_libraries(dolfinx PRIVATE SCOTCH::ptscotch)
  if(TARGET SCOTCH::scotcherr)
    target_link_libraries(dolfinx PRIVATE SCOTCH::scotcherr)
  endif()
endif()

# ParMETIS
if(DOLFINX_ENABLE_PARMETIS AND PARMETIS_FOUND)
  target_compile_definitions(dolfinx PUBLIC HAS_PARMETIS)
  target_link_libraries(dolfinx PRIVATE ${PARMETIS_LIBRARIES})
  target_include_directories(dolfinx SYSTEM PRIVATE ${PARMETIS_INCLUDE_DIRS})
endif()

# KaHIP
if(DOLFINX_ENABLE_KAHIP AND KAHIP_FOUND)
  target_compile_definitions(dolfinx PUBLIC HAS_KAHIP)
  target_link_libraries(dolfinx PRIVATE ${KAHIP_LIBRARIES})
  target_include_directories(dolfinx SYSTEM PRIVATE ${KAHIP_INCLUDE_DIRS})
endif()

# ------------------------------------------------------------------------------
# Install dolfinx library and header files
if(WIN32)
  install(
    TARGETS dolfinx
    EXPORT DOLFINXTargets
    RUNTIME_DEPENDENCY_SET dependencies
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT RuntimeExecutables
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT RuntimeLibraries
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT Development
  )

  if(INSTALL_RUNTIME_DEPENDENCIES)
    list(APPEND PRE_EXCLUDE_REGEXES "api-ms-.*")
    list(APPEND PRE_EXCLUDE_REGEXES "ext-ms-.*")
    install(
      RUNTIME_DEPENDENCY_SET
      dependencies
      DESTINATION
      ${CMAKE_INSTALL_BINDIR}
      PRE_EXCLUDE_REGEXES
      ${PRE_EXCLUDE_REGEXES}
      POST_EXCLUDE_REGEXES
      ".*system32/.*\\.dll"
      DIRECTORIES
      $<TARGET_FILE_DIR:Basix::basix>
    )
  endif()
else()
  install(
    TARGETS dolfinx
    EXPORT DOLFINXTargets
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT RuntimeExecutables
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT RuntimeLibraries
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT Development
  )
endif()

# Generate DOLFINTargets.cmake
install(EXPORT DOLFINXTargets DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/dolfinx)

# Install the header files
install(
  FILES dolfinx.h
  DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
  COMPONENT Development
)

foreach(DIR ${DOLFINX_DIRS})
  install(
    FILES ${HEADERS_${DIR}}
    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dolfinx/${DIR}
    COMPONENT Development
  )
endforeach()

install(
  FILES ${CMAKE_CURRENT_BINARY_DIR}/common/version.h
  DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dolfinx/common
  COMPONENT Development
)

# ------------------------------------------------------------------------------
# Generate CMake config files (DOLFINXConfig{,Version}.cmake)
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
  ${CMAKE_BINARY_DIR}/dolfinx/DOLFINXConfigVersion.cmake
  VERSION ${DOLFINX_VERSION}
  COMPATIBILITY AnyNewerVersion
)

configure_package_config_file(
  ${DOLFINX_SOURCE_DIR}/cmake/templates/DOLFINXConfig.cmake.in
  ${CMAKE_BINARY_DIR}/dolfinx/DOLFINXConfig.cmake
  INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/dolfinx
)

# Install CMake helper files
install(
  FILES ${CMAKE_BINARY_DIR}/dolfinx/DOLFINXConfig.cmake
        ${CMAKE_BINARY_DIR}/dolfinx/DOLFINXConfigVersion.cmake
  DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/dolfinx
  COMPONENT Development
)

# ------------------------------------------------------------------------------
# Generate pkg-config file and install it

# Define packages that should be required by pkg-config file
set(PKG_REQUIRES "")

# Get link libraries and includes
get_target_property(
  PKGCONFIG_DOLFINX_TARGET_LINK_LIBRARIES dolfinx INTERFACE_LINK_LIBRARIES
)
get_target_property(
  PKGCONFIG_DOLFINX_INCLUDE_DIRECTORIES dolfinx
  INTERFACE_SYSTEM_INCLUDE_DIRECTORIES
)

# Add imported targets to lists for creating pkg-config file
set(PKGCONFIG_DOLFINX_LIBS)

foreach(_target ${PKGCONFIG_DOLFINX_TARGET_LINK_LIBRARIES})
  if("${_target}" MATCHES "^[^<>]+$") # Skip "$<foo...>", which we get with
                                      # static libs
    if("${_target}" MATCHES "^.*::.*$")
      # Get include paths
      get_target_property(_inc_dirs ${_target} INTERFACE_INCLUDE_DIRECTORIES)

      if(_inc_dirs)
        list(APPEND PKGCONFIG_DOLFINX_INCLUDE_DIRECTORIES ${_inc_dirs})
      endif()

      # Get libraries
      get_target_property(_libs ${_target} INTERFACE_LINK_LIBRARIES)

      if(_libs)
        list(APPEND PKGCONFIG_DOLFINX_LIBS ${_libs})
      endif()

    else()
      # 'regular' libs, i.e. not imported targets
      list(APPEND PKGCONFIG_DOLFINX_LIBS ${_target})
    endif()

    # Special handling to extract data for compiled Boost imported
    # targets to use in generate pkg-config file
    if(("${_target}" MATCHES "^.*Boost::.*$") AND NOT "${_target}" STREQUAL
                                                  "Boost::headers"
    )
      get_target_property(_libs ${_target} IMPORTED_LOCATION_RELEASE)

      if(_libs)
        list(APPEND PKGCONFIG_DOLFINX_LIBS ${_libs})
      endif()
    endif()
  endif()
endforeach()

# Join include lists and remove duplicates
list(REMOVE_DUPLICATES PKGCONFIG_DOLFINX_INCLUDE_DIRECTORIES)
list(REMOVE_DUPLICATES PKGCONFIG_DOLFINX_LIBS)

# Convert include dirs to -I<incdir> form
foreach(_inc_dir ${PKGCONFIG_DOLFINX_INCLUDE_DIRECTORIES})
  set(PKG_INCLUDES "-I${_inc_dir} ${PKG_INCLUDES}")
endforeach()

# Get dolfinx definitions
get_target_property(
  PKG_DOLFINX_DEFINITIONS dolfinx INTERFACE_COMPILE_DEFINITIONS
)
set(PKG_DEFINITIONS)

foreach(_def ${PKG_DOLFINX_DEFINITIONS})
  set(PKG_DEFINITIONS "${PKG_DEFINITIONS} -D${_def}")
endforeach()

# Get basix definitions (this is required to propagate Basix definition to the
# pkg-config file, in the future Basix should create its own basix.pc file, see
# https://github.com/FEniCS/basix/issues/204)
get_target_property(
  PKG_BASIX_DEFINITIONS Basix::basix INTERFACE_COMPILE_DEFINITIONS
)

foreach(_def ${PKG_BASIX_DEFINITIONS})
  set(PKG_DEFINITIONS "${PKG_DEFINITIONS} -D${_def}")
endforeach()

# Convert compiler flags and definitions into space separated strings
string(REPLACE ";" " " PKG_CXXFLAGS "${CMAKE_CXX_FLAGS}")
string(REPLACE ";" " " PKG_LINKFLAGS "${CMAKE_EXE_LINKER_FLAGS}")

# Convert libraries to -L<libdir> -l<lib> form
foreach(_lib ${PKGCONFIG_DOLFINX_LIBS})
  # Add -Wl,option directives
  if("${_lib}" MATCHES "-Wl,[^ ]*")
    set(PKG_LINKFLAGS "${_lib} ${PKG_LINKFLAGS}")
  else()
    get_filename_component(_path ${_lib} DIRECTORY)
    get_filename_component(_name ${_lib} NAME_WE)
    string(REPLACE "lib" "" _name "${_name}")

    # Add libraries that matches the form -L<libdir> -l<lib>
    if(NOT "${_path}" STREQUAL "")
      set(PKG_LINKFLAGS "-L${_path} -l${_name} ${PKG_LINKFLAGS}")
    endif()
  endif()
endforeach()

# Remove duplicated link flags
separate_arguments(PKG_LINKFLAGS)
list(REMOVE_DUPLICATES PKG_LINKFLAGS)
string(REPLACE ";" " " PKG_LINKFLAGS "${PKG_LINKFLAGS}")

# Add additional link flags
foreach(_linkflag ${DOLFINX_LINK_FLAGS})
  set(PKG_LINKFLAGS "${PKG_LINKFLAGS} ${_linkflag}")
endforeach()

# Boost include dir (used as pkg-config variable)
get_target_property(
  BOOST_INCLUDE_DIR Boost::headers INTERFACE_INCLUDE_DIRECTORIES
)

# Configure and install pkg-config file
configure_file(
  ${DOLFINX_SOURCE_DIR}/cmake/templates/dolfinx.pc.in
  ${CMAKE_BINARY_DIR}/dolfinx${LIB_NAME_EXT}.pc @ONLY
)
install(
  FILES ${CMAKE_BINARY_DIR}/dolfinx${LIB_NAME_EXT}.pc
  DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
  COMPONENT Development
)

# ------------------------------------------------------------------------------