Problems building on SunOS

Paul D. Smith psmith at BayNetworks.COM
Mon Aug 31 14:34:31 CEST 1998

Just tried building gnupg 0.3.4 on SunOS 4.1.4 using GCC.  Here are the
problems I came across:

  - I always build in separate directories since I build for multiple
    architectures (I certainly use GNU make ;).

    The makefiles that gnupg ships has problems with this since it uses
    static filenames in a few places.  To support remote building you
    must always either use automatic variables ($<, etc.)--but note that
    many make's don't allow these in explicit rules--or prefix the
    source files with $(srcdir):


      tiger: $(srcdir)/tiger.c
              $(COMPILE) -shared  -fPIC -o tiger $(srcdir)/tiger.c

      twofish: $(srcdir)/twofish.c
              $(COMPILE) -shared  -fPIC -o twofish $(srcdir)/twofish.c


      g10maint.o: $(srcdir)/g10.c
              $(COMPILE) -DIS_G10MAINT  -o g10maint.o -c $(srcdir)/g10.c

    Note that in these the $(srcdir) in the dependency list is not
    strictly necessary, but the one in the compile line must be there.

  - I noticed that some files were touched in the source tree:


    These files should be created in the build directory, not in the
    source directory.  The source directory could be on a read-only
    medium like a CDROM, or I might not have write permissions to it,
    etc. etc.  Building remotely should never create/modify files in the
    source tree.

In general, I find it very hard to keep the remote building features of
a GNU package 100% correct unless I use them normally myself.  They're
actually quite handy because you can build debugging/non-debugging
versions, etc.

  - SunOS doesn't have the atexit() function; you can use on_exit()
    instead.  I defined this macro:

      #define atexit(_p)    (on_exit((_p),0))

    and it worked.  You'll need to do some configure stuff to get this
    right, of course.

  - On SunOS, USE_SHM_COPROCESSING was set in config.h (because we have
    a sys/shm.h) but IPC_RMID_DEFERRED_RELEASE wasn't defined.  In this
    case an #error is triggered in g10/status.c.

    I think you should check for this in configure or somewhere, and
    defined (at least until that #error entry is fixed/removed, if ever).

    I undef'd USE_SHM_COPROCESSING and it continued compiling.

  - On SunOS header files for dlopen(), there's no setting for
    RTLD_NOW.  The man page for dlopen() says:

      mode is an integer containing flags describing options to be
      applied to the opening and loading process - it is reserved for
      future expansion and must always have the value 1.

    So I just added "#ifndef RTLD_NOW / #define RTLD_NOW (1) / #endif"
    and that seems to have done the trick.

  - SunOS doesn't have the raise() function (g10/signal.c).  I replaced
    it with:

      #ifndef raise
      #define raise(_s) kill(getpid(), (_s))

    Again, some configure checks are needed to resolve this.

  - On SunOS, the mlock() system call requires that the memory to be
    locked start on a page boundary.  The man page says:

     EINVAL         addr is not a multiple of the page size as returned  by

    (I was getting this error back).  Since SunOS has mmap() but doesn't
    have MAP_ANON, util/secmem.c:init_pool() calls malloc() to get
    memory for the pool.  This memory is double-word aligned, but not
    page aligned.

    I changed the code in util/secmem.c to make sure the memory is
    page-aligned.  This is kind of a hack, but it works:

          if( !pool_okay ) {
            long int pgsize = getpagesize();
              pool = malloc( poolsize + pgsize );
              if( !pool )
                  log_fatal("can't allocate memory pool of %lu bytes\n",
                  pool_okay = 1;
              pool += (pgsize - ((long int)pool % pgsize));
          lock_pool( pool, poolsize );
          poollen = 0;

    I suppose you'll need to configure-test for getpagesize(), too.

After this, gpg seems to compile OK and I can get help and do some other
trivial tests.

There are also a large number of problems in "make check" relating to
remote builds; the creation of all the .gpg files from the .asc files is
broken for the same reasons as above; I changed to use
suffix rules for these:

  .SUFFIXES: .gpg .asc

          ../g10/gpgm --yes --dearmor -o $@ $<
          ../g10/gpgm --yes --dearmor -o $@ $<

  pubring.gpg: pubring.asc
  secring.gpg: secring.asc
  plain-3: plain-3o.asc
  pubring.pkr: pubring.pkr.asc
  secring.skr: secring.skr.asc

that seemed to work OK.

Next, the tests all expect to be run from the source check directory;
you need to change this to be directory-independent.  The default
automake "check" rule will set the environment shell variable srcdir to
the correct directory, so for example I changed checks/version.test to
use that variable:


  . $srcdir/ || exit 3

  # print the GPG version
  $srcdir/run-gpg --version

  #fixme: check that the output is correct

Ditto for the other *.test files.

Also, something has to be done about the plain-* files; the need to be
found in $srcdir too.  But note any output generated by
encoding/decoding them (i.e., plain-3) will/should be in the build

The script checks/run-gpg is not portable to most Bourne shells: the "!"
operator is a ksh/bash/zsh thing and isn't available in most traditional
Bourne shells.  Change this:

  if ! ../g10/gpg --homedir . $* 2>err.tmp.$$ ; then
      echo "(../g10/gpg --homedir . $*) failed" >&2
      cat err.tmp.$$ >&2
      rm err.tmp.$$
      exit 1

to this:

  if ../g10/gpg --homedir . $* 2>err.tmp.$$ ; then
      echo "(../g10/gpg --homedir . $*) failed" >&2
      cat err.tmp.$$ >&2
      rm err.tmp.$$
      exit 1

to make it portable.  Ditto for run-gpgm.

 Paul D. Smith <psmith at>         Network Management Development
 "Please remain calm...I may be mad, but I am a professional." --Mad Scientist
     These are my opinions--Bay Networks takes no responsibility for them.

More information about the Gnupg-devel mailing list