Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Do not use values from RbConfig if we are not building a C extension #2774

Merged
merged 1 commit into from
May 6, 2024

Conversation

eregon
Copy link
Member

@eregon eregon commented May 5, 2024

  • Notably, RbConfig::CONFIG["CC"] would be the GraalVM LLVM toolchain on TruffleRuby < 24.0 and we specifically do not want to use that as already explained in comments.

Related: #2705 #2725
cc FYI @ParadoxV5

@eregon eregon requested a review from kddnewton May 5, 2024 11:25
@eregon eregon force-pushed the fix-extconf-env-non-cruby branch from 8aca6e9 to 3707c73 Compare May 5, 2024 11:38
Copy link
Contributor

@ParadoxV5 ParadoxV5 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🆙. We should’ve foreseen those mistakes when I originally sent my patch, so we didn’t need all of these follow-ups post release.

# the C extension since they will be linked together.
# The C extension uses RbConfig, which contains values from the toolchain that built the running Ruby.
require "rbconfig"
env = RbConfig::CONFIG.slice("SOEXT", "CPPFLAGS", "CFLAGS", "CC", "AR", "ARFLAGS", "MAKEDIRS", "RMALL")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • Keep: SOEXT
  • Don’t use: CC & CFLAGS & CPPFLAGS, probably AR & ARFLAGS too
  • What about?: MAKEDIRS, RMALL

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I just moved that code around, I didn't change any logic for CRuby (just trying to clarify the comments a bit), so I would like to not change that in this PR.

FWIW reusing the same CC for building the extension and libprism.a seems best, so I think it makes sense to keep it there.
RbConfig::CONFIG["CC"] not existing seems very weird, how can any gem install of a gem with C extension work? Does mkmf have a fallback if RbConfig::CONFIG["CC"] does not exist?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's possible that people are using all pre-compiled gems + a Ruby that was built on a different system.

Copy link
Member Author

@eregon eregon May 6, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's possible that people are using all pre-compiled gems + a Ruby that was built on a different system.

Ah right, so in that case Prism happens to be the one to fail because it's the first C extension built from source on that target system? And so any other C extension built from source would fail too (because mkmf would use RbConfig::CONFIG["CC"]).
It seems it's a user error in that case, they should not expect to be able to install native extensions from source without a native toolchain or with RbConfig pointing at a non-existing toolchain.

But, this PR changes nothing about that, I just wondered why the workaround is there.

Copy link
Contributor

@ParadoxV5 ParadoxV5 May 6, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's possible that people are using all pre-compiled gems + a Ruby that was built on a different system.

Is it time for us to start shipping prebuilt gems as well?

Ah right, so in that case Prism happens to be the one to fail because it's the first C extension built from source on that target system? And so any other C extension built from source would fail too (because mkmf would use RbConfig::CONFIG["CC"]). It seems it's a user error in that case, they should not expect to be able to install native extensions from source without a native toolchain or with RbConfig pointing at a non-existing toolchain.

I previously thought about that too.

I just wondered why the workaround is there

To resolve #2716. Perhaps @kddnewton just wanted to make the customer happy ASAP.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah this was just to get a release out.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One last thought about this is while this code might help with make build/libprism.a I don't see how it could help for mkmf and building the C extension, and so gem install prism should still fail. That's a mystery.
Unless mkmf check for the existance of RbConfig::CONFIG["AR"] but I don't see anything about that in https://github.com/ruby/ruby/blob/v3_3_0/lib/mkmf.rb (CC_WRAPPER is checked but not CC/AR).
I think maybe in #2716 RbConfig::CONFIG["CC"] exists but RbConfig::CONFIG["AR"] does not. And then this workaround would help, since the root Makefile will use ar instead and C extensions very rarely use AR.

Copy link
Collaborator

@kddnewton kddnewton left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just a small question first!

* Notably, RbConfig::CONFIG["CC"] would be the GraalVM LLVM toolchain on
  TruffleRuby < 24.0 and we specifically do not want to use that as already
  explained in comments.
@eregon eregon force-pushed the fix-extconf-env-non-cruby branch from 3707c73 to 96fbbe6 Compare May 6, 2024 17:37
@eregon eregon merged commit 6503172 into ruby:main May 6, 2024
54 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants