Discussion:
Gnulib's getopt.c fails to compile with MinGW
(too old to reply)
Christian Egli
2017-04-28 13:51:11 UTC
Permalink
Raw Message
Building the an updated version of liblouis with Ubuntu 16.10 LTS
i686-w64-mingw32-gcc fails:

i686-w64-mingw32-gcc -DHAVE_CONFIG_H -I. -I../liblouis -I../liblouis -I../tools/gnulib -I../tools/gnulib -g -O2 -Wl,--add-stdcall-alias -MT lou_allround.o -MD -MP -MF .deps/lou_allround.Tpo -c -o lou_allround.o lou_allround.c
mv -f .deps/lou_allround.Tpo .deps/lou_allround.Po
/bin/bash ../libtool --tag=CC --mode=link i686-w64-mingw32-gcc -g -O2 -Wl,--add-stdcall-alias -avoid-version -Xcompiler -static-libgcc -o lou_allround.exe lou_allround.o ../liblouis/liblouis.la ../tools/gnulib/libgnutools.la ../tools/libbrlcheck.la
libtool: link: i686-w64-mingw32-gcc -g -O2 -Wl,--add-stdcall-alias -static-libgcc -o .libs/lou_allround.exe lou_allround.o ../liblouis/.libs/liblouis.dll.a ../tools/gnulib/.libs/libgnutools.a ../tools/.libs/libbrlcheck.a /home/eglic/src/liblouis/liblouis/.libs/liblouis.dll.a -L/tmp/liblouis-mingw32/lib
../tools/gnulib/.libs/libgnutools.a(getopt.o): In function `process_long_option':
/home/eglic/src/liblouis/tools/gnulib/getopt.c:281: undefined reference to `flockfile'
/home/eglic/src/liblouis/tools/gnulib/getopt.c:295: undefined reference to `funlockfile'
collect2: error: ld returned 1 exit status
Makefile:1091: recipe for target 'lou_allround.exe' failed

This happens because gnulib/lib/getopt.c does this:

/* When used standalone, flockfile and funlockfile might not be
available. */
# ifndef _POSIX_THREAD_SAFE_FUNCTIONS
# define flockfile(fp) /* nop */
# define funlockfile(fp) /* nop */
# endif

But Ubuntu's mingw-w64-common package defines
_POSIX_THREAD_SAFE_FUNCTIONS in
/usr/share/mingw-w64/include/pthread_unistd.h (line:150). Unfortunately
flockfile itself is not defined.

I propose the following to fix this similar to how it is done in
getdelim.c:

diff --git a/lib/getopt.c b/lib/getopt.c
index 543c8e7..84f80d3 100644
--- a/lib/getopt.c
+++ b/lib/getopt.c
@@ -45,7 +45,7 @@
# define _(msgid) gettext (msgid)
/* When used standalone, flockfile and funlockfile might not be
available. */
-# ifndef _POSIX_THREAD_SAFE_FUNCTIONS
+# if !HAVE_FLOCKFILE || !HAVE_FUNLOCKFILE
# define flockfile(fp) /* nop */
# define funlockfile(fp) /* nop */
# endif
--
Christian Egli
Swiss Library for the Blind, Visually Impaired and Print Disabled
Grubenstrasse 12, CH-8045 Zürich, Switzerland
Loading...