project(
'SageMath',
['c', 'cpp', 'cython'],
version: files('src/VERSION.txt'),
license: 'GPL v3',
default_options: ['c_std=c17', 'cpp_std=c++17', 'python.install_env=auto'],
meson_version: '>=1.2',
)
# Python module
# https://mesonbuild.com/Python-module.html
py_module = import('python')
py = py_module.find_installation(pure: false)
py_dep = py.dependency()
fs = import('fs')
is_windows = host_machine.system() == 'windows'
# Additional targets
py_with_pytest = py_module.find_installation(
required: false,
modules: ['pytest'],
)
if py_with_pytest.found()
test(
'pytest',
py_with_pytest,
args: [
'-m',
'pytest',
'-c',
meson.current_source_dir() / 'tox.ini',
'--doctest',
meson.current_source_dir() / 'src' / 'sage' / 'categories',
],
timeout: 0,
)
endif
# Workaround for missing init files (Cython doesn't handle namespace packages well)
create_files_command = [
py,
'-c',
'''
from pathlib import Path
content = "# Here so that cython creates the correct module name"
file_paths = [
'src/sage/interfaces/__init__.py',
'src/sage/crypto/block_cipher/__init__.py',
'src/sage/crypto/public_key/__init__.py',
'src/sage/logic/__init__.py',
'src/sage/parallel/__init__.py',
'src/sage/dynamics/cellular_automata/__init__.py',
'src/sage/dynamics/arithmetic_dynamics/__init__.py',
'src/sage/dynamics/__init__.py',
'src/sage/dynamics/complex_dynamics/__init__.py',
'src/sage/knots/__init__.py',
'src/sage/topology/__init__.py',
'src/sage/functions/__init__.py',
'src/sage/manifolds/subsets/__init__.py',
'src/sage/manifolds/__init__.py',
'src/sage/manifolds/differentiable/examples/__init__.py',
'src/sage/manifolds/differentiable/__init__.py',
'src/sage/coding/source_coding/__init__.py',
'src/sage/coding/guruswami_sudan/__init__.py',
'src/sage/coding/__init__.py',
'src/sage/coding/codecan/__init__.py',
'src/sage/games/__init__.py',
'src/sage/quivers/__init__.py',
'src/sage/schemes/cyclic_covers/__init__.py',
'src/sage/schemes/plane_conics/__init__.py',
'src/sage/schemes/curves/__init__.py',
'src/sage/schemes/plane_quartics/__init__.py',
'src/sage/schemes/jacobians/__init__.py',
'src/sage/schemes/toric/sheaf/__init__.py',
'src/sage/schemes/toric/__init__.py',
'src/sage/schemes/product_projective/__init__.py',
'src/sage/schemes/elliptic_curves/__init__.py',
'src/sage/schemes/riemann_surfaces/__init__.py',
'src/sage/schemes/hyperelliptic_curves/__init__.py',
'src/sage/schemes/berkovich/__init__.py',
'src/sage/schemes/generic/__init__.py',
'src/sage/schemes/projective/__init__.py',
'src/sage/schemes/__init__.py',
'src/sage/schemes/affine/__init__.py',
'src/sage/modular/hecke/__init__.py',
'src/sage/modular/pollack_stevens/__init__.py',
'src/sage/modular/overconvergent/__init__.py',
'src/sage/modular/modform/__init__.py',
'src/sage/modular/quasimodform/__init__.py',
'src/sage/modular/modsym/__init__.py',
'src/sage/modular/local_comp/__init__.py',
'src/sage/modular/quatalg/__init__.py',
'src/sage/modular/ssmod/__init__.py',
'src/sage/modular/abvar/__init__.py',
'src/sage/modular/__init__.py',
'src/sage/modular/btquotients/__init__.py',
'src/sage/modular/arithgroup/__init__.py',
'src/sage/modular/modform_hecketriangle/__init__.py',
'src/sage/combinat/cluster_algebra_quiver/__init__.py',
'src/sage/combinat/root_system/__init__.py',
'src/sage/combinat/species/__init__.py',
'src/sage/combinat/designs/__init__.py',
'src/sage/combinat/posets/__init__.py',
'src/sage/combinat/matrices/__init__.py',
'src/sage/combinat/rigged_configurations/__init__.py',
'src/sage/combinat/ncsf_qsym/__init__.py',
'src/sage/combinat/path_tableaux/__init__.py',
'src/sage/combinat/sf/__init__.py',
'src/sage/combinat/__init__.py',
'src/sage/combinat/chas/__init__.py',
'src/sage/combinat/ncsym/__init__.py',
'src/sage/combinat/words/__init__.py',
'src/sage/combinat/crystals/__init__.py',
'src/sage/tensor/modules/__init__.py',
'src/sage/tensor/__init__.py',
'src/sage/groups/matrix_gps/__init__.py',
'src/sage/groups/semimonomial_transformations/__init__.py',
'src/sage/groups/perm_gps/partn_ref2/__init__.py',
'src/sage/groups/perm_gps/partn_ref/__init__.py',
'src/sage/groups/perm_gps/__init__.py',
'src/sage/groups/__init__.py',
'src/sage/groups/affine_gps/__init__.py',
'src/sage/groups/abelian_gps/__init__.py',
'src/sage/groups/additive_abelian/__init__.py',
'src/sage/groups/lie_gps/__init__.py',
'src/sage/groups/misc_gps/__init__.py',
'src/sage/symbolic/__init__.py',
'src/sage/symbolic/integration/__init__.py',
'src/sage/lfunctions/__init__.py',
'src/sage/arith/__init__.py',
'src/sage/ext/__init__.py',
'src/sage/ext/interpreters/__init__.py',
'src/sage/categories/examples/__init__.py',
'src/sage/categories/__init__.py',
'src/sage/modules/fg_pid/__init__.py',
'src/sage/modules/__init__.py',
'src/sage/modules/with_basis/__init__.py',
'src/sage/modules/fp_graded/steenrod/__init__.py',
'src/sage/modules/fp_graded/__init__.py',
'src/sage/misc/__init__.py',
'src/sage/rings/convert/__init__.py',
'src/sage/rings/invariants/__init__.py',
'src/sage/rings/finite_rings/__init__.py',
'src/sage/rings/function_field/__init__.py',
'src/sage/rings/function_field/drinfeld_modules/__init__.py',
'src/sage/rings/semirings/__init__.py',
'src/sage/rings/number_field/__init__.py',
'src/sage/rings/__init__.py',
'src/sage/rings/padics/__init__.py',
'src/sage/rings/valuation/__init__.py',
'src/sage/rings/asymptotic/__init__.py',
'src/sage/rings/polynomial/weil/__init__.py',
'src/sage/rings/polynomial/__init__.py',
'src/sage/rings/polynomial/padics/__init__.py',
'src/sage/monoids/__init__.py',
'src/sage/matrix/__init__.py',
'src/sage/matroids/__init__.py',
'src/sage/interacts/__init__.py',
'src/sage/__init__.py',
'src/sage/plot/__init__.py',
'src/sage/plot/plot3d/__init__.py',
'src/sage/typeset/__init__.py',
'src/sage/algebras/lie_conformal_algebras/__init__.py',
'src/sage/algebras/fusion_rings/__init__.py',
'src/sage/algebras/letterplace/__init__.py',
'src/sage/algebras/quatalg/__init__.py',
'src/sage/algebras/steenrod/__init__.py',
'src/sage/algebras/finite_dimensional_algebras/__init__.py',
'src/sage/algebras/__init__.py',
'src/sage/algebras/hecke_algebras/__init__.py',
'src/sage/algebras/lie_algebras/__init__.py',
'src/sage/algebras/quantum_groups/__init__.py',
'src/sage/quadratic_forms/genera/__init__.py',
'src/sage/quadratic_forms/__init__.py',
'src/sage/game_theory/__init__.py',
'src/sage/sandpiles/__init__.py',
'src/sage/sat/__init__.py',
'src/sage/homology/__init__.py',
'src/sage/geometry/riemannian_manifolds/__init__.py',
'src/sage/geometry/hyperplane_arrangement/__init__.py',
'src/sage/geometry/triangulation/__init__.py',
'src/sage/geometry/polyhedron/modules/__init__.py',
'src/sage/geometry/polyhedron/__init__.py',
'src/sage/geometry/polyhedron/combinatorial_polyhedron/__init__.py',
'src/sage/geometry/__init__.py',
'src/sage/geometry/hyperbolic_space/__init__.py',
'src/sage/sets/__init__.py',
'src/sage/probability/__init__.py',
'src/sage/numerical/backends/__init__.py',
'src/sage/numerical/__init__.py',
'src/sage/data_structures/__init__.py',
'src/sage/graphs/graph_decompositions/__init__.py',
'src/sage/graphs/generators/__init__.py',
'src/sage/graphs/__init__.py',
'src/sage/graphs/base/__init__.py',
'src/sage/databases/__init__.py',
'src/sage/stats/hmm/__init__.py',
'src/sage/stats/__init__.py',
'src/sage/stats/distributions/__init__.py',
'src/sage/libs/gap/__init__.py',
'src/sage/libs/mpfi/__init__.py',
'src/sage/libs/__init__.py',
'src/sage/libs/polybori/__init__.py',
'src/sage/libs/mpfr/__init__.py',
'src/sage/libs/mpc/__init__.py',
'src/sage/calculus/transforms/__init__.py',
'src/sage/calculus/__init__.py',
]
resolved_path = Path("''' + fs.as_posix(meson.current_source_dir()) + '''") / path
resolved_path.parent.mkdir(parents=True, exist_ok=True)
resolved_path.write_text(content)
''',
]
true)
root = meson.current_source_dir()
subdir('src')