Bug #19161
closedCannot compile 3.0.5 or 3.1.3 on Red Hat Enterprise Linux 7
Description
When attempting to run make
on either the 3.0.5 or 3.1.3 release, I get the following error (I included the whole output as it's pretty short):
BASERUBY = /opt/ruby/bin/ruby --disable=gems
CC = gcc -std=gnu11
LD = ld
LDSHARED = gcc -std=gnu11 -shared
CFLAGS = -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wdeprecated-declarations -Wimplicit-function-declaration -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wold-style-definition -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-packed-bitfield-compat -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wsuggest-attribute=format -Wsuggest-attribute=noreturn -Wunused-variable
XCFLAGS = -D_FORTIFY_SOURCE=2 -fstack-protector-strong -fno-strict-overflow -fvisibility=hidden -fexcess-precision=standard -DRUBY_EXPORT -fPIE -I. -I.ext/include/x86_64-linux -I./include -I. -I./enc/unicode/13.0.0
CPPFLAGS =
DLDFLAGS = -Wl,--compress-debug-sections=zlib -fstack-protector-strong -pie
SOLIBS = -lz -lpthread -lrt -lrt -ldl -lcrypt -lm
LANG = en_US.UTF-8
LC_ALL =
LC_CTYPE =
MFLAGS =
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
compiling ./main.c
compiling dmydln.c
compiling miniinit.c
In file included from vm_core.h:83:0,
from iseq.h:14,
from mini_builtin.c:3,
from miniinit.c:51:
thread_pthread.h:108:43: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘struct’
RUBY_EXTERN RB_THREAD_LOCAL_SPECIFIER struct rb_execution_context_struct *ruby_current_ec;
^
In file included from iseq.h:14:0,
from mini_builtin.c:3,
from miniinit.c:51:
vm_core.h: In function ‘rb_current_execution_context’:
vm_core.h:1870:34: error: ‘ruby_current_ec’ undeclared (first use in this function)
rb_execution_context_t *ec = ruby_current_ec;
^
vm_core.h:1870:34: note: each undeclared identifier is reported only once for each function it appears in
miniinit.c: At top level:
cc1: warning: unrecognized command line option "-Wno-tautological-compare" [enabled by default]
cc1: warning: unrecognized command line option "-Wno-self-assign" [enabled by default]
cc1: warning: unrecognized command line option "-Wno-parentheses-equality" [enabled by default]
cc1: warning: unrecognized command line option "-Wno-constant-logical-operand" [enabled by default]
cc1: warning: unrecognized command line option "-Wno-cast-function-type" [enabled by default]
make: *** [miniinit.o] Error 1
Both Ruby 3.0.4 and 3.1.2 build without error and pass (all but one of) the make check
tests.
I know RHEL 7 is getting to be pretty old; I suspect a factor here are the ancient build tools available to me. But... EOL for Ruby 2.7 comes before the one for RHEL 7, so I'm trying to prioritize.
Files
Updated by hsbt (Hiroshi SHIBATA) about 2 years ago
- Subject changed from Cannot compile 3.0.5 or 3.1.3 on Red Hat 7 to Cannot compile 3.0.5 or 3.1.3 on Red Hat Enterprise Linux 7
Updated by nobu (Nobuyoshi Nakada) about 2 years ago
- Status changed from Open to Feedback
Could you try this?
diff --git i/configure.ac w/configure.ac
index fcae66f775e..c933ed8b91f 100644
--- i/configure.ac
+++ w/configure.ac
@@ -363,6 +363,13 @@ AS_IF([test "$GCC" = yes], [
icc_version=`echo =__ICC | $CC -E -xc - | sed '/^=/!d;s///;/^__ICC/d'`
test -n "$icc_version" || icc_version=0
# RUBY_APPEND_OPTIONS(XCFLAGS, ["-include ruby/config.h" "-include ruby/missing.h"])
+
+ AC_CACHE_CHECK([if thread-local storage is supported], [rb_cv_tls_supported],
+ [AC_LINK_IFELSE([AC_LANG_PROGRAM([[int __thread conftest;]])],
+ [rb_cv_tls_supported=yes],
+ [rb_cv_tls_supported=no])])
+ AS_IF([test x"$rb_cv_tls_supported" != xyes],
+ [AC_DEFINE(RB_THREAD_LOCAL_SPECIFIER_IS_UNSUPPORTED)])
], [
linker_flag=
])
diff --git i/thread_pthread.h w/thread_pthread.h
index 2ac354046c0..7d4df3e2785 100644
--- i/thread_pthread.h
+++ w/thread_pthread.h
@@ -72,7 +72,7 @@ typedef struct rb_global_vm_lock_struct {
#if __STDC_VERSION__ >= 201112
#define RB_THREAD_LOCAL_SPECIFIER _Thread_local
-#elif defined(__GNUC__)
+#elif defined(__GNUC__) && !defined(RB_THREAD_LOCAL_SPECIFIER_IS_UNSUPPORTED)
/* note that ICC (linux) and Clang are covered by __GNUC__ */
#define RB_THREAD_LOCAL_SPECIFIER __thread
#else
Updated by hsbt (Hiroshi SHIBATA) about 2 years ago
- Status changed from Feedback to Closed
- Backport changed from 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN to 2.7: DONTNEED, 3.0: REQUIRED, 3.1: REQUIRED
I could reproduce on CentOS 7 and confirmed to fix nobu's patch.
Updated by mame (Yusuke Endoh) about 2 years ago
I investigated why our CI server for CentOS 7 could not find this problem. In short, this problem only occurs on tarball.
This problem occurs when gcc -std=gnu11
.
The CI server uses ./autogen.sh
to generate configure
script. Because the old autoconf on CentOS 7 does not know -std=gnu11
, the generated script does not produce -std=gnu11
.
On the other hand, the configure script in tarball is generated by the new autoconf, so it adds -std=gnu11
, which causes a problem.
I want to add CI for tarballs, but it would require more computing resource (and human resource).
From here, I found a simple workaround: ./configure cflags="-std=gnu99"
. Just FYI.
Updated by werebus (Matt Moretti) about 2 years ago
Thanks everyone,
I can confirm that adding cflags="-std=gnu99"
to the configure step worked around my issue. Re-running ./autogen.sh
on the server in question also worked.
Updated by hsbt (Hiroshi SHIBATA) almost 2 years ago
- Status changed from Closed to Open
- Backport changed from 2.7: DONTNEED, 3.0: REQUIRED, 3.1: REQUIRED to 2.7: DONTNEED, 3.0: REQUIRED, 3.1: REQUIRED, 3.2: REQUIRED
@nobu (Nobuyoshi Nakada) Can you commit this?
Updated by hsbt (Hiroshi SHIBATA) almost 2 years ago
- Has duplicate Bug #19518: Recent Source Releases Do Not Compile on CentOS 7 Due to configure Script Error Generated By autoconf >= 2.70 added
Updated by nobu (Nobuyoshi Nakada) almost 2 years ago
- Status changed from Open to Closed
Applied in changeset git|96d1acfdf6c6b42f2029f44d5b5920961d6efa92.
[Bug #19161] Check for TLS usability
On all platforms using GCC, even other than darwin.
Updated by naruse (Yui NARUSE) almost 2 years ago
- Backport changed from 2.7: DONTNEED, 3.0: REQUIRED, 3.1: REQUIRED, 3.2: REQUIRED to 2.7: DONTNEED, 3.0: REQUIRED, 3.1: REQUIRED, 3.2: DONE
ruby_3_2 0555303464f3595223ec8093146041f96595865d merged revision(s) 96d1acfdf6c6b42f2029f44d5b5920961d6efa92.
Updated by nagachika (Tomoyuki Chikanaga) almost 2 years ago
- Backport changed from 2.7: DONTNEED, 3.0: REQUIRED, 3.1: REQUIRED, 3.2: DONE to 2.7: DONTNEED, 3.0: REQUIRED, 3.1: DONE, 3.2: DONE
ruby_3_1 bc04b38f72ba1f261fbb3e881e6ae65c4bc77797 merged revision(s) 96d1acfdf6c6b42f2029f44d5b5920961d6efa92.
Updated by eviljoel (evil joel) over 1 year ago
@hsbt (Hiroshi SHIBATA), @nagachika (Tomoyuki Chikanaga), and @nobu (Nobuyoshi Nakada), despite the release notes, this was not successfully backported to Ruby 3.2 in Ruby 3.2.2. I've attached a Dockerfile that proves it. Assuming you have Docker installed, run the file with:
docker build --file ruby322BuildFailure-20230404.Dockerfile .
You should get output:
compiling miniinit.c
In file included from vm_core.h:164:0,
from iseq.h:14,
from mini_builtin.c:3,
from miniinit.c:51:
thread_pthread.h:109:39: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'struct'
RUBY_EXTERN RB_THREAD_LOCAL_SPECIFIER struct rb_execution_context_struct *ruby_current_ec;
^
In file included from iseq.h:14:0,
from mini_builtin.c:3,
from miniinit.c:51:
vm_core.h: In function 'rb_current_execution_context':
vm_core.h:1865:34: error: 'ruby_current_ec' undeclared (first use in this function)
rb_execution_context_t *ec = ruby_current_ec;
^
vm_core.h:1865:34: note: each undeclared identifier is reported only once for each function it appears in
miniinit.c: At top level:
cc1: warning: unrecognized command line option "-Wno-tautological-compare" [enabled by default]
cc1: warning: unrecognized command line option "-Wno-self-assign" [enabled by default]
cc1: warning: unrecognized command line option "-Wno-parentheses-equality" [enabled by default]
cc1: warning: unrecognized command line option "-Wno-constant-logical-operand" [enabled by default]
cc1: warning: unrecognized command line option "-Wno-cast-function-type" [enabled by default]
make: *** [miniinit.o] Error 1
The command '/bin/sh -c cd ruby-3.2.2 && make' returned a non-zero code: 2
You can see in the configuration summary that it is still trying to use C11:
---
Configuration summary for ruby version 3.2.2
* Installation prefix: /usr/local
* exec prefix: ${prefix}
* arch: x86_64-linux
* site arch: ${arch}
* RUBY_BASE_NAME: ruby
* ruby lib prefix: ${libdir}/${RUBY_BASE_NAME}
* site libraries path: ${rubylibprefix}/${sitearch}
* vendor path: ${rubylibprefix}/vendor_ruby
* target OS: linux
* compiler: gcc -std=gnu11
* with thread: pthread
* with coroutine: amd64
* enable shared libs: no
* dynamic library ext: so
* CFLAGS: ${optflags} ${debugflags} ${warnflags}
* LDFLAGS: -L. -fstack-protector-strong -rdynamic \
-Wl,-export-dynamic
* DLDFLAGS: -Wl,--compress-debug-sections=zlib
* optflags: -O3 -fno-fast-math
* debugflags: -ggdb3
* warnflags: -Wall -Wextra -Wdeprecated-declarations \
-Wdiv-by-zero -Wimplicit-function-declaration \
-Wimplicit-int -Wpointer-arith -Wwrite-strings \
-Wold-style-definition -Wmissing-noreturn \
-Wno-cast-function-type \
-Wno-constant-logical-operand -Wno-long-long \
-Wno-missing-field-initializers \
-Wno-overlength-strings \
-Wno-packed-bitfield-compat \
-Wno-parentheses-equality -Wno-self-assign \
-Wno-tautological-compare -Wno-unused-parameter \
-Wno-unused-value -Wsuggest-attribute=format \
-Wsuggest-attribute=noreturn -Wunused-variable \
-Wno-maybe-uninitialized
* strip command: strip -S -x
* install doc: rdoc
* MJIT support: yes
* YJIT support: no
* man page type: doc
---
Updated by nobu (Nobuyoshi Nakada) over 1 year ago
- Status changed from Closed to Feedback
@eviljoel (evil joel) Can't you share the generated config.log and config.status files?
Updated by nobu (Nobuyoshi Nakada) over 1 year ago
BTW, off topic:
You can check the checksum more simply.
RUN echo "4b352d0f7ec384e332e3e44cdbfdcd5ff2d594af3c8296b5636c710975149e23 *ruby-3.2.2.tar.xz" | sha256sum -c
Updated by nobu (Nobuyoshi Nakada) over 1 year ago
The gcc on CentOS7 is based on old 4.8.5 and its C11 support seems half-baked, i.e., _Thread_local
storage class is not supported.
Updated by eviljoel (evil joel) over 1 year ago
- File ruby-3.0.6-config.log ruby-3.0.6-config.log added
- File ruby-3.0.6-config.status ruby-3.0.6-config.status added
- File ruby-3.1.4-config.log ruby-3.1.4-config.log added
- File ruby-3.1.4-config.status ruby-3.1.4-config.status added
- File ruby-3.2.2-config.log ruby-3.2.2-config.log added
- File ruby-3.2.2-config.status ruby-3.2.2-config.status added
@nobu (Nobuyoshi Nakada), attached are the requested files. I also included files for Ruby 3.1.4 and 3.0.6. All three versions reported this was fixed but all three versions get the same build error.
I agree that GCC 4.8.5 has incomplete C11 support, but I want to remind you that this is a regression for Ruby 3.1 and 3.0. Ruby 3.1.2 and Ruby 3.0.4 build fine on CentOS 7. It would also be nice if Ruby 3.2 supported building on CentOS 7.
Would a better solution be to just revert to using Autoconf 2.69?
Concerning checking the SHA256SUM, geeze, that was obvious. Thanks for the tip.
Updated by nobu (Nobuyoshi Nakada) over 1 year ago
Updated by Aile5ooQuaerah1oiyoh (- -) 9 months ago
From here, I found a simple workaround: ./configure cflags="-std=gnu99". Just FYI.
I can confirm that adding cflags="-std=gnu99" to the configure step worked around my issue. Re-running ./autogen.sh on the server in question also worked.
Just a notice/heads-up that when modifying CFLAGS you need to remember to keep optimization flags "-O2"/"-O3".
Failure to build Ruby with optimizations was observed to cause a multi-fold performance decrease when CRuby is operated under production-level loads (in Rails).
E.g., when building CRuby 3.x using Rbenv on CentOS 7, the proper command would be:
$ RUBY_CFLAGS='-std=gnu99 -O2' rbenv install 3.0.6