Commit 69553d6f authored by Wayne Stambaugh's avatar Wayne Stambaugh

wxPython find and version loading fixes. (fixes lp:1408060)

* Add test to CMakeLists.txt to verify wxPython is installed when
  KICAD_SCRIPTING_WXPYTHON=ON.
* Add test to make sure wxPython version major and minor numbers match
  the version of wxWidgets found.
* Add code to set the correct version of wxPython to the python scripting
  initialization code.
* Minor code simplification in Pcbnew KIFACE main window creation.
parent 1a749130
...@@ -635,7 +635,6 @@ if( KICAD_SCRIPTING OR KICAD_SCRIPTING_MODULES ) ...@@ -635,7 +635,6 @@ if( KICAD_SCRIPTING OR KICAD_SCRIPTING_MODULES )
# FindPythonInterp unless the user specifically defined a custom path. # FindPythonInterp unless the user specifically defined a custom path.
if( NOT PYTHON_SITE_PACKAGE_PATH ) if( NOT PYTHON_SITE_PACKAGE_PATH )
execute_process( COMMAND ${PYTHON_EXECUTABLE} -c "import distutils.sysconfig;print\"%s\"%distutils.sysconfig.get_python_lib(plat_specific=0, standard_lib=0, prefix='')" execute_process( COMMAND ${PYTHON_EXECUTABLE} -c "import distutils.sysconfig;print\"%s\"%distutils.sysconfig.get_python_lib(plat_specific=0, standard_lib=0, prefix='')"
# execute_process( COMMAND ${PYTHON_EXECUTABLE} -c "import distutils.sysconfig;print\"%s\"%distutils.sysconfig.get_python_lib()"
OUTPUT_VARIABLE PYTHON_SITE_PACKAGE_PATH OUTPUT_VARIABLE PYTHON_SITE_PACKAGE_PATH
OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_STRIP_TRAILING_WHITESPACE
) )
...@@ -662,6 +661,33 @@ if( KICAD_SCRIPTING OR KICAD_SCRIPTING_MODULES ) ...@@ -662,6 +661,33 @@ if( KICAD_SCRIPTING OR KICAD_SCRIPTING_MODULES )
find_package( PythonLibs 2.6 ) find_package( PythonLibs 2.6 )
if( KICAD_SCRIPTING_WXPYTHON )
# Check to see if the correct version of wxPython is installed based on the version of
# wxWidgets found. At least the major an minor version should match.
set( _wxpy_version "${wxWidgets_VERSION_MAJOR}.${wxWidgets_VERSION_MINOR}" )
set( _py_cmd "import wxversion;print wxversion.checkInstalled('${_wxpy_version}')" )
execute_process( COMMAND ${PYTHON_EXECUTABLE} -c "${_py_cmd}"
RESULT_VARIABLE WXPYTHON_VERSION_RESULT
OUTPUT_VARIABLE WXPYTHON_VERSION_FOUND
OUTPUT_STRIP_TRAILING_WHITESPACE
)
# message( STATUS "WXPYTHON_VERSION_FOUND: ${WXPYTHON_VERSION_FOUND}" )
# message( STATUS "WXPYTHON_VERSION_RESULT: ${WXPYTHON_VERSION_RESULT}" )
# Check to see if any version of wxPython is installed on the system.
if( WXPYTHON_VERSION_RESULT GREATER 0 )
message( FATAL_ERROR "wxPython does not appear to be installed on the system." )
endif()
if( NOT WXPYTHON_VERSION_FOUND STREQUAL "True" )
message( FATAL_ERROR "wxPython version ${_wxpy_version} does not appear to be installed on the system." )
else()
set( WXPYTHON_VERSION_FOUND "${_wxpy_version}"
CACHE STRING "wxPython version found." )
endif()
endif()
#message( STATUS "PYTHON_INCLUDE_DIRS:${PYTHON_INCLUDE_DIRS}" ) #message( STATUS "PYTHON_INCLUDE_DIRS:${PYTHON_INCLUDE_DIRS}" )
# Infrequently needed headers go at end of search paths, append to INC_AFTER which # Infrequently needed headers go at end of search paths, append to INC_AFTER which
......
...@@ -70,6 +70,11 @@ ...@@ -70,6 +70,11 @@
#define KICAD_DATA_PATH "@CMAKE_INSTALL_PREFIX@/@KICAD_DATA@" #define KICAD_DATA_PATH "@CMAKE_INSTALL_PREFIX@/@KICAD_DATA@"
#endif #endif
/// The wxPython version found during configuration.
#if defined( KICAD_SCRIPTING_WXPYTHON )
#define WXPYTHON_VERSION "@WXPYTHON_VERSION_FOUND@"
#endif
/// When defined, build the GITHUB_PLUGIN for pcbnew. /// When defined, build the GITHUB_PLUGIN for pcbnew.
#cmakedefine BUILD_GITHUB_PLUGIN #cmakedefine BUILD_GITHUB_PLUGIN
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* *
* Copyright (C) 2012 Jean-Pierre Charras, jean-pierre.charras@ujf-grenoble.fr * Copyright (C) 2012 Jean-Pierre Charras, jean-pierre.charras@ujf-grenoble.fr
* Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com> * Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
* Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 1992-2015 KiCad Developers, see AUTHORS.txt for contributors.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
...@@ -109,57 +109,46 @@ static struct IFACE : public KIFACE_I ...@@ -109,57 +109,46 @@ static struct IFACE : public KIFACE_I
wxWindow* CreateWindow( wxWindow* aParent, int aClassId, KIWAY* aKiway, int aCtlBits = 0 ) wxWindow* CreateWindow( wxWindow* aParent, int aClassId, KIWAY* aKiway, int aCtlBits = 0 )
{ {
wxWindow* frame = NULL;
switch( aClassId ) switch( aClassId )
{ {
case FRAME_PCB: case FRAME_PCB:
{ frame = dynamic_cast< wxWindow* >( new PCB_EDIT_FRAME( aKiway, aParent ) );
PCB_EDIT_FRAME* frame = new PCB_EDIT_FRAME( aKiway, aParent );
#if defined(KICAD_SCRIPTING) #if defined( KICAD_SCRIPTING )
// give the scripting helpers access to our frame // give the scripting helpers access to our frame
ScriptingSetPcbEditFrame( frame ); ScriptingSetPcbEditFrame( (PCB_EDIT_FRAME*) frame );
#endif #endif
if( Kiface().IsSingle() ) if( Kiface().IsSingle() )
{ {
// only run this under single_top, not under a project manager. // only run this under single_top, not under a project manager.
CreateServer( frame, KICAD_PCB_PORT_SERVICE_NUMBER ); CreateServer( frame, KICAD_PCB_PORT_SERVICE_NUMBER );
}
return frame;
} }
break; break;
case FRAME_PCB_MODULE_EDITOR: case FRAME_PCB_MODULE_EDITOR:
{ frame = dynamic_cast< wxWindow* >( new FOOTPRINT_EDIT_FRAME( aKiway, aParent ) );
FOOTPRINT_EDIT_FRAME* frame = new FOOTPRINT_EDIT_FRAME( aKiway, aParent );
return frame;
}
break; break;
case FRAME_PCB_MODULE_VIEWER: case FRAME_PCB_MODULE_VIEWER:
case FRAME_PCB_MODULE_VIEWER_MODAL: case FRAME_PCB_MODULE_VIEWER_MODAL:
{ frame = dynamic_cast< wxWindow* >( new FOOTPRINT_VIEWER_FRAME( aKiway, aParent,
FOOTPRINT_VIEWER_FRAME* frame = new FOOTPRINT_VIEWER_FRAME( FRAME_T( aClassId ) ) );
aKiway, aParent, FRAME_T( aClassId ) );
return frame;
}
break; break;
case FRAME_PCB_FOOTPRINT_WIZARD_MODAL: case FRAME_PCB_FOOTPRINT_WIZARD_MODAL:
{ frame = dynamic_cast< wxWindow* >( new FOOTPRINT_WIZARD_FRAME( aKiway, aParent,
FOOTPRINT_WIZARD_FRAME* frame = new FOOTPRINT_WIZARD_FRAME( FRAME_T( aClassId ) ) );
aKiway, aParent, FRAME_T( aClassId ) );
return frame;
}
break; break;
default: default:
; ;
} }
return NULL; return frame;
} }
/** /**
...@@ -193,13 +182,13 @@ KIFACE_I& Kiface() { return kiface; } ...@@ -193,13 +182,13 @@ KIFACE_I& Kiface() { return kiface; }
// KIFACE_GETTER's actual spelling is a substitution macro found in kiway.h. // KIFACE_GETTER's actual spelling is a substitution macro found in kiway.h.
// KIFACE_GETTER will not have name mangling due to declaration in kiway.h. // KIFACE_GETTER will not have name mangling due to declaration in kiway.h.
MY_API( KIFACE* ) KIFACE_GETTER( int* aKIFACEversion, int aKiwayVersion, PGM_BASE* aProgram ) MY_API( KIFACE* ) KIFACE_GETTER( int* aKIFACEversion, int aKiwayVersion, PGM_BASE* aProgram )
{ {
process = (PGM_BASE*) aProgram; process = (PGM_BASE*) aProgram;
return &kiface; return &kiface;
} }
#if defined(BUILD_KIWAY_DLL) #if defined( BUILD_KIWAY_DLL )
PGM_BASE& Pgm() PGM_BASE& Pgm()
{ {
wxASSERT( process ); // KIFACE_GETTER has already been called. wxASSERT( process ); // KIFACE_GETTER has already been called.
...@@ -208,7 +197,7 @@ PGM_BASE& Pgm() ...@@ -208,7 +197,7 @@ PGM_BASE& Pgm()
#endif #endif
#if defined(KICAD_SCRIPTING) #if defined( KICAD_SCRIPTING )
static bool scriptingSetup() static bool scriptingSetup()
{ {
wxString path_frag; wxString path_frag;
...@@ -218,7 +207,7 @@ static bool scriptingSetup() ...@@ -218,7 +207,7 @@ static bool scriptingSetup()
const wxString python_us( "python27_us" ); const wxString python_us( "python27_us" );
// Build our python path inside kicad // Build our python path inside kicad
wxString kipython = FindKicadFile( python_us + wxT("/python.exe") ); wxString kipython = FindKicadFile( python_us + wxT( "/python.exe" ) );
//we need only the path: //we need only the path:
wxFileName fn( kipython ); wxFileName fn( kipython );
...@@ -231,19 +220,20 @@ static bool scriptingSetup() ...@@ -231,19 +220,20 @@ static bool scriptingSetup()
if( !wxGetEnv( wxT( "PYTHONPATH" ), &ppath ) || !ppath.Contains( python_us ) ) if( !wxGetEnv( wxT( "PYTHONPATH" ), &ppath ) || !ppath.Contains( python_us ) )
{ {
ppath << kipython << wxT("/pylib;"); ppath << kipython << wxT( "/pylib;" );
ppath << kipython << wxT("/lib;"); ppath << kipython << wxT( "/lib;" );
ppath << kipython << wxT("/dll"); ppath << kipython << wxT( "/dll" );
wxSetEnv( wxT( "PYTHONPATH" ), ppath ); wxSetEnv( wxT( "PYTHONPATH" ), ppath );
DBG( std::cout << "set PYTHONPATH to " << TO_UTF8(ppath) << "\n"; ) // DBG( std::cout << "set PYTHONPATH to " << TO_UTF8( ppath ) << "\n"; )
// Add python executable path: // Add python executable path:
wxGetEnv( wxT( "PATH" ), &ppath ); wxGetEnv( wxT( "PATH" ), &ppath );
if( !ppath.Contains( python_us ) ) if( !ppath.Contains( python_us ) )
{ {
kipython << wxT(";") << ppath; kipython << wxT( ";" ) << ppath;
wxSetEnv( wxT( "PATH" ), kipython ); wxSetEnv( wxT( "PATH" ), kipython );
DBG( std::cout << "set PATH to " << TO_UTF8(kipython) << "\n"; ) // DBG( std::cout << "set PATH to " << TO_UTF8( kipython ) << "\n"; )
} }
} }
} }
...@@ -263,14 +253,20 @@ static bool scriptingSetup() ...@@ -263,14 +253,20 @@ static bool scriptingSetup()
// Add default paths to PYTHONPATH // Add default paths to PYTHONPATH
wxString pypath; wxString pypath;
// User scripting folder (~/Library/Application Support/kicad/scripting/plugins) // User scripting folder (~/Library/Application Support/kicad/scripting/plugins)
pypath = GetOSXKicadUserDataDir() + wxT( "/scripting/plugins" ); pypath = GetOSXKicadUserDataDir() + wxT( "/scripting/plugins" );
// Machine scripting folder (/Library/Application Support/kicad/scripting/plugins) // Machine scripting folder (/Library/Application Support/kicad/scripting/plugins)
pypath += wxT( ":" ) + GetOSXKicadMachineDataDir() + wxT( "/scripting/plugins" ); pypath += wxT( ":" ) + GetOSXKicadMachineDataDir() + wxT( "/scripting/plugins" );
// Bundle scripting folder (<kicad.app>/Contents/SharedSupport/scripting/plugins) // Bundle scripting folder (<kicad.app>/Contents/SharedSupport/scripting/plugins)
pypath += wxT( ":" ) + GetOSXKicadDataDir() + wxT( "/scripting/plugins" ); pypath += wxT( ":" ) + GetOSXKicadDataDir() + wxT( "/scripting/plugins" );
// Bundle wxPython folder (<kicad.app>/Contents/Frameworks/python/site-packages) // Bundle wxPython folder (<kicad.app>/Contents/Frameworks/python/site-packages)
pypath += wxT( ":" ) + Pgm().GetExecutablePath() + wxT( "Contents/Frameworks/python/site-packages" ); pypath += wxT( ":" ) + Pgm().GetExecutablePath() +
wxT( "Contents/Frameworks/python/site-packages" );
// Original content of $PYTHONPATH // Original content of $PYTHONPATH
if( wxGetenv("PYTHONPATH") != NULL ) if( wxGetenv("PYTHONPATH") != NULL )
{ {
...@@ -289,6 +285,7 @@ static bool scriptingSetup() ...@@ -289,6 +285,7 @@ static bool scriptingSetup()
wxLogSysError( wxT( "pcbnewInitPythonScripting() failed." ) ); wxLogSysError( wxT( "pcbnewInitPythonScripting() failed." ) );
return false; return false;
} }
return true; return true;
} }
#endif // KICAD_SCRIPTING #endif // KICAD_SCRIPTING
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application.
* *
* Copyright (C) 2012 NBEE Embedded Systems, Miguel Angel Ajo <miguelangel@nbee.es> * Copyright (C) 2012 NBEE Embedded Systems, Miguel Angel Ajo <miguelangel@nbee.es>
* Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 1992-2015 KiCad Developers, see AUTHORS.txt for contributors.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
...@@ -68,7 +68,7 @@ static void swigAddModule( const char* name, void (* initfunc)() ) ...@@ -68,7 +68,7 @@ static void swigAddModule( const char* name, void (* initfunc)() )
} }
/* Add the builting python modules */ /* Add the builtin python modules */
static void swigAddBuiltin() static void swigAddBuiltin()
{ {
...@@ -140,6 +140,13 @@ bool pcbnewInitPythonScripting( const char * aUserPluginsPath ) ...@@ -140,6 +140,13 @@ bool pcbnewInitPythonScripting( const char * aUserPluginsPath )
#ifdef KICAD_SCRIPTING_WXPYTHON #ifdef KICAD_SCRIPTING_WXPYTHON
PyEval_InitThreads(); PyEval_InitThreads();
char cmd[1024];
// Make sure that that the correct version of wxPython is loaded. In systems where there
// are different versions of wxPython installed this can lead to select wrong wxPython
// version being selected.
snprintf( cmd, 1023, "import wxversion; wxversion.select('%s')", WXPYTHON_VERSION );
PyRun_SimpleString( cmd );
// Load the wxPython core API. Imports the wx._core_ module and sets a // Load the wxPython core API. Imports the wx._core_ module and sets a
// local pointer to a function table located there. The pointer is used // local pointer to a function table located there. The pointer is used
// internally by the rest of the API functions. // internally by the rest of the API functions.
...@@ -181,7 +188,7 @@ void pcbnewFinishPythonScripting() ...@@ -181,7 +188,7 @@ void pcbnewFinishPythonScripting()
} }
#if defined(KICAD_SCRIPTING_WXPYTHON) #if defined( KICAD_SCRIPTING_WXPYTHON )
void RedirectStdio() void RedirectStdio()
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment