Commit Graph

59 Commits

Author SHA1 Message Date
Edward Thomson
9324d16e73 cmake: standardize USE_THREADS and USE_NSEC
Threading can now be disabled with `USE_THREADS=OFF` instead of
`THREADSAFE=OFF` to better support the other cmake semantics.

Nanosecond support is the default _if_ we can detect it.  This should be
our default always - like threads - and people can opt out explicitly.
2021-11-11 15:56:10 -05:00
Martin Kühl
f66e7f36ff libgit2_clar is now libgit2_tests
in #6083 the test runner was renamed to libgit2_tests,
but not all references to the old name were updated.
this change changes all of them to use the new name.
2021-10-28 10:25:09 +02:00
Laurent Stacul
0a3a220fa9 Discover libssh2 without pkg-config 2021-09-14 09:53:24 +00:00
Dmitry Lobanov
4c0ea9f06d cmake: select hashes umbrella variable has been removed.
Co-authored-by: Edward Thomson <ethomson@github.com>
2021-08-28 20:18:38 +03:00
Dmitry Lobanov
08b3ee2f83 cmake: select hashes missing umbrella header has been added. 2021-08-28 16:17:50 +03:00
Edward Thomson
0903cac1d0 openssl: dynamically load libssl and symbols (optionally)
Provide an interface around OpenSSL to dynamically load the libraries
and symbols, so that users can distribute a libgit2 library that is not
linked directly against OpenSSL.  This enables users to target multiple
distributions with a single binary.

This mechanism is optional and disabled by default.  Configure cmake
with -DUSE_HTTPS=OpenSSL-Dynamic to use it.
2021-08-24 14:09:10 -04:00
Edward Thomson
3062a63364 cmake: extended futimens checking on macOS 2021-07-30 12:03:35 -04:00
Patrick Steinhardt
9bc6e655e1 cmake: remove CheckPrototypeDefinition module
In the past, we've imported the CheckPrototypeDefinition into our own
module directory as it wasn't yet available in all supported CMake
versions. Now that we require at least CMake v3.5, we don't need to
bundle it anymore as it's included with the distribution already.

Let's drop the included modules and always use upstream's version.
2020-07-12 14:45:47 +02:00
Patrick Steinhardt
bc02bcd920 cmake: move modules into the "cmake/" top level dir
Our custom CMake module currently live in "cmake/Modules". As the
"cmake/" directory doesn't contain anything except the "Modules"
directory, it doesn't really make sense to have the additional
intermediate directory. So let's instead move the modules one level up
into the "cmake/" top level directory.
2020-06-01 14:06:20 +02:00
Patrick Steinhardt
b85eefb460 cmake: Sort source files for reproducible builds
We currently use `FILE(GLOB ...)` in most places to find source and
header files. This is problematic in that the order of files returned
depends on the operating system's directory iteration order and may thus
not be deterministic. As a result, we link object files in unspecified
order, which may cause the linker to emit different code across runs.

Fix this issue by sorting all code used as input to the libgit2 library
to improve the reliability of reproducible builds.
2020-05-15 19:57:09 +02:00
Patrick Steinhardt
541de51516 cmake: streamline backend detection
We're currently doing unnecessary work to auto-detect backends even if
the functionality is disabled altogether. Let's fix this by removing the
extraneous FOO_BACKEND variables, instead letting auto-detection modify
the variable itself.
2020-04-01 17:36:13 +02:00
Patrick Steinhardt
87fc539f2e cmake: use install directories provided via GNUInstallDirs
We currently hand-code logic to configure where to install our artifacts
via the `LIB_INSTALL_DIR`, `INCLUDE_INSTALL_DIR` and `BIN_INSTALL_DIR`
variables. This is reinventing the wheel, as CMake already provide a way
to do that via `CMAKE_INSTALL_<DIR>` paths, e.g. `CMAKE_INSTALL_LIB`.
This requires users of libgit2 to know about the discrepancy and will
require special hacks for any build systems that handle these variables
in an automated way. One such example is Gentoo Linux, which sets up
these paths in both the cmake and cmake-utils eclass.

So let's stop doing that: the GNUInstallDirs module handles it in a
better way for us, especially so as the actual values are dependent on
CMAKE_INSTALL_PREFIX. This commit removes our own set of variables and
instead refers users to use the standard ones.

As a second benefit, this commit also fixes our pkgconfig generation to
use the GNUInstallDirs module. We had a bug there where we ignored the
CMAKE_INSTALL_PREFIX when configuring the libdir and includedir keys, so
if libdir was set to "lib64", then libdir would be an invalid path. With
GNUInstallDirs, we can now use `CMAKE_INSTALL_FULL_LIBDIR`, which
handles the prefix for us.
2020-03-14 11:18:20 +01:00
Edward Thomson
e23b8b4465 Merge pull request #5422 from pks-t/pks/cmake-booleans
CMake booleans
2020-03-06 17:13:48 +00:00
Patrick Steinhardt
41b6d30c5f cmake: sanitize boolean options passed by user
Starting with our conversions to mix backend-autodetection and selection
into a single variable (USE_GSSAPI, USE_HTTPS, USE_SHA1), we have
introduced a simple STREQUAL to check for "ON", which indicates that the
user wants us to auto-detect available backends and pick any one that's
available. This behaviour deviates from previous behaviour, as passing a
value like "yes", "on" or "true" will in fact be treated like a backend
name and result in autodetection failure.

Fix the issue by introducing a new function `SanitizeBool`. Given a
variable that may hold a boolean value, the function will sanitize that
variable to hold either "ON" or "OFF". In case it is not a recognized
boolean, we will just keep the value as-is. This fixes the above
described issue.
2020-02-24 21:17:27 +01:00
Tomasz Kłoczko
fbda0575b1 Fix #5410: fix installing libgit2.pc in wrong location
Remove using custom PKG_BUILD_PREFIu, PKG_BUILD_LIBDIR and
PKG_BUILD_INCLUDEDIR variables.
Use cmake CMAKE_INSTALL_PREFIX, LIB_INSTALL_DIR, INCLUDE_INSTALL_DIR instead.
This patch fixes install libgit2.pc file in correct location and simpifies
cmake module.
2020-02-19 12:58:30 +00:00
Edward Thomson
89d1fc2ab9 gssapi: show information about disabled GSSAPI
When USE_GSSAPI=OFF, still show information about what SPNEGO is, even
though it's disabled.  This is for parity with other disabled features
like SSH and debugpool that still show details about what is disabled.
2020-01-24 09:54:28 -06:00
Patrick Steinhardt
0298e0a68c Merge pull request #5238 from tiennou/feature/macos-gss
macOS GSS Support
2019-10-17 12:24:25 +02:00
Etienne Samson
a088a1ffa6 cmake: correct the link stanza for CoreFoundation
LIBRARIES is the (absolute?) path to the library.
LDFLAGS is the full linker stanza to correctly link with this lib.

By passing LIBRARIES as LIBGIT_LIBS, the linker ends up with the
absolute path for the SDK'ed version of CoreFoundation (which doesn't
exist), instead of the familiar `-framework CoreFoundation`.
2019-10-13 14:06:47 +02:00
Etienne Samson
dbc17a7e94 negotiate: use GSS.framework on macOS 2019-10-13 13:54:05 +02:00
Edward Thomson
63307cbad7 Merge pull request #5226 from pks-t/pks/regexp-api
regexp: implement a new regular expression API
2019-09-28 17:32:18 +01:00
Patrick Steinhardt
f585b129e2 posix: remove superseded POSIX regex wrappers
The old POSIX regex wrappers have been superseded by our own regexp API
that provides a higher-level abstraction. Remove the POSIX wrappers in
favor of the new one.
2019-09-21 15:26:19 +02:00
Etienne Samson
d80d9d56a7 cmake: streamline *.pc file handling via a module 2019-09-14 09:33:33 +02:00
Patrick Steinhardt
212b6f6559 cmake: fix various misuses of MESSAGE()
The MESSAGE() function expects as first argument the message type, e.g.
STATUS or FATAL_ERROR. In some places, we were misusing this to either
not provide any type, which would then erroneously print the message to
standard error, or to use FATAL instead of FATAL_ERROR.

Fix all of these instances. Also, remove some MESSAGE invocations that
are obvious leftovers from debugging the build system.
2019-09-13 10:03:38 +02:00
Patrick Steinhardt
e77fdf8716 cmake: properly abort if no mbedTLS cert location is found
When using mbedTLS as backend, then the user may specify the location of
where system certificates are installed. If no such location is provided
by the user, CMake will try to autodetect the location by using the
openssl executable, if installed. If no location could be detected, then
the mbedTLS is essentially worthless as it is completely unable to
verify any certificates.

To avoid use of such misconfigured mbedTLS configurations, let's error
out if we were unable to find out the location.
2019-09-13 10:03:38 +02:00
Etienne Samson
1ed10009ab cmake: remove extraneous logging 2019-09-10 10:07:12 +02:00
Patrick Steinhardt
b7c247b3ad cmake: include SHA1 headers into our source files
When selecting the SHA1 backend, we only include the respective C
implementation of the selected backend. But since commit bd48bf3fb
(hash: introduce source files to break include circles, 2019-06-14), we
have introduced separate headers and compilation units for all hashes.
So by not including the headers, we may not honor them to compute
whether a file needs to be recompiled and they also will not be
displayed in IDEs.

