1 2import os, string, re, sys 3 4# Check to see if the Egg system is installed (ie, setuptools) 5# See http://peak.telecommunity.com/DevCenter/PythonEggs 6USE_EGGS=1 7try: 8 from setuptools import setup 9except ImportError: 10 from distutils.core import setup 11 USE_EGGS=0 12 13from distutils.core import Extension 14from distutils import sysconfig 15 16VERSION = "0.10.5" 17INC_DIRS = ["../"] 18LIBRARIES = ["neo_cgi", "neo_cs", "neo_utl"] 19LIB_DIRS = ["../libs"] 20CC = "gcc" 21LDSHARED = "gcc -shared" 22 23## ARGGH!! It looks like you can only specify a single item on the 24## command-line or in the setup.cfg file for options which take multiple 25## lists... and it overrides what is defined here. So I have to do all 26## the work of the configure file AGAIN here. At least its in python, 27## which is easier... 28## Actually, forget that, I'm just going to load and parse the rules.mk 29## file and build what I need 30 31if not os.path.exists("../rules.mk"): 32 raise "You need to run configure first to generate the rules.mk file!" 33 34make_vars = { 'NEOTONIC_ROOT' : '..' } 35rules = open("../rules.mk").read() 36for line in string.split(rules, "\n"): 37 parts = string.split(line, '=', 1) 38 if len(parts) != 2: continue 39 var, val = parts 40 var = string.strip(var) 41 make_vars[var] = val 42 if var == "CFLAGS": 43 matches = re.findall("-I(\S+)", val) 44 inserted = [] 45 for inc_path in matches: 46 # inc_path = match.group(1) 47 if inc_path not in INC_DIRS: 48 inserted.append(inc_path) 49 sys.stderr.write("adding inc_path %s\n" % inc_path) 50 INC_DIRS = inserted + INC_DIRS 51 elif var == "LIBS": 52 matches = re.findall("-l(\S+)", val) 53 inserted = [] 54 for lib in matches: 55 # lib = match.group(1) 56 if lib not in LIBRARIES: 57 inserted.append(lib) 58 sys.stderr.write("adding lib %s\n" % lib) 59 LIBRARIES = inserted + LIBRARIES 60 elif var == "LDFLAGS": 61 matches = re.findall("-L(\S+)", val) 62 inserted = [] 63 for lib_path in matches: 64 # lib_path = match.group(1) 65 if lib_path not in LIB_DIRS: 66 inserted.append(lib_path) 67 sys.stderr.write("adding lib_path %s\n" % lib_path) 68 LIB_DIRS = inserted + LIB_DIRS 69 elif var == "CC": 70 CC = val 71 elif var == "LDSHARED": 72 LDSHARED = val 73 74 75def expand_var(var, vars): 76 def replace_var(m, variables=vars): 77 var = m.group(1) 78 if var[:2] == "$(" and var[-1] == ")": 79 var = variables.get(var[2:-1], "") 80 return var 81 while 1: 82 new_var = re.sub('(\$\([^\)]*\))', replace_var, var) 83 if new_var == var: break 84 var = new_var 85 return var.strip() 86 87def expand_vars(vlist, vars): 88 nlist = [] 89 for val in vlist: 90 val = expand_var(val, vars) 91 if val: nlist.append(val) 92 return nlist 93 94INC_DIRS = expand_vars(INC_DIRS, make_vars) 95LIB_DIRS = expand_vars(LIB_DIRS, make_vars) 96LIBRARIES = expand_vars(LIBRARIES, make_vars) 97 98CC = os.environ.get('CC', expand_var(CC, make_vars)) 99LDSHARED = os.environ.get('LDSHARED', expand_var(CC, make_vars)) 100 101# HACK! The setup/Makefile may not have the hermetic/cross-compiler entries 102# for the compiler that we need, so override them here! 103given_cc = sysconfig.get_config_var('CC') 104if given_cc != CC and given_cc[0] != '/': 105 sys.stderr.write("Overriding setup's CC from %s to %s\n" % (given_cc, CC)) 106 try: 107 sysconfig._config_vars['CC'] = CC 108 sysconfig._config_vars['LDSHARED'] = LDSHARED 109 except AttributeError: 110 pass 111 112setup_args = { 113 'name': "clearsilver", 114 'version': VERSION, 115 'description': "Python ClearSilver Wrapper", 116 'author': "Brandon Long", 117 'author_email': "blong@fiction.net", 118 'url': "http://www.clearsilver.net/", 119 'ext_modules': [Extension( 120 name="neo_cgi", 121 sources=["neo_cgi.c", "neo_cs.c", "neo_util.c"], 122 include_dirs=INC_DIRS, 123 library_dirs=LIB_DIRS, 124 libraries=LIBRARIES, 125 )] 126 } 127 128if USE_EGGS: 129 setup_args['zip_safe'] = 0 130 131apply(setup, [], setup_args) 132