mirror of
https://github.com/TREX-CoE/trexio.git
synced 2024-12-22 20:35:44 +01:00
158 lines
5.5 KiB
Python
158 lines
5.5 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
setup.py file for TREXIO Python package
|
|
"""
|
|
|
|
|
|
import os, sys
|
|
from setuptools import setup, Extension
|
|
|
|
def parse_setuppy_commands():
|
|
"""Check the commands and respond appropriately.
|
|
At the moment it is adapted to ignore checks for numpy, pkgconfig, HDF5 flags
|
|
when building the distribution tarball with sdist option.
|
|
"""
|
|
args = sys.argv[1:]
|
|
|
|
if 'sdist' in args:
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
do_sdist = parse_setuppy_commands()
|
|
|
|
# this was recommended to solve the problem of the missing numpy header files
|
|
try:
|
|
import numpy
|
|
except ImportError:
|
|
raise Exception("numpy Python package cannot be imported.")
|
|
|
|
numpy_includedir = numpy.get_include()
|
|
|
|
# dirty workaround: get numpy includedir from the environment variable that can be pre-set using set_NUMPY_INCLUDEDIR.sh
|
|
#numpy_includedir = os.environ.get("NUMPY_INCLUDEDIR", None)
|
|
|
|
numpy_isUndefined = numpy_includedir is None or numpy_includedir==""
|
|
|
|
if numpy_isUndefined and not do_sdist:
|
|
raise Exception("NUMPY_INCLUDEDIR environment variable is not specified. Please do it manually or execute set_NUMPY_INCLUDEDIR.sh script.")
|
|
|
|
|
|
rootpath = os.path.dirname(os.path.abspath(__file__))
|
|
srcpath = os.path.join(rootpath, 'src')
|
|
c_files = ['trexio.c', 'trexio_text.c']
|
|
|
|
|
|
with open("README.md", "r") as fh:
|
|
long_description = fh.read()
|
|
|
|
VERSIONFILE = "pytrexio/_version.py"
|
|
try:
|
|
exec(open(VERSIONFILE).read())
|
|
except:
|
|
raise IOError("Could not open the version file %s." % (VERSIONFILE, ))
|
|
|
|
version_r = __version__
|
|
if not version_r:
|
|
raise RuntimeError("Unable to find a version string in %s." % (VERSIONFILE, ))
|
|
|
|
|
|
# =========================== Start of the HDF5 block =========================== #
|
|
# The block below is needed to derive additional flags related to the HDF5 library,
|
|
# which is required to build pytrexio extension module during the setup.py execution
|
|
|
|
h5_present = False
|
|
h5_ldflags_withl = os.environ.get("H5_LDFLAGS", None)
|
|
h5_cflags_withI = os.environ.get("H5_CFLAGS", None)
|
|
|
|
h5_ldflags_isUndefined = h5_ldflags_withl is None or h5_ldflags_withl==""
|
|
h5_cflags_isUndefined = h5_cflags_withI is None or h5_cflags_withI==""
|
|
|
|
h5_present = (not h5_ldflags_isUndefined) & (not h5_cflags_isUndefined)
|
|
|
|
if (h5_ldflags_isUndefined or h5_cflags_isUndefined) and not do_sdist:
|
|
|
|
try:
|
|
import pkgconfig as pk
|
|
except ImportError:
|
|
raise Exception("pkgconfig Python package cannot be imported.")
|
|
|
|
try:
|
|
assert pk.exists('hdf5')
|
|
h5_present = True
|
|
except AssertionError:
|
|
print("pkg-config could not locate HDF5; installing TREXIO with TEXT back-end only!")
|
|
|
|
if h5_present:
|
|
h5_cflags_withI = pk.cflags('hdf5')
|
|
h5_ldflags_withl = pk.libs('hdf5')
|
|
|
|
if h5_present:
|
|
h5_cflags = h5_cflags_withI.replace("-I","").split(" ")[0] if not do_sdist else ""
|
|
h5_ldflags = h5_ldflags_withl.split(" ")[0] if not do_sdist else ""
|
|
c_files.append('trexio_hdf5.c')
|
|
|
|
# ============================ End of the HDF5 block ============================ #
|
|
|
|
# Define pytrexio extension module based on TREXIO source codes + SWIG-generated wrapper
|
|
c_files.append('pytrexio_wrap.c')
|
|
compile_args = [
|
|
'-std=c99',
|
|
'-Wno-discarded-qualifiers',
|
|
'-Wno-unused-variable',
|
|
'-Wno-unused-but-set-variable'
|
|
]
|
|
# if config.h is present then we are building via Autotools
|
|
if os.path.isfile(os.path.join(srcpath, "config.h")):
|
|
compile_args.append('-DHAVE_CONFIG_H')
|
|
# explicit hack needed when building from sdist tarball
|
|
if h5_present:
|
|
compile_args.append('-DHAVE_HDF5')
|
|
|
|
# define C extension module
|
|
if h5_present:
|
|
pytrexio_module = Extension('pytrexio._pytrexio',
|
|
sources = [os.path.join(srcpath, code) for code in c_files],
|
|
include_dirs = [h5_cflags, srcpath, numpy_includedir],
|
|
libraries = ['hdf5' ],
|
|
extra_compile_args = compile_args,
|
|
extra_link_args = [h5_ldflags]
|
|
)
|
|
else:
|
|
pytrexio_module = Extension('pytrexio._pytrexio',
|
|
sources = [os.path.join(srcpath, code) for code in c_files],
|
|
include_dirs = [srcpath, numpy_includedir],
|
|
extra_compile_args = compile_args
|
|
)
|
|
|
|
|
|
setup(name = 'trexio',
|
|
version = version_r,
|
|
author = "TREX-CoE",
|
|
author_email = "posenitskiy@irsamc.ups-tlse.fr",
|
|
description = """Python API of the TREXIO library""",
|
|
long_description = long_description,
|
|
long_description_content_type = "text/markdown",
|
|
ext_modules = [pytrexio_module],
|
|
py_modules = ['trexio'],
|
|
packages = ['pytrexio'],
|
|
url = 'https://github.com/TREX-CoE/trexio',
|
|
license = 'BSD',
|
|
classifiers=[
|
|
"Intended Audience :: Science/Research",
|
|
"Intended Audience :: Developers",
|
|
"Topic :: Scientific/Engineering",
|
|
"Programming Language :: C",
|
|
"Programming Language :: Python",
|
|
"Programming Language :: Python :: 3",
|
|
"Programming Language :: Python :: 3 :: Only",
|
|
"Programming Language :: Python :: Implementation :: CPython",
|
|
"License :: OSI Approved :: BSD License",
|
|
"Operating System :: POSIX",
|
|
"Operating System :: Unix",
|
|
"Operating System :: MacOS"
|
|
],
|
|
python_requires = ">=3.6",
|
|
install_requires = ['numpy>=1.17.3']
|
|
)
|