Open njzjz opened 6 months ago
I reproduced your problem using the same Docker image. By temporarily compiling successfully with #undef HAVE_GETRANDOM
#undef HAVE_SYS_RANDOM_H
in deps/cares/config/linux/ares_config.h
.
At the same time, I found that the HAVE_GETRANDOM
macro encountered the same problem. They seem to have been introduced during the automated update of c-ares (https://github.com/nodejs/node/pull/51385, https://github.com/nodejs/node/pull/51582). I'm looking into how to fix them.
The root cause of this compilation error is that Node.js adopted a static method to directly load config/linux/ares_config.h
when incorporating c-ares configurations for different architectures.
https://github.com/nodejs/node/blob/6d2d3f17ba96353ea76147d95b6106bc4ff587d4/deps/cares/cares.gyp#L197-L200
As a result, the original mechanism of c-ares for generating macros, as demonstrated below, was not executed. https://github.com/nodejs/node/blob/6d2d3f17ba96353ea76147d95b6106bc4ff587d4/deps/cares/configure#L21505-L21509
However, I currently do not know how to dynamically detect header files and set macros in GYP.
sys/random.h
was added in glibc 2.25. glibc 2.28 has been the minimum supported version since Node.js 18, so this isn't an issue for Node.js.
If you are building Node.js for an older glibc you'll need to make adjustments accordingly.
However, I currently do not know how to dynamically detect header files and set macros in GYP.
Could we append the following codes to deps/cares/config/linux/ares_config.h
:
#if defined(__GLIBC__) && (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 25))
#undef HAVE_SYS_RANDOM_H
#undef HAVE_GETRANDOM
#endif
When GLIBC version <2.25, undefine HAVE_SYS_RANDOM_H
and HAVE_GETRANDOM
.
However, I currently do not know how to dynamically detect header files and set macros in GYP.
Could we append the following codes to
deps/cares/config/linux/ares_config.h
:#if defined(__GLIBC__) && (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 25)) #undef HAVE_SYS_RANDOM_H #undef HAVE_GETRANDOM #endif
When GLIBC version <2.25, undefine
HAVE_SYS_RANDOM_H
andHAVE_GETRANDOM
.
I agree with this workaround!
I have solved this problem by applying Anna's patch. https://github.com/nodejs/unofficial-builds/pull/127#pullrequestreview-1974298868 so I have successfully built v18 and v20 on CentOS 7 (glibc 2.17) and they pass tests with citgm.
However, I currently do not know how to dynamically detect header files and set macros in GYP.
Could we append the following codes to
deps/cares/config/linux/ares_config.h
:#if defined(__GLIBC__) && (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 25)) #undef HAVE_SYS_RANDOM_H #undef HAVE_GETRANDOM #endif
When GLIBC version <2.25, undefine
HAVE_SYS_RANDOM_H
andHAVE_GETRANDOM
.
That may need #include <sys/types.h>
above check as well, because GLIBC comes from features.h and it's not included on all pathes where ares_config.h is included. I see it on glibc 2.17.
You can check your setup it by adding
#else
caboom
branch and building on older glibc, should not fail if all macros are set.
However, I currently do not know how to dynamically detect header files and set macros in GYP.
Could we append the following codes to
deps/cares/config/linux/ares_config.h
:#if defined(__GLIBC__) && (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 25)) #undef HAVE_SYS_RANDOM_H #undef HAVE_GETRANDOM #endif
When GLIBC version <2.25, undefine
HAVE_SYS_RANDOM_H
andHAVE_GETRANDOM
.That may need
#include <sys/types.h>
above check as well, because GLIBC comes from features.h and it's not included on all pathes where ares_config.h is included. I see it on glibc 2.17.You can check your setup it by adding
#else caboom
branch and building on older glibc, should not fail if all macros are set.
This worked for me on RHEL 7.5
Can you suggest a workaround for this to build on machines with older glibc
versions?
> ldd --version
ldd (GNU libc) 2.17
Can you suggest a workaround for this to build on machines with older
glibc
versions?> ldd --version ldd (GNU libc) 2.17
See the code in here: https://unofficial-builds.nodejs.org/
Version
20.12.0
Platform
Linux 42c14383a17c 6.7.3-100.fc38.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Feb 1 03:33:32 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
Subsystem
CentOS 7
What steps will reproduce the bug?
Use the
quay.io/pypa/manylinux2014_x86_64
docker image (CentOS 7 based) to build nodejs (./configure
).How often does it reproduce? Is there a required condition?
It can be consistently reproduced.
What is the expected behavior? Why is that the expected behavior?
It can be successfully built, like 20.11.1.
https://github.com/nodejs/node/blob/94fb85426bac26dd44c777eb666f87ebe1a4f8ea/deps/cares/src/lib/ares_rand.c#L38-L40
These three lines were added by #51385 (upstream: https://github.com/c-ares/c-ares/commit/d8edb76bece36267c4c55355ae9c7009e131a0e0), and I believe that
HAVE_SYS_RANDOM_H
is not correctly set whensys/random.h
is missing in the old glibc (<2.25).What do you see instead?
Additional information
No response