1#######################################################################
2## Copyright (C) 2008-2020 by Carnegie Mellon University.
3##
4## @OPENSOURCE_LICENSE_START@
5## See license information in ../LICENSE.txt
6## @OPENSOURCE_LICENSE_END@
7##
8#######################################################################
9
10#######################################################################
11# $SiLK: silk-python-info.py ef14e54179be 2020-04-14 21:57:45Z mthomas $
12#######################################################################
13
14import sys
15import os
16import re
17from distutils import sysconfig
18
19
20if len(sys.argv) > 1 and sys.argv[1] in ("--check-version", "--print-version"):
21    # See if we are python version >= 2.4 and < 4.0
22    version_ok = (0x020400f0 <= sys.hexversion < 0x04000000)
23    if sys.argv[1] == "--print-version":
24        sys.stdout.write("%d.%d.%d\n" % sys.version_info[0:3])
25    if version_ok:
26        sys.exit(0)
27    else:
28        sys.exit(1)
29
30if len(sys.argv) == 1 or sys.argv[1] != "--filename":
31    sys.exit("Usage: %s {--check-version | --print-version | --filename FILENAME}" %
32             sys.argv[0])
33
34outfile = sys.argv[2]
35python_prefix = os.getenv('PYTHONPREFIX')
36python_site = os.getenv('PYTHONSITEDIR')
37python_default_site = ""
38version = ""
39package_dest = ""
40error_string = ""
41include_dir = ""
42ldflags = ""
43cppflags = ""
44libdir = ""
45libname = ""
46ldflags_embedded = ""
47pthread_option = ""
48pthread_embedded_option = ""
49so_extension = ""
50
51
52try:
53    version = "%d.%d.%d" % sys.version_info[0:3]
54
55    # Stash the config vars
56    config_vars = sysconfig.get_config_vars()
57
58    # remove any space between a -L and a directory (for libtool)
59    for k,v in config_vars.items():
60        try:
61            config_vars[k] = re.sub(r'-L +/', r'-L/', v)
62        except:
63            config_vars[k] = v
64
65    # Where should we install packages?
66    python_default_site = sysconfig.get_python_lib(True,False)
67    if python_site:
68        package_dest = python_site
69    else:
70        if not python_prefix:
71            package_dest = python_default_site
72        elif python_default_site != sysconfig.get_python_lib(True,False,"BOGUS"):
73            # prefix argument works
74            package_dest = sysconfig.get_python_lib(True,False,python_prefix)
75        else:
76            # prefix argument does not work (Mac OS-X, some versions)
77            error_string = "--with-python-prefix is broken on this version of Python.  Please use --with-python-site-dir instead."
78
79    # Python include path
80    include_dir = sysconfig.get_python_inc()
81
82    # Python shared library extension
83    so_extension = config_vars['SO']
84
85    # Python library
86    library = config_vars['LIBRARY']
87    if not library:
88        library = config_vars['LDLIBRARY']
89
90    # Figure out the shortname of the library
91    if library:
92        library_nosuffix = (os.path.splitext(library))[0]
93        libname = re.sub(r"^lib", "", library_nosuffix)
94
95    # Python library location
96    if library_nosuffix:
97        # Cygwin puts library into BINDIR
98        for var in ['LIBDIR', 'BINDIR']:
99            path = config_vars[var]
100            if path and os.path.isdir(path):
101                if [item for item in os.listdir(path)
102                    if re.match(library_nosuffix, item)
103                       and not re.search(r"\.a$", item)]:
104                    libdir = path
105                    break
106
107    # Needed for linking embedded python
108    enable_shared = config_vars['Py_ENABLE_SHARED']
109    linkforshared = config_vars['LINKFORSHARED']
110    #localmodlibs = config_vars['LOCALMODLIBS']
111    #basemodlibs = config_vars['BASEMODLIBS']
112    more_ldflags = config_vars['LDFLAGS']
113    python_framework = config_vars['PYTHONFRAMEWORK']
114    libpl = config_vars['LIBPL']
115    libs = config_vars['LIBS']
116    syslibs = config_vars['SYSLIBS']
117
118    # remove hardening spec from LDFLAGS on Fedora
119    more_ldflags = re.sub(r'-specs=/usr/lib/rpm/redhat/redhat-hardened-ld', '',
120                          more_ldflags)
121
122    ldflags_embedded = ' '.join([more_ldflags, #linkforshared,
123                                 #basemodlibs, localmodlibs,
124                                 libs, syslibs]).strip(' ')
125    if not enable_shared and libpl:
126        ldflags_embedded = '-L' + libpl + ' ' + ldflags_embedded
127    if not python_framework and linkforshared:
128        ldflags_embedded = ldflags_embedded + ' ' + linkforshared
129
130    ### Build the output flags
131    if include_dir:
132        cppflags = "-I" + include_dir
133
134    #if more_ldflags:
135    #    ldflags = more_ldflags
136
137    if libdir:
138        ldflags += " -L" + libdir
139
140    if libname:
141        ldflags += " -l" + libname
142
143    ldflags_embedded = ldflags + " " + ldflags_embedded
144
145    # Hack for pthread support
146    split_ldflags = ldflags.split()
147    split_ldflags_embedded = ldflags_embedded.split()
148    thread_flags = ['-lpthread', '-pthread']
149
150    in_ldflags = [x for x in (split_ldflags + config_vars['CC'].split())
151                  if x in thread_flags]
152    if in_ldflags:
153        pthread_option = thread_flags['-lpthread' not in in_ldflags]
154
155    in_ldflags_embedded = [x for x in
156                           (split_ldflags_embedded + config_vars['CC'].split())
157                           if x in thread_flags]
158    if in_ldflags_embedded:
159        pthread_embedded_option = thread_flags['-lpthread' not in
160                                               in_ldflags_embedded]
161
162    if pthread_option:
163        split_ldflags = [x for x in split_ldflags
164                         if x not in thread_flags]
165        ldflags = ' '.join(split_ldflags)
166
167
168    if pthread_embedded_option:
169        split_ldflags_embedded = [x for x in split_ldflags_embedded
170                                  if x not in thread_flags]
171        ldflags_embedded = ' '.join(split_ldflags_embedded)
172
173    if (pthread_option and pthread_embedded_option and
174        (pthread_option == '-lpthread' or
175         pthread_embedded_option == '-lpthread')):
176        pthread_option = '-lpthread'
177        pthread_embedded_option = '-lpthread'
178
179except:
180    error_string = sys.exc_info()[1]
181    pass
182
183if outfile == "-":
184    out = sys.stdout
185else:
186    try:
187        if sys.hexversion < 0x03000000:
188            out = open(outfile, "w")
189        else:
190            out = open(outfile, "w", encoding="ascii")
191    except OSError:
192        sys.exit("error: Cannot create %s" % outfile)
193
194out.write("PYTHON_VERSION='%s'\n" % version)
195out.write("PYTHON_LIBDIR='%s'\n" % libdir)
196out.write("PYTHON_LIBNAME='%s'\n" % libname)
197out.write("PYTHON_SITE_PKG='%s'\n" % package_dest)
198out.write("PYTHON_DEFAULT_SITE_PKG='%s'\n" % python_default_site)
199out.write("PYTHON_SO_EXTENSION='%s'\n" % so_extension)
200out.write("PYTHON_CPPFLAGS='%s'\n" % cppflags)
201out.write("PYTHON_LDFLAGS='%s'\n" % ldflags)
202out.write("PYTHON_LDFLAGS_EMBEDDED='%s'\n" % ldflags_embedded)
203out.write("PYTHON_LDFLAGS_PTHREAD='%s'\n" % pthread_option)
204out.write("PYTHON_LDFLAGS_EMBEDDED_PTHREAD='%s'\n" %
205         pthread_embedded_option)
206out.write("PYTHON_ERROR='%s'\n" % error_string)
207out.close()
208