Home | History | Annotate | Download | only in python-yasm
      1 #! /usr/bin/env python
      2 # Build Python extension with configuration file input
      3 #
      4 #  Copyright (C) 2006  Peter Johnson
      5 #
      6 # Redistribution and use in source and binary forms, with or without
      7 # modification, are permitted provided that the following conditions
      8 # are met:
      9 # 1. Redistributions of source code must retain the above copyright
     10 #    notice, this list of conditions and the following disclaimer.
     11 # 2. Redistributions in binary form must reproduce the above copyright
     12 #    notice, this list of conditions and the following disclaimer in the
     13 #    documentation and/or other materials provided with the distribution.
     14 #
     15 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND OTHER CONTRIBUTORS ``AS IS''
     16 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     17 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     18 # ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE
     19 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     20 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     21 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     22 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     23 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     24 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     25 # POSSIBILITY OF SUCH DAMAGE.
     26 
     27 from distutils.core import setup
     28 from distutils.extension import Extension
     29 from Cython.Distutils import build_ext
     30 from os.path import basename, join, exists
     31 
     32 def ReadSetup(filename):
     33     """ReadSetup goes through filename and parses out the values stored
     34     in the file.  Values need to be stored in a
     35     \"key=value format\""""
     36     return dict(line.split('=', 1) for line in open(filename))
     37 
     38 def ParseCPPFlags(flags):
     39     """parse the CPPFlags macro"""
     40     incl_dir = [x[2:] for x in flags.split() if x.startswith("-I")]
     41     cppflags = [x for x in flags.split() if not x.startswith("-I")]
     42     cppflags.append("-DYASM_LIB_INTERNAL")
     43     cppflags.append("-DYASM_BC_INTERNAL")
     44     cppflags.append("-DYASM_EXPR_INTERNAL")
     45     return (incl_dir, cppflags)
     46 
     47 def ParseSources(src, srcdir):
     48     """parse the Sources macro"""
     49     # do the dance of detecting if the source file is in the current
     50     # directory, and if it's not, prepend srcdir
     51     sources = []
     52     for tok in src.split():
     53         if tok.endswith(".c"):
     54             fn = tok
     55         else:
     56             continue
     57         if not exists(fn):
     58             fn = join(srcdir, fn)
     59         sources.append(fn)
     60 
     61     return sources
     62 
     63 def RunSetup(incldir, cppflags, sources):
     64     setup(
     65           name='yasm',
     66           version='0.0',
     67           description='Python bindings for Yasm',
     68           author='Michael Urman, Peter Johnson',
     69           url='http://www.tortall.net/projects/yasm',
     70           ext_modules=[
     71                        Extension('yasm',
     72                                  sources=sources,
     73                                  extra_compile_args=cppflags,
     74                                  include_dirs=incldir,
     75                        ),
     76                       ],
     77           cmdclass = dict(build_ext=build_ext),
     78          )
     79 
     80 if __name__ == "__main__":
     81     opts = ReadSetup("python-setup.txt")
     82     incldir, cppflags = ParseCPPFlags(opts["includes"])
     83     sources = ParseSources(opts["sources"], opts["srcdir"].strip())
     84     sources.append('yasm_python.c')
     85     if opts["gcc"].strip() == "yes":
     86         cppflags.append('-w')
     87     RunSetup(incldir, cppflags, sources)
     88 
     89