xref: /libCEED/setup.py (revision ee05e7903eee0d52eb5884b49005c2a7f1eebf85)
1*ee05e790Sjeremylt# Copyright (c) 2017, Lawrence Livermore National Security, LLC. Produced at
2*ee05e790Sjeremylt# the Lawrence Livermore National Laboratory. LLNL-CODE-734707. All Rights
3*ee05e790Sjeremylt# reserved. See files LICENSE and NOTICE for details.
4*ee05e790Sjeremylt#
5*ee05e790Sjeremylt# This file is part of CEED, a collection of benchmarks, miniapps, software
6*ee05e790Sjeremylt# libraries and APIs for efficient high-order finite element and spectral
7*ee05e790Sjeremylt# element discretizations for exascale applications. For more information and
8*ee05e790Sjeremylt# source code availability see http://github.com/ceed.
9*ee05e790Sjeremylt#
10*ee05e790Sjeremylt# The CEED research is supported by the Exascale Computing Project 17-SC-20-SC,
11*ee05e790Sjeremylt# a collaborative effort of two U.S. Department of Energy organizations (Office
12*ee05e790Sjeremylt# of Science and the National Nuclear Security Administration) responsible for
13*ee05e790Sjeremylt# the planning and preparation of a capable exascale ecosystem, including
14*ee05e790Sjeremylt# software, applications, hardware, advanced system engineering and early
15*ee05e790Sjeremylt# testbed platforms, in support of the nation"s exascale computing imperative.
16*ee05e790Sjeremylt# pylint: disable=no-name-in-module,import-error,unused-variable
17*ee05e790Sjeremyltimport os
18*ee05e790Sjeremyltimport sys
19*ee05e790Sjeremyltimport subprocess
20*ee05e790Sjeremyltfrom setuptools import setup
21*ee05e790Sjeremylt
22*ee05e790Sjeremylt# ------------------------------------------------------------------------------
23*ee05e790Sjeremylt# Setup
24*ee05e790Sjeremylt# ------------------------------------------------------------------------------
25*ee05e790Sjeremyltdef version():
26*ee05e790Sjeremylt  with open(os.path.abspath("ceed.pc.template")) as template:
27*ee05e790Sjeremylt    ceed_version = [line.split("Version:", 1)[1].strip() for line in template if
28*ee05e790Sjeremylt                    line.startswith("Version: ")]
29*ee05e790Sjeremylt  return ceed_version[0]
30*ee05e790Sjeremylt
31*ee05e790Sjeremyltdescription = """
32*ee05e790SjeremyltlibCEED: the Code for Efficient Extensible Discretization API Library
33*ee05e790Sjeremylt=====================================================================
34*ee05e790Sjeremylt
35*ee05e790SjeremyltThis low-level API library provides the efficient high-order discretization
36*ee05e790Sjeremyltmethods developed by the ECP co-design Center for Efficient Exascale
37*ee05e790SjeremyltDiscretizations (CEED). While our focus is on high-order finite elements, the
38*ee05e790Sjeremyltapproach is mostly algebraic and thus applicable to other discretizations in
39*ee05e790Sjeremyltfactored form, as explained in the API documentation.
40*ee05e790Sjeremylt
41*ee05e790SjeremyltOne of the challenges with high-order methods is that a global sparse matrix is
42*ee05e790Sjeremyltno longer a good representation of a high-order linear operator, both with
43*ee05e790Sjeremyltrespect to the FLOPs needed for its evaluation, as well as the memory transfer
44*ee05e790Sjeremyltneeded for a matvec.  Thus, high-order methods require a new "format" that still
45*ee05e790Sjeremyltrepresents a linear (or more generally non-linear) operator, but not through a
46*ee05e790Sjeremyltsparse matrix.
47*ee05e790Sjeremylt
48*ee05e790SjeremyltlibCEED is to provides such a format, as well as supporting implementations and
49*ee05e790Sjeremyltdata structures, that enable efficient operator evaluation on a variety of
50*ee05e790Sjeremyltcomputational device types (CPUs, GPUs, etc.). This new operator description is
51*ee05e790Sjeremyltalgebraic and easy to incorporate in a wide variety of applications, without
52*ee05e790Sjeremyltsignificant refactoring of their own discretization infrastructure.
53*ee05e790Sjeremylt"""
54*ee05e790Sjeremylt
55*ee05e790Sjeremyltclassifiers = """
56*ee05e790SjeremyltIntended Audience :: Developers
57*ee05e790SjeremyltIntended Audience :: Science/Research
58*ee05e790SjeremyltLicense :: OSI Approved :: BSD License
59*ee05e790SjeremyltOperating System :: POSIX
60*ee05e790SjeremyltProgramming Language :: C
61*ee05e790SjeremyltProgramming Language :: C++
62*ee05e790SjeremyltProgramming Language :: CUDA
63*ee05e790SjeremyltProgramming Language :: Fortran
64*ee05e790SjeremyltProgramming Language :: Python
65*ee05e790SjeremyltTopic :: Scientific/Engineering
66*ee05e790SjeremyltTopic :: Software Development :: Libraries
67*ee05e790Sjeremylt"""
68*ee05e790Sjeremylt
69*ee05e790Sjeremyltfrom distutils.errors import LibError
70*ee05e790Sjeremyltfrom distutils.command.build import build as _build
71*ee05e790Sjeremylt
72*ee05e790Sjeremyltif sys.platform == "darwin":
73*ee05e790Sjeremylt    library_file = "libceed.dylib"
74*ee05e790Sjeremyltelse:
75*ee05e790Sjeremylt    library_file = "libceed.so"
76*ee05e790Sjeremylt
77*ee05e790Sjeremyltdef _build_libceed():
78*ee05e790Sjeremylt    try:
79*ee05e790Sjeremylt        import cffi
80*ee05e790Sjeremylt        import numpy
81*ee05e790Sjeremylt    except ImportError:
82*ee05e790Sjeremylt        raise LibError("You must install cffi and numpy before building libceed")
83*ee05e790Sjeremylt
84*ee05e790Sjeremylt    env = os.environ.copy()
85*ee05e790Sjeremylt    if subprocess.call(["make", "lib"], env=env) != 0:
86*ee05e790Sjeremylt        raise LibError("Unable to build libceed")
87*ee05e790Sjeremylt
88*ee05e790Sjeremyltclass build(_build):
89*ee05e790Sjeremylt    def run(self, *args):
90*ee05e790Sjeremylt        self.execute(_build_libceed, (), msg="Building libceed")
91*ee05e790Sjeremylt        _build.run(self, *args)
92*ee05e790Sjeremylt
93*ee05e790Sjeremyltcmdclass = {
94*ee05e790Sjeremylt    "build": build,
95*ee05e790Sjeremylt}
96*ee05e790Sjeremylt
97*ee05e790Sjeremylttry:
98*ee05e790Sjeremylt    from setuptools.command.develop import develop as _develop
99*ee05e790Sjeremylt    class develop(_develop):
100*ee05e790Sjeremylt        def run(self, *args):
101*ee05e790Sjeremylt            self.execute(_build_libceed, (), msg="Building libceed")
102*ee05e790Sjeremylt            _develop.run(self, *args)
103*ee05e790Sjeremylt
104*ee05e790Sjeremylt    cmdclass["develop"] = develop
105*ee05e790Sjeremyltexcept ImportError:
106*ee05e790Sjeremylt    pass
107*ee05e790Sjeremylt
108*ee05e790Sjeremyltif "bdist_wheel" in sys.argv:
109*ee05e790Sjeremylt    sys.stderr.write("libceed cannot be built as a wheel\n")
110*ee05e790Sjeremylt    sys.exit(1)
111*ee05e790Sjeremylt
112*ee05e790Sjeremyltsetup(name="libceed",
113*ee05e790Sjeremylt      version=version(),
114*ee05e790Sjeremylt      description="libceed python bindings",
115*ee05e790Sjeremylt      long_description="\n".join(description),
116*ee05e790Sjeremylt      classifiers= classifiers.split("\n")[1:-1],
117*ee05e790Sjeremylt      keywords=["libCEED"],
118*ee05e790Sjeremylt      platforms=["POSIX"],
119*ee05e790Sjeremylt      license="BSD 2",
120*ee05e790Sjeremylt
121*ee05e790Sjeremylt      url="https://github.com/CEED/libCEED",
122*ee05e790Sjeremylt
123*ee05e790Sjeremylt      author="libCEED Team",
124*ee05e790Sjeremylt      author_email="ceed-users@llnl.gov",
125*ee05e790Sjeremylt
126*ee05e790Sjeremylt      requires=["numpy"],
127*ee05e790Sjeremylt      packages=["libceed"],
128*ee05e790Sjeremylt      package_dir={"libceed": "python"},
129*ee05e790Sjeremylt
130*ee05e790Sjeremylt      setup_requires=["cffi"],
131*ee05e790Sjeremylt      cffi_modules=["python/build_ceed_cffi.py:ffibuilder"],
132*ee05e790Sjeremylt
133*ee05e790Sjeremylt      cmdclass=cmdclass,
134*ee05e790Sjeremylt)
135*ee05e790Sjeremylt
136*ee05e790Sjeremylt# ------------------------------------------------------------------------------
137