Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/CMakeLists.txt
3193 views
1
#
2
# CMake configuration script for Elmer
3
#
4
# Authors:
5
# Sami Ilvonen, CSC - IT Center for Science, Ltd.
6
# Phil Weir, NUMA Engineering Services, Ltd.
7
# Mikko Byckling, CSC - IT Center for Science Ltd.
8
# Juhani Kataja, CSC - IT Center for Science Ltd.
9
# Thomas Zwinger, CSC - IT Center for Science Ltd.
10
#
11
# First public beta release 11th of October, 2013
12
#
13
14
IF(NOT CMAKE_BUILD_TYPE)
15
SET(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Build type (Release, Debug, RelWithDebugInfo, MinSizeRel)")
16
ENDIF()
17
18
CMAKE_MINIMUM_REQUIRED(VERSION 3.10)
19
20
PROJECT(Elmer Fortran C CXX)
21
22
IF(APPLE)
23
SET(CMAKE_MACOSX_RPATH 1)
24
ENDIF()
25
26
# Allow users to ignore package managers on macOS
27
option(USE_MACOS_PACKAGE_MANAGER "Search for packages that are installed with Homebrew or MacPorts on macOS" ON)
28
29
#shamelessly borrowed from FreeCAD project: https://github.com/FreeCAD/FreeCAD/blob/master/cMake/FreeCAD_Helpers/SetupPython.cmake
30
# For building on OS X
31
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin" AND USE_MACOS_PACKAGE_MANAGER)
32
33
# If the user doesn't tell us which package manager they're using
34
if(NOT DEFINED MACPORTS_PREFIX AND NOT DEFINED HOMEBREW_PREFIX)
35
36
# Try to find MacPorts path
37
find_program(MACPORTS_EXECUTABLE port)
38
if(EXISTS ${MACPORTS_EXECUTABLE})
39
string(REPLACE "/bin/port" ""
40
MACPORTS_PREFIX ${MACPORTS_EXECUTABLE})
41
message(STATUS "Detected MacPorts install at ${MACPORTS_PREFIX}")
42
endif(EXISTS ${MACPORTS_EXECUTABLE})
43
44
# Try to find Homebrew path
45
find_program(HOMEBREW_EXECUTABLE brew)
46
if(EXISTS ${HOMEBREW_EXECUTABLE})
47
string(REPLACE "/bin/brew" ""
48
HOMEBREW_PREFIX ${HOMEBREW_EXECUTABLE})
49
message(STATUS "Detected Homebrew install at ${HOMEBREW_PREFIX}")
50
endif()
51
52
endif(NOT DEFINED MACPORTS_PREFIX AND NOT DEFINED HOMEBREW_PREFIX)
53
54
# In case someone tries to shoot themselves in the foot
55
if(DEFINED MACPORTS_PREFIX AND DEFINED HOMEBREW_PREFIX)
56
message(SEND_ERROR "Multiple package management systems detected - ")
57
message(SEND_ERROR "define either MACPORTS_PREFIX or HOMEBREW_PREFIX")
58
59
# No package manager
60
elseif(NOT DEFINED MACPORTS_PREFIX AND NOT DEFINED HOMEBREW_PREFIX)
61
message(SEND_ERROR "No package manager detected - install MacPorts or Homebrew")
62
endif()
63
endif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin" AND USE_MACOS_PACKAGE_MANAGER)
64
# endif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
65
66
67
# SET(CMAKE_MODULE_PATH "${CMAKE_ROOT}/Modules;${PROJECT_SOURCE_DIR}/cmake/Modules")
68
SET(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/Modules;${CMAKE_ROOT}/Modules")
69
70
SET(CMAKE_Fortran_MODULE_DIRECTORY
71
${PROJECT_BINARY_DIR}/fmodules CACHE PATH "Directory for Fortran modules")
72
73
# Require minimum standard version
74
SET(CMAKE_C_STANDARD 99)
75
SET(CMAKE_C_STANDARD_REQUIRED ON)
76
SET(CMAKE_CXX_STANDARD 11)
77
SET(CMAKE_CXX_STANDARD_REQUIRED ON)
78
79
# Defaults to cache variables
80
SET(WITH_MPI TRUE CACHE BOOL "Use MPI parallelization")
81
SET(MPI_TEST_MAXPROC 8 CACHE STRING "Maximum number of tasks used in parallel tests")
82
SET(MPI_TEST_MINPROC 1 CACHE STRING "Minimum number of tasks used in parallel tests")
83
SET(WITH_OpenMP FALSE CACHE BOOL "Use OpenMP thread and SIMD (if available) parallelization")
84
SET(WITH_MKL FALSE CACHE BOOL "Use Intel Math Kernel library")
85
SET(WITH_Mumps FALSE CACHE BOOL "Use Mumps sparse direct solver")
86
SET(WITH_Hypre FALSE CACHE BOOL "Use Hypre linear algebra library")
87
SET(WITH_CHOLMOD FALSE CACHE BOOL "Use CHOLMOD linear algebra library")
88
SET(WITH_UMFPACK TRUE CACHE BOOL "Use UMFPACK for LU factorization")
89
SET(WITH_ELMERGUI FALSE CACHE BOOL "Include ElmerGUI")
90
SET(WITH_ElmerIce FALSE CACHE BOOL "Include ElmerIce")
91
SET(WITH_XIOS FALSE CACHE BOOL "Include XIOS")
92
SET(WITH_ELMERGUITESTER FALSE CACHE BOOL "Include ElmerGUI tester")
93
SET(WITH_ELMERGUILOGGER FALSE CACHE BOOL "Include ElmerGUI logger")
94
SET(ELMER_INSTALL_LIB_DIR "lib/elmersolver" CACHE PATH "Location of elmer shared libraries relative to prefix.")
95
SET(WITH_Trilinos FALSE CACHE BOOL "Use Trilinos")
96
SET(WITH_FETI4I FALSE CACHE BOOL "Use FETI4I")
97
SET(WITH_ELMERPOST FALSE CACHE BOOL "Include ElmerPost (DEPRECATED)")
98
SET(WITH_CONTRIB FALSE CACHE BOOL "Include contributed solvers")
99
100
SET(WITH_LUA FALSE CACHE BOOL "Include LUA extensions.")
101
SET(WITH_MMG FALSE CACHE BOOL "Compile with MMG library.")
102
SET(WITH_ROCALUTION FALSE CACHE BOOL "Compile with Rocalution library.")
103
104
SET(WITH_Zoltan FALSE CACHE BOOL "Link in Zoltan mesh repartitioning library.")
105
SET(USE_SYSTEM_ZOLTAN FALSE CACHE BOOL "Use system Zoltan library")
106
107
SET(INCLUDE_ELMER_MODULES "" CACHE STRING "Semicolon separated list of solver modules to be compiled. If empty compile all.")
108
109
# Let user select if the contiguous attribute is used or not
110
SET(USE_CONTIGUOUS FALSE CACHE BOOL "Use contiguous attribute")
111
112
MARK_AS_ADVANCED(WITH_ELMERPOST)
113
114
# if("${CMAKE_VERSION}" VERSION_GREATER 2.8.12)
115
# CMAKE_POLICY(SET CMP0022 OLD)
116
# ENDIF()
117
118
OPTION (USE_NEW_POLICY_CMP0057 "Option to enable new policy CMP0057" ON)
119
IF (USE_NEW_POLICY_CMP0057)
120
CMAKE_POLICY(SET CMP0057 NEW)
121
ENDIF()
122
123
MARK_AS_ADVANCED(ELMER_INSTALL_LIB_DIR)
124
125
INCLUDE(CTest)
126
127
SET(ELMER_FEM_MAJOR_VERSION 9)
128
SET(ELMER_FEM_MINOR_VERSION 0)
129
130
SET(ELMER_FEM_VERSION
131
${ELMER_FEM_MAJOR_VERSION}.${ELMER_FEM_MINOR_VERSION})
132
133
IF(NOT(ELMER_FEM_REVISION))
134
SET(RESET_ELMER_REVISION TRUE CACHE BOOL "")
135
MARK_AS_ADVANCED(RESET_ELMER_REVISION)
136
ENDIF()
137
138
IF(RESET_ELMER_REVISION)
139
execute_process(
140
COMMAND "git" "--no-pager" "log" "-1" "--pretty=format:%h"
141
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
142
OUTPUT_VARIABLE ELMER_FEM_REVISION_
143
RESULT_VARIABLE RUN_RETURN_VALUE)
144
IF(RUN_RETURN_VALUE EQUAL 0)
145
SET(ELMER_FEM_REVISION ${ELMER_FEM_REVISION_} CACHE STRING "" FORCE)
146
MARK_AS_ADVANCED(ELMER_FEM_REVISION)
147
ENDIF()
148
ENDIF()
149
150
SET(VERSION ${ELMER_FEM_VERSION})
151
SET(REVISION ${ELMER_FEM_REVISION})
152
SET(CMAKE_POSITION_INDEPENDENT_CODE TRUE)
153
STRING(TIMESTAMP ELMER_FEM_COMPILATIONDATE "%Y-%m-%d")
154
SET(COMPILATIONDATE ${ELMER_FEM_COMPILATIONDATE})
155
156
# Check that the gfortran version is >= 7
157
IF(${CMAKE_Fortran_COMPILER_ID} MATCHES "GNU")
158
INCLUDE(testGFortranVersion)
159
IF(NOT CMAKE_Fortran_COMPILER_GNU_VERSION_OK)
160
MESSAGE(FATAL_ERROR "GNU Fortran major version is too old, should be at least 7")
161
ENDIF()
162
ENDIF()
163
164
IF(WITH_LUA)
165
IF(NOT(${USE_SYSTEM_LUA}))
166
ADD_SUBDIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/contrib/lua-5.1.5/)
167
set(LUA_LIBRARIES luaelmer CACHE STRING "")
168
set(LUA_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/contrib/lua-5.1.5/src CACHE STRING "")
169
ELSE()
170
FIND_PACKAGE(Lua51 REQUIRED)
171
ENDIF()
172
SET(HAVE_LUA TRUE)
173
MARK_AS_ADVANCED(HAVE_LUA)
174
ENDIF()
175
176
IF(WITH_EXTOPTIM)
177
SET(HAVE_EXTOPTIM TRUE)
178
ENDIF()
179
180
IF(WITH_OpenMP)
181
FIND_PACKAGE(OpenMP REQUIRED)
182
183
# FIXME: Should link to the CMake targets instead
184
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
185
SET(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${OpenMP_Fortran_FLAGS}")
186
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
187
188
# Set variables for supported OpenMP version
189
IF(OpenMP_Fortran_VERSION VERSION_GREATER_EQUAL 4.0)
190
SET(HAVE_OPENMP40 TRUE)
191
MARK_AS_ADVANCED(HAVE_OPENMP40)
192
IF(OpenMP_Fortran_VERSION VERSION_GREATER_EQUAL 4.5)
193
SET(HAVE_OPENMP45 TRUE)
194
MARK_AS_ADVANCED(HAVE_OPENMP45)
195
ENDIF()
196
ENDIF()
197
ENDIF()
198
199
# Get rid of the annoying rank mismatch warning
200
IF("${CMAKE_Fortran_COMPILER_ID}" MATCHES "GNU")
201
IF(CMAKE_Fortran_COMPILER_VERSION VERSION_GREATER 9.9)
202
SET(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fallow-argument-mismatch")
203
# SET(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -std=legacy")
204
ENDIF()
205
ENDIF()
206
207
208
# Import targets with information for using MPI or the MPI stub
209
ADD_LIBRARY(Elmer::MPI_Fortran INTERFACE IMPORTED)
210
ADD_LIBRARY(Elmer::MPI_C INTERFACE IMPORTED)
211
ADD_LIBRARY(Elmer::MPI_CXX INTERFACE IMPORTED)
212
IF(WITH_MPI)
213
# Advanced properties
214
MARK_AS_ADVANCED(
215
MPI_EXTRA_LIBRARY
216
MPI_LIBRARY
217
)
218
219
FIND_PACKAGE(MPI REQUIRED)
220
221
# Check features of found MPI
222
INCLUDE(testMPIcapabilities)
223
IF(ELMER_BROKEN_MPI_IN_PLACE)
224
ADD_DEFINITIONS(-DELMER_BROKEN_MPI_IN_PLACE)
225
ENDIF()
226
227
TARGET_LINK_LIBRARIES(Elmer::MPI_Fortran INTERFACE MPI::MPI_Fortran)
228
TARGET_LINK_LIBRARIES(Elmer::MPI_C INTERFACE MPI::MPI_C)
229
TARGET_LINK_LIBRARIES(Elmer::MPI_CXX INTERFACE MPI::MPI_CXX)
230
ENDIF(WITH_MPI)
231
232
233
IF (WITH_ROCALUTION)
234
235
IF(NOT WITH_MPI)
236
MESSAGE(FATAL_ERROR "Building with rocALUTION requires MPI")
237
ENDIF()
238
239
MESSAGE(STATUS "------------------------------------------------")
240
MESSAGE(STATUS "Looking for rocALUTION installation")
241
242
FIND_PACKAGE(rocalution REQUIRED)
243
244
MESSAGE(STATUS " rocALUTION: " "${rocalution_FOUND}")
245
MESSAGE(STATUS " rocALUTION_INC: " "${ROCALUTION_INCLUDE_DIR}")
246
MESSAGE(STATUS " rocALUTION_LIB: " "${ROCALUTION_LIBRARY}")
247
248
SET(HAVE_ROCALUTION TRUE CACHE BOOL "")
249
MARK_AS_ADVANCED(HAVE_ROCALUTION)
250
ENDIF()
251
252
253
IF(WITH_AMGX)
254
FIND_PACKAGE(AMGX)
255
ENDIF()
256
257
IF(WITH_CHOLMOD)
258
FIND_PACKAGE(CHOLMOD)
259
FIND_PACKAGE(SPQR)
260
ENDIF()
261
262
# if(APPLE)
263
# # message(STATUS "Trying to find Accelerate library")
264
# # find_library(BLAS_LIBRARIES Accelerate HINTS /System/Library/Frameworks/Accelerate.framework)
265
# # MARK_AS_ADVANCED(BLAS_LIBRARIES)
266
# # set(BLAS_LINKER_FLAGS "${CMAKE_LINKER_FLAGS} -framework accelerate")
267
# # find_path(LAPACK_INCLUDE_DIRS
268
# # NAMES clapack.h
269
# # PATHS ${BLAS_INCLUDE_DIRS}
270
# # NO_DEFAULT_PATH
271
# # )
272
# # set(LAPACK_HEADER ${LAPACK_INCLUDE_DIRS}/clapack.h)
273
# # set(LAPACK_SUFFIX "_")
274
# # set(LAPACK_PREFIX)
275
276
# # message(STATUS "Using Accelerate framework on macOS")
277
# message("using the local blas library")
278
# # option(BLAS_VERBOSE "Print some additional information during BLAS libraries detection" ON)
279
# set(BLAS_DIR "./mathlibs/src/blas/")
280
# set(BLA_VENDOR "Generic")
281
282
# set(ACCELERATE_LIBS "-framework Accelerate")
283
# BLAS_Accelerate_LIBRARY:FILEPATH=/System/Library/Frameworks/Accelerate.framework
284
285
286
# else()
287
IF(WITH_MKL)
288
# Find MKL
289
FIND_PACKAGE(MKL REQUIRED)
290
SET(HAVE_MKL TRUE)
291
MARK_AS_ADVANCED(HAVE_MKL)
292
# Set BLAS and LAPACK to point to MKL
293
SET(BLAS_LIBRARIES ${MKL_BLAS_LIBRARIES} CACHE FILEPATH "")
294
SET(LAPACK_LIBRARIES ${MKL_LAPACK_LIBRARIES} CACHE FILEPATH "")
295
IF(MKL_SCALAPACK_LIBRARIES_FOUND)
296
SET(SCALAPACK_LIBRARIES ${MKL_SCALAPACK_LIBRARIES})
297
# Versions >11.1 of MKL include Cluster PARDISO direct solver
298
IF(MKL_CPARDISO_FOUND)
299
SET(HAVE_CPARDISO TRUE)
300
MARK_AS_ADVANCED(HAVE_CPARDISO)
301
ENDIF()
302
ENDIF()
303
INCLUDE_DIRECTORIES(${MKL_INCLUDE_DIR})
304
SET(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${MKL_Fortran_FLAGS}")
305
ELSE()
306
IF (NOT BLAS_LIBRARIES OR NOT LAPACK_LIBRARIES)
307
# If BLAS/LAPACK not explicitly set, attempt to find MKL BLAS/LAPACK
308
FIND_PACKAGE(MKL QUIET)
309
IF (MKL_BLAS_LIBRARIES_FOUND AND MKL_LAPACK_LIBRARIES_FOUND)
310
# Set BLAS and LAPACK to point to MKL, in order to work around
311
# CMake FindBLAS finding wrong core library for GNU Fortran
312
SET(BLAS_LIBRARIES ${MKL_BLAS_LIBRARIES} CACHE FILEPATH "")
313
SET(LAPACK_LIBRARIES ${MKL_LAPACK_LIBRARIES} CACHE FILEPATH "")
314
INCLUDE_DIRECTORIES(${MKL_INCLUDE_DIR})
315
SET(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${MKL_Fortran_FLAGS}")
316
ENDIF()
317
ENDIF()
318
ENDIF()
319
# endif(APPLE)
320
321
# MARK_AS_ADVANCED(WITH_Trilinos)
322
IF(WITH_Trilinos)
323
IF(NOT WITH_MPI)
324
MESSAGE(FATAL_ERROR "Building with Trilinos requires MPI.")
325
ENDIF()
326
FIND_PACKAGE(ML REQUIRED PATHS ${TRILINOS_PATH}/lib/cmake/ML ${TRILINOS_PATH})
327
FIND_PACKAGE(Trilinos REQUIRED PATHS ${TRILINOS_PATH}/lib/cmake/Trilinos ${TRILINOS_PATH})
328
FIND_PACKAGE(Belos REQUIRED PATHS ${TRILINOS_PATH}/lib/cmake/Belos ${TRILINOS_PATH})
329
IF(ML_DIR)
330
ADD_DEFINITIONS(-DHAVE_TRILINOS)
331
ENDIF()
332
ENDIF()
333
334
IF(WITH_Zoltan)
335
# ZOLTAN Remeshing
336
MESSAGE(STATUS "------------------------------------------------")
337
IF(NOT USE_SYSTEM_ZOLTAN)
338
MESSAGE(STATUS "Building Zoltan mesh repartitioner")
339
ADD_SUBDIRECTORY(contrib/Zoltan_v3.83)
340
SET(HAVE_ZOLTAN TRUE CACHE BOOL "Has Zoltan tools for mesh (re)partitioning" )
341
MARK_AS_ADVANCED(HAVE_ZOLTAN)
342
MESSAGE(STATUS " Zoltan library: " "${ZOLTAN_LIBRARY}")
343
MESSAGE(STATUS "------------------------------------------------")
344
ELSE()
345
FIND_PACKAGE(Zoltan)
346
IF(Zoltan_FOUND)
347
SET(HAVE_ZOLTAN TRUE CACHE BOOL "Has Zoltan tools for mesh (re)partitioning" )
348
INCLUDE_DIRECTORIES(${ZOLTAN_INCLUDE_DIR})
349
MESSAGE(STATUS "------------------------------------------------")
350
ELSE()
351
MESSAGE(STATUS " Zoltan library not found. ")
352
MESSAGE(STATUS " Missing: <ZOLTAN_INCLUDE_DIR> or <ZOLTAN_LIBRARY>")
353
ENDIF(Zoltan_FOUND)
354
MESSAGE(STATUS "------------------------------------------------")
355
ENDIF()
356
ENDIF(WITH_Zoltan)
357
358
359
IF(WITH_NETCDF)
360
# ---------------------- #
361
# -- NETCDF libraries -- #
362
#----------------------- #
363
MESSAGE(STATUS "------------------------------------------------")
364
MESSAGE(STATUS "Elmer/Ice package: Looking for [NETCDF] & [NETCDF Fortran] libraries")
365
366
367
FIND_PACKAGE(NETCDF)
368
369
IF(NETCDF_FOUND)
370
371
SET(HAVE_NETCDF TRUE CACHE BOOL "Has NETCDF for Elmer/Ice Output" )
372
GET_FILENAME_COMPONENT(NETCDF_LIBDIR ${NETCDF_LIBRARY} DIRECTORY)
373
GET_FILENAME_COMPONENT(NETCDFF_LIBDIR ${NETCDFF_LIBRARY} DIRECTORY)
374
375
MARK_AS_ADVANCED(HAVE_NETCDF)
376
INCLUDE_DIRECTORIES(${NETCDF_INCLUDE_DIR})
377
ADD_DEFINITIONS(-DHAVE_NETCDF)
378
379
MESSAGE(STATUS " NETCDF: " "${NETCDF_FOUND}")
380
MESSAGE(STATUS " NETCDF_INC: " "${NETCDF_INCLUDE_DIR}")
381
MESSAGE(STATUS " NETCDF_LIBS: " "${NETCDF_LIBRARIES}")
382
ELSE()
383
MESSAGE(STATUS "Library not found: >NETCDF_FOUND< ")
384
MESSAGE(WARNING " \n Missing: >NETCDF_INCLUDE_DIR< , >NETCDF_LIBRARY<, >NETCDFF_LIBRARY< \n some functionalities will be disabled")
385
ENDIF(NETCDF_FOUND)
386
387
IF(NETCDF_FOUND)
388
# ---------------------- #
389
# -- HDF5 libraries -- #
390
#----------------------- #
391
MESSAGE(STATUS "------------------------------------------------")
392
MESSAGE(STATUS "Elmer/Ice package: Looking for [HDF5] & [HDF5 Fortran] libraries")
393
394
FIND_PACKAGE(PHDF5)
395
396
IF(PHDF5_FOUND)
397
398
SET(HAVE_HDF5 TRUE CACHE BOOL "Has HDF5 for Elmer/Ice Output" )
399
GET_FILENAME_COMPONENT(PHDF5_LIBDIR ${PHDF5_LIBRARY} DIRECTORY)
400
GET_FILENAME_COMPONENT(PHDF5HL_LIBDIR ${PHDF5HL_LIBRARY} DIRECTORY)
401
402
MARK_AS_ADVANCED(HAVE_HDF5)
403
INCLUDE_DIRECTORIES(${PHDF5_INCLUDE_DIR})
404
ADD_DEFINITIONS(-DHAVE_HDF5)
405
406
MESSAGE(STATUS " HDF5: " "${PHDF5_FOUND}")
407
MESSAGE(STATUS " HDF5_INC: " "${PHDF5_INCLUDE_DIR}")
408
MESSAGE(STATUS " HDF5_LIBS: " "${PHDF5_LIBRARIES}")
409
ELSE()
410
MESSAGE(STATUS "Library not found: >HDF5_FOUND< ")
411
MESSAGE(WARNING " \n Missing: >HDF5_INCLUDE_DIR< , >HDF5_LIBRARY<, >HDF5F_LIBRARY< \n some functionalities will be disabled")
412
ENDIF(PHDF5_FOUND)
413
ENDIF(NETCDF_FOUND)
414
415
ENDIF(WITH_NETCDF)
416
417
# MMG Remeshing
418
IF(WITH_MMG)
419
MESSAGE(STATUS "------------------------------------------------")
420
MESSAGE(STATUS "Mesh adaptation 2D/3D looking for [Mmg] tools ")
421
FIND_PACKAGE(MMG)
422
# INCLUDE("cmake/Modules/FindMMG.cmake")
423
# INCLUDE_DIRECTORIES(${MMG_INCLUDE_DIR})
424
# TARGET_LINK_LIBRARIES( ${YOUR_TARGET} ${MMG_LIBRARY})
425
IF(MMG_FOUND)
426
427
SET(HAVE_MMG TRUE CACHE BOOL "Has Mmg tools for Elmer/Ice Mesh adaptation" )
428
GET_FILENAME_COMPONENT(MMG_LIBDIR ${MMG_LIBRARY} DIRECTORY)
429
430
MARK_AS_ADVANCED(HAVE_MMG)
431
MESSAGE(STATUS " Mmg: " "${MMG_FOUND}")
432
MESSAGE(STATUS " Mmg_INC: " "${MMG_INCLUDE_DIR}")
433
MESSAGE(STATUS " Mmg_LIB: " "${MMG_LIBRARY}")
434
MESSAGE(STATUS " Mmg_LIBDIR: " "${MMG_LIBDIR}")
435
MESSAGE(STATUS "Compile MMG2DSolver/MMG3DSolver")
436
ADD_DEFINITIONS(-DHAVE_MMG)
437
438
INCLUDE_DIRECTORIES(${MMG_INCLUDE_DIR})
439
MESSAGE(STATUS "------------------------------------------------")
440
441
ELSE()
442
MESSAGE(STATUS " Library not found: >MMG_FOUND< ")
443
MESSAGE(STATUS " Missing: >MMG_INCLUDE_DIR< , >MMG_LIBRARY<, to compile MMG3DSolver")
444
ENDIF(MMG_FOUND)
445
446
MESSAGE(STATUS "------------------------------------------------")
447
448
IF (WITH_PARMMG)
449
FIND_PACKAGE(PARMMG)
450
IF(PARMMG_FOUND)
451
452
SET(HAVE_PARMMG TRUE CACHE BOOL "Has ParMmg tools for Elmer/Ice Mesh adaptation" )
453
GET_FILENAME_COMPONENT(PARMMG_LIBDIR ${PARMMG_LIBRARY} DIRECTORY)
454
455
MARK_AS_ADVANCED(HAVE_PARMMG)
456
MESSAGE(STATUS " ParMmg: " "${PARMMG_FOUND}")
457
MESSAGE(STATUS " ParMmg_INC: " "${PARMMG_INCLUDE_DIR}")
458
MESSAGE(STATUS " ParMmg_LIB: " "${PARMMG_LIBRARY}")
459
MESSAGE(STATUS " ParMmg_LIBDIR: " "${PARMMG_LIBDIR}")
460
#MESSAGE(STATUS "Compile MMG2DSolver/MMG3DSolver")
461
ADD_DEFINITIONS(-DHAVE_PARMMG)
462
463
INCLUDE_DIRECTORIES(${PARMMG_INCLUDE_DIR})
464
MESSAGE(STATUS "------------------------------------------------")
465
ELSE()
466
MESSAGE(STATUS " Library not found: >PARMMG_FOUND< ")
467
MESSAGE(STATUS " Missing: >PARMMG_INCLUDE_DIR< , >PARMMG_LIBRARY<, to compile PARMMGSolver")
468
ENDIF(PARMMG_FOUND)
469
ELSE()
470
SET(PARMMG_FOUND FALSE)
471
MESSAGE(STATUS " Skipping ParMMG")
472
# INCLUDE("cmake/Modules/FindParMMG.cmake")
473
# INCLUDE_DIRECTORIES(${PARMMG_INCLUDE_DIR})
474
# TARGET_LINK_LIBRARIES( ${YOUR_TARGET} ${PARMMG_LIBRARY})
475
# SET(HAVE_PARMMG FALSE)
476
ENDIF(WITH_PARMMG)
477
ELSE()
478
SET(HAVE_MMG FALSE)
479
SET(HAVE_PARMMG FALSE)
480
ENDIF()
481
482
# XIOS
483
IF (WITH_XIOS)
484
MESSAGE(STATUS "------------------------------------------------")
485
MESSAGE(STATUS " Looking for XIOS ")
486
487
FIND_PACKAGE(XIOS)
488
489
IF(XIOS_FOUND)
490
SET(HAVE_XIOS TRUE)
491
MARK_AS_ADVANCED(HAVE_XIOS)
492
INCLUDE_DIRECTORIES(${XIOS_INCLUDE_DIR})
493
LINK_DIRECTORIES(${XIOS_LIBRARIES})
494
ADD_DEFINITIONS(-DHAVE_XIOS)
495
MESSAGE(STATUS " XIOS: " "${XIOS_FOUND}")
496
MESSAGE(STATUS " XIOS_INC: " "${XIOS_INCLUDE_DIR}")
497
MESSAGE(STATUS " XIOS_LIB : " "${XIOS_LIBRARIES}")
498
ELSE()
499
MESSAGE(STATUS " XIOS not found ")
500
ENDIF()
501
502
MESSAGE(STATUS "------------------------------------------------")
503
ENDIF()
504
505
506
MESSAGE(STATUS "------------------------------------------------")
507
508
# MPI and LAPACK
509
FIND_PACKAGE(BLAS REQUIRED)
510
FIND_PACKAGE(LAPACK REQUIRED)
511
# BLAS and LAPACK libraries may be needed for testing
512
SET(CMAKE_REQUIRED_LIBRARIES
513
${CMAKE_REQUIRED_LIBRARIES} ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES})
514
515
IF(MPI_FOUND)
516
# Mumps
517
IF(WITH_Mumps)
518
FIND_PACKAGE(Mumps REQUIRED)
519
ENDIF()
520
# Hypre
521
IF(WITH_Hypre)
522
FIND_PACKAGE(Hypre REQUIRED OPTIONAL_COMPONENTS Euclid parcsr_ls ParaSails IJ_mv FEI core QUIET)
523
ENDIF()
524
525
# Permon
526
IF(WITH_FETI4I)
527
FIND_PACKAGE(FETI4I REQUIRED)
528
ENDIF()
529
ENDIF()
530
531
IF(Mumps_FOUND)
532
SET(HAVE_MUMPS TRUE)
533
MARK_AS_ADVANCED(HAVE_MUMPS)
534
# LINK_DIRECTORIES(${MUMPS_LIBRARIES})
535
ENDIF()
536
537
IF(Hypre_FOUND)
538
SET(HAVE_HYPRE TRUE)
539
MARK_AS_ADVANCED(HAVE_HYPRE)
540
INCLUDE_DIRECTORIES(${Hypre_INCLUDE_DIR})
541
# LINK_DIRECTORIES(${Hypre_LIBRARIES})
542
ENDIF()
543
544
IF(FETI4I_FOUND)
545
SET(HAVE_FETI4I TRUE)
546
MARK_AS_ADVANCED(HAVE_FETI4I)
547
ADD_DEFINITIONS(-DHAVE_FETI4I)
548
ENDIF()
549
550
IF (AMGX_FOUND)
551
SET(HAVE_AMGX TRUE)
552
MARK_AS_ADVANCED(HAVE_AMGX)
553
INCLUDE_DIRECTORIES(${AMGX_INCLUDE_DIR})
554
LINK_DIRECTORIES(${CUDA_LIBDIR})
555
ENDIF()
556
557
IF (CHOLMOD_FOUND AND SPQR_FOUND)
558
SET(HAVE_CHOLMOD TRUE)
559
MARK_AS_ADVANCED(HAVE_CHOLMOD)
560
ENDIF()
561
562
# Check if Fortran compiler supports procedure pointer
563
INCLUDE(testProcedurePointer)
564
IF(NOT CMAKE_Fortran_COMPILER_SUPPORTS_PROCEDUREPOINTER)
565
MESSAGE(FATAL_ERROR "Fortran compiler does not seem to support the PROCEDURE statement.")
566
ENDIF()
567
568
# Check if Fortran compiler supports contiguous keyword
569
INCLUDE(testContiguous)
570
IF(USE_CONTIGUOUS AND CMAKE_Fortran_COMPILER_SUPPORTS_CONTIGUOUS)
571
ADD_DEFINITIONS(-DCONTIG=,CONTIGUOUS)
572
ELSE()
573
ADD_DEFINITIONS(-DCONTIG=)
574
ENDIF()
575
576
# Check if this is mingw toolchain.
577
IF(MINGW)
578
ADD_DEFINITIONS(-DMINGW32)
579
ENDIF()
580
581
IF(WIN32)
582
ADD_DEFINITIONS(-DWIN32)
583
ENDIF()
584
585
# Check if Fortran compiler supports execute_command_line
586
INCLUDE(testExecutecommand)
587
IF(CMAKE_Fortran_COMPILER_SUPPORTS_EXECUTECOMMANDLINE)
588
ADD_DEFINITIONS(-DHAVE_EXECUTECOMMANDLINE)
589
ENDIF()
590
591
ADD_DEFINITIONS(-DUSE_ISO_C_BINDINGS)
592
SET(FC_STDCALLBULL " ")
593
SET(ELMER_LINKTYP 1)
594
#SET(FC_FUNC FC_GLOBAL)
595
#SET(FC_FUNC_ FC_GLOBAL_)
596
597
# Add support for arpack
598
ADD_DEFINITIONS(-DUSE_ARPACK)
599
600
#INCLUDE(FortranCInterface)
601
#FortranCInterface_HEADER(FCMangle.h MACRO_NAMESPACE "FC_")
602
#FortranCInterface_VERIFY(CXX)
603
604
# Set up rpaths to point ELMER_INSTALL_LIB_DIR
605
IF(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
606
SET(ELMERSOLVER_RPATH_STRING "\$ORIGIN/../${ELMER_INSTALL_LIB_DIR}")
607
SET(ELMERLIB_RPATH_STRING "\$ORIGIN/")
608
ELSEIF(APPLE)
609
SET(ELMERSOLVER_RPATH_STRING "@loader_path/../${ELMER_INSTALL_LIB_DIR}")
610
SET(ELMERLIB_RPATH_STRING "@loader_path/")
611
ENDIF()
612
613
# Uncomment these to use rpath with linked libraries
614
# SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
615
# SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
616
# Remove system directories (from the CMake guide)
617
# LIST(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib" isSystemDir)
618
# IF("${isSystemDir}" STREQUAL "-1")
619
# SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
620
# ENDIF("${isSystemDir}" STREQUAL "-1")
621
622
ADD_SUBDIRECTORY(matc)
623
624
IF(WITH_ElmerIce)
625
IF(NOT WITH_MPI)
626
MESSAGE(FATAL_ERROR "Building ElmerIce requires MPI.")
627
ENDIF()
628
MESSAGE(STATUS "Adding optional package ElmerIce")
629
ADD_SUBDIRECTORY(elmerice)
630
ENDIF(WITH_ElmerIce)
631
632
IF (WITH_UMFPACK)
633
IF (EXTERNAL_UMFPACK)
634
MESSAGE(STATUS "Using external UMFPACK instead of built-in")
635
FIND_PACKAGE(UMFPACK REQUIRED)
636
637
# Check for size of "SuiteSparse_long"
638
INCLUDE(CheckTypeSize)
639
SET(old_CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES})
640
SET(old_CMAKE_EXTRA_INCLUDE_FILES ${CMAKE_EXTRA_INCLUDE_FILES})
641
LIST(APPEND CMAKE_REQUIRED_INCLUDES "${UMFPACK_INCLUDE_DIR}")
642
LIST(APPEND CMAKE_EXTRA_INCLUDE_FILES "umfpack.h")
643
CHECK_TYPE_SIZE("SuiteSparse_long" SIZEOF_SUITESPARSE_LONG LANGUAGE C)
644
SET(CMAKE_REQUIRED_INCLUDES ${old_CMAKE_REQUIRED_INCLUDES})
645
SET(CMAKE_EXTRA_INCLUDE_FILES ${old_CMAKE_EXTRA_INCLUDE_FILES})
646
IF (HAVE_SIZEOF_SUITESPARSE_LONG)
647
IF (SIZEOF_SUITESPARSE_LONG EQUAL 4)
648
SET(UMFPACK_LONG_FORTRAN_TYPE "C_INT32_T")
649
ELSE()
650
SET(UMFPACK_LONG_FORTRAN_TYPE "C_INT64_T")
651
ENDIF()
652
ENDIF()
653
ELSE()
654
MESSAGE(STATUS "Using built-in UMFPACK")
655
ADD_SUBDIRECTORY(umfpack)
656
ENDIF()
657
SET(HAVE_UMFPACK ON)
658
MARK_AS_ADVANCED(HAVE_UMFPACK)
659
ELSE()
660
MESSAGE(STATUS "Building without UMFPACK")
661
ENDIF()
662
IF(NOT DEFINED UMFPACK_LONG_FORTRAN_TYPE)
663
# Old versions of UMFPACK before "SuiteSparse_long" was defined used "long"
664
SET(UMFPACK_LONG_FORTRAN_TYPE "C_LONG")
665
ENDIF()
666
667
# Find external arpack and parpack
668
IF(EXTERNAL_ARPACK)
669
MESSAGE(STATUS "Using external arpack library instead of built-in")
670
FIND_PACKAGE(ARPACK REQUIRED)
671
SET(CMAKE_REQUIRED_LIBRARIES
672
${CMAKE_REQUIRED_LIBRARIES} ${ARPACK_LIBRARIES})
673
ENDIF()
674
675
IF(MPI_FOUND AND EXTERNAL_PARPACK)
676
MESSAGE(STATUS "Using external parpack library instead of built-in")
677
FIND_PACKAGE(PARPACK REQUIRED)
678
SET(CMAKE_REQUIRED_LIBRARIES
679
${CMAKE_REQUIRED_LIBRARIES} ${PARPACK_LIBRARIES})
680
ENDIF()
681
682
ADD_SUBDIRECTORY(fhutiter)
683
ADD_SUBDIRECTORY(meshgen2d)
684
ADD_SUBDIRECTORY(fem)
685
ADD_SUBDIRECTORY(mathlibs)
686
ADD_SUBDIRECTORY(elmergrid)
687
ADD_SUBDIRECTORY(license_texts)
688
689
IF(WITH_ELMERGUI)
690
MESSAGE(STATUS " Building ElmerGUI")
691
MESSAGE(STATUS "------------------------------------------------")
692
ADD_SUBDIRECTORY(ElmerGUI)
693
ENDIF(WITH_ELMERGUI)
694
695
IF(WITH_ELMERGUITESTER)
696
ADD_SUBDIRECTORY(ElmerGUItester)
697
ENDIF(WITH_ELMERGUITESTER)
698
699
IF(WITH_ELMERGUILOGGER)
700
ADD_SUBDIRECTORY(ElmerGUIlogger)
701
ENDIF(WITH_ELMERGUILOGGER)
702
703
#INCLUDE(FeatureSummary)
704
#FEATURE_SUMMARY(WHAT ENABLED_FEATURES
705
# INCLUDE_QUIET_PACKAGES
706
# DESCRIPTION "Enabled Features:"
707
# VAR enabledFeaturesText)
708
#MESSAGE(STATUS "${enabledFeaturesText}")
709
710
#
711
IF(CMAKE_BUILD_TYPE)
712
STRING(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UPCASE)
713
MARK_AS_ADVANCED(CMAKE_BUILD_TYPE_UPCASE)
714
ENDIF(CMAKE_BUILD_TYPE)
715
716
MESSAGE(STATUS "------------------------------------------------")
717
MESSAGE(STATUS " BLAS library: " "${BLAS_LIBRARIES}")
718
MESSAGE(STATUS " LAPACK library: " "${LAPACK_LIBRARIES}")
719
MESSAGE(STATUS "------------------------------------------------")
720
IF(WITH_UMFPACK)
721
IF(UMFPACK_FOUND)
722
MESSAGE(STATUS " UMFPACK library: " "${UMFPACK_LIBRARIES}")
723
MESSAGE(STATUS " UMFPACK headers: " "${UMFPACK_INCLUDE_DIR}")
724
MESSAGE(STATUS "------------------------------------------------")
725
ELSE()
726
MESSAGE(STATUS " UMFPACK library: Using internal Elmer library")
727
ENDIF()
728
ELSE()
729
MESSAGE(STATUS " UMFPACK library: Building without UMFPACK")
730
ENDIF()
731
IF(CHOLMOD_FOUND AND SPQR_FOUND)
732
MESSAGE(STATUS " CHOLMOD library: " "${CHOLMOD_LIBRARIES}")
733
MESSAGE(STATUS " CHOLMOD headers: " "${CHOLMOD_INCLUDE_DIR}")
734
MESSAGE(STATUS " SPQR library: " "${SPQR_LIBRARIES}")
735
MESSAGE(STATUS " SPQR headers: " "${SPQR_INCLUDE_DIR}")
736
MESSAGE(STATUS "------------------------------------------------")
737
MARK_AS_ADVANCED(HAVE_CHOLMOD)
738
ENDIF()
739
IF(ARPACK_FOUND)
740
MESSAGE(STATUS " ARPACK library: " "${ARPACK_LIBRARIES}")
741
MESSAGE(STATUS " ARPACK headers: " "${ARPACK_INCLUDE_DIR}")
742
ELSE()
743
MESSAGE(STATUS " ARPACK library: Using internal Elmer library")
744
ENDIF()
745
IF(PARPACK_FOUND)
746
MESSAGE(STATUS " PARPACK library: " "${PARPACK_LIBRARIES}")
747
MESSAGE(STATUS " PARPACK headers: " "${PARPACK_INCLUDE_DIR}")
748
MESSAGE(STATUS "------------------------------------------------")
749
ELSE()
750
MESSAGE(STATUS " PARPACK library: Using internal Elmer library")
751
MESSAGE(STATUS "------------------------------------------------")
752
ENDIF()
753
IF(WITH_Zoltan AND NOT USE_SYSTEM_ZOLTAN)
754
MESSAGE(STATUS " Zoltan: building bundled code")
755
MESSAGE(STATUS "------------------------------------------------")
756
ELSEIF(WITH_Zoltan AND HAVE_ZOLTAN)
757
MESSAGE(STATUS " Zoltan library: " "${ZOLTAN_LIBRARY}")
758
MESSAGE(STATUS " Zoltan headers: " "${ZOLTAN_INCLUDE_DIR}")
759
MESSAGE(STATUS "------------------------------------------------")
760
ELSEIF(WITH_Zoltan AND NOT Zoltan_FOUND)
761
MESSAGE(STATUS " Zoltan system library not found")
762
MESSAGE(STATUS "------------------------------------------------")
763
ENDIF()
764
MESSAGE(STATUS " Fortran compiler: " "${CMAKE_Fortran_COMPILER}")
765
MESSAGE(STATUS " Fortran flags: " "${CMAKE_Fortran_FLAGS} ${CMAKE_Fortran_FLAGS_${CMAKE_BUILD_TYPE_UPCASE}}")
766
MESSAGE(STATUS "------------------------------------------------")
767
MESSAGE(STATUS " C compiler: " "${CMAKE_C_COMPILER}")
768
MESSAGE(STATUS " C flags: " "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE_UPCASE}}")
769
MESSAGE(STATUS "------------------------------------------------")
770
MESSAGE(STATUS " CXX compiler: " "${CMAKE_CXX_COMPILER}")
771
MESSAGE(STATUS " CXX flags: " "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE_UPCASE}}")
772
MESSAGE(STATUS "------------------------------------------------")
773
IF(WITH_MPI)
774
MESSAGE(STATUS " MPI Fortran: " "${MPI_Fortran_FOUND}")
775
MESSAGE(STATUS " MPI Fortran compiler: " "${MPI_Fortran_COMPILER}")
776
MESSAGE(STATUS " MPI Fortran flags: " "${MPI_Fortran_COMPILE_FLAGS}")
777
MESSAGE(STATUS " MPI Fortran include dir: " "${MPI_Fortran_INCLUDE_PATH}")
778
MESSAGE(STATUS " MPI Fortran libraries: " "${MPI_Fortran_LIBRARIES}")
779
MESSAGE(STATUS " MPI Fortran link flags: " "${MPI_Fortran_LINK_FLAGS}")
780
MESSAGE(STATUS "------------------------------------------------")
781
MESSAGE(STATUS " MPI C: " "${MPI_C_FOUND}")
782
MESSAGE(STATUS " MPI C compiler: " "${MPI_C_COMPILER}")
783
MESSAGE(STATUS " MPI C flags: " "${MPI_C_COMPILE_FLAGS}")
784
MESSAGE(STATUS " MPI C include dir: " "${MPI_C_INCLUDE_PATH}")
785
MESSAGE(STATUS " MPI C libraries: " "${MPI_C_LIBRARIES}")
786
MESSAGE(STATUS " MPI C flags: " "${MPI_C_LINK_FLAGS}")
787
MESSAGE(STATUS "------------------------------------------------")
788
IF(WITH_Mumps)
789
MESSAGE(STATUS " Mumps: " "${Mumps_FOUND}")
790
MESSAGE(STATUS " Mumps include: " "${Mumps_INCLUDE_DIR}")
791
MESSAGE(STATUS " Mumps libraries: " "${Mumps_LIBRARIES}")
792
MESSAGE(STATUS "------------------------------------------------")
793
ENDIF(WITH_Mumps)
794
IF(WITH_Hypre)
795
MESSAGE(STATUS " Hypre: " "${Hypre_FOUND}")
796
MESSAGE(STATUS " Hypre include: " "${Hypre_INCLUDE_DIR}")
797
MESSAGE(STATUS " Hypre libraries: " "${Hypre_LIBRARIES}")
798
MESSAGE(STATUS "------------------------------------------------")
799
ENDIF(WITH_Hypre)
800
ENDIF(WITH_MPI)
801
802
IF(WITH_Trilinos)
803
MESSAGE(STATUS " Trilinos: " "${Trilinos_FOUND}")
804
MESSAGE(STATUS " Trilinos_DIR: " "${Trilinos_DIR}")
805
MESSAGE(STATUS " Trilinos_LIBRARIES: " "${Trilinos_LIBRARIES}")
806
MESSAGE(STATUS "------------------------------------------------")
807
ENDIF(WITH_Trilinos)
808
809
IF(WITH_CONTRIB)
810
MESSAGE(STATUS " Building contributed solvers")
811
MESSAGE(STATUS "------------------------------------------------")
812
ENDIF(WITH_CONTRIB)
813
814
IF(WITH_ELMERGUITESTER)
815
MESSAGE(STATUS " Building ElmerGUI tester")
816
MESSAGE(STATUS "------------------------------------------------")
817
ENDIF(WITH_ELMERGUITESTER)
818
819
IF(WITH_ELMERGUILOGGER)
820
MESSAGE(STATUS " Building ElmerGUI logger")
821
MESSAGE(STATUS "------------------------------------------------")
822
ENDIF(WITH_ELMERGUILOGGER)
823
824
IF(WITH_ELMERPOST)
825
MESSAGE(WARNING " Building ElmerPost")
826
MESSAGE(STATUS "------------------------------------------------")
827
ADD_SUBDIRECTORY(post)
828
ENDIF(WITH_ELMERPOST)
829
830
IF(HAVE_LUA)
831
MESSAGE(STATUS " Building Lua")
832
MESSAGE(STATUS "------------------------------------------------")
833
ENDIF(HAVE_LUA)
834
835
IF(HAVE_EXTOPTIM)
836
MESSAGE(STATUS " Building with external optimization routines")
837
MESSAGE(STATUS "------------------------------------------------")
838
ENDIF(HAVE_EXTOPTIM)
839
840
IF(NOT HAVE_UMFPACK AND NOT HAVE_MUMPS)
841
MESSAGE(WARNING "Elmer is configured without backend for direct solvers (UMFPACK or MUMPS).\n"
842
"Are you sure this is intended?")
843
ENDIF()
844
845
846
# Packaging
847
if(NOT BYPASS_CPACK)
848
INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/cpack/ElmerCPack.cmake)
849
endif(NOT BYPASS_CPACK)
850
851