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