-
Notifications
You must be signed in to change notification settings - Fork 88
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
Install missing dependencies for Ruby 3.2 #763
Merged
Merged
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
|
We compile ruby 3.2 with strong stack protection. This causes ruby to be linked against libssp-0, which must be redistributed with the runtime: $ objdump -p ruby.exe | grep libssp DLL Name: libssp-0.dll Windows doesn't have an RPATH equivalent, so the dll must be copied into the same directory as ruby. This was partially addressed in commmit ba4c955, however, the _base-ruby component is already responsible for installing Windows specific library dependencies when the main bin dir is different than ruby's bin dir, so move that logic there.
Previously, we were copying libffi-6.dll to both ruby 2.7 and 3.2 bin directories on Windows: $ find . -type f -name "libffi*dll" ./2.7.8/bin/libffi-6.dll ./3.2.2/bin/libffi-6.dll However, we build libffi-8 with ruby 3.2, and it will be installed to the pdk bin directories in a future commit. So restrict libffi-6 to ruby 2.
Previously, the pdk-vanagon's gem prune command[1] failed on Windows with Ruby 3.2: $ GEM_PATH="C:/ProgramFiles64Folder/PuppetLabs/DevelopmentKit/private/puppet/ruby/3.2.0;C:/ProgramFiles64Folder/PuppetLabs/DevelopmentKit/share/cache/ruby/3.2.0" \ RUBYOPT="-Irubygems-prune" C:/ProgramFiles64Folder/PuppetLabs/DevelopmentKit/private/ruby/3.2.2/bin/gem.bat prune ... The specified module could not be found. - C:/ProgramFiles64Folder/PuppetLabs/DevelopmentKit/private/ruby/3.2.2/lib/ruby/3.2.0/x64-mingw32/psych.so (LoadError) The error is misleading, because it found psych.so, but couldn't load its dependency libyaml-0.2.dll. The reason this occurred was because the pdk-runtime installed libyaml into its prefix bin directory, which is different than its primary ruby bin directory: prefix C:/ProgramFiles64Folder/PuppetLabs/DevelopmentKit/bin/ ruby_dir C:/ProgramFiles64Folder/PuppetLabs/DevelopmentKit/private/ruby/3.2.2/bin However, the prefix bin directory is not in the PATH, so it couldn't load libyaml. This wasn't an issue for non-pdk runtimes, because the prefix and ruby_dir are the same. And on Windows the default Dll search path includes "The folder from which the application loaded."[2] This is not an issue for pdk runtimes on *nix, because we embed /opt/puppetlabs/pdk/lib into the RPATH: # objdump -p /opt/puppetlabs/pdk/private/ruby/3.2.2/lib/ruby/3.2.0/x86_64-linux/psych.so | grep -i path RUNPATH /opt/puppetlabs/pdk/lib:/opt/puppetlabs/pdk/private/ruby/3.2.2/lib So psych.so can load libyaml: # ldd /opt/puppetlabs/pdk/private/ruby/3.2.2/lib/ruby/3.2.0/x86_64-linux/psych.so | grep libyaml libyaml-0.so.2 => /opt/puppetlabs/pdk/lib/libyaml-0.so.2 This is not an issue when running the pdk on Windows, because the wrapper adds the directory to the PATH[3] The same issue existed when the ffi_c.so native extension tried to load libffi. Since libyaml and libffi may be depended on by more than just ruby 3.2, install the libraries in to the prefix directory and copy them into the ruby 3.2 bin directory. This was partially addressed in ba4c955 and reverted in 811a384, but is implemented differently here. [1] https://github.com/puppetlabs/pdk-vanagon/blob/c7d35b03fa014f95570cee9c84fcfd2bbfc7df32/configs/components/gem-prune.rb#L37 [2] https://learn.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order [3] https://github.com/puppetlabs/pdk-vanagon/blob/c7d35b03fa014f95570cee9c84fcfd2bbfc7df32/resources/files/windows/pdk.bat#L7
joshcooper
force-pushed
the
libffi_pdk
branch
from
November 17, 2023 23:50
755467e
to
81059f6
Compare
I was able to build the pdk with this runtime using puppetlabs/pdk-vanagon#345:
|
LukasAud
approved these changes
Nov 20, 2023
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM. Thanks @joshcooper for your help with this.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Previously, the pdk-vanagon's gem prune command[1] failed on Windows with Ruby 3.2:
This commit:
See individual commits for gory details
[1] https://github.com/puppetlabs/pdk-vanagon/blob/c7d35b03fa014f95570cee9c84fcfd2bbfc7df32/configs/components/gem-prune.rb#L37