Add the header files to fix this problem.
2019-07-18 13:37:02 +02:00
Patrick Steinhardt
df54c7fb02 cmake: report whether we are using sub-second stat information
Depending on the platform and on build options, we may or may not
build libgit2 with support for nanoseconds when using `stat`
calls. It's currently unclear though whether sub-second stat
information is used at all.

Add feature info for this to tell at configure time whether it's
being used or not.
2019-07-11 08:28:55 +02:00
Patrick Steinhardt
e9102def45 Merge pull request #4438 from pks-t/pks/hash-algorithm
Multiple hash algorithms
2019-06-27 11:38:04 +02:00
Patrick Steinhardt
fda206228f hash: move SHA1 implementations into 'sha1/' folder
As we will include additional hash algorithms in the future due
to upstream git discussing a move away from SHA1, we should
accomodate for that and prepare for the move. As a first step,
move all SHA1 implementations into a common subdirectory.

Also, create a SHA1-specific header file that lives inside the
hash folder. This header will contain the SHA1-specific header
includes, function declarations and the SHA1 context structure.
2019-06-24 18:33:22 +02:00
Edward Thomson
cc9e47c995 win32: support upgrading warnings to errors (/WX)
For MSVC, support warnings as errors by providing the /WX compiler
flags.  (/WX is the moral equivalent of -Werror.)

Disable warnings as errors ass part of xdiff, since it contains
warnings.  But as a component of git itself, we want to avoid skew and
keep our implementation as similar as possible to theirs.  We'll work
with upstream to fix these issues, but in the meantime, simply let those
continue to warn.
2019-06-24 17:27:22 +01:00
Patrick Steinhardt
bd48bf3fb9 hash: introduce source files to break include circles
The hash source files have circular include dependencies right
now, which shows by our broken generic hash implementation. The
"hash.h" header declares two functions and the `git_hash_ctx`
typedef before actually including the hash backend header and can
only declare the remaining hash functions after the include due
to possibly static function declarations inside of the
implementation includes.

Let's break this cycle and help maintainability by creating a
real implementation file for each of the hash implementations.
Instead of relying on the exact include order, we now especially
avoid the use of `GIT_INLINE` for function declarations.
2019-06-24 18:26:32 +02:00
Etienne Samson
94fc83b6d7 cmake: Modulize our TLS & hash detection
The interactions between `USE_HTTPS` and `SHA1_BACKEND` have been
streamlined. Previously we would have accepted not quite working
configurations (like, `-DUSE_HTTPS=OFF -DSHA1_BACKEND=OpenSSL`) and, as
the OpenSSL detection only ran with `USE_HTTPS`, the link would fail.

The detection was moved to a new `USE_SHA1`, modeled after `USE_HTTPS`,
which takes the values "CollisionDetection/Backend/Generic", to better
match how the "hashing backend" is selected, the default (ON) being
"CollisionDetection".

Note that, as `SHA1_BACKEND` is still used internally, you might need to
check what customization you're using it for.
2019-06-14 12:07:00 +02:00
Edward Thomson
ce6d624af2 regex: optionally use PCRE2
Use PCRE2 and its POSIX compatibility layer if requested by the user.
Although PCRE2 is adequate for our needs, the PCRE2 POSIX layer as
installed on Debian and Ubuntu systems is broken, so we do not opt-in to
it by default to avoid breaking users on those platforms.
2019-05-19 11:12:13 +01:00
Edward Thomson
69ecdad5a4 regex: use system PCRE if available
Attempt to locate a system-installed version of PCRE and use its POSIX
compatibility layer, if possible.
2019-05-19 11:12:13 +01:00
cheese1
67562b232a fix typo 2019-04-07 16:45:45 +02:00
lhchavez
6af6170b68 Make ENABLE_WERROR actually work
This change explicitly adds -Werror to the CFLAGS.

Due to the way that the ADD_C_FLAG_IF_SUPPORTED() macro was mangling the
flag name to convert it into a define name, any warning that had a dash
in its name was not being correctly enabled. Additionally, any flag that
is enabled implicitly by the compiler (like -Wunused-result and
-Wdeprecated-declarations) would not cause an error unless they were
explicitly enabled with the ENABLE_WARNINGS() macro.
2019-01-10 06:05:43 -08:00
Etienne Samson
1a9cc18260 util: make the qsort_r check work on macOS
This performs a compile-check by using CMake support, to differentiate the GNU
version from the BSD version of qsort_r.

Module taken from 4f252abea5f1d17c60f6ff115c9c44cc0b6f1df6, which I've checked
against CMake 2.8.11.
2018-08-24 22:00:05 +02:00
Patrick Steinhardt
2e2d8c6493 cmake: detect and use libc-provided iconv
While most systems provide a separate iconv library against which
applications can link, musl based systems do not provide such a library.
Instead, iconv functions are directly included in the C library. As our
current CMake module to locate the iconv library only checks whether a
library exists somewhere in the typical library directories, we will
never build libgit2 with libiconv support on such systems.

Extend the iconv module to also search whether libc provides iconv
functions, which we do by checking whether the `iconv_open` function
exists inside of libc. If this is the case, we will default to use the
libc provided one instead of trying to use a separate libiconv. While
this changes which iconv we use on systems where both libc and an
external libiconv exist, to the best of my knowledge common systems only
provide either one or the other.

Note that libiconv support in musl is held kind of basic. To quote musl
libc's page on functional differences from glibc [1]:

    The iconv implementation musl is very small and oriented towards
    being unobtrusive to static link. Its character set/encoding
    coverage is very strong for its size, but not comprehensive like
    glibc’s.

As we assume iconv to be a lot more capable than what musl provides,
some of our tests will fail if using iconv on musl-based platforms.

[1]: https://wiki.musl-libc.org/functional-differences-from-glibc.html
2018-08-24 09:53:39 +02:00
Patrick Steinhardt
186a7ba5d7 cmake: error out if required C flags are not supported
We do want to notify users compiling our source code early on if they
try to use C flags which aren't supported. Add a new macro `AddCFlag`,
which results in a fatal error in case the flag is not supported, and
use it for our fuzzing flags.
2018-08-03 09:50:35 +02:00
Patrick Steinhardt
0f62e4c739 cmake: resolve libraries found by pkg-config
Libraries found by CMake modules are usually handled with their full
path. This makes linking against those libraries a lot more robust when
it comes to libraries in non-standard locations, as otherwise we might
mix up libraries from different locations when link directories are
given.

One excemption are libraries found by PKG_CHECK_MODULES. Instead of
returning libraries with their complete path, it will return the
variable names as well as a set of link directories. In case where
multiple sets of the same library are installed in different locations,
this can lead the compiler to link against the wrong libraries in the
end, when link directories of other dependencies are added.

To fix this shortcoming, we need to manually resolve library paths
returned by CMake against their respective library directories. This is
an easy task to do with `FIND_LIBRARY`.
2018-05-09 13:50:42 +02:00
Etienne Samson
ca3b2234dc mbedtls: initial support 2018-04-11 21:02:43 +02:00
Edward Thomson
f8a2dda826 cmake: move ENABLE_WARNINGS to a module 2018-02-05 17:17:18 +00:00
Edward Thomson
fc6e38c2fc cmake: Move IDE source munging to a module
Move the odd code that provides a hierarchical display for projects
within the IDEs to its own module.
2018-02-02 18:03:38 -08:00
Edward Thomson
ed298c8eac cmake: move nanosecond detection to a module
Move the nanosecond detection in time structures to its own module.
2018-02-02 18:01:51 -08:00
Etienne Samson
99d6ebb333 cmake: make our macOS helpers more CMake-y 2017-10-23 20:02:35 +02:00
Etienne Samson
152f3766ee cmake: fix indentation before enhancing 2017-10-23 20:02:35 +02:00
Jiří Techet
b7df2e8bdd Don't search iconv in /opt/local
Since OpenSSL isn't used any more on OS X, there is no dependency
on any MacPorts library under /opt/local and there is no danger of
conflicts between MacPorts and system iconv. For this reason the
system iconv can always be used now.
2015-05-01 22:48:33 +02:00
Carlos Martín Nieto
6bb54cbff3 Add a SecureTransport TLS channel
As an alternative to OpenSSL when we're on OS X. This one can actually
take advantage of stacking the streams.
2015-04-23 17:39:51 +02:00
Carlos Martín Nieto
4f91bfa32b Find libssh2 via pkg-config
We don't really need our own module to find libssh2. Using pkg-config
lets the standard tool do the work for us and let us fit more naturally
in the workflow as we respect the pkg-config search paths.
2014-12-05 10:41:54 +01:00
Edward Thomson
315cb38e1e Add GSSAPI support for SPNEGO/Kerberos auth over HTTP 2014-08-15 11:12:42 -04:00