Skip to content

camke: include libssh2 in Requires.private in the PC file#7215

Open
carlosmn wants to merge 1 commit intolibgit2:mainfrom
carlosmn:cmn/ssh2-pc-requires
Open

camke: include libssh2 in Requires.private in the PC file#7215
carlosmn wants to merge 1 commit intolibgit2:mainfrom
carlosmn:cmn/ssh2-pc-requires

Conversation

@carlosmn
Copy link
Member

We need this in order for pkg-config to be able to tell what you should link against when building libgit2 statically. We do include libssh2 in Libs.private but not in Requires.private. The difference is a bit subtle but has become important.

You can call pkg-config --libs --static ${build}/libgit2.pc and it will give you what is in the Libs line, and also what the packages from the Requires field have in theirs. This is what e.g. rugged does and it has been working until recently. An update to openssl to require zstd now means that using --libs --static returns -lzstd as well as many others. This means that those who want to link using that command now need to have the development packages for zstd installed, which should not be necessary as libgit2 itself doesn't want to use anything from it.

A better command to use here seems to be pkg-config --libs --static --pure ${build}/libgit2.pc. The manpage and help output are not very precise but what this does is limit the list of dependencies to a single layer, which is what we want as we would only want to link statically against libgit2 and not the rest of the libraries.

But trying to do so breaks building with libssh2 as it's included in the Libs field rather than the Requires, so that command excludes any linking to libssh2.

Put libssh2 in the Requires.private field so we correctly express we need to link to it when linking statically.

This is unfortunately an imperfect fix as now, if we did not find libssh2 via pkg-config but rather via CMake's find_package, the combination of --static --pure does not take Libs.private into account. However we only support this as an edge case and we expect pkg-config to be available for the rest of our dependencies.


I found this via libgit2/rugged#986 and libgit2/rugged#990 but I can't fix it via --static --pure until libgit2 is more accurate about this.

I'm not sure about the -lrt we have there wrt to this (or in general). The resulting libgit2.so and libgit2_tests don't end up linked against them and removing that line seems to make no difference to the build so maybe it's all part of libc now and a GNU userland doesn't need it?

We need this in order for `pkg-config` to be able to tell what you should link
against when building libgit2 statically. We do include libssh2 in
`Libs.private` but not in `Requires.private`. The difference is a bit subtle but
has become important.

You can call `pkg-config --libs --static ${build}/libgit2.pc` and it will give
you what is in the Libs line, and also what the packages from the Requires field
have in theirs. This is what e.g. `rugged` does and it has been working until
recently. An update to openssl to require zstd now means that using `--libs
--static` returns `-lzstd` as well as many others. This means that those who
want to link using that command now need to have the development packages for
zstd installed, which should not be necessary as libgit2 itself doesn't want to
use anything from it.

A better command to use here seems to be `pkg-config --libs --static --pure
${build}/libgit2.pc`. The manpage and help output are not very precise but what
this does is limit the list of dependencies to a single layer, which is what we
want as we would only want to link statically against libgit2 and not the rest
of the libraries.

But trying to do so breaks building with libssh2 as it's included in the Libs
field rather than the Requires, so that command excludes any linking to libssh2.

Put libssh2 in the `Requires.private` field so we correctly express we need to
link to it when linking statically.

This is unfortunately an imperfect fix as now, if we did not find libssh2 via
pkg-config but rather via CMake's `find_package`, the combination of `--static
--pure` does not take `Libs.private` into account. However we only support this
as an edge case and we expect `pkg-config` to be available for the rest of our
dependencies.
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.

1 participant