From: "jaruga (Jun Aruga)" Date: 2022-04-21T10:40:14+00:00 Subject: [ruby-core:108348] [Ruby master Misc#18691] An option to run `make rbconfig.rb` in a different directory Issue #18691 has been updated by jaruga (Jun Aruga). Status changed from Closed to Feedback I want to confirm that stdlibs such as "ruby/openssl" (`ext/openssl`) and bundled gems with native extension such as "ruby/debug" defined in `gems/bundled_gems` file are compiled with `--specs=/usr/lib/rpm/redhat/redhat-hardened-cc1` in the process of `make` and `make install`. I tried the following commands. ``` $ ./autogen.sh $ CFLAGS='-O2' ./configure --prefix=$(pwd)/dest/ruby $ make ARCH_FLAG=--specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 Q= | tee make.log $ make install V=1 ARCH_FLAG=--specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 | tee make_install.log ``` I can see ruby/openssl is compiled with `--specs=/usr/lib/rpm/redhat/redhat-hardened-cc1`. ``` $ cat make.log ... ./miniruby -I./lib -I. -I.ext/common ./ext/extmk.rb --make='make' \ --command-output=ext/openssl/exts.mk --dest-dir="" --extout=".ext" --ext-build-dir="./ext" --mflags="" --make-flags=" -- Q= ARCH_FLAG=--specs=/usr/lib/rpm/redhat/redhat-hardened-cc1" --gnumake=yes --extflags="" --make-flags="MINIRUBY='./miniruby -I./lib -I. -I.ext/common '" --extstatic \ -- configure ext/openssl configuring openssl ... ``` I can see the ruby/debug is compiled with the `--specs=/usr/lib/rpm/redhat/redhat-hardened-cc1`. ``` $ cat make_install.log ... ./miniruby -I./lib -I. -I.ext/common ./ext/extmk.rb --make='make' \ --command-output=.bundle/gems/debug-1.5.0/exts.mk --dest-dir="" --extout=".ext" --ext-build-dir="./ext" --mflags="" --make-flags=" -- ARCH_FLAG=--specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 V=1" --gnumake=yes --extflags="" --make-flags="MINIRUBY='./miniruby -I./lib -I. -I.ext/common '" --no-extstatic \ -- configure .bundle/gems/debug-1.5.0 ... make -C ext/-test-/debug V=1 all ... make -C .bundle/gems/debug-1.5.0/ext/debug V=1 all ... ``` But the ruby/openssl source files such as `ext/openssl/openssl_missing.c` and ruby/debug's source files such as [ext/debug/debug.c](https://github.com/ruby/debug/blob/master/ext/debug/debug.c) are really compiled with the flags? How can I check it, logging those `ext/openssl/openssl_missing.c` and `ext/debug/debug.c`? ---------------------------------------- Misc #18691: An option to run `make rbconfig.rb` in a different directory https://bugs.ruby-lang.org/issues/18691#change-97373 * Author: jaruga (Jun Aruga) * Status: Feedback * Priority: Normal ---------------------------------------- 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 `. 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" ``` -- https://bugs.ruby-lang.org/ Unsubscribe: