Subject: bug#22959: Emacs on Windows depends on libwinpthreads

From: Fabrice Popineau <[email-masked]>
Date: Sun, 17 Apr 2016 17:25:23 +0200

2016-04-17 16:37 GMT+02:00 Eli Zaretskii <[email-masked]>:

> > From: Fabrice Popineau <[email-masked]>
> > Date: Sat, 16 Apr 2016 23:48:35 +0200
> >
> > At this point, when I build emacs for w64 using msys2,
> > emacs.exe depends on libwinpthread for only one symbol
> > which is clock_gettime().
> > This is called from lib/gettime.c:gettime().
>
> This is not supposed to happen.  I don't see this on my system.
>
> There's some factor at work here that I cannot figure out: the
> configure-time test for clock_gettime doesn't try to look for that
> function in the pthreads library, it only tries the "normal" link
> without any extra libraries, and if that fails, tries 2 extra
> libraries: librt and libposix4, none of which I'd expect to see on
> MS-Windows in a MinGW installation.
>
> It could be something peculiar to MinGW64/MSYS2 build.  Are you sure
> libwinpthread dependency is not a requirement of the MinGW64 GCC port?
>
> So please look in config.log, and tell how did pthreads get into this
> test.

>From config.log:

configure:24643: checking for library containing clock_gettime
configure:24674: gcc -I ../emacs/nt/inc -o conftest.exe -I/mingw64/include
-fomit-frame-pointer -O3 -g0 -mtune=corei7 -mtune=generic
 -I/mingw64/include -L/mingw64/lib conftest.c   >&5
configure:24674: $? = 0
configure:24691: result: none required
configure:24703: checking for clock_gettime
configure:24703: gcc -I ../emacs/nt/inc -o conftest.exe -I/mingw64/include
-fomit-frame-pointer -O3 -g0 -mtune=corei7 -mtune=generic
 -I/mingw64/include -L/mingw64/lib conftest.c   >&5
configure:24703: $? = 0
configure:24703: result: yes
configure:24703: checking for clock_settime
configure:24703: gcc -I ../emacs/nt/inc -o conftest.exe -I/mingw64/include
-fomit-frame-pointer -O3 -g0 -mtune=corei7 -mtune=generic
 -I/mingw64/include -L/mingw64/lib conftest.c   >&5
configure:24703: $? = 0
configure:24703: result: yes

Testing with a very short C file, it seems that libwinpthread-1.dll is
linked in by default and may be gets removed by the linker if no symbol is
referenced. I have asked for clarifications
on the msys2 list.

Anyway, I am afraid that some 3rd party libraries would require it anyway.
For example, --with-rsvg triggers the -pthread compile flag:

config.status:S["RSVG_CFLAGS"]="-pthread -mms-bitfields
-I/mingw64/include/librsvg-2.0 -I/mingw64/include/gdk-pixbuf-2.0
-I/mingw64/include/libpng16 -I/mingw64/include/cairo -I/min"\

>
> > I may add that a full blown emacs compiled with msys2
> > needs up to 57 dlls to run ( that is : all image formats dll,
> > gnutls, etc.) and this is what I copy in my emacs/bin directory.
>
> 57 DLLs sounds excessive.  I counted the ones I think Emacs uses on my
> system, and only got as far as 32.  Can you show a list of those 57
> libraries?
>

configure command is:

  $ ../emacs/configure --prefix=/c/Local/Emacs-25
--libexecdir=/c/Local/Emacs-25/bin --datarootdir=/c/Local/Emacs-25
--localstatedir=/c/Local/Emacs-25 --sysconfdir=/c/Local/Emacs-25/etc
--with-jpeg --with-xpm --with-png --with-tiff --with-rsvg --with-xml2
--with-gnutls --with-imagemagick --enable-checking=no

and the dll list is:

/c/Local/Emacs/bin/libasprintf-0.dll*
 /c/Local/Emacs/bin/libgmodule-2.0-0.dll*
