From 3b965156adfcf9ffce7ce3a36a2e82b34daba600 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20W=C3=A4ckerlin?= Date: Wed, 4 Apr 2018 20:19:13 +0000 Subject: [PATCH] updated build system --- COPYING | 2 +- ChangeLog | 5 + INSTALL | 2 +- ax_check_qt.m4 | 23 +- ax_init_standard_project.m4 | 255 ++++++++------------- bootstrap.sh | 436 +++++++++++++++++++++--------------- build-in-docker.sh | 74 +++--- dependency-graph.sh | 171 ++++++++++++++ mac-create-app-bundle.sh | 1 + nodejs/safechat/client.js | 4 +- resolve-debbuilddeps.sh | 53 ++++- resolve-rpmbuilddeps.sh | 66 +++++- template.sh | 160 +++++++++++++ 13 files changed, 860 insertions(+), 392 deletions(-) create mode 100755 dependency-graph.sh create mode 100755 template.sh diff --git a/COPYING b/COPYING index caeca07..88798ab 120000 --- a/COPYING +++ b/COPYING @@ -1 +1 @@ -/usr/share/automake-1.14/COPYING \ No newline at end of file +/usr/share/automake-1.15/COPYING \ No newline at end of file diff --git a/ChangeLog b/ChangeLog index 575da02..f53205b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2017-05-12 13:51 + + * [r113] ChangeLog, nodejs/package.json.in: + newer OpenPGP.js has support for key signing + 2017-05-11 14:59 * [r112] nodejs/client/safechat.js, nodejs/makefile.am, diff --git a/INSTALL b/INSTALL index f812f5a..ddcdb76 120000 --- a/INSTALL +++ b/INSTALL @@ -1 +1 @@ -/usr/share/automake-1.14/INSTALL \ No newline at end of file +/usr/share/automake-1.15/INSTALL \ No newline at end of file diff --git a/ax_check_qt.m4 b/ax_check_qt.m4 index 7ba286f..e0eecf2 100644 --- a/ax_check_qt.m4 +++ b/ax_check_qt.m4 @@ -230,6 +230,7 @@ AC_DEFUN([AX_CHECK_QT], [ AC_SUBST(CXXFLAGS) AC_SUBST(PKG_REQUIREMENTS) AX_ADDITIONAL_QT_RULES_HACK=' +#### Begin: Appended by $0 LANGUAGE_FILE_BASE ?= translations @@ -241,7 +242,6 @@ moc_%.cxx: %.hxx qrc_%.cxx: %.qrc $(RCC) -o [$][@] -name ${<:%.qrc=%} $< - AC_SUBST(AX_ADDITIONAL_QT_RULES_HACK) #%.qrc: % # cwd=$$(pwd) && cd $< && $(RCC) -project -o $${cwd}/[$][@] @@ -249,12 +249,15 @@ qrc_%.cxx: %.qrc %.qm: %.ts ${LRELEASE} $< -qm [$][@] -%.ts: ${LANGUAGE_FILES:%=%} +%.ts: ${LANGUAGE_FILES} ${LUPDATE} -no-obsolete \ - -target-language ${@:${LANGUAGE_FILE_BASE}_%.ts=%} \ - -ts [$][@] $< + -target-language [$]{@:${LANGUAGE_FILE_BASE}_%.ts=%} \ + [$][^] \ + -ts [$][@] -']) +#### End: $0 +' +]) AC_DEFUN([AX_REQUIRE_QT], [ AX_CHECK_QT([$1], [$2], [$3], [$4]) @@ -269,3 +272,13 @@ AC_DEFUN([AX_REQUIRE_QT], [ AC_DEFUN([AX_QT_NO_KEYWORDS], [ CPPFLAGS+=" -DQT_NO_KEYWORDS" ]) + +AC_DEFUN([AX_INIT_QT], [ + if test -n "${AX_ADDITIONAL_QT_RULES_HACK}"; then + for f in $(find test examples src -name makefile.in); do + test -f "$f" && cat >> "$f" <> "${srcdir}/${3}" fi @@ -171,7 +171,7 @@ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [ AX_SUBST(HOME) if test -f README.md; then README=$(tail -n +3 README.md) - DESCRIPTION=$(head -1 README.md) + DESCRIPTION=$(head -1 README.md | sed 's,^#\+ *,,;s, *#\+$,,') else README=$(tail -n +3 README) DESCRIPTION=$(head -1 README) @@ -225,6 +225,9 @@ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [ VENDOR=$((lsb_release -is 2>/dev/null || echo unknown) | tr ' ' '_') AX_SUBST(VENDOR) DISTRO=$(lsb_release -sc 2>/dev/null || uname -s 2>/dev/null) + if test "${DISTRO}" = "n/a"; then + DISTRO="${VENDOR}_$(lsb_release -sr 2>/dev/null | tr ' ' '_')" + fi AX_SUBST(DISTRO) ARCH=$((@<:@@<:@ $(uname -sm) =~ 64 @:>@@:>@ && echo amd64) || (@<:@@<:@ $(uname -sm) =~ 'i?86' @:>@@:>@ && echo i386 || uname -sm)) AX_SUBST(ARCH) @@ -453,6 +456,12 @@ AC_DEFUN([AX_USE_NODEJS], [ [${PATH}${PATH_SEPARATOR}${ANDROID_HOME}/tools]) AC_CONFIG_FILES([nodejs/package.json]) AC_CONFIG_FILES([nodejs/makefile]) + if test -z "${DEB_SECTION}"; then + AX_DEB_SECTION([web]) + fi + if test -z "${RPM_GROUP}"; then + AX_RPM_GROUP([Applications/Internet]) + fi AX_ADD_MAKEFILE_TARGET_DEP([maintainer-clean-am], [maintainer-clean-nodejs-targets], [nodejs/makefile.in]) test -f nodejs/makefile.in && cat >> nodejs/makefile.in <> html/makefile.in </dev/null) | sort -V | head -1)) PDF_DOC=${PACKAGE_NAME}-${PACKAGE_VERSION}.pdf AC_SUBST(PDF_DOC) if test "$have_doxygen" = "no"; then @@ -714,6 +744,13 @@ EOF # $4 = alternative module names (space separated, optional) # $5 = optional flags: # manualflags if CXXFLAGS, CPPFLAGS, LIBS should remain unchanged +# $6 = optional parameters, allowed are (evaluated in this order): +# - DEV_RPM_DIST_PKG= +# special name for the RPM development package +# - DEV_DEB_DIST_PKG= +# special name for the debian development package +# - DEV_DIST_PKG= +# if the name of the development package is different # # uses PKG_CHECK_MODULES to test for a module # then, if given, looks for the header file @@ -802,8 +839,6 @@ AC_DEFUN([AX_PKG_REQUIRE], [ AC_MSG_ERROR([Feature $1 not found please install module $secondpar]) fi fi - AX_DEB_DEPEND([${$1_found}]) - AX_RPM_DEPEND([${$1_found}]) [$1]_CPPFLAGS="${$1_CFLAGS}" [$1]_CXXFLAGS="${$1_CFLAGS}" AC_SUBST([$1]_CPPFLAGS) @@ -816,118 +851,33 @@ AC_DEFUN([AX_PKG_REQUIRE], [ else AC_MSG_NOTICE([To enable $1, add $1_CPPFLAGS, $1_CXXFLAGS and $1_LIBS]) fi -]) - -# require a specific development package, with fallback: test for a header -# - parameter: -# $1 = unique id (no special characters) -# $2 = module name (optional, if different from id) -# $3 = a header file to find (optional) -# $4 = alternative module names (space separated, optional) -# $5 = optional flags: -# manualflags if CXXFLAGS, CPPFLAGS, LIBS should remain unchanged -# -# uses PKG_CHECK_MODULES to test for a module -# then, if given, looks for the header file -# if header file is not found, searches in alternative modules -# sets all flags, so that the module can be used everywhere -# fails if not found -AC_DEFUN([AX_PKG_REQUIRE_DEV], [ - PKG_PROG_PKG_CONFIG - optional_flags="$5" - $1_found=no - secondpar="m4_default([$2], [$1])" - PKG_CHECK_MODULES([$1], [m4_default([$2], [$1])], [ - $1_found=$secondpar - PKG_REQUIREMENTS+=" $secondpar" - ], [ - if test -n "$4"; then - AC_MSG_WARN([Recommended package $secondpar for feature $1 not installed, trying $4]) - for pkg in $4; do - PKG_CHECK_MODULES([$1], [$pkg], [ - PKG_REQUIREMENTS+=" $pkg" - $1_found=$pkg - break; - ], [ - AC_MSG_WARN([Recommended package $pkg for feature $1 not installed]) - ]) - done - fi - ]) - AC_SUBST(CPPFLAGS) - AC_SUBST(CXXFLAGS) - AC_SUBST(PKG_REQUIREMENTS) - if test -n "$3"; then - if test "${$1_found}" = "no"; then - tmp_package="yes" - else - tmp_package=${$1_found} - fi - $1_found=no - old_CPPFLAGS=${CPPFLAGS} - CPPFLAGS=" ${$1_CFLAGS} ${CPPFLAGS}" - AC_CHECK_HEADER([$3], [ - $1_found=${tmp_package} - ], [ - for x in ${$1_CFLAGS}; do - AC_MSG_NOTICE([search for $3 in ${x[#]-I}]) - for f in $(find ${x[#]-I} -name "$3" 2> /dev/null); do - if test -f "$f"; then - $1_found=${tmp_package} - $1_CFLAGS+=" -I${f%/*}" - AC_MSG_NOTICE([added path ${f%/*}]) - break; - fi - done - if test "${$1_found}" != "no"; then - break; - fi - done - if test "${$1_found}" = "no"; then - tmp_includedir=$(${PKG_CONFIG} --variable=includedir $tmp_package) - for x in ${tmp_includedir}; do - AC_MSG_NOTICE([search for $3 in $x]) - for f in $(find ${x} -name "$3" 2> /dev/null); do - if test -f "$f"; then - $1_found=${tmp_package} - $1_CFLAGS+=" -I${f%/*}" - AC_MSG_NOTICE([added path ${f%/*}]) - break; - fi - done - if test "${$1_found}" != "no"; then - break; - fi - done + + DEV_DEB_DIST_PKG= + DEV_RPM_DIST_PKG= + DEV_DIST_PKG= + pkg=m4_default([$2], [$1]) + $6 + dep_pkg=${DEV_DEB_DIST_PKG:-${DEV_DIST_PKG:-${pkg}}-dev} + rpm_pkg=${DEV_RPM_DIST_PKG:-${DEV_DIST_PKG:-${pkg}}-devel} + if test -n "$4"; then + for f in $pkg $4; do + if test -n "$(apt-cache policy -q ${f}-dev 2> /dev/null)"; then + deb_pkg=${f}-dev + break fi - ]) - CPPFLAGS=${old_CPPFLAGS} - fi - if test "${$1_found}" = "no"; then - if test -n "$3"; then - if test -n "$4"; then - AC_MSG_ERROR([Feature $1 not found, need header $3 in modules $secondpar or $4]) - else - AC_MSG_ERROR([Feature $1 not found, need header $3 in module $secondpar]) + done + for f in $pkg $4; do + if (test -x /usr/bin/zypper && zypper search -x "${f}-devel" 1>&2 > /dev/null) || \ + (test -x /usr/bin/dnf && dnf list -q "${f}-devel" 1>&2 > /dev/null) || \ + (test -x /usr/bin/yum && yum list -q "${f}-devel" 1>&2 > /dev/null) || \ + (test -x /usr/sbin/urpmq && urpmq "${f}-devel" 1>&2 > /dev/null); then + rpm_pkg=${f}-devel + break fi - else - AC_MSG_ERROR([Feature $1 not found please install module $secondpar]) - fi - fi - AX_DEB_BUILD_DEPEND([${$1_found}-dev]) - AX_RPM_BUILD_DEPEND([${$1_found}-devel]) - [$1]_CPPFLAGS="${$1_CFLAGS}" - [$1]_CXXFLAGS="${$1_CFLAGS}" - AC_SUBST([$1]_CPPFLAGS) - AC_SUBST([$1]_CXXFLAGS) - if test "${optional_flags/manualflags/}" = "${optional_flags}"; then - CPPFLAGS+=" ${$1_CPPFLAGS}" - CXXFLAGS+=" ${$1_CXXFLAGS}" - LIBS+=" ${$1_LIBS}" - AC_MSG_NOTICE([Adding flags for $1]) - else - AC_MSG_NOTICE([To enable $1, add $1_CPPFLAGS, $1_CXXFLAGS and $1_LIBS]) + done fi + AX_DEB_BUILD_DEPEND([$deb_pkg]) + AX_RPM_BUILD_DEPEND([$rpm_pkg]) ]) # check if a specific package exists @@ -936,6 +886,13 @@ AC_DEFUN([AX_PKG_REQUIRE_DEV], [ # $2 = module name (optional, if different from id) # $3 = optional flags: # manualflags if CXXFLAGS, CPPFLAGS, LIBS should remain unchanged +# $4 = optional parameters, allowed are (evaluated in this order): +# - DEV_RPM_DIST_PKG= +# special name for the RPM development package +# - DEV_DEB_DIST_PKG= +# special name for the debian development package +# - DEV_DIST_PKG= +# if the name of the development package is different # # uses PKG_CHECK_MODULES to test for a module # sets automake conditional HAVE_$1 to 0 (not found) or 1 (found) @@ -965,57 +922,28 @@ AC_DEFUN([AX_PKG_CHECK], [ ], [ HAVE_$1=0 ]) - AX_DEB_BUILD_DEPEND(m4_default([$2], [$1])) - AX_RPM_BUILD_DEPEND(m4_default([$2], [$1])) - AM_CONDITIONAL(HAVE_$1, test $HAVE_[$1] -eq 1) - AC_SUBST(HAVE_$1) - AC_SUBST(CPPFLAGS) - AC_SUBST(CXXFLAGS) - AC_SUBST(PKG_REQUIREMENTS) -]) - -# check if a specific development package exists -# - parameter: -# $1 = unique id (no special characters) -# $2 = module name (optional, if different from id) -# $3 = optional flags: -# manualflags if CXXFLAGS, CPPFLAGS, LIBS should remain unchanged -# -# uses PKG_CHECK_MODULES to test for a module -# sets automake conditional HAVE_$1 to 0 (not found) or 1 (found) -# sets all flags, so that the module can be used everywhere -AC_DEFUN([AX_PKG_CHECK_DEV], [ - optional_flags="$3" - PKG_PROG_PKG_CONFIG - PKG_CHECK_MODULES([$1], [m4_default([$2], [$1])], [ - HAVE_$1=1 - [$1]_CPPFLAGS="${$1_CFLAGS}" - [$1]_CXXFLAGS="${$1_CFLAGS}" - AC_SUBST([$1]_CPPFLAGS) - AC_SUBST([$1]_CXXFLAGS) - if test "${optional_flags/manualflags/}" = "${optional_flags}"; then - CPPFLAGS+=" ${$1_CPPFLAGS}" - CXXFLAGS+=" ${$1_CXXFLAGS}" - LIBS+=" ${$1_LIBS}" - AC_MSG_NOTICE([Adding flags for $1]) - else - AC_MSG_NOTICE([To enable $1, add $1_CPPFLAGS, $1_CXXFLAGS and $1_LIBS]) - fi - if test -z "$PKG_REQUIREMENTS"; then - PKG_REQUIREMENTS="m4_default([$2], [$1])" - else - PKG_REQUIREMENTS="${PKG_REQUIREMENTS}, m4_default([$2], [$1])" - fi - ], [ - HAVE_$1=0 - ]) - AX_DEB_BUILD_DEPEND(m4_default([$2], [$1])-dev) - AX_RPM_BUILD_DEPEND(m4_default([$2], [$1])-devel) AM_CONDITIONAL(HAVE_$1, test $HAVE_[$1] -eq 1) AC_SUBST(HAVE_$1) AC_SUBST(CPPFLAGS) AC_SUBST(CXXFLAGS) AC_SUBST(PKG_REQUIREMENTS) + + DEV_DEB_DIST_PKG= + DEV_RPM_DIST_PKG= + DEV_DIST_PKG= + pkg=m4_default([$2], [$1]) + $4 + dep_pkg=${DEV_DEB_DIST_PKG:-${DEV_DIST_PKG:-${pkg}}-dev} + rpm_pkg=${DEV_RPM_DIST_PKG:-${DEV_DIST_PKG:-${pkg}}-devel} + if test -n "$(apt-cache policy -q ${deb_pkg} 2> /dev/null)"; then + AX_DEB_BUILD_DEPEND([$deb_pkg]) + fi + if (test -x /usr/bin/zypper && zypper search -x "$rpm_pkg" 1>&2 > /dev/null) || \ + (test -x /usr/bin/dnf && dnf list -q "$rpm_pkg" 1>&2 > /dev/null) || \ + (test -x /usr/bin/yum && yum list -q "$rpm_pkg" 1>&2 > /dev/null) || \ + (test -x /usr/sbin/urpmq && urpmq "$rpm_pkg" 1>&2 > /dev/null); then + AX_RPM_BUILD_DEPEND([$rpm_pkg]) + fi ]) # make sure, a specific header exists @@ -1278,8 +1206,8 @@ AC_DEFUN([AX_ALL_BUILD_DEPEND], [ # $1 = package name AC_DEFUN([AX_ALL_BUILD_DEPEND_DEV], [ pkg="$1" - DEB_BUILD_DEPEND="${DEB_BUILD_DEPEND}, ${pkg}-dev" - RPM_BUILD_DEPEND="${RPM_BUILD_DEPEND}, ${pkg}-devel" + DEB_BUILD_DEPEND="${DEB_BUILD_DEPEND}, ${pkg// /-dev}-dev" + RPM_BUILD_DEPEND="${RPM_BUILD_DEPEND}, ${pkg// /-devel}-devel" ]) # require package in .spec.in append @ALL_DEPEND@ to Depends @@ -1295,8 +1223,11 @@ AC_DEFUN([AX_ALL_DEPEND], [ fi ]) +# finish configuration - to be called instead of AC_OUTPUT AC_DEFUN([AX_OUTPUT], [ + AX_INIT_QT AX_DEB_RESOLVE AX_RPM_RESOLVE AC_OUTPUT + AC_MSG_NOTICE([configured for ${PACKAGE_NAME}-${VERSION}]) ]) diff --git a/bootstrap.sh b/bootstrap.sh index d3ed892..cfa5546 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -31,8 +31,9 @@ while test $# -gt 0; do (--configure|-c) configure=1;; (--docker|-d) docker=1;; (--build|-b) configure=1; build=1; buildtarget+=" distcheck";; - (--all|-a) shift; configure=1; build=1; buildtarget+=" all";; - (--clean) shift; configure=1; build=1; buildtarget+=" maintainer-clean";; + (--all|-a) configure=1; build=1; buildtarget+=" all";; + (--install|-i) configure=1; build=1; buildtarget+=" all install";; + (--clean) configure=1; build=1; buildtarget+=" maintainer-clean";; (--target|-t) shift; configure=1; build=1; buildtarget+=" $1";; (--overwrite|-o) overwrite=1;; (--rebuild|-r) rebuild=1;; @@ -53,6 +54,7 @@ OPTIONS --docker, -d build and run tests in a docker instance --build, -b build, also call ./configure && make distcheck --all, -a same as -b, but make target all + --install, -i same as -a, but add make install --clean same as -b, but make target maintainer-clean --target, -t same as -b, but specify target instead of distcheck --overwrite, -o overwrite all basic files (bootstrap.sh, m4-macros) @@ -86,7 +88,7 @@ DESCRIPTION ${DEFAULT_PROJECT_NAME} as the project name for your project in ${PROJECT_PATH}. In the first run, you should call ${MY_NAME} from a checked out the bootstrap-build-environment from - https://dev.marc.waeckerlin.org/, and the path from where you call + https://mrw.sh/, and the path from where you call ${MY_NAME} (which is actually ${PROJECT_PATH}) should be the path to your newly created project. Please note that your project must be a checked out subversion or git repository, since this build @@ -96,7 +98,7 @@ DESCRIPTION subversion on https:/path/to/your/new-project: cd ~/svn - svn co https://dev.marc.waeckerlin.org/svn/bootstrap-build-environment/trunk \\ + svn co https://svn.mrw.sh/bootstrap-build-environment/trunk \\ bootstrap-build-environment svn co https:/path/to/your/new-project/trunk new-project cd new-project @@ -106,7 +108,7 @@ DESCRIPTION git on https:/path/to/your/new-project: cd ~/svn - svn co https://dev.marc.waeckerlin.org/svn/bootstrap-build-environment/trunk \\ + svn co https://svn.mrw.sh/bootstrap-build-environment/trunk \\ bootstrap-build-environment cd ~/git git clone https:/path/to/your/new-project @@ -138,10 +140,12 @@ GENERATED FILES * 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 + * dependency-graph.sh - script to draw project dependencies + * template.sh - generic template for bash scripts * test/runtests.sh - template file to run test scripts, i.e. docker based * AUTHORS - replace your name in AUTHORS before first run * NEWS - empty file add your project's news - * README - add project description (first line is header, followed by an empty line) + * README (or README.md) - add project description (first line: header, followed by empty line) * configure.ac - global configuration file template * makefile.am - global makefile template * ${DEFAULT_PROJECT_NAME}.desktop.in - linux desktop file @@ -300,26 +304,110 @@ EOF shift; done -echo -en "\e[1m-> checking:\e[0m for version control system ..." +# check if stdout is a terminal... +if test -t 1; then + + # see if it supports colors... + ncolors=$(tput colors) + + if test -n "$ncolors" && test $ncolors -ge 8; then + bold="$(tput bold)" + underline="$(tput smul)" + standout="$(tput smso)" + normal="$(tput sgr0)" + black="$(tput setaf 0)" + red="$(tput setaf 1)" + green="$(tput setaf 2)" + yellow="$(tput setaf 3)" + blue="$(tput setaf 4)" + magenta="$(tput setaf 5)" + cyan="$(tput setaf 6)" + white="$(tput setaf 7)" + fi +fi + +notice() { + echo "${yellow}→ notice: ${bold}$*${normal}" +} + +running() { + echo -n "${bold}${blue}→ running: ${bold}${white}$*${normal} … " +} + +checking() { + echo -n "${bold}${blue}→ checking: ${bold}${white}$*${normal} … " +} + +generating() { + echo -n "${bold}${blue}→ generating: ${bold}${white}$*${normal} … " +} + +configuring() { + echo -n "${bold}${blue}→ configuring ${bold}${white}$1${normal}:" + shift + echo -n "${white}$*${normal} … " +} + +ignored() { + echo "${bold}${yellow}ignored $*${normal}" +} + +success() { + echo "${bold}${green}success $*${normal}" +} + +error() { + echo "${bold}${red}→ error: $1${normal}" + shift + if test -n "$*"; then + echo "${bold}$*${normal}" + fi + exit 1 +} + +run() { + check=1 + while test $# -gt 0; do + case "$1" in + (--no-check) check=0;; + (*) break;; + esac + shift; + done + running $* + result=$($* 2>&1) + res=$? + if test $res -ne 0; then + if test $check -eq 1; then + error "Failed with return code: $res" "$result" + else + ignored + fi + else + success + fi +} + +checking for version control system VCS="" VCSDEPENDS="" for path in . .. ../.. ../../..; do if test -d ${path}/.svn; then VCS="svn" VCSDEPENDS_DEB="svn2cl, subversion, subversion-tools," - VCSDEPENDS_RPM="subversion," - echo -e " \e[32msuccess\e[0m detected ${VCS}" + VCSDEPENDS_RPM="subversion, " + success detected ${VCS} break elif test -d ${path}/.git; then VCS="git" VCSDEPENDS_DEB="git2cl, git," - VCSDEPENDS_RPM="git," - echo -e " \e[32msuccess\e[0m detected ${VCS}" + VCSDEPENDS_RPM="git, " + success detected ${VCS} break fi done if test -z "$VCS"; then - echo -e " \e[33mignored\e[0m" + ignored fi HEADER='## @id '"\$Id\$"' @@ -347,38 +435,6 @@ CHEADER='/** @id '"\$Id\$"' ' -notice() { - echo -e "\e[1;33m$*\e[0m" -} - -run() { - check=1 - while test $# -gt 0; do - case "$1" in - (--no-check) check=0;; - (*) break;; - esac - shift; - done - echo -en "\e[1m-> running:\e[0m $* ..." - result=$($* 2>&1) - res=$? - if test $res -ne 0; then - if test $check -eq 1; then - echo -e " \e[31merror\e[0m" - echo -e "\e[1m*** Failed with return code: $res\e[0m" - if test -n "$result"; then - echo "$result" - fi - exit 1 - else - echo -e " \e[33mignored\e[0m" - fi - else - echo -e " \e[32msuccess\e[0m" - fi -} - testtag() { local IFS="|" egrep -q '^ *'"($*)"' *(\(.*)? *$' configure.ac @@ -431,18 +487,13 @@ to() { return 1 fi checkdir "$(dirname ${1})" - echo -en "\e[1m-> generating:\e[0m $1 ..." + generating $1 result=$(cat > "$1" 2>&1) res=$? if test $res -ne 0; then - echo -e " \e[31merror\e[0m" - echo -e "\e[1m*** Failed with return code: $res\e[0m" - if test -n "$result"; then - echo "$result" - fi - exit 1 + error "Failed with return code: $res" "$result" else - echo -e " \e[32msuccess\e[0m" + success fi run chmod $mode $1 if test $exists -eq 0; then @@ -484,24 +535,20 @@ copy() { } doxyreplace() { - echo -en "\e[1m-> doxyfile:\e[0m configure $1 ..." + configuring doxyfile $1 if sed -i 's|\(^'"$1"' *=\) *.*|\1'" $2"'|g' doc/doxyfile.in; then - echo -e " \e[32msuccess\e[0m" + success else - echo -e " \e[31merror\e[0m" - echo -e "\e[1m**** command: $0 $*\e[0m" - exit 1 + error $0 $* fi } doxyadd() { - echo -en "\e[1m-> doxyfile:\e[0m configure $1 ..." + configuring doxyfile $1 if sed -i '/^'"$1"' *=/a'"$1"' += '"$2" doc/doxyfile.in; then - echo -e " \e[32msuccess\e[0m" + success else - echo -e " \e[31merror\e[0m" - echo -e "\e[1m**** command: $0 $*\e[0m" - exit 1 + error $0 $* fi } @@ -512,13 +559,18 @@ vcs2cl() { else touch "ChangeLog" fi + if test -x $(which timeout); then + local TIMEOUT="timeout 10" + else + local TIMEOUT= + fi if test -x $(which ${VCS}2cl); then if test "${VCS}" = "git"; then - ${VCS}2cl > ChangeLog + $TIMEOUT ${VCS}2cl || true > ChangeLog elif test "${VCS}" = "svn"; then - ${VCS}2cl --break-before-msg -a -i + $TIMEOUT ${VCS}2cl --break-before-msg -a -i || true elif test -n "${VCS}"; then - ${VCS}2cl + $TIMEOUT ${VCS}2cl || true fi fi if test $exists -eq 0; then @@ -549,6 +601,8 @@ copy rpmsign.exp copy build-resource-file.sh copy sql-to-dot.sed copy mac-create-app-bundle.sh +copy dependency-graph.sh +copy template.sh AUTHOR=$(gpg -K 2>/dev/null | sed -n 's,uid *\(\[ultimate\] *\)\?,,p' | head -1) if test -z "${AUTHOR}"; then AUTHOR="FIRSTNAME LASTNAME (URL) " @@ -559,11 +613,18 @@ EOF to NEWS < /var/run/${PACKAGE_NAME}.pid # there are some useful defaults # do not edit this file, overwrite values in /etc/default/${PACKAGE_NAME} - EXEC_${PACKAGE_NAME^^}="/usr/bin/nodejs /usr/share/${PACKAGE_NAME}/nodejs/${PACKAGE_NAME}" - ${PACKAGE_NAME^^}_LOG="/var/log/${PACKAGE_NAME}.log" - ${PACKAGE_NAME^^}_USER="${PACKAGE_NAME}" - ${PACKAGE_NAME^^}_PORT="" + EXEC_${PACKAGE_NAME_UPPER}="/usr/bin/nodejs /usr/share/${PACKAGE_NAME}/nodejs/${PACKAGE_NAME}" + ${PACKAGE_NAME_UPPER}_LOG="/var/log/${PACKAGE_NAME}.log" + ${PACKAGE_NAME_UPPER}_USER="${PACKAGE_NAME}" + ${PACKAGE_NAME_UPPER}_PORT="" [ -r /etc/default/${PACKAGE_NAME} ] && . /etc/default/${PACKAGE_NAME} - if test -n "\${${PACKAGE_NAME^^}_USER}"; then - exec sudo -u "\${${PACKAGE_NAME^^}_USER}" \${EXEC_${PACKAGE_NAME^^}} \${${PACKAGE_NAME^^}_PORT} >> \${${PACKAGE_NAME^^}_LOG} 2>&1 + if test -n "\${${PACKAGE_NAME_UPPER}_USER}"; then + exec sudo -u "\${${PACKAGE_NAME_UPPER}_USER}" \${EXEC_${PACKAGE_NAME_UPPER}} \${${PACKAGE_NAME_UPPER}_PORT} >> \${${PACKAGE_NAME_UPPER}_LOG} 2>&1 else - exec \${EXEC_${PACKAGE_NAME^^}} \${${PACKAGE_NAME^^}_PORT} >> \${${PACKAGE_NAME^^}_LOG} 2>&1 + exec \${EXEC_${PACKAGE_NAME_UPPER}} \${${PACKAGE_NAME_UPPER}_PORT} >> \${${PACKAGE_NAME_UPPER}_LOG} 2>&1 fi end script pre-start script - ${PACKAGE_NAME^^}_LOG="/var/log/${PACKAGE_NAME}.log" + ${PACKAGE_NAME_UPPER}_LOG="/var/log/${PACKAGE_NAME}.log" [ -r /etc/default/${PACKAGE_NAME} ] && . /etc/default/${PACKAGE_NAME} # Date format same as (new Date()).toISOString() for consistency - echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> \${${PACKAGE_NAME^^}_LOG} + echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> \${${PACKAGE_NAME_UPPER}_LOG} end script pre-stop script - ${PACKAGE_NAME^^}_LOG="/var/log/${PACKAGE_NAME}.log" + ${PACKAGE_NAME_UPPER}_LOG="/var/log/${PACKAGE_NAME}.log" [ -r /etc/default/${PACKAGE_NAME} ] && . /etc/default/${PACKAGE_NAME} rm /var/run/${PACKAGE_NAME}.pid - echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> \${${PACKAGE_NAME^^}_LOG} + echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> \${${PACKAGE_NAME_UPPER}_LOG} end script EOF to --condition AX_USE_NODEJS nodejs/etc/systemd/system/${PACKAGE_NAME}.service < - $(head -1 README) + $DESCRIPTION -

$(head -1 README)

+

$DESCRIPTION

generated by bootstrap, please edit

@@ -1290,6 +1352,9 @@ ${HEADER}AM_CPPFLAGS = -I\${top_srcdir}/src -I\${top_builddir}/src AM_LDFLAGS = -L\${abs_top_builddir}/src/.libs LDADD = -l${PACKAGE_NAME#lib} +exampledir = ${docdir}/examples +example_DATA = + MAINTAINERCLEANFILES = makefile.in EOF to --condition AX_BUILD_HTML_NPM html/package.json.in < 6 || 0%{?rhl} > 6 || 0%{?centos} > 6 || 0%{?fedora} || 0%{?mageia} -BuildRequires: rpm-sign %endif -%if 0%{?mageia} -BuildRequires: gnupg, lsb-release$( - if testtag AX_USE_LIBTOOL; then - echo -n ", libltdl-devel" - fi -) -%else -BuildRequires: gpg, redhat-lsb$( - if testtag AX_USE_LIBTOOL; then - echo -n ", libtool-ltdl-devel" - fi -) +$( + if testtag AX_USE_DOXYGEN; then cat < /dev/null; then + run libtoolize --force; +elif which glibtoolize > /dev/null; then + run glibtoolize --force; +else + echo "error: libtoolize not found" 1>&2 + exit 1 +fi +EOF1 +fi) automake -a autoconf EOF @@ -1798,15 +1861,24 @@ ${HEADER}SUBDIRS =${SUBDIRS} desktopdir = \${datadir}/applications desktop_DATA = @PACKAGE_DESKTOP@ -dist_pkgdata_DATA = @PACKAGE_ICON@ ax_check_qt.m4 bootstrap.sh \\ - resolve-rpmbuilddeps.sh autogen.sh \\ +dist_pkgdata_DATA = @PACKAGE_ICON@ +dist_noinst_DATA = ax_check_qt.m4 bootstrap.sh \\ + resolve-rpmbuilddeps.sh autogen.sh \\ ax_cxx_compile_stdcxx_11.m4 build-in-docker.sh \\ build-resource-file.sh \\ ax_init_standard_project.m4 \\ mac-create-app-bundle.sh resolve-debbuilddeps.sh \\ + dependency-graph.sh template.sh \\ sql-to-dot.sed -dist_doc_DATA = AUTHORS NEWS README COPYING INSTALL ChangeLog +dist_doc_DATA = AUTHORS NEWS $README COPYING INSTALL ChangeLog +$(if test -e README.md -a ! -e README; then +cat < /dev/null; then + run libtoolize --force; + elif which glibtoolize > /dev/null; then + run glibtoolize --force; + else + error libtoolize not found + fi + fi + run automake -a + run autoconf + + #### Run Configure If User Requires #### + if test "$configure" -eq 1; then + ./configure $* || exit 1 + fi + + #### Run Make If User Requires #### + if test "$build" -eq 1; then + make $buildtarget || exit 1 + fi + fi diff --git a/build-in-docker.sh b/build-in-docker.sh index 607fe82..5559f63 100755 --- a/build-in-docker.sh +++ b/build-in-docker.sh @@ -7,9 +7,10 @@ if test "${arch}" = "amd64"; then myarch="amd64|i386" fi mode="deb" -img="ubuntu:latest" +img="mwaeckerlin/ubuntu:latest" repos=() keys=() +dns=() envs=("-e LANG=${LANG}" "-e HOME=${HOME}" "-e TERM=xterm" "-e DEBIAN_FRONTEND=noninteractive" "-e DEBCONF_NONINTERACTIVE_SEEN=true") dirs=("-v $(pwd):/workdir" "-v ${HOME}/.gnupg:${HOME}/.gnupg") packages=() @@ -41,6 +42,7 @@ while test $# -gt 0; do echo " -f, --flag add flag to ./bootstrap.sh or ./configure" echo " -r, --repo add given apt repository" echo " -k, --key add public key from url" + echo " -n, --dns add ip as dns server" echo " -e, --env = set environment variable in docker" echo " -d, --dir access given directory read only" echo " -p, --package install extra debian packages" @@ -73,8 +75,8 @@ while test $# -gt 0; do echo " -e ANDROID_HOME=/opt/local/android \\" echo " -d /opt/local/android \\" echo " -r universe \\" - echo " -r https://dev.marc.waeckerlin.org/repository \\" - echo " -k https://dev.marc.waeckerlin.org/repository/PublicKey \\" + echo " -r https://repository.mrw.sh \\" + echo " -k https://repository.mrw.sh/PublicKey \\" echo " -p mrw-c++" echo exit 0 @@ -82,15 +84,15 @@ while test $# -gt 0; do (-m|--mode) shift; mode="$1" case "$mode" in - (deb|apt) img="ubuntu:latest";; + (deb|apt) img="mwaeckerlin/ubuntu:latest";; (rpm|zypper) img="opensuse:latest";; (yum) img="centos:latest";; (dnf) img="fedora:latest";; (win) - img="ubuntu:latest"; host="${host:---host=i686-w64-mingw32}" + img="mwaeckerlin/ubuntu:latest"; host="${host:---host=i686-w64-mingw32}" targets="all install" flags+=("--prefix=/workdir/usr") - packages1=("mingw-w64") + packages+=("mingw-w64") ;; (*) echo "**** ERROR: unknown mode '$1', try --help" 1>&2 @@ -128,6 +130,9 @@ while test $# -gt 0; do (-e|--env) shift; envs+=("-e $1") ;; + (-n|--dns) shift; + dns+=("--dns $1") + ;; (-d|--dirs) shift; dirs+=("-v $1:$1:ro") ;; @@ -172,7 +177,8 @@ function traperror() { echo fi if [ "$wait" -eq 1 ]; then - echo " ... now you can access the docker container:" + echo " ... now you can access the docker container as root or user:" + echo " docker exec -it ${DOCKER_ID} bash" echo " docker exec -u $(id -u) -it ${DOCKER_ID} bash" echo -n " ... press enter to cleanup: " read @@ -185,13 +191,7 @@ 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: " + echo -n "SUCCESS ... cleanup docker: " docker rm -f "${DOCKER_ID}" exit 0 } @@ -200,21 +200,27 @@ function ifthenelse() { arg="$1" shift cmd="$*" + DISTRIBUTOR=$(docker exec ${DOCKER_ID} lsb_release -si | sed 's, .*,,' | tr [:upper:] [:lower:]) + CODENAME=$(docker exec ${DOCKER_ID} lsb_release -cs) + ARCH=$((docker exec ${DOCKER_ID} which dpkg > /dev/null 2> /dev/null && docker exec ${DOCKER_ID} dpkg --print-architecture) || echo amd64) if test "${arg/:::/}" = "${arg}"; then - docker exec ${DOCKER_ID} bash -c "${cmd//ARG/${arg}}" + docker exec ${DOCKER_ID} bash -c "${cmd//ARG/${arg//@DISTRIBUTOR@/${DISTRIBUTOR}}}" else os="${arg%%:::*}" thenpart="${arg#*:::}" - if test "${thenpart/:::/}" = "${thenpart}"; then - docker exec ${DOCKER_ID} bash -c 'os="'$os'"; if [[ "$(lsb_release -is)-$(lsb_release -cs)-$((which dpkg > /dev/null 2> /dev/null && dpkg --print-architecture) || echo amd64)" =~ ${os} ]]; then '"${cmd//ARG/${thenpart}}"'; fi' - else + elsepart= + if test "${thenpart/:::/}" != "${thenpart}"; then elsepart="${thenpart##*:::}" - thenpart="${thenpart%:::*}" + thenpart="${thenpart%%:::*}" + fi + if [[ "${DISTRIBUTOR}-${CODENAME}-${ARCH}" =~ ${os} ]]; then if test -n "${thenpart}"; then - docker exec ${DOCKER_ID} bash -c 'os="'$os'"; if [[ "$(lsb_release -is)-$(lsb_release -cs)-$((which dpkg > /dev/null 2> /dev/null && dpkg --print-architecture) || echo amd64)" =~ ${os} ]]; then '"${cmd//ARG/${thenpart}}"'; else '"${cmd//ARG/${elsepart}}"'; fi' - else - docker exec ${DOCKER_ID} bash -c 'os="'$os'"; if [[ "$(lsb_release -is)-$(lsb_release -cs)-$((which dpkg > /dev/null 2> /dev/null && dpkg --print-architecture) || echo amd64)" =~ ${os} ]]; then true; else '"${cmd//ARG/${elsepart}}"'; fi' - fi + docker exec ${DOCKER_ID} bash -c "${cmd//ARG/${thenpart//@DISTRIBUTOR@/${DISTRIBUTOR}}}" + fi + else + if test -n "${elsepart}"; then + docker exec ${DOCKER_ID} bash -c "${cmd//ARG/${elsepart//@DISTRIBUTOR@/${DISTRIBUTOR}}}" + fi fi fi } @@ -222,7 +228,7 @@ function ifthenelse() { set -x docker pull $img -DOCKER_ID=$(docker create ${dirs[@]} ${envs[@]} -w /workdir $img sleep infinity) +DOCKER_ID=$(docker create ${dns[@]} ${dirs[@]} ${envs[@]} -w /workdir $img sleep infinity) trap 'traperror '"${DOCKER_ID}"' "$? ${PIPESTATUS[@]}" $LINENO $BASH_LINENO "$BASH_COMMAND" "${FUNCNAME[@]}" "${FUNCTION}"' SIGINT INT TERM EXIT if ! [[ $arch =~ $myarch ]]; then docker cp "/usr/bin/qemu-${arch}-static" "${DOCKER_ID}:/usr/bin/qemu-${arch}-static" @@ -249,16 +255,16 @@ case $mode in 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 + docker exec ${DOCKER_ID} apt-get install ${OPTIONS} python-software-properties software-properties-common apt-transport-https dpkg-dev lsb-release wget || \ + docker exec ${DOCKER_ID} apt-get install ${OPTIONS} software-properties-common apt-transport-https dpkg-dev lsb-release wget || \ + docker exec ${DOCKER_ID} apt-get install ${OPTIONS} python-software-properties apt-transport-https dpkg-dev lsb-release wget; for key in "${keys[@]}"; do wget -O- "$key" \ | docker exec -i ${DOCKER_ID} apt-key add - done + for repo in "${repos[@]}"; do + ifthenelse "${repo}" "apt-add-repository 'ARG'" + done docker exec ${DOCKER_ID} apt-get update ${OPTIONS} for package in "${packages[@]}"; do ifthenelse "${package}" "apt-get install ${OPTIONS} ARG" @@ -295,10 +301,16 @@ EOF rm rpm-key done for repo in "${repos[@]}"; do - INSTALL_REPO=$((docker exec ${DOCKER_ID} test -x /usr/bin/zypper && echo zypper ar) || (docker exec ${DOCKER_ID} test -x /usr/bin/dnf && echo dnf config-manager --add-repo) || (docker exec ${DOCKER_ID} test -x /usr/bin/yum && echo wget -O/etc/yum.repos.d/additional$i.repo) || (docker exec ${DOCKER_ID} test -x /usr/sbin/urpmi && echo true)) + INSTALL_REPO=$((docker exec ${DOCKER_ID} test -x /usr/bin/zypper && echo zypper ar) || (docker exec ${DOCKER_ID} test -x /usr/bin/dnf && echo dnf config-manager --add-repo) || (docker exec ${DOCKER_ID} test -x /usr/bin/yum && echo wget -O/etc/yum.repos.d/additional$i.repo) || (docker exec ${DOCKER_ID} test -x /usr/sbin/urpmi && echo false)) ifthenelse "${repo}" "${INSTALL_REPO} 'ARG'" ((++i)) done + for package in "${packages[@]}"; do + ifthenelse "${package}" "${INSTALL_TOOL} ARG" + done + for command in "${commands[@]}"; do + ifthenelse "${command}" "ARG" + done docker exec ${DOCKER_ID} ./resolve-rpmbuilddeps.sh ;; esac diff --git a/dependency-graph.sh b/dependency-graph.sh new file mode 100755 index 0000000..e7b77bc --- /dev/null +++ b/dependency-graph.sh @@ -0,0 +1,171 @@ +#!/bin/bash -e + +# template for bash scripts + +# internal use only +append_msg() { + if test $# -ne 0; then + echo -en ":\e[0m \e[1m$*" + fi + echo -e "\e[0m" +} + +# write a notice +notice() { + if test $# -eq 0; then + return + fi + echo -e "\e[1m$*\e[0m" 1>&3 +} + +# write error message +error() { + echo -en "\e[1;31merror" 1>&2 + append_msg $* 1>&2 +} + +# write a warning message +warning() { + echo -en "\e[1;33mwarning" 1>&2 + append_msg $* 1>&2 +} + +# write a success message +success() { + echo -en "\e[1;32msuccess" 1>&2 + append_msg $* 1>&2 +} + +# commandline parameter evaluation +files=${0%/*}/configure.ac +short=0 +while test $# -gt 0; do + case "$1" in + (--short|-s) short=1;; + (--help|-h) less < + +OPTIONS + + --help, -h show this help + --short, -s short graph with no external dependencies + + list of zero or more configure.ac files + (default: ${files}) + +DESCRIPTION + + Evaluates dependencies of all the given configure.ac file. By + default takes the local configure.ac. Outputs a graphwiz dot file + with the dependencies. Solid lines are required dependencies, dotted + lines are optional dependencies. + +EXAMPLE + + Evaluate all dependencies between all local subversion and git + projects, if they are in the path ~/svn and ~/git: + + $0 ~/svn/*/configure.ac ~/git/*/configure.ac + +EOF + exit;; + (*) files=$*; break;; + esac + if test $# -eq 0; then + error "missing parameter, try $0 --help"; exit 1 + fi + shift; +done + +# run a command, print the result and abort in case of error +# option: --no-check: ignore the result, continue in case of error +run() { + check=1 + while test $# -gt 0; do + case "$1" in + (--no-check) check=0;; + (*) break;; + esac + shift; + done + echo -en "\e[1m-> running:\e[0m $* ..." + result=$($* 2>&1) + res=$? + if test $res -ne 0; then + if test $check -eq 1; then + error "failed with return code: $res" + if test -n "$result"; then + echo "$result" + fi + exit 1 + else + warning "ignored return code: $res" + fi + else + success + fi +} + +# error handler +function traperror() { + set +x + local err=($1) # error status + local line="$2" # LINENO + local linecallfunc="$3" + local command="$4" + local funcstack="$5" + for e in ${err[@]}; do + if test -n "$e" -a "$e" != "0"; then + error "line $line - command '$command' exited with status: $e (${err[@]})" + if [ "${funcstack}" != "main" -o "$linecallfunc" != "0" ]; then + echo -n " ... error at ${funcstack} " + if [ "$linecallfunc" != "" ]; then + echo -n "called at line $linecallfunc" + fi + echo + fi + exit $e + fi + done + success + exit 0 +} + +# catch errors +trap 'traperror "$? ${PIPESTATUS[@]}" $LINENO $BASH_LINENO "$BASH_COMMAND" "${FUNCNAME[@]}" "${FUNCTION}"' ERR SIGINT INT TERM EXIT + +########################################################################################## + +filter() { + if test $short -eq 1; then + all=$(cat) + allowed=$(sed -n '/"\(.*\)" \[style=solid\];/{s//\1/;H};${x;s/\n//;s/\n/\\|/gp}' <<<"${all}") + sed -n '/"\('"${allowed}"'\)" -> "\('"${allowed}"'\)"/p' <<<"${all}" + else + cat + fi +} + +echo "digraph G {" +if test $short -eq 0; then + echo "node [style=dashed];" +fi +( + for file in $files; do + if ! test -e $file; then + error "file $file not found"; exit 1 + fi + sed -n ' + /^ *m4_define(x_package_name, */ {s//"/;s/ *).*/"/;h;s/.*/& [style=solid];/p} + /^ *AX_REQUIRE_QT/ {s/.*/"qt" -> /;G;s/\n//;s/.*/&;/p} + /^ *AX_PKG_REQUIRE(\[\?\([^],)]\+\)\]\?, \[\?\([^],)]\+\)\]\?.*/ {s//"\2" -> /;G;s/\n//;s/.*/&;/p} + /^ *AX_PKG_REQUIRE(\[\?\([^],)]\+\)\]\?.*/ {s//"\1" -> /;G;s/\n//;s/.*/&;/p} + /^ *AX_CHECK_QT/ {s/.*/"qt" -> /;G;s/\n//;s/.*/& [style=dashed];/p} + /^ *AX_PKG_CHECK(\[\?\([^],)]\+\)\]\?, \[\?\([^],)]\+\)\]\?.*/ {s//"\2" -> /;G;s/\n//;s/.*/& [style=dotted];/p} + /^ *AX_PKG_CHECK(\[\?\([^],)]\+\)\]\?.*/ {s//"\1" -> /;G;s/\n//;s/.*/& [style=dotted];/p} + ' $file + done +) | filter +echo "}" diff --git a/mac-create-app-bundle.sh b/mac-create-app-bundle.sh index d1f41a6..1b8f511 100755 --- a/mac-create-app-bundle.sh +++ b/mac-create-app-bundle.sh @@ -38,6 +38,7 @@ executablefile=$(ls -1 ${1}/Contents/MacOS/ | head -1) ! test -d ${3}/share || rmdir ${3}/share ! test -d ${3} || \ find ${3} -mindepth 1 -maxdepth 1 -exec mv {} ${1}/Contents/Resources/ \; +! test -d ${3}/include || rm -r ${3}/include ! test -d ${3} || rmdir ${3} ! test -d ${1}/tmp || rm -r ${1}/tmp diff --git a/nodejs/safechat/client.js b/nodejs/safechat/client.js index b8cf0dc..5c68e4a 100644 --- a/nodejs/safechat/client.js +++ b/nodejs/safechat/client.js @@ -26,11 +26,11 @@ module.exports = function(chatserver, keyserver) { privateKeys: privkey }).then(function(ciphertext) { openpgp.decrypt({ - message: ciphertext, + message: openpgp.message.readArmored(ciphertext.data), publicKeys: openpgp.key.readArmored(_user.key.pub).keys[0], privateKey: privkey }).then(function(plaintext) { - if (data==plaintext) { + if (data==plaintext.data) { success(_user) } else { fail('local key does not match key on server') diff --git a/resolve-debbuilddeps.sh b/resolve-debbuilddeps.sh index 4358e29..36a94e6 100755 --- a/resolve-debbuilddeps.sh +++ b/resolve-debbuilddeps.sh @@ -35,13 +35,53 @@ TO_INSTALL= DEPS= if test -e debian/control.in -a ! -e debian/control; then + function pkg_exists() { + test -n "$(${DO} apt-cache policy -q ${1})" + } + function AX_PKG_CHECK() { + local DEV_DEB_DIST_PKG= + local DEV_DIST_PKG= + local pkg= + eval $4 + if test -z "$2"; then + pkg=$1 + else + pkg=$2 + fi + pkg=${DEV_DEB_DIST_PKG:-${DEV_DIST_PKG:-${pkg}}-dev} + if pkg_exists "${pkg}"; then + echo $pkg + fi + } + function AX_PKG_REQUIRE() { + local DEV_DEB_DIST_PKG= + local DEV_DIST_PKG= + local pkg= + eval $6 + if test -z "$2"; then + pkg=$1 + else + pkg=$2 + fi + if test -n "$4"; then + for f in $pkg $4; do + if pkg_exists "${f}-dev"; then + pkg=$f + break + fi + done + fi + echo ${DEV_DEB_DIST_PKG:-${DEV_DIST_PKG:-${pkg}}-dev} + } + DEPS+=" $(eval $(sed -n '/^ *AX_PKG_REQUIRE/{s,^ *\(AX_PKG_REQUIRE\) *(\(.*\)).*,\1 \2,;s.\[\([^]]*\)\],\?."\1".g;s,$,;,g;p}' configure.ac))" + DEPS+=" $(eval $(sed -n '/^ *AX_PKG_CHECK/{s,^ *\(AX_PKG_CHECK\) *(\(.*\)).*,\1 \2,;s.\[\([^]]*\)\],\?."\1".g;s,$,;,g;p}' configure.ac))" for f in $(sed -n 's, *AX_\(DEB\|ALL\)_DEPEND_IFEXISTS(\([^)]*\)).*,\2,p' configure.ac); do - if test -n "$(${DO} apt-cache policy -q ${f})" && ((! $(${DO} apt-cache policy ${f} 2>&1 | grep -q 'N: Unable to locate package')) && (! ${DO} dpkg -l "${f}")); then + if pkg_exists "${f}"; then DEPS+=" ${f}" fi done for f in $(sed -n 's, *AX_\(DEB\|ALL\)_DEPEND_IFEXISTS_DEV(\([^)]*\)).*,\2,p' configure.ac); do - if test -n "$(${DO} apt-cache policy -q ${f}-dev)" && ((! $(${DO} apt-cache policy ${f}-dev 2>&1 | grep -q 'N: Unable to locate package')) && (! ${DO} dpkg -l "${f}-dev")); then + if pkg_exists "${f}-dev"; then DEPS+=" ${f}-dev" fi done @@ -57,10 +97,11 @@ if test -e debian/control.in -a ! -e debian/control; then fi install dpkg-dev + DEPS+=" $(LANG= ${DO} dpkg-checkbuilddeps 2>&1 | sed -n '/Unmet build dependencies/ { s,.*Unmet build dependencies: ,,g; s, ([^)]*),,g; s, *| *,|,g; p}')" for pa in ${DEPS}; do - if test ${pa//|/} = ${pa}; then + if test "${pa//|/}" = "${pa}"; then TO_INSTALL+=" ${pa}" continue; fi @@ -83,4 +124,10 @@ if test -n "${TO_INSTALL}" && ! install ${TO_INSTALL}; then exit 1 fi +FILES="$(LANG= ${DO} dpkg-checkbuilddeps 2>&1 | sed -n '/Unmet build dependencies/ { s,.*Unmet build dependencies: ,,g; s, ([^)]*),,g; s, *| *,|,g; p}')" +if test -n "${FILES}"; then + echo "**** ERROR: Cannot install: " $FILES + exit 1 +fi + echo "**** Success: All Dependencies Resolved" diff --git a/resolve-rpmbuilddeps.sh b/resolve-rpmbuilddeps.sh index dd565a6..7c1843b 100755 --- a/resolve-rpmbuilddeps.sh +++ b/resolve-rpmbuilddeps.sh @@ -14,7 +14,7 @@ INSTALL_TOOL=${INSTALL_TOOL:-$((test -x /usr/bin/zypper && echo zypper install - SCHROOTNAME="$1" PACKAGE_NAME=$(sed -n 's/^ *m4_define(x_package_name, \(.*\)).*/\1/p' configure.ac) -TRAP_CMD= +TRAP_CMD="sleep ${SLEEP:-0};" DEPS= for f in BUILD BUILDROOT RPMS SPECS SRPMS; do if ! test -d $f; then @@ -23,19 +23,56 @@ for f in BUILD BUILDROOT RPMS SPECS SRPMS; do fi done if test -e ${PACKAGE_NAME}.spec.in -a ! -e ${PACKAGE_NAME}.spec; then + function pkg_exists() { + (test -x /usr/bin/zypper && zypper search -x "$1" 1>&2 > /dev/null) || \ + (test -x /usr/bin/dnf && dnf list -q "$1" 1>&2 > /dev/null) || \ + (test -x /usr/bin/yum && yum list -q "$1" 1>&2 > /dev/null) || \ + (test -x /usr/sbin/urpmq && urpmq "$1" 1>&2 > /dev/null) + } + function AX_PKG_CHECK() { + local DEV_RPM_DIST_PKG= + local DEV_DIST_PKG= + local pkg= + eval $4 + if test -z "$2"; then + pkg=$1 + else + pkg=$2 + fi + pkg=${DEV_RPM_DIST_PKG:-${DEV_DIST_PKG:-${pkg}}-devel} + if pkg_exists "${pkg}"; then + echo ${pkg} + fi + } + function AX_PKG_REQUIRE() { + local DEV_RPM_DIST_PKG= + local DEV_DIST_PKG= + local pkg= + eval $6 + if test -z "$2"; then + pkg=$1 + else + pkg=$2 + fi + if test -n "$4"; then + for f in $pkg $4; do + if pkg_exists "${f}-devel"; then + pkg=$f + break + fi + done + fi + echo ${DEV_RPM_DIST_PKG:-${DEV_DIST_PKG:-${pkg}}-devel} + } + DEPS+=" $(eval $(sed -n '/^ *AX_PKG_REQUIRE/{s,^ *\(AX_PKG_REQUIRE\) *(\(.*\)).*,\1 \2,;s.\[\([^]]*\)\],\?."\1".g;s,$,;,g;p}' configure.ac))" + DEPS+=" $(eval $(sed -n '/^ *AX_PKG_CHECK/{s,^ *\(AX_PKG_CHECK\) *(\(.*\)).*,\1 \2,;s.\[\([^]]*\)\],\?."\1".g;s,$,;,g;p}' configure.ac))" for f in $(sed -n 's, *AX_\(RPM\|ALL\)_DEPEND_IFEXISTS(\([^)]*\)).*,\2,p' configure.ac); do - if (test -x /usr/bin/zypper && zypper search -x "$f" 1>&2 > /dev/null) || \ - (test -x /usr/bin/dnf && dnf list -q "$f" 1>&2 > /dev/null) || \ - (test -x /usr/bin/yum && yum list -q "$f" 1>&2 > /dev/null) || \ - (test -x /usr/sbin/urpmq && urpmq "$f" 1>&2 > /dev/null); then + if pkg_exists "${f}"; then DEPS+=" ${f}" fi done for f in $(sed -n 's, *AX_\(RPM\|ALL\)_DEPEND_IFEXISTS_DEV(\([^)]*\)).*,\2,p' configure.ac); do - if (test -x /usr/bin/zypper && zypper search -x "$f"-devel 1>&2 > /dev/null) || \ - (test -x /usr/bin/dnf && dnf list -q "$f"-devel 1>&2 > /dev/null) || \ - (test -x /usr/bin/yum && yum list -q "$f"-devel 1>&2 > /dev/null) || \ - (test -x /usr/sbin/urpmq && urpmq "$f"-devel 1>&2 > /dev/null); then + if pkg_exists "${f}-devel"; then DEPS+=" ${f}-devel" fi done @@ -48,7 +85,7 @@ if test -e ${PACKAGE_NAME}.spec.in -a ! -e ${PACKAGE_NAME}.spec; then TRAP_CMD+="rm ${PACKAGE_NAME}.spec;" trap "${TRAP_CMD}" INT TERM EXIT sed 's,@\(\(ALL\|RPM\)_DEPEND_IFEXISTS\|\(ALL\|RPM\)_BUILD_DEPEND\|\(ALL\|RPM\)_DEPEND\)@,,g' ${PACKAGE_NAME}.spec.in | \ - sed 's,@[^@]*@, dummytext,g' > ${PACKAGE_NAME}.spec + sed 's,@[^@]*@,dummytext,g' > ${PACKAGE_NAME}.spec fi TGZFILE=$(sed -n '/^Name: */{s///;h};/^Version: */{s///;H;x;s/\n/-/;s/$/.tar.gz/;p}' ${PACKAGE_NAME}.spec) @@ -70,5 +107,14 @@ else fi fi +if test -n "${SCHROOTNAME}"; then + 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') +else + FILES=$(LANG= rpmbuild -bb --clean --nobuild --define "_topdir ." --define "_sourcedir ." ${PACKAGE_NAME}.spec 2>&1 | sed -n 's, is needed by.*,,p') +fi +if test -n "${FILES}"; then + echo "**** ERROR: Cannot install: " $FILES + exit 1 +fi echo "**** Success: All Dependencies Resolved" diff --git a/template.sh b/template.sh new file mode 100755 index 0000000..beb656d --- /dev/null +++ b/template.sh @@ -0,0 +1,160 @@ +#!/bin/bash -e + +########################################################################################## +#### template for bash scripts #### START BELOW ########################################## +########################################################################################## + +############################################################################ begin logging +# check if stdout is a terminal... +if test -t 1; then + + # see if it supports colors... + ncolors=$(tput colors) + + if test -n "$ncolors" && test $ncolors -ge 8; then + bold="$(tput bold)" + underline="$(tput smul)" + standout="$(tput smso)" + normal="$(tput sgr0)" + black="$(tput setaf 0)" + red="$(tput setaf 1)" + green="$(tput setaf 2)" + yellow="$(tput setaf 3)" + blue="$(tput setaf 4)" + magenta="$(tput setaf 5)" + cyan="$(tput setaf 6)" + white="$(tput setaf 7)" + fi +fi + +append_msg() { + if test $# -ne 0; then + echo -n ": ${bold}$*" + fi + echo "${normal}" +} + +# write a message +message() { + if test $# -eq 0; then + return + fi + echo "${bold}${white}$*${normal}" 1>&2 +} + +# write a success message +success() { + echo -n "${bold}${green}success" 1>&2 + append_msg $* 1>&2 +} + +# write a notice +notice() { + echo -n "${bold}${yellow}notice" 1>&2 + append_msg $* 1>&2 +} + +# write a warning message +warning() { + echo -en "${bold}${red}warning" 1>&2 + append_msg $* 1>&2 +} + +# write error message +error() { + echo -en "${bold}${red}error" 1>&2 + append_msg $* 1>&2 +} + +# run a command, print the result and abort in case of error +# option: --ignore: ignore the result, continue in case of error +run() { + ignore=1 + while test $# -gt 0; do + case "$1" in + (--ignore) ignore=0;; + (*) break;; + esac + shift; + done + echo -n "${bold}${yellow}running:${white} $*${normal} … " + set +e + result=$($* 2>&1) + res=$? + set -e + if test $res -ne 0; then + if test $ignore -eq 1; then + error "failed with return code: $res" + if test -n "$result"; then + echo "$result" + fi + exit 1 + else + warning "ignored return code: $res" + fi + else + success + fi +} + +############################################################################ error handler +function traperror() { + set +x + local err=($1) # error status + local line="$2" # LINENO + local linecallfunc="$3" + local command="$4" + local funcstack="$5" + IFS=" " + for e in ${err[@]}; do + if test -n "$e" -a "$e" != "0"; then + error "line $line - command '$command' exited with status: $e (${err[@]})" + if [ "${funcstack}" != "main" -o "$linecallfunc" != "0" ]; then + echo -n " ... error at ${funcstack} " 1>&2 + if [ "$linecallfunc" != "" ]; then + echo -n "called at line $linecallfunc" 1>&2 + fi + echo + fi + exit $e + fi + done + success + exit 0 +} + +# catch errors +trap 'traperror "$? ${PIPESTATUS[@]}" $LINENO $BASH_LINENO "$BASH_COMMAND" "${FUNCNAME[@]}" "${FUNCTION}"' ERR SIGINT INT TERM EXIT + + + +########################################################################################## +#### START HERE ########################################################################## +########################################################################################## + +######################################################### commandline parameter evaluation +while test $# -gt 0; do + case "$1" in + (--help|-h) less <