bug-guile
[Top][All Lists]
Advanced

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

Re: Mac OS X .dylib not working


From: Ralf Wildenhues
Subject: Re: Mac OS X .dylib not working
Date: Fri, 4 Mar 2011 19:47:25 +0100
User-agent: Mutt/1.5.20 (2010-08-04)

[ dropping bug-libtool ]

Hi Peter,

* Peter O'Gorman wrote on Fri, Mar 04, 2011 at 07:07:30PM CET:
> Ok?

A few copyright year bumps are missing.
Some minor nits inline below.

Thank you,
Ralf

> Subject: [PATCH] On Mac OS X try .dylib as well as .so with lt_dlopenext
> 
> * libltdl/m4/ltdl.m4: Define extra extension if module extension
> differs from shared lib extension.
> * libltdl/ltdl.c: Use it.
> * tests/darwin.at: Test it.
> Reported by Hans Aberg, Michael Ellis, and others.

> --- a/tests/darwin.at
> +++ b/tests/darwin.at
> @@ -228,3 +228,224 @@ mv stdout expout
>  LT_AT_CONFIGURE([LDFLAGS=-L/there/is/no/dir/here])
>  AT_CHECK([./libtool --config],[ignore],[expout],[ignore])
>  AT_CLEANUP
> +
> +AT_SETUP(darwin can lt_dlopen .dylib and .so files)

Missing m4 quotes (for style only)

> +AT_KEYWORDS([libltdl dylib])
> +
> +# This test requires shared library support.
> +AT_CHECK([$LIBTOOL --features | grep 'enable shared libraries' || exit 77],
> +      [], [ignore])
> +
> +
> +eval `$LIBTOOL --config | $EGREP '^(shlibpath_var|shrext_cmds)='`
> +
> +module=no
> +eval shared_ext=\"$shrext_cmds\"
> +module=yes
> +eval module_ext=\"$shrext_cmds\"
> +
> +# Only bother with this test if module extension is different from
> +# shared extension
> +AT_CHECK([test "$shared_ext" != "$module_ext" || exit 77],
> +         [], [ignore])

You can drop arguments two and three here.

> +# This code is copied from the Autobook:
> +# <http://sources.redhat.com/autobook/autobook/autobook_169.html>
> +# so if it needs changes, be sure to notify the Autobook authors
> +# about them.

> +int
> +main (int argc, const char *argv[])
> +{
> +  char *errormsg = NULL;
> +  lt_dlhandle module = NULL;
> +  entrypoint *run = NULL;
> +  int errors = 0;

Isn't this lacking
  LTDL_SET_PRELOADED_SYMBOLS();

or was that needed only for static libs (which you've excluded earlier)?

> +  if (argc != 3)
> +    {
> +      fprintf (stderr, "USAGE: main MODULENAME ARGUMENT\n");
> +      exit (EXIT_FAILURE);
> +    }
> +
> +  /* Initialise libltdl. */
> +  errors = lt_dlinit ();
> +
> +  /* Set the module search path. */
> +  if (!errors)
> +    {
> +      const char *path = getenv (MODULE_PATH_ENV);
> +
> +      if (path != NULL)
> +        errors = lt_dlsetsearchpath (path);
> +    }
> +
> +  /* Load the module. */
> +  if (!errors)
> +    module = lt_dlopenext (argv[1]);
> +
> +  /* Find the entry point. */
> +  if (module)
> +    {
> +      run = (entrypoint *) lt_dlsym (module, "run");
> +
> +      /* In principle, run might legitimately be NULL, so
> +         I don't use run == NULL as an error indicator
> +         in general. */
> +      errormsg = dlerrordup (errormsg);
> +      if (errormsg != NULL)
> +        {
> +          errors = lt_dlclose (module);
> +          module = NULL;
> +        }
> +    }
> +  else
> +    errors = 1;
> +
> +  /* Call the entry point function. */
> +  if (!errors)
> +    {
> +      int result = (*run) (argv[2]);
> +      if (result < 0)
> +        errormsg = strdup ("module entry point execution failed");
> +      else
> +        printf ("\t=> %d\n", result);
> +    }
> +
> +  /* Unload the module, now that we are done with it. */
> +  if (!errors)
> +    errors = lt_dlclose (module);
> +
> +  if (errors)
> +    {
> +      /* Diagnose the encountered error. */
> +      errormsg = dlerrordup (errormsg);
> +
> +      if (!errormsg)
> +        {
> +          fprintf (stderr, "%s: dlerror() failed.\n", argv[0]);
> +          return EXIT_FAILURE;
> +        }
> +    }
> +
> +  /* Finished with ltdl now. */
> +  if (!errors)
> +    if (lt_dlexit () != 0)
> +      errormsg = dlerrordup (errormsg);

I'm not particularly fond of this coding style, where ownership
information essentially gets lots once an error occurs in any
of the commands.  Might be ok for a test like this, but not such
a good example for users.  lt_dlexit could be warranted even if
some error occurred before.  Anyway, I won't reject the patch for
this.

> +  if (errormsg)
> +    {
> +      fprintf (stderr, "%s: %s.\n", argv[0], errormsg);
> +      free (errormsg);
> +      exit (EXIT_FAILURE);
> +    }
> +
> +  return EXIT_SUCCESS;
> +}
> +
> +/* Be careful to save a copy of the error message,
> +   since the  next API call may overwrite the original. */
> +static char *
> +dlerrordup (char *errormsg)
> +{
> +  char *error = (char *) lt_dlerror ();
> +  if (error && !errormsg)
> +    errormsg = strdup (error);
> +  return errormsg;
> +}
> +]])

> +if test "$shlibpath_var" = PATH; then

This looks wrong; shouldn't it be != here?  Otherwise, ...

> +  $unset shlibpath_var || shlibpath_var=
> +fi
> +rm $libdir/simple-module.la

... this has only a small chance of succeeding.

> +rm $libdir/libsimple-dylib.la
> +
> +for dir in inst/lib "$libdir"; do
> +  LT_AT_EXEC_CHECK([./ltdl-loader], [], [stdout], [ignore],
> +         [$dir/simple-module World])
> +  AT_CHECK([grep "Hello, World" stdout], [], [ignore])
> +  LT_AT_EXEC_CHECK([./ltdl-loader], [], [stdout], [ignore],
> +         [$dir/libsimple-dylib World])
> +  AT_CHECK([grep "Hello, World" stdout], [], [ignore])
> +done
> +
> +AT_CLEANUP



reply via email to

[Prev in Thread] Current Thread [Next in Thread]