Re: narwhal and PGDLLIMPORT

Andres Freund <andres@2ndquadrant.com>

From: Andres Freund <andres@2ndquadrant.com>
To: Tom Lane <tgl@sss.pgh.pa.us>
Cc: Marco Atzeri <marco.atzeri@gmail.com>, pgsql-hackers@postgresql.org
Date: 2014-02-15T15:30:29Z
Lists: pgsql-hackers

Commits

Same data as JSON: GET /api/v1/messages/:b64id/commits the thread's linked commits as JSON, with link sources. API reference →
  1. MinGW: Link with shell32.dll instead of shfolder.dll.

  2. Centralize getopt-related declarations in a new header file pg_getopt.h.

  3. Get rid of use of dlltool in Mingw builds.

  4. Export a few more symbols required for test_shm_mq module.

  5. Export set_latch_on_sigusr1 symbol for Windows.

  6. Use SHGetFolderPath instead of SHGetSpecialFolderPath to find the

On 2014-02-15 10:16:50 -0500, Tom Lane wrote:
> Andres Freund <andres@2ndquadrant.com> writes:
> > On 2014-02-12 14:11:10 -0500, Tom Lane wrote:
> >> Marco Atzeri <marco.atzeri@gmail.com> writes:
> >>> from /usr/include/getopt.h
> >>> extern char __declspec(dllimport) *optarg;      /* argument associated 
> >>> with option */
> 
> >> Hm.  All of our files that use getopt also do
> >> extern char *optarg;
> 
> > So, now that brolga is revived, this unsurprisingly causes breakage
> > there after the --disable-auto-export change. ISTM the easiest way to
> > deal with this is to just adorn all those with a PGDLLIMPORT?
> 
> Uh, no, because that's backwards: we'd need the __declspec(dllimport)
> in the backend code.

Yuck, it's even uglier than that. On normal windows it's not actually
the platform's getopt() that ends up getting really used, but the one
from port/...

# mingw has adopted a GNU-centric interpretation of optind/optreset,
# so always use our version on Windows.
if test "$PORTNAME" = "win32"; then
  AC_LIBOBJ(getopt)
  AC_LIBOBJ(getopt_long)
fi

> The best thing probably is not to have the duplicate declarations on
> platforms that don't need 'em.  Unfortunately, I seem to recall that
> the current coding was arrived at to forestall link problems on weird
> platforms that *had* these symbols declared and yet we needed externs
> anyway.  We might have to do something as ugly as "#ifndef CYGWIN".

Hm, according to a quick blame, they are there unconditionally since at
least 2000 (c.f. a70e74b06 moving them around). So it very well might be
that that reasoning isn't current anymore.

One ugly thing to do is to fall back to the port implementation of
getopt on cygwin as well... That'd still have the warning parade tho.

Greetings,

Andres Freund

-- 
 Andres Freund	                   http://www.2ndQuadrant.com/
 PostgreSQL Development, 24x7 Support, Training & Services