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