Search Postgresql Archives

MacOS X, Postgresql and Aqua Tcl/Tk

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux