From c8dbfd6434207412b2fc2b75dc54f00c692cfe59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20W=C3=A4ckerlin?= Date: Wed, 1 Jun 2016 12:58:25 +0000 Subject: [PATCH] buid updated --- autogen.sh | 8 +++ ax_init_standard_project.m4 | 76 ++++++++++++++++----- bootstrap.sh | 131 ++++++++++++++++++++++++++---------- build-in-docker.sh | 105 ++++++++++++++++++++++------- resolve-debbuilddeps.sh | 2 +- resolve-rpmbuilddeps.sh | 17 ++++- 6 files changed, 257 insertions(+), 82 deletions(-) create mode 100755 autogen.sh diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 0000000..5811c80 --- /dev/null +++ b/autogen.sh @@ -0,0 +1,8 @@ +#!/bin/bash -e +if test -n "svn" -a -d .svn -a -e -x ; then + svn2cl +fi +aclocal +libtoolize --force +automake -a +autoconf diff --git a/ax_init_standard_project.m4 b/ax_init_standard_project.m4 index bcd9520..4128d9f 100644 --- a/ax_init_standard_project.m4 +++ b/ax_init_standard_project.m4 @@ -12,29 +12,27 @@ m4_define(x_least, m4_ifdef([x_least_fix], [x_least_fix], m4_ifdef([x_least_diff], mrw_esyscmd_s([ VCS_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-checkout" - for path in . .. ../..; do + for path in . .. ../.. ../../..; do if test -d .svn; then + svn upgrade 1>&2 > /dev/null || true VCS_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p') - if test -z "${VCS_REVISION}"; then VCS_REVISION=0; fi - break; + if test -n "${VCS_REVISION}"; then break; fi elif test -d .git; then VCS_REVISION=$(git rev-list --all --count) - if test -z "${VCS_REVISION}"; then VCS_REVISION=0; fi - break; + if test -n "${VCS_REVISION}"; then break; fi fi done echo $ECHO_N $(($VCS_REVISION)) ]), mrw_esyscmd_s([ VCS_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-checkout" - for path in . .. ../..; do + for path in . .. ../.. ../../..; do if test -d .svn; then + svn upgrade 1>&2 > /dev/null || true VCS_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p') - if test -z "${VCS_REVISION}"; then VCS_REVISION=0; fi - break; + if test -n "${VCS_REVISION}"; then break; fi elif test -d .git; then VCS_REVISION=$(git rev-list --all --count) - if test -z "${VCS_REVISION}"; then VCS_REVISION=0; fi - break; + if test -n "${VCS_REVISION}"; then break; fi fi done # Mac does not support LEAST > 255 @@ -46,22 +44,21 @@ m4_define(x_least, m4_ifdef([x_least_fix], [x_least_fix], # define version number from subversion's revision number: # it is taken modulo 256 due to a bug on Apple's MacOSX # add to x_minor if revision number is > 256 -m4_define(x_minor_diff, mrw_esyscmd_s([ +m4_define(x_minor_diff, m4_ifdef([x_least_fix], 0, mrw_esyscmd_s([ VCS_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-checkout" - for path in . .. ../..; do + for path in . .. ../.. ../../..; do if test -d .svn; then + svn upgrade 1>&2 > /dev/null || true VCS_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p') - if test -z "${VCS_REVISION}"; then VCS_REVISION=0; fi - break; + if test -n "${VCS_REVISION}"; then break; fi elif test -d .git; then VCS_REVISION=$(git rev-list --all --count) - if test -z "${VCS_REVISION}"; then VCS_REVISION=0; fi - break; + if test -n "${VCS_REVISION}"; then break; fi fi; done # Mac does not support LEAST > 255 echo $ECHO_N $(($VCS_REVISION/256)) -])) +]))) # setup version number m4_define(x_version, [x_major.m4_ifdef([x_least_diff], x_minor, m4_eval(x_minor+x_minor_diff)).m4_eval(m4_ifdef([x_least_diff], [x_least-x_least_diff], [x_least]))]) @@ -184,6 +181,8 @@ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [ _AM_SUBST_NOTMAKE([AUTHOR]) DISTRO=$(lsb_release -sc 2>/dev/null || uname -s 2>/dev/null) AX_SUBST(DISTRO) + ARCH=$((@<:@@<:@ $(uname -sm) =~ 64 @:>@@:>@ && echo amd64) || (@<:@@<:@ $(uname -sm) =~ 'i?86' @:>@@:>@ && echo i386 || uname -sm)) + AX_SUBST(ARCH) DISTRIBUTOR=$(lsb_release -si 2>/dev/null || uname -s 2>/dev/null) case "${DISTRIBUTOR// /-}" in (Ubuntu) UBUNTU=1; AX_SUBST(UBUNTU);; @@ -312,6 +311,43 @@ maintainer-clean-cxx-targets: EOF ]) +# use this in configure.ac to support old school C +AC_DEFUN([AX_USE_C], [ + AC_LANG(C) + AC_PROG_CC + AC_PROG_CPP + + AC_CONFIG_FILES([src/makefile]) + + AM_CPPFLAGS+=' -I ${top_srcdir}/src -I ${top_builddir}/src -I ${srcdir} -I ${builddir}' + AM_LDFLAGS+=' -L ${top_srcdir}/src -L ${top_builddir}/src' + + # Get rid of those stupid -g -O2 options! + CXXFLAGS="${CXXFLAGS//-g -O2/}" + CFLAGS="${CFLAGS//-g -O2/}" + + # pass compile flags to make distcheck + AM_DISTCHECK_CONFIGURE_FLAGS="CFLAGS='${CFLAGS}' CPPFLAGS='${CPPFLAGS}' CFLAGS='${CFLAGS}' LDFLAGS='${LDFLAGS}'" + AC_SUBST(AM_DISTCHECK_CONFIGURE_FLAGS) + + AC_SUBST(AM_CFLAGS) + AC_SUBST(AM_CPPFLAGS) + AC_SUBST(AM_LDFLAGS) + AX_ADD_MAKEFILE_TARGET_DEP([maintainer-clean-am], [maintainer-clean-c-targets], [src/makefile.in]) + test -f src/makefile.in && cat >> src/makefile.in <> makefile.in < same as -b, but specify target instead of distcheck --overwrite, -o overwrite all basic files (bootstrap.sh, m4-macros) --rebuild, -r force rebuild of generated files, even if modified --rebuild-file, -f rebild specific file (can be added multiple times) + --no-vcs, -n do not automatically add files to version control + --exclude-vcs, -x exclude specific file from version control --help, -h show this help --version, -v show version and date of this file @@ -109,18 +118,21 @@ RUNNING If you run ${MY_NAME}, it first generates the necessary files (see below), then first runs make distclean if a makefile exists. After this it calles aclocal, libtoolize, automake, autoconf and - optionally ./configure. + optionally ./configure. If necessary, files are added to version + control. GENERATED FILES This script copies the following files into your project environment: * ${MY_NAME} + * autogen.sh - just the basics to initialize auto tools and create configure * ax_init_standard_project.m4 - auxiliary macro definition file * ax_cxx_compile_stdcxx_11.m4 - auxiliary macro definition file * ax_check_qt.m4 - auxiliary macro definition file * resolve-debbuilddeps.sh - script to install debian package dependencies * resolve-rpmbuilddeps.sh - script to install RPM package dependencies * build-in-docker.sh - script to build the project encapsulated in a docker container + * build-in-docker.conf - additional configuration for build-in-docker.sh * build-resource-file.sh - build resource.qrc file from a resource directory * sql-to-dot.sed - script to convert SQL schema files to graphviz dot in doxygen * mac-create-app-bundle.sh - script to create apple mac os-x app-bundle @@ -260,20 +272,20 @@ EOF done echo -en "\e[1m-> checking:\e[0m for version control system ..." +VCS="" +VCSDEPENDS="" if test -d .svn; then - VCS="svn" - VCSDEPENDS="subversion" + VCS="svn" + VCSDEPENDS="subversion," + echo -e " \e[32msuccess\e[0m detected ${VCS}" elif test -d .git; then - VCS="git" - VCSDEPENDS="git" + VCS="git" + VCSDEPENDS="git," + echo -e " \e[32msuccess\e[0m detected ${VCS}" else - echo -e " \e[31merror\e[0m" - echo -e "\e[1m*** must be started in root path of a subversion or git repositry\e[0m" - exit 1 + echo -e " \e[33mignored\e[0m" fi -echo -e " \e[32msuccess\e[0m detected ${VCS}" - HEADER='## @id '"\$Id\$"' ## ## This file has been added: @@ -345,7 +357,9 @@ contains() { checkdir() { if ! test -d "$1"; then # create path run mkdir -p "$1" - run ${VCS} add "$1" + if test -n "${VCS}" -a $novcs -eq 0 && ! contains "$1" "${excludevcs[@]}"; then + run ${VCS} add "$1" + fi fi } @@ -358,13 +372,17 @@ checkfile() { } to() { + mode="u=rw,g=rw,o=r" while test $# -gt 0; do - mode="u=rw,g=rw,o=r" case "$1" in (--condition) shift # test for a tag, abort if not set if ! testtag "$1"; then return 0 fi;; + (--unless) shift # test for a tag, abort if set + if testtag "$1"; then + return 0 + fi;; (--mode) shift # test for a tag, abort if not set mode="$1";; (*) break;; @@ -390,11 +408,13 @@ to() { else echo -e " \e[32msuccess\e[0m" fi - chmod $mode $1 + run chmod $mode $1 if test $exists -eq 0; then - run ${VCS} add "$1" - if test "${VCS}" = "svn"; then - run svn propset svn:keywords "Id" "$1" + if test -n "${VCS}" -a $novcs -eq 0 && ! contains "$1" "${excludevcs[@]}"; then + run ${VCS} add "$1" + if test "${VCS}" = "svn"; then + run svn propset svn:keywords "Id" "$1" + fi fi fi return 0 @@ -415,9 +435,11 @@ copy() { fi run cp "${source}" "$1" if test $exists -eq 0; then - run ${VCS} add "$1" - if test "${VCS}" = "svn"; then - run svn propset svn:keywords "Id" "$1" + if test -n "${VCS}" -a $novcs -eq 0 && ! contains "$1" "${excludevcs[@]}"; then + run ${VCS} add "$1" + if test "${VCS}" = "svn"; then + run svn propset svn:keywords "Id" "$1" + fi fi fi } @@ -446,21 +468,27 @@ doxyadd() { vcs2cl() { exists=0 - if test -f "Changelog"; then + if test -f "ChangeLog"; then exists=1 - fi - if test "${VCS}" = "git"; then - ${VCS}2cl > ChangeLog else - ${VCS}2cl + touch "ChangeLog" + fi + if test -x $(which ${VCS}2cl); then + if test "${VCS}" = "git"; then + ${VCS}2cl > ChangeLog + elif test -n "${VCS}"; then + ${VCS}2cl + fi fi if test $exists -eq 0; then - run ${VCS} add ChangeLog + if test -n "${VCS}" -a $novcs -eq 0 && ! contains "ChangeLog" "${excludevcs[@]}"; then + run ${VCS} add ChangeLog + fi fi } # Check if we are in subversion root, if so, create trunk, branches, tags: -if test "${VCS}" = "svn"; then +if test "${VCS}" = "svn" -a $novcs -eq 0; then if test "$(LANG= svn info | sed -n 's,Relative URL: *,,p')" = "^/"; then svn mkdir trunk branches tags cd trunk @@ -771,7 +799,9 @@ ${HEADER}dist_bin_SCRIPTS = MAINTAINERCLEANFILES = makefile.in EOF echo "${HEADER}MAINTAINERCLEANFILES = makefile.in" | to --condition AX_USE_DOXYGEN doc/makefile.am -to --condition AX_BUILD_TEST test/runtests.sh < ${0%/*}/test/runtests.sh +if testtag AX_BUILD_TEST; then + to test/runtests.sh < ${0%/*}/test/runtests.sh +fi to --condition 'AX_BUILD_TEST|AX_USE_CPPUNIT' test/makefile.am < ChangeLog";; +esac) +fi +aclocal +$(if testtag AX_USE_LIBTOOL; then echo libtoolize --force; fi) +automake -a +autoconf +EOF to makefile.am< mode: apt or yum, default: ${mode}" echo " -i, --image use given docker image instead of ${img}" echo " -t, --targets targets specify build targets, default: ${targets}" echo " -r, --repo add given apt repository" @@ -31,6 +34,9 @@ while test $# -gt 0; do echo " -d, --dir access given directory read only" echo " -p, --package install extra debian packages" echo " -c, --cmd execute commands as root in docker" + echo " -w, --wait on error keep docker container and wait for enter" + echo + echo " The option -i must be after -m, because mode sets a new default image" echo echo " The options -r -k -e -d -p -c can be repeated several times." echo @@ -58,6 +64,17 @@ while test $# -gt 0; do echo exit 0 ;; + (-m|--mode) shift; + mode="$1" + case "$mode" in + (apt) img="ubuntu:latest";; + (yum) img="centos:latest";; + (*) + echo "**** ERROR: unknown mode '$1', try --help" 1>&2 + exit 1 + ;; + esac + ;; (-i|--image) shift; img="$1" ;; @@ -82,6 +99,9 @@ while test $# -gt 0; do (-c|--cmd) shift; commands+=("$1") ;; + (-w|--wait) + wait=1 + ;; (*) echo "**** ERROR: unknown option '$1', try --help" 1>&2 exit 1 @@ -113,7 +133,12 @@ function traperror() { fi echo fi - echo "**** Entering docker container ${DOCKER_ID}, exit with Ctrl-D" + if [ "$wait" -eq 1 ]; then + echo " ... now you can access the docker container:" + echo " docker exec -u $(id -u) -it ${DOCKER_ID} bash" + echo -n " ... press enter to cleanup: " + read + fi echo -n " ... cleanup docker: " docker rm -f "${DOCKER_ID}" echo "returning status: $e" @@ -121,6 +146,12 @@ function traperror() { exit $e fi done + if [ "$wait" -eq 1 ]; then + echo " ... now you can access the docker container:" + echo " docker exec -u $(id -u) -it ${DOCKER_ID} bash" + echo -n " ... press enter to cleanup: " + read + fi echo -n " SUCCESS ... cleanup docker: " docker rm -f "${DOCKER_ID}" exit 0 @@ -154,25 +185,53 @@ set -x docker pull $img DOCKER_ID=$(docker run -d ${dirs[@]} ${envs[@]} -w /workdir $img sleep infinity) trap 'traperror '"${DOCKER_ID}"' "$? ${PIPESTATUS[@]}" $LINENO $BASH_LINENO "$BASH_COMMAND" "${FUNCNAME[@]}" "${FUNCTION}"' SIGINT INT TERM EXIT -docker exec ${DOCKER_ID} apt-get update -docker exec ${DOCKER_ID} apt-get upgrade -y -docker exec ${DOCKER_ID} apt-get install -y python-software-properties software-properties-common apt-transport-https dpkg-dev lsb-release || \ - docker exec ${DOCKER_ID} apt-get install -y software-properties-common apt-transport-https dpkg-dev lsb-release || \ - docker exec ${DOCKER_ID} apt-get install -y python-software-properties apt-transport-https dpkg-dev lsb-release; -for repo in "${repos[@]}"; do - ifthenelse "${repo}" "apt-add-repository ARG" -done -for key in "${keys[@]}"; do - wget -O- "$key" \ - | docker exec -i ${DOCKER_ID} apt-key add - -done -docker exec ${DOCKER_ID} apt-get update -for package in "${packages[@]}"; do - ifthenelse "${package}" "apt-get install -y --force-yes ARG" -done -for command in "${commands[@]}"; do - ifthenelse "${command}" "ARG" -done -docker exec ${DOCKER_ID} ./resolve-debbuilddeps.sh -docker exec -u $(id -u) ${DOCKER_ID} svn upgrade || true -docker exec -u $(id -u) ${DOCKER_ID} ./bootstrap.sh -t "${targets}" +case $mode in + (apt) + OPTIONS='-o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confnew -y --force-yes --no-install-suggests --no-install-recommends' + for f in 'libpam-systemd:amd64' 'policykit*' 'colord'; do + docker exec ${DOCKER_ID} bash -c "echo 'Package: $f' >> /etc/apt/preferences" + docker exec ${DOCKER_ID} bash -c "echo 'Pin-Priority: -100' >> /etc/apt/preferences" + docker exec ${DOCKER_ID} bash -c "echo >> /etc/apt/preferences" + done + docker exec ${DOCKER_ID} apt-get update ${OPTIONS} + docker exec ${DOCKER_ID} apt-get upgrade ${OPTIONS} + docker exec ${DOCKER_ID} apt-get install ${OPTIONS} python-software-properties software-properties-common apt-transport-https dpkg-dev lsb-release || \ + docker exec ${DOCKER_ID} apt-get install ${OPTIONS} software-properties-common apt-transport-https dpkg-dev lsb-release || \ + docker exec ${DOCKER_ID} apt-get install ${OPTIONS} python-software-properties apt-transport-https dpkg-dev lsb-release; + for repo in "${repos[@]}"; do + ifthenelse "${repo}" "apt-add-repository ARG" + done + for key in "${keys[@]}"; do + wget -O- "$key" \ + | docker exec -i ${DOCKER_ID} apt-key add - + done + docker exec ${DOCKER_ID} apt-get update ${OPTIONS} + for package in "${packages[@]}"; do + ifthenelse "${package}" "apt-get install ${OPTIONS} ARG" + done + for command in "${commands[@]}"; do + ifthenelse "${command}" "ARG" + done + docker exec ${DOCKER_ID} ./resolve-debbuilddeps.sh + ;; + (yum) + ./bootstrap.sh -t dist + if [[ "$img" =~ "centos" ]]; then + docker exec ${DOCKER_ID} yum install -y redhat-lsb + docker exec -i ${DOCKER_ID} bash -c 'cat > /etc/yum.repos.d/wandisco-svn.repo' <> /etc/yum.repos.d/wandisco-svn.repo' + docker exec -i ${DOCKER_ID} bash -c 'cat >> /etc/yum.repos.d/wandisco-svn.repo' <&1 | grep -q 'N: Unable to locate package')" && ! ${DO} dpkg -l "${f}"; then TO_INSTALL+=" ${f}" fi done diff --git a/resolve-rpmbuilddeps.sh b/resolve-rpmbuilddeps.sh index f36a875..5ddd1b2 100755 --- a/resolve-rpmbuilddeps.sh +++ b/resolve-rpmbuilddeps.sh @@ -12,19 +12,30 @@ SCHROOTNAME="$1" PACKAGE_NAME=$(sed -n 's/^ *m4_define(x_package_name, \(.*\)).*/\1/p' configure.ac) +PKGCONFIGS="${2:-epel-release}" # packages to configure yum if test -n "${SCHROOTNAME}"; then - schroot -c ${SCHROOTNAME} -- ./bootstrap.sh -t dist FILES=$(LANG= schroot -c ${SCHROOTNAME} -- rpmbuild -bb --clean --nobuild --define "_topdir ." --define "_sourcedir ." ${PACKAGE_NAME}.spec 2>&1 | sed -n 's, is needed by.*,,p') if test -n "${FILES}"; then + FIRST=$(echo "${FILES}" | egrep -o "${PKGCONFIGS// /|}") + if test -n "${FIRST}"; then + schroot -c ${SCHROOTNAME} -u root -- yum install -y ${FIRST} || \ + schroot -c ${SCHROOTNAME} -u root -- zypper install -y ${FIRST} || \ + schroot -c ${SCHROOTNAME} -u root -- dnf install -y ${FIRST} + fi schroot -c ${SCHROOTNAME} -u root -- yum install -y ${FILES} || \ schroot -c ${SCHROOTNAME} -u root -- zypper install -y ${FILES} || \ - schroot -c ${SCHROOTNAME} -u root -- dnf install -y ${FILES} + schroot -c ${SCHROOTNAME} -u root -- dnf install -y ${FILES} fi else - ./bootstrap.sh -t dist FILES=$(LANG= rpmbuild -bb --clean --nobuild --define "_topdir ." --define "_sourcedir ." ${PACKAGE_NAME}.spec 2>&1 | sed -n 's, is needed by.*,,p') if test -n "${FILES}"; then + FIRST=$(echo "${FILES}" | egrep -o "${PKGCONFIGS// /|}") + if test -n "${FIRST}"; then + yum install -y ${FIRST} || \ + zypper install -y ${FIRST} || \ + dnf install -y ${FIRST} + fi yum install -y ${FILES} || \ zypper install -y ${FILES} || \ dnf install -y ${FILES}