Sergey Poznyakoff wrote:
> We've got one more problem with getopt.h. It manifests
> itself when compiling lex-generated parsers on FreeBSD.
> What happens is the following: the system getopt.h defines
> getopt_long, struct option and the accompanying stuff,
> but does not define __need_getopt. Consequently, gnulib's
> getopt.h includes it and attempts to redefine struct option
> afterwards. This works so far as config.h is included before
> getopt.h or unistd.h, but fails if it was not:
>
> In file included from ../../gnu/unistd.h:56,
>                  from grecs-lex.c:12:
> ../../gnu/getopt.h:184: error: redefinition of 'struct option'
>
> The error is triggered by the fact that the default flex
> skeleton begins with
>
>  #include <stdio.h>
>  #include <unistd.h>
>
> and gives no way to insert anything before this.
>
> I see the following possible solutions:
>
> 1. Define __GETOPT_PREFIX directly in getopt.in.h, instead of config.h.
>
> The comment at line 40 says that 'Standalone applications should
> #define __GETOPT_PREFIX', so its seems a natural solution, given
> that only standalone applications use gnulib.

Hi Sergey,

How about just using flex's %top directive?
I use this in GNU cppi.l:

%top{
/* config.h must precede flex's inclusion of <stdio.h>
   in order for its _GNU_SOURCE definition to take effect.  */
#include "config.h"
}


Reply via email to