Project

General

Profile

Actions

Misc #18691

closed

An option to build Ruby with build only flags not propagated to `rbconfig.rb`.

Added by jaruga (Jun Aruga) about 2 years ago. Updated almost 2 years ago.

Status:
Feedback
Assignee:
-
[ruby-core:108216]

Description

In a Fedora Ruby RPM packaging, I have a challenge for the current make rbconfig.rb. Currently when we build Ruby from source to create the Ruby RPM package, we set compiler flag CFLAGS including --specs=/usr/lib/rpm/redhat/redhat-hardened-cc1'. The file /usr/lib/rpm/redhat/redhat-hardened-cc1 is managed in redhat-rpm-config RPM package. This is a problem when end users run gem install <a_gem_with_native_extension>. Because the config.status created by configure script and rbconfig.rb created by make (make rbconfig) includes CFLAGS including --specs=/usr/lib/rpm/redhat/redhat-hardened-cc1'. And the gem install checks flags in rbconfig.rb. Then end users need to install the redhat-rpm-config RPM to run the gem install.

So, we want to create another rbconfig.rb file with flags not depending on files in the redhat-rpm-config RPM, and ship in the Ruby RPM, so that end users can run gem install without installing redhat-rpm-config RPM.

Here are ideal steps to create another rbconfig.rb when building Ruby to create the Ruby RPM package. I tested it on the current latest master 381475f02e6b44ae729f9403637b30c445b622e5.

$ autoconf
$ CFLAGS='-O2 --specs=/usr/lib/rpm/redhat/redhat-hardened-cc1' ./configure
$ make

$ mkdir -p build/rbconfig
$ cd build/rbconfig
$ CFLAGS='-O2' ../../configure
$ make rbconfig.rb

Then we can ship the build/rbconfig/rbconfig.rb.

But right now it seems that the make rbconfig.rb triggers the process to build miniruby, and I want to skip the process.

$ pwd
/home/jaruga/git/ruby/ruby/build/rbconfig

$ ls
config.log  config.status*  .ext/  GNUmakefile  Makefile  uncommon.mk

$ make rbconfig.rb
compiling ../../main.c
compiling ../../dmydln.c
...

I executed the following commands, to create miniruby on the current working directory and not to remake miniruby (make -o miniruby) to skip the process to build the miniruby. But ideally I want to execute only make rbconfig to create the rbconfig.rb in build/rbconfig directory. Do you have any idea about how to improve files such as configure.ac, common.mk or tool/mkconfig.rb to achieve this?

$ cp -p ../../miniruby .

$ make -o miniruby rbconfig.rb
/bin/sh ../../tool/ifchange "--timestamp=.rbconfig.time" rbconfig.rb rbconfig.tmp
rbconfig.rb updated

$ diff -u ../../rbconfig.rb rbconfig.rb
--- ../../rbconfig.rb	2022-04-12 18:03:45.484465916 +0200
+++ rbconfig.rb	2022-04-12 18:13:09.248334704 +0200
@@ -44,7 +44,7 @@
   CONFIG["RUBY_SEARCH_PATH"] = ""
   CONFIG["UNIVERSAL_INTS"] = ""
   CONFIG["UNIVERSAL_ARCHNAMES"] = ""
-  CONFIG["configure_args"] = " 'CFLAGS=-O2 --specs=/usr/lib/rpm/redhat/redhat-hardened-cc1'"
+  CONFIG["configure_args"] = " 'CFLAGS=-O2'"
   CONFIG["CONFIGURE"] = "configure"
   CONFIG["vendorarchdir"] = "$(vendorlibdir)/$(sitearch)"
   CONFIG["vendorlibdir"] = "$(vendordir)/$(ruby_version)"
@@ -173,7 +173,7 @@
   CONFIG["OBJEXT"] = "o"
   CONFIG["CPPFLAGS"] = " $(DEFS) $(cppflags)"
   CONFIG["LDFLAGS"] = "-L. -fstack-protector-strong -rdynamic -Wl,-export-dynamic"
-  CONFIG["CFLAGS"] = "-O2 --specs=/usr/lib/rpm/redhat/redhat-hardened-cc1"
+  CONFIG["CFLAGS"] = "-O2"
   CONFIG["STRIP"] = "strip -S -x"
   CONFIG["RANLIB"] = "gcc-ranlib"
   CONFIG["OBJDUMP"] = "objdump"
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0