windowsvisual-c++libgit2libssh2

How to build libgit2 with embedded libssh2 on Windows


First we build libssh2 with the WinCNG backend using msvc:

cmake . -DCRYPTO_BACKEND=WinCNG -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=%LIBSSH2%
cmake --build . --target install

libgit2 docs say all we have to do is to set DEMBED_SSH_PATH, although it fails to mentation what to set it to. Maybe it's so obvious that it seems irrelevant. However: I'm not a C guy and have no clue of the cmake build process. From what I understand the folder where the result of the previous built resides with all it's subfolders such as include and bin should be the correct path, so using %LIBSSH2% should be fine.

When finally trying to build libgit2 running

cmake . -DBUILD_CLAR=OFF -DCMAKE_BUILD_TYPE=Release -DEMBED_SSH_PATH=%LIBSSH2% -DCMAKE_INSTALL_PREFIX="%LIBGIT2%"
cmake --build . --target install

It'll fail because it's unable to find the links to the header files / binaries. We see things along the line of:

error LNK2019: unresolved external symbol libssh2_init referenced in function

I already tried replacing the paths backslashes \ with normal slashes /, since this seems to be a common issue. I also tried explicitly setting

set CMAKE_INCLUDE_PATH=%LIBSSH2%/include
set CMAKE_LIBRARY_PATH=%LIBSSH2%/lib

both faild with the same result.

Can anyone provide a reproducible way to compile libgit2 with embedded libssh2?


Solution

  • Using EMBED_SSH_PATH means libssh2 sources will be compiled at the same time as libgit2s. This means you don't actually have to compile libssh2 at all.

    I managed to get it to compile successfully by downloading the source for libssh2 and libgit2, then running the following commands:

    cd libgit2
    mkdir build
    cd build
    cmake .. -DBUILD_CLAR=OFF -DCMAKE_BUILD_TYPE=Release -DEMBED_SSH_PATH="C:/path-to-ssh/libssh2" -DCMAKE_INSTALL_PREFIX="%LIBGIT2%"
    cmake --build . --target install
    

    Internally, it looks for all files that match ${EMBED_SSH_PATH}/src/*.cif EMBED_SSH_PATH is set.

    As for using WinCNG as the backend, using embedded SSH creates this file (libssh2_config.h) in the libssh2 directory:

    #define HAVE_WINCNG
    #define LIBSSH2_WINCNG
    #include "../win32/libssh2_config.h"
    

    I assume that means it is already the default backend for an embedded install.