Subject: pkg/31324: lang/swi-prolog-lite package is broken on Mac OS X
To: None <pkg-manager@netbsd.org, gnats-admin@netbsd.org,>
From: None <Peter.Bex@student.ru.nl>
List: pkgsrc-bugs
Date: 09/15/2005 20:12:00
>Number:         31324
>Category:       pkg
>Synopsis:       lang/swi-prolog-lite package is broken on Mac OS X
>Confidential:   no
>Severity:       serious
>Priority:       high
>Responsible:    pkg-manager
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Thu Sep 15 20:12:00 +0000 2005
>Originator:     Peter Bex
>Release:        n/a (Mac OS X 10.3.9)
>Organization:
>Environment:
Darwin byers.local 7.9.0 Darwin Kernel Version 7.9.0: Wed Mar 30 20:11:17 PST 2005; root:xnu/xnu-517.12.7.obj~1/RELEASE_PPC  Power Macintosh powerpc
>Description:
When compiling lang/swi-prolog-lite on Mac OS X (Darwin), it will fail halfway during compilation because the configure script gets its information about readline support wrong.

A quick look at the configure script (work/pl-5.2.13/src/configure.in) shows that they are knowingly making assumptions that are not valid.  They are trying to detect readline _variables_ by checking for _functions_ with the same name!  (line 374)

I'm not sure why this works on NetBSD, but the C code that is generated for configure on Darwin is definitely not correct:
---------------------------------------------------------------
#line $LINENO "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char $ac_func (); below.  */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error.  */
#ifdef __cplusplus
extern "C"
#endif
/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char $ac_func ();
char (*f) ();

#ifdef F77_DUMMY_MAIN
#  ifdef __cplusplus
     extern "C"
#  endif
   int F77_DUMMY_MAIN() { return 1; }
#endif
int
main ()
{
/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
choke me
#else
f = $ac_func;
#endif

  ;
  return 0;
}
---------------------------------------------------------

It assigns ac_func (which is in reality an integer, for example in the case of rl_readline_state) to a function pointer f.
>How-To-Repeat:
Try to install swi-prolog-lite from pkgsrc on an OS X/Darwin system.
>Fix:
Do not include ../../devel/readline/buildlink3.mk if under Darwin.  It won't try to use readlink and the problem goes away.

Unfortunately the prolog directory it installs under is different, so installation still doesn't work: it tries to install to /usr/pkg/lib/swi-prolog-5.2.13, but the Makefiles from the program install to /usr/pkg/lib/swipl-5.2.13
I'm not sure how it is possible that this differs from the location it would install to on other platforms...