On 14.01.25 21:01, David E. Wheeler wrote:
I tried `prefix` with semver[3] and it did not work:

``` console
❯ make PG_CONFIG=~/dev/misc/postgres/pgsql-devel/bin/pg_config 
prefix=/Users/david/pgsql-test
gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement 
-Werror=vla -Werror=unguarded-availability-new -Wendif-labels 
-Wmissing-format-attribute -Wcast-function-type -Wformat-security 
-Wmissing-variable-declarations -fno-strict-aliasing -fwrapv 
-fexcess-precision=standard -Wno-unused-command-line-argument 
-Wno-compound-token-split-by-macro -Wno-cast-function-type-strict 
-I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/openssl/include 
-I/opt/homebrew/opt/libxml2/include -I/opt/homebrew/opt/icu4c/include  
-fvisibility=hidden -I. -I./ -I/Users/david/pgsql-test/include/server 
-I/Users/david/pgsql-test/include/internal 
-I/opt/homebrew/Cellar/icu4c@76/76.1_1/include -isysroot 
/Library/Developer/CommandLineTools/SDKs/MacOSX15.1.sdk 
-I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/openssl/include 
-I/opt/homebrew/opt/libxml2/include -I/opt/homebrew/opt/icu4c/include   -c -o 
src/semver.o src/semver.c
src/semver.c:13:10: fatal error: 'postgres.h' file not found
    13 | #include "postgres.h"
       |          ^~~~~~~~~~~~
1 error generated.
make: *** [src/semver.o] Error 1
```

prefix= should only be set when running the "install" target, not when building (make all).

But then it won’t load:

```psql
postgres=# create extension semver;
ERROR:  extension "semver" has no installation script nor update path for version 
“0.40.0"
```

Since `semver` uses the directory parameter[4],

Yeah, this is the problem. I'm not sure what to do about it. Setting the directory parameter is a bit like setting an absolute rpath. You're then stuck with that particular directory location.

So I suspect the issue is that, when looking for SQL files, the patch needs to 
use the directory parameter[4] when it’s set --- and it can be an absolute 
path! Honestly I think there’s a case to be made for eliminating that parameter.

Possibly. I didn't know why extensions would use that parameter, before you showed an example.

I thought it would put the files into /Users/david/pgsql-test/extension, not 
/Users/david/pgsql-test/share/extension? I guess that makes sense; but then 
perhaps the search path should be for prefixes, in which case I’d use a config 
like:

``` ini
extension_control_path = '/Users/david/pgsql-test:$system'
dynamic_library_path = '/Users/david/pgsql-test/lib:$libdir'
```

And the search path would append `share/extension` to each path. But then it 
varies from the behavior of `dynamic_library_path`. :-(

Yes exactly.  This is meant to be symmetrical.

We could have a setting that just sets the top-level prefixes to search and would thus supersede both of these settings. But then you introduce another lay of complications, such as, the subdirectory structure under the prefix is not necessarily fixed. It could be lib, lib/postgresql, lib64, etc., similar under share. It's not even required that there is a common prefix.

This disables the use of dynamic_library_path, so this whole idea of installing 
an extension elsewhere won't work that way.  The obvious solution is that 
extensions change this to just 'foo'.  But this will require a lot updating 
work for many extensions, or a lot of patching by packagers.


I have solved this by just stripping off "$libdir/" from the front of the 
filename.  This works for now.  We can think about other ways to tweak this, perhaps, but 
I don't see any drawback to this in practice.

I think this makes perfect sense. I presume it’s stripped out *before* 
replacing the MODULE_PATHNAME string in SQL files, yes?

No, actually it's done after.  Does it make a difference?

# Patch Review

Compiles fine. All tests pass. Some comments on the docs:

  <primary><varname>extension_control_path</varname> configuration 
parameter</primary>

Although the current path explicitly searches for control files, I’d like to 
suggest a more generic name, since the point is to find extensions; control 
files are just the (current) method for identifying them. I suggest 
`extension_path`. Although given the above, maybe it should be all about 
prefixes.

If we implemented a prefix approach, then 'extension_path' could be a good name. But right now we're not.

         The value for <varname>extension_control_path</varname> must be a
         list of absolute directory paths separated by colons (or semi-colons
         on Windows).  If a list element starts
         with the special string <literal>$system</literal>, the

I like this idea, though I quibble with the term `$system`, which seems like it 
would identify SYSCONFDIR, not SHAREDIR/extension. How about `$extdir` or, if 
using prefixes, `$coreprefix` or something.

I'm not attached to '$system', but I don't see how you get from that to SYSCONFDIR. The other suggestions also have various ways of misinterpreting them. We can keep thinking about this one.

         Note that the path elements should typically end in
         <literal>extension</literal> if the normal installation layouts are
         followed.  (The value for <literal>$system</literal> already includes
         the <literal>extension</literal> suffix.)

In fact, if we’re using `prefix` as currently implemented, it should end in 
`share/extension`, no?

It could be share/postgresql/extension, too. So I didn't want to overdocument this, because it could vary. The examples just above this are hopefully helpful.



Reply via email to