mirror of
https://github.com/libssh2/libssh2.git
synced 2025-11-20 02:42:09 +03:00
Use existing MSYS2 section and extend it with builds for the MSYS environment with both autotools and cmake. MSYS builds resemble Cygwin ones: The env is Unixy, where Windows headers are all available but we don't use them. Also: - extend existing autotools logic for Cygwin to skip detecting `windows.h` for MSYS targets too. - require `windows.h` for the WinCNG backend in autotools. Before this patch, autotools allowed selecting WinCNG on the Cygwin and MSYS platforms, but the builds then fell apart due to the resulting mixed Unixy + Windowsy environment. The general expectation for Cygwin/MSYS builds is not to use the Windows API directly in them. - stop manually selecting the `MSYS Makefiles` CMake generator for MSYS2-based GHA CI builds. mingw-w64 builds work fine without it, but it broke MSYS build which use `Unix Makefiles`. Deleting this setting fixes all build flavours. Closes #1162
435 lines
12 KiB
Plaintext
435 lines
12 KiB
Plaintext
# Copyright (C) The libssh2 project and its contributors.
|
|
#
|
|
# SPDX-License-Identifier: BSD-3-Clause
|
|
#
|
|
|
|
# AC_PREREQ(2.59)
|
|
AC_INIT([libssh2],[-],[libssh2-devel@lists.haxx.se])
|
|
AC_CONFIG_MACRO_DIR([m4])
|
|
AC_CONFIG_SRCDIR([src])
|
|
AC_CONFIG_HEADERS([src/libssh2_config.h])
|
|
AC_REQUIRE_AUX_FILE([tap-driver.sh])
|
|
AM_MAINTAINER_MODE
|
|
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
|
|
|
|
dnl SED is needed by some of the tools
|
|
AC_PATH_PROG( SED, sed, sed-was-not-found-by-configure,
|
|
$PATH:/usr/bin:/usr/local/bin)
|
|
AC_SUBST(SED)
|
|
|
|
if test "x$SED" = "xsed-was-not-found-by-configure"; then
|
|
AC_MSG_WARN([sed was not found, this may ruin your chances to build fine])
|
|
fi
|
|
|
|
dnl figure out the libssh2 version
|
|
LIBSSH2_VERSION=`$SED -ne 's/^#define LIBSSH2_VERSION *"\(.*\)"/\1/p' ${srcdir}/include/libssh2.h`
|
|
AM_INIT_AUTOMAKE
|
|
AC_MSG_CHECKING([libssh2 version])
|
|
AC_MSG_RESULT($LIBSSH2_VERSION)
|
|
|
|
AC_SUBST(LIBSSH2_VERSION)
|
|
|
|
# Check for the OS.
|
|
# Daniel's note: this should not be necessary and we need to work to
|
|
# get this removed.
|
|
AC_CANONICAL_HOST
|
|
case "$host" in
|
|
*-mingw*)
|
|
LIBS="$LIBS -lws2_32"
|
|
;;
|
|
*darwin*)
|
|
;;
|
|
*hpux*)
|
|
;;
|
|
*osf*)
|
|
CFLAGS="$CFLAGS -D_POSIX_PII_SOCKET"
|
|
;;
|
|
*)
|
|
;;
|
|
esac
|
|
|
|
dnl Our configure and build reentrant settings
|
|
CURL_CONFIGURE_REENTRANT
|
|
|
|
# Some systems (Solaris?) have socket() in -lsocket.
|
|
AC_SEARCH_LIBS(socket, socket)
|
|
|
|
# Solaris has inet_addr() in -lnsl.
|
|
AC_SEARCH_LIBS(inet_addr, nsl)
|
|
|
|
AC_SUBST(LIBS)
|
|
|
|
AC_PROG_CC
|
|
AC_PROG_CXX
|
|
AC_PROG_INSTALL
|
|
AC_PROG_LN_S
|
|
AC_PROG_MAKE_SET
|
|
AC_PATH_PROGS(SSHD, [sshd], [],
|
|
[$PATH$PATH_SEPARATOR/usr/libexec$PATH_SEPARATOR]dnl
|
|
[/usr/sbin$PATH_SEPARATOR/usr/etc$PATH_SEPARATOR/etc])
|
|
AM_CONDITIONAL(SSHD, test -n "$SSHD")
|
|
m4_ifdef([LT_INIT],
|
|
[dnl
|
|
LT_INIT([win32-dll])
|
|
],[dnl
|
|
AC_LIBTOOL_WIN32_DLL
|
|
AC_PROG_LIBTOOL
|
|
])
|
|
AC_C_BIGENDIAN
|
|
|
|
LT_LANG([Windows Resource])
|
|
|
|
dnl check for how to do large files
|
|
AC_SYS_LARGEFILE
|
|
|
|
# Crypto backends
|
|
|
|
found_crypto=none
|
|
found_crypto_str=""
|
|
crypto_errors=""
|
|
|
|
m4_set_add([crypto_backends], [openssl])
|
|
m4_set_add([crypto_backends], [libgcrypt])
|
|
m4_set_add([crypto_backends], [mbedtls])
|
|
m4_set_add([crypto_backends], [wincng])
|
|
m4_set_add([crypto_backends], [wolfssl])
|
|
|
|
AC_ARG_WITH([crypto],
|
|
AS_HELP_STRING([--with-crypto=auto|]m4_set_contents([crypto_backends], [|]),
|
|
[Select crypto backend (default: auto)]),
|
|
use_crypto=$withval,
|
|
use_crypto=auto
|
|
)
|
|
|
|
case "${use_crypto}" in
|
|
auto|m4_set_contents([crypto_backends], [|]))
|
|
m4_set_map([crypto_backends], [LIBSSH2_CHECK_CRYPTO])
|
|
;;
|
|
yes|"")
|
|
crypto_errors="No crypto backend specified."
|
|
;;
|
|
*)
|
|
crypto_errors="Unknown crypto backend '${use_crypto}' specified."
|
|
;;
|
|
esac
|
|
|
|
if test "$found_crypto" = "none"; then
|
|
crypto_errors="${crypto_errors}
|
|
Specify --with-crypto=\$backend and/or the necessary library search prefix.
|
|
|
|
Known crypto backends: auto, m4_set_contents([crypto_backends], [, ])"
|
|
AS_MESSAGE([ERROR: ${crypto_errors}])
|
|
else
|
|
test "$found_crypto_str" = "" && found_crypto_str="$found_crypto"
|
|
fi
|
|
|
|
# libz
|
|
|
|
AC_ARG_WITH([libz],
|
|
AS_HELP_STRING([--with-libz],[Use libz for compression]),
|
|
use_libz=$withval,
|
|
use_libz=auto)
|
|
|
|
found_libz=no
|
|
libz_errors=""
|
|
|
|
if test "$use_libz" != no; then
|
|
AC_LIB_HAVE_LINKFLAGS([z], [], [#include <zlib.h>])
|
|
if test "$ac_cv_libz" != yes; then
|
|
if test "$use_libz" = auto; then
|
|
AC_MSG_NOTICE([Cannot find libz, disabling compression])
|
|
found_libz="disabled; no libz found"
|
|
else
|
|
libz_errors="No libz found.
|
|
Try --with-libz-prefix=PATH if you know that you have it."
|
|
AS_MESSAGE([ERROR: $libz_errors])
|
|
fi
|
|
else
|
|
AC_DEFINE(LIBSSH2_HAVE_ZLIB, 1, [Compile in zlib support])
|
|
LIBSSH2_PC_REQUIRES_PRIVATE="$LIBSSH2_PC_REQUIRES_PRIVATE${LIBSSH2_PC_REQUIRES_PRIVATE:+,}zlib"
|
|
found_libz="yes"
|
|
fi
|
|
fi
|
|
|
|
AC_SUBST(LIBSSH2_PC_REQUIRES_PRIVATE)
|
|
|
|
#
|
|
# Optional Settings
|
|
#
|
|
AC_ARG_ENABLE(clear-memory,
|
|
AS_HELP_STRING([--disable-clear-memory],[Disable clearing of memory before being freed]),
|
|
[CLEAR_MEMORY=$enableval])
|
|
if test "$CLEAR_MEMORY" = "no"; then
|
|
AC_DEFINE(LIBSSH2_NO_CLEAR_MEMORY, 1, [Disable clearing of memory before being freed])
|
|
enable_clear_memory=no
|
|
else
|
|
enable_clear_memory=yes
|
|
fi
|
|
|
|
dnl ************************************************************
|
|
dnl option to switch on compiler debug options
|
|
dnl
|
|
AC_MSG_CHECKING([whether to enable pedantic and debug compiler options])
|
|
AC_ARG_ENABLE(debug,
|
|
AS_HELP_STRING([--enable-debug],[Enable pedantic and debug options])
|
|
AS_HELP_STRING([--disable-debug],[Disable debug options]),
|
|
[ case "$enable_debug" in
|
|
no)
|
|
AC_MSG_RESULT(no)
|
|
CPPFLAGS="$CPPFLAGS -DNDEBUG"
|
|
;;
|
|
*) AC_MSG_RESULT(yes)
|
|
enable_debug=yes
|
|
CPPFLAGS="$CPPFLAGS -DLIBSSH2DEBUG"
|
|
CFLAGS="$CFLAGS -g"
|
|
|
|
dnl set compiler "debug" options to become more picky, and remove
|
|
dnl optimize options from CFLAGS
|
|
CURL_CC_DEBUG_OPTS
|
|
;;
|
|
esac
|
|
],
|
|
enable_debug=no
|
|
AC_MSG_RESULT(no)
|
|
)
|
|
|
|
dnl ************************************************************
|
|
dnl Enable hiding of internal symbols in library to reduce its size and
|
|
dnl speed dynamic linking of applications. This currently is only supported
|
|
dnl on gcc >= 4.0 and SunPro C.
|
|
dnl
|
|
AC_MSG_CHECKING([whether to enable hidden symbols in the library])
|
|
AC_ARG_ENABLE(hidden-symbols,
|
|
AS_HELP_STRING([--enable-hidden-symbols],[Hide internal symbols in library])
|
|
AS_HELP_STRING([--disable-hidden-symbols],[Leave all symbols with default visibility in library]),
|
|
[ case "$enableval" in
|
|
no)
|
|
AC_MSG_RESULT(no)
|
|
;;
|
|
*)
|
|
AC_MSG_CHECKING([whether $CC supports it])
|
|
if test "$GCC" = yes ; then
|
|
if $CC --help --verbose 2>&1 | grep fvisibility= > /dev/null ; then
|
|
AC_MSG_RESULT(yes)
|
|
AC_DEFINE(LIBSSH2_API, [__attribute__ ((visibility ("default")))], [to make a symbol visible])
|
|
CFLAGS="$CFLAGS -fvisibility=hidden"
|
|
else
|
|
AC_MSG_RESULT(no)
|
|
fi
|
|
|
|
else
|
|
dnl Test for SunPro cc
|
|
if $CC 2>&1 | grep flags >/dev/null && $CC -flags | grep xldscope= >/dev/null ; then
|
|
AC_MSG_RESULT(yes)
|
|
AC_DEFINE(LIBSSH2_API, [__global], [to make a symbol visible])
|
|
CFLAGS="$CFLAGS -xldscope=hidden"
|
|
else
|
|
AC_MSG_RESULT(no)
|
|
fi
|
|
fi
|
|
;;
|
|
esac ],
|
|
AC_MSG_RESULT(no)
|
|
)
|
|
|
|
# Build tests?
|
|
AC_ARG_ENABLE([tests],
|
|
[AS_HELP_STRING([--disable-tests], [Disable tests @<:@default=enabled@:>@])],
|
|
[
|
|
if ! test "x${enable_tests}" = "xyes"; then
|
|
enable_tests="no"
|
|
fi
|
|
],
|
|
[enable_tests="yes"])
|
|
AM_CONDITIONAL([ENABLE_TESTS], [test "x$enable_tests" = xyes])
|
|
|
|
# Run Docker tests?
|
|
AC_ARG_ENABLE([docker-tests],
|
|
[AS_HELP_STRING([--disable-docker-tests],
|
|
[Do not run tests requiring Docker])],
|
|
[run_docker_tests=no], [run_docker_tests=yes])
|
|
AM_CONDITIONAL([RUN_DOCKER_TESTS], [test "x$run_docker_tests" != "xno"])
|
|
|
|
# Run sshd tests?
|
|
AC_ARG_ENABLE([sshd-tests],
|
|
[AS_HELP_STRING([--disable-sshd-tests],
|
|
[Do not run tests requiring sshd])],
|
|
[run_sshd_tests=no], [run_sshd_tests=yes])
|
|
AM_CONDITIONAL([RUN_SSHD_TESTS], [test "x$run_sshd_tests" != "xno"])
|
|
|
|
# Build example applications?
|
|
AC_MSG_CHECKING([whether to build example applications])
|
|
AC_ARG_ENABLE([examples-build],
|
|
AS_HELP_STRING([--enable-examples-build], [Build example applications (this is the default)])
|
|
AS_HELP_STRING([--disable-examples-build], [Do not build example applications]),
|
|
[case "$enableval" in
|
|
no | false)
|
|
build_examples='no'
|
|
;;
|
|
*)
|
|
build_examples='yes'
|
|
;;
|
|
esac], [build_examples='yes'])
|
|
AC_MSG_RESULT($build_examples)
|
|
AM_CONDITIONAL([BUILD_EXAMPLES], [test "x$build_examples" != "xno"])
|
|
|
|
|
|
# Build OSS fuzzing targets?
|
|
AC_ARG_ENABLE([ossfuzzers],
|
|
[AS_HELP_STRING([--enable-ossfuzzers],
|
|
[Whether to generate the fuzzers for OSS-Fuzz])],
|
|
[have_ossfuzzers=yes], [have_ossfuzzers=no])
|
|
AM_CONDITIONAL([USE_OSSFUZZERS], [test "x$have_ossfuzzers" = "xyes"])
|
|
|
|
|
|
# Set the correct flags for the given fuzzing engine.
|
|
AC_SUBST([LIB_FUZZING_ENGINE])
|
|
AM_CONDITIONAL([USE_OSSFUZZ_FLAG], [test "x$LIB_FUZZING_ENGINE" = "x-fsanitize=fuzzer"])
|
|
AM_CONDITIONAL([USE_OSSFUZZ_STATIC], [test -f "$LIB_FUZZING_ENGINE"])
|
|
|
|
|
|
# Checks for header files.
|
|
AC_CHECK_HEADERS([errno.h fcntl.h stdio.h unistd.h sys/param.h sys/uio.h])
|
|
AC_CHECK_HEADERS([sys/select.h sys/socket.h sys/ioctl.h sys/time.h])
|
|
AC_CHECK_HEADERS([arpa/inet.h netinet/in.h])
|
|
AC_CHECK_HEADERS([sys/un.h])
|
|
|
|
case $host in
|
|
*-*-msys | *-*-cygwin* | *-*-cegcc*)
|
|
# These are POSIX-like systems using BSD-like sockets API.
|
|
;;
|
|
*)
|
|
AC_CHECK_HEADERS([windows.h], [have_windows_h=yes], [have_windows_h=no])
|
|
;;
|
|
esac
|
|
|
|
case $host in
|
|
*darwin*|*interix*)
|
|
dnl poll() does not work on these platforms
|
|
dnl Interix: "does provide poll(), but the implementing developer must
|
|
dnl have been in a bad mood, because poll() only works on the /proc
|
|
dnl filesystem here"
|
|
dnl macOS poll() has funny behaviors, like:
|
|
dnl not being able to do poll on no fildescriptors (10.3?)
|
|
dnl not being able to poll on some files (like anything in /dev)
|
|
dnl not having reliable timeout support
|
|
dnl inconsistent return of POLLHUP where other implementations give POLLIN
|
|
AC_MSG_NOTICE([poll use is disabled on this platform])
|
|
;;
|
|
*)
|
|
AC_CHECK_FUNCS(poll)
|
|
;;
|
|
esac
|
|
|
|
AC_CHECK_FUNCS(gettimeofday select strtoll explicit_bzero explicit_memset memset_s snprintf)
|
|
|
|
dnl Check for select() into ws2_32 for Msys/Mingw
|
|
if test "$ac_cv_func_select" != "yes"; then
|
|
AC_MSG_CHECKING([for select in ws2_32])
|
|
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
|
#ifdef HAVE_WINDOWS_H
|
|
#ifndef WIN32_LEAN_AND_MEAN
|
|
#define WIN32_LEAN_AND_MEAN
|
|
#endif
|
|
#include <winsock2.h>
|
|
#endif
|
|
]], [[
|
|
select(0,(fd_set *)NULL,(fd_set *)NULL,(fd_set *)NULL,(struct timeval *)NULL);
|
|
]])],[
|
|
AC_MSG_RESULT([yes])
|
|
HAVE_SELECT="1"
|
|
AC_DEFINE_UNQUOTED(HAVE_SELECT, 1,
|
|
[Define to 1 if you have the select function.])
|
|
],[
|
|
AC_MSG_RESULT([no])
|
|
])
|
|
fi
|
|
|
|
AC_FUNC_ALLOCA
|
|
|
|
# Checks for typedefs, structures, and compiler characteristics.
|
|
AC_C_CONST
|
|
AC_C_INLINE
|
|
|
|
CURL_CHECK_NONBLOCKING_SOCKET
|
|
|
|
missing_required_deps=0
|
|
|
|
if test "${libz_errors}" != ""; then
|
|
AS_MESSAGE([ERROR: ${libz_errors}])
|
|
missing_required_deps=1
|
|
fi
|
|
|
|
if test "$found_crypto" = "none"; then
|
|
AS_MESSAGE([ERROR: ${crypto_errors}])
|
|
missing_required_deps=1
|
|
fi
|
|
|
|
if test $missing_required_deps = 1; then
|
|
AC_MSG_ERROR([Required dependencies are missing.])
|
|
fi
|
|
|
|
AM_CONDITIONAL([HAVE_WINDRES],
|
|
[test "x$have_windows_h" = "xyes" && test "x${enable_shared}" = "xyes" && test -n "${RC}"])
|
|
|
|
AM_CONDITIONAL([HAVE_LIB_STATIC], [test "x$enable_static" != "xno"])
|
|
|
|
# Configure parameters
|
|
LIBSSH2_CHECK_OPTION_WERROR
|
|
|
|
# Append crypto lib
|
|
if test "$found_crypto" = "openssl"; then
|
|
LIBS="${LIBS} ${LTLIBSSL}"
|
|
elif test "$found_crypto" = "wolfssl"; then
|
|
LIBS="${LIBS} ${LTLIBWOLFSSL}"
|
|
elif test "$found_crypto" = "libgcrypt"; then
|
|
LIBS="${LIBS} ${LTLIBGCRYPT}"
|
|
elif test "$found_crypto" = "wincng"; then
|
|
LIBS="${LIBS} ${LTLIBBCRYPT}"
|
|
elif test "$found_crypto" = "mbedtls"; then
|
|
LIBS="${LIBS} ${LTLIBMBEDCRYPTO}"
|
|
fi
|
|
|
|
LIBS="${LIBS} ${LTLIBZ}"
|
|
|
|
LIBSSH2_PC_LIBS_PRIVATE=$LIBS
|
|
AC_SUBST(LIBSSH2_PC_LIBS_PRIVATE)
|
|
|
|
dnl merge the pkg-config private fields into public ones when static-only
|
|
if test "x$enable_shared" = "xyes"; then
|
|
LIBSSH2_PC_REQUIRES=
|
|
LIBSSH2_PC_LIBS=
|
|
else
|
|
LIBSSH2_PC_REQUIRES=$LIBSSH2_PC_REQUIRES_PRIVATE
|
|
LIBSSH2_PC_LIBS=$LIBSSH2_PC_LIBS_PRIVATE
|
|
fi
|
|
AC_SUBST(LIBSSH2_PC_REQUIRES)
|
|
AC_SUBST(LIBSSH2_PC_LIBS)
|
|
|
|
AC_CONFIG_FILES([Makefile
|
|
src/Makefile
|
|
tests/Makefile
|
|
tests/ossfuzz/Makefile
|
|
example/Makefile
|
|
docs/Makefile
|
|
libssh2.pc])
|
|
AC_OUTPUT
|
|
|
|
AC_MSG_NOTICE([summary of build options:
|
|
|
|
version: ${LIBSSH2_VERSION}
|
|
Host type: ${host}
|
|
Install prefix: ${prefix}
|
|
Compiler: ${CC}
|
|
Compiler flags: ${CFLAGS}
|
|
Library types: Shared=${enable_shared}, Static=${enable_static}
|
|
Crypto library: ${found_crypto_str}
|
|
zlib compression: ${found_libz}
|
|
Clear memory: $enable_clear_memory
|
|
Debug build: $enable_debug
|
|
Build examples: $build_examples
|
|
Run Docker tests: $run_docker_tests
|
|
Run sshd tests: $run_sshd_tests
|
|
Path to sshd: $ac_cv_path_SSHD (only for self-tests)
|
|
])
|