summaryrefslogtreecommitdiff
path: root/PyGan/src/setup_cle2000.py
blob: c712b2676e9e43da3da1934ccb792f42bddd09c8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
#
# python3 setup_cle2000.py install --home=.
#
from sys import version_info
if version_info[0] == 3 and version_info[1] >= 12:
  from setuptools import setup, Extension
elif version_info[0] > 3:
  from setuptools import setup, Extension
else:
  from distutils.core import setup, Extension
import sysconfig

def _detect_gfortran_dir():
  import subprocess, os
  try:
    out = subprocess.check_output(['gfortran', '-print-file-name=libgfortran.dylib'], text=True).strip()
    if out and out != 'libgfortran.dylib':
      d = os.path.dirname(out)
      if os.path.isdir(d):
        return d
  except Exception:
    pass
  return None

def main():
  import os
  from sysconfig import get_config_var
  mach = os.path.basename(os.getcwd())
  Code = os.environ.get("CODE_EMBEDDED", None) # Code selection
  Compiler = os.environ.get("COMPILER", None) # Compiler selection
  FortranLib = _detect_gfortran_dir() # directory with libfortran
  HDF5Lib = os.environ.get("HDF5_API", None) # directory with libhdf5
  pylib = os.path.basename(get_config_var("LIBDIR")) # get lib or lib64
  print("install Cle2000 binding to", Code, "on directory",mach, "pylib=",pylib, "Compiler=",Compiler)
  if Compiler == "NVTOOLS":
    libdir="../../lib/"+mach+"_nvidia"
    libUtl="../../../Utilib/lib/"+mach+"_nvidia"
    libTri="../../../Trivac/lib/"+mach+"_nvidia"
    libDra="../../../Dragon/lib/"+mach+"_nvidia"
    libDon="../../../Donjon/lib/"+mach+"_nvidia"
    extralink=["-lnvcpumath","-lnvf","-lnvc"]
  elif Compiler == "LLVMTOOLS":
    libdir="../../lib/"+mach+"_llvm"
    libUtl="../../../Utilib/lib/"+mach+"_llvm"
    libTri="../../../Trivac/lib/"+mach+"_llvm"
    libDra="../../../Dragon/lib/"+mach+"_llvm"
    libDon="../../../Donjon/lib/"+mach+"_llvm"
    extralink=["-lFortranRuntime", "-lFortranDecimal", "-lclang_rt.osx"]
  elif Compiler == "INTELTOOLS":
    libdir="../../lib/"+mach+"_intel"
    libUtl="../../../Utilib/lib/"+mach+"_intel"
    libTri="../../../Trivac/lib/"+mach+"_intel"
    libDra="../../../Dragon/lib/"+mach+"_intel"
    libDon="../../../Donjon/lib/"+mach+"_intel"
    extralink=[ ]
  else:
    libdir="../../lib/"+mach
    libUtl="../../../Utilib/lib/"+mach
    libTri="../../../Trivac/lib/"+mach
    libDra="../../../Dragon/lib/"+mach
    libDon="../../../Donjon/lib/"+mach
    extralink=["-lgfortran", ]
  print("debug Compiler=",Compiler,"libdir=",libdir,"Code=",Code)
  if FortranLib:
    print("debug FortranLib=", FortranLib)
  if HDF5Lib:
    print("debug HDF5Lib=", HDF5Lib)

  # Build helper lists with None filtered out
  def _dirs(*args):
    return [d for d in args if d]

  if Code == "GANLIB":
    setup (name="Cle2000",
       version="5.0",
       description="Python bindings for Cle-2000 with GANLIB",
       author="Alain Hebert",
       author_email="alain.hebert@polymtl.ca",
       license="LGPL",
       ext_modules=[Extension('cle2000',sources=['cle2000module.c'],
                     extra_link_args = extralink,
                     include_dirs=["../../../Ganlib/src"],
                     library_dirs=_dirs(libdir,FortranLib,HDF5Lib),
                     runtime_library_dirs=_dirs(FortranLib,HDF5Lib),
                     libraries=["Ganlib","hdf5"] ) ])
  elif Code == "TRIVAC":
    setup (name="Cle2000",
       version="5.0",
       description="Python bindings for Cle-2000 with TRIVAC",
       author="Alain Hebert",
       author_email="alain.hebert@polymtl.ca",
       license="LGPL",
       ext_modules=[Extension('cle2000',sources=['cle2000module.c'],
                     define_macros=[('__trivac__', None)],
                     extra_link_args = extralink,
                     include_dirs=["../../../Ganlib/src"],
                     library_dirs=_dirs(libdir,FortranLib,HDF5Lib,libUtl,libTri),
                     runtime_library_dirs=_dirs(FortranLib,HDF5Lib),
                     libraries=["Trivac","Utilib","Ganlib","hdf5"] ) ])
  elif Code == "DRAGON":
    setup (name="Cle2000",
       version="5.0",
       description="Python bindings for Cle-2000 with DRAGON",
       author="Alain Hebert",
       author_email="alain.hebert@polymtl.ca",
       license="LGPL",
       ext_modules=[Extension('cle2000',sources=['cle2000module.c'],
                     define_macros=[('__dragon__', None)],
                     extra_link_args = extralink,
                     include_dirs=["../../../Ganlib/src"],
                     library_dirs=_dirs(libdir,FortranLib,HDF5Lib,libUtl,libTri,libDra),
                     runtime_library_dirs=_dirs(FortranLib,HDF5Lib),
                     libraries=["Dragon","Trivac","Utilib","Ganlib","hdf5"] ) ])
  elif Code == "DONJON":
    setup (name="Cle2000",
       version="5.0",
       description="Python bindings for Cle-2000 with DONJON",
       author="Alain Hebert",
       author_email="alain.hebert@polymtl.ca",
       license="LGPL",
       ext_modules=[Extension('cle2000',sources=['cle2000module.c'],
                     define_macros=[('__donjon__', None)],
                     extra_link_args = extralink,
                     include_dirs=["../../../Ganlib/src"],
                     library_dirs=_dirs(libdir,FortranLib,HDF5Lib,libUtl,libTri,libDra,libDon),
                     runtime_library_dirs=_dirs(FortranLib,HDF5Lib),
                     libraries=["Donjon","Dragon","Trivac","Utilib","Ganlib","hdf5"] ) ])
  elif Code == "GANLIB_OMP":
    setup (name="Cle2000",
       version="5.0",
       description="Python bindings for Cle-2000 with GANLIB_OMP",
       author="Alain Hebert",
       author_email="alain.hebert@polymtl.ca",
       license="LGPL",
       ext_modules=[Extension('cle2000',sources=['cle2000module.c'],
                     extra_link_args = ["-lgomp"]+extralink,
                     include_dirs=["../../../Ganlib/src"],
                     library_dirs=_dirs(libdir,FortranLib,HDF5Lib),
                     runtime_library_dirs=_dirs(FortranLib,HDF5Lib),
                     libraries=["Ganlib","hdf5"] ) ])
  elif Code == "TRIVAC_OMP":
    setup (name="Cle2000",
       version="5.0",
       description="Python bindings for Cle-2000 with TRIVAC_OMP",
       author="Alain Hebert",
       author_email="alain.hebert@polymtl.ca",
       license="LGPL",
       ext_modules=[Extension('cle2000',sources=['cle2000module.c'],
                     define_macros=[('__trivac__', None)],
                     extra_link_args = ["-lgomp"]+extralink,
                     include_dirs=["../../../Ganlib/src"],
                     library_dirs=_dirs(libdir,FortranLib,HDF5Lib,libUtl,libTri),
                     runtime_library_dirs=_dirs(FortranLib,HDF5Lib),
                     libraries=["Trivac","Utilib","Ganlib","hdf5"] ) ])
  elif Code == "DRAGON_OMP":
    setup (name="Cle2000",
       version="5.0",
       description="Python bindings for Cle-2000 with DRAGON_OMP",
       author="Alain Hebert",
       author_email="alain.hebert@polymtl.ca",
       license="LGPL",
       ext_modules=[Extension('cle2000',sources=['cle2000module.c'],
                     define_macros=[('__dragon__', None)],
                     extra_link_args = ["-lgomp"]+extralink,
                     include_dirs=["../../../Ganlib/src"],
                     library_dirs=_dirs(libdir,FortranLib,HDF5Lib,libUtl,libTri,libDra),
                     runtime_library_dirs=_dirs(FortranLib,HDF5Lib),
                     libraries=["Dragon","Trivac","Utilib","Ganlib","hdf5"] ) ])
  elif Code == "DONJON_OMP":
    setup (name="Cle2000",
       version="5.0",
       description="Python bindings for Cle-2000 with DONJON_OMP",
       author="Alain Hebert",
       author_email="alain.hebert@polymtl.ca",
       license="LGPL",
       ext_modules=[Extension('cle2000',sources=['cle2000module.c'],
                     define_macros=[('__donjon__', None)],
                     extra_link_args = ["-lgomp"]+extralink,
                     include_dirs=["../../../Ganlib/src"],
                     library_dirs=_dirs(libdir,FortranLib,HDF5Lib,libUtl,libTri,libDra,libDon),
                     runtime_library_dirs=_dirs(FortranLib,HDF5Lib),
                     libraries=["Donjon","Dragon","Trivac","Utilib","Ganlib","hdf5"] ) ])
  else:
    raise ValueError(Code+" is not implemented for setup.py bindings")
if __name__ == "__main__":
  main()