aboutsummaryrefslogtreecommitdiff
path: root/tools/python-yasm/setup.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/python-yasm/setup.py')
-rw-r--r--tools/python-yasm/setup.py88
1 files changed, 88 insertions, 0 deletions
diff --git a/tools/python-yasm/setup.py b/tools/python-yasm/setup.py
new file mode 100644
index 0000000..d4ce2f4
--- /dev/null
+++ b/tools/python-yasm/setup.py
@@ -0,0 +1,88 @@
+#! /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 Cython.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
+ 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,
+ ),
+ ],
+ 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)
+