Example Python extension for Windows NT
=======================================

This directory contains everything needed (except for the Python
distribution!) to build a Python extension module using Microsoft VC++.
Notice that you need to use the same compiler version that was used to build 
Python itself.

The simplest way to build this example is to use the distutils script
'setup.py'.  To do this, simply execute:

  % python setup.py install

after everything builds and installs, you can test it:

  % python -c "import example; example.foo()"
  Hello, world

See setup.py for more details.  alternatively, see below for instructions on 
how to build inside the Visual Studio environment.

Visual Studio Build Instructions
================================

These are instructions how to build an extension using Visual C++.  The
instructions and project files have not been updated to the latest VC
version.  In general, it is recommended you use the 'setup.py' instructions
above.

It has been tested with VC++ 7.1 on Python 2.4.  You can also use earlier 
versions of VC to build Python extensions, but the sample VC project file 
(example.dsw in this directory) is in VC 7.1 format.

COPY THIS DIRECTORY!
--------------------
This "example_nt" directory is a subdirectory of the PC directory, in order
to keep all the PC-specific files under the same directory.  However, the
example_nt directory can't actually be used from this location.  You first
need to copy or move it up one level, so that example_nt is a direct
sibling of the PC\ and Include\ directories.  Do all your work from within
this new location -- sorry, but you'll be sorry if you don't.

OPEN THE PROJECT
----------------
From VC 7.1, use the
    File -> Open Solution...
dialog (*not* the "File -> Open..." dialog!).  Navigate to and select the
file "example.sln", in the *copy* of the example_nt directory you made
above.
Click Open.

BUILD THE EXAMPLE DLL
---------------------
In order to check that everything is set up right, try building:

1. Select a configuration.  This step is optional.  Do
       Build -> Configuration Manager... -> Active Solution Configuration
   and select either "Release" or "Debug".
   If you skip this step, you'll use the Debug configuration by default.

2. Build the DLL.  Do
       Build -> Build Solution
   This creates all intermediate and result files in a subdirectory which
   is called either Debug or Release, depending on which configuration you
   picked in the preceding step.

TESTING THE DEBUG-MODE DLL
--------------------------
Once the Debug build has succeeded, bring up a DOS box, and cd to
example_nt\Debug.  You should now be able to repeat the following session
("C>" is the DOS prompt, ">>>" is the Python prompt) (note that various
debug output from Python may not match this screen dump exactly):

    C>..\..\PCbuild\python_d
    Adding parser accelerators ...
    Done.
    Python 2.2c1+ (#28, Dec 14 2001, 18:06:39) [MSC 32 bit (Intel)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import example
    [7052 refs]
    >>> example.foo()
    Hello, world
    [7052 refs]
    >>>

TESTING THE RELEASE-MODE DLL
----------------------------
Once the Release build has succeeded, bring up a DOS box, and cd to
example_nt\Release.  You should now be able to repeat the following session
("C>" is the DOS prompt, ">>>" is the Python prompt):

    C>..\..\PCbuild\python
    Python 2.2c1+ (#28, Dec 14 2001, 18:06:04) [MSC 32 bit (Intel)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import example
    >>> example.foo()
    Hello, world
    >>>

Congratulations!  You've successfully built your first Python extension
module.

CREATING YOUR OWN PROJECT
-------------------------
Choose a name ("spam" is always a winner :-) and create a directory for
it.  Copy your C sources into it.  Note that the module source file name
does not necessarily have to match the module name, but the "init" function
name should match the module name -- i.e. you can only import a module
"spam" if its init function is called "initspam()", and it should call
Py_InitModule with the string "spam" as its first argument (use the minimal
example.c in this directory as a guide).  By convention, it lives in a file
called "spam.c" or "spammodule.c".  The output file should be called
"spam.dll" or "spam.pyd" (the latter is supported to avoid confusion with a
system library "spam.dll" to which your module could be a Python interface)
in Release mode, or spam_d.dll or spam_d.pyd in Debug mode.

Now your options are:

1) Copy example.sln and example.vcproj, rename them to spam.*, and edit them
by hand.

or

2) Create a brand new project; instructions are below.

In either case, copy example_nt\example.def to spam\spam.def, and edit the
new spam.def so its second line contains the string "initspam".  If you
created a new project yourself, add the file spam.def to the project now.
(This is an annoying little file with only two lines.  An alternative
approach is to forget about the .def file, and add the option
"/export:initspam" somewhere to the Link settings, by manually editing the
"Project -> Properties -> Linker -> Command Line -> Additional Options" 
box).

You are now all set to build your extension, unless it requires other
external libraries, include files, etc.  See Python's Extending and
Embedding manual for instructions on how to write an extension.


CREATING A BRAND NEW PROJECT
----------------------------
Use the
    File -> New -> Project...
dialog to create a new Project Workspace.  Select "Visual C++ Projects/Win32/
Win32 Project", enter the name ("spam"), and make sure the "Location" is 
set to parent of the spam directory you have created (which should be a direct 
subdirectory of the Python build tree, a sibling of Include and PC).  
In "Application Settings", select "DLL", and "Empty Project".  Click OK.

You should now create the file spam.def as instructed in the previous
section. Add the source files (including the .def file) to the project, 
using "Project", "Add Existing Item".

Now open the
    Project -> spam properties...
dialog.  (Impressive, isn't it? :-) You only need to change a few
settings.  Make sure "All Configurations" is selected from the "Settings
for:" dropdown list.  Select the "C/C++" tab.  Choose the "General"
category in the popup menu at the top.  Type the following text in the
entry box labeled "Addditional Include Directories:"

    ..\Include,..\PC

Then, choose the "General" category in the "Linker" tab, and enter
    ..\PCbuild
in the "Additional library Directories" box.

Now you need to add some mode-specific settings (select "Accept"
when asked to confirm your changes):

Select "Release" in the "Configuration" dropdown list.  Click the
"Link" tab, choose the "Input" Category, and append "python24.lib" to the
list in the "Additional Dependencies" box.

Select "Debug" in the "Settings for:" dropdown list, and append
"python24_d.lib" to the list in the Additional Dependencies" box.  Then
click on the C/C++ tab, select "Code Generation", and select 
"Multi-threaded Debug DLL" from the "Runtime library" dropdown list.

Select "Release" again from the "Settings for:" dropdown list.
Select "Multi-threaded DLL" from the "Use run-time library:" dropdown list.

That's all <wink>.
