phono3py/setup.py

206 lines
5.5 KiB
Python

"""Phono3py setup.py."""
import os
import numpy
import setuptools
# Ensure that 'site.cfg' exists.
if not os.path.exists("site.cfg"):
msg_list = [
'"site.cfg" file is needed to run setup.py.',
"See about installation at https://phonopy.github.io/phono3py/install.html.",
"A minimum setting of site.cfg to build with openmp support is:",
"# ------------------------------",
"[phono3py]",
"extra_compile_args = -fopenmp",
"# ------------------------------",
"Please create an emply site.cfg (no-openmp support) to run setup.py",
"unless any custom setting is needed, although this is considered unusual.",
]
raise FileNotFoundError("\n".join(msg_list))
# Retrieve the default flags from the numpy installation
# This also means one can override this with a site.cfg
# configuration file
from numpy.distutils.system_info import dict_append, get_info, system_info
git_num = None
# use flags defined in numpy
all_info_d = get_info("ALL")
lapack_info_d = get_info("lapack_opt")
class phono3py_info(system_info):
"""See system_info in numpy."""
section = "phono3py"
def calc_info(self):
"""Read in *all* options in the [phono3py] section of site.cfg."""
info = self.calc_libraries_info()
dict_append(info, **self.calc_extra_info())
dict_append(info, include_dirs=self.get_include_dirs())
self.set_info(**info)
macros = []
# in numpy>=1.16.0, silence build warnings about deprecated API usage
macros.append(("NPY_NO_DEPRECATED_API", "0"))
# Avoid divergence in tetrahedron method by ensuring denominator > 1e-10.
# macros.append(("THM_EPSILON", "1e-10"))
with_threaded_blas = False
with_mkl = False
# define options
# these are the basic definitions for all extensions
opts = lapack_info_d.copy()
if "mkl" in opts.get("libraries", ""):
with_mkl = True
if with_mkl:
with_threaded_blas = True
# generally this should not be needed since the numpy distutils
# finding of MKL creates the SCIPY_MKL_H flag
macros.append(("MKL_LAPACKE", None))
if with_threaded_blas:
macros.append(("MULTITHREADED_BLAS", None))
# Create the dictionary for compiling the codes
dict_append(opts, **all_info_d)
dict_append(opts, include_dirs=["c"])
dict_append(opts, define_macros=macros)
# Add numpy's headers
include_dirs = numpy.get_include()
if include_dirs is not None:
dict_append(opts, include_dirs=[include_dirs])
# Add any phono3py manual flags from here
add_opts = phono3py_info().get_info()
dict_append(opts, **add_opts)
# Different extensions
extensions = []
# Define the modules
sources_phono3py = [
"c/_phono3py.c",
"c/bzgrid.c",
"c/collision_matrix.c",
"c/fc3.c",
"c/grgrid.c",
"c/imag_self_energy_with_g.c",
"c/interaction.c",
"c/isotope.c",
"c/lagrid.c",
"c/lapack_wrapper.c",
"c/phono3py.c",
"c/phonoc_utils.c",
"c/pp_collision.c",
"c/real_self_energy.c",
"c/real_to_reciprocal.c",
"c/reciprocal_to_normal.c",
"c/snf3x3.c",
"c/tetrahedron_method.c",
"c/triplet.c",
"c/triplet_grid.c",
"c/triplet_iw.c",
]
extensions.append(
setuptools.Extension("phono3py._phono3py", sources=sources_phono3py, **opts)
)
sources_phononmod = [
"c/_phononmod.c",
"c/dynmat.c",
"c/lapack_wrapper.c",
"c/phonon.c",
"c/phononmod.c",
]
extensions.append(
setuptools.Extension("phono3py._phononmod", sources=sources_phononmod, **opts)
)
sources_lapackepy = ["c/_lapackepy.c", "c/lapack_wrapper.c"]
extensions.append(
setuptools.Extension("phono3py._lapackepy", sources=sources_lapackepy, **opts)
)
packages_phono3py = [
"phono3py",
"phono3py.cui",
"phono3py.interface",
"phono3py.other",
"phono3py.phonon",
"phono3py.phonon3",
"phono3py.sscha",
]
scripts_phono3py = [
"scripts/phono3py",
"scripts/phono3py-load",
"scripts/phono3py-kaccum",
"scripts/phono3py-kdeplot",
"scripts/phono3py-coleigplot",
]
if __name__ == "__main__":
version_nums = [None, None, None]
with open("phono3py/version.py") as w:
for line in w:
if "__version__" in line:
for i, num in enumerate(line.split()[2].strip('"').split(".")):
version_nums[i] = num
break
# To deploy to pypi by travis-CI
if os.path.isfile("__nanoversion__.txt"):
nanoversion = 0
with open("__nanoversion__.txt") as nv:
try:
for line in nv:
nanoversion = int(line.strip())
break
except ValueError:
nanoversion = 0
if nanoversion != 0:
version_nums.append(nanoversion)
elif git_num:
version_nums.append(git_num)
if None in version_nums:
print("Failed to get version number in setup.py.")
raise
version = ".".join(["%s" % n for n in version_nums[:3]])
if len(version_nums) > 3:
version += "-%s" % version_nums[3]
setuptools.setup(
name="phono3py",
version=version,
description="This is the phono3py module.",
author="Atsushi Togo",
author_email="atz.togo@gmail.com",
url="http://phonopy.github.io/phono3py/",
packages=packages_phono3py,
python_requires=">=3.7",
install_requires=[
"numpy>=1.15.0",
"scipy",
"PyYAML",
"matplotlib>=2.2.2",
"h5py",
"spglib",
"phonopy>=2.13,<2.14",
],
provides=["phono3py"],
scripts=scripts_phono3py,
ext_modules=extensions,
)