Differences between revisions 1 and 11 (spanning 10 versions)
Revision 1 as of 2013-10-05 18:19:02
Size: 80
Editor: NickHilton
Comment:
Revision 11 as of 2013-10-05 20:12:14
Size: 5464
Editor: NickHilton
Comment:
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
How to build Python 2.7.5 using Visual Studio 2012 Express on Windows 8 64-bit <<TableOfContents>>

= How to build Python 2.7.5 using Visual Studio 2012 Express on Windows 8 64-bit =

My goal with these instructions is to produce a DEBUG build on x86_64 (AMD64 or x64). I'm working on a Python extension that is currently crashing on Windows, but work fine in Linux. I will be building debug version of Numpy and Matplotlib after the DEBUG version of Python is created with these instructions.


== References: ==
[[VS2010]]

== Prepare Environment ==
1. Create a directory to store the Python source tree and dependencies, I called mine `python_build`.

2. Download Python 2.7.5 source from python.org and unzip it to `python_build`

3. Download and install an SVN command-line client (Try SlickSVN)

4. Download and install Perl64

5. Download and install Visual Studio Express 2012

=== Test Environment ===
1. Open a shell

2. Bring in the msvc compiler environment for x64 by doing:

 . {{{
call "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\vcvarsall.bat" x86_amd64
}}}
 Verify by typing 'cl.exe':
 {{{
Microsoft (R) C/C++ Optimizing Compiler Version 17.00.60610.1 for x64
}}}

3. Try running the svn client: 'svn --version':

 . {{{
svn, version 1.8.3-SlikSvn-1.8.3-X64 (SlikSvn/1.8.3) X64
   compiled Sep 4 2013, 16:04:02 on x86_64/x86-microsoft-windows6.1.7601

Copyright (C) 2013 The Apache Software Foundation.
}}}

4. Try running perl: 'perl --version'

 . {{{
This is perl 5, version 16, subversion 3 (v5.16.3) built for MSWin32-x64-multi-thread
}}}

== Download dependencies ==
Use the `buildbot` tools to grab the external dependencies:

 . {{{
cd Python2.7.5
Tools\buildbot\external-common.bat
}}}

== Patch External Dependencies ==
=== Tcl ===
 . {{{
diff -r -Z -U 2 tcl-8.5.2.1/generic/tclPosixStr.c /home/Nick/development/debug/tcl-8.5.2.1/generic/tclPosixStr.c
--- tcl-8.5.2.1/generic/tclPosixStr.c 2008-06-12 09:01:20.765751000 -0700
+++ /home/Nick/development/debug/tcl-8.5.2.1/generic/tclPosixStr.c 2013-10-05 09:09:22.967569100 -0700
@@ -345,5 +345,5 @@
 #endif
 #if defined(EPFNOSUPPORT) && (!defined(ENOLCK) || (ENOLCK != EPFNOSUPPORT))
- case EPFNOSUPPORT: return "EPFNOSUPPORT";
+ // case EPFNOSUPPORT: return "EPFNOSUPPORT";
 #endif
 #ifdef EPIPE
@@ -405,5 +405,5 @@
 #endif
 #ifdef ESOCKTNOSUPPORT
- case ESOCKTNOSUPPORT: return "ESOCKTNOSUPPORT";
+ // case ESOCKTNOSUPPORT: return "ESOCKTNOSUPPORT";
 #endif
 #ifdef ESPIPE
@@ -793,5 +793,5 @@
 #endif
 #if defined(EPFNOSUPPORT) && (!defined(ENOLCK) || (ENOLCK != EPFNOSUPPORT))
- case EPFNOSUPPORT: return "protocol family not supported";
+ // case EPFNOSUPPORT: return "protocol family not supported";
 #endif
 #ifdef EPIPE
@@ -853,5 +853,5 @@
 #endif
 #ifdef ESOCKTNOSUPPORT
- case ESOCKTNOSUPPORT: return "socket type not supported";
+ // case ESOCKTNOSUPPORT: return "socket type not supported";
 #endif
 #ifdef ESPIPE
diff -r -Z -U 2 tcl-8.5.2.1/win/makefile.vc /home/Nick/development/debug/tcl-8.5.2.1/win/makefile.vc
--- tcl-8.5.2.1/win/makefile.vc 2008-06-12 09:01:20.765751000 -0700
+++ /home/Nick/development/debug/tcl-8.5.2.1/win/makefile.vc 2013-10-05 09:10:03.859581600 -0700
@@ -449,5 +449,5 @@

 !if $(DEBUG)
-ldebug = -debug:full -debugtype:cv
+ldebug = -debugtype:cv
 !else
 ldebug = -release -opt:ref -opt:icf,3
}}}

=== Tk ===
 . {{{
diff -r -Z -U 2 tk-8.5.2.0/win/makefile.vc /home/Nick/development/debug/tk-8.5.2.0/win/makefile.vc
--- tk-8.5.2.0/win/makefile.vc 2008-06-12 09:01:54.000047000 -0700
+++ /home/Nick/development/debug/tk-8.5.2.0/win/makefile.vc 2013-10-05 09:10:27.667979000 -0700
@@ -473,5 +473,5 @@

 !if $(DEBUG)
-ldebug = -debug:full -debugtype:cv
+ldebug = -debugtype:cv
 !else
 ldebug = -release -opt:ref -opt:icf,3
}}}

== Compile External Dependencies ==
 . {{{
cd Python2.7.5
Tools\buildbot\external-amd64.bat
}}}

== Manually Build Openssl 1.0.1e ==

1. Download and unzip `openssl-1.0.1e.tar.gz`

2. Configure openssl:

 . {{{
cd openssl-1.0.1e
perl Configure --openssldir=%CD%\ enable-camellia disable-idea VC-WIN64A
}}}

3. '''IMPORTANT''', I guess perl creates "symobolic" links inside the `include` directory which the openssl build environment understands. However Visual Studio doesn't understand them.

 Example Visual Studio Error message:
 . {{{
C:\Users\Nick\Downloads\python_build\openssl-1.0.1e\include\openssl/evp.h(1): error C2059: syntax error : '!'
}}}

 To correct the problem, copy the header over their symbolic links. I used a BASH shell in Cygwin to do this:

 . {{{
cd openssl-1.0.1e/include/openssl
for f in *.h; do
    cp $f $f.nick
    mv $f.nick $f
done
}}}

4. Build with these commands:

 . {{{
ms\do_win64a.bat
nmake -f ms\ntdll.mak
}}}

== Convert Visual Studio 2008 Solution ==

1. Open `Python-2.7.5\PCbuild\pcbuild.sln` with Visual Studio 2012 Express

2. Click OK to perform the "One-Way" upgrade on all the project files.

3. Immediately close Visual Studio 2012 Express

=== Patch Project Files ===

See this diff file: [[attachment:PCbuild_patches.txt]]

I've also just zipped up the project files so you can just unzip them into `PCbuild`: [[attachment:python-2.7.5-amd64-pcbuild.zip]]

== Build Python ==

1. Open `Python-2.7.5\PCbuild\pcbuild.sln`

2. Select 'DEBUG' and 'x64' For the configuration.

3. Click 'Build' -> 'Build Solution' (F7)

How to build Python 2.7.5 using Visual Studio 2012 Express on Windows 8 64-bit

My goal with these instructions is to produce a DEBUG build on x86_64 (AMD64 or x64). I'm working on a Python extension that is currently crashing on Windows, but work fine in Linux. I will be building debug version of Numpy and Matplotlib after the DEBUG version of Python is created with these instructions.

References:

VS2010

Prepare Environment

1. Create a directory to store the Python source tree and dependencies, I called mine python_build.

2. Download Python 2.7.5 source from python.org and unzip it to python_build

3. Download and install an SVN command-line client (Try SlickSVN)

4. Download and install Perl64

5. Download and install Visual Studio Express 2012

Test Environment

1. Open a shell

2. Bring in the msvc compiler environment for x64 by doing:

  • call "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\vcvarsall.bat" x86_amd64
    Verify by typing 'cl.exe':
    Microsoft (R) C/C++ Optimizing Compiler Version 17.00.60610.1 for x64

3. Try running the svn client: 'svn --version':

  • svn, version 1.8.3-SlikSvn-1.8.3-X64 (SlikSvn/1.8.3) X64
       compiled Sep  4 2013, 16:04:02 on x86_64/x86-microsoft-windows6.1.7601
    
    Copyright (C) 2013 The Apache Software Foundation.

4. Try running perl: 'perl --version'

  • This is perl 5, version 16, subversion 3 (v5.16.3) built for MSWin32-x64-multi-thread

Download dependencies

Use the buildbot tools to grab the external dependencies:

  • cd Python2.7.5
    Tools\buildbot\external-common.bat

Patch External Dependencies

