[PATCH] Various OSX fixes & .app bundle building support - Mailing list pgadmin-hackers

From Florian G. Pflug
Subject [PATCH] Various OSX fixes & .app bundle building support
Date
Msg-id 42331BB0.3090405@phlo.org
Whole thread Raw
Responses Re: [PATCH] Various OSX fixes & .app bundle building  ("Florian G. Pflug" <fgp@phlo.org>)
List pgadmin-hackers
Hi

I tried compiling pgadminIII on OSX, and (compared to a few months ago),
things were relativly smooth. There were, howevery, a few problems,
which the attached patches try to solve.

.) When SSL support is disabled in libpq, pgConn::IsSSLconnected is not
included in pgConn, although there other code depends on IsSSLconnected.
The attached pgadmin3-sslfix.diff defined IsSSLconnected even when ssl
is disabled in libpq, but it always returns false in this case.

.) I wanted to build a .app bundle for pgadmin, but I found no support
for this in the build system. I added an option --build-bundle that
basically overwrites --prefix to $(pwd)tmp, and added a PgAdminIII.app
target to Makefile.am. The built bundle includes the pgadmin3 binary
(named PgAdminIII, all shared libraries that binary depends on (system
libs in /usr/lib and /System are excluded), the documentation and the
ui/ folder. This code is in pgadmin3-buildbundle.diff

.) I added code to pgAdmin3.cpp to find the ui and doc folder inside the
bundle, using the SystemPathsCF class from wx (only when __WXMAC__, of
course). Using just SystemPaths would be cleaner, as it should default
to sensible locations on all plattforms, but as of wxmac 2.5.4,
SystemPaths refers to the unix-implemenation, not to the osx
implemenation. This code is in pgadmin3-usebundle.diff

Open Problems:
.) The resulting .app is HUGHE - My app currently has 250Mb - but since
I compiled wxmac and libpq as shared libs (which therefore are copied to
the bundle by my PgAdminIII.app target), and include debug support, this
is not unreasonable. I haven't check how big it gets when it's linked
statically, and is stripped...

.) The bundle doesn't include pg_dump and the slony sqls. I plan to fix
this - but it's hard since the build system currently doesn't know where
to find those.

.) Most dialogs in pgadmin are unuseable on osx, because the window is
too small - I believe that pgadmin uses absolute pixel-based positioning
in the .xrc files, and unfortunatly ui-controls are much bigger on osx..

.) The help window behaves very strange - it has no titlebar, and is
attached to the top of the screen..

I hope this helps - I'd like to see OSX being an supported plattform for
pgadmin3, and I'd like to help to get there..

greetings, Florian Pflug
Index: src/pgAdmin3.cpp
===================================================================
RCS file: /projects/pgadmin3/src/pgAdmin3.cpp,v
retrieving revision 1.111
diff -u -r1.111 pgAdmin3.cpp
--- src/pgAdmin3.cpp    2 Mar 2005 23:47:23 -0000    1.111
+++ src/pgAdmin3.cpp    12 Mar 2005 16:21:00 -0000
@@ -20,6 +20,7 @@
 #include <wx/imagjpeg.h>
 #include <wx/imaggif.h>
 #include <wx/imagpng.h>
+#include <wx/stdpaths.h>

 // Windows headers
 #ifdef __WXMSW__
@@ -87,6 +88,8 @@
 #define DOC_DIR     wxT("/docs")
 #define UI_DIR      wxT("/ui")
 #define COMMON_DIR  wxT("/common")
+#define SCRIPT_DIR  wxT("/scripts")
+#define HELPER_DIR  wxT("/helper")
 #define LANG_FILE   wxT("pgadmin3.lng")


@@ -171,7 +174,7 @@

     // evaluate all working paths

-#ifdef __WXMSW__
+#if defined(__WXMSW__)

     backupExecutable  = path.FindValidPath(wxT("pg_dump.exe"));
     restoreExecutable = path.FindValidPath(wxT("pg_restore.exe"));
@@ -186,6 +189,33 @@
     else
         docPath = loadPath + wxT("/../..") DOC_DIR;

