Create a gist now

Instantly share code, notes, and snippets.

@zhm /gist:2005158
Last active Oct 14, 2017

What would you like to do?
Building GDAL 1.9 with ESRI FileGDB support on OS X Lion

Building GDAL 1.9.x with ESRI FileGDB support on OS X Lion

  • Download the SDK from ESRI's website
  • Extract the SDK, and put the contents of the directory in a known location, I used ~/local/filegdb. Here's an example path to one of the files: ~/local/filegdb/lib/libFileGDBAPI.dylib
  • I use ~/local/filegdb so it can stay isolated in it's own place. You can put it anywhere, but the next few steps might be different.
  • Go into the directory containing the FileGDB SDK, e.g. ~/local/filegdb
  • ESRI built these dylib's using @rpath's, so to avoid needing to mess with DYLD_LIBRARY_PATH, I updated the @rpath's using install_name_tool. There might be a more elegant way to handle this. If so, comments are welcome!
  • Here are the commands I used to patch the dylibs, this is not required if you want to use DYLD_LIBRARY_PATH yourself:
    install_name_tool -id "$(pwd)/lib/libFileGDBAPI.dylib" ./lib/libFileGDBAPI.dylib
    install_name_tool -change "@rpath/libfgdbunixrtl.dylib" "$(pwd)/lib/libfgdbunixrtl.dylib" ./lib/libFileGDBAPI.dylib
    install_name_tool -id "$(pwd)/lib/libfgdbunixrtl.dylib" ./lib/libfgdbunixrtl.dylib
  • To verify the paths, use otool -L lib/libFileGDBAPI.dylib and otool -L lib/libfgdbunixrtl.dylib and make sure the paths are correct
  • We need to make some changes to the script for GDAL now, since the FileGDB config script hasn't yet been updated for the OSX FileGDB SDK
  • In the GDAL source root, edit the and replace it with:
  • In the GDAL source root, run ./ to re-create the configure script
  • Now run the configure script:
    ./configure --with-fgdb="$HOME/local/filegdb"
  • The configure script has many options, here is the configure line I use for my custom build:, if you have other GDAL builds on your machine (e.g. homebrew) that you don't want to interfere with, I recommend at least using --prefix="$HOME/local" or some other place on your machine besides /usr/local (default for homebrew) or /opt/local (default for MacPorts).
  • If it worked properly, you should see in the output of configure indicating yes for FileGDB support
  • Build it:
    `make && make install`
    which ogr2ogr        # make sure it's the correct ogr2ogr first
    ogrinfo --formats    # list out the formats
    ogrinfo ~/Downloads/test_fgdb.gdb
    #convert FileGDB directly to PostGIS
    ogr2ogr -f "PostgreSQL" PG:"dbname='somedatabase' host='localhost' port='5432'" ~/Downloads/test_fgdb.gdb

Using this build of GDAL in a KyngChaos build of QGIS

# save your current GDAL so you can put it back if you want
cp /Library/Frameworks/GDAL.framework/Versions/1.8/GDAL /Library/Frameworks/GDAL.framework/Versions/1.8/GDAL_orig

# symlink the custom GDAL build to the place QGIS looks
rm /Library/Frameworks/GDAL.framework/Versions/1.8/GDAL
ln -s ~/local/lib/libgdal.dylib /Library/Frameworks/GDAL.framework/Versions/1.8/GDAL

Note: to select one in QGIS, go to Add Vector Layer -> select the Directory radio button -> Select your .gdb directory

I had some problems opening certain FileGDB's. I believe the API only supports FileGDB's created with ArcGIS 10.0+.

More info:

oeon commented Mar 9, 2012

Sincere thanks Zac! So helpful.

oeon commented Mar 9, 2012

Hmm. With version 10.gdb INFO: Open of/Users/me/TestGDAL.gdb' using driver FileGDB' successful. And won't work with .gdb's created in 9.3, as expected. But after following the symlink instructions, I fail adding in QGIS (What Type do you choose after selecting Directory button, btw?) and I cannot convert with ogr2ogr - - it gives no messages or anything, can't find a -flag for more verbose message.


zhm commented Mar 9, 2012

