\section{\module{distutils.sysconfig} ---
         System configuration information}

\declaremodule{standard}{distutils.sysconfig}
\modulesynopsis{Low-level access to configuration information of the
                Python interpreter.}
\moduleauthor{Fred L. Drake, Jr.}{fdrake@acm.org}
\moduleauthor{Greg Ward}{gward@python.net}
\sectionauthor{Fred L. Drake, Jr.}{fdrake@acm.org}


The \module{distutils.sysconfig} module provides access to Python's
low-level configuration information.  The specific configuration
variables available depend heavily on the platform and configuration.
The specific variables depend on the build process for the specific
version of Python being run; the variables are those found in the
\file{Makefile} and configuration header that are installed with
Python on \UNIX{} systems.  The configuration header is called
\file{pyconfig.h} for Python versions starting with 2.2, and
\file{config.h} for earlier versions of Python.

Some additional functions are provided which perform some useful
manipulations for other parts of the \module{distutils} package.


\begin{datadesc}{PREFIX}
  The result of \code{os.path.normpath(sys.prefix)}.
\end{datadesc}

\begin{datadesc}{EXEC_PREFIX}
  The result of \code{os.path.normpath(sys.exec_prefix)}.
\end{datadesc}

\begin{funcdesc}{get_config_var}{name}
  Return the value of a single variable.  This is equivalent to
  \code{get_config_vars().get(\var{name})}.
\end{funcdesc}

\begin{funcdesc}{get_config_vars}{\moreargs}
  Return a set of variable definitions.  If there are no arguments,
  this returns a dictionary mapping names of configuration variables
  to values.  If arguments are provided, they should be strings, and
  the return value will be a sequence giving the associated values.
  If a given name does not have a corresponding value, \code{None}
  will be included for that variable.
\end{funcdesc}

\begin{funcdesc}{get_config_h_filename}{}
  Return the full path name of the configuration header.  For \UNIX,
  this will be the header generated by the \program{configure} script;
  for other platforms the header will have been supplied directly by
  the Python source distribution.  The file is a platform-specific
  text file.
\end{funcdesc}

\begin{funcdesc}{get_makefile_filename}{}
  Return the full path name of the \file{Makefile} used to build
  Python.  For \UNIX, this will be a file generated by the
  \program{configure} script; the meaning for other platforms will
  vary.  The file is a platform-specific text file, if it exists.
  This function is only useful on \POSIX{} platforms.
\end{funcdesc}

\begin{funcdesc}{get_python_inc}{\optional{plat_specific\optional{, prefix}}}
  Return the directory for either the general or platform-dependent C
  include files.  If \var{plat_specific} is true, the
  platform-dependent include directory is returned; if false or
  omitted, the platform-independent directory is returned.  If
  \var{prefix} is given, it is used as either the prefix instead of
  \constant{PREFIX}, or as the exec-prefix instead of
  \constant{EXEC_PREFIX} if \var{plat_specific} is true.
\end{funcdesc}

\begin{funcdesc}{get_python_lib}{\optional{plat_specific\optional{,
                                 standard_lib\optional{, prefix}}}}
  Return the directory for either the general or platform-dependent
  library installation.  If \var{plat_specific} is true, the
  platform-dependent include directory is returned; if false or
  omitted, the platform-independent directory is returned.  If
  \var{prefix} is given, it is used as either the prefix instead of
  \constant{PREFIX}, or as the exec-prefix instead of
  \constant{EXEC_PREFIX} if \var{plat_specific} is true.  If
  \var{standard_lib} is true, the directory for the standard library
  is returned rather than the directory for the installation of
  third-party extensions.
\end{funcdesc}


The following function is only intended for use within the
\module{distutils} package.

\begin{funcdesc}{customize_compiler}{compiler}
  Do any platform-specific customization of a
  \class{distutils.ccompiler.CCompiler} instance.

  This function is only needed on \UNIX{} at this time, but should be
  called consistently to support forward-compatibility.  It inserts
  the information that varies across \UNIX{} flavors and is stored in
  Python's \file{Makefile}.  This information includes the selected
  compiler, compiler and linker options, and the extension used by the
  linker for shared objects.
\end{funcdesc}


This function is even more special-purpose, and should only be used
from Python's own build procedures.

\begin{funcdesc}{set_python_build}{}
  Inform the \module{distutils.sysconfig} module that it is being used
  as part of the build process for Python.  This changes a lot of
  relative locations for files, allowing them to be located in the
  build area rather than in an installed Python.
\end{funcdesc}
