efc427fdce
This adds a cmake module, FindABIMap, which looks for abimap and provides functions to generate a symbol version linker script. The module can be included using find_package(ABIMap). This also adds the option to compile with symbol versioning. The symbol list is obtained from the header files by filtering those marked with the LIBSSH_API modifier. Such symbols are used as input to generate the version script used by the linker. The version script is automatically updated as new symbols marked with LIBSSH_API are added to the header files. If any symbol is removed, the build will fail due to break in the ABI. Symbol versioning is enabled by default if abimap has been found. It is disabled in non-UNIX platforms. It can be disabled by passing "-DWITH_SYMBOL_VERSIONING=OFF" option to cmake. Pair-Programmed-With: Andreas Schneider <asn@cryptomilk.org> Signed-off-by: Anderson Toshiyuki Sasaki <ansasaki@redhat.com> Signed-off-by: Andreas Schneider <asn@cryptomilk.org>
201 строка
3.9 KiB
Bash
Исполняемый файл
201 строка
3.9 KiB
Bash
Исполняемый файл
#!/bin/bash
|
|
#
|
|
# Last Change: 2008-06-18 14:13:46
|
|
#
|
|
# Script to build libssh on UNIX.
|
|
#
|
|
# Copyright (c) 2006-2007 Andreas Schneider <asn@cryptomilk.org>
|
|
#
|
|
|
|
SOURCE_DIR=".."
|
|
|
|
LANG=C
|
|
export LANG
|
|
|
|
SCRIPT="$0"
|
|
COUNT=0
|
|
while [ -L "${SCRIPT}" ]
|
|
do
|
|
SCRIPT=$(readlink ${SCRIPT})
|
|
COUNT=$(expr ${COUNT} + 1)
|
|
if [ ${COUNT} -gt 100 ]; then
|
|
echo "Too many symbolic links"
|
|
exit 1
|
|
fi
|
|
done
|
|
BUILDDIR=$(dirname ${SCRIPT})
|
|
|
|
cleanup_and_exit () {
|
|
if test "$1" = 0 -o -z "$1" ; then
|
|
exit 0
|
|
else
|
|
exit $1
|
|
fi
|
|
}
|
|
|
|
function configure() {
|
|
if [ -n "${CMAKEDIR}" ]; then
|
|
${CMAKEDIR}/bin/cmake "$@" ${SOURCE_DIR} || cleanup_and_exit $?
|
|
else
|
|
cmake "$@" ${SOURCE_DIR} || cleanup_and_exit $?
|
|
fi
|
|
}
|
|
|
|
function compile() {
|
|
if [ -f /proc/cpuinfo ]; then
|
|
CPUCOUNT=$(grep -c processor /proc/cpuinfo)
|
|
elif test `uname` = "SunOS" ; then
|
|
CPUCOUNT=$(psrinfo -p)
|
|
else
|
|
CPUCOUNT="1"
|
|
fi
|
|
|
|
if [ "${CPUCOUNT}" -gt "1" ]; then
|
|
${MAKE} -j${CPUCOUNT} $1 || cleanup_and_exit $?
|
|
else
|
|
${MAKE} $1 || exit $?
|
|
fi
|
|
}
|
|
|
|
function clean_build_dir() {
|
|
find ! -path "*.svn*" ! -name "*.bat" ! -name "*.sh" ! -name "." -print0 | xargs -0 rm -rf
|
|
}
|
|
|
|
function usage () {
|
|
echo "Usage: `basename $0` [--prefix /install_prefix|--build [debug|final]|--clean|--verbose|--libsuffix (32|64)|--help|--clang|--cmakedir /directory|--make
|
|
(gmake|make)|--ccompiler(gcc|cc)|--withstaticlib|--unittesting|--clientunittesting|--withserver|--withoutsymbolversioning]"
|
|
cleanup_and_exit
|
|
}
|
|
|
|
cd ${BUILDDIR}
|
|
|
|
# the default CMake options:
|
|
OPTIONS="--graphviz=${BUILDDIR}/libssh.dot"
|
|
|
|
# the default 'make' utility:
|
|
MAKE="make"
|
|
|
|
while test -n "$1"; do
|
|
PARAM="$1"
|
|
ARG="$2"
|
|
shift
|
|
case ${PARAM} in
|
|
*-*=*)
|
|
ARG=${PARAM#*=}
|
|
PARAM=${PARAM%%=*}
|
|
set -- "----noarg=${PARAM}" "$@"
|
|
esac
|
|
case ${PARAM} in
|
|
*-help|-h)
|
|
#echo_help
|
|
usage
|
|
cleanup_and_exit
|
|
;;
|
|
*-build)
|
|
DOMAKE="1"
|
|
BUILD_TYPE="${ARG}"
|
|
test -n "${BUILD_TYPE}" && shift
|
|
;;
|
|
*-clean)
|
|
clean_build_dir
|
|
cleanup_and_exit
|
|
;;
|
|
*-clang)
|
|
OPTIONS="${OPTIONS} -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++"
|
|
;;
|
|
*-verbose)
|
|
DOVERBOSE="1"
|
|
;;
|
|
*-memtest)
|
|
OPTIONS="${OPTIONS} -DMEM_NULL_TESTS=ON"
|
|
;;
|
|
*-libsuffix)
|
|
OPTIONS="${OPTIONS} -DLIB_SUFFIX=${ARG}"
|
|
shift
|
|
;;
|
|
*-prefix)
|
|
OPTIONS="${OPTIONS} -DCMAKE_INSTALL_PREFIX=${ARG}"
|
|
shift
|
|
;;
|
|
*-sysconfdir)
|
|
OPTIONS="${OPTIONS} -DSYSCONF_INSTALL_DIR=${ARG}"
|
|
shift
|
|
;;
|
|
*-cmakedir)
|
|
CMAKEDIR="${ARG}"
|
|
shift
|
|
;;
|
|
*-make)
|
|
MAKE="${ARG}"
|
|
shift
|
|
;;
|
|
*-ccompiler)
|
|
OPTIONS="${OPTIONS} -DCMAKE_C_COMPILER=${ARG}"
|
|
shift
|
|
;;
|
|
*-withstaticlib)
|
|
OPTIONS="${OPTIONS} -DWITH_STATIC_LIB=ON"
|
|
;;
|
|
*-unittesting)
|
|
OPTIONS="${OPTIONS} -DUNIT_TESTING=ON"
|
|
;;
|
|
*-clientunittesting)
|
|
OPTIONS="${OPTIONS} -DCLIENT_TESTING=ON"
|
|
;;
|
|
*-withserver)
|
|
OPTIONS="${OPTIONS} -DWITH_SERVER=ON"
|
|
;;
|
|
*-withoutsymbolversioning)
|
|
OPTIONS="${OPTIONS} -DWITH_SYMBOL_VERSIONING=OFF"
|
|
;;
|
|
*-finalrelease)
|
|
OPTIONS="${OPTIONS} -DWITH_FINAL=ON"
|
|
;;
|
|
----noarg)
|
|
echo "$ARG does not take an argument"
|
|
cleanup_and_exit
|
|
;;
|
|
-*)
|
|
echo Unknown Option "$PARAM". Exit.
|
|
cleanup_and_exit 1
|
|
;;
|
|
*)
|
|
usage
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [ "${DOMAKE}" == "1" ]; then
|
|
OPTIONS="${OPTIONS} -DCMAKE_BUILD_TYPE=${BUILD_TYPE}"
|
|
fi
|
|
|
|
if [ -n "${DOVERBOSE}" ]; then
|
|
OPTIONS="${OPTIONS} -DCMAKE_VERBOSE_MAKEFILE=1"
|
|
else
|
|
OPTIONS="${OPTIONS} -DCMAKE_VERBOSE_MAKEFILE=0"
|
|
fi
|
|
|
|
test -f "${BUILDDIR}/.build.log" && rm -f ${BUILDDIR}/.build.log
|
|
touch ${BUILDDIR}/.build.log
|
|
# log everything from here to .build.log
|
|
exec 1> >(exec -a 'build logging tee' tee -a ${BUILDDIR}/.build.log) 2>&1
|
|
echo "${HOST} started build at $(date)."
|
|
echo
|
|
|
|
configure ${OPTIONS} "$@"
|
|
|
|
if [ -n "${DOMAKE}" ]; then
|
|
test -n "${DOVERBOSE}" && compile VERBOSE=1 || compile
|
|
fi
|
|
|
|
DOT=$(which dot 2>/dev/null)
|
|
if [ -n "${DOT}" ]; then
|
|
${DOT} -Tpng -o${BUILDDIR}/libssh.png ${BUILDDIR}/libssh.dot
|
|
${DOT} -Tsvg -o${BUILDDIR}/libssh.svg ${BUILDDIR}/libssh.dot
|
|
fi
|
|
|
|
exec >&0 2>&0 # so that the logging tee finishes
|
|
sleep 1 # wait till tee terminates
|
|
|
|
cleanup_and_exit 0
|