getfem-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Getfem-commits] [getfem-commits] branch overhaul-build-system updated:


From: Konstantinos Poulios
Subject: [Getfem-commits] [getfem-commits] branch overhaul-build-system updated: Add basic cmake build support
Date: Wed, 27 Dec 2023 11:03:11 -0500

This is an automated email from the git hooks/post-receive script.

logari81 pushed a commit to branch overhaul-build-system
in repository getfem.

The following commit(s) were added to refs/heads/overhaul-build-system by this 
push:
     new 8511ba82 Add basic cmake build support
8511ba82 is described below

commit 8511ba82bb8649aff8aedf27929cd5d314986307
Author: Konstantinos Poulios <logari81@gmail.com>
AuthorDate: Wed Dec 27 16:55:57 2023 +0100

    Add basic cmake build support
    
      - Non-intrusive implementation based on a single CMakeList.txt file
        and just two header template files "cmake/gmm_arch_config.h.in" and
        "cmake/getfem_arch_config.h.in" equivalent to those used by autotools
      - It can build the static and shared version of the libgetfem library
        as well as the python module
      - Typical configuration examples:
        $ cmake .. -DBUILD_LIBRARY_TYPE=STATIC -DCMAKE_INSTALL_PREFIX=/opt
        $ cmake .. -DENABLE_PYTHON=ON --DCMAKE_INSTALL_PREFIX=/opt
      - It does neither support compiling and running unit tests, nor more
        advanced features like MPI and OpenMP builds
---
 CMakeLists.txt                | 685 ++++++++++++++++++++++++++++++++++++++++++
 cmake/getfem_arch_config.h.in |  50 +++
 cmake/gmm_arch_config.h.in    |  26 ++
 3 files changed, 761 insertions(+)

diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 00000000..7ff2cdd8
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,685 @@
+cmake_minimum_required(VERSION 3.23)
+include(CheckIncludeFile)
+include(CheckIncludeFileCXX)
+include(CheckCXXSourceCompiles)
+include(CheckLibraryExists)
+
+string(ASCII 27 ESC)
+message("${ESC}[33m"
+        "The cmake build system for GetFEM is an alternative to the "
+        "autotools build. It is a work in progress and it does not "
+        "support all options supported by the autotools system."
+        "${ESC}[0m")
+project(GetFEM)
+
+# Set the project version
+set(VERSION_MAJOR 5)
+set(VERSION_MINOR 4)
+set(VERSION_PATCH 2)
+# applies to both GetFEM and GMM
+set(GETFEM_VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH})
+set(GMM_VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH})
+# mimic autotools package variables
+set(GETFEM_PACKAGE_NAME "getfem")
+set(GETFEM_PACKAGE_STRING "getfem ${GETFEM_VERSION}")
+set(GETFEM_PACKAGE_TARNAME "getfem")
+
+# Configure options for enabling/disabling Python, Octave, and MATLAB support
+option(ENABLE_PYTHON "Enable Python support" OFF)
+option(ENABLE_OCTAVE "Enable Octave support" OFF)
+option(ENABLE_MATLAB "Enable MATLAB support" OFF)
+# Configure option for enabling/disabling OpenMP support
+option(ENABLE_OPENMP "Enable OpenMP support" OFF)
+# Configure option to enable Qhull support
+option(ENABLE_QHULL "Enable Qhull support" ON)
+# Configure options for enabling/disabling linear solvers (at least one is 
required)
+option(ENABLE_SUPERLU "Enable SuperLU support" ON) # might be turned off by 
cmake if SuperLU is not found
+option(ENABLE_MUMPS "Enable MUMPS support" ON)     # might be turned off by 
cmake if MUMPS is not found
+# Configure option for enabling/disabling multithreaded BLAS (requires the dl 
library)
+option(ENABLE_MULTITHREADED_BLAS "Enable multithreaded blas support" OFF)
+
+option(BUILD_SHARED_LIBS "Build libraries as SHARED, equivalent to 
BUILD_LYBRARY_TYPE=SHARED" ON)
+set(BUILD_LIBRARY_TYPE "SHARED" CACHE STRING
+    "Type of library to build, choose among SHARED, STATIC, 
STATIC_BUNDLE_DEPS")
+set_property(CACHE BUILD_LIBRARY_TYPE PROPERTY STRINGS
+             "SHARED" "STATIC" "STATIC_BUNDLE_DEPS")
+if(NOT BUILD_LIBRARY_TYPE STREQUAL "SHARED" AND BUILD_SHARED_LIBS)
+  message(STATUS "BUILD_LIBRARY_TYPE=${BUILD_LIBRARY_TYPE} option overrides 
BUILD_SHARED_LIBS=ON")
+  set(BUILD_SHARED_LIBS OFF)
+elseif(NOT BUILD_SHARED_LIBS AND BUILD_LIBRARY_TYPE STREQUAL "SHARED")
+  message(STATUS "BUILD_SHARED_LIBS=OFF option overrides 
BUILD_LIBRARY_TYPE=SHARED")
+  set(BUILD_LIBRARY_TYPE "STATIC")
+endif()
+
+set(WITH_OPTIMIZATION "-O2" CACHE STRING "Set the optimization level (default: 
-O2)")
+set(GETFEM_PARA_LEVEL 0 CACHE STRING "Set the GETFEM_PARA_LEVEL option 
(default: 0)")
+
+# CMake variable for installation path
+set(CMAKE_INSTALL_PREFIX "/usr/local" CACHE PATH "Installation prefix")
+
+
+# General tests and configurations
+set(CMAKE_CXX_STANDARD 14)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+check_include_file_cxx("cxxabi.h" GETFEM_HAVE_CXXABI_H)
+check_cxx_source_compiles(
+  "#include <fenv.h>\nint main() {feenableexcept(FE_DIVBYZERO); return 0;}"
+  GETFEM_HAVE_FEENABLEEXCEPT)
+
+# Tests for availability of linear solvers
+if(ENABLE_SUPERLU)
+  if(NOT BUILD_SHARED_LIBS)
+    find_library(SUPERLU_STATIC_LIBS NAMES libsuperlu.a PATHS 
${SUPERLU_LIB_DIR})
+  endif()
+  if(SUPERLU_STATIC_LIBS)
+    set(SUPERLU_LIBS SUPERLU_STATIC_LIBS)
+  else()
+    find_library(SUPERLU_LIBS NAMES superlu PATHS ${SUPERLU_LIB_DIR})
+  endif()
+  if(SUPERLU_LIBS)
+    find_path(SUPERLU_INCLUDE_PATH NAMES "superlu/slu_ddefs.h" HINTS 
${SUPERLU_INC_DIR})
+    set(CMAKE_REQUIRED_LIBRARIES ${SUPERLU_LIBS})
+      check_library_exists(superlu dCreate_CompCol_Matrix "" HAVE_SUPERLU)
+    set(CMAKE_REQUIRED_LIBRARIES)
+  endif()
+
+  if(SUPERLU_INCLUDE_PATH)
+    message(STATUS "SUPERLU_INCLUDE_PATH = ${SUPERLU_INCLUDE_PATH}")
+  else()
+    message(WARNING "SuperLU headers NOT found : you can define 
SUPERLU_INC_DIR to help cmake find them")
+  endif()
+
+  if(HAVE_SUPERLU AND SUPERLU_INCLUDE_PATH)
+    message(STATUS "SUPERLU_LIBS = ${SUPERLU_LIBS}")
+    set(GMM_USES_SUPERLU 1)
+    message(STATUS "Building with SuperLU")
+  else()
+    set(ENABLE_SUPERLU OFF)
+    message(WARNING "Building without SuperLU")
+  endif()
+else()
+  message("Building with SuperLU explicitly disabled")
+endif()
+
+if(ENABLE_MUMPS)
+  set(MUMPS_LIBS "")
+  if(GETFEM_PARA_LEVEL LESS_EQUAL 1) # try to find "?mumps_seq" named libs 
first
+    if(NOT BUILD_SHARED_LIBS)
+      find_library(SMUMPS_STATIC_LIB NAMES libsmumps_seq.a PATHS 
${MUMPS_LIB_DIR})
+      find_library(DMUMPS_STATIC_LIB NAMES libdmumps_seq.a PATHS 
${MUMPS_LIB_DIR})
+      find_library(CMUMPS_STATIC_LIB NAMES libcmumps_seq.a PATHS 
${MUMPS_LIB_DIR})
+      find_library(ZMUMPS_STATIC_LIB NAMES libzmumps_seq.a PATHS 
${MUMPS_LIB_DIR})
+    endif()
+    if(SMUMPS_STATIC_LIB AND DMUMPS_STATIC_LIB AND CMUMPS_STATIC_LIB AND 
ZMUMPS_STATIC_LIB)
+      set(MUMPS_LIBS ${SMUMPS_STATIC_LIB} ${DMUMPS_STATIC_LIB} 
${CMUMPS_STATIC_LIB} ${ZMUMPS_STATIC_LIB})
+    else()
+      find_library(SMUMPS_LIB NAMES smumps_seq PATHS ${MUMPS_LIB_DIR})
+      find_library(DMUMPS_LIB NAMES dmumps_seq PATHS ${MUMPS_LIB_DIR})
+      find_library(CMUMPS_LIB NAMES cmumps_seq PATHS ${MUMPS_LIB_DIR})
+      find_library(ZMUMPS_LIB NAMES zmumps_seq PATHS ${MUMPS_LIB_DIR})
+      if (SMUMPS_LIB AND DMUMPS_LIB AND CMUMPS_LIB AND ZMUMPS_LIB)
+        set(MUMPS_LIBS ${SMUMPS_LIB} ${DMUMPS_LIB} ${CMUMPS_LIB} ${ZMUMPS_LIB})
+      endif()
+    endif()
+  endif()
+  if("${MUMPS_LIBS}" STREQUAL "") # try to find "?mumps" named libs
+    if(NOT BUILD_SHARED_LIBS)
+      find_library(SMUMPS_STATIC_LIB NAMES libsmumps.a PATHS ${MUMPS_LIB_DIR})
+      find_library(DMUMPS_STATIC_LIB NAMES libdmumps.a PATHS ${MUMPS_LIB_DIR})
+      find_library(CMUMPS_STATIC_LIB NAMES libcmumps.a PATHS ${MUMPS_LIB_DIR})
+      find_library(ZMUMPS_STATIC_LIB NAMES libzmumps.a PATHS ${MUMPS_LIB_DIR})
+    endif()
+    if(SMUMPS_STATIC_LIB AND DMUMPS_STATIC_LIB AND CMUMPS_STATIC_LIB AND 
ZMUMPS_STATIC_LIB)
+      set(MUMPS_LIBS ${SMUMPS_STATIC_LIB} ${DMUMPS_STATIC_LIB} 
${CMUMPS_STATIC_LIB} ${ZMUMPS_STATIC_LIB})
+    else()
+      find_library(SMUMPS_LIB NAMES smumps PATHS ${MUMPS_LIB_DIR})
+      find_library(DMUMPS_LIB NAMES dmumps PATHS ${MUMPS_LIB_DIR})
+      find_library(CMUMPS_LIB NAMES cmumps PATHS ${MUMPS_LIB_DIR})
+      find_library(ZMUMPS_LIB NAMES zmumps PATHS ${MUMPS_LIB_DIR})
+      if (SMUMPS_LIB AND DMUMPS_LIB AND CMUMPS_LIB AND ZMUMPS_LIB)
+        set(MUMPS_LIBS ${SMUMPS_LIB} ${DMUMPS_LIB} ${CMUMPS_LIB} ${ZMUMPS_LIB})
+      endif()
+    endif()
+  endif()
+#  find_library(MUMPS_COMMON_LIBRARY NAMES mumps_common HINTS ${MUMPS_LIB_DIR})
+#  find_library(MUMPS_PORD_LIBRARY NAMES pord HINTS ${MUMPS_LIB_DIR})
+#  find_library(MPI_SEQ NAMES mpiseq HINTS ${MUMPS_LIB_DIR})
+#  set(MUMPS_LIBRARIES ${DMUMPS_LIB}
+#                      ${MUMPS_COMMON_LIBRARY}
+#                      ${MUMPS_PORD_LIBRARY}
+#                      ${MPI_SEQ})
+  #  find_package(MUMPS REQUIRED)
+  find_path(MUMPS_INCLUDE_PATH NAMES dmumps_struc.h HINTS ${MUMPS_INC_DIR})
+  set(CMAKE_REQUIRED_INCLUDES ${MUMPS_INCLUDE_PATH})
+    check_include_file(smumps_c.h HAVE_SMUMPS_C)
+    check_include_file(dmumps_c.h HAVE_DMUMPS_C)
+    check_include_file(cmumps_c.h HAVE_CMUMPS_C)
+    check_include_file(zmumps_c.h HAVE_ZMUMPS_C)
+  set(CMAKE_REQUIRED_INCLUDES)
+
+  if(MUMPS_LIBS)
+    message(STATUS "MUMPS_LIBS = ${MUMPS_LIBS}")
+  else()
+    message(WARNING "MUMPS LIB NOT found : you can define MUMPS_LIB_DIR to 
help cmake find it")
+  endif()
+
+  if(MUMPS_INCLUDE_PATH)
+    message(STATUS "MUMPS_INCLUDE_PATH = ${MUMPS_INCLUDE_PATH}")
+  else()
+    message(WARNING "MUMPS headers NOT found : you can define MUMPS_INC_DIR to 
help cmake find them")
+  endif()
+
+  if(MUMPS_LIBS AND MUMPS_INCLUDE_PATH)
+    set(GMM_USES_MUMPS 1)
+    message(STATUS "Building with MUMPS support")
+  else()
+    set(ENABLE_MUMPS OFF)
+    message(WARNING "Building without MUMPS support")
+  endif()
+else()
+  message("Building with MUMPS explicitly disabled")
+endif()
+
+if(NOT ENABLE_MUMPS AND NOT ENABLE_SUPERLU)
+  message(FATAL_ERROR
+          "Neither MUMPS nor SuperLU activated."
+          "At least one direct linear solver is required."
+          "Use MUMPS_LIB_DIR, MUMPS_INC_DIR, SUPERLU_LIB_DIR and 
SUPERLU_INC_DIR")
+endif()
+
+# define source files and main build target
+set(SOURCES
+    src/bgeot_convex_ref.cc
+    src/bgeot_convex_ref_simplexified.cc
+    src/bgeot_convex_structure.cc
+    src/bgeot_ftool.cc
+    src/bgeot_geometric_trans.cc
+    src/bgeot_geotrans_inv.cc
+    src/bgeot_kdtree.cc
+    src/bgeot_mesh_structure.cc
+    src/bgeot_node_tab.cc
+    src/bgeot_poly.cc
+    src/bgeot_poly_composite.cc
+    src/bgeot_rtree.cc
+    src/bgeot_small_vector.cc
+    src/bgeot_sparse_tensors.cc
+    src/bgeot_torus.cc
+    src/dal_backtrace.cc
+    src/dal_bit_vector.cc
+    src/dal_singleton.cc
+    src/dal_static_stored_objects.cc
+    src/getfem_assembling_tensors.cc
+    src/getfem_contact_and_friction_common.cc
+    src/getfem_contact_and_friction_integral.cc
+    src/getfem_contact_and_friction_large_sliding.cc
+    src/getfem_contact_and_friction_nodal.cc
+    src/getfem_context.cc
+    src/getfem_continuation.cc
+    src/getfem_enumeration_dof_para.cc
+    src/getfem_error_estimate.cc
+    src/getfem_export.cc
+    src/getfem_fem.cc
+    src/getfem_fem_composite.cc
+    src/getfem_fem_global_function.cc
+    src/getfem_fem_level_set.cc
+    src/getfem_fourth_order.cc
+    src/getfem_generic_assembly_compile_and_exec.cc
+    src/getfem_generic_assembly_functions_and_operators.cc
+    src/getfem_generic_assembly_interpolation.cc
+    src/getfem_generic_assembly_semantic.cc
+    src/getfem_generic_assembly_tree.cc
+    src/getfem_generic_assembly_workspace.cc
+    src/getfem_global_function.cc
+    src/getfem_HHO.cc
+    src/getfem_im_data.cc
+    src/getfem_import.cc
+    src/getfem_integration.cc
+    src/getfem_integration_composite.cc
+    src/getfem_interpolated_fem.cc
+    src/getfem_interpolation.cc
+    src/getfem_interpolation_on_deformed_domains.cc
+    src/getfem_level_set.cc
+    src/getfem_level_set_contact.cc
+    src/getfem_linearized_plates.cc
+    src/getfem_locale.cc
+    src/getfem_mat_elem.cc
+    src/getfem_mat_elem_type.cc
+    src/getfem_mesh.cc
+    src/getfem_mesher.cc
+    src/getfem_mesh_fem.cc
+    src/getfem_mesh_fem_global_function.cc
+    src/getfem_mesh_fem_level_set.cc
+    src/getfem_mesh_fem_product.cc
+    src/getfem_mesh_fem_sum.cc
+    src/getfem_mesh_im.cc
+    src/getfem_mesh_im_level_set.cc
+    src/getfem_mesh_level_set.cc
+    src/getfem_mesh_region.cc
+    src/getfem_mesh_slice.cc
+    src/getfem_mesh_slicers.cc
+    src/getfem_models.cc
+    src/getfem_model_solvers.cc
+    src/getfem_nonlinear_elasticity.cc
+    src/getfem_omp.cc
+    src/getfem_partial_mesh_fem.cc
+    src/getfem_plasticity.cc
+    src/getfem_projected_fem.cc
+    src/getfem_regular_meshes.cc
+    src/getfem_torus.cc)
+
+set(HEADERS
+    src/gmm/gmm_algobase.h
+    src/gmm/gmm_blas.h
+    src/gmm/gmm_blas_interface.h
+    src/gmm/gmm_condition_number.h
+    src/gmm/gmm_conjugated.h
+    src/gmm/gmm_def.h
+    src/gmm/gmm_dense_Householder.h
+    src/gmm/gmm_dense_lu.h
+    src/gmm/gmm_dense_matrix_functions.h
+    src/gmm/gmm_dense_qr.h
+    src/gmm/gmm_dense_sylvester.h
+    src/gmm/gmm_domain_decomp.h
+    src/gmm/gmm_except.h
+    src/gmm/gmm_feedback_management.h
+    src/gmm/gmm.h
+    src/gmm/gmm_inoutput.h
+    src/gmm/gmm_interface_bgeot.h
+    src/gmm/gmm_interface.h
+    src/gmm/gmm_iter.h
+    src/gmm/gmm_iter_solvers.h
+    src/gmm/gmm_kernel.h
+    src/gmm/gmm_lapack_interface.h
+    src/gmm/gmm_least_squares_cg.h
+    src/gmm/gmm_matrix.h
+    src/gmm/gmm_modified_gram_schmidt.h
+    src/gmm/gmm_MUMPS_interface.h
+    src/gmm/gmm_opt.h
+    src/gmm/gmm_precond_diagonal.h
+    src/gmm/gmm_precond.h
+    src/gmm/gmm_precond_ildlt.h
+    src/gmm/gmm_precond_ildltt.h
+    src/gmm/gmm_precond_ilu.h
+    src/gmm/gmm_precond_ilut.h
+    src/gmm/gmm_precond_ilutp.h
+    src/gmm/gmm_precond_mr_approx_inverse.h
+    src/gmm/gmm_range_basis.h
+    src/gmm/gmm_real_part.h
+    src/gmm/gmm_ref.h
+    src/gmm/gmm_scaled.h
+    src/gmm/gmm_solver_bfgs.h
+    src/gmm/gmm_solver_bicgstab.h
+    src/gmm/gmm_solver_cg.h
+    src/gmm/gmm_solver_constrained_cg.h
+    src/gmm/gmm_solver_gmres.h
+    src/gmm/gmm_solver_idgmres.h
+    src/gmm/gmm_solver_qmr.h
+    src/gmm/gmm_solver_Schwarz_additive.h
+    src/gmm/gmm_std.h
+    src/gmm/gmm_sub_index.h
+    src/gmm/gmm_sub_matrix.h
+    src/gmm/gmm_sub_vector.h
+    src/gmm/gmm_superlu_interface.h
+    src/gmm/gmm_transposed.h
+    src/gmm/gmm_tri_solve.h
+    src/gmm/gmm_vector.h
+    src/gmm/gmm_vector_to_matrix.h
+    src/getfem/bgeot_comma_init.h
+    src/getfem/bgeot_config.h
+    src/getfem/bgeot_convex.h
+    src/getfem/bgeot_convex_ref.h
+    src/getfem/bgeot_convex_structure.h
+    src/getfem/bgeot_ftool.h
+    src/getfem/bgeot_geometric_trans.h
+    src/getfem/bgeot_geotrans_inv.h
+    src/getfem/bgeot_kdtree.h
+    src/getfem/bgeot_mesh.h
+    src/getfem/bgeot_mesh_structure.h
+    src/getfem/bgeot_node_tab.h
+    src/getfem/bgeot_permutations.h
+    src/getfem/bgeot_poly_composite.h
+    src/getfem/bgeot_poly.h
+    src/getfem/bgeot_rtree.h
+    src/getfem/bgeot_small_vector.h
+    src/getfem/bgeot_sparse_tensors.h
+    src/getfem/bgeot_tensor.h
+    src/getfem/bgeot_torus.h
+    src/getfem/dal_backtrace.h
+    src/getfem/dal_basic.h
+    src/getfem/dal_bit_vector.h
+    src/getfem/dal_config.h
+    src/getfem/dal_naming_system.h
+    src/getfem/dal_singleton.h
+    src/getfem/dal_static_stored_objects.h
+    src/getfem/dal_tas.h
+    src/getfem/dal_tree_sorted.h
+    src/getfem/getfem_accumulated_distro.h
+    src/getfem/getfem_assembling.h
+    src/getfem/getfem_assembling_tensors.h
+    src/getfem/getfem_config.h
+    src/getfem/getfem_contact_and_friction_common.h
+    src/getfem/getfem_contact_and_friction_integral.h
+    src/getfem/getfem_contact_and_friction_large_sliding.h
+    src/getfem/getfem_contact_and_friction_nodal.h
+    src/getfem/getfem_context.h
+    src/getfem/getfem_continuation.h
+    src/getfem/getfem_convect.h
+    src/getfem/getfem_copyable_ptr.h
+    src/getfem/getfem_crack_sif.h
+    src/getfem/getfem_deformable_mesh.h
+    src/getfem/getfem_derivatives.h
+    src/getfem/getfem_error_estimate.h
+    src/getfem/getfem_export.h
+    src/getfem/getfem_fem_global_function.h
+    src/getfem/getfem_fem.h
+    src/getfem/getfem_fem_level_set.h
+    src/getfem/getfem_fourth_order.h
+    src/getfem/getfem_generic_assembly_compile_and_exec.h
+    src/getfem/getfem_generic_assembly_functions_and_operators.h
+    src/getfem/getfem_generic_assembly.h
+    src/getfem/getfem_generic_assembly_semantic.h
+    src/getfem/getfem_generic_assembly_tree.h
+    src/getfem/getfem_global_function.h
+    src/getfem/getfem_HHO.h
+    src/getfem/getfem_im_data.h
+    src/getfem/getfem_im_list.h
+    src/getfem/getfem_import.h
+    src/getfem/getfem_integration.h
+    src/getfem/getfem_interpolated_fem.h
+    src/getfem/getfem_interpolation.h
+    src/getfem/getfem_level_set_contact.h
+    src/getfem/getfem_level_set.h
+    src/getfem/getfem_linearized_plates.h
+    src/getfem/getfem_locale.h
+    src/getfem/getfem_mat_elem.h
+    src/getfem/getfem_mat_elem_type.h
+    src/getfem/getfem_mesher.h
+    src/getfem/getfem_mesh_fem_global_function.h
+    src/getfem/getfem_mesh_fem.h
+    src/getfem/getfem_mesh_fem_level_set.h
+    src/getfem/getfem_mesh_fem_product.h
+    src/getfem/getfem_mesh_fem_sum.h
+    src/getfem/getfem_mesh.h
+    src/getfem/getfem_mesh_im.h
+    src/getfem/getfem_mesh_im_level_set.h
+    src/getfem/getfem_mesh_level_set.h
+    src/getfem/getfem_mesh_region.h
+    src/getfem/getfem_mesh_slice.h
+    src/getfem/getfem_mesh_slicers.h
+    src/getfem/getfem_models.h
+    src/getfem/getfem_model_solvers.h
+    src/getfem/getfem_Navier_Stokes.h
+    src/getfem/getfem_nonlinear_elasticity.h
+    src/getfem/getfem_omp.h
+    src/getfem/getfem_partial_mesh_fem.h
+    src/getfem/getfem_plasticity.h
+    src/getfem/getfem_projected_fem.h
+    src/getfem/getfem_regular_meshes.h
+    src/getfem/getfem_torus.h)
+
+# Create the library target
+if(BUILD_SHARED_LIBS)
+  add_library(libgetfem SHARED ${SOURCES})
+else()
+  add_library(libgetfem STATIC ${SOURCES})
+endif()
+set_target_properties(libgetfem PROPERTIES OUTPUT_NAME "getfem")
+set_target_properties(libgetfem PROPERTIES VERSION ${GETFEM_VERSION})
+
+target_sources(libgetfem
+               PUBLIC FILE_SET header_set1 TYPE HEADERS
+                                           BASE_DIRS ${CMAKE_SOURCE_DIR}/src
+                                           FILES ${HEADERS}
+               PUBLIC FILE_SET header_set2 TYPE HEADERS
+                                           BASE_DIRS ${CMAKE_BINARY_DIR}
+                                           FILES 
"${CMAKE_BINARY_DIR}/gmm/gmm_arch_config.h"
+                                                 
"${CMAKE_BINARY_DIR}/getfem/getfem_arch_config.h")
+
+target_include_directories(libgetfem PRIVATE ${CMAKE_BINARY_DIR})
+target_include_directories(libgetfem PRIVATE ${CMAKE_SOURCE_DIR}/src)
+if(ENABLE_SUPERLU)
+  target_include_directories(libgetfem PRIVATE ${SUPERLU_INCLUDE_PATH})
+  target_link_libraries(libgetfem PRIVATE ${SUPERLU_LIBS})
+endif()
+if(ENABLE_MUMPS)
+  target_include_directories(libgetfem PRIVATE ${MUMPS_INCLUDE_PATH})
+  target_link_libraries(libgetfem PRIVATE "${MUMPS_LIBS}")
+endif()
+
+if(NOT GETFEM_PARA_LEVEL MATCHES "^(0|1|2)$")
+  message(FATAL_ERROR "GETFEM_PARA_LEVEL must be 0, 1, or 2")
+else()
+  if(GETFEM_PARA_LEVEL GREATER_EQUAL 1)
+    find_package(MPI REQUIRED)
+    if(MPI_CXX_FOUND)
+      target_link_libraries(libgetfem PRIVATE MPI::MPI_CXX)
+    else()
+      message(FATAL_ERROR "MPI-enabled C++ compiler not found.")
+    endif()
+    #if(GETFEM_PARA_LEVEL EQUAL 2)
+    #TODO check parallel MUMPS availability
+    #endif()
+  endif()
+endif()
+
+
+if(BUILD_SHARED_LIBS)
+  set_property(TARGET libgetfem PROPERTY POSITION_INDEPENDENT_CODE ON)
+endif()
+
+if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+  target_compile_options(libgetfem PRIVATE ${WITH_OPTIMIZATION})
+elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
+  target_compile_options(libgetfem PRIVATE ${WITH_OPTIMIZATION} -Xc -ansi)
+endif()
+
+
+# Build python interface
+if(ENABLE_PYTHON)
+  if(NOT BUILD_SHARED_LIBS)
+    message(FATAL_ERROR "Building the python interface requires shared 
libraries")
+  else()
+    set(INTERFACE_SOURCES
+        interface/src/getfem_interface.h
+        interface/src/getfem_interface.cc
+        interface/src/gfi_array.h
+        interface/src/gfi_array.c
+        interface/src/gfi_rpc.h
+        interface/src/getfemint_std.h
+        interface/src/getfemint.h
+        interface/src/getfemint.cc
+        interface/src/getfemint_misc.h
+        interface/src/getfemint_misc.cc
+        interface/src/gf_spmat.cc
+        interface/src/gf_spmat_set.cc
+        interface/src/gf_spmat_get.cc
+        interface/src/gf_linsolve.cc
+        interface/src/gf_util.cc
+        interface/src/gf_cont_struct.cc
+        interface/src/gf_cont_struct_get.cc
+        interface/src/gf_cvstruct_get.cc
+        interface/src/gf_geotrans.cc
+        interface/src/gf_geotrans_get.cc
+        interface/src/gf_compute.cc
+        interface/src/gf_mesh_fem.cc
+        interface/src/gf_mesh_fem_set.cc
+        interface/src/gf_mesh_fem_get.cc
+        interface/src/gf_mesh_im.cc
+        interface/src/gf_mesh_im_set.cc
+        interface/src/gf_mesh_im_get.cc
+        interface/src/gf_mesh_im_data.cc
+        interface/src/gf_mesh_im_data_set.cc
+        interface/src/gf_mesh_im_data_get.cc
+        interface/src/gf_model.cc
+        interface/src/gf_model_get.cc
+        interface/src/gf_model_set.cc
+        interface/src/gf_eltm.cc
+        interface/src/gf_mesher_object.cc
+        interface/src/gf_mesher_object_get.cc
+        interface/src/gf_mesh.cc
+        interface/src/gf_mesh_set.cc
+        interface/src/gf_mesh_get.cc
+        interface/src/gf_slice.cc
+        interface/src/gf_slice_get.cc
+        interface/src/gf_slice_set.cc
+        interface/src/gf_levelset.cc
+        interface/src/gf_levelset_get.cc
+        interface/src/gf_levelset_set.cc
+        interface/src/gf_mesh_levelset.cc
+        interface/src/gf_mesh_levelset_get.cc
+        interface/src/gf_mesh_levelset_set.cc
+        interface/src/gf_precond.cc
+        interface/src/gf_precond_get.cc
+        interface/src/gf_asm.cc
+        interface/src/gf_fem.cc
+        interface/src/gf_fem_get.cc
+        interface/src/gf_integ.cc
+        interface/src/gf_integ_get.cc
+        interface/src/gf_global_function.cc
+        interface/src/gf_global_function_get.cc
+        interface/src/gf_workspace.cc
+        interface/src/gf_delete.cc
+        interface/src/getfemint_workspace.h
+        interface/src/getfemint_workspace.cc
+        interface/src/getfemint_precond.h
+        interface/src/getfemint_levelset.h
+        interface/src/getfemint_levelset.cc
+        interface/src/getfemint_gsparse.h
+        interface/src/getfemint_gsparse.cc)
+
+    add_library(libgetfemint OBJECT ${INTERFACE_SOURCES})
+    set_property(TARGET libgetfemint PROPERTY POSITION_INDEPENDENT_CODE ON)
+    target_include_directories(libgetfemint PRIVATE ${CMAKE_BINARY_DIR})
+    target_include_directories(libgetfemint PRIVATE ${CMAKE_SOURCE_DIR}/src)
+    target_include_directories(libgetfemint PRIVATE 
${CMAKE_SOURCE_DIR}/interface/src)
+
+    find_package(Python3 COMPONENTS Interpreter Development NumPy REQUIRED)
+
+    # create a folder to build the python extension from
+    set(PYTHON_MODULE_PATH ${CMAKE_BINARY_DIR}/python_module)
+    file(MAKE_DIRECTORY ${PYTHON_MODULE_PATH})
+    message("PYTHON_MODULE_PATH = ${PYTHON_MODULE_PATH}")
+    add_custom_target(
+      getfem.py ALL
+      DEPENDS libgetfemint
+      WORKING_DIRECTORY ${PYTHON_MODULE_PATH}
+      COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/bin/extract_doc 
${CMAKE_SOURCE_DIR}/interface/src python-com > getfem.py
+      COMMENT "Generating getfem.py")
+
+    Python3_add_library(_getfem MODULE WITH_SOABI
+                        
${PROJECT_SOURCE_DIR}/interface/src/python/getfem_python.c
+                        $<TARGET_OBJECTS:libgetfemint>)
+    target_include_directories(_getfem PRIVATE ${CMAKE_BINARY_DIR}/getfem)
+    target_include_directories(_getfem PRIVATE 
${CMAKE_SOURCE_DIR}/interface/src)
+    target_link_libraries(_getfem PRIVATE libgetfem)
+
+    # find the installation directory for python libraries (ported from 
autotools)
+    execute_process(
+      COMMAND ${Python3_EXECUTABLE} -c "\
+import sysconfig; 
scheme=sysconfig.get_default_scheme().replace('posix_local','posix_prefix'); \
+print(sysconfig.get_path('purelib', scheme, vars={'base': 
'${CMAKE_INSTALL_PREFIX}'}))"
+      OUTPUT_VARIABLE PYTHON_SITE_PACKAGES OUTPUT_STRIP_TRAILING_WHITESPACE)
+    message("Python3_SITEARCH = ${Python3_SITEARCH} (not used)")
+    message("Python3_SITELIB = ${Python3_SITELIB} (not used)")
+    message("PYTHON_SITE_PACKAGES = ${PYTHON_SITE_PACKAGES} (used)")
+  endif()
+endif()
+
+if(ENABLE_OCTAVE)
+  message(FATAL_ERROR "Building the Octave interface not supported in the 
cmake configuration")
+endif()
+
+if(ENABLE_MATLAB)
+  message(FATAL_ERROR "Building the Matlab interface not supported in the 
cmake configuration")
+endif()
+
+if(ENABLE_OPENMP)
+  find_package(OpenMP REQUIRED)
+  if(OpenMP_CXX_FOUND)
+    set(GETFEM_HAS_OPENMP 1)
+    target_link_libraries(libgetfem PRIVATE OpenMP::OpenMP_CXX)
+    message(STATUS "Building with OpenMP support")
+  else()
+    message(FATAL_ERROR "Could not find OpenMP requested by the user")
+  endif()
+endif()
+
+# in the cmake build, BLAS and Lapack are hard requirements
+find_package(BLAS REQUIRED)
+find_package(LAPACK REQUIRED)
+target_link_libraries(libgetfem PRIVATE ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES})
+set(GMM_USES_BLAS 1)
+set(GMM_USES_LAPACK 1)
+
+if(ENABLE_QHULL)
+#  find_library(QHULL_R_LIB qhull_r)
+#  message(STATUS "QHULL_R_LIB = ${QHULL_R_LIB}")
+#  target_link_libraries(libgetfem PRIVATE ${QHULL_R_LIB})
+  find_package(Qhull REQUIRED COMPONENTS qhull_r)
+  if(Qhull_FOUND)
+    set(GETFEM_HAVE_LIBQHULL_R_QHULL_RA_H 1)
+    target_link_libraries(libgetfem PRIVATE Qhull::qhull_r)
+    message(STATUS "Building with Qhull support")
+  else()
+    set(ENABLE_QHULL OFF)
+    message(WARNING "Building without Qhull support")
+  endif()
+else()
+  message("Building with Qhull explicitly disabled")
+endif()
+
+if(ENABLE_MULTITHREADED_BLAS)
+  find_library(DL_LIB NAMES dl)
+  set(CMAKE_REQUIRED_LIBRARIES ${DL_LIB})
+    check_library_exists(dl dlsym "" HAVE_DLSYM)
+  set(CMAKE_REQUIRED_LIBRARIES ${DL_LIB})
+  if(HAVE_DLSYM)
+    target_link_libraries(libgetfem PRIVATE ${DL_LIB})
+  else()
+    message(FATAL_ERROR
+            "Could not find dlsym function required for enabling multithreaded 
BLAS")
+  endif()
+else() # single threaded blas by default
+  set(GETFEM_FORCE_SINGLE_THREAD_BLAS 1)
+endif()
+
+
+# Print build options
+message(STATUS "Build options:")
+message(STATUS "  WITH_OPTIMIZATION: ${WITH_OPTIMIZATION}")
+message(STATUS "  GETFEM_PARA_LEVEL: ${GETFEM_PARA_LEVEL}")
+message(STATUS "  ENABLE_PYTHON: ${ENABLE_PYTHON}")
+message(STATUS "  ENABLE_OCTAVE: ${ENABLE_OCTAVE}")
+message(STATUS "  ENABLE_MATLAB: ${ENABLE_MATLAB}")
+message(STATUS "  ENABLE_OPENMP: ${ENABLE_OPENMP}")
+message(STATUS "  ENABLE_SUPERLU: ${ENABLE_SUPERLU}")
+message(STATUS "  ENABLE_MUMPS: ${ENABLE_MUMPS}")
+message(STATUS "  ENABLE_QHULL: ${ENABLE_QHULL}")
+message(STATUS "  ENABLE_MULTITHREADED_BLAS: ${ENABLE_MULTITHREADED_BLAS}")
+message(STATUS "GetFEM version ${GETFEM_VERSION}")
+
+# Generate configuration header files for gmm and getfem
+configure_file(cmake/gmm_arch_config.h.in 
${CMAKE_BINARY_DIR}/gmm/gmm_arch_config.h)
+configure_file(cmake/getfem_arch_config.h.in 
${CMAKE_BINARY_DIR}/getfem/getfem_arch_config.h)
+
+add_custom_command(
+  OUTPUT ${CMAKE_SOURCE_DIR}/src/getfem/getfem_im_list.h
+  WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/src/getfem/
+  COMMAND perl ${CMAKE_SOURCE_DIR}/cubature/make_getfem_im_list 
${CMAKE_SOURCE_DIR}/cubature
+  COMMENT "Generating getfem_im_list.h")
+
+install(TARGETS libgetfem
+        FILE_SET header_set1
+        FILE_SET header_set2)
+if(ENABLE_PYTHON)
+  install(TARGETS _getfem
+          DESTINATION ${PYTHON_SITE_PACKAGES}/getfem)
+  install(FILES "${PYTHON_MODULE_PATH}/getfem.py" 
"${CMAKE_SOURCE_DIR}/interface/src/python/__init__.py"
+          DESTINATION ${PYTHON_SITE_PACKAGES}/getfem)
+endif()
+
+#get_cmake_property(_variableNames VARIABLES)
+#list (SORT _variableNames)
+#foreach (_variableName ${_variableNames})
+#    message(STATUS "${_variableName}=${${_variableName}}")
+#endforeach()
diff --git a/cmake/getfem_arch_config.h.in b/cmake/getfem_arch_config.h.in
new file mode 100644
index 00000000..79b8537a
--- /dev/null
+++ b/cmake/getfem_arch_config.h.in
@@ -0,0 +1,50 @@
+/* manually maintained template for cmake, equivalent to 
src/getfem/getfem_arch_config.h.in
+   used by autotools. */
+
+/* enable openblas to be multithreaded */
+#cmakedefine GETFEM_FORCE_SINGLE_THREAD_BLAS
+
+/* defined if GetFEM is built with OpenMP parallelization */
+#cmakedefine GETFEM_HAS_OPENMP
+
+/* glibc backtrace function */
+#cmakedefine GETFEM_HAVE_BACKTRACE
+
+/* defined if the cxxabi.h header file is available */
+#cmakedefine GETFEM_HAVE_CXXABI_H
+
+/* glibc floating point exceptions control */
+#cmakedefine GETFEM_HAVE_FEENABLEEXCEPT
+
+/* defined if the <libqhull_r/qhull_ra.h> header file is available */
+#cmakedefine GETFEM_HAVE_LIBQHULL_R_QHULL_RA_H
+
+/* defined if the Metis library was found and is working */
+#cmakedefine GETFEM_HAVE_METIS
+
+/* defined if the Metis library found is older than version 4 */
+#cmakedefine GETFEM_HAVE_METIS_OLD_API
+
+/* defined if the qd library was found and is working */
+#cmakedefine GETFEM_HAVE_QDLIB
+
+/* GetFEM package name */
+#define GETFEM_PACKAGE_NAME "@GETFEM_PACKAGE_NAME@"
+
+/* GetFEM package string */
+#define GETFEM_PACKAGE_STRING "@GETFEM_PACKAGE_STRING@"
+
+/* GetFEM package tarname */
+#define GETFEM_PACKAGE_TARNAME "@GETFEM_PACKAGE_TARNAME@"
+
+/* Parallelization level (0|1|2) */
+#define GETFEM_PARA_LEVEL @GETFEM_PARA_LEVEL@
+
+/* defined if quad-doubles are to be used instead of double-double */
+#cmakedefine GETFEM_QDLIB_USE_QUAD
+
+/* Use rpc for getfem communication with matlab */
+#cmakedefine GETFEM_USE_RPC
+
+/* GetFEM version */
+#define GETFEM_VERSION "@GETFEM_VERSION@"
diff --git a/cmake/gmm_arch_config.h.in b/cmake/gmm_arch_config.h.in
new file mode 100644
index 00000000..50f47daa
--- /dev/null
+++ b/cmake/gmm_arch_config.h.in
@@ -0,0 +1,26 @@
+/* manually maintained template for cmake, equivalent to 
src/gmm/gmm_arch_config.h.in
+   used by autotools. */
+
+/* gcc style __PRETTY_FUNCTION__ macro */
+#cmakedefine GMM_HAVE_PRETTY_FUNCTION
+
+/* defined if GMM is linked to a blas library */
+#cmakedefine GMM_USES_BLAS
+
+/* defined if GMM is linked to a lapack library */
+#cmakedefine GMM_USES_LAPACK
+
+/* defined if GMM uses MPI */
+#cmakedefine GMM_USES_MPI
+
+/* defined if GMM is linked to the mumps library */
+#cmakedefine GMM_USES_MUMPS
+
+/* defined if GMM is linked to the superlu library */
+#cmakedefine GMM_USES_SUPERLU
+
+/* Use blas with 64 bits integers */
+#cmakedefine GMM_USE_BLAS64_INTERFACE
+
+/* GMM version */
+#define GMM_VERSION "@GMM_VERSION@"



reply via email to

[Prev in Thread] Current Thread [Next in Thread]