home : GNOME : Solaris_Port

Solaris Port



In late 1998 I first tried porting GNOME 0.9 and Enlightenment to Solaris and created the following website explaining how to get things working. I continued updating it through the 1.05 timeframe. Since this was my first involvement with the GNOME project I keep this information available even though it isn't really useful anymore. Until about 2001 I continued helping users who would send me emails with related questions. Though questions dwindled after Paul Bamfather began offering GNOME 1.4 packages via his (no longer available "Building GNOME on Solaris" website.

Since that time I have been involved with Sun's GNOME 1.4 pre-release, GNOME 2.0 for Solaris 8 & 9, and the GNOME releases for the Java Desktop System.




Critcisim, Comments, and Process for Installing Gnome,  Enlightenment,
and related software on a Sun Sparc IPX (with WiTech chip) running Sparc
Solaris 2.7.

by: Brian A. Cameron
Process started 04/01/1999 (April Fool's Day)

My environment at time of build (aside from vanilla Sparc Solaris 2.7):
  + Compiler = gcc 2.95
  + install  = from GNU fileutils 4.0
  + bison    = bison 1.2.7
  + Make     = gmake 3.77
  + gzip     = gzip 1.2.4a
  + Perl     = perl 5.004.04

  + I had no problems building and installing the above packages, btw.

I downloaded all the following tarballs from: 
  + www.enlightenment.org
  + www.gnome.org

except as indicated (Berkeley libdb 2.7.3 comes to mind).

According to Enlightenment's doc page, the following is the correct order
to build the Enlightenment application:

   STAGE 1 BUILD libgr, libZ, libgif or libungif, libpng, libtiff, esd, glib
   STAGE 2 BUILD ImageMagick, Gtk
   STAGE 3 BUILD Gtk-perl, Imlib, fnlib
   STAGE 4 BUILD Enlightenment

BEGIN OF STAGE 1 BUILD

libgr
-----

I recommend that you do not build libgr.  It contains older versions
of the other "STAGE 1" graphical libraries (libgif, libtiff, etc.).
At one time, this library provided an easier way to install these
many libraries, since you could install all of these libraries by
just building this one libgr package.  However, the only versions
of libgr that I have seen contain such old & obsolete versions of
these libraries that they are useless in building the latest 
Gnome and Enlightenment.  Unless you find an updated libgr,
avoid using this shortcut.  You get better results building
the rest of the "STAGE 1" libraries one at a time.

Zlib 1.1.2
----------
Installed in: /usr/local/zlib

+ dependencies: none
+ Build instructions in Makefile.  This could use an "INSTALL" doc.
+ Built & installed without a hitch

JPEG 6b (62)
------------
Installed in: /usr/local/jpeg

+ dependecies: none
+ Build instructions in "install.doc".  Why do not they use the
  convention of naming this file "INSTALL"?
+ Built & installed without a hitch
+ Had to type "make install-lib" in addition to make install.  This
  info was buried in the install.doc.  Otherwise the libraries are
  not installed.  I wasted time thinking the libraries were installed
  then finding out they weren't when I ran libgtk's configure script
  and it complained they weren't there.
+ Other than the above annoyances, built & installed without a hitch.

libungif-3.0
------------
Installed in: /usr/local/gif

+ dependencies:  The makefile claims it prefers that automake is
  installed (which I do not have), but says it only needs this if
  I modified certain Makefile/configure files (which I did not).
  It also says it likes Perl installed (which I have) so it can
  run self-tests.
+ Build died in the "util" directory with the following error
  message
+ Make check doesn't seem to do anything.  Disappointing...

  ---(begin error msg excerpt)---
  ...
  Making all in util
  make[1]: Entering directory `/export/home/install/builds/libs/gif/libungif-3.0/util'
  Makefile:545: *** Recursive variable `CFLAGS' references itself (eventually).  Stop.
  ...
  ---(end error msg excerpt)---

  Line 87 of the "Makefile" in the "util" directory reads as follows:

  ---(begin Makefile excerpt)---
  CFLAGS = $(CFLAGS)
  ---(end Makefile excerpt)---

+ It built successfully after I deleted this line and re-ran make.  Could 
  this problem be because I am not using automake?

libpng 1.0.1
------------
Installed in:/usr/local/png

+ dependencies: zlib
+ What's up with the way you have to build this?  It *requires*
  that the build directory look as follows:

  ---(begin INSTALL file excerpt)---
  Your directory structure should look like this:

     ..       (the parent directory)
        libpng  (this directory)
            INSTALL (this file)
            README
            *.h
            *.c
            scripts
               makefile.*
            pngtest.png
            etc.
        zlib
            README
            *.h
            *.c
            contrib
            etc.
  ---(end INSTALL file excerpt)---

  I managed this with symbolic links, so I wasn't strictly forced to use their
  structure.  Then I had to manually copy the makefile and edit it.  This 
  could use a "configure" script.
+ Other than all that, it built & installed ok.

libtiff v3.4beta037
-------------------

+ I do not like that the "configure" script doesn't let you specify "--prefix",
  but at least the configure does ask this question with a prompt.

audiofile 0.1.5
---------------
Installed in /usr/local/audiofile
+ dependencies: none

+ built and installed without a hitch
+ Only problem was that esound 0.2.8 requires audiofile 0.1.5.  I grabbed 
  audiofile 0.1.6 first from www.gnome.org, but after I built it I couldn't
  find an version of esound that would build from it.  So I was forced to
  find and build version 0.1.5. 

esound 0.2.8
-------------
Installed in /usr/local/esound
+ dependencies: audiofile 0.1.5 (not 0.1.6)

+ Build & installed with no problem.

  However when I try and run it I ran into a number of problems.  My
  problems are caused because the Sun IPX machine I am using has a
  SUNW,am79c30 driver.  This ancient sound driver only supports 
  8000 Hz sample rate, u-law encoding, 8-bit precision and is mono.
  This configuration is not supported by the esd.  If you are using
  a newer Sun machine, you probably won't have the following problems.

  I get the following error message when esd tries to start:

  ---(begin esound output)---
  initializing...
  No idea how to handle device `SUNW,am79c30', FIXME
  fatal error configuring sound, /dev/dsp
  ---(end esound output)---

  Talked with the author of ESD and he suggested I try modifying
  lines 54-56 of audio_solaris.c which read as follows:

  ---(begin audio_solaris.c extract)---
    if ( (strcmp(adev.name, "SUNW,CS4231") != 0)
        && (strcmp(adev.name, "SUNW,sb16")  != 0)
        && (strcmp(adev.name, "SUNW,dbri") != 0)  )
  ---(start audio_solaris.c extract)---

  to...

  ---(start modified audio_solaris.c extract)---
    if ( (strcmp(adev.name, "SUNW,CS4231") != 0)
        && (strcmp(adev.name, "SUNW,sb16")  != 0)
        && (strcmp(adev.name, "SUNW,dbri") != 0)
        && (strcmp(adev.name, "SUNW,am79c30") != 0)  )
  ---(start modified audio_solaris.c extract)---

  When I tried to run it with this change, it now generates this error...

  ---(begin esound output)---
   initializing...
   AUDIO_SETINFO: Invalid argument
   fatal error configuring sound, /dev/dsp
  ---(end esound output)---

  That did not work.  Remembering that the SUNW,am79c30 driver only
  supports 8000 Hz sample rate, u-law encoding, 8-bit precision and
  is mono.  So, I changed lines 86 to 113 of audio_solaris.c as
  follows:

  ---(begin audio_solaris.c extract)---
      AUDIO_INITINFO(&ainfo);

      ainfo.play.sample_rate = esd_audio_rate;

      if ((esd_audio_format & ESD_MASK_CHAN) == ESD_STEREO)
        ainfo.play.channels = 2;
      else
        ainfo.play.channels = 1;

      if ((esd_audio_format & ESD_MASK_BITS) == ESD_BITS16)
        ainfo.play.precision = 16;
      else
        ainfo.play.precision = 8;

      ainfo.play.encoding = AUDIO_ENCODING_LINEAR;
      ainfo.play.gain = gain;
      ainfo.play.port = port;
      ainfo.play.balance = AUDIO_MID_BALANCE;
      ainfo.play.buffer_size = bsize;

      if (ioctl(afd, AUDIO_SETINFO, &ainfo) == -1)
        {
          perror("AUDIO_SETINFO");
          close(afd);
          esd_audio_fd = -1;
          return -1;
        }
  ---(end audio_solaris.c extract)---

  to...

  ---(begin modified audio_solaris.c extract)---
      AUDIO_INITINFO(&ainfo);

      if (strcmp(adev.name, "SUNW,am79c30") == 0)
      {
         ainfo.play.sample_rate = 8000;
         ainfo.play.channels = 1;
         ainfo.play.precision = 8;
         /* The next line can also be set to AUDIO_ENCODING_ULAW, 
          * though it sounded slightly worse to me. */
         ainfo.play.encoding = AUDIO_ENCODING_ALAW;

         /* Docs say that the balance is ignored in mono */
      }
      else
      {
         ainfo.play.sample_rate = esd_audio_rate;

         if ((esd_audio_format & ESD_MASK_CHAN) == ESD_STEREO)
           ainfo.play.channels = 2;
         else
           ainfo.play.channels = 1;

         if ((esd_audio_format & ESD_MASK_BITS) == ESD_BITS16)
           ainfo.play.precision = 16;
         else
           ainfo.play.precision = 8;

         ainfo.play.encoding = AUDIO_ENCODING_LINEAR;
         ainfo.play.balance = AUDIO_MID_BALANCE;
      }

      ainfo.play.gain = gain;
      ainfo.play.port = port;
      ainfo.play.buffer_size = bsize;

      if (ioctl(afd, AUDIO_SETINFO, &ainfo) == -1)
        {
          perror("AUDIO_SETINFO");
          close(afd);
          esd_audio_fd = -1;
          return -1;
        }
  ---(end modified audio_solaris.c extract)---

  Now I get sound, but it sounds awful.  Again I talked with the
  author of ESD and determined that this is because ESD only
  supports LINEAR encoding, and not U-LAW encoding.  The author
  told me that he did not have enough time to help me with this
  issue.  If you have these sorts of problems, perhaps this
  information will be useful to you.

glib 1.2.1
----------
Installed in /usr/local/gtk
+ dependencies: none
+ Built and installed wtihtout a hitch.

freetype 1.1
------------
Installed in /usr/local/freetype
+ dependencies: none

+ Had to edit lib/arch/unix/Makefile line 14

   ---(begin Makefile edit)---
   14c14
   < INSTALL = .././install-sh -c
   ---
   > INSTALL = ../../.././install-sh -c
   ---(end Makefile edit)---

+ Had to edit test/arch/unix/Makefile line 17

   ---(begin Makefile edit)---
   17c17
   < INSTALL = .././install-sh -c
   ---
   > INSTALL = ../../.././install-sh -c
   ---(end Makefile edit)---


FINISH OF STAGE 1 BUILD, START OF STAGE 2 BUILD

ImageMagick 4.0.5
-----------------
+ dependencies: JPEG, Zlib, HDF, PNG, TIFF, DPS, freetype
+ optional dependencies I do not have FlashPIX, JBIG, MPEG, HDF.
     DPS (Ghostscript)
+ built & installed without a hitch.

gtk 1.2.1
---------
Installed in /usr/local/gtk
+ dependencies: glib 1.2.1
+ built & installed without a hitch.

FINISH OF STAGE 2 BUILD, START OF STAGE 3 BUILD

imlib 1.9.4
-----------
Installed in /usr/local/imlib
+ dependencies: gtk >= 1.1.9, jpeg, gif, png

+ compile failed when building imlib_config.c in directory utils

   ---(begin makefile output excerpt)---
   In file included from /usr/include/locale.h:51,
                 from imlib_config.c:35:
   /usr/include/libintl.h:31: parse error before `const'
   /usr/include/libintl.h:32: parse error before `const'
   /usr/include/libintl.h:33: parse error before `const'
   /usr/include/libintl.h:34: parse error before `const'
   /usr/include/libintl.h:35: parse error before `const'
   imlib_config.c: In function `add_onoff_visual':
   imlib_config.c:1293: warning: passing arg 2 of `gtk_clist_new_with_titles'
      from incompatible pointer type
   ---(end makefile output excerpt)---

   I was able to fix this by moving the "#include " as
   follows.  Excerpt includes lines 1 to 35 of the file imlib_config.c

   ---(begin imlib_config.c excerpt)---
   #include 
   #ifndef GNOMELOCALEDIR
   #define GNOMELOCALEDIR "/usr/share/locale"
   #endif
   #ifdef ENABLE_NLS
   #    include 
   #    define _(String) gettext (String)
   #    ifdef gettext_noop
   #        define N_(String) gettext_noop (String)
   #    else
   #        define N_(String) (String)
   #    endif
   #else
   /* Stubs that do something close enough.  */
   #    define textdomain(String) (String)
   #    define gettext(String) (String)
   #    define dgettext(Domain,Message) (Message)
   #    define dcgettext(Domain,Message,Type) (Message)
   #    define bindtextdomain(Domain,Directory) (Domain)
   #    define _(String) (String)
   #    define N_(String) (String)
   #endif

   #include 
   #include 
   #include 
   #include 
   #include 
   #include 
   #include 
   #include 
   #include 
   #include 
   #include 
   #include 
   ---(end imlib_config.c excerpt)---

   to

   ---(begin imlib_config.c excerpt)---
   #include 
   #include 
   #ifndef GNOMELOCALEDIR
   #define GNOMELOCALEDIR "/usr/share/locale"
   #endif
   #ifdef ENABLE_NLS
   #    include 
   #    define _(String) gettext (String)
   #    ifdef gettext_noop
   #        define N_(String) gettext_noop (String)
   #    else
   #        define N_(String) (String)
   #    endif
   #else
   /* Stubs that do something close enough.  */
   #    define textdomain(String) (String)
   #    define gettext(String) (String)
   #    define dgettext(Domain,Message) (Message)
   #    define dcgettext(Domain,Message,Type) (Message)
   #    define bindtextdomain(Domain,Directory) (Domain)
   #    define _(String) (String)
   #    define N_(String) (String)
   #endif

   #include 
   #include 
   #include 
   #include 
   #include 
   #include 
   #include 
   #include 
   #include 
   #include 
   #include 
   ---(end imlib_config.c excerpt)---

   Note: I just moved the "locale.h" include line to the top of the file.
   It needs to go before the include of "config.h" or else it won't compile.
   Although it compiles, it generates the following warning:

   ---(begin makefile output excerpt)---
   imlib_config.c: In function `add_onoff_visual':
   imlib_config.c:1293: warning: passing arg 2 of `gtk_clist_new_with_titles'
    from incompatible pointer type
   ---(end makefile output excerpt)---

+ Other than all that it built & installed okay

fnlib 0.4
---------
Installed in: /usr/local/fnlib
+ dependencies: imlib >= 1.8.0, 

+ Installed & built okay.  Install takes forever.

FINISH OF STAGE 3 BUILD, NOW ONTO GNOME! (before actually building E)

According to Gnome's doc page, the following is the correct order to build
the Gnome application:

   glib, gtk+, imlib, ORBit, gtk-doc (*), libgtop, gtk-engine, gnome-libs
   gnome-core, control-center, gnome-print (*), mc, gnome-guile,
   gnome-python (*), gnome-objc, gtk-- (*), anything else...

Anything else for me includes:
   gnome-utils, gnome-admin, gnome-games, gnome-network

* - Couldn't find these to install.

Obviously I already have glib, gtk+ and imlib installed, so onto the rest...

ORBit 0.4.2
-----------
Installed in: /usr/local/ORBit
+ dependencies: glib >= 1.2.0

+ built & installed without a hitch

gtk-engines 0.5
---------------
Installed in: /usr/local/gtk

+ dependencies: gtk >= 1.1.13, imlib >= 1.8
+ built & installed without a hitch.

libdb-2.7.3
------------
Installed in: /usr/local/BerkeleyDB
+ dependencies: none
+ First time I tried to run gnome-lib 1.0.9's "configure" script, it
  generated the following error:

  ---(being configure output)---
  checking for dbopen... no
  checking for dbopen in -ldb... no
  checking for db_open in -ldb... no
  configure: error: Berkeley db library required for Gnome
  ---(end configure output)---

+ After building libdb, gnome-libs configure still failed because I did
  not use the --enable-compat185 argument with the libdb-2.7.3 "configure"
  script.
+ Built it again with that "configure" option, and gnome-libs is happy.
+ built & installed with no problems, other than the above confusion.

libXpm 3.4k
-----------
Installed in: /usr/local/xpm

+ dependencies: none
+ Downloaded from ftp://ftp.x.org/contrib/libraries/xpm-3.4k.tar.gz
+ Building version 1.0.8 it generated the following error message:

  ---(begin compiler error message)---
  In file included from /usr/local/include/jpeglib.h:24,
                   from plc.h:107,
                   from readXPM.c:133:
  /usr/local/include/jconfig.h:12: warning: `HAVE_STDLIB_H' redefined
  ../config.h:328: warning: this is the location of the previous definition
  readXPM.c:136: X11/xpm.h: No such file or directory
  ---(end compiler error message)---

  This problem went away after building xpm 3.4k.

+ Note that to build the shared library, you have to use the "imake"
  procudure (which is in /usr/X/bin) which creates Makefiles that you
  edit as follows to get to work with gcc:

  Remove "-Xc" from LINTOPTS, remove "-Xc -xF -xcg92" from CCOPTIONS,
  change PICFLAGS from "-Kpic" to "-fpic" in the top level and three
  lower level Makefiles.

+ Command to build was "make CC=gcc", command to install was "make install"
+ If you use the 3 "Makefile.noX" files in the cxpm, lib, and sxpm
  directories to get it to install in a directory other than the default.

libgtop-1.0.1
-------------

+ Although the Gnome web page claims it should be built before gnome-libs, when
  I ran its configure script, it claims it wants Gnome to be installed first.
+ The documentation states that this isn't supported for Solaris.  Since it is
  an optional enhancement to gnome-core, I will do without this for now.

gnome-libs 1.0.9
----------------
Installed in: /usr/local/gnome

+ dependencies: db 2.7.3, xpm 3.4k, imlib >= 1.9, audiofile >= 0.1.5,
                esd >= 0.2.5, gtk >= 1.2.0, ORBit, jpeg, gif, tiff, zlib,
                ungif, png
+ I wish the gnome-libs configure script had caught the fact I did not have
  xpm 3.4k installed.  I did not find out until after I tried building and
  got a compile error.
+ I wish the gnome-libs configure script told me to use the libdb-2.7.3
  "--enable-compat185" option, when it noticed that the libdb-2.7.3 was
  not installed.

  The following error message was generated when I was trying to build
  gnome-libs:

  ---(begin compiler error message)---
  In file included from gnorba.h:6,
                   from goad.c:11:
  ../gnome.h:7: gdk_imlib.h: No such file or directory
  In file included from ../libgnomeui/libgnomeui.h:7,
                   from ../gnome.h:9,
                   from gnorba.h:6,
                   from goad.c:11:
  ---(end compiler error message)---

  To fix this I added "-I$(GDK_IMLIB_CFLAGS) to the INCLUDES macro on
  line 160 of the libgnorba Makefile and to line 153 of the
  test-suite/tests Makefile
+ Other than all the above, it built & installed okay.

libghttp-1.0.2
--------------
Installed in: /usr/local/gnome

+ Build of gnome-core 1.0.5 failed on applets/slashapp.c complaining that
  ghttp.h doesn't exist.  This problem went away after I built & 
  installed this small library.
+ Built & installed okay.

gnome-core 1.0.5
----------------
Installed in: /usr/local/gnome

+ dependencies: gtk >= 1.2.0, libGtop >= 1.0.0 (optional), ESD >= 0.2.5,
  ghttp-1.0.2.
+ I wish that the configure script caught the fact I did not have libghttp
  installed.
+ I was annoyed that this configure script did not let me choose my
  imlib prefix.
+ Had to modify line 81 of the Makefile in help-browser, adding "-lXpm" to
  the GNOMEUI_LIBS macro.  Otherwise gnome-help-browser wouldn't link.
+ Had to modify line 85 of the Makefile in applets/slashapp, adding
  "-lghttp" to the GNOMEUI_LIBS macro to get the slash_applet to link.

control-center-1.0.5
--------------------
Installed in: /usr/local/gnome

+ dependencies: orbit, gtk >= 1.1.16, esd >= 0.2.5, imlib 1.8.2
+ Had to modify line 80 of the Makefile in capplets/theme-switcher, adding
  "-lXpm" to the GNOMEUI_LIBS macro.  Otherwise theme-selector-applet
  wouldn't link.

mc 4.5.30
---------
Installed in: /usr/local/gnome

+ dependencies: glib >= 1.2.0, xpm, orbit,

+ Crashed in gnome/plain-gmc when linking plain-gmc with the following error:

  ---(begin link error message)---
  Undefined                       first referenced
   symbol                             in file
  MAX                                 gscreen.o
  ---(end link error message)---

+ I copied the following code from regex.c to gscreen.c

  ---(begin code excerpt)---
  #undef MAX
  #undef MIN
  #define MAX(a, b) ((a) > (b) ? (a) : (b))
  #define MIN(a, b) ((a) < (b) ? (a) : (b))
  ---(end code excerpt)---

Please verify that the configuration values are correctly
set in the mc.ext file in /usr/local/gnome/lib/mc

gnome-guile 1.3
---------------
Installed in: /usr/local/gnome

+ Built & installed without a hitch! 

gnome-objc 1.0.2
----------------
Installed in: /usr/local/gnome

+ dependencies: gtk >= 1.2.0, orbit

+ Built & installed without a hitch!

gnome-admin 1.0.2
-----------------

+ Fails when linking gulp with the following error message:
  ---(begin linker error message)---
  warning: Text relocation remains                referenced
      against symbol                  offset      in file
  __objc_class_name_Gtk_CheckButton   0x9cc       gulp.o
  __objc_class_name_Gtk_Table         0x9c0       gulp.o
  __objc_class_name_Gtk_Label         0x9c4       gulp.o
  __objc_class_name_Gtk_VBox          0x9c8       gulp.o
  __objc_class_name_Gnome_App         0x9d8       gulp.o
  __objc_class_name_Gtk_Button        0x9d0       gulp.o
  __objc_class_name_Gtk_CList         0x9b4       gulp.o
  __objc_class_name_Gnome_AppWin      0x9dc       gulp.o
  ---(end linker error message)---
+ I could not get this to build.

gnome-games 1.0.2
-----------------
Installed in: /usr/local/gnome

+ dependencies: gtk >= 1.2.0
+ Built & installed without a hitch.

gnome-utils 1.0.1
-----------------
Installed in: /usr/local/gnome

+ dependencies: orbit, gtk >= 1.2.0, gnome-objc, gnome-guile

+ Had to modify line 75 of the Makefile in gtt, adding "-lXpm" to the
  GNOMEUI_LIBS macro.  Otherwise gtt wouldn't link.  Also had to add
  this to line 75 of the Makefile in mini-utils/gshutdown or gshutdown
  wouldn't link.  Added it to the Makefile in mini-utils/gw otherwise
  gw wouldn't link.  Added it to the Makefile in mini-utils/gnome-run
  otherwise gnome-run wouldn't link.  Added it to the Makefile in
  mini-utils/gless otherwise gless wouldn't link.  Added it to the
  Makefile in gdialog or else gdialog wouldn't link
+ Other than the above, built & installed without a hitch.

gnome-network 1.0.1
-------------------
Installed in: /usr/local/gnome

+ dependencies: orbit, gtk >= 1.2.0, guile, Xpm, gnome-objc

+ Died while building gnome-ppp-chat.c in gnome-ppp/gnome-ppp-chat.

  --(start error message)--
  gnome-ppp-chat.c: In function `send_fd':
  gnome-ppp-chat.c:121: structure has no member named `msg_control'
  gnome-ppp-chat.c:122: structure has no member named `msg_controllen'
  gnome-ppp-chat.c:125: structure has no member named `msg_flags'
  gnome-ppp-chat.c:131: structure has no member named `cmsg_data'
  --(end error message)--

  From the comments in gnome-ppp-chat.c, it seems this may be due to a
  Linux issue.
+ Could not get this to build.

Enlightenment 0.15.5
--------------------
Installed in: /usr/local

+ dependencies: fnlib, imlib, gtk, ImageMagick, esd, libghttp
+ built & installed without a hitch.

Eterm 0.8.9
-----------
Installed in: /usr/local/enlightenment

+ dependencies: imlib, tiff, jpeg, gif, png, 
+ Had to add -L/usr/local/tiff/lib to the GRLIBS in the src and utils
  Makefiles to get it to link with my tiff library, even though I have
  a symbolic link to all the libraries in /usr/local/tiff/lib in
  /usr/local/lib.  Weird.  But it made it wokr.


Now you should have Gnome and Enlightenment installed on your Solaris
machine.

To Top

e-mail
© 1994-2008 Brian A. Cameron