+#elif defined(__WXMAC__)
+
+    //When using wxStandardPaths on OSX, wx defaults to the unix,
+    //not to the mac variants. Therefor, we request wxStandardPathsCF
+    //directly.
+    wxStandardPathsCF stdPaths ;
+    wxString dataDir = stdPaths.GetDataDir() ;
+    if (dataDir) {
+        wxFprintf(stderr, wxT("DataDir: ") + dataDir + wxT("\n")) ;
+    if (wxDir::Exists(dataDir + HELPER_DIR))
+            path.Add(dataDir + HELPER_DIR) ;
+        if (wxDir::Exists(dataDir + SCRIPT_DIR))
+            path.Add(dataDir + SCRIPT_DIR) ;
+        if (wxDir::Exists(dataDir + UI_DIR))
+          uiPath = dataDir + UI_DIR ;
+        if (wxDir::Exists(dataDir + DOC_DIR))
+          docPath = dataDir + DOC_DIR ;
+    }
+
+    if (uiPath.IsEmpty())
+        uiPath = loadPath + UI_DIR ;
+    if (docPath.IsEmpty())
+        docPath = loadPath + wxT("/..") DOC_DIR ;
+
+    backupExecutable  = path.FindValidPath(wxT("pg_dump"));
+    restoreExecutable = path.FindValidPath(wxT("pg_restore"));
+
 #else

     backupExecutable  = path.FindValidPath(wxT("pg_dump"));
@@ -200,6 +230,7 @@
         docPath = DATA_DIR DOC_DIR;
     else
         docPath = loadPath + wxT("/..") DOC_DIR;
+
 #endif


Index: Makefile.am
===================================================================
RCS file: /projects/pgadmin3/Makefile.am,v
retrieving revision 1.34
diff -u -r1.34 Makefile.am
--- Makefile.am    23 Feb 2005 15:32:51 -0000    1.34
+++ Makefile.am    12 Mar 2005 16:20:26 -0000
@@ -27,4 +27,45 @@
         $(top_srcdir)/docs/en_US/*.css $(top_srcdir)/docs/en_US/pgadmin3.hh* \
         $(top_srcdir)/docs/en_US/tips.txt

-
+PgAdminIII.app:
+        @echo "Building Bundle PgAdminIII.app"
+        @test -d PgAdminIII.app || $(mkinstalldirs) PgAdminIII.app
+        @test -d PgAdminIII.app/Contents/MacOS || $(mkinstalldirs) PgAdminIII.app/Contents/MacOS
+        @test -d PgAdminIII.app/Contents/Resources || $(mkinstalldirs) PgAdminIII.app/Contents/Resources
+        @test -d PgAdminIII.app/Contents/SharedSupport || $(mkinstalldirs) PgAdminIII.app/Contents/SharedSupport
+        @test -d PgAdminIII.app/Contents/Frameworks || $(mkinstalldirs) PgAdminIII.app/Contents/Frameworks
+        @cp pkg/mac/PkgInfo PgAdminIII.app
+        @cp pkg/mac/Info.plist PgAdminIII.app/Contents
+        @cp pkg/mac/PgAdminIII.icns PgAdminIII.app/Contents/Resources
+        @$$(@WX_CONFIG@ --rezflags | sed 's/-t[[:space:]]*APPL//') \
+            PgAdminIII.app/Contents/Resources/PgAdminIII.rsrc \
+            -useDF
+        @cp -r $(pkgdatadir)/* PgAdminIII.app/Contents/SharedSupport
+        @cp -r $(bindir)/pgadmin3 PgAdminIII.app/Contents/MacOS/PgAdminIII
+        @echo "Adding all non-standard shared libraries to PgAdminIII.app" ; \
+        cd PgAdminIII.app/Contents ; \
+        todo=MacOS/PgAdminIII ; \
+        while test "$$todo" != ""; do \
+            todo_old=$$todo ; \
+            todo="" ; \
+            for todo_obj in $$todo_old; do \
+                for lib in $$( \
+                    otool -L $$todo_obj | \
+                    sed -n 's|^.*[[:space:]]\([^[:space:]]*\.dylib\).*$$|\1|p' | \
+                    egrep -v '^(/usr/lib)|(/System)' \
+                ); do \
+                    lib_bn="$$(basename "$$lib")" ;\
+                    if ! test -f "Frameworks/$$lib_bn"; then \
+                        cp "$$lib" "Frameworks/$$lib_bn" ; \
+                        install_name_tool \
+                            -id "@executable_path/../Frameworks/$$lib_bn" \
+                            "Frameworks/$$lib_bn" ; \
+                        todo="$$todo Frameworks/$$lib_bn" ; \
+                    fi ; \
+                    install_name_tool -change \
+                        "$$lib" \
+                        "@executable_path/../Frameworks/$$lib_bn" \
+                        "$$todo_obj" ; \
+                done ; \
+            done ; \
+        done ;
Index: acinclude.m4
===================================================================
RCS file: /projects/pgadmin3/acinclude.m4,v
retrieving revision 1.42
diff -u -r1.42 acinclude.m4
--- acinclude.m4    2 Mar 2005 23:47:23 -0000    1.42
+++ acinclude.m4    12 Mar 2005 16:20:27 -0000
@@ -64,6 +64,18 @@
 [pg_static_build=no])
 ])

+############################
+# Static build of pgAdmin3 #
+############################
+AC_DEFUN([ENABLE_APPBUNDLE],
+[AC_ARG_ENABLE(appbundle,
+[ --enable-appbundle   Build PgAdminIII.app],
+[pg_appbundle=yes
+prefix=$(pwd)/tmp
+],
+[pg_appbundle=no])
+])
+
 ########################################
 # Check for PostgreSQL library (libpq) #
 ########################################
@@ -486,3 +498,5 @@
     fi
 fi
 ])
+AC_SUBST(WX_CONFIG)
+
Index: configure.ac
===================================================================
RCS file: /projects/pgadmin3/configure.ac,v
retrieving revision 1.33
diff -u -r1.33 configure.ac
--- configure.ac    29 Nov 2004 21:42:20 -0000    1.33
+++ configure.ac    12 Mar 2005 16:20:27 -0000
@@ -30,6 +30,7 @@
 AC_CHECK_FUNCS([gethostbyname inet_ntoa memmove memset strchr])

 # Custom checks
+ENABLE_APPBUNDLE
 CHECK_WX_CONFIG_BINARY
 CHECK_PGSQL_INCLUDE
 ENABLE_DEBUG
Index: src/db/pgConn.cpp
===================================================================
RCS file: /projects/pgadmin3/src/db/pgConn.cpp,v
retrieving revision 1.63
diff -u -r1.63 pgConn.cpp
--- src/db/pgConn.cpp    13 Feb 2005 18:07:39 -0000    1.63
+++ src/db/pgConn.cpp    12 Mar 2005 16:21:35 -0000
@@ -225,6 +225,12 @@
 {
     return (conn && PQstatus(conn) == CONNECTION_OK && PQgetssl(conn) != NULL);
 }
+#else
+
+bool pgConn::IsSSLconnected()
+{
+    return false ;
+}
 #endif


Index: src/include/pgConn.h
===================================================================
RCS file: /projects/pgadmin3/src/include/pgConn.h,v
retrieving revision 1.30
diff -u -r1.30 pgConn.h
--- src/include/pgConn.h    11 Feb 2005 21:48:50 -0000    1.30
+++ src/include/pgConn.h    12 Mar 2005 16:21:35 -0000
@@ -82,9 +82,7 @@

     void LogError();

-#ifdef SSL
     bool IsSSLconnected();
-#endif
     PGconn *connection() { return conn; }
     void Notice(const char *msg);


Attachment

pgadmin-hackers by date:

Previous
From: "Dave Page"
Date:
Subject: Re: RFC: pgAgent Scheduler Design
Next
From: "Florian G. Pflug"
Date:
Subject: Re: [PATCH] Various OSX fixes & .app bundle building