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

postgresql: Remove dev dependencies from closure #179962

Closed
wants to merge 8 commits into from

Conversation

jtojnar
Copy link
Member

@jtojnar jtojnar commented Jul 3, 2022

Description of changes

Reduces size of out: 327.3M → 243.6M

Things done
  • Built on platform(s)
    • x86_64-linux
    • aarch64-linux
    • x86_64-darwin
    • aarch64-darwin
  • For non-Linux: Is sandbox = true set in nix.conf? (See Nix manual)
  • Tested, as applicable:
  • Tested compilation of all packages that depend on this change using nix-shell -p nixpkgs-review --run "nixpkgs-review rev HEAD". Note: all changes have to be committed, also see nixpkgs-review usage
  • Tested basic functionality of all binary files (usually in ./result/bin/)
  • 22.11 Release Notes (or backporting 22.05 Release notes)
    • (Package updates) Added a release notes entry if the change is major or breaking
    • (Module updates) Added a release notes entry if the change is significant
    • (Module addition) Added a release notes entry if adding a new NixOS module
    • (Release notes changes) Ran nixos/doc/manual/md-to-db.sh to update generated release notes
  • Fits CONTRIBUTING.md.

+ echo "#define INCLUDEDIRSERVER \"/dev/null/include/server\"" >>$@
echo "#define LIBDIR \"$(libdir)\"" >>$@
echo "#define PKGLIBDIR \"$(pkglibdir)\"" >>$@
echo "#define LOCALEDIR \"$(localedir)\"" >>$@
Copy link
Member Author

Choose a reason for hiding this comment

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

We could shave 16M more by removing man and doc output references.

@jtojnar jtojnar marked this pull request as draft July 3, 2022 01:22
@jtojnar jtojnar force-pushed the postgres-closure-size branch from 79cf3ff to 516faaf Compare July 3, 2022 14:34
@jtojnar jtojnar marked this pull request as ready for review July 3, 2022 14:36
Copy link
Member

@SuperSandro2000 SuperSandro2000 left a comment

Choose a reason for hiding this comment

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

or are the files copied into an output?

@jtojnar jtojnar force-pushed the postgres-closure-size branch from 516faaf to 4461a4d Compare July 12, 2022 16:12
@jtojnar
Copy link
Member Author

jtojnar commented Jul 12, 2022

@ofborg build postgresql_10 postgresql_11 postgresql_12 postgresql_13 postgresql_14

@jtojnar jtojnar force-pushed the postgres-closure-size branch from 4461a4d to 67b91ed Compare July 12, 2022 19:55
@jtojnar
Copy link
Member Author

jtojnar commented Jul 12, 2022

@ofborg build postgresql_10 postgresql_11 postgresql_12 postgresql_13 postgresql_14

@jtojnar jtojnar force-pushed the postgres-closure-size branch from 67b91ed to cbca884 Compare July 12, 2022 22:04
@ofborg ofborg bot added the 8.has: package (new) This PR adds a new package label Jul 12, 2022
@jtojnar jtojnar force-pushed the postgres-closure-size branch 2 times, most recently from 2894ece to beaa49a Compare August 18, 2022 22:52
@Ma27
Copy link
Member

Ma27 commented Dec 7, 2023

I'll try to take a look this weekend.

`pg_config` stores configure flags into the library/program for debugging
or something. Since `PKG_CONFIG_PATH` somehow ends up in there, `dev` outputs
of dependencies get pulled into the runtime closure.

Let’s clear the paths in the variable to reduce the closure size.

Reduces size of out: 287.8M → 236.5M
No closure reduction this time since there are still more references.
@jtojnar
Copy link
Member Author

jtojnar commented Dec 8, 2023

Looks like the current reduction of postgresql.out (18%: 287.8M → 236.5M → 235.5M) is not as pronounced as the last one (26%: 327.3M → 292.6M → 243.4M).

So unless there were some regressions, the commit splitting the dev output may not be worth the added complexity now.

@jtojnar jtojnar force-pushed the postgres-closure-size branch from d07037b to 7ab57c1 Compare December 8, 2023 18:59

configdata[i].name = pstrdup("PGXS");
- get_pkglib_path(my_exec_path, path);
+ strlcpy(path, "/dev/null", sizeof(path));
Copy link
Member