There's a --debug flag you can pass to ogr2ogr that might print some information. Also, in QGIS I didn't select any format, so whatever is selected by default worked for me. I did get errors opening some files in QGIS, but I think they were 9.x gdb's. What format are you trying to convert to with ogr2ogr?

Here's output from my machine:

➜  ~ ogrinfo ~/Downloads/test_fgdb.gdb
INFO: Open of `/Users/zacmcc/Downloads/test_fgdb.gdb'
      using driver `FileGDB' successful.
1: basetable_2 (None)
2: basetable (None)
3: base_table1 (None)
4: test_lines (3D Multi Line String)
5: more_test_lines (3D Multi Line String)
6: test_points (3D Point)
7: test_areas (3D Multi Polygon)

rclark commented Apr 27, 2012

Is it feasible to think that this could be integrated into Homebrew's gdal.rb somehow? That would be extremely slick...


zhm commented Apr 27, 2012

@rclark it would be technically possible to do, but I don't think it'd be accepted because the FileGDB API is available only in binary form and requires you to agree to a license. There are other GDAL plugins besides the GDB one that fall into the same category. See this section of the current formula:

I just keep multiple versions of GDAL on my machine. I use /usr/local for the stable homebrew build and have a ~/local for all other custom built stuff (like this...) and use a shell script to edit my $PATH so I can select which GDAL I want to use.

rclark commented Apr 27, 2012

Thanks for the info. I guess you could make your own gdal.rb too, and just keep it local. I'll have to look into that. Otherwise it sounds like you've got a good setup.

jctull commented May 24, 2012

I was wondering if you had a chance to test this against the 1.9.1 or current svn branches? I was trying to build against the svn trunk today and was unable to get the filegdb api detected when running ./configure after applying the supplied


zhm commented May 24, 2012

I haven't tried against the latest GDAL source. I will test it out when I get a chance and post back here. Thanks!


zhm commented May 24, 2012


I downloaded GDAL 1.9.1 and was able to get it built and working. I updated this gist with the new script. Note that you have to run ./ after changing the file.

Here is the new for 1.9.1:

➜  ~/local/src/gdal-1.9.1 ogrinfo --version
GDAL 1.9.1, released 2012/05/15
➜  ~/local/src/gdal-1.9.1 ogrinfo ~/Downloads/demo.gdb
INFO: Open of `/Users/zacmcc/Downloads/demo.gdb'
      using driver `FileGDB' successful.
1: layer1 (Multi Polygon)
2: layer2 (Multi Polygon)

jctull commented May 25, 2012

Thanks for this--it's exactly what I needed. However, I'm having trouble getting QGIS to work with the custom build of GDAL. GDAL builds successfully as it's able to open the test GDB. However, when I try to open QGIS, it crashes with the following error:

Dyld Error Message:
  Library not loaded: /Library/Frameworks/GDAL.framework/Versions/1.9/GDAL
  Referenced from: /Applications/
  Reason: image not found

I checked and the symlink is pointing to the right place. Any ideas on what else to check? Thanks.


zhm commented Jun 27, 2012


It looks like you're running the new version of QGIS (1.8) that wants the GDAL 1.9 Framework. Did you install the 1.9 framework and change the paths when doing the symlink stuff? I hadn't tested with QGIS 1.8 until now and it did work for me.

When I installed QGIS 1.8, I also installed the GDAL 1.9 Complete Framework from KyngChaos (it won't mess up your custom compiled GDAL...)

# save your current GDAL so you can put it back if you want
cp /Library/Frameworks/GDAL.framework/Versions/1.9/GDAL /Library/Frameworks/GDAL.framework/Versions/1.9/GDAL_orig

# symlink the custom GDAL build to the place QGIS looks
rm /Library/Frameworks/GDAL.framework/Versions/1.9/GDAL
ln -s ~/local/lib/libgdal.dylib /Library/Frameworks/GDAL.framework/Versions/1.9/GDAL

From the looks of the error, it seems like /Library/Frameworks/GDAL.framework/Versions/1.9/GDAL either doesn't exist, or isn't a dylib.

You can run otool -L /Library/Frameworks/GDAL.framework/Versions/1.9/GDAL and it should output all of the shared libraries it loads.

@zhm Thanks for the quick reply. I rebuilt GDAL, this time taking your advice to not mess with DYLD_LIBRARY_PATH and set filegdb_api paths explicitly. Now it works! Thanks for your help.


zhm commented Jun 27, 2012

@caseypt sweet! Glad you got it working!

rburhum commented Jul 14, 2012

Good stuff

jctull commented Nov 3, 2012

@rburhum: Your simplified approach does not work for me using the latest gdal formula with homebrew. This would be a nice and simple method, but the filegdb path is not getting picked up for some reason for me. I used the symlink approach, so maybe that is part of the problem. Also, gdal.rb changed in the past day or so to reflect new approaches for writing install formulae. This might also have something to do with it.

In the absence of this simplified approach, I have resorted to using a custom formula that performs the necessary patching. I use this statement for my homebrew install, assuming the custom gdal formula is in /usr/local/Library/Formula. I use the -v switch so I can verify desired file support is in place during the configuration phase of the install:

brew install --enable-unsupported --with-postgres --enable-armadillo --enable-opencl --complete gdal.rb -v --env=std

This is based off of the most current gdal formula as of this writing,

require 'formula'

def complete?
build.include? "complete"

def postgres?
build.include? "with-postgres"

def mysql?
build.include? "with-mysql"

def no_python?
build.include? "without-python"

def which_python
"python" + python -c 'import sys;print(sys.version[:3])'.strip

def opencl?
build.include? "enable-opencl"

def armadillo?
build.include? "enable-armadillo"

class Gdal < Formula
homepage ''
url ''
sha1 '7eda6a4d735b8d6903740e0acdd702b43515e351'

head ''

option 'complete', 'Use additional Homebrew libraries to provide more drivers.'
option 'with-postgres', 'Specify PostgreSQL as a dependency.'
option 'with-mysql', 'Specify MySQL as a dependency.'
option 'without-python', 'Build without Python support (disables a lot of tools).'
option 'enable-opencl', 'Build with OpenCL acceleration.'
option 'enable-armadillo', 'Build with Armadillo accelerated TPS transforms.'
option 'enable-unsupported', "Allow configure to drag in any library it can find. Invoke this at your own risk."

For creating up to date man pages.

depends_on 'doxygen' => :build if build.head?

depends_on :libpng

depends_on 'jpeg'
depends_on 'giflib'
depends_on 'proj'
depends_on 'geos'
depends_on 'libtiff'
depends_on 'libgeotiff'
depends_on 'sqlite' # To ensure compatibility with SpatiaLite.
depends_on 'freexl'
depends_on 'libspatialite'

depends_on "postgresql" if postgres?
depends_on "mysql" if mysql?

Without Numpy, the Python bindings can't deal with raster data.

depends_on 'numpy' => :python unless no_python?

depends_on 'armadillo' if armadillo?

if complete?
# Raster libraries
depends_on "netcdf" # Also brings in HDF5
depends_on "jasper"
depends_on "poppler"
depends_on "webp"
depends_on "cfitsio"
depends_on "epsilon"
depends_on "libdap"
# Fix a bug in LibDAP detection and patch FileGDB support
def patches; DATA; end unless build.head?

# Vector libraries
depends_on "unixodbc" # OS X version is not complete enough
depends_on "xerces-c"

# Other libraries
depends_on "xz" # get liblzma compression algorithm library from XZutils


def options
['--complete', 'Use additional Homebrew libraries to provide more drivers.'],
['--with-postgres', 'Specify PostgreSQL as a dependency.'],
['--with-mysql', 'Specify MySQL as a dependency.'],
['--without-python', 'Build without Python support (disables a lot of tools).'],
['--enable-opencl', 'Build with OpenCL acceleration.'],
['--enable-armadillo', 'Build with Armadillo accelerated TPS transforms.']

def get_configure_args
args = [
# Base configuration.

  # GDAL native backends.

  # Backends supported by OS X.
  "--with-png=#{(MacOS.version >= :mountain_lion) ? HOMEBREW_PREFIX : MacOS::X11.prefix}",

  # Default Homebrew backends.

  # GRASS backend explicitly disabled.  Creates a chicken-and-egg problem.
  # Should be installed separately after GRASS installation using the
  # official GDAL GRASS plugin.

# Optional Homebrew packages supporting additional formats.
supported_backends = %w[
if complete?
  supported_backends.delete 'liblzma'
  supported_backends.delete 'fgdb'
  args << '--with-liblzma=yes'
  args << '--with-fgdb=/Users/jctull/sources/FileGDB_API'
  args.concat {|b| '--with-' + b + '=' + HOMEBREW_PREFIX}
  args.concat {|b| '--without-' + b} unless build.include? 'enable-unsupported'

# The following libraries are either proprietary, not available for public
# download or have no stable version in the Homebrew core that is
# compatible with GDAL. Interested users will have to install such software
# manually and most likely have to tweak the install routine.
# Podofo is disabled because Poppler provides the same functionality and
# then some.
unsupported_backends = %w[
args.concat {|b| '--without-' + b} unless build.include? 'enable-unsupported'

# Database support.
args << (postgres? ? "--with-pg=#{HOMEBREW_PREFIX}/bin/pg_config" : '--without-pg')
args << (mysql? ? "--with-mysql=#{HOMEBREW_PREFIX}/bin/mysql_config" : '--without-mysql')

# Python is installed manually to ensure everything is properly sandboxed.
args << '--without-python'

# Scripting APIs that have not been re-worked to respect Homebrew prefixes.
# Currently disabled as they install willy-nilly into locations outside of
# the Homebrew prefix.  Enable if you feel like it, but uninstallation may be
# a manual affair.
# TODO: Fix installation of script bindings so they install into the
# Homebrew prefix.
args << "--without-perl"
args << "--without-php"
args << "--without-ruby"

args << (opencl? ? '--with-opencl' : '--without-opencl')
args << (armadillo? ? '--with-armadillo=yes' : '--with-armadillo=no')

return args


def install
# Linking flags for SQLite are not added at a critical moment when the GDAL
# library is being assembled. This causes the build to fail due to missing
# symbols.
# Fortunately, this can be remedied using LDFLAGS.
ENV.append 'LDFLAGS', '-lsqlite3'
# Needed by libdap.
ENV.append 'CPPFLAGS', '-I/usr/include/libxml2' if complete?

# Reset ARCHFLAGS to match how we build.
if MacOS.prefer_64_bit?
  ENV['ARCHFLAGS'] = "-arch x86_64"
  ENV['ARCHFLAGS'] = "-arch i386"

system "echo 'It is necessary to use --env=std.'" unless build.head?
system "./" unless build.head?
system "./configure", *get_configure_args
system "make"
system "make install"

unless no_python?
  # If setuptools happens to be installed, will cowardly refuse to
  # install to anywhere that is not on the PYTHONPATH.
  # Really setuptools, we're all consenting adults here...
  python_lib = lib + which_python + 'site-packages'
  ENV.append 'PYTHONPATH', python_lib

  # setuptools is also apparently incapable of making the directory it's
  # self

  # `python-config` may try to talk us into building bindings for more
  # architectures than we really should.
  if MacOS.prefer_64_bit?
    ENV.append_to_cflags '-arch x86_64'
    ENV.append_to_cflags '-arch i386'

  cd 'swig/python' do
    system "python", "", "install_lib", "--install-dir=#{python_lib}"
    bin.install Dir['scripts/*']

system 'make', 'man' if build.head?
system 'make', 'install-man'
# Clean up any stray doxygen files.
Dir[bin + '*.dox'].each { |p| rm p }


unless no_python?
def caveats
This version of GDAL was built with Python support. In addition to providing
modules that makes GDAL functions available to Python scripts, the Python
binding provides ~18 additional command line tools.

Unless you are using Homebrew's Python, both the bindings and the
additional tools will be unusable unless the following directory is added to



Fix test for LibDAP >= 3.10.

diff --git a/configure b/configure
index 997bbbf..a1928d5 100755
--- a/configure
+++ b/configure
@@ -24197,7 +24197,7 @@ else
rm -f islibdappost310.*
echo '#include "Connect.h"' > islibdappost310.cpp
echo 'int main(int argc, char** argv) { return 0; } ' >> islibdappost310.cpp
-if test -z "${CXX} islibdappost310.cpp -c ${DODS_INC} 2>&1" ; then
+if test -z "${CXX} islibdappost310.cpp -c ${DODS_INC} ${CPPFLAGS} 2>&1" ; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: libdap >= 3.10" >&5
$as_echo "libdap >= 3.10" >&6; }

diff --git a/ b/
index a3ca3a1..6c6205e 100644
--- a/
+++ b/
@@ -1649,14 +1649,14 @@ else

LIBS="-L$with_openjpeg -L$with_openjpeg/lib -lopenjpeg $LIBS"

  • if test -r $with_openjpeg/include/openjpeg-2.0/openjpeg.h ; then
  • EXTRA_INCLUDES="-I$with_openjpeg/include/openjpeg-2.0 $EXTRA_INCLUDES"
  • if test -r $with_openjpeg/include/openjpeg-1.99/openjpeg.h ; then
  • EXTRA_INCLUDES="-I$with_openjpeg/include/openjpeg-1.99 $EXTRA_INCLUDES"
    elif test -r $with_openjpeg/include/openjpeg.h ; then
    EXTRA_INCLUDES="-I$with_openjpeg/include $EXTRA_INCLUDES"
    elif test -r $with_openjpeg/openjpeg.h ; then
  • AC_MSG_ERROR([openjpeg.h not found in $with_openjpeg/include or $with_openjpeg/include/openjpeg-2.0])
  • AC_MSG_ERROR([openjpeg.h not found in $with_openjpeg/include or $with_openjpeg/include/openjpeg-1.99])

@@ -1710,15 +1710,39 @@ elif test "$with_fgdb" = "yes" -o "$with_fgdb" = "" ; then
rm -f testfgdb


  • case "${host_os}" in
  • darwin)
  •  AC_MSG_CHECKING([for libFileGDBAPI.dylib in in $with_fgdb/lib]) 
  •  if test -r $with_fgdb/lib/libFileGDBAPI.dylib ; then
  •    AC_MSG_RESULT([found.])
  • AC_MSG_CHECKING([for in in $with_fgdb/lib])
  • if test -r $with_fgdb/lib/ ; then
  • AC_MSG_RESULT([found.])
  • FGDB_LIB="-L$with_fgdb/lib -lFileGDBAPI"
  • else
  • AC_MSG_ERROR([not found.])
  • fi
  •    FGDB_LIB="-L$with_fgdb/lib -lFileGDBAPI -lfgdbunixrtl"
  •  else
  •    AC_MSG_ERROR([not found.])
  •  fi
  •  ;;
  • *)
  •  AC_MSG_CHECKING([for in in $with_fgdb/lib]) 
  •  if test -r $with_fgdb/lib/ ; then
  •    AC_MSG_RESULT([found.])
  •    FGDB_LIB="-L$with_fgdb/lib -lFileGDBAPI -lfgdblinuxrtl"
  •  else
  •    AC_MSG_ERROR([not found.])
  •  fi
  •  ;;
  • esac
  • #AC_MSG_CHECKING([for in in $with_fgdb/lib])
  • #if test -r $with_fgdb/lib/ ; then
  • #AC_MSG_RESULT([found.])
  • #FGDB_LIB="-L$with_fgdb/lib -lFileGDBAPI"
  • #else
  • #AC_MSG_ERROR([not found.])
  • #fi

AC_MSG_CHECKING([for FileGDBAPI.h in $with_fgdb/include])
if test -r $with_fgdb/include/FileGDBAPI.h ; then
@@ -3415,6 +3453,10 @@ dnl RHEL6
elif test -d /usr/lib/jvm/java-openjdk; then

+dnl OS X and possibly others

  • elif test -d /usr/libexec/java_home; then
  •    with_java=`/usr/libexec/java_home`
    dnl elif test -d /System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers; then
    dnl JAVA_INC="-I/System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers"

@@ -3447,6 +3489,10 @@ elif test "x$with_java" != "x" -a "x$with_java" != "xno"; then
JAVA_INC="-I$JAVA_HOME/include -I$JAVA_HOME/include/freebsd"

  •    elif test -d "$with_java/include"; then
  •        JAVA_HOME="$with_java"
  •        JAVA_INC="-I$JAVA_HOME/include"
  •        AC_MSG_RESULT([yes])
         AC_MSG_ERROR("Cannot find $with_java/include/linux or solaris or freebsd directory.")

    @@ -3483,10 +3529,27 @@ if test "$with_mdb" = "yes" ; then

    if test "x$with_jvm_lib" != "x"; then
    if test -d "$with_jvm_lib"; then

  •        saved_LDFLAGS="$LDFLAGS"
  •        LDFLAGS="$LDFLAGS -L$with_jvm_lib"
  •        AC_CHECK_LIB(jvm,JNI_CreateJavaVM,HAS_LIB_JVM=yes,HAS_LIB_JVM=no,)
  •        LDFLAGS="$saved_LDFLAGS"
  •      dnl OS X needs a check against the JavaVM.framework
  •      if test -d /Library/Java/JavaVirtualMachines; then
  •          saved_CFLAGS="$CFLAGS"
  •          LIBS="$LIBS -framework JavaVM"
  •          AC_CACHE_CHECK([for JNI_CreateJavaVM in JavaVM framework],
  •                         [HAS_LIB_JVM],
  •                         [AC_TRY_LINK([#include <jni.h>],
  •                            [JNI_CreateJavaVM(0, 0, 0);],
  •                            HAS_LIB_JVM=yes,
  •                            HAS_LIB_JVM=no)])
  •          CFLAGS="$saved_CFLAGS"
  •       elif test "x$OS_TYPE" = "xUNIX" ; then
  •          saved_LDFLAGS="$LDFLAGS"
  •          LDFLAGS="$LDFLAGS -L$with_jvm_lib"
  •          AC_CHECK_LIB(jvm,JNI_CreateJavaVM,HAS_LIB_JVM=yes,HAS_LIB_JVM=no,)
  •          LDFLAGS="$saved_LDFLAGS"
  •       fi
    •    if test "$HAS_LIB_JVM" = "yes"; then
             JVM_LIB="-L$with_jvm_lib -ljvm"
             if test "x$with_jvm_lib_add_rpath" = "xyes"; then

    @@ -3718,4 +3781,3 @@ LOC_MSG([ enable pthread support: ${PTHREAD_ENABLED}])
    LOC_MSG([ enable POSIX iconv support:${am_cv_func_iconv}])
    LOC_MSG([ hide internal symbols: ${HAVE_HIDE_INTERNAL_SYMBOLS}])

    diff --git a/frmts/dods/dodsdataset2.cpp b/frmts/dods/dodsdataset2.cpp
    index 0efa1bb..6f63874 100644
    --- a/frmts/dods/dodsdataset2.cpp
    +++ b/frmts/dods/dodsdataset2.cpp
    @@ -50,13 +50,9 @@
    #include <Sequence.h>
    #include <Grid.h>

-#ifdef LIBDAP_310
/* AISConnect.h/AISConnect class was renamed to Connect.h/Connect in libdap 3.10 */
#include <Connect.h>
#define AISConnect Connect
-#include <AISConnect.h>

#include <DDS.h>
#include <DAS.h>
diff --git a/ogr/ogrsf_frmts/dods/ogr_dods.h b/ogr/ogrsf_frmts/dods/ogr_dods.h
index 99f269e..ba114a0 100644
--- a/ogr/ogrsf_frmts/dods/ogr_dods.h
+++ b/ogr/ogrsf_frmts/dods/ogr_dods.h
@@ -61,13 +61,9 @@
#include <Sequence.h>
#include <Grid.h>

-#ifdef LIBDAP_310
/* AISConnect.h/AISConnect class was renamed to Connect.h/Connect in libdap 3.10 */
#include <Connect.h>
#define AISConnect Connect
-#include <AISConnect.h>

#include <DDS.h>
#include <DAS.h>

jctull commented Nov 3, 2012

The formula was mangled from unexpected markdown. Here it is:

I found a world of pain getting FileGDB to work using ESRI drivers, but the good news is that as of GDAL 1.11 an open driver has been included. So now you can use homebrew to install it.

It currently requires a bit of tweaking, but here's my instructions - takes 5 mins.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment