Project

General

Profile

Actions

Bug #19161

closed

Cannot compile 3.0.5 or 3.1.3 on Red Hat Enterprise Linux 7

Added by werebus (Matt Moretti) about 2 years ago. Updated 9 months ago.

Status:
Feedback
Assignee:
-
Target version:
-
[ruby-core:111075]

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

ruby322BuildFailure-20230404.Dockerfile (531 Bytes) ruby322BuildFailure-20230404.Dockerfile eviljoel (evil joel), 04/05/2023 01:37 AM
ruby-3.0.6-config.status (33.2 KB) ruby-3.0.6-config.status eviljoel (evil joel), 04/05/2023 05:36 PM
ruby-3.0.6-config.log (1.33 MB) ruby-3.0.6-config.log eviljoel (evil joel), 04/05/2023 05:36 PM
ruby-3.1.4-config.log (1.36 MB) ruby-3.1.4-config.log eviljoel (evil joel), 04/05/2023 05:36 PM
ruby-3.1.4-config.status (32.8 KB) ruby-3.1.4-config.status eviljoel (evil joel), 04/05/2023 05:36 PM
ruby-3.2.2-config.status (33.4 KB) ruby-3.2.2-config.status eviljoel (evil joel), 04/05/2023 05:36 PM
ruby-3.2.2-config.log (1.44 MB) ruby-3.2.2-config.log eviljoel (evil joel), 04/05/2023 05:36 PM

Related issues 1 (0 open1 closed)

Has duplicate Ruby master - Bug #19518: Recent Source Releases Do Not Compile on CentOS 7 Due to configure Script Error Generated By autoconf >= 2.70ClosedActions
Actions #1

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?

Actions #7

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
Actions #8

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

@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 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
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like1Like0