/c/Local/Emacs/bin/libMagickWand-6.Q16HDRI-2.dll*
/c/Local/Emacs/bin/libbz2-1.dll*
/c/Local/Emacs/bin/libgmp-10.dll*
 /c/Local/Emacs/bin/libnettle-6-1.dll*
/c/Local/Emacs/bin/libcairo-2.dll*
/c/Local/Emacs/bin/libgnutls-30.dll*
/c/Local/Emacs/bin/libp11-kit-0.dll*
/c/Local/Emacs/bin/libcairo-gobject-2.dll*
/c/Local/Emacs/bin/libgnutlsxx-28.dll*
/c/Local/Emacs/bin/libpango-1.0-0.dll*
/c/Local/Emacs/bin/libcairo-script-interpreter-2.dll*
 /c/Local/Emacs/bin/libgobject-2.0-0.dll*
/c/Local/Emacs/bin/libpangocairo-1.0-0.dll*
/c/Local/Emacs/bin/libcharset-1.dll*
/c/Local/Emacs/bin/libgomp-1.dll*
 /c/Local/Emacs/bin/libpangoft2-1.0-0.dll*
/c/Local/Emacs/bin/libcroco-0.6-3.dll*
/c/Local/Emacs/bin/libgraphite2.dll*
/c/Local/Emacs/bin/libpangowin32-1.0-0.dll*
/c/Local/Emacs/bin/libdbus-1-3.dll*
 /c/Local/Emacs/bin/libgthread-2.0-0.dll*
/c/Local/Emacs/bin/libpcre-1.dll*
/c/Local/Emacs/bin/libexpat-1.dll*
/c/Local/Emacs/bin/libharfbuzz-0.dll*
 /c/Local/Emacs/bin/libpixman-1-0.dll*
/c/Local/Emacs/bin/libffi-6.dll*
/c/Local/Emacs/bin/libhogweed-4-1.dll*
/c/Local/Emacs/bin/libpng16-16.dll*
/c/Local/Emacs/bin/libfftw3-3.dll*
/c/Local/Emacs/bin/libiconv-2.dll*
/c/Local/Emacs/bin/librsvg-2-2.dll*
/c/Local/Emacs/bin/libfontconfig-1.dll*
 /c/Local/Emacs/bin/libidn-11.dll*
 /c/Local/Emacs/bin/libstdc++-6.dll*
/c/Local/Emacs/bin/libfreetype-6.dll*
 /c/Local/Emacs/bin/libintl-8.dll*
 /c/Local/Emacs/bin/libtasn1-6.dll*
/c/Local/Emacs/bin/libgcc_s_seh-1.dll*
/c/Local/Emacs/bin/libjpeg-8.dll*
 /c/Local/Emacs/bin/libtiff-5.dll*
/c/Local/Emacs/bin/libgdk_pixbuf-2.0-0.dll*
 /c/Local/Emacs/bin/liblcms2-2.dll*
/c/Local/Emacs/bin/libtiffxx-5.dll*
/c/Local/Emacs/bin/libgettextpo-0.dll*
/c/Local/Emacs/bin/liblqr-1-0.dll*
/c/Local/Emacs/bin/libwinpthread-1.dll*
/c/Local/Emacs/bin/libgif-7.dll*
/c/Local/Emacs/bin/libltdl-7.dll*
 /c/Local/Emacs/bin/libxml2-2.dll*
/c/Local/Emacs/bin/libgio-2.0-0.dll*
/c/Local/Emacs/bin/liblzma-5.dll*
 /c/Local/Emacs/bin/libXpm-noX4.dll*
/c/Local/Emacs/bin/libglib-2.0-0.dll*
 /c/Local/Emacs/bin/libMagickCore-6.Q16HDRI-2.dll*
 /c/Local/Emacs/bin/zlib1.dll*

GnuTLS, ImageMagick and RSVG add quite many.

Fabrice