Choose a reason for hiding this comment

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

What's the rationale in here to make this /dev/null first and then replace that with @dev@?

Copy link
Member Author

Choose a reason for hiding this comment

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

IIRC pg_config.c is installed to dev output but config_info.c ends up as a part of out.

}

+static char*
+get_config_val(ConfigData configdata) {
Copy link
Member

Choose a reason for hiding this comment

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

Also why is this passed by reference here?

Copy link
Member Author

Choose a reason for hiding this comment

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

It is passed by value, is not it? We could pass a pointer to it if we want to avoid copying the whole struct but I do not think this is worth it – the functions will probably only be called at extension build time and compiler might inline the function anyway.

Copy link
Member

Choose a reason for hiding this comment

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

meh, I mixed them up, I meant pass-by-value and wanted to ask why 🙃

- echo "#define INCLUDEDIR \"$(includedir)\"" >>$@
- echo "#define PKGINCLUDEDIR \"$(pkgincludedir)\"" >>$@
- echo "#define INCLUDEDIRSERVER \"$(includedir_server)\"" >>$@
+ echo "#define INCLUDEDIR \"/dev/null/include\"" >>$@
Copy link
Member

Choose a reason for hiding this comment

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

Doesn't this break with e.g. https://github.com/postgres/postgres/blob/aa210e0c121eb8f58c86d4fcc833a5a6fbb6f5a9/src/interfaces/ecpg/preproc/ecpg.c#L256 since get_include_path uses INCLUDEDIR generated by this makefile?

Copy link
Member Author

Choose a reason for hiding this comment

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

It will return the wrong value but the assumption is that nothing uses the function for anything other than printing it in some build information pages.

@@ -87,7 +99,6 @@ let
"--with-libxml"
"--with-icu"
"--sysconfdir=/etc"
"--libdir=$(lib)/lib"
Copy link
Member

Choose a reason for hiding this comment

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

I'm probably missing something, but how are .so files moved to the lib output now?

Copy link
Member Author

Choose a reason for hiding this comment

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

We previously passed setOutputFlags = false; so we had to set it explicitly. Now that I removed it, multiple-outputs hook passes this for us.

@@ -87,6 +87,10 @@ let
tomli
];

buildInputs = [
postgresql
];
Copy link
Member

Choose a reason for hiding this comment

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

Can you elaborate why this is now needed?

Copy link
Member Author

Choose a reason for hiding this comment

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

This is just a proper place for this as a library dependency. Ideally, we would remove it from nativeBuildInputs but that will probably not work until psycopg/psycopg2#1001. cc @SuperSandro2000 who made this change.

Copy link
Member

Choose a reason for hiding this comment

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

Yes, IIRC they use pg_config

Copy link
Member Author

Choose a reason for hiding this comment

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

Added a comment.

pkgs/servers/sql/postgresql/default.nix Show resolved Hide resolved
AC_CONFIG_AUX_DIR(config)
AC_PREFIX_DEFAULT(/usr/local/pgsql)
-AC_DEFINE_UNQUOTED(CONFIGURE_ARGS, ["$ac_configure_args"], [Saved arguments from configure])
+AC_DEFINE_UNQUOTED(CONFIGURE_ARGS, ["`echo "$ac_configure_args" | sed -E 's~/nix/store/.{32}-~/nix/store/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee-~g'`"], [Saved arguments from configure])
Copy link
Member

Choose a reason for hiding this comment

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

What's happening to e.g. tzdata which is also part of the configure flags and a store path? This means that every single reference in configureFlags silently gets discarded, correct?

Copy link
Member Author

Choose a reason for hiding this comment

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

Yes. But these should just be for informational reports.

@jtojnar jtojnar marked this pull request as draft December 9, 2023 21:47
@github-actions github-actions bot added 8.has: documentation This PR adds or changes documentation 6.topic: ruby labels Dec 9, 2023
@SuperSandro2000
Copy link
Member

So unless there were some regressions, the commit splitting the dev output may not be worth the added complexity now.

Now that we are done with it, we should keep it, to keep out dev things from the final system.

@jtojnar
Copy link
Member Author

jtojnar commented Dec 10, 2023

