views:

47

answers:

1

I'm attempting to convert a C header into a Python library using ctypes and ctypeslib. I'm running Python 2.7, on OSX 10.6.4 (Snow Leopard).
The header-file I am converting is mcbcio32.h, located in /header/mcbcio32.h I wish to create an xml output in the same folder, named mcbcio32.xml.

I run h2xml.py (which converts the c header into an wrapped xml file) from the ctypeslib folder with the following command:

$ python h2xml.py /header/mcbcio32.h -o mcbcio32.xml -q -c

Output:

Traceback (most recent call last):
  File "h2xml.py", line 92, in <module>
    sys.exit(main())
  File "h2xml.py", line 86, in main
    compile_to_xml(argv)
  File "h2xml.py", line 79, in compile_to_xml
    parser.parse(files)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypeslib/codegen/cparser.py", line 306, in parse
    self.create_final_xml(include_files, types, None)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypeslib/codegen/cparser.py", line 265, in create_final_xml
    self.create_xml(source, xmlfile)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypeslib/codegen/cparser.py", line 97, in create_xml
    stdin=subprocess.PIPE)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 672, in __init__
    errread, errwrite)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 1201, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

From what I can tell, three main scripts are called upon, h2xml.py, cparser.py, and finally subprocess.py. All of these scripts are written by Python developers, and thus I'm guessing the error lies somewhere in how I run the issuing command.

h2xml.py Code:

"""h2xml - convert C include file(s) into an xml file by running gccxml."""
import sys, os, ConfigParser
from ctypeslib.codegen import cparser
from optparse import OptionParser

def compile_to_xml(argv):
    def add_option(option, opt, value, parser):
        parser.values.gccxml_options.extend((opt, value))

    # Hm, should there be a way to disable the config file?
    # And then, this should be done AFTER the parameters are processed.
    config = ConfigParser.ConfigParser()
    try:
        config.read("h2xml.cfg")
    except ConfigParser.ParsingError, detail:
        print >> sys.stderr, detail
        return 1

    parser = OptionParser("usage: %prog includefile ... [options]")
    parser.add_option("-q", "--quiet",
                      dest="quiet",
                      action="store_true",
                      default=False)

    parser.add_option("-D",
                      type="string",
                      action="callback",
                      callback=add_option,
                      dest="gccxml_options",
                      help="macros to define",
                      metavar="NAME[=VALUE]",
                      default=[])

    parser.add_option("-U",
                      type="string",
                      action="callback",
                      callback=add_option,
                      help="macros to undefine",
                      metavar="NAME")

    parser.add_option("-I",
                      type="string",
                      action="callback",
                      callback=add_option,
                      dest="gccxml_options",
                      help="additional include directories",
                      metavar="DIRECTORY")

    parser.add_option("-o",
                      dest="xmlfile",
                      help="XML output filename",
                      default=None)

    parser.add_option("-c", "--cpp-symbols",
                      dest="cpp_symbols",
                      action="store_true",
                      help="try to find #define symbols - this may give compiler errors, " \
                      "so it's off by default.",
                      default=False)

    parser.add_option("-k",
                      dest="keep_temporary_files",
                      action="store_true",
                      help="don't delete the temporary files created "\
                      "(useful for finding problems)",
                      default=False)

    options, files = parser.parse_args(argv[1:])

    if not files:
        print "Error: no files to process"
        print >> sys.stderr, __doc__
        return 1

    options.flags = options.gccxml_options
    options.verbose = not options.quiet

    parser = cparser.IncludeParser(options)
    parser.parse(files)

def main(argv=None):
    if argv is None:
        argv = sys.argv

    try:
        compile_to_xml(argv)
    except cparser.CompilerError, detail:
        print >> sys.stderr, "CompilerError:", detail
        return 1

if __name__ == "__main__":
    sys.exit(main())

I have GCC-XML installed, and the ctypeslib was pasted into: /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ (my local Python library path)

If any additional information would be useful, please let me know. Thanks in advance for any help.

A: 

The problem was with the installation of gcc-xml. Make sure when installing gcc-xml to also install the cmake function (cmake.org). Properly using cmake on the gcc install folder solved all the directory problems I was experiencing.

Robert