build(meson): updated build system. Note that this build system should be able to bring in MFEM and all needed deps automatically (tested on ubuntu, fedora, and macos)

This commit is contained in:
2026-11-09 13:50:06 -05:00
parent 811bbd9694
commit 829e53d56e
6 changed files with 3155 additions and 182 deletions

View File

@@ -1,27 +1,143 @@
subdir('include/serif')
include_dir = include_directories('include')
# TODO: Really we should make a dependency graph between the various modules
# and then make sublibraries for each module that build themselves in the correct order
# and then link together at the end.
serif_sources = files(
serif_core_sources = files(
'lib/serif/utils/serialize/archive.cpp',
'lib/serif/utils/serialize/top.cpp',
'lib/serif/utils/serialize/format.cpp',
'lib/serif/utils/serialize/provenance.cpp',
'lib/serif/solver/nonlinear/options.cpp',
'lib/serif/solver/linear/linear.cpp',
'lib/serif/solver/seed/polytrope.cpp',
'lib/serif/solver/seed/fitted.cpp',
'lib/serif/model/specifications.cpp',
'lib/serif/discretization/blocks/system_layout.cpp',
'lib/serif/utils/laneemden/solution.cpp',
'lib/serif/utils/laneemden/scaling.cpp',
'lib/serif/solver/normalization/dimensionless.cpp',
'lib/serif/solver/normalization/diagonal.cpp',
'lib/serif/solver/normalization/riesz_factors.cpp',
'lib/serif/solver/normalization/scales.cpp',
'lib/serif/solver/normalization/validation.cpp',
'lib/serif/solver/normalization/packing.cpp',
'lib/serif/discretization/domain/mesh/topology.cpp',
'lib/serif/discretization/domain/schema/validation/results.cpp',
'lib/serif/discretization/quadrature/policy.cpp',
'lib/serif/eos/models/polytropic.cpp',
'lib/serif/mapping/compactification/kelvin.cpp',
'lib/serif/mapping/data.cpp',
'lib/serif/mapping/domain_mapper.cpp',
'lib/serif/mapping/transformations.cpp',
'lib/serif/mapping/volume_cache.cpp',
'lib/serif/mapping/evaluator.cpp',
'lib/serif/mapping/coefficients.cpp'
'lib/serif/geometry/surface/isobaric.cpp',
'lib/serif/geometry/deformation/determinant_polynomial.cpp',
'lib/serif/geometry/deformation/harmonics.cpp',
'lib/serif/geometry/deformation/radial_extension.cpp',
'lib/serif/geometry/deformation/radial_interpolation.cpp',
'lib/serif/geometry/deformation/surface_embedding.cpp',
)
serif_mfem_sources = files(
'lib/serif/backend/mfem/runtime.cpp',
'lib/serif/backend/mfem/model/finite_elements.cpp',
'lib/serif/backend/mfem/serialize/resources.cpp',
'lib/serif/backend/mfem/serialize/top.cpp',
'lib/serif/backend/mfem/solver/linear/solve.cpp',
'lib/serif/backend/mfem/operators/actions.cpp',
'lib/serif/backend/mfem/model/deformation.cpp',
'lib/serif/backend/mfem/model/system.cpp',
'lib/serif/backend/mfem/model/scalar_row.cpp',
'lib/serif/backend/mfem/model/surface_potential.cpp',
'lib/serif/backend/mfem/model/system_selection.cpp',
'lib/serif/backend/mfem/operators/replaced_rows.cpp',
'lib/serif/backend/mfem/discretization/element_coordinates.cpp',
'lib/serif/backend/mfem/operators/linearized_block.cpp',
'lib/serif/backend/mfem/solver/preconditioner/border.cpp',
'lib/serif/backend/mfem/solver/preconditioner/coupling.cpp',
'lib/serif/backend/mfem/solver/preconditioner/coupling_selection.cpp',
'lib/serif/backend/mfem/solver/preconditioner/inverse/amg.cpp',
'lib/serif/backend/mfem/solver/preconditioner/inverse/dense.cpp',
'lib/serif/backend/mfem/solver/preconditioner/inverse/diagonal.cpp',
'lib/serif/backend/mfem/solver/preconditioner/inverse/sparse_direct.cpp',
'lib/serif/backend/mfem/solver/preconditioner/inverse/validation.cpp',
'lib/serif/backend/mfem/solver/preconditioner/solver.cpp',
'lib/serif/backend/mfem/projection/radial.cpp',
'lib/serif/backend/mfem/solver/normalization/operators.cpp',
'lib/serif/backend/mfem/discretization/mass_diagonal.cpp',
'lib/serif/backend/mfem/discretization/basis_evaluation.cpp',
'lib/serif/backend/mfem/discretization/reconstruction.cpp',
'lib/serif/backend/mfem/discretization/boundary_trace.cpp',
'lib/serif/backend/mfem/mapping/compactification/kelvin.cpp',
'lib/serif/backend/mfem/mapping/data.cpp',
'lib/serif/backend/mfem/mapping/domain_mapper.cpp',
'lib/serif/backend/mfem/mapping/transformations.cpp',
'lib/serif/backend/mfem/mapping/volume_cache.cpp',
'lib/serif/backend/mfem/mapping/evaluator.cpp',
'lib/serif/backend/mfem/geometry/deformation/geometry_step.cpp',
'lib/serif/backend/mfem/geometry/deformation/inputs.cpp',
'lib/serif/backend/mfem/geometry/deformation/radial_interpolation.cpp',
'lib/serif/backend/mfem/geometry/deformation/radial_locator.cpp',
'lib/serif/backend/mfem/geometry/deformation/reference_geometry.cpp',
'lib/serif/backend/mfem/geometry/deformation/surface_metric.cpp',
'lib/serif/backend/mfem/shared/reference_tracking.cpp',
'lib/serif/backend/mfem/shared/parallel.cpp',
'lib/serif/backend/mfem/discretization/topology.cpp',
)
# The core deliberately receives no MFEM headers or link dependencies.
serif_core_lib = static_library(
'serif_core',
serif_core_sources,
include_directories: include_dir,
dependencies: [nameof_dep, magic_enum_dep],
pic: true,
)
serif_core_dep = declare_dependency(
include_directories: include_dir,
link_with: serif_core_lib,
dependencies: [nameof_dep, magic_enum_dep],
)
# Backend of the SparseDirect preconditioner inverse (option sparse_direct). Exactly one implementation of
# inverse/direct_lu.hpp is compiled into serif_direct_lu and linked whole into libserif.
direct_lu_root = 'lib/serif/backend/mfem/solver/preconditioner/inverse/'
sparse_direct = get_option('sparse_direct')
accelerate_dep = dependency('appleframeworks', modules: ['Accelerate'], required: false)
# Accelerate's sparse LU (macOS 15.5 SDK or newer); its availability is also checked at run time.
accelerate_lu_ok = host_machine.system() == 'darwin' and accelerate_dep.found() and cpp.compiles(
'#include <Accelerate/Accelerate.h>\nint main() { return SparseFactorizationLU == 80 ? 0 : 1; }',
args: ['-std=c++20'], dependencies: accelerate_dep, name: 'Accelerate sparse LU')
umfpack_dep = dependency('UMFPACK', required: sparse_direct == 'umfpack')
if sparse_direct == 'auto'
if get_option('feature_profile') == 'minimal'
sparse_direct = 'none'
elif accelerate_lu_ok
sparse_direct = 'accelerate'
elif umfpack_dep.found()
sparse_direct = 'umfpack'
else
sparse_direct = 'none'
endif
elif sparse_direct == 'accelerate' and not accelerate_lu_ok
error('sparse_direct=accelerate needs macOS with an SDK providing Accelerate SparseFactorizationLU (macOS 15.5 SDK).')
endif
if sparse_direct == 'accelerate'
# Accelerate's headers include CoreGraphics, which is not valid C++26, so this one file is built as C++20.
serif_direct_lu_lib = static_library('serif_direct_lu', direct_lu_root + 'direct_lu_accelerate.cpp',
dependencies: accelerate_dep, override_options: ['cpp_std=c++20'], pic: true)
direct_lu_deps = [accelerate_dep]
elif sparse_direct == 'umfpack'
serif_direct_lu_lib = static_library('serif_direct_lu', direct_lu_root + 'direct_lu_umfpack.cpp',
dependencies: umfpack_dep, pic: true)
direct_lu_deps = [umfpack_dep]
else
serif_direct_lu_lib = static_library('serif_direct_lu', direct_lu_root + 'direct_lu_none.cpp', pic: true)
direct_lu_deps = []
endif
serif_sparse_direct_backend = sparse_direct
serif_lib = library(
'serif',
serif_sources,
serif_mfem_sources,
link_whole: [serif_core_lib, serif_direct_lu_lib],
include_directories: include_dir,
dependencies: [mfem_dep, nameof_dep, magic_enum_dep],
dependencies: [mfem_dep, nameof_dep, magic_enum_dep, stroid_dep] + direct_lu_deps,
build_rpath: mfem_runtime_prefix == '' ? '' : mfem_runtime_prefix / 'lib',
)
@@ -33,10 +149,49 @@ serif_dep = declare_dependency(
if get_option('build_checks')
checks_srcs = files(
'compile_time_checks/serif/solver/continuation.cpp',
'compile_time_checks/serif/solver/public_contracts.cpp',
'compile_time_checks/serif/model/description.cpp',
'compile_time_checks/serif/model/finite_elements.cpp',
'compile_time_checks/serif/model/state.cpp',
'compile_time_checks/serif/model/scalar_row.cpp',
'compile_time_checks/serif/model/normalization.cpp',
'compile_time_checks/serif/model/density_primal.cpp',
'compile_time_checks/serif/model/barotropic_density.cpp',
'compile_time_checks/serif/model/validation.cpp',
'compile_time_checks/serif/model/execution_validation.cpp',
'compile_time_checks/serif/solver/preconditioner/layout.cpp',
'compile_time_checks/serif/solver/preconditioner/coupling.cpp',
'compile_time_checks/serif/solver/preconditioner/inverses.cpp',
'compile_time_checks/serif/utils/laneemden.cpp',
'compile_time_checks/serif/utils/projection.cpp',
'compile_time_checks/serif/solver/normalization/dimensionless.cpp',
'compile_time_checks/serif/solver/normalization/plan.cpp',
'compile_time_checks/serif/solver/normalization/algebra.cpp',
'compile_time_checks/serif/geometry/surface_storage_meanfield.cpp',
'compile_time_checks/serif/operators/coordinate_identity_meanfield.cpp',
'compile_time_checks/serif/geometry/deformation_meanfield.cpp',
'compile_time_checks/serif/discretization/fields_meanfield.cpp',
'compile_time_checks/serif/eos/consumers_meanfield.cpp',
'compile_time_checks/serif/dimensions/catalogue_meanfield.cpp',
'compile_time_checks/serif/utils/dependencies/binding.cpp',
'compile_time_checks/serif/utils/dependencies/key_list.cpp',
'compile_time_checks/serif/utils/dependencies/dependency_context.cpp',
'compile_time_checks/serif/utils/dependencies/computation_graph.cpp',
'compile_time_checks/serif/utils/dependencies/mixed_errors.cpp',
'compile_time_checks/serif/operators/computation_owners.cpp',
'compile_time_checks/serif/operators/plan.cpp',
'compile_time_checks/serif/dimensions/quantities.cpp',
'compile_time_checks/serif/backend/mfem/discretization/quadrature/mfem_static_order.cpp',
'compile_time_checks/serif/geometry/surface.cpp',
'compile_time_checks/serif/geometry/surface_boundary.cpp',
'compile_time_checks/serif/geometry/deformation.cpp',
'compile_time_checks/serif/eos/evaluation.cpp',
'compile_time_checks/serif/eos/models/traits.cpp',
'compile_time_checks/serif/discretization/forms/forms.cpp',
'compile_time_checks/serif/discretization/forms/operands.cpp',
'compile_time_checks/serif/discretization/blocks/fields.cpp',
'compile_time_checks/serif/discretization/quadrature/backend/mfem/mfem_resolver.cpp',
'compile_time_checks/serif/backend/mfem/discretization/quadrature/mfem_resolver.cpp',
)
# We only make this a lib since we really dont need it to link to anything latter. This is just compiled
@@ -58,3 +213,12 @@ if get_option('build_checks')
dependencies: [mfem_dep, magic_enum_dep],
)
endif
if get_option('build_checks')
serif_core_checks = static_library(
'serif_core_checks',
'compile_time_checks/serif/backend_independent.cpp',
include_directories: include_dir,
dependencies: [nameof_dep, magic_enum_dep],
)
endif