Tcl

  • diff -r -Z -U 2 tcl-8.5.2.1/generic/tclPosixStr.c /home/Nick/development/debug/tcl-8.5.2.1/generic/tclPosixStr.c
    --- tcl-8.5.2.1/generic/tclPosixStr.c   2008-06-12 09:01:20.765751000 -0700
    +++ /home/Nick/development/debug/tcl-8.5.2.1/generic/tclPosixStr.c      2013-10-05 09:09:22.967569100 -0700
    @@ -345,5 +345,5 @@
     #endif
     #if defined(EPFNOSUPPORT) && (!defined(ENOLCK) || (ENOLCK != EPFNOSUPPORT))
    -    case EPFNOSUPPORT: return "EPFNOSUPPORT";
    +    // case EPFNOSUPPORT: return "EPFNOSUPPORT";
     #endif
     #ifdef EPIPE
    @@ -405,5 +405,5 @@
     #endif
     #ifdef ESOCKTNOSUPPORT
    -    case ESOCKTNOSUPPORT: return "ESOCKTNOSUPPORT";
    +    // case ESOCKTNOSUPPORT: return "ESOCKTNOSUPPORT";
     #endif
     #ifdef ESPIPE
    @@ -793,5 +793,5 @@
     #endif
     #if defined(EPFNOSUPPORT) && (!defined(ENOLCK) || (ENOLCK != EPFNOSUPPORT))
    -    case EPFNOSUPPORT: return "protocol family not supported";
    +    // case EPFNOSUPPORT: return "protocol family not supported";
     #endif
     #ifdef EPIPE
    @@ -853,5 +853,5 @@
     #endif
     #ifdef ESOCKTNOSUPPORT
    -    case ESOCKTNOSUPPORT: return "socket type not supported";
    +    // case ESOCKTNOSUPPORT: return "socket type not supported";
     #endif
     #ifdef ESPIPE
    diff -r -Z -U 2 tcl-8.5.2.1/win/makefile.vc /home/Nick/development/debug/tcl-8.5.2.1/win/makefile.vc
    --- tcl-8.5.2.1/win/makefile.vc 2008-06-12 09:01:20.765751000 -0700
    +++ /home/Nick/development/debug/tcl-8.5.2.1/win/makefile.vc    2013-10-05 09:10:03.859581600 -0700
    @@ -449,5 +449,5 @@
    
     !if $(DEBUG)
    -ldebug = -debug:full -debugtype:cv
    +ldebug = -debugtype:cv
     !else
     ldebug = -release -opt:ref -opt:icf,3

Tk

  • diff -r -Z -U 2 tk-8.5.2.0/win/makefile.vc /home/Nick/development/debug/tk-8.5.2.0/win/makefile.vc
    --- tk-8.5.2.0/win/makefile.vc  2008-06-12 09:01:54.000047000 -0700
    +++ /home/Nick/development/debug/tk-8.5.2.0/win/makefile.vc     2013-10-05 09:10:27.667979000 -0700
    @@ -473,5 +473,5 @@
    
     !if $(DEBUG)
    -ldebug = -debug:full -debugtype:cv
    +ldebug = -debugtype:cv
     !else
     ldebug = -release -opt:ref -opt:icf,3

Compile External Dependencies

  • cd Python2.7.5
    Tools\buildbot\external-amd64.bat

Manually Build Openssl 1.0.1e

1. Download and unzip openssl-1.0.1e.tar.gz

2. Configure openssl:

  • cd openssl-1.0.1e
    perl Configure --openssldir=%CD%\ enable-camellia disable-idea VC-WIN64A

3. IMPORTANT, I guess perl creates "symobolic" links inside the include directory which the openssl build environment understands. However Visual Studio doesn't understand them.

  • Example Visual Studio Error message:
  • C:\Users\Nick\Downloads\python_build\openssl-1.0.1e\include\openssl/evp.h(1): error C2059: syntax error : '!'
    To correct the problem, copy the header over their symbolic links. I used a BASH shell in Cygwin to do this:
  • cd openssl-1.0.1e/include/openssl
    for f in *.h; do
        cp $f $f.nick
        mv $f.nick $f
    done

4. Build with these commands:

  • ms\do_win64a.bat
    nmake -f ms\ntdll.mak

Convert Visual Studio 2008 Solution

1. Open Python-2.7.5\PCbuild\pcbuild.sln with Visual Studio 2012 Express

2. Click OK to perform the "One-Way" upgrade on all the project files.

3. Immediately close Visual Studio 2012 Express

Patch Project Files

See this diff file: PCbuild_patches.txt

I've also just zipped up the project files so you can just unzip them into PCbuild: python-2.7.5-amd64-pcbuild.zip

Build Python

1. Open Python-2.7.5\PCbuild\pcbuild.sln

2. Select 'DEBUG' and 'x64' For the configuration.

3. Click 'Build' -> 'Build Solution' (F7)

VS2012 (last edited 2013-10-06 21:35:10 by NickHilton)

Unable to edit the page? See the FrontPage for instructions.