heads up: wine 20020605 broken on FreeBSD, workaround included

Gerald Pfeifer pfeifer at dbai.tuwien.ac.at
Mon Jul 1 09:18:47 CDT 2002


[ I'm now also Cc:ing this to the Wine developers, thus the full-quote.
  In fact, all non-GLIBC platforms seem to be affected by this bug! ]

Based on your pointer, I believe I found the problem. In aclocal.m4 we
have:

  AC_DEFUN([WINE_CHECK_ERRNO],
  [AC_CACHE_CHECK([for reentrant libc: $1],[wine_cv_libc_r_$1],
    [AC_TRY_RUN([int myerrno = 0;
  char buf[256];
  int *$1(){return &myerrno;}
  main(){connect(0,buf,255); exit(!myerrno);}],
    wine_cv_libc_r_$1=yes, wine_cv_libc_r_$1=no,
    wine_cv_libc_r_$1=yes)])
  AS_IF([test "$wine_cv_libc_r_$1" = "yes"],[$2],[$3])])

which, in configure, becomes:

  int myerrno = 0;
  char buf256;
  int *__error(){return &myerrno;}
  main(){connect(0,buf,255); exit(!myerrno);}

That is, instead of an array of 256 characters, we have one character,
and the invocation of connect() is definitely incorrect.

Could someone more familiar with autoconf please have a look at this?

Gerald

On Mon, 1 Jul 2002, Scott Bolte wrote:

> 	Over the weekend I tried to get wine 20020605 to run on a
> 	new installation of FreeBSD 4.6. It took a while, I haven't
> 	tried wine since 1997 after all, but I determined that my
> 	problems were due to configure's reentrant libc test failing
> 	when building the port.
>
> 	The wine_cv_libc_reentrant test in configure.ac first checks
> 	for Linux (__errno_location) and then tests for FreeBSD
> 	(__error).  I don't have more time to figure out why, but
> 	nesting the FreeBSD test that way results in a false
> 	negative. The configuration will continue, as will the
> 	build, but the resulting non-reentrant code goes into an
> 	endless loop when trying to spawn threads.
>
> 	A crude workaround, for FreeBSD users at least, is to
> 	replace the Linux test with the FreeBSD one. This needs to
> 	be done before configure is run. I did it by hand, but I
> 	expect the following code would do the trick.
>
>   % cd /usr/ports/emulators/wine
>   % make patch
>   % perl -i -pe 's/__errno_location/__error/' work/wine-20020605/configure.ac
>   % make
>   % make install
>
> 	Below is the autoconf test script that demonstrates the
> 	problem. It needs to be run in
> 	/usr/ports/emulators/wine/work/wine-20020605/configure.ac
>
> 		Scott
>
> 	P.S. I'm not on the freebsd-emulators mailing list, but I
> 	     see from freebsd-questions that at least one other
> 	     person got wine to compile on 4.6. I can't explain
> 	     why it worked for him and not for me. However, I
> 	     installed a brand new copy of 4.6 from the standard
> 	     ISO images just to run wine.
>
> ---- testconf.ac
> dnl Process this file with autoconf to produce a configure script.
> dnl Original author: Michael Patra
> dnl See ChangeLog file for detailed change history.
>
> m4_define(WINE_VERSION,regexp(m4_include(VERSION),[version \([-.0-9A-Za-z]+\)],[\1]))
>
> AC_PREREQ(2.53)
> AC_INIT([Wine],WINE_VERSION)
> AC_CONFIG_SRCDIR(server/atom.c)
> AC_CONFIG_AUX_DIR(tools)
>
> dnl **** Check for some programs ****
>
> AC_PROG_CC
>
> dnl **** Check for reentrant libc ****
>
> wine_cv_libc_reentrant=no
>
> dnl	#####
> dnl	##### There is a problem if the FreeBSD test is nested
> dnl	##### after the Linux test. In that instance, it fails.
> dnl	##### If, on the other hand, it is tested first, it works.
> dnl	#####
> dnl	##### Swap the order of two following test case to see
> dnl	##### how they differ. (Ignore the second case since it
> dnl	##### will use cached data.)
> dnl	#####
>
> dnl FreeBSD style errno location
> WINE_CHECK_ERRNO([__error], [wine_cv_libc_reentrant=__error])
>
> dnl Linux style errno location
> WINE_CHECK_ERRNO([__errno_location], [wine_cv_libc_reentrant=__errno_location],
>   dnl FreeBSD style errno location
>   WINE_CHECK_ERRNO([__error], [wine_cv_libc_reentrant=__error]
> ))
>

-- 
Gerald "Jerry" pfeifer at dbai.tuwien.ac.at http://www.dbai.tuwien.ac.at/~pfeifer/




More information about the wine-devel mailing list