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

Make the library path of libpq available in ruby and add it to the DLL search paths on Windows which lacks rpath. #373

Merged
merged 2 commits into from
Mar 29, 2021

Conversation

larskanis
Copy link
Collaborator

@larskanis larskanis commented Mar 21, 2021

In ELF based systems the libpq path is stored as rpath in pg_ext.so, so that libpq is found, even if it's not in the library search paths.

On Windows however the rpath mechanism doesn't work and the search path for libpq had to be set added manually per RUBY_DLL_PATH. This is now automatically done per RubyInstaller::Runtime.add_dll_directory.

The libpq path is available in extconf.rb while build only (while gem install), so that we have to pass the string to lib/pg.rb where pg_ext.so is loaded (while require 'pg'). This is a bit tricky, since pg_ext.so is linked to libpq, so that the library search path has to be set first, prior to loading pg_ext.so.
Therefore a second file is needed bypassing pg_ext.so. That is postgresql_lib_path.rb and it is passed by mkmf's $INSTALLFILES mechanism.

There's an issue with rake-compiler, which (in contrast to gem install) doesn't copy postgresql_lib_path.rb.
This is addressed in the second commit. Another approach would be to add a second extension file, but that is more complicated.

Fixes #365

... and add it to the search paths on Windows which lacks rpath.

In ELF based systems the libpq path is stored as rpath in pg_ext.so, so that libpq is found, even if it's not in the library search paths.

On Windows however the rpath mechanism doesn't work and the search path for libpq must be added manually.
This is done per RubyInstaller::Runtime.add_dll_directory.

The libpq path is available in extconf.rb while build only (while gem install), so that we have to pass the string to lib/pg.rb where pg_ext.so is loaded (while require 'pg').
This is a bit tricky, since pg_ext.so is linked to libpq, so that the library search path has to be set first, prior to loading pg_ext.so.
Therefore a second file is needed bypassing pg_ext.so.
That is postgresql_lib_path.rb and it is passed by mkmf's $INSTALLFILES mechanism.

There's an issue with rake-compiler, which (in contrast to gem install) doesn't copy postgresql_lib_path.rb.
This has to be addressed separatelly.

Another approach would be to add a second extension file, but that is more complicated.

Fixes ged#365
With this patch rake-compiler executes not just "make" but also "make install" the same way as "gem install" does.
That way postgresql_lib_path.rb is copied into the lib folder as expected.
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.

Ruby 3 Windows 10 Gem load Error
1 participant