#! /usr/bin/env python # Build Python extension with configuration file input # # Copyright (C) 2006 Peter Johnson # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND OTHER CONTRIBUTORS ``AS IS'' # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. from distutils.core import setup from distutils.extension import Extension from Pyrex.Distutils import build_ext from os.path import basename, join, exists def ReadSetup(filename): """ReadSetup goes through filename and parses out the values stored in the file. Values need to be stored in a \"key=value format\"""" return dict(line.split('=', 1) for line in open(filename)) def ParseCPPFlags(flags): """parse the CPPFlags macro""" incl_dir = [x[2:] for x in flags.split() if x.startswith("-I")] cppflags = [x for x in flags.split() if not x.startswith("-I")] cppflags.append("-DYASM_LIB_INTERNAL") cppflags.append("-DYASM_BC_INTERNAL") cppflags.append("-DYASM_EXPR_INTERNAL") return (incl_dir, cppflags) def ParseSources(src, srcdir): """parse the Sources macro""" # do the dance of detecting if the source file is in the current # directory, and if it's not, prepend srcdir sources = [] for tok in src.split(): if tok.endswith(".c"): fn = tok elif tok.endswith(".y"): fn = basename(tok)[:-2] + ".c" else: continue if not exists(fn): fn = join(srcdir, fn) sources.append(fn) return sources def RunSetup(incldir, cppflags, sources): setup( name='yasm', version='0.0', description='Python bindings for Yasm', author='Michael Urman, Peter Johnson', url='http://www.tortall.net/projects/yasm', ext_modules=[ Extension('yasm', sources=sources, extra_compile_args=cppflags, include_dirs=incldir, library_dirs=['.'], libraries=['yasm'], ), ], cmdclass = dict(build_ext=build_ext), ) if __name__ == "__main__": opts = ReadSetup("python-setup.txt") incldir, cppflags = ParseCPPFlags(opts["includes"]) sources = ParseSources(opts["sources"], opts["srcdir"].strip()) sources.append('yasm_python.c') if opts["gcc"].strip() == "yes": cppflags.append('-w') RunSetup(incldir, cppflags, sources)