libelf: fix build with clang 16 on Darwin

Clang 16 does not allow `main` with an implicit `int`, which causes the
configure script to misdetect clang as a non-working compiler. Patching
`configure.in` and regenerating `configure` allows libelf to build.

Due to the comment regarding bootstrap tools, this patching is only done
on Darwin with clang.
This commit is contained in:
Randy Eckenrode 2023-06-01 19:22:00 -04:00
parent 323e9a44c2
commit 9cd4e84a4d
No known key found for this signature in database
GPG key ID: 64C1CD4EC2A600D9
2 changed files with 21 additions and 1 deletions

View file

@ -21,6 +21,8 @@ stdenv.mkDerivation rec {
# Fix warnings from preprocessor instructions.
# https://github.com/NixOS/nixpkgs/issues/59929
./preprocessor-warnings.patch
# `configure` defines a test `main` with an implicit `int` return, which clang 16 disallows.
./fix-configure-main.patch
];
enableParallelBuilding = true;
@ -55,7 +57,13 @@ stdenv.mkDerivation rec {
# cross-compiling, but `autoreconfHook` brings in `makeWrapper` which
# doesn't work with the bootstrapTools bash, so can only do this for
# cross builds when `stdenv.shell` is a newer bash.
++ lib.optional (stdenv.hostPlatform != stdenv.buildPlatform) autoreconfHook;
++ lib.optional (stdenv.hostPlatform != stdenv.buildPlatform
# The provided `configure` script fails on clang 16 because some tests have a `main`
# returning an implicit `int`, which clang 16 treats as an error. Running `autoreconf` fixes
# the test and allows `configure` to detect clang properly.
# This is done only for clang on Darwin because the Darwin stdenv bootstrap does not use
# libelf, so should be safe because it will always be run with a compatible version of bash.
|| (stdenv.cc.isClang && stdenv.isDarwin)) autoreconfHook;
meta = {
description = "ELF object file access library";

View file

@ -0,0 +1,12 @@
diff -ur a/configure.in b/configure.in
--- a/configure.in 2008-05-23 04:17:56.000000000 -0400
+++ b/configure.in 2023-06-01 19:16:04.801921924 -0400
@@ -282,7 +282,7 @@
#define memmove(d,s,n) bcopy((s),(d),(n))
#endif
extern int strcmp();
-main() {
+int main() {
char buf[] = "0123456789";
memmove(buf + 1, buf, 9);
if (strcmp(buf, "0012345678")) exit(1);