Hi all,For AIX 4.3.3 the story is, a shared library on AIX is an archive library containing a shared object, not the shared object itself. I think this is the same for AIX 5.1. To create real shared objects, you have to change the 'dll' template to 'plugin' in the *.pro files of sip and PyQt. If you do this, you have the next problem, because the linker searches for *.a and not for *.so files by default, you have to enable runtime linking to do this. This means, that you also have to enable runtime linking for Python.
I have a problem importing libsip during startup of a python/qt application on AIX 5.1.
Some background:
I am trying to get a GUI running on several platforms. The application was originally developed using python and qt on Solaris and Windows, with future platform support in mind. So far, I have managed to get it working on HP-UX 11, without major obstacles.
On AIX, everything started fairly well - I only had to modify few makefiles to add python2.2 to the LIBS list for the tools to build (maybe this was a first indication of some mistake on my part - shouldn't libpython2.2 be included in the LIBS list if it was necessary?).
Once I had all the supporting tools and libraries built, my app built without problems.
But an attempt to run the application resulted in "ImportError: no module named libsip" from qt.py, line "import libsip"
A quick investigation revealed that python searches for libsip.so, but the sip installation only created a link libsip.a -> libsip.so.10.1.0
I tried creating libsip.so -> libsip.so.10.1.0, just to see what would happen, and got a Segmentation Fault on "import libsip"
It appears that my sip library is not built correctly for use on AIX, but I cannot figure out what I am doing wrong.
Can anyone help me out with this problem? Is anyone using python/qt/sip/pyqt on AIX? (there does not seem to be many AIX related posts in the arvchive).
My configuration: - AIX 5.1 - python 2.2.3 - Qt 3.1.2 - sip 3.7 - PyQt 3.7 - qscintilla 1.53
All tools were built with --prefix=... (since I cannot write to /usr/local), python was built with --disable-ipv6 and qt was built with -thread. Other than that, default settings were used.
Thanks in advance, Michal
I had success building Python/Qt/sip/PyQt with VisualAge C++ V6.0 on AIX 4.3.3. If you are using VisualAge C++, the attached patches contain the neccessary changes for Python-2.3, sip-3.8 and PyQt-3.8.1 (This should also work for Python-2.2.3, sip-3.7 and PyQt-3.7) . If you are using GNU g++, the patches may give you at least some hints how to solve the problem.
To understand the whole story read http://www.redbooks.ibm.com/abstracts/sg245674.html (specially the chapter about runtime linking).
Python was configured with the following command:
CC="xlc_r" CXX="xlC_r" LIBS="-lC" ./configure --with-threads --with-cxx=xlC_r --prefix=/usr/local
When building PyQt you will get a lot of warning messages about duplicate symbols, simply ignore them. After building, it is safe to strip the libqt*cmodule.so files.
Good luck, Ulli
diff -uNr Python-2.3.orig/configure Python-2.3/configure --- Python-2.3.orig/configure 2003-07-24 00:17:27.000000000 +0200 +++ Python-2.3/configure 2003-09-11 12:50:30.000000000 +0200 @@ -1377,6 +1377,9 @@ # but used in struct sockaddr.sa_family. Reported by Tim Rice. SCO_SV/3.2) define_xopen_source=no;; + # + AIX/4*) + define_xopen_source=no;; esac if test $define_xopen_source = yes @@ -1473,7 +1476,8 @@ else case $ac_sys_system in - AIX*) CC=cc_r + AIX*) CC=xlc_r + OPT="$OPT -O2 -qmaxmem=8000" without_gcc=;; BeOS*) case $BE_HOST_CPU in @@ -3213,7 +3217,7 @@ $ac_sys_release -eq 4 -a `uname -r` -ge 2 ; then exp_extra="." fi - LINKCC="\$(srcdir)/Modules/makexp_aix Modules/python.exp $exp_extra \$(LIBRARY); $LINKCC";; + LINKCC="CreateExportList Modules/python.exp \$(LIBRARY); $LINKCC";; dgux*) LINKCC="LD_RUN_PATH=$libdir $LINKCC";; Monterey64*) @@ -9602,8 +9606,8 @@ then case $ac_sys_system/$ac_sys_release in AIX*) - BLDSHARED="\$(srcdir)/Modules/ld_so_aix \$(CC) -bI:Modules/python.exp" - LDSHARED="\$(BINLIBDEST)/config/ld_so_aix \$(CC) -bI:\$(BINLIBDEST)/config/python.exp" + BLDSHARED="ld -bnoentry -G -bexpall -lc -lm" + LDSHARED="ld -bnoentry -G -bexpall -lc -lm" ;; BeOS*) BLDSHARED="\$(srcdir)/Modules/ld_so_beos $LDLIBRARY" @@ -9709,7 +9713,7 @@ if test -z "$LINKFORSHARED" then case $ac_sys_system/$ac_sys_release in - AIX*) LINKFORSHARED='-Wl,-bE:Modules/python.exp -lld';; + AIX*) LINKFORSHARED='-brtl -bE:Modules/python.exp';; hp*|HP*) LINKFORSHARED="-Wl,-E -Wl,+s";; # LINKFORSHARED="-Wl,-E -Wl,+s -Wl,+b\$(BINLIBDEST)/lib-dynload";; @@ -10099,10 +10103,11 @@ case "$ac_sys_system" in AIX*) echo "$as_me:$LINENO: checking for genuine AIX C++ extensions support" >&5 echo $ECHO_N "checking for genuine AIX C++ extensions support... $ECHO_C" >&6 + LIBS="-lC $LIBS" cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" #include "confdefs.h" -#include "/usr/lpp/xlC/include/load.h" +#include <load.h> #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" @@ -12347,7 +12352,7 @@ if test -z "$DYNLOADFILE" then case $ac_sys_system/$ac_sys_release in - AIX*) DYNLOADFILE="dynload_aix.o";; + AIX*) DYNLOADFILE="dynload_shlib.o";; BeOS*) DYNLOADFILE="dynload_beos.o";; hp*|HP*) DYNLOADFILE="dynload_hpux.o";; Darwin/*) DYNLOADFILE="dynload_next.o";;
diff -uNr sip-x11-commercial-3.8.orig/build.py sip-x11-commercial-3.8/build.py --- sip-x11-commercial-3.8.orig/build.py 2003-08-17 11:24:16.000000000 +0200 +++ sip-x11-commercial-3.8/build.py 2003-09-11 12:44:48.000000000 +0200 @@ -45,7 +45,7 @@ debugMode = "release" licType = None gccFlags = [] -blx_config = ["dll"] +blx_config = ["plugin"] def usage(rcode = 2): @@ -1098,12 +1098,21 @@ fixInstallTarget() popDir(olddir) + global platPyLibDir, platPyLibName + if sys.platform == 'aix4': + makefilePatches["LINK"] = [re.compile("(^LINK.*)$",re.M), "LINK = cc -qmkshrobj=0 -G "] + makefilePatches["LINK_TARGET"] = [re.compile("(^[ \\t]*makeC\\+\\+SharedLib.*)$",re.M), '\t$(LINK) -o $(TARGET) $(LFLAGS) $(OBJECTS) $(OBJMOC) $(LIBS)'] + inform("Creating SIP module Makefile.") olddir = pushDir("siplib") buildMakefile("siplib.pro") fixInstallTarget(1) popDir(olddir) + if sys.platform == 'aix4': + del makefilePatches["LINK"] + del makefilePatches["LINK_TARGET"] + # Generate the top-level Makefile. inform("Creating top level Makefile.") copyToFile("sip.pro.in","TEMPLATE = subdirs\nSUBDIRS = sipgen siplib\n")
diff -uNr PyQt-x11-commercial-3.8.1.orig/build.py PyQt-x11-commercial-3.8.1/build.py --- PyQt-x11-commercial-3.8.1.orig/build.py 2003-09-06 15:36:16.000000000 +0200 +++ PyQt-x11-commercial-3.8.1/build.py 2003-09-11 12:59:40.000000000 +0200 @@ -839,7 +839,7 @@ elif sipVersion == 4: proPatches["DLL"] = [re.compile("@BL_DLL@",re.M), "plugin"] else: - proPatches["DLL"] = [re.compile("@BL_DLL@",re.M), "dll"] + proPatches["DLL"] = [re.compile("@BL_DLL@",re.M), "plugin"] proPatches["LIBS"] = [re.compile("@BL_SIPMODDIR@",re.M), escape(sipModuleDir)] # Check the Qt installation. @@ -1184,6 +1184,13 @@ else: target = target + "module" + if sys.platform == 'aix4': + add_opt = "" + if mname == "qt": + add_opt = "-Wl,-bbigtoc" + makefilePatches["LINK"] = [re.compile("(^LINK.*)$",re.M), "LINK = cc -qmkshrobj=0 -G %s " % add_opt] + makefilePatches["LINK_TARGET"] = [re.compile("(^[ \\t]*makeC\\+\\+SharedLib.*)$",re.M), '\t$(LINK) -o $(TARGET) $(LFLAGS) $(OBJECTS) $(OBJMOC) $(LIBS)'] + # Generate the Makefile. inform("Generating the Makefile for the %s module." % (mname)) @@ -1206,6 +1213,10 @@ except: pass + if sys.platform == 'aix4': + del makefilePatches["LINK"] + del makefilePatches["LINK_TARGET"] + if sipVersion == 3: # Compile the Python part of the module. pyname = mname + ".py"