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:
192
src/meson.build
192
src/meson.build
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user