Weirdly, python310Packages.psycopg tests fail non-deterministically (first I thought the dev commit was responsible but I have since managed to build it without errors so I am not sure):

_______________________ test_leak[asyncio-dict_row-iter] _______________________

aconn_cls = <class 'psycopg.AsyncConnection'>
dsn = 'host=/build/run/postgresql user=psycopg'
faker = <tests.fix_faker.Faker object at 0x7fffb096a680>, fetch = 'iter'
row_factory = <function dict_row at 0x7fffb34784c0>

    @pytest.mark.slow
    @pytest.mark.parametrize("fetch", ["one", "many", "all", "iter"])
    @pytest.mark.parametrize("row_factory", ["tuple_row", "dict_row", "namedtuple_row"])
    async def test_leak(aconn_cls, dsn, faker, fetch, row_factory):
        faker.choose_schema(ncols=5)
        faker.make_records(10)
        row_factory = getattr(rows, row_factory)
    
        async def work():
            async with await aconn_cls.connect(dsn) as conn, conn.transaction(
                force_rollback=True
            ):
                async with psycopg.AsyncClientCursor(conn, row_factory=row_factory) as cur:
                    await cur.execute(faker.drop_stmt)
                    await cur.execute(faker.create_stmt)
                    async with faker.find_insert_problem_async(conn):
                        await cur.executemany(faker.insert_stmt, faker.records)
                    await cur.execute(faker.select_stmt)
    
                    if fetch == "one":
                        while True:
                            tmp = await cur.fetchone()
                            if tmp is None:
                                break
                    elif fetch == "many":
                        while True:
                            tmp = await cur.fetchmany(3)
                            if not tmp:
                                break
                    elif fetch == "all":
                        await cur.fetchall()
                    elif fetch == "iter":
                        async for rec in cur:
                            pass
    
        n = []
        gc_collect()
        for i in range(3):
            await work()
            gc_collect()
            n.append(gc_count())
    
>       assert n[0] == n[1] == n[2], f"objects leaked: {n[1] - n[0]}, {n[2] - n[1]}"
E       AssertionError: objects leaked: 1, -1
E       assert 216420 == 216421

tests/test_client_cursor_async.py:680: AssertionError
=========================== short test summary info ============================
FAILED tests/test_copy_async.py::test_copy_to_leaks[asyncio-rows-Format.BINARY-True] - AssertionError: objects leaked: 1, -1
FAILED tests/test_copy_async.py::test_copy_to_leaks[asyncio-rows-Format.TEXT-False] - AssertionError: objects leaked: -1, 0
FAILED tests/test_copy_async.py::test_copy_from_leaks[asyncio-Format.TEXT-False] - AssertionError: objects leaked: -1, 0
FAILED tests/test_copy_async.py::test_copy_to_leaks[asyncio-iter-Format.BINARY-True] - AssertionError: objects leaked: -1, 0
FAILED tests/test_copy_async.py::test_copy_to_leaks[asyncio-read-Format.TEXT-False] - AssertionError: objects leaked: 1, -1
FAILED tests/test_copy_async.py::test_copy_to_leaks[asyncio-read-Format.BINARY-True] - AssertionError: objects leaked: 0, 1
FAILED tests/test_copy_async.py::test_copy_to_leaks[asyncio-rows-Format.TEXT-True] - AssertionError: objects leaked: 0, 1
FAILED tests/test_copy_async.py::test_copy_to_leaks[asyncio-row-Format.TEXT-False] - AssertionError: objects leaked: 1, -1
FAILED tests/test_copy_async.py::test_copy_to_leaks[asyncio-read-Format.TEXT-True] - AssertionError: objects leaked: -1, 0
FAILED tests/test_copy_async.py::test_copy_to_leaks[asyncio-iter-Format.TEXT-False] - AssertionError: objects leaked: 0, 1
FAILED tests/test_copy_async.py::test_copy_to_leaks[asyncio-row-Format.BINARY-True] - AssertionError: objects leaked: 0, 1
FAILED tests/test_copy_async.py::test_copy_to_leaks[asyncio-row-Format.TEXT-True] - AssertionError: objects leaked: 0, 1
FAILED tests/test_cursor_async.py::test_leak[asyncio-tuple_row-iter-Format.BINARY-b] - AssertionError: objects leaked: -1, 0
FAILED tests/test_cursor_async.py::test_leak[asyncio-dict_row-iter-Format.BINARY-b] - AssertionError: objects leaked: 0, 1
FAILED tests/test_cursor_async.py::test_leak[asyncio-dict_row-iter-Format.TEXT-b] - AssertionError: objects leaked: 1, -1
FAILED tests/test_cursor_async.py::test_leak[asyncio-tuple_row-all-Format.TEXT-t] - AssertionError: objects leaked: 0, 1
FAILED tests/test_cursor_async.py::test_leak[asyncio-dict_row-iter-Format.BINARY-s] - AssertionError: objects leaked: 0, 1
FAILED tests/test_cursor_async.py::test_leak[asyncio-namedtuple_row-many-Format.TEXT-b] - AssertionError: objects leaked: 1, -1
FAILED tests/test_cursor_async.py::test_leak[asyncio-tuple_row-many-Format.BINARY-s] - AssertionError: objects leaked: 0, 1
FAILED tests/test_cursor_async.py::test_leak[asyncio-tuple_row-one-Format.TEXT-b] - AssertionError: objects leaked: 1, -1
FAILED tests/test_cursor_async.py::test_leak[asyncio-namedtuple_row-many-Format.BINARY-b] - AssertionError: objects leaked: 0, 1
FAILED tests/test_cursor_async.py::test_leak[asyncio-tuple_row-iter-Format.BINARY-s] - AssertionError: objects leaked: 0, 1
FAILED tests/test_cursor_async.py::test_leak[asyncio-tuple_row-iter-Format.TEXT-b] - AssertionError: objects leaked: -1, 0
FAILED tests/test_cursor_async.py::test_leak[asyncio-namedtuple_row-all-Format.TEXT-t] - AssertionError: objects leaked: 1, -1
FAILED tests/test_cursor_async.py::test_leak[asyncio-dict_row-iter-Format.TEXT-s] - AssertionError: objects leaked: 1, -1
FAILED tests/test_cursor_async.py::test_leak[asyncio-dict_row-one-Format.TEXT-s] - AssertionError: objects leaked: 0, 1
FAILED tests/test_cursor_async.py::test_leak[asyncio-tuple_row-all-Format.TEXT-s] - AssertionError: objects leaked: -1, 0
FAILED tests/test_cursor_async.py::test_leak[asyncio-tuple_row-all-Format.TEXT-b] - AssertionError: objects leaked: 1, -1
FAILED tests/test_cursor_async.py::test_leak[asyncio-tuple_row-iter-Format.TEXT-s] - AssertionError: objects leaked: 0, 1
FAILED tests/test_cursor_async.py::test_leak[asyncio-namedtuple_row-many-Format.TEXT-s] - AssertionError: objects leaked: -1, 0
FAILED tests/test_cursor_async.py::test_leak[asyncio-tuple_row-all-Format.BINARY-s] - AssertionError: objects leaked: 0, 1
FAILED tests/test_cursor_async.py::test_leak[asyncio-namedtuple_row-one-Format.TEXT-s] - AssertionError: objects leaked: 0, 1
FAILED tests/test_cursor_async.py::test_leak[asyncio-dict_row-iter-Format.BINARY-t] - AssertionError: objects leaked: -1, 0
FAILED tests/test_cursor_async.py::test_leak[asyncio-tuple_row-iter-Format.BINARY-t] - AssertionError: objects leaked: -1, 0
FAILED tests/test_cursor_async.py::test_leak[asyncio-tuple_row-all-Format.BINARY-b] - AssertionError: objects leaked: -1, 0
FAILED tests/test_cursor_async.py::test_leak[asyncio-namedtuple_row-all-Format.TEXT-s] - AssertionError: objects leaked: 1, -1
FAILED tests/test_cursor_async.py::test_leak[asyncio-dict_row-many-Format.TEXT-s] - AssertionError: objects leaked: 1, -1
FAILED tests/test_cursor_async.py::test_leak[asyncio-tuple_row-all-Format.BINARY-t] - AssertionError: objects leaked: 1, -1
FAILED tests/test_cursor_async.py::test_leak[asyncio-tuple_row-one-Format.BINARY-b] - AssertionError: objects leaked: 1, -1
FAILED tests/test_cursor_async.py::test_leak[asyncio-dict_row-iter-Format.TEXT-t] - AssertionError: objects leaked: 0, 1
FAILED tests/test_cursor_async.py::test_leak[asyncio-dict_row-all-Format.TEXT-t] - AssertionError: objects leaked: -1, 0
FAILED tests/test_cursor_async.py::test_leak[asyncio-tuple_row-many-Format.TEXT-s] - AssertionError: objects leaked: 1, -1
FAILED tests/test_cursor_async.py::test_leak[asyncio-dict_row-all-Format.TEXT-b] - AssertionError: objects leaked: 1, -1
FAILED tests/test_cursor_async.py::test_leak[asyncio-dict_row-all-Format.BINARY-s] - AssertionError: objects leaked: 1, -1
FAILED tests/test_cursor_async.py::test_leak[asyncio-dict_row-all-Format.BINARY-b] - AssertionError: objects leaked: -1, 0
FAILED tests/test_cursor_async.py::test_leak[asyncio-namedtuple_row-one-Format.BINARY-b] - AssertionError: objects leaked: 0, 1
FAILED tests/test_cursor_async.py::test_leak[asyncio-tuple_row-many-Format.TEXT-t] - AssertionError: objects leaked: -1, 0
FAILED tests/test_cursor_async.py::test_leak[asyncio-tuple_row-iter-Format.TEXT-t] - AssertionError: objects leaked: 1, -1
FAILED tests/test_cursor_async.py::test_leak[asyncio-dict_row-all-Format.BINARY-t] - AssertionError: objects leaked: -1, 0
FAILED tests/test_cursor_async.py::test_leak[asyncio-dict_row-one-Format.TEXT-t] - AssertionError: objects leaked: 1, -1
FAILED tests/test_cursor_async.py::test_leak[asyncio-tuple_row-many-Format.BINARY-b] - AssertionError: objects leaked: -1, 0
FAILED tests/test_cursor_async.py::test_leak[asyncio-namedtuple_row-many-Format.BINARY-t] - AssertionError: objects leaked: -1, 0
FAILED tests/test_cursor_async.py::test_leak[asyncio-dict_row-one-Format.BINARY-b] - AssertionError: objects leaked: 1, -1
FAILED tests/test_cursor_async.py::test_leak[asyncio-namedtuple_row-one-Format.TEXT-b] - AssertionError: objects leaked: -1, 0
FAILED tests/test_cursor_async.py::test_leak[asyncio-namedtuple_row-iter-Format.BINARY-s] - AssertionError: objects leaked: 1, -1
FAILED tests/test_cursor_async.py::test_leak[asyncio-namedtuple_row-iter-Format.TEXT-b] - AssertionError: objects leaked: 1, -1
FAILED tests/test_cursor_async.py::test_leak[asyncio-namedtuple_row-iter-Format.BINARY-t] - AssertionError: objects leaked: 0, 1
FAILED tests/test_cursor_async.py::test_leak[asyncio-tuple_row-one-Format.BINARY-t] - AssertionError: objects leaked: 1, -1
FAILED tests/test_cursor_async.py::test_leak[asyncio-namedtuple_row-one-Format.TEXT-t] - AssertionError: objects leaked: 0, 1
FAILED tests/test_cursor_async.py::test_leak[asyncio-namedtuple_row-all-Format.BINARY-s] - AssertionError: objects leaked: -1, 0
FAILED tests/test_cursor_async.py::test_leak[asyncio-namedtuple_row-one-Format.BINARY-s] - AssertionError: objects leaked: 1, -1
FAILED tests/test_cursor_async.py::test_leak[asyncio-dict_row-many-Format.TEXT-b] - AssertionError: objects leaked: 1, -1
FAILED tests/test_cursor_async.py::test_leak[asyncio-namedtuple_row-many-Format.BINARY-s] - AssertionError: objects leaked: 0, 1
FAILED tests/test_cursor_async.py::test_leak[asyncio-namedtuple_row-iter-Format.TEXT-t] - AssertionError: objects leaked: -1, 0
FAILED tests/test_cursor_async.py::test_leak[asyncio-dict_row-many-Format.BINARY-t] - AssertionError: objects leaked: -1, 0
FAILED tests/test_cursor_async.py::test_leak[asyncio-dict_row-one-Format.BINARY-t] - AssertionError: objects leaked: 1, -1
FAILED tests/test_client_cursor_async.py::test_leak[asyncio-dict_row-many] - AssertionError: objects leaked: -1, 0
FAILED tests/test_client_cursor_async.py::test_leak[asyncio-namedtuple_row-many] - AssertionError: objects leaked: -1, 1
FAILED tests/test_client_cursor_async.py::test_leak[asyncio-namedtuple_row-one] - AssertionError: objects leaked: -1, 0
FAILED tests/test_client_cursor_async.py::test_leak[asyncio-tuple_row-one] - AssertionError: objects leaked: -1, 0
FAILED tests/test_client_cursor_async.py::test_leak[asyncio-namedtuple_row-all] - AssertionError: objects leaked: 0, 1
FAILED tests/test_client_cursor_async.py::test_leak[asyncio-namedtuple_row-iter] - AssertionError: objects leaked: 0, -1
FAILED tests/test_client_cursor_async.py::test_leak[asyncio-tuple_row-all] - AssertionError: objects leaked: 0, 1
FAILED tests/test_client_cursor_async.py::test_leak[asyncio-tuple_row-iter] - AssertionError: objects leaked: -1, 0
FAILED tests/test_client_cursor_async.py::test_leak[asyncio-tuple_row-many] - AssertionError: objects leaked: -1, 0
FAILED tests/test_client_cursor_async.py::test_leak[asyncio-dict_row-iter] - AssertionError: objects leaked: 1, -1
= 76 failed, 4393 passed, 148 skipped, 78 deselected, 29 xfailed in 589.11s (0:09:49) =

@SuperSandro2000
Copy link
Member

I think we can just ignore those. There are many other tests that pass and from the description they read like they can't be that stable.

@jtojnar jtojnar marked this pull request as ready for review December 10, 2023 10:22
@jtojnar jtojnar requested a review from mweinelt as a code owner December 10, 2023 10:22
jtojnar and others added 6 commits December 10, 2023 13:37
The package contains some files only necessary for linking other software
against PgSQL’s libraries. Those files include compiler flags that reference
`dev` outputs of other libraries, unnecessarily increasing the runtime closure.
Let’s move those files to a `dev` output, reducing the runtime closure of `out`.

We also need to clear out some paths hardcoded into the libs to avoid
a dependency cycle between the `dev` and `out` outputs. This includes
the path to PGXS files for the `libpgcommon` and `postgres` server
(used e.g. by `SELECT pg_config()` query); we restore the path explicitly
for `pg_config` program. The `out` output will be the root of the graph.

This further reduces the closure size of out from 236.5M to 235.5M.
@jtojnar jtojnar force-pushed the postgres-closure-size branch from 57c494f to 8f21582 Compare December 10, 2023 12:58
@wegank wegank added the 2.status: merge conflict This PR has merge conflicts with the target branch label Mar 20, 2024
@wegank wegank added the 2.status: stale https://github.com/NixOS/nixpkgs/blob/master/.github/STALE-BOT.md label Jul 4, 2024
@wolfgangwalther
Copy link
Contributor

Superseded by #294504

wolfgangwalther added a commit to wolfgangwalther/nixpkgs that referenced this pull request Aug 24, 2024
This was supposed to happen in NixOS#294504, but the commit was accidentally
left out when splitting off some libpq-related changes. Originated in
NixOS#179962, by Sandro.

Co-authored-by: Sandro Jäckel <sandro.jaeckel@gmail.com>
Co-authored-by: Wolfgang Walther <walther@technowledgy.de>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
2.status: merge conflict This PR has merge conflicts with the target branch 2.status: stale https://github.com/NixOS/nixpkgs/blob/master/.github/STALE-BOT.md 6.topic: python 6.topic: ruby 8.has: documentation This PR adds or changes documentation 8.has: package (new) This PR adds a new package 10.rebuild-darwin: 501+ 10.rebuild-darwin: 1001-2500 10.rebuild-linux: 501+ 10.rebuild-linux: 5001+
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants