Hi all, Through some dirty fixes, I was able to build Python.NET on Ubuntu. Can anyone please review and merge my patch (attached) ?
Thanks, Vikas Changes: 1. Added namespace to src/runtime/pyansistring.cs 2. Some generalizations in src/monoclr/Makefile 3. I was getting error "Irrecoverable syntax error" with ilasm on clrmodule.il . Fixed by following changes: 3.1 Renamed src/runtime/clrmodule.il to src/runtime/clrmodule.pp.il . 3.2 Modified ./Makefile to run cpp preprocessor on src/runtime/ clrmodule.pp.il and generate src/runtime/clrmodule.il
Index: src/runtime/pyansistring.cs =================================================================== --- src/runtime/pyansistring.cs (revision 126) +++ src/runtime/pyansistring.cs (working copy) @@ -1,63 +1,82 @@ -public class PyAnsiString : PySequence { - /// <summary> - /// PyAnsiString Constructor - /// </summary> - /// - /// <remarks> - /// Creates a new PyAnsiString from an existing object reference. Note - /// that the instance assumes ownership of the object reference. - /// The object reference is not checked for type-correctness. - /// </remarks> - - public PyAnsiString(IntPtr ptr) : base(ptr) { } - - - /// <summary> - /// PyString Constructor - /// </summary> - /// - /// <remarks> - /// Copy constructor - obtain a PyAnsiString from a generic PyObject. - /// An ArgumentException will be thrown if the given object is not - /// a Python string object. - /// </remarks> - - public PyAnsiString(PyObject o) - : base() { - if (!IsStringType(o)) { - throw new ArgumentException("object is not a string"); - } - Runtime.Incref(o.obj); - obj = o.obj; - } - - - /// <summary> - /// PyAnsiString Constructor - /// </summary> - /// - /// <remarks> - /// Creates a Python string from a managed string. - /// </remarks> - - public PyAnsiString(string s) - : base() { - obj = Runtime.PyString_FromStringAndSize(s, s.Length); - if (obj == IntPtr.Zero) { - throw new PythonException(); - } - } - - - /// <summary> - /// IsStringType Method - /// </summary> - /// - /// <remarks> - /// Returns true if the given object is a Python string. - /// </remarks> - - public static bool IsStringType(PyObject value) { - return Runtime.PyString_Check(value.obj); - } -} \ No newline at end of file +// ========================================================================== +// This software is subject to the provisions of the Zope Public License, +// Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution. +// THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +// WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +// FOR A PARTICULAR PURPOSE. +// ========================================================================== + +using System; +namespace Python.Runtime { + + /// <summary> + /// Represents a standard Python list object. See the documentation at + /// http://www.python.org/doc/current/api/listObjects.html for details. + /// </summary> + + public class PyAnsiString : PySequence { + /// <summary> + /// PyAnsiString Constructor + /// </summary> + /// + /// <remarks> + /// Creates a new PyAnsiString from an existing object reference. Note + /// that the instance assumes ownership of the object reference. + /// The object reference is not checked for type-correctness. + /// </remarks> + + public PyAnsiString(IntPtr ptr) : base(ptr) { } + + + /// <summary> + /// PyString Constructor + /// </summary> + /// + /// <remarks> + /// Copy constructor - obtain a PyAnsiString from a generic PyObject. + /// An ArgumentException will be thrown if the given object is not + /// a Python string object. + /// </remarks> + + public PyAnsiString(PyObject o) + : base() { + if (!IsStringType(o)) { + throw new ArgumentException("object is not a string"); + } + Runtime.Incref(o.obj); + obj = o.obj; + } + + + /// <summary> + /// PyAnsiString Constructor + /// </summary> + /// + /// <remarks> + /// Creates a Python string from a managed string. + /// </remarks> + + public PyAnsiString(string s) + : base() { + obj = Runtime.PyString_FromStringAndSize(s, s.Length); + if (obj == IntPtr.Zero) { + throw new PythonException(); + } + } + + + /// <summary> + /// IsStringType Method + /// </summary> + /// + /// <remarks> + /// Returns true if the given object is a Python string. + /// </remarks> + + public static bool IsStringType(PyObject value) { + return Runtime.PyString_Check(value.obj); + } + } +} + Index: src/runtime/clrmodule.pp.il =================================================================== --- src/runtime/clrmodule.pp.il (revision 0) +++ src/runtime/clrmodule.pp.il (revision 0) @@ -0,0 +1,274 @@ +// ========================================================================== +// This software is subject to the provisions of the Zope Public License, +// Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution. +// THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +// WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +// FOR A PARTICULAR PURPOSE. +// ========================================================================== + +//============================================================================ +// This file is a hand-maintained stub - it implements clr.dll, which can be +// loaded by a standard CPython interpreter as an extension module. When it +// is loaded, it bootstraps the managed runtime integration layer and defers +// to it to do initialization and put the clr module into sys.modules, etc. + +// The "USE_PYTHON_RUNTIME_*" defines control what extra evidence is used +// to help the CLR find the appropriate Python.Runtime assembly. + +// If defined, the "pythonRuntimeVersionString" variable must be set to +// Python.Runtime's current version. +#define USE_PYTHON_RUNTIME_VERSION + +// If defined, the "PythonRuntimePublicKeyTokenData" data array must be +// set to Python.Runtime's public key token. +//#define USE_PYTHON_RUNTIME_PUBLIC_KEY_TOKEN + +// If DEBUG_PRINT is defined, a few System.Console.WriteLine calls are made +// to indicate what's going on during the load... +//#define DEBUG_PRINT +//============================================================================ + +.assembly extern mscorlib +{ + .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) + .ver 2:0:0:0 +} + +.assembly clr +{ + .hash algorithm 0x00008004 + .ver 2:0:0:2 +} + +.module clr.dll +.imagebase 0x00400000 +.subsystem 0x00000003 +.file alignment 512 + +// This includes the platform-specific IL. The include search path +// is set depending on whether we're compiling 32 or 64 bit. +// This MUST come before any other .data directives! +// Why, oh why, can't ilasm support command line #defines? :( +#include "clrmodule-platform.il" + +#ifdef USE_PYTHON_RUNTIME_PUBLIC_KEY_TOKEN +.data PythonRuntimePublicKeyTokenData = bytearray (64 e1 4e 84 5a bf 2e 60) +#endif + +.class public auto ansi beforefieldinit clrModule extends [mscorlib]System.Object +{ +#ifdef USE_PYTHON_RUNTIME_PUBLIC_KEY_TOKEN + .field static assembly int64 PythonRuntimePublicKeyToken at PythonRuntimePublicKeyTokenData +#endif + + .method public hidebysig specialname rtspecialname instance void + .ctor() cil managed + { + .maxstack 1 + ldarg.0 + call instance void [mscorlib]System.Object::.ctor() + ret + } + + .method public hidebysig static void modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl) + initclr() cil managed + { + .vtentry 1:1 + .export [1] as initclr + + .maxstack 6 + .locals init ( + class [mscorlib]System.Reflection.Assembly pythonRuntime, + class [mscorlib]System.Reflection.Assembly executingAssembly, + class [mscorlib]System.Reflection.AssemblyName pythonRuntimeName, + class [mscorlib]System.Type pythonEngineType, + int8[] publicKeyToken, + string assemblyDirectory, + string pythonRuntimeVersionString, + string pythonRuntimeDllPath) + + // pythonRuntime = null; + ldnull + stloc pythonRuntime + + .try + { +#ifdef DEBUG_PRINT + ldstr "Attempting to load Python.Runtime using standard binding rules... " + call void [mscorlib]System.Console::Write(string) +#endif + + // Attempt to find and load Python.Runtime using standard assembly binding rules. + // This roughly translates into looking in order: + // - GAC + // - ApplicationBase + // - A PrivateBinPath under ApplicationBase + // With an unsigned assembly, the GAC is skipped. + + // System.Reflection.AssemblyName pythonRuntimeName = new System.Reflection.AssemblyName(); + newobj instance void [mscorlib]System.Reflection.AssemblyName::.ctor() + stloc pythonRuntimeName + + // pythonRuntimeName.Name = "Python.Runtime"; + ldloc pythonRuntimeName + ldstr "Python.Runtime" + callvirt instance void [mscorlib]System.Reflection.AssemblyName::set_Name(string) + +#ifdef USE_PYTHON_RUNTIME_VERSION + // pythonRuntimeVersionString = "..."; + ldstr "2.0.0.2" + stloc pythonRuntimeVersionString + + // pythonRuntimeName.Version = new Version(pythonRuntimeVersionString); + ldloc pythonRuntimeName + ldloc pythonRuntimeVersionString + newobj instance void [mscorlib]System.Version::.ctor(string) + callvirt instance void [mscorlib]System.Reflection.AssemblyName::set_Version(class [mscorlib]System.Version) +#endif + +#ifdef USE_PYTHON_RUNTIME_PUBLIC_KEY_TOKEN + // publicKeyToken = new byte[] { ... }; + ldc.i4.8 + newarr [mscorlib]System.Byte + dup + ldtoken field int64 clrModule::PythonRuntimePublicKeyToken + call void [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::InitializeArray(class [mscorlib]System.Array, valuetype [mscorlib]System.RuntimeFieldHandle) + stloc publicKeyToken + + // pythonRuntimeName.SetPublicKeyToken(publicKeyToken); + ldloc pythonRuntimeName + ldloc publicKeyToken + callvirt instance void [mscorlib]System.Reflection.AssemblyName::SetPublicKeyToken(uint8[]) +#endif + + // pythonRuntimeName.CultureInfo = System.Globalization.CultureInfo.InvariantCulture; + ldloc pythonRuntimeName + call class [mscorlib]System.Globalization.CultureInfo [mscorlib]System.Globalization.CultureInfo::get_InvariantCulture() + callvirt instance void [mscorlib]System.Reflection.AssemblyName::set_CultureInfo(class [mscorlib]System.Globalization.CultureInfo) + + // return System.Reflection.Assembly.Load(pythonRuntimeName); + ldloc pythonRuntimeName + call class [mscorlib]System.Reflection.Assembly [mscorlib]System.Reflection.Assembly::Load(class [mscorlib]System.Reflection.AssemblyName) + stloc pythonRuntime + +#ifdef DEBUG_PRINT + ldstr "Success!" + call void [mscorlib]System.Console::WriteLine(string) +#endif + leave.s LOADED_PYTHON_RUNTIME + } + catch [mscorlib]System.Object + { +#ifdef DEBUG_PRINT + ldstr "Failed." + call void [mscorlib]System.Console::WriteLine(string) +#endif + leave.s EXIT_CLR_LOAD + } + EXIT_CLR_LOAD: nop + + .try + { + // If the above fails for any reason, we fallback to attempting to load "Python.Runtime.dll" + // from the directory this assembly is running in. "This assembly" is probably "clr.pyd", + // sitting somewhere in PYTHONPATH. This is using Assembly.LoadFrom, and inherits all the + // caveats of that call. See MSDN docs for details. + // Suzanne Cook's blog is also an excellent source of info on this: + // http://blogs.msdn.com/suzcook/ + // http://blogs.msdn.com/suzcook/archive/2003/05/29/57143.aspx + // http://blogs.msdn.com/suzcook/archive/2003/06/13/57180.aspx + // executingAssembly = System.Reflection.Assembly.GetExecutingAssembly(); + call class [mscorlib]System.Reflection.Assembly [mscorlib]System.Reflection.Assembly::GetExecutingAssembly() + stloc executingAssembly + + // assemblyDirectory = System.IO.Path.GetDirectoryName(executingAssembly.Location); + ldloc executingAssembly + callvirt instance string [mscorlib]System.Reflection.Assembly::get_Location() + call string [mscorlib]System.IO.Path::GetDirectoryName(string) + stloc assemblyDirectory + + // pythonRuntimeDllPath = System.IO.Path.Combine(assemblyDirectory, "Python.Runtime.dll"); + ldloc assemblyDirectory + ldstr "Python.Runtime.dll" + call string [mscorlib]System.IO.Path::Combine(string, string) + stloc pythonRuntimeDllPath + +#ifdef DEBUG_PRINT + ldstr "Attempting to load Python.Runtime from: '{0}'... " + ldloc pythonRuntimeDllPath + call void [mscorlib]System.Console::Write(string, object) +#endif + + // pythonRuntime = System.Reflection.Assembly.LoadFrom(pythonRuntimeDllPath); + ldloc pythonRuntimeDllPath + call class [mscorlib]System.Reflection.Assembly [mscorlib]System.Reflection.Assembly::LoadFrom(string) + stloc pythonRuntime + +#ifdef DEBUG_PRINT + ldstr "Success!" + call void [mscorlib]System.Console::WriteLine(string) +#endif + leave.s LOADED_PYTHON_RUNTIME + } + catch [mscorlib]System.Object + { +#ifdef DEBUG_PRINT + ldstr "Failed." + call void [mscorlib]System.Console::WriteLine(string) +#endif + leave.s EXIT_PYTHONPATH_LOAD + } + EXIT_PYTHONPATH_LOAD: nop + + // If we get here, we haven't loaded Python.Runtime, so bail. +#ifdef DEBUG_PRINT + ldstr "Could not load Python.Runtime, so sad." + call void [mscorlib]System.Console::WriteLine(string) +#endif + ret + + // Once here, we've successfully loaded SOME version of Python.Runtime + // So now we get the PythonEngine and execute the InitExt method on it. + LOADED_PYTHON_RUNTIME: nop + .try + { +#ifdef DEBUG_PRINT + ldstr "Running Python.Runtime.PythonEngine.InitExt()" + call void [mscorlib]System.Console::WriteLine(string) +#endif + // pythonEngineType = pythonRuntime.GetType("Python.Runtime.PythonEngine"); + ldloc pythonRuntime + ldstr "Python.Runtime.PythonEngine" + callvirt instance class [mscorlib]System.Type [mscorlib]System.Reflection.Assembly::GetType(string) + stloc pythonEngineType + + // pythonEngineType.InvokeMember("InitExt", System.Reflection.BindingFlags.InvokeMethod, null, null, null); + ldloc pythonEngineType + ldstr "InitExt" + ldc.i4 0x100 + ldnull + ldnull + ldnull + callvirt instance object [mscorlib]System.Type::InvokeMember( string, + valuetype [mscorlib]System.Reflection.BindingFlags, + class [mscorlib]System.Reflection.Binder, + object, + object[]) + pop + leave.s EXIT_TRY_INVOKE + } + catch [mscorlib]System.Object + { +#ifdef DEBUG_PRINT + ldstr "Error calling Python.Runtime.PythonEngine.InitExt()." + call void [mscorlib]System.Console::WriteLine(string) +#endif + leave.s EXIT_TRY_INVOKE + } + EXIT_TRY_INVOKE: nop + + ret + } +} + Property changes on: src/runtime/clrmodule.pp.il ___________________________________________________________________ Added: svn:executable + * Index: src/runtime/clrmodule.il =================================================================== --- src/runtime/clrmodule.il (revision 126) +++ src/runtime/clrmodule.il (working copy) @@ -1,274 +0,0 @@ -// ========================================================================== -// This software is subject to the provisions of the Zope Public License, -// Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution. -// THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -// WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -// FOR A PARTICULAR PURPOSE. -// ========================================================================== - -//============================================================================ -// This file is a hand-maintained stub - it implements clr.dll, which can be -// loaded by a standard CPython interpreter as an extension module. When it -// is loaded, it bootstraps the managed runtime integration layer and defers -// to it to do initialization and put the clr module into sys.modules, etc. - -// The "USE_PYTHON_RUNTIME_*" defines control what extra evidence is used -// to help the CLR find the appropriate Python.Runtime assembly. - -// If defined, the "pythonRuntimeVersionString" variable must be set to -// Python.Runtime's current version. -#define USE_PYTHON_RUNTIME_VERSION - -// If defined, the "PythonRuntimePublicKeyTokenData" data array must be -// set to Python.Runtime's public key token. -//#define USE_PYTHON_RUNTIME_PUBLIC_KEY_TOKEN - -// If DEBUG_PRINT is defined, a few System.Console.WriteLine calls are made -// to indicate what's going on during the load... -//#define DEBUG_PRINT -//============================================================================ - -.assembly extern mscorlib -{ - .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) - .ver 2:0:0:0 -} - -.assembly clr -{ - .hash algorithm 0x00008004 - .ver 2:0:0:2 -} - -.module clr.dll -.imagebase 0x00400000 -.subsystem 0x00000003 -.file alignment 512 - -// This includes the platform-specific IL. The include search path -// is set depending on whether we're compiling 32 or 64 bit. -// This MUST come before any other .data directives! -// Why, oh why, can't ilasm support command line #defines? :( -#include "clrmodule-platform.il" - -#ifdef USE_PYTHON_RUNTIME_PUBLIC_KEY_TOKEN -.data PythonRuntimePublicKeyTokenData = bytearray (64 e1 4e 84 5a bf 2e 60) -#endif - -.class public auto ansi beforefieldinit clrModule extends [mscorlib]System.Object -{ -#ifdef USE_PYTHON_RUNTIME_PUBLIC_KEY_TOKEN - .field static assembly int64 PythonRuntimePublicKeyToken at PythonRuntimePublicKeyTokenData -#endif - - .method public hidebysig specialname rtspecialname instance void - .ctor() cil managed - { - .maxstack 1 - ldarg.0 - call instance void [mscorlib]System.Object::.ctor() - ret - } - - .method public hidebysig static void modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl) - initclr() cil managed - { - .vtentry 1:1 - .export [1] as initclr - - .maxstack 6 - .locals init ( - class [mscorlib]System.Reflection.Assembly pythonRuntime, - class [mscorlib]System.Reflection.Assembly executingAssembly, - class [mscorlib]System.Reflection.AssemblyName pythonRuntimeName, - class [mscorlib]System.Type pythonEngineType, - int8[] publicKeyToken, - string assemblyDirectory, - string pythonRuntimeVersionString, - string pythonRuntimeDllPath) - - // pythonRuntime = null; - ldnull - stloc pythonRuntime - - .try - { -#ifdef DEBUG_PRINT - ldstr "Attempting to load Python.Runtime using standard binding rules... " - call void [mscorlib]System.Console::Write(string) -#endif - - // Attempt to find and load Python.Runtime using standard assembly binding rules. - // This roughly translates into looking in order: - // - GAC - // - ApplicationBase - // - A PrivateBinPath under ApplicationBase - // With an unsigned assembly, the GAC is skipped. - - // System.Reflection.AssemblyName pythonRuntimeName = new System.Reflection.AssemblyName(); - newobj instance void [mscorlib]System.Reflection.AssemblyName::.ctor() - stloc pythonRuntimeName - - // pythonRuntimeName.Name = "Python.Runtime"; - ldloc pythonRuntimeName - ldstr "Python.Runtime" - callvirt instance void [mscorlib]System.Reflection.AssemblyName::set_Name(string) - -#ifdef USE_PYTHON_RUNTIME_VERSION - // pythonRuntimeVersionString = "..."; - ldstr "2.0.0.2" - stloc pythonRuntimeVersionString - - // pythonRuntimeName.Version = new Version(pythonRuntimeVersionString); - ldloc pythonRuntimeName - ldloc pythonRuntimeVersionString - newobj instance void [mscorlib]System.Version::.ctor(string) - callvirt instance void [mscorlib]System.Reflection.AssemblyName::set_Version(class [mscorlib]System.Version) -#endif - -#ifdef USE_PYTHON_RUNTIME_PUBLIC_KEY_TOKEN - // publicKeyToken = new byte[] { ... }; - ldc.i4.8 - newarr [mscorlib]System.Byte - dup - ldtoken field int64 clrModule::PythonRuntimePublicKeyToken - call void [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::InitializeArray(class [mscorlib]System.Array, valuetype [mscorlib]System.RuntimeFieldHandle) - stloc publicKeyToken - - // pythonRuntimeName.SetPublicKeyToken(publicKeyToken); - ldloc pythonRuntimeName - ldloc publicKeyToken - callvirt instance void [mscorlib]System.Reflection.AssemblyName::SetPublicKeyToken(uint8[]) -#endif - - // pythonRuntimeName.CultureInfo = System.Globalization.CultureInfo.InvariantCulture; - ldloc pythonRuntimeName - call class [mscorlib]System.Globalization.CultureInfo [mscorlib]System.Globalization.CultureInfo::get_InvariantCulture() - callvirt instance void [mscorlib]System.Reflection.AssemblyName::set_CultureInfo(class [mscorlib]System.Globalization.CultureInfo) - - // return System.Reflection.Assembly.Load(pythonRuntimeName); - ldloc pythonRuntimeName - call class [mscorlib]System.Reflection.Assembly [mscorlib]System.Reflection.Assembly::Load(class [mscorlib]System.Reflection.AssemblyName) - stloc pythonRuntime - -#ifdef DEBUG_PRINT - ldstr "Success!" - call void [mscorlib]System.Console::WriteLine(string) -#endif - leave.s LOADED_PYTHON_RUNTIME - } - catch [mscorlib]System.Object - { -#ifdef DEBUG_PRINT - ldstr "Failed." - call void [mscorlib]System.Console::WriteLine(string) -#endif - leave.s EXIT_CLR_LOAD - } - EXIT_CLR_LOAD: nop - - .try - { - // If the above fails for any reason, we fallback to attempting to load "Python.Runtime.dll" - // from the directory this assembly is running in. "This assembly" is probably "clr.pyd", - // sitting somewhere in PYTHONPATH. This is using Assembly.LoadFrom, and inherits all the - // caveats of that call. See MSDN docs for details. - // Suzanne Cook's blog is also an excellent source of info on this: - // http://blogs.msdn.com/suzcook/ - // http://blogs.msdn.com/suzcook/archive/2003/05/29/57143.aspx - // http://blogs.msdn.com/suzcook/archive/2003/06/13/57180.aspx - // executingAssembly = System.Reflection.Assembly.GetExecutingAssembly(); - call class [mscorlib]System.Reflection.Assembly [mscorlib]System.Reflection.Assembly::GetExecutingAssembly() - stloc executingAssembly - - // assemblyDirectory = System.IO.Path.GetDirectoryName(executingAssembly.Location); - ldloc executingAssembly - callvirt instance string [mscorlib]System.Reflection.Assembly::get_Location() - call string [mscorlib]System.IO.Path::GetDirectoryName(string) - stloc assemblyDirectory - - // pythonRuntimeDllPath = System.IO.Path.Combine(assemblyDirectory, "Python.Runtime.dll"); - ldloc assemblyDirectory - ldstr "Python.Runtime.dll" - call string [mscorlib]System.IO.Path::Combine(string, string) - stloc pythonRuntimeDllPath - -#ifdef DEBUG_PRINT - ldstr "Attempting to load Python.Runtime from: '{0}'... " - ldloc pythonRuntimeDllPath - call void [mscorlib]System.Console::Write(string, object) -#endif - - // pythonRuntime = System.Reflection.Assembly.LoadFrom(pythonRuntimeDllPath); - ldloc pythonRuntimeDllPath - call class [mscorlib]System.Reflection.Assembly [mscorlib]System.Reflection.Assembly::LoadFrom(string) - stloc pythonRuntime - -#ifdef DEBUG_PRINT - ldstr "Success!" - call void [mscorlib]System.Console::WriteLine(string) -#endif - leave.s LOADED_PYTHON_RUNTIME - } - catch [mscorlib]System.Object - { -#ifdef DEBUG_PRINT - ldstr "Failed." - call void [mscorlib]System.Console::WriteLine(string) -#endif - leave.s EXIT_PYTHONPATH_LOAD - } - EXIT_PYTHONPATH_LOAD: nop - - // If we get here, we haven't loaded Python.Runtime, so bail. -#ifdef DEBUG_PRINT - ldstr "Could not load Python.Runtime, so sad." - call void [mscorlib]System.Console::WriteLine(string) -#endif - ret; - - // Once here, we've successfully loaded SOME version of Python.Runtime - // So now we get the PythonEngine and execute the InitExt method on it. - LOADED_PYTHON_RUNTIME: nop - .try - { -#ifdef DEBUG_PRINT - ldstr "Running Python.Runtime.PythonEngine.InitExt()" - call void [mscorlib]System.Console::WriteLine(string) -#endif - // pythonEngineType = pythonRuntime.GetType("Python.Runtime.PythonEngine"); - ldloc pythonRuntime - ldstr "Python.Runtime.PythonEngine" - callvirt instance class [mscorlib]System.Type [mscorlib]System.Reflection.Assembly::GetType(string) - stloc pythonEngineType - - // pythonEngineType.InvokeMember("InitExt", System.Reflection.BindingFlags.InvokeMethod, null, null, null); - ldloc pythonEngineType - ldstr "InitExt" - ldc.i4 0x100 - ldnull - ldnull - ldnull - callvirt instance object [mscorlib]System.Type::InvokeMember( string, - valuetype [mscorlib]System.Reflection.BindingFlags, - class [mscorlib]System.Reflection.Binder, - object, - object[]) - pop - leave.s EXIT_TRY_INVOKE - } - catch [mscorlib]System.Object - { -#ifdef DEBUG_PRINT - ldstr "Error calling Python.Runtime.PythonEngine.InitExt()." - call void [mscorlib]System.Console::WriteLine(string) -#endif - leave.s EXIT_TRY_INVOKE - } - EXIT_TRY_INVOKE: nop - - ret - } -} - Index: src/monoclr/Makefile =================================================================== --- src/monoclr/Makefile (revision 126) +++ src/monoclr/Makefile (working copy) @@ -1,9 +1,13 @@ # Author: Christian Heimes -PYTHON = python2.5 +PYTHON = python BASENAME = $(shell $(PYTHON) -c "import sys; print 'python%i.%i' % sys.version_info[:2]") GCC = gcc - +ifeq ($(origin WINDIR), undefined) + DLL_OR_SO = "-shared" +else + DLL_OR_SO = "-dynamiclib" +endif PY_LIBS = $(shell $(PYTHON) -c "from distutils.sysconfig import get_config_vars; \ print get_config_vars('BLDLIBRARY')[0]") -lpython PY_CFLAGS = -I$(shell $(PYTHON) -c "from distutils.sysconfig import get_config_vars; \ @@ -30,7 +34,7 @@ $(BASENAME): python.c $(GCC) $(PY_CFLAGS) $(PY_LIBS) python.c -o $(BASENAME) clr.so: clrmod.o pynetinit.o - $(GCC) $(LIBS) -dynamiclib pynetinit.o clrmod.o -o clr.so + $(GCC) $(LIBS) $(DLL_OR_SO) pynetinit.o clrmod.o -o clr.so clr$(BASENAME): clrpython.o pynetinit.o $(GCC) $(LIBS) clrpython.o pynetinit.o -o clr$(BASENAME) Index: Makefile =================================================================== --- Makefile (revision 126) +++ Makefile (working copy) @@ -16,6 +16,12 @@ UCS ?= $(shell $(PYTHON) -c "import sys; SITEPACKAGES = $(shell $(PYTHON) -c "from distutils.sysconfig import get_python_lib; \ print get_python_lib(plat_specific=1, standard_lib=0)") INSTALL=/usr/bin/install -m644 +ARCH_FULL = $(shell uname -m) +ifneq (, $(findstring 86, $(ARCH_FULL))) + ARCH = x86 +else + ARCH = x64 +endif ifeq ($(origin WINDIR), undefined) RUNNER = mono @@ -70,6 +76,14 @@ Python.Runtime.dll: $(RUNTIME_CS) $(CSC) /unsafe /target:library \ $(RUNTIME_REF) /out:../../Python.Runtime.dll /recurse:*.cs +src/runtime/clrmodule.il: src/runtime/clrmodule.pp.il +ifeq ($(origin WINDIR), undefined) + cd "$(BASEDIR)/src/runtime";\ + $(CPP) -C -P -x c++ -I $(ARCH) clrmodule.pp.il -o clrmodule.il +else + cd "$(BASEDIR)/src/runtime";\ + cp clrmodule.pp.il clrmodule.il +endif clr.pyd: Python.Runtime.dll src/runtime/clrmodule.il $(ILASM) /nologo /dll /quiet /output=clr.pyd \ @@ -106,7 +120,7 @@ realclean: clean rm -f Python*.il Python*.il2 Python*.res rm -rf build/ cd src/console; rm -rf bin; rm -rf obj; cd ../..; - cd src/runtime; rm -rf bin; rm -rf obj; cd ../..; + cd src/runtime; rm -rf bin; rm -rf obj; rm clrmodule.il; cd ../..; cd src/testing; rm -rf bin; rm -rf obj; cd ../..; cd src/embed_tests; rm -rf bin; rm -rf obj; rm -f TestResult.xml; cd ../..; cd src/monoclr; make clean; cd ../..
_________________________________________________ Python.NET mailing list - PythonDotNet@python.org http://mail.python.org/mailman/listinfo/pythondotnet