Hi Chris,
Chris Packham <[email protected]> writes:
> I'm the current maintainer of crosstool-ng. We had a bug report form a
> user[1] with a configuration that involved building GNU make from
> source.
>
> I haven't been able to reproduce the error yet (the users on macOS,
> I've tried a few different debian containers) but eye-balling the
> latest source the problem still seems to be there[2] if I can trigger
> the need to back-fill from gnulib.
GNU Make avoids importing Gnulib modules, since it will make
bootstrapping harder.
> It looks like others have hit a similar error[3] but that fix hasn't
> been picked up (and I don't think it will address the one that the
> ct-ng user reported).
>
> I'll see if I can find a way of reproducing the issue and if I can,
> the fix should be relatively straightforward.
Based on the error messages you linked, copied here for reference:
[ERROR]
/Volumes/workspace_casesensitive/crosstool-ng/.build/aarch64-rpi4-linux-gnu/src/make/lib/fnmatch.c:124:14:
error: conflicting types for 'getenv'; have 'char *(void)'
[ALL ] 124 | extern char *getenv ();
[ALL ] | ^~~~~~
[ALL ] In file included from
/Library/Developer/CommandLineTools/SDKs/MacOSX15.sdk/usr/include/stdlib.h:58,
[ALL ] from ./stdlib.h:36,
[ALL ] from
/Volumes/workspace_casesensitive/crosstool-ng/.build/aarch64-rpi4-linux-gnu/src/make/lib/fnmatch.c:40:
[ALL ]
/Library/Developer/CommandLineTools/SDKs/MacOSX15.sdk/usr/include/_stdlib.h:162:25:
note: previous declaration of 'getenv' with type 'char *(const char *)'
[ALL ] 162 | char *_LIBC_CSTR getenv(const char *);
I am 99% sure this is because you are using a very new C compiler (GCC
15, or whatever the Clang equivalent version is). In these new versions
C23 is the default.
In C23 the following declarations are equivalent:
extern char *getenv ();
extern char *getenv (void);
In previous versions of the C standard a declaration with an empty
parameter list just declares a function with an unspecified number of
arguments.
See the following example:
$ cat main.c
extern char *getenv ();
int
main (void)
{
getenv (0, 1, 2, 3);
return 0;
}
$ gcc -std=gnu23 main.c
main.c: In function ‘main’:
main.c:5:3: error: too many arguments to function ‘getenv’; expected 0,
have 4
5 | getenv (0, 1, 2, 3);
| ^~~~~~ ~
main.c:1:14: note: declared here
1 | extern char *getenv ();
| ^~~~~~
$ gcc -std=gnu99 main.c
$ echo $?
0
So, you should be able to compile with -std=gnu99.
Collin