[Jppy-commit] r313 - in jppy/trunk: . jpilot_plugins

jppy-commit@zanu.org.uk jppy-commit@zanu.org.uk
Wed Jun 4 01:24:37 BST 2008


Author: nicholas
Date: 2008-06-04 01:24:37 +0100 (Wed, 04 Jun 2008)
New Revision: 313

Modified:
   jppy/trunk/ChangeLog
   jppy/trunk/SConstruct
   jppy/trunk/jpilot_plugins/jppy.c
Log:
Try to tidy up library linking. Especially avoid linking python modules to libpython.

Modified: jppy/trunk/ChangeLog
===================================================================
--- jppy/trunk/ChangeLog	2008-04-18 13:29:13 UTC (rev 312)
+++ jppy/trunk/ChangeLog	2008-06-04 00:24:37 UTC (rev 313)
@@ -1,3 +1,11 @@
+2008-06-04  Nicholas Piper  <nicholas@zanu.org.uk>
+
+	* SConstruct: Avoid linking python modules to the python library
+	(http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=445379)
+
+	* jpilot_plugins/jppy.c (plugin_startup): Put dlopen() back -
+	seems to be needed for init_pygobject() to work
+
 2008-4-18  martin f. krafft  <madduck@madduck.net>
 
 	* Remove libpython dependency (Ubuntu bug #184505, Debian bug

Modified: jppy/trunk/SConstruct
===================================================================
--- jppy/trunk/SConstruct	2008-04-18 13:29:13 UTC (rev 312)
+++ jppy/trunk/SConstruct	2008-06-04 00:24:37 UTC (rev 313)
@@ -37,11 +37,10 @@
 opts.Add(PackageOption('rpathoverride','Link with an rpath','no'))
 opts.Add(BoolOption('test','Do you want to run the tests?','yes'))
 opts.Add(BoolOption('profile','Do you want compile with profiling?','no'))
+opts.Add('python_version','Python library version', sys.version[0:3])
 
 env = Environment(options=opts,
                   CCFLAGS=['-g'],
-#                           '-DPYTHON_SHARED_LIB=\\"${python_version}\\"'],
-                  LINKFLAGS=['-L$pisock_library'],
                   CPPPATH=['${mx_datetime_includes}',
                            '${pisock_includes}',
                            '${python_includes}',
@@ -93,6 +92,9 @@
 if not config.CheckPKG('pygtk-2.0 >= 2.4.0'): 
      print 'pygtk-2.0 >= 2.4.0 not found.' 
      Exit(1)     
+
+env.ParseConfig('pkg-config --cflags --libs glib-2.0')
+env.ParseConfig('pkg-config --cflags --libs gtk+-2.0')
      
 #standard stuff
 for hdr in [['Python.h','mx/mxDateTime.h']]:
@@ -100,15 +102,6 @@
           print "You need '%s' to compile this program" % hdr
           Exit(1)
           
-if not config.CheckLibWithHeader('libpisock',
-                                 'pi-socket.h','C','pi_socket_connected(0);'):
-     print "You need libpisock to compile this program"
-     Exit(1)
-
-env.ParseConfig('pkg-config --cflags --libs gtk+-2.0')
-env.ParseConfig('pkg-config --cflags --libs glib-2.0')
-env.ParseConfig('pkg-config --cflags --libs pygtk-2.0') 
-
 vars = distutils.sysconfig.get_config_vars('CC', 'CXX', 'OPT', 'BASECFLAGS',
                                            'CCSHARED', 'LDSHARED', 'SO') 
 for i in range(len(vars)): 
@@ -144,35 +137,52 @@
                                          env['jpilot_plugin_prefix'][1:])
 
 ######### Jpilot
+jpilotEnv = env.Clone()
+jpilotConfig = jpilotEnv.Configure()
+if not jpilotConfig.CheckLibWithHeader('libpisock',
+                                       'pi-socket.h','C','pi_socket_connected(0);'):
+     print "You need libpisock to compile this program"
+     Exit(1)
+jpilotConfig.Finish()
 jpilot_sources = ['log', 'libplugin', 'utils', 'prefs',
                   'plugins', 'sync', 'japanese', 'cp1250',
                   'russian', 'password', 'category', 'otherconv']
 # a bit of a hack. Scons doesn't support shared objects in static libraries.
-libjpilot = env.StaticLibrary(target='jpilot_src/jppy_jpilot',
-                              source = ["jpilot_src/%s.c" % x for x in jpilot_sources],
-                              CCFLAGS="$CCFLAGS -fPIC")
+libjpilot = jpilotEnv.StaticLibrary(target='jpilot_src/jppy_jpilot',
+                                    source = ["jpilot_src/%s.c" % x for x in jpilot_sources],
+                                    CCFLAGS="$CCFLAGS -fPIC")
 libjpilot[0].attributes.shared = True
 
 
 ######### Jppy
-jppymodule = env.SharedLibrary(target = 'jppy/__jpilotmodule',
-                               source = ['python_module_src/jpilot.i',
-                                         'python_module_src/move_into_libpisock.c',
-                                         'python_module_src/jpilot_helpers.c',
-                                         libjpilot] +
-                               glob.glob("python_module_src/pytype*.c") +
-                               ["libversit_src/%s" % x for x in ["vcc.y",
-                                                                 "vobject.c",
-                                                                 "vcaltmp.c"]],
-                               SHLIBPREFIX="",
-                               SHLIBSUFFIX=pyso_ext,
-                               SWIGFLAGS="-python -outdir ./jppy/")
+jppyEnv = jpilotEnv.Clone()
+jppyEnv.ParseConfig('pkg-config --cflags --libs pygtk-2.0')      
+jppymodule = jppyEnv.SharedLibrary(target = 'jppy/__jpilotmodule',
+                                   source = ['python_module_src/jpilot.i',
+                                             'python_module_src/move_into_libpisock.c',
+                                             'python_module_src/jpilot_helpers.c',
+                                             libjpilot] +
+                                   glob.glob("python_module_src/pytype*.c") +
+                                   ["libversit_src/%s" % x for x in ["vcc.y",
+                                                                     "vobject.c",
+                                                                     "vcaltmp.c"]],
+                                   SHLIBPREFIX="",
+                                   SHLIBSUFFIX=pyso_ext,
+                                   SWIGFLAGS="-python -outdir ./jppy/")
 
 ######### Jpilot Plugins
 pluginEnv = env.Clone(SHLIBSUFFIX=pyso_ext,
                       SHLIBPREFIX="lib")
 pluginEnv.Append(CPPPATH=['#/jpilot_src'])
-pluginEnv.Append(CPPDEFINES='JPILOT_PLUGIN_PREFIX=\\"$jpilot_plugin_prefix\\"')
+pluginEnv.Append(CPPDEFINES=['JPILOT_PLUGIN_PREFIX=\\"$jpilot_plugin_prefix\\"',
+                             'PYTHON_SHARED_LIB=\\"libpython${python_version}.so\\"'])
+pluginConfig = pluginEnv.Configure()
+if not pluginConfig.CheckLibWithHeader("libpython%s" % env['python_version'], 
+                                       'Python.h','C','PyErr_Clear();'): 
+     print "You need libpython%s.so to compile this program" % env['python_version']
+     Exit(1) 
+pluginConfig.Finish()
+pluginEnv.Append(LINKFLAGS=distutils.sysconfig.get_config_var('LINKFORSHARED'))
 jpilot_plugins = []
 for source in glob.glob('jpilot_plugins/*.c'):
      jpilot_plugins.append(pluginEnv.SharedLibrary(

Modified: jppy/trunk/jpilot_plugins/jppy.c
===================================================================
--- jppy/trunk/jpilot_plugins/jppy.c	2008-04-18 13:29:13 UTC (rev 312)
+++ jppy/trunk/jpilot_plugins/jppy.c	2008-06-04 00:24:37 UTC (rev 313)
@@ -207,28 +207,33 @@
   jp_init();
   jp_logf(JP_LOG_INFO, "jppy: Starting...\n");
 
-//  if (!dlopen (PYTHON_SHARED_LIB, RTLD_NOW | RTLD_GLOBAL)) {
-//   jp_logf(JP_LOG_FATAL, "\n%s\n", dlerror());
-//   python_is_working = 0;
-//   return 0;
-// }
-// jp_logf(JP_LOG_DEBUG, "jppy: Opened python library\n");
-  
+  // we seem to have to do this, as well as just linking this plugin
+  // to the python library, otherwise init_pygobject() causes the
+  // plugin to stop-and-exit. If we only do this and don't link,
+  // then we get  
+  // error [/usr/lib/jpilot/plugins/libjppy.so: undefined symbol: PyExc_ImportError]
+  if (!dlopen (PYTHON_SHARED_LIB, RTLD_NOW | RTLD_GLOBAL)) { 
+    jp_logf(JP_LOG_FATAL, "\n%s\n", dlerror()); 
+    python_is_working = 0; 
+    return 0; 
+  } 
+  jp_logf(JP_LOG_DEBUG, "jppy: Opened python library\n"); 
+
   Py_SetProgramName("jpilot");
   Py_Initialize();
   PySys_SetArgv(1, python_argv);
 
   jp_logf(JP_LOG_DEBUG, "jppy: Initialized python\n");
 
-  init_pygobject();
 
-  jp_logf(JP_LOG_DEBUG, "jppy: Initialized pygobject\n");
-
   PyRun_SimpleString("import os");  
   PyRun_SimpleString("import sys");
 
   jp_logf(JP_LOG_DEBUG, "jppy: Imported os, sys\n");
 
+  init_pygobject();
+  jp_logf(JP_LOG_DEBUG, "jppy: Initialized pygobject\n");
+
   PyRun_SimpleString("sys.path.insert(0,'%s/.jpilot/python' % (os.getenv('JPILOT_HOME') or os.getenv('HOME')))");
   snprintf(python_line, 254, "sys.path.insert(0,'%s')", JPILOT_PLUGIN_PREFIX);
   PyRun_SimpleString(python_line);




More information about the Jppy-commit mailing list