By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
458,110 Members | 1,568 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 458,110 IT Pros & Developers. It's quick & easy.

MacOS X, Postgresql and Aqua Tcl/Tk

P: n/a
Here is how I spent the last couple of days...

Using aqua tcl/tk with postgresql seems to take a bit
of extra work.

With clues from Dan Steffen, I think I have it working...

Here is the contents of my postgresql config command:

../configure --bindir=/usr/local/bin --mandir=/usr/local/share/man \
--enable-recode --with-CXX --enable-odbc --enable-syslog \
--enable-unicode-conversion --enable-multibyte --with-perl --with-tcl
\
--with-tk --with-openssl --with-java \
--with-tclconfig=/Library/Frameworks/Tcl.framework \
--with-tkconfig=/Library/Frameworks/Tk.framework

Starting pgtksh opens the pgtksh window but clicking on the
rascal gives and error message:

set front process failed, -606

The maintainer of the Aqua tcl/tk suggested that I review the
mac-tcl list, and indeed the answer was sorta located therein.

The problem is evidently that OS X does not believe that pgtksh
is a mac application.

A solution is to create a mac application like directory structure.
Here is what I did:
In /usr/local/bin I created a directory hierarchy

pgtksh.app/Contents/MacOS

and in the MacOS directory I placed the pgtksh executable.

Then in /usr/local/bin I created a file "pgtksh" the contents
of this file :
#!/bin/sh
"/usr/local/bin/pgtksh.app/Contents/MacOS/pgtksh" "$@"

I can then invoke pgtksh by name, the script runs and the
executable is properly started.
This approach more or less mirrors what the Aqua Tk wish
application does.

I thought it would be nice not to have to rely on pgtksh
and simply "load" the libpgtcl dynamically into either
wish or tclsh. Regretably there are problems...

The make file that builds libpgtcl uses the "-bundle" directive
in the link step, this builds a Mach O bundle resource which
is not recognized by the "load" command in tcl/wish.

I edited Makefile.shlib and in the darwin part replaced "-bundle"
by "-dynamiclib".
Then in the libpgtcl directory I did a make clean and then make.
This gives a loadable libpgtcl.so file! The desired suffix for
such files is ".dylib". I went back and edited the Makefile.shlib
and arranged that the suffix be ".dylib" and rebuilt the
libpgtcl shared lib. The build produced a libpgtcl.dylib.

When I tried loading libpgtcl.dylib into tclsh I got an error
to effect that libpq.dylib could not be found. I then went
back and built a sharable libpq.dylib and tried again. This
time "loading" libpqtcl.dylib caused a complaint that two entry
points could not be found.

I then tryed building the whole thing with -dynamiclib instead of
-bundle, but soon found out that some components use the bundle
loader.

Finally I rebuilt everything from scratch without using the
-dynamiclib switch and rebuilt by hand the libpgtcl.so file
using the -dynamiclib switch and manually copied the library
to /usr/local/pgsql/lib.

It appears that I can now "load" libpgtcl.so into wish/tclsh
( but I have to specify the full path).

[time passes...]
I did not like the idea of using the full path to load the
postgresql library into tclsh/wish.

After a bit of experimenting I finally did the following
I noticed that the addon packages were stored in /Library/Tcl.
I created a directory libpgtcl2.4 in this directory. I copied
/usr/local/pgsql/lib/libpgtcl.so.2.4 into libpgtcl2.4 and
renamed it to libpgtcl.dylib. I then ran the following command
from tclsh:

pkg_mkIndex /Library/Tcl/libpgtcl2.4

this create a file pkgIndex.tcl in the target directory.
the contents of this file is:
# Tcl package index file, version 1.1
# This file is generated by the "pkg_mkIndex" command
# and sourced either when an application starts up or
# by a "package unknown" script. It invokes the
# "package ifneeded" command to set up package-related
# information so that packages will be loaded automatically
# in response to "package require" commands. When this
# script is sourced, the variable $dir must contain the
# full path name of this file's directory.

package ifneeded Pgtcl 1.4[list load [file join $dir libpgtcl.dylib]]

I was a bit surprised by the appearance of "Pgtcl". However I
can now load the postgresql library by the command:

package require Pgtcl


---------------------------(end of broadcast)---------------------------
TIP 7: don't forget to increase your free space map settings

Nov 23 '05 #1
Share this question for a faster answer!
Share on Google+

This discussion thread is closed

Replies have been disabled for this discussion.