_generate_pyx.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import pathlib
  2. import subprocess
  3. import sys
  4. import os
  5. import argparse
  6. def isNPY_OLD():
  7. '''
  8. A new random C API was added in 1.18 and became stable in 1.19.
  9. Prefer the new random C API when building with recent numpy.
  10. '''
  11. import numpy as np
  12. ver = tuple(int(num) for num in np.__version__.split('.')[:2])
  13. return ver < (1, 19)
  14. def make_biasedurn(outdir):
  15. '''Substitute True/False values for NPY_OLD Cython build variable.'''
  16. biasedurn_base = (pathlib.Path(__file__).parent / '_biasedurn').absolute()
  17. with open(biasedurn_base.with_suffix('.pyx.templ'), 'r') as src:
  18. contents = src.read()
  19. outfile = outdir / '_biasedurn.pyx'
  20. with open(outfile, 'w') as dest:
  21. dest.write(contents.format(NPY_OLD=str(bool(isNPY_OLD()))))
  22. def make_unuran(srcdir, outdir):
  23. """Substitute True/False values for NPY_OLD Cython build variable."""
  24. import re
  25. with open(srcdir / "unuran_wrapper.pyx.templ", "r") as src:
  26. contents = src.read()
  27. with open(outdir / "unuran_wrapper.pyx", "w") as dest:
  28. dest.write(re.sub("DEF NPY_OLD = isNPY_OLD",
  29. f"DEF NPY_OLD = {isNPY_OLD()}",
  30. contents))
  31. def make_boost(outdir, distutils_build=False):
  32. # Call code generator inside _boost directory
  33. code_gen = pathlib.Path(__file__).parent / '_boost/include/code_gen.py'
  34. if distutils_build:
  35. subprocess.run([sys.executable, str(code_gen), '-o', outdir,
  36. '--distutils-build', 'True'], check=True)
  37. else:
  38. subprocess.run([sys.executable, str(code_gen), '-o', outdir],
  39. check=True)
  40. if __name__ == '__main__':
  41. parser = argparse.ArgumentParser()
  42. parser.add_argument("-o", "--outdir", type=str,
  43. help="Path to the output directory")
  44. args = parser.parse_args()
  45. if not args.outdir:
  46. # We're dealing with a distutils build here, write in-place:
  47. outdir_abs = pathlib.Path(os.path.abspath(os.path.dirname(__file__)))
  48. make_biasedurn(outdir_abs)
  49. outdir_abs_boost = outdir_abs / '_boost' / 'src'
  50. if not os.path.exists(outdir_abs_boost):
  51. os.makedirs(outdir_abs_boost)
  52. make_boost(outdir_abs_boost, distutils_build=True)
  53. outdir_abs_unuran = outdir_abs / '_unuran'
  54. make_unuran(outdir_abs_unuran, outdir_abs_unuran)
  55. else:
  56. # Meson build
  57. srcdir_abs = pathlib.Path(os.path.abspath(os.path.dirname(__file__)))
  58. outdir_abs = pathlib.Path(os.getcwd()) / args.outdir
  59. make_biasedurn(outdir_abs)
  60. make_boost(outdir_abs)
  61. make_unuran(srcdir_abs / '_unuran', outdir_abs)