"""distutils.extensionProvides the Extension class, used to describe C/C++ extensionmodules in setup scripts."""import osimport warnings# This class is really only used by the "build_ext" command, so it might# make sense to put it in distutils.command.build_ext. However, that# module is already big enough, and I want to make this class a bit more# complex to simplify some common cases ("foo" module in "foo.c") and do# better error-checking ("foo.c" actually exists).## Also, putting this in build_ext.py means every setup script would have to# import that large-ish module (indirectly, through distutils.core) in# order to do anything.class Extension:"""Just a collection of attributes that describes an extensionmodule and everything needed to build it (hopefully in a portableway, but there are hooks that let you be as unportable as you need).Instance attributes:name : stringthe full name of the extension, including any packages -- ie.*not* a filename or pathname, but Python dotted namesources : [string]list of source filenames, relative to the distribution root(where the setup script lives), in Unix form (slash-separated)for portability. Source files may be C, C++, SWIG (.i),platform-specific resource files, or whatever else is recognizedby the "build_ext" command as source for a Python extension.include_dirs : [string]list of directories to search for C/C++ header files (in Unixform for portability)define_macros : [(name : string, value : string|None)]list of macros to define; each macro is defined using a 2-tuple,where 'value' is either the string to define it to or None todefine it without a particular value (equivalent of "#defineFOO" in source or -DFOO on Unix C compiler command line)undef_macros : [string]list of macros to undefine explicitlylibrary_dirs : [string]list of directories to search for C/C++ libraries at link timelibraries : [string]list of library names (not filenames or paths) to link againstruntime_library_dirs : [string]list of directories to search for C/C++ libraries at run time(for shared extensions, this is when the extension is loaded)extra_objects : [string]list of extra files to link with (eg. object files not impliedby 'sources', static library that must be explicitly specified,binary resource files, etc.)extra_compile_args : [string]any extra platform- and compiler-specific information to usewhen compiling the source files in 'sources'. For platforms andcompilers where "command line" makes sense, this is typically alist of command-line arguments, but for other platforms it couldbe anything.extra_link_args : [string]any extra platform- and compiler-specific information to usewhen linking object files together to create the extension (orto create a new static Python interpreter). Similarinterpretation as for 'extra_compile_args'.export_symbols : [string]list of symbols to be exported from a shared extension. Notused on all platforms, and not generally necessary for Pythonextensions, which typically export exactly one symbol: "init" +extension_name.swig_opts : [string]any extra options to pass to SWIG if a source file has the .iextension.depends : [string]list of files that the extension depends onlanguage : stringextension language (i.e. "c", "c++", "objc"). Will be detectedfrom the source extensions if not provided.optional : booleanspecifies that a build failure in the extension should not abort thebuild process, but simply not install the failing extension."""# When adding arguments to this constructor, be sure to update# setup_keywords in core.py.def __init__(self, name, sources,include_dirs=None,define_macros=None,undef_macros=None,library_dirs=None,libraries=None,runtime_library_dirs=None,extra_objects=None,extra_compile_args=None,extra_link_args=None,export_symbols=None,swig_opts = None,depends=None,language=None,optional=None,**kw # To catch unknown keywords):if not isinstance(name, str):raise AssertionError("'name' must be a string")if not (isinstance(sources, list) andall(isinstance(v, str) for v in sources)):raise AssertionError("'sources' must be a list of strings")self.name = nameself.sources = sourcesself.include_dirs = include_dirs or []self.define_macros = define_macros or []self.undef_macros = undef_macros or []self.library_dirs = library_dirs or []self.libraries = libraries or []self.runtime_library_dirs = runtime_library_dirs or []self.extra_objects = extra_objects or []self.extra_compile_args = extra_compile_args or []self.extra_link_args = extra_link_args or []self.export_symbols = export_symbols or []self.swig_opts = swig_opts or []self.depends = depends or []self.language = languageself.optional = optional# If there are unknown keyword options, warn about themif len(kw) > 0:options = [repr(option) for option in kw]options = ', '.join(sorted(options))msg = "Unknown Extension options: %s" % optionswarnings.warn(msg)def __repr__(self):return '<%s.%s(%r) at %#x>' % (self.__class__.__module__,self.__class__.__qualname__,self.name,id(self))def read_setup_file(filename):"""Reads a Setup file and returns Extension instances."""from distutils.sysconfig import (parse_makefile, expand_makefile_vars,_variable_rx)from distutils.text_file import TextFilefrom distutils.util import split_quoted# First pass over the file to gather "VAR = VALUE" assignments.vars = parse_makefile(filename)# Second pass to gobble up the real content: lines of the form# <module> ... [<sourcefile> ...] [<cpparg> ...] [<library> ...]file = TextFile(filename,strip_comments=1, skip_blanks=1, join_lines=1,lstrip_ws=1, rstrip_ws=1)try:extensions = []while True:line = file.readline()if line is None: # eofbreakif _variable_rx.match(line): # VAR=VALUE, handled in first passcontinueif line[0] == line[-1] == "*":file.warn("'%s' lines not handled yet" % line)continueline = expand_makefile_vars(line, vars)words = split_quoted(line)# NB. this parses a slightly different syntax than the old# makesetup script: here, there must be exactly one extension per# line, and it must be the first word of the line. I have no idea# why the old syntax supported multiple extensions per line, as# they all wind up being the same.module = words[0]ext = Extension(module, [])append_next_word = Nonefor word in words[1:]:if append_next_word is not None:append_next_word.append(word)append_next_word = Nonecontinuesuffix = os.path.splitext(word)[1]switch = word[0:2] ; value = word[2:]if suffix in (".c", ".cc", ".cpp", ".cxx", ".c++", ".m", ".mm"):# hmm, should we do something about C vs. C++ sources?# or leave it up to the CCompiler implementation to# worry about?ext.sources.append(word)elif switch == "-I":ext.include_dirs.append(value)elif switch == "-D":equals = value.find("=")if equals == -1: # bare "-DFOO" -- no valueext.define_macros.append((value, None))else: # "-DFOO=blah"ext.define_macros.append((value[0:equals],value[equals+2:]))elif switch == "-U":ext.undef_macros.append(value)elif switch == "-C": # only here 'cause makesetup has it!ext.extra_compile_args.append(word)elif switch == "-l":ext.libraries.append(value)elif switch == "-L":ext.library_dirs.append(value)elif switch == "-R":ext.runtime_library_dirs.append(value)elif word == "-rpath":append_next_word = ext.runtime_library_dirselif word == "-Xlinker":append_next_word = ext.extra_link_argselif word == "-Xcompiler":append_next_word = ext.extra_compile_argselif switch == "-u":ext.extra_link_args.append(word)if not value:append_next_word = ext.extra_link_argselif suffix in (".a", ".so", ".sl", ".o", ".dylib"):# NB. a really faithful emulation of makesetup would# append a .o file to extra_objects only if it# had a slash in it; otherwise, it would s/.o/.c/# and append it to sources. Hmmmm.ext.extra_objects.append(word)else:file.warn("unrecognized argument '%s'" % word)extensions.append(ext)finally:file.close()return extensions
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。