diff --git a/ChangeLog b/ChangeLog index c129b2a..d8bab89 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,33 +1,67 @@ +2016-08-10 08:49 + + * [r10] scripts/mvfotos.conf, scripts/mvfotos.in: + added check for movies for avprobe + +2016-07-26 19:50 + + * [r9] scripts/mvfotos.in: + square braces in square braces in sed require special treatment + +2016-07-25 21:06 + + * [r8] scripts/mvfotos.in: + ignore more special characters + +2016-07-15 16:12 + + * [r7] COPYING, ChangeLog, INSTALL, autogen.sh[ADD], + ax_init_standard_project.m4, bootstrap.sh, + build-in-docker.conf[ADD], build-in-docker.sh, + mac-create-app-bundle.sh, mvfotos.desktop.in[ADD], + resolve-debbuilddeps.sh, resolve-rpmbuilddeps.sh, + sql-to-dot.sed[ADD]: + update buildsystem + 2016-04-03 16:18 - * bootstrap.sh: after svn-server restore + * [r6] bootstrap.sh: + after svn-server restore 2015-11-07 10:47 marc - * bootstrap.sh, debian/control.in: there is no qt4-default + * [r5] bootstrap.sh, debian/control.in: + there is no qt4-default 2015-11-07 09:23 marc - * bootstrap.sh: there is no qt4-default + * [r4] bootstrap.sh: + there is no qt4-default 2015-11-07 00:20 marc - * debian/control.in: set Section + * [r3] debian/control.in: + set Section 2015-11-06 23:41 marc - * AUTHORS: updated author with new homepage + * [r2] AUTHORS: + updated author with new homepage 2015-11-05 17:37 marc - * ., AUTHORS, COPYING, ChangeLog, INSTALL, NEWS, README, - ax_check_qt.m4, ax_cxx_compile_stdcxx_11.m4, - ax_init_standard_project.m4, bootstrap.sh, build-in-docker.sh, - build-resource-file.sh, configure.ac, debian, - debian/changelog.in, debian/compat, debian/control.in, - debian/docs, debian/rules, doc, doc/doxyfile.in, doc/makefile.am, - mac-create-app-bundle.sh, makefile.am, mvfotos.spec.in, - resolve-debbuilddeps.sh, resolve-rpmbuilddeps.sh, scripts, - scripts/makefile.am, scripts/mvfotos.conf, scripts/mvfotos.in: + * [r1] .[ADD], AUTHORS[ADD], COPYING[ADD], ChangeLog[ADD], + INSTALL[ADD], NEWS[ADD], README[ADD], ax_check_qt.m4[ADD], + ax_cxx_compile_stdcxx_11.m4[ADD], + ax_init_standard_project.m4[ADD], bootstrap.sh[ADD], + build-in-docker.sh[ADD], build-resource-file.sh[ADD], + configure.ac[ADD], debian[ADD], debian/changelog.in[ADD], + debian/compat[ADD], debian/control.in[ADD], debian/docs[ADD], + debian/rules[ADD], doc[ADD], doc/doxyfile.in[ADD], + doc/makefile.am[ADD], mac-create-app-bundle.sh[ADD], + makefile.am[ADD], mvfotos.spec.in[ADD], + resolve-debbuilddeps.sh[ADD], resolve-rpmbuilddeps.sh[ADD], + scripts[ADD], scripts/makefile.am[ADD], + scripts/mvfotos.conf[ADD], scripts/mvfotos.in[ADD]: initial copy from old project diff --git a/ax_check_qt.m4 b/ax_check_qt.m4 index af3a238..e0eecf2 100644 --- a/ax_check_qt.m4 +++ b/ax_check_qt.m4 @@ -51,18 +51,33 @@ AC_DEFUN([AX_CXX_QT_TOOL], [ PKG_PROG_PKG_CONFIG - if test -z "$HAVE_$1"; then + if test -z "${HAVE_$1}"; then HAVE_$1=1 AC_MSG_CHECKING([for $2]) AC_ARG_VAR([$1], [path to Qt tool $2]) - $1=${$1:-$(${PKG_CONFIG} --variable=$2_location Qt5Core)} - $1=${$1:-$(${PKG_CONFIG} --variable=host_bins Qt5Core)/$2-qt5} - $1=${$1:-$(${PKG_CONFIG} --variable=host_bins Qt5Core)/$2} - $1=${$1:-$(${PKG_CONFIG} --variable=$2_location QtCore)} - $1=${$1:-$(${PKG_CONFIG} --variable=host_bins QtCore)/$2} - $1=${$1:-$(${PKG_CONFIG} --variable=host_bins QtCore)/$2-qt4} - if ! which "${$1%% *}" > /dev/null; then - if which "$2-qt5" > /dev/null; then + for package in Qt5Core QtCore; do + if test -x "${$1}"; then + break + fi + tool=$(${PKG_CONFIG} --variable=$2_location $package 2> /dev/null) + if test -x "${tool}"; then + $1="${tool}" + break + fi + tool=$(${PKG_CONFIG} --variable=host_bins $package 2> /dev/null) + if test -n "$tool"; then + for name in $2 $2-qt5 $2-qt4; do + if test -x "${tool}/${name}"; then + $1="${tool}/${name}" + break + fi + done + fi + done + if ! test -x "${$1}"; then + if which "$2" > /dev/null; then + $1=$2 + elif which "$2-qt5" > /dev/null; then $1=$2-qt5 elif which "$2" > /dev/null; then $1=$2 @@ -70,15 +85,15 @@ AC_DEFUN([AX_CXX_QT_TOOL], [ $1=$2-qt4 else HAVE_$1=0 - $1="" + unset $1 fi fi AC_SUBST($1) AM_CONDITIONAL(HAVE_$1, test $HAVE_[$1] -eq 1) if test $HAVE_$1 -eq 1; then - AC_MSG_RESULT([$$1]) + AC_MSG_RESULT([$$1]) else - AC_MSG_RESULT([not found]) + AC_MSG_RESULT([not found]) fi fi ]) @@ -215,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 @@ -226,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}/[$][@] @@ -234,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]) @@ -254,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" <&2 > /dev/null || true + if test -d ${path}/.svn; then + (cd $path; svn upgrade 1>&2 > /dev/null || true) VCS_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p') if test -n "${VCS_REVISION}"; then break; fi - elif test -d .git; then - VCS_REVISION=$(git rev-list --all --count) + elif test -d ${path}/.git; then + VCS_REVISION=$(cd ${path} > /dev/null 2/dev/null; git rev-list --all --count) if test -n "${VCS_REVISION}"; then break; fi fi done @@ -26,20 +26,17 @@ m4_define(x_least, m4_ifdef([x_least_fix], [x_least_fix], ]), mrw_esyscmd_s([ VCS_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-checkout" for path in . .. ../.. ../../..; do - if test -d .svn; then - svn upgrade 1>&2 > /dev/null || true + if test -d ${path}/.svn; then + (cd $path; svn upgrade 1>&2 > /dev/null || true) VCS_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p') if test -n "${VCS_REVISION}"; then break; fi - elif test -d .git; then - VCS_REVISION=$(git rev-list --all --count) + elif test -d ${path}/.git; then + VCS_REVISION=$(cd ${path} > /dev/null 2/dev/null; git rev-list --all --count) if test -n "${VCS_REVISION}"; then break; fi fi done # Mac does not support LEAST > 255 - echo $ECHO_N $(($VCS_REVISION%256)) - ]) - ) -)) + echo $ECHO_N $(($VCS_REVISION%256))])))) # define version number from subversion's revision number: # it is taken modulo 256 due to a bug on Apple's MacOSX @@ -47,18 +44,18 @@ m4_define(x_least, m4_ifdef([x_least_fix], [x_least_fix], 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 - if test -d .svn; then - svn upgrade 1>&2 > /dev/null || true + if test -d ${path}/.svn; then + (cd $path; svn upgrade 1>&2 > /dev/null || true) VCS_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p') if test -n "${VCS_REVISION}"; then break; fi - elif test -d .git; then - VCS_REVISION=$(git rev-list --all --count) + elif test -d ${path}/.git; then + VCS_REVISION=$(cd ${path} > /dev/null 2/dev/null; git rev-list --all --count) if test -n "${VCS_REVISION}"; then break; fi fi; done # Mac does not support LEAST > 255 - echo $ECHO_N $(($VCS_REVISION/256)) -]))) + 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]))]) @@ -93,7 +90,7 @@ dnl refers to ${prefix}. Thus we have to use `eval' twice. # $3 = filename of makefile.in AC_DEFUN([AX_ADD_MAKEFILE_TARGET_DEP], [ sh_add_makefile_target_dep() { - sed -i -e ':a;/^'${1}':.*\\$/{N;s/\\\n//;ta};s/^'${1}':.*$/& '${2}'/' "${srcdir}/${3}" + sed -i -e ':a;/^'${1}':.*\\$/{N;s/\\\n//;ta};s/^'"${1}"':.*$/& '"${2}"'/' "${srcdir}/${3}" if ! egrep -q "${1}:.* ${2}" "${srcdir}/${3}"; then echo "${1}: ${2}" >> "${srcdir}/${3}" fi @@ -129,7 +126,7 @@ AC_DEFUN([AX_SUBST], [ # m4_define(x_minor, MINOR_NUMBER) # project's minor version # m4_include(ax_init_standard_project.m4) # AC_INIT(x_package_name, x_version, x_bugreport, x_package_name) -# AM_INIT_AUTOMAKE([1.9 tar-pax]) +# AM_INIT_AUTOMAKE([1.9 tar-pax parallel-tests color-tests]) # AX_INIT_STANDARD_PROJECT # # you change nothing but: YOUR_PACKAGE_NAME, MAJOR_NUMBER, MINOR_NUMBER @@ -140,6 +137,8 @@ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [ AX_SUBST(PREFIX) SYSCONFDIR=$(test "$prefix" = NONE && prefix=$ac_default_prefix; eval echo "${sysconfdir}") AX_SUBST(SYSCONFDIR) + PKGSYSCONFDIR=$(test "$prefix" = NONE && prefix=$ac_default_prefix; eval echo "${SYSCONFDIR}/${PACKAGE_NAME}") + AX_SUBST(PKGSYSCONFDIR) DATADIR=$(test "$prefix" = NONE && prefix=$ac_default_prefix; eval echo "${datadir}") AX_SUBST(DATADIR) PKGDATADIR=$(test "$prefix" = NONE && prefix=$ac_default_prefix; eval echo "${DATADIR}/${PACKAGE_NAME}") @@ -170,16 +169,65 @@ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [ AM_CPPFLAGS+=" '-DMAKE_STRING(X)=\#X' '-DNAMESPACE=${PACKAGE_TARNAME//[^a-zA-Z0-9]/_}'" AX_SUBST(NUMBERS) AX_SUBST(HOME) - README=$(tail -n +3 README) + if test -f README.md; then + README=$(tail -n +3 README.md) + DESCRIPTION=$(head -1 README.md | sed 's,^#\+ *,,;s, *#\+$,,') + else + README=$(tail -n +3 README) + DESCRIPTION=$(head -1 README) + fi + README_ESCAPED=$(echo "$README" | sed ':a;N;$!ba;s/\n/\\n/g;s,",\\",g') + if which pandoc 2>&1 > /dev/null; then + README_HTML=$(echo "$README" | pandoc -f markdown_github -t html | sed ':a;N;$!ba;s,\\\(.\),\\\\\1,g;s/\n/\\n/g;s,",\\",g;s, ,\ \ ,g') + else + README_HTML="${README}" + fi AX_SUBST(README) _AM_SUBST_NOTMAKE([README]) - DESCRIPTION=$(head -1 README) + AX_SUBST(README_ESCAPED) + _AM_SUBST_NOTMAKE([README_ESCAPED]) + AX_SUBST(README_HTML) + _AM_SUBST_NOTMAKE([README_HTML]) AX_SUBST(DESCRIPTION) _AM_SUBST_NOTMAKE([DESCRIPTION]) + LICENSE=$(echo $(head -1 COPYING)) + AX_SUBST(LICENSE) + COPYING=$(.*,\1,') + PACKAGER=$(gpg -K --display-charset utf-8 --lock-never 2>/dev/null | sed -n 's,uid *\(\[[ultimate\]] *\)\?,,p' | head -1) + if test -z "${PACKAGER}"; then + PACKAGER="$AUTHOR" + fi AX_SUBST(AUTHOR) _AM_SUBST_NOTMAKE([AUTHOR]) + AX_SUBST(AUTHOR_NAME) + AX_SUBST(AUTHOR_URL) + AX_SUBST(AUTHOR_MAIL) + AX_SUBST(PACKAGER) + PROJECT_URL="${PROJECT_URL:-${AUTHOR_URL}/projects/${PACKAGE_NAME}}" + SOURCE_DOWNLOAD="${SOURCE_DOWNLOAD:-${AUTHOR_URL}/downloads/${PACKAGE_NAME}}" + AX_SUBST(PROJECT_URL) + AX_SUBST(SOURCE_DOWNLOAD) + 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) @@ -242,6 +290,25 @@ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [ else AM_CPPFLAGS="${AM_CPPFLAGS} -DQT_NO_DEBUG_OUTPUT -DQT_NO_DEBUG" fi + + AC_ARG_WITH(gcov, + [AS_HELP_STRING([--with-gcov=FILE], + [enable gcov, set gcov file (defaults to gcov)])], + [GCOV="$enableval"], [GCOV="no"]) + AM_CONDITIONAL(COVERAGE, test "$GCOV" != "no") + if test "$GCOV" != "no"; then + if test "$GCOV" == "yes"; then + GCOV=gcov + fi + AC_CHECK_PROG(has_gcov, [$GCOV], [yes], [no]) + if test "$has_gcov" != "yes"; then + AC_MSG_ERROR([gcov: program $GCOV not found]) + fi + AC_MSG_NOTICE([Coverage tests enabled, using ${GCOV}]); + AM_CXXFLAGS="${AM_CXXFLAGS:-} -O0 --coverage -fprofile-arcs -ftest-coverage" + AM_LDFLAGS="${AM_LDFLAGS} -O0 --coverage -fprofile-arcs" + AX_SUBST(GCOV) + fi if test -f ${PACKAGE_NAME}.desktop.in; then AC_CONFIG_FILES([${PACKAGE_NAME}.desktop]) @@ -273,7 +340,7 @@ EOF AC_DEFUN([AX_USE_CXX], [ m4_include(ax_cxx_compile_stdcxx_11.m4) AC_LANG(C++) - AX_CXX_COMPILE_STDCXX_11(noext, optional) + AX_CXX_COMPILE_STDCXX_14(noext, optional) AC_PROG_CXX AC_PROG_CPP @@ -362,7 +429,7 @@ EOF # use this in configure.ac to support CppUnit for C++ unit tests AC_DEFUN([AX_USE_CPPUNIT], [ - AM_PATH_CPPUNIT([1.0.0], [have_cppunit="yes"], [have_cppunit="no"]) + PKG_CHECK_MODULES(CPPUNIT, cppunit, [have_cppunit="yes"], [have_cppunit="no"]) # infos and warnings if test "$have_cppunit" = "no"; then AC_MSG_WARN([Missing cppunit development library! @@ -383,9 +450,62 @@ maintainer-clean-example-targets: EOF ]) +# use this in configure.ac to support NodeJS +AC_DEFUN([AX_USE_NODEJS], [ + AC_PATH_PROG(ANDROID, [android], [0], + [${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 <> cordova/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 @@ -487,22 +639,38 @@ AC_DEFUN([AX_USE_DOXYGEN], [ AC_MSG_WARN([Missing program mscgen! - when you rebild documentation, there are no message state charts - there are precompiled derived files in the distribution]); fi - AC_CONFIG_FILES([doc/makefile doc/doxyfile]) + AC_CONFIG_FILES([doc/makefile doc/doxyfile doc/header.html doc/footer.html]) AX_ADD_MAKEFILE_TARGET_DEP([clean-am], [clean-documentation], [doc/makefile.in]) AX_ADD_MAKEFILE_TARGET_DEP([distclean-am], [distclean-documentation], [doc/makefile.in]) AX_ADD_MAKEFILE_TARGET_DEP([maintainer-clean-am], [maintainer-clean-documentation], [doc/makefile.in]) AX_ADD_MAKEFILE_TARGET_DEP([install-data-am], [install-data-documentation], [doc/makefile.in]) AX_ADD_MAKEFILE_TARGET_DEP([uninstall-am], [uninstall-documentation], [doc/makefile.in]) AX_ADD_MAKEFILE_TARGET_DEP([all], [doc], [doc/makefile.in]) - AX_ADD_MAKEFILE_TARGET_DEP([.PHONY], [pdf], [doc/makefile.in]) + AX_ADD_MAKEFILE_TARGET_DEP([.PHONY], [pdf gen-uml-images], [doc/makefile.in]) test -f doc/makefile.in && cat >> doc/makefile.in <> doc/makefile.in <Perl Documentation

Perl Documentation

    " > perldoc/index.html + for p in \${PERL_SOURCES:%=perldoc/%}; do \ + echo '
  • '"\$\${p#perldoc/}"'
  • ' >> perldoc/index.html; \ + done + echo "
" >> perldoc/index.html + +perldoc/%: + pods2html --notoc --empty --index index @top_srcdir@/\${@:perldoc/%=%} \$[@] + +distclean-perldoc: + -rm -r perldoc +maintainer-clean-perldoc: + -rm makefile.in +install-data-perldoc: + test -d \$(DESTDIR)\${docdir} || mkdir -p \$(DESTDIR)\${docdir} + chmod -R u+w \$(DESTDIR)\${docdir} + cp -r perldoc \$(DESTDIR)\${docdir}/ +uninstall-perldoc: + -chmod -R u+w \$(DESTDIR)\${docdir} + -rm -rf \$(DESTDIR)\${docdir}/perldoc +#### End: $0 +EOF +]) + # require a specific package, with fallback: test for a header # - parameter: # $1 = unique id (no special characters) @@ -527,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 @@ -627,6 +851,33 @@ AC_DEFUN([AX_PKG_REQUIRE], [ else AC_MSG_NOTICE([To enable $1, add $1_CPPFLAGS, $1_CXXFLAGS and $1_LIBS]) fi + + 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 + 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 + done + fi + AX_DEB_BUILD_DEPEND([$deb_pkg]) + AX_RPM_BUILD_DEPEND([$rpm_pkg]) ]) # check if a specific package exists @@ -635,6 +886,13 @@ AC_DEFUN([AX_PKG_REQUIRE], [ # $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) @@ -669,6 +927,23 @@ AC_DEFUN([AX_PKG_CHECK], [ 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 @@ -794,9 +1069,165 @@ AC_DEFUN([AX_CHECK_VALID_LD_FLAG], [ # - parameter: # $1 = package name AC_DEFUN([AX_DEB_DEPEND_IFEXISTS], [ - pkg=$1 + pkg="$1" if test -n "$(apt-cache policy -q ${pkg} 2> /dev/null)"; then - DEB_DEPEND_IFEXISTS+=", ${pkg}" + DEB_DEPEND_IFEXISTS="${DEB_DEPEND_IFEXISTS}, ${pkg}" fi +]) + +# require package in debian/control.in append @DEB_BUILD_DEPEND@ to Build-Depends +# - parameter: +# $1 = package name +AC_DEFUN([AX_DEB_BUILD_DEPEND], [ + pkg="$1" + DEB_BUILD_DEPEND="${DEB_BUILD_DEPEND}, ${pkg}" +]) + +# require package in debian/control.in append @DEB_DEPEND@ to Depends +# - parameter: +# $1 = package name +AC_DEFUN([AX_DEB_DEPEND], [ + pkg="$1" + DEB_DEPEND="${DEB_DEPEND}, ${pkg}" +]) + +# require package in debian/control.in append @DEB_DEPEND@ to Depends +# - parameter: +# $1 = package name +AC_DEFUN([AX_DEB_SECTION], [ + pkg="$1" + DEB_SECTION="${pkg}" +]) + +# call after setting debian dependencies +AC_DEFUN([AX_DEB_RESOLVE], [ + AC_SUBST(DEB_BUILD_DEPEND) + AC_SUBST(DEB_DEPEND) + AC_SUBST(DEB_SECTION) AC_SUBST(DEB_DEPEND_IFEXISTS) ]) + +# Check if a package exists in the current distribution, if yes, require it +# in .spec.in append @RPM_DEPEND_IFEXISTS@ to Build-Depends +# - parameter: +# $1 = package name +AC_DEFUN([AX_RPM_DEPEND_IFEXISTS], [ + pkg="$1" + + if (test -x /usr/bin/zypper && zypper search -x "$pkg" 1>&2 > /dev/null) || \ + (test -x /usr/bin/dnf && dnf list -q "$pkg" 1>&2 > /dev/null) || \ + (test -x /usr/bin/yum && yum list -q "$pkg" 1>&2 > /dev/null) || \ + (test -x /usr/sbin/urpmq && urpmq "$pkg" 1>&2 > /dev/null); then + RPM_DEPEND_IFEXISTS="${RPM_DEPEND_IFEXISTS}, ${pkg}" + fi +]) + +# require package in .spec.in append @RPM_BUILD_DEPEND@ to Build-Depends +# - parameter: +# $1 = package name +AC_DEFUN([AX_RPM_BUILD_DEPEND], [ + pkg="$1" + RPM_BUILD_DEPEND="${RPM_BUILD_DEPEND}, ${pkg}" +]) + +# require package in .spec.in append @RPM_DEPEND@ to Depends +# - parameter: +# $1 = package name +AC_DEFUN([AX_RPM_DEPEND], [ + pkg="$1" + if test -z "${RPM_DEPEND}"; then + RPM_DEPEND="${pkg}" + else + RPM_DEPEND="${RPM_DEPEND}, ${pkg}" + fi +]) + +# require package in debian/control.in append @DEB_DEPEND@ to Depends +# - parameter: +# $1 = package name +AC_DEFUN([AX_RPM_GROUP], [ + pkg="$1" + RPM_GROUP="${pkg}" +]) + +# call after setting rpmian dependencies +AC_DEFUN([AX_RPM_RESOLVE], [ + AC_SUBST(RPM_BUILD_DEPEND) + AC_SUBST(RPM_DEPEND) + AC_SUBST(RPM_GROUP) + AC_SUBST(RPM_DEPEND_IFEXISTS) +]) + +# Check if a package exists in the current distribution, if yes, require it +# in .spec.in append @ALL_DEPEND_IFEXISTS@ to Build-Depends +# - parameter: +# $1 = package name +AC_DEFUN([AX_ALL_DEPEND_IFEXISTS], [ + pkg="$1" + if test -n "$(apt-cache policy -q ${pkg} 2> /dev/null)"; then + DEB_DEPEND_IFEXISTS="${DEB_DEPEND_IFEXISTS}, ${pkg}" + fi + if (test -x /usr/bin/zypper && zypper search -x "$pkg" 1>&2 > /dev/null) || \ + (test -x /usr/bin/dnf && dnf list -q "$pkg" 1>&2 > /dev/null) || \ + (test -x /usr/bin/yum && yum list -q "$pkg" 1>&2 > /dev/null) || \ + (test -x /usr/sbin/urpmq && urpmq "$pkg" 1>&2 > /dev/null); then + RPM_DEPEND_IFEXISTS="${RPM_DEPEND_IFEXISTS}, ${pkg}" + fi +]) + +# Check if a package exists in the current distribution, if yes, require it +# in .spec.in append @ALL_DEPEND_IFEXISTS@ to Build-Depends +# - parameter: +# $1 = package name +AC_DEFUN([AX_ALL_DEPEND_IFEXISTS_DEV], [ + pkg="$1" + if test -n "$(apt-cache policy -q ${pkg}-dev 2> /dev/null)"; then + DEB_DEPEND_IFEXISTS="${DEB_DEPEND_IFEXISTS}, ${pkg}-dev" + fi + if (test -x /usr/bin/zypper && zypper search -x "$pkg"-devel 1>&2 > /dev/null) || \ + (test -x /usr/bin/dnf && dnf list -q "$pkg"-devel 1>&2 > /dev/null) || \ + (test -x /usr/bin/yum && yum list -q "$pkg"-devel 1>&2 > /dev/null) || \ + (test -x /usr/sbin/urpmq && urpmq "$pkg"-devel 1>&2 > /dev/null); then + RPM_DEPEND_IFEXISTS="${RPM_DEPEND_IFEXISTS}, ${pkg}-devel" + fi +]) + +# require package in .spec.in append @ALL_BUILD_DEPEND@ to Build-Depends +# - parameter: +# $1 = package name +AC_DEFUN([AX_ALL_BUILD_DEPEND], [ + pkg="$1" + DEB_BUILD_DEPEND="${DEB_BUILD_DEPEND}, ${pkg}" + RPM_BUILD_DEPEND="${RPM_BUILD_DEPEND}, ${pkg}" +]) + +# require package in .spec.in append @ALL_BUILD_DEPEND@ to Build-Depends +# - parameter: +# $1 = package name +AC_DEFUN([AX_ALL_BUILD_DEPEND_DEV], [ + pkg="$1" + 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 +# - parameter: +# $1 = package name +AC_DEFUN([AX_ALL_DEPEND], [ + pkg="$1" + DEB_DEPEND="${DEB_DEPEND}, ${pkg}" + if test -z "${RPM_DEPEND}"; then + RPM_DEPEND="${pkg}" + else + RPM_DEPEND="${RPM_DEPEND}, ${pkg}" + 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 22e0c7b..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 @@ -129,28 +131,55 @@ GENERATED FILES * 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 + * makefile_test.inc.am - makefile to be included in tests * 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 + * rpmsign.exp - script for signing rpms unattended * 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 * src/makefile.am - if you enabled AX_USE_CXX * src/version.hxx - if you enabled AX_USE_CXX * src/version.cxx - if you enabled AX_USE_CXX - * html/makefile.am - if you enabled AX_BUILD_HTML + * etc/makefile.am - if you enable AX_USE_ETC + * html/makefile.am - if you enabled AX_BUILD_HTML or AX_BUILD_HTML_NPM + * html/package.json.in - if you enabled AX_BUILD_HTML_NPM * scripts/makefile.am - if you enabled AX_USE_SCRIPTS - * doc/makefile.am - if you enabled AX_USE_DOXYGEN + * nodejs/makefile.am - if you add AX_USE_NODEJS + * nodejs/${DEFAULT_PROJECT_NAME}.js - if you add AX_USE_NODEJS + * nodejs/package.json.in - if you add AX_USE_NODEJS + * nodejs/etc/${DEFAULT_PROJECT_NAME}.json - if you add AX_USE_NODEJS + * nodejs/etc/default/${DEFAULT_PROJECT_NAME} - if you add AX_USE_NODEJS + * nodejs/etc/init/${DEFAULT_PROJECT_NAME}.conf - if you add AX_USE_NODEJS + * nodejs/etc/systemd/system/${DEFAULT_PROJECT_NAME}.service - if you add AX_USE_NODEJS + * nodejs/public - if you add AX_USE_NODEJS + * nodejs/public/images - if you add AX_USE_NODEJS + * nodejs/public/javascripts/${DEFAULT_PROJECT_NAME}.js - if you add AX_USE_NODEJS + * nodejs/public/stylesheets/style.styl - if you add AX_USE_NODEJS + * nodejs/routes/index.js - if you add AX_USE_NODEJS + * nodejs/sockets/index.js - if you add AX_USE_NODEJS + * nodejs/views/index.ejs - if you add AX_USE_NODEJS + * nodejs/views/layout.ejs - if you add AX_USE_NODEJS + * nodejs/node_modules - if you add AX_USE_NODEJS + * doc/makefile.am - if you enabled AX_USE_DOXYGEN or AX_USE_PERLDOC * doc/doxyfile.in - if you enabled AX_USE_DOXYGEN - * test/makefile.am - if you enabled AX_BUILD_TEST or AX_USE_CPPUNIT + * doc/header.html.in - if you enabled AX_USE_DOXYGEN + * doc/footer.html.in - if you enabled AX_USE_DOXYGEN + * doc/style.css - if you enabled AX_USE_DOXYGEN + * doc/plantuml.jar - if you enable AX_USE_DOXYGEN + * test/makefile.am - if you enabled AX_USE_CPPUNIT and AX_USE_CXX + * test/${DEFAULT_PROJECT_NAME#lib}.cxx - if you enabled AX_BUILD_TEST or AX_USE_CPPUNIT * examples/makefile.am - if you enabled AX_BUILD_EXAMPLES * debian/changelog.in - if you enabled AX_USE_DEBIAN_PACKAGING * debian/control.in - if you enabled AX_USE_DEBIAN_PACKAGING @@ -191,6 +220,7 @@ FILES TO EDIT * src/makefile.am * html/makefile.am * test/makefile.am + * test/${DEFAULT_PROJECT_NAME}.cxx * examples/makefile.am FILE DEPENDENCIES @@ -199,10 +229,10 @@ FILE DEPENDENCIES configuration a dependent, i.e.: * test/makefile.am depends on AX_USE_LIBTOOL - * html/makefile.am depends on AX_BUILD_HTML + * html/makefile.am depends on AX_BUILD_HTML or AX_BUILD_HTML_NPM * doc/doxyfile.in depends on AX_BUILD_EXAMPLES - * debian/control.in depends on AX_USE_DOXYGEN, AX_USE_CPPUNIT - AX_CXX_QT, AX_CHECK_QT, AX_REQUIRE_QT, AX_USE_LIBTOOL + * debian/control.in depends on AX_USE_DOXYGEN, AX_USE_PERLDOC, + AX_USE_CPPUNIT AX_CXX_QT, AX_CHECK_QT, AX_REQUIRE_QT, AX_USE_LIBTOOL * debian/${DEFAULT_PROJECT_NAME}.install depends on AX_USE_LIBTOOL * debian/${DEFAULT_PROJECT_NAME}.dirs depends on AX_USE_LIBTOOL * debian/${DEFAULT_PROJECT_NAME}-dev.install depends on AX_USE_LIBTOOL @@ -233,9 +263,12 @@ FILES number. In git, git rev-list --all --count is used. The following macros are supported in configure.ac: * Enable C++: AX_USE_CXX + * Enable system config files in /etc: AX_USE_ETC * Enable LibTool library creation: AX_USE_LIBTOOL * Enable Scripts: AX_USE_SCRIPTS + * Enable NodeJS project: AX_USE_NODEJS * Enable Doxygen documentation generation: AX_USE_DOXYGEN + * Enable Perldoc documentation generation: AX_USE_PERLDOC * Enable Debian packaging by calling "make deb": AX_USE_DEBIAN_PACKAGING * Enable RPM packaging by calling "make rpm": AX_USE_RPM_PACKAGING * Enable C++ testing using CppUnit: AX_USE_CPPUNIT @@ -271,48 +304,65 @@ EOF shift; done -echo -en "\e[1m-> checking:\e[0m for version control system ..." -VCS="" -VCSDEPENDS="" -if test -d .svn; then - VCS="svn" - VCSDEPENDS="subversion," - echo -e " \e[32msuccess\e[0m detected ${VCS}" -elif test -d .git; then - VCS="git" - VCSDEPENDS="git," - echo -e " \e[32msuccess\e[0m detected ${VCS}" -else - echo -e " \e[33mignored\e[0m" +# 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 -HEADER='## @id '"\$Id\$"' -## -## This file has been added: -## - by '${MY_NAME}' -## - on '$(LANG= date +"%a, %d %B %Y %H:%M:%S %z")' -## Feel free to change it or even remove and rebuild it, up to your needs -## -## 1 2 3 4 5 6 7 8 -## 45678901234567890123456789012345678901234567890123456789012345678901234567890 +notice() { + echo "${yellow}→ notice: ${bold}$*${normal}" +} -' +running() { + echo -n "${bold}${blue}→ running: ${bold}${white}$*${normal} … " +} -CHEADER='/** @id '"\$Id\$"' +checking() { + echo -n "${bold}${blue}→ checking: ${bold}${white}$*${normal} … " +} - This file has been added: - - by '${MY_NAME}' - - on '$(LANG= date +"%a, %d %B %Y %H:%M:%S %z")' +generating() { + echo -n "${bold}${blue}→ generating: ${bold}${white}$*${normal} … " +} -*/ -// 1 2 3 4 5 6 7 8 -// 45678901234567890123456789012345678901234567890123456789012345678901234567890 +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}" +} -notice() { - echo -e "\e[1;33m$*\e[0m" +error() { + echo "${bold}${red}→ error: $1${normal}" + shift + if test -n "$*"; then + echo "${bold}$*${normal}" + fi + exit 1 } run() { @@ -324,28 +374,70 @@ run() { esac shift; done - echo -en "\e[1m-> running:\e[0m $* ..." + running $* 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 + error "Failed with return code: $res" "$result" else - echo -e " \e[33mignored\e[0m" + ignored fi else - echo -e " \e[32msuccess\e[0m" + 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, " + success detected ${VCS} + break + elif test -d ${path}/.git; then + VCS="git" + VCSDEPENDS_DEB="git2cl, git," + VCSDEPENDS_RPM="git, " + success detected ${VCS} + break + fi +done +if test -z "$VCS"; then + ignored +fi + +HEADER='## @id '"\$Id\$"' +## +## This file has been added: +## - by '${MY_NAME}' +## - on '$(LANG= date +"%a, %d %B %Y %H:%M:%S %z")' +## Feel free to change it or even remove and rebuild it, up to your needs +## +## 1 2 3 4 5 6 7 8 +## 45678901234567890123456789012345678901234567890123456789012345678901234567890 + +' + +CHEADER='/** @id '"\$Id\$"' + + This file has been added: + - by '${MY_NAME}' + - on '$(LANG= date +"%a, %d %B %Y %H:%M:%S %z")' + +*/ +// 1 2 3 4 5 6 7 8 +// 45678901234567890123456789012345678901234567890123456789012345678901234567890 + + +' + testtag() { local IFS="|" - egrep -q '^ *'"($*)" configure.ac + egrep -q '^ *'"($*)"' *(\(.*)? *$' configure.ac } contains() { @@ -395,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 @@ -433,6 +520,9 @@ copy() { source="${0%/*}/$1" fi fi + if test "${1%/*}" != "$1"; then + test -d "${1%/*}" || svn mkdir "${1%/*}" + fi run cp "${source}" "$1" if test $exists -eq 0; then if test -n "${VCS}" -a $novcs -eq 0 && ! contains "$1" "${excludevcs[@]}"; then @@ -445,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 } @@ -473,11 +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 + $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 @@ -500,13 +593,17 @@ copy ${MY_NAME} copy ax_init_standard_project.m4 copy ax_cxx_compile_stdcxx_11.m4 copy ax_check_qt.m4 +copy makefile_test.inc.am copy resolve-debbuilddeps.sh copy resolve-rpmbuilddeps.sh copy build-in-docker.sh +copy rpmsign.exp copy build-resource-file.sh copy sql-to-dot.sed copy mac-create-app-bundle.sh -AUTHOR=$(gpg -K | sed -n 's,uid *,,p' | sort | head -1) +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) " fi @@ -516,13 +613,24 @@ EOF to NEWS < #include #include #include +#include int main(int argc, char *argv[]) try { QApplication a(argc, argv); + a.setApplicationDisplayName(a.tr("${PACKAGE_NAME}")); + a.setApplicationName(${PACKAGE_NAME}::package_name().c_str()); + a.setApplicationVersion(${PACKAGE_NAME}::version().c_str()); QCommandLineParser parser; parser.addHelpOption(); parser.process(a); @@ -652,10 +783,17 @@ int main(int argc, char *argv[]) try { return 1; } EOF - to --condition AX_USE_CXX src/${PACKAGE_NAME}.hxx < #include @@ -665,6 +803,7 @@ class ${PackageName}: public QMainWindow, protected Ui::${PackageName} { Q_OBJECT; public: explicit ${PackageName}(QWidget *parent = 0): QMainWindow(parent) { + setTitle(tr("${PACKAGE_NAME}[*]")); setupUi(this); } virtual ~${PackageName}() {} @@ -672,7 +811,8 @@ class ${PackageName}: public QMainWindow, protected Ui::${PackageName} { #endif EOF - to --condition AX_USE_CXX src/${PACKAGE_NAME}.ui < ${PackageName} @@ -754,7 +894,7 @@ EOF to --condition AX_USE_CXX src/version.cxx <= 0.0.1", + "socket.io": "~1.4.4", + "socketio-auth": "0.0.5", + "ldapauth": "git+https://github.com/DimensionSoftware/node-ldapauth.git" + }, + "description": "@DESCRIPTION@", + "main": "@PACKAGE_NAME@.js", + "devDependencies": {}, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "@AUTHOR@", + "license": "@LICENSE@", + "path": { + "prefix": "@PREFIX@", + "sysconf": "@SYSCONFDIR@", + "pkgdata": "@PKGDATADIR@", + "localstate": "@LOCALSTATEDIR@", + "log": "@LOCALSTATEDIR@/log/@PACKAGE_NAME@.log", + "config": "@SYSCONFDIR@/@PACKAGE_NAME@.json", + "nodejs": "@PKGDATADIR@/nodejs" + } +} +EOF +to --condition AX_USE_NODEJS nodejs/etc/${PACKAGE_NAME}.json < /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_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_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_UPPER}} \${${PACKAGE_NAME_UPPER}_PORT} >> \${${PACKAGE_NAME_UPPER}_LOG} 2>&1 + fi +end script + +pre-start script + ${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_UPPER}_LOG} +end script + +pre-stop script + ${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_UPPER}_LOG} +end script +EOF +to --condition AX_USE_NODEJS nodejs/etc/systemd/system/${PACKAGE_NAME}.service < new connection from "+userdata.username); + + function emit(signal, data, info) { + if (typeof data == 'string' && !data.match("\n")) { + console.log("<- signal: "+signal+"("+data+")"); + } else { + console.log("<- signal: "+signal); + } + if (info) console.log(info); + socket.emit(signal, data); + } + + function fail(txt, data) { + console.log("** "+txt, data); + emit("fail", txt); + } + + /* + socket + .on("xxx", xxx) + .on("yyy", yyy; + */ + + } + + // Handle Connection + require('socketio-auth')(io, { + authenticate: function (socket, data, callback) { + console.log("=> authenticate: ", data.username); + //get credentials sent by the client + var username = data.username; + var password = data.password; + authentication(data.username, data.password, + function() { + console.log("####LOGIN-SUCESS####"); + callback(null, true) + }, + function() { + console.log("####LOGIN-FAIL####"); + callback(new Error("wrong credentials")) + }); + }, + postAuthenticate: connection, + timeout: "none" + }); + + return module; +} +EOF +to --condition AX_USE_NODEJS nodejs/views/index.ejs < + + + + + + + + $DESCRIPTION + + + +

$DESCRIPTION

+

generated by bootstrap, please edit

+ + + +EOF +to --condition AX_USE_NODEJS nodejs/views/layout.ejs < +EOF +echo "${HEADER}MAINTAINERCLEANFILES = makefile.in" | to --condition 'AX_USE_DOXYGEN|AX_USE_PERLDOC' doc/makefile.am if testtag AX_BUILD_TEST; then to test/runtests.sh < ${0%/*}/test/runtests.sh fi @@ -809,31 +1302,205 @@ AM_CPPFLAGS = -I\${top_srcdir}/src -I\${top_builddir}/src AM_LDFLAGS = -L\${abs_top_builddir}/src/.libs $(if testtag AX_USE_LIBTOOL; then cat < +#include +#include +#include +#include +#include + +/// @todo Rename DummyTest and DummyTest::dummy() +/// @todo Write test cases +class DummyTest: public CppUnit::TestFixture { + public: + void dummy() { + } + CPPUNIT_TEST_SUITE(DummyTest); + CPPUNIT_TEST(dummy); + CPPUNIT_TEST_SUITE_END(); +}; +CPPUNIT_TEST_SUITE_REGISTRATION(DummyTest); + +int main(int argc, char** argv) try { + std::ofstream ofs((*argv+std::string(".xml")).c_str()); + CppUnit::TextUi::TestRunner runner; + runner.setOutputter(new CppUnit::XmlOutputter(&runner.result(), ofs)); + runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); + return runner.run() ? 0 : 1; + } catch (std::exception& e) { + std::cerr<<"***Exception: "< + + + + + + +\$projectname: \$title +\$title + + + +\$treeview +\$search +\$mathjax + +\$extrastylesheet + + +
+ +
+
+ +
\$projectname \$projectnumber
+
\$projectbrief
+
+ +
+EOF +to --condition AX_USE_DOXYGEN doc/footer.html.in < + +
+ + +EOF +to --condition AX_USE_DOXYGEN doc/style.css <@AUTHOR_NAME@\\n"' doxyadd ALIASES '"license=\\par License\\n"' doxyadd ALIASES '"classmutex=\\par Reentrant:\\nAccess is locked with class static mutex @c "' doxyadd ALIASES '"instancemutex=\\par Reentrant:\\nAccess is locked with per instance mutex @c "' doxyadd ALIASES '"mutex=\\par Reentrant:\\nAccess is locked with mutex @c "' doxyadd ALIASES '"api=\\xrefitem api \\"API Call\\" \\"\\""' + doxyadd ALIASES '"description=@DESCRIPTION@"' + doxyadd ALIASES '"readme=@README_HTML@"' + doxyadd ALIASES '"author=@AUTHOR_NAME@"' + doxyreplace PLANTUML_JAR_PATH '"@top_srcdir@/doc/plantuml.jar"' doxyreplace ENABLE_PREPROCESSING YES doxyreplace MACRO_EXPANSION YES doxyadd PREDEFINED '"NAMESPACE=@PACKAGE_NAME@"' @@ -886,9 +1557,20 @@ if testtag AX_USE_DOXYGEN; then if testtag AX_BUILD_TEST AX_USE_CPPUNIT; then doxyadd INPUT "@top_srcdir@/test" fi + if testtag AX_USE_NODEJS; then + doxyadd INPUT "@top_srcdir@/nodejs" + doxyadd EXCLUDE "@top_srcdir@/nodejs/node_modules" + doxyadd EXCLUDE "@top_srcdir@/nodejs/public/javascripts/ext" + fi doxyreplace FILE_PATTERNS '*.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.idl *.ddl *.odl *.h *.hh *.hxx *.hpp *.h++ *.cs *.d *.php *.php4 *.php5 *.phtml *.inc *.m *.markdown *.md *.mm *.dox *.py *.f90 *.f *.for *.tcl *.vhd *.vhdl *.ucf *.qsf *.as *.js *.wt *.sql' doxyreplace RECURSIVE YES - doxyreplace EXCLUDE_PATTERNS "moc_* uic_* qrc_*" + doxyreplace EXCLUDE_PATTERNS "moc_* uic_* qrc_* version.[ch]xx" + doxyreplace HTML_HEADER header.html + doxyreplace HTML_FOOTER footer.html + doxyreplace HTML_EXTRA_STYLESHEET style.css + doxyreplace HTML_DYNAMIC_SECTIONS YES + doxyreplace DISABLE_INDEX NO + doxyreplace GENERATE_TREEVIEW YES if testtag AX_BUILD_EXAMPLES; then doxyreplace EXAMPLE_PATH @top_srcdir@/examples fi @@ -897,7 +1579,6 @@ if testtag AX_USE_DOXYGEN; then doxyreplace SOURCE_BROWSER YES doxyreplace INLINE_SOURCES YES doxyreplace GENERATE_TESTLIST YES - doxyreplace GENERATE_TREEVIEW NO doxyreplace SEARCHENGINE NO doxyreplace GENERATE_HTML YES doxyreplace GENERATE_LATEX NO @@ -920,21 +1601,22 @@ if testtag AX_USE_DEBIAN_PACKAGING; then to debian/changelog.in < ChangeLog";; esac) fi aclocal -$(if testtag AX_USE_LIBTOOL; then echo libtoolize --force; fi) +$(if testtag AX_USE_LIBTOOL; 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 @@ -1141,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 674ff2c..5559f63 100755 --- a/build-in-docker.sh +++ b/build-in-docker.sh @@ -2,21 +2,30 @@ set -o errtrace # build and test everything in a fresh docker installation -mode="apt" -img="ubuntu:latest" +myarch=$(dpkg --print-architecture) +if test "${arch}" = "amd64"; then + myarch="amd64|i386" +fi +mode="deb" +img="mwaeckerlin/ubuntu:latest" repos=() keys=() -envs=() -dirs=("-v $(pwd):/workdir") +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=() targets="all check distcheck" commands=() +arch=$((which dpkg > /dev/null 2> /dev/null && dpkg --print-architecture) || echo amd64) +host= +flags=() wait=0 if test -e ./build-in-docker.conf; then # you can preconfigure the variables in file build-in-docker.conf # if you do so, add the file to EXTRA_DIST in makefile.am source ./build-in-docker.conf fi + while test $# -gt 0; do case "$1" in (-h|--help) @@ -25,11 +34,15 @@ while test $# -gt 0; do echo "OPTIONS:" echo echo " -h, --help show this help" - echo " -m, --mode mode: apt or yum, default: ${mode}" + echo " -m, --mode mode: deb, rpm, win, default: ${mode}" echo " -i, --image use given docker image instead of ${img}" + echo " -a, --arch build for given hardware architecture" echo " -t, --targets targets specify build targets, default: ${targets}" + echo " --host host for cross compiling, e.g. i686-w64-mingw32" + 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" @@ -37,6 +50,10 @@ while test $# -gt 0; do 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 " The option -m must be after -t, because mode may be auto detected from targets" + echo " The option -m must be after -h, because mode may set a host" + echo " If target is either deb or rpm, mode is set to the same value" + echo " If target is win, host is set to i686-w64-mingw32" echo echo " The options -r -k -e -d -p -c can be repeated several times." echo @@ -58,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 @@ -67,8 +84,16 @@ while test $# -gt 0; do (-m|--mode) shift; mode="$1" case "$mode" in - (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="mwaeckerlin/ubuntu:latest"; host="${host:---host=i686-w64-mingw32}" + targets="all install" + flags+=("--prefix=/workdir/usr") + packages+=("mingw-w64") + ;; (*) echo "**** ERROR: unknown mode '$1', try --help" 1>&2 exit 1 @@ -78,10 +103,25 @@ while test $# -gt 0; do (-i|--image) shift; img="$1" ;; + (-a|--arch) shift; + arch="$1" + ;; (-t|--targets) shift; targets="$1" + if test "$1" = "deb" -o "$1" = "rpm"; then + # set mode to same value + set -- "-m" "$@" + continue + fi + ;; + (--host) shift; + host="--host=$1" + ;; + (-f|--flag) shift; + flags+=("$1") ;; (-r|--repo) shift; + echo "OPTION: $1" repos+=("$1") ;; (-k|--key) shift; @@ -90,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") ;; @@ -134,25 +177,21 @@ 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 fi echo -n " ... cleanup docker: " - docker rm -f "${DOCKER_ID}" + docker stop "${DOCKER_ID}" || true + docker rm "${DOCKER_ID}" echo "returning status: $e" echo "--->" 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 } @@ -161,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)-$(dpkg --print-architecture)" =~ ${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)-$(dpkg --print-architecture)" =~ ${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)-$(dpkg --print-architecture)" =~ ${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 } @@ -183,10 +228,25 @@ function ifthenelse() { set -x docker pull $img -DOCKER_ID=$(docker run -d ${dirs[@]} ${envs[@]} -e HOME="${HOME}" -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" +fi +docker start "${DOCKER_ID}" +if ! docker exec ${DOCKER_ID} getent group $(id -g) > /dev/null 2>&1; then + docker exec ${DOCKER_ID} groupadd -g $(id -g) $(id -gn) +fi +if ! docker exec ${DOCKER_ID} getent passwd $(id -u) > /dev/null 2>&1; then + docker exec ${DOCKER_ID} useradd -m -u $(id -u) -g $(id -g) -d"${HOME}" $(id -un) +fi +docker exec ${DOCKER_ID} chown $(id -u):$(id -g) "${HOME}" case $mode in - (apt) + (deb|apt|win) + if [[ "${img}" =~ "ubuntu" ]]; then + docker exec ${DOCKER_ID} locale-gen ${LANG} + docker exec ${DOCKER_ID} update-locale LANG=${LANG} + fi 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" @@ -195,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" @@ -214,8 +274,7 @@ case $mode in done docker exec ${DOCKER_ID} ./resolve-debbuilddeps.sh ;; - (yum) - ./bootstrap.sh -t dist + (rpm|yum|dnf|zypper|urpmi) 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' <&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/doc/footer.html.in b/doc/footer.html.in new file mode 100644 index 0000000..273be21 --- /dev/null +++ b/doc/footer.html.in @@ -0,0 +1,8 @@ + + + diff --git a/doc/header.html.in b/doc/header.html.in new file mode 100644 index 0000000..311876f --- /dev/null +++ b/doc/header.html.in @@ -0,0 +1,33 @@ + + + + + + + +$projectname: $title +$title + + + +$treeview +$search +$mathjax + +$extrastylesheet + + +
+ +
+
+ +
$projectname $projectnumber
+
$projectbrief
+
+ +
diff --git a/doc/plantuml.jar b/doc/plantuml.jar new file mode 100644 index 0000000..9502c23 Binary files /dev/null and b/doc/plantuml.jar differ diff --git a/doc/style.css b/doc/style.css new file mode 100644 index 0000000..303c151 --- /dev/null +++ b/doc/style.css @@ -0,0 +1,38 @@ +#titlearea { + display: flex; + justify-content: space-between; + align-items: flex-begin; +} +#titlearea nav { + padding: 0; + margin: 0; +} +#titlearea nav a { + background-color: lightgray; + border: 1px solid gray; + color: black; + padding: 1ex; + margin: 0; +} +img, object { + max-width: 100% !important; +} +@media (max-width: 50em) { + #navrow1, #navrow2 { + display: block + } + #side-nav, #splitbar, .ui-resizable-handle ui-resizable-e, .ui-resizable-handle ui-resizable-s { + display: none; + } + #doc-content { + margin-left: 0 !important; + } +} +@media (min-width: 50em) { + #navrow1, #navrow2 { + display: none; + } + #side-nav, #splitbar, .ui-resizable-handle ui-resizable-e, .ui-resizable-handle ui-resizable-s { + display: block + } +} 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/makefile_test.inc.am b/makefile_test.inc.am new file mode 100644 index 0000000..baf81c4 --- /dev/null +++ b/makefile_test.inc.am @@ -0,0 +1,9 @@ +## @id $Id$ + +## 1 2 3 4 5 6 7 8 +## 45678901234567890123456789012345678901234567890123456789012345678901234567890 + +%.gcda: % + gcov $< + +CLEANFILES += ${CLEANFILES} ${TEST:%=%.gcno} ${TEST:%=%.gcda} *.gcov diff --git a/resolve-debbuilddeps.sh b/resolve-debbuilddeps.sh index ecd5522..36a94e6 100755 --- a/resolve-debbuilddeps.sh +++ b/resolve-debbuilddeps.sh @@ -16,7 +16,7 @@ if test -n "${SCHROOTNAME}"; then SUDO="schroot -c "${SCHROOTNAME}" -u root -d / --" else DO="" - if grep -q '/docker/' /proc/1/cgroup; then + if grep -q '/docker' /proc/1/cgroup; then SUDO="" else SUDO="sudo" @@ -32,24 +32,76 @@ function install() { } TO_INSTALL= +DEPS= if test -e debian/control.in -a ! -e debian/control; then - for f in $(sed -n 's, *AX_DEB_DEPEND_IFEXISTS(\([^)]*\)).*,\1,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 - TO_INSTALL+=" ${f}" + 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 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 pkg_exists "${f}-dev"; then + DEPS+=" ${f}-dev" fi done + for f in $(sed -n 's, *AX_\(DEB\|ALL\)\(_BUILD\)\?_DEPEND(\([^)]*\)).*,\3,p' configure.ac); do + DEPS+=" ${f}" + done + for f in $(sed -n 's, *AX_\(DEB\|ALL\)\(_BUILD\)\?_DEPEND_DEV(\([^)]*\)).*,\3,p' configure.ac); do + DEPS+=" ${f}-dev" + done trap "rm debian/control" INT TERM EXIT - sed 's,@DEB_DEPEND_IFEXISTS@,,g' debian/control.in | \ + sed 's,@\(\(ALL\|DEB\)_DEPEND_IFEXISTS\|\(ALL\|DEB\)_BUILD_DEPEND\|\(ALL\|DEB\)_DEPEND\)@,,g' debian/control.in | \ sed 's,@[^@]*@, dummytext,g' > debian/control fi install dpkg-dev -DEPS=$(LANG= ${DO} dpkg-checkbuilddeps 2>&1 || true) -DEPS=$(echo "$DEPS" | sed -n '/Unmet build dependencies/ { s,.*Unmet build dependencies: ,,g; s, ([^)]*),,g; s, *| *,|,g; p}') + +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 @@ -72,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 5ddd1b2..7c1843b 100755 --- a/resolve-rpmbuilddeps.sh +++ b/resolve-rpmbuilddeps.sh @@ -10,36 +10,111 @@ ## 1 2 3 4 5 6 7 8 ## 45678901234567890123456789012345678901234567890123456789012345678901234567890 +INSTALL_TOOL=${INSTALL_TOOL:-$((test -x /usr/bin/zypper && echo zypper install -y) || (test -x /usr/bin/dnf && echo dnf install -y) || (test -x /usr/bin/yum && echo yum install -y) || (test -x /usr/sbin/urpmi && echo urpmi --auto))} SCHROOTNAME="$1" PACKAGE_NAME=$(sed -n 's/^ *m4_define(x_package_name, \(.*\)).*/\1/p' configure.ac) -PKGCONFIGS="${2:-epel-release}" # packages to configure yum + +TRAP_CMD="sleep ${SLEEP:-0};" +DEPS= +for f in BUILD BUILDROOT RPMS SPECS SRPMS; do + if ! test -d $f; then + TRAP_CMD+="rm -rf $f;" + mkdir $f + 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 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 pkg_exists "${f}-devel"; then + DEPS+=" ${f}-devel" + fi + done + for f in $(sed -n 's, *AX_\(RPM\|ALL\)\(_BUILD\)\?_DEPEND(\([^)]*\)).*,\3,p' configure.ac); do + DEPS+=" ${f}" + done + for f in $(sed -n 's, *AX_\(RPM\|ALL\)\(_BUILD\)\?_DEPEND_DEV(\([^)]*\)).*,\3,p' configure.ac); do + DEPS+=" ${f}-devel" + done + 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 +fi + +TGZFILE=$(sed -n '/^Name: */{s///;h};/^Version: */{s///;H;x;s/\n/-/;s/$/.tar.gz/;p}' ${PACKAGE_NAME}.spec) +if ! test -e $TGZFILE; then + TRAP_CMD+="rm ${TGZFILE};" + trap "${TRAP_CMD}" INT TERM EXIT + touch $TGZFILE +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') 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 -- ${INSTALL_TOOL} ${FILES} ${DEPS} fi else 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} + ${INSTALL_TOOL} ${FILES} ${DEPS} 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/rpmsign.exp b/rpmsign.exp new file mode 100755 index 0000000..dc29d94 --- /dev/null +++ b/rpmsign.exp @@ -0,0 +1,14 @@ +#!/usr/bin/expect -f + +set key [lindex $argv 0] +set password [lindex $argv 1] +set files [lrange $argv 2 end] + +### rpm-sign.exp -- Sign RPMs by sending the passphrase. +spawn rpmsign --define "_gpg_name $key" --addsign {*}$files +expect { + "Enter pass phrase: " { + send -- "$password\r" + exp_continue + } eof +} diff --git a/scripts/mvfotos.conf b/scripts/mvfotos.conf index 4816836..3ac5307 100644 --- a/scripts/mvfotos.conf +++ b/scripts/mvfotos.conf @@ -27,11 +27,11 @@ prefix[9]=foto # file name extensions to detect the file types ext[1]="jpg png tif xcf jpeg" ext[2]="jps" -ext[3]="mxf mts avi mov mpg mp4 mpg 3gp" +ext[3]="mxf mts avi mov mpg mp4 mpg 3gp webm" ext[4]="cpi" ext[5]="wav" ext[6]="mp3" -ext[7]="rw2" +ext[7]="rw2 dng" ext[8]="3ga" ext[9]="mpo" diff --git a/sql-to-dot.sed b/sql-to-dot.sed index 07b2989..e4e99b3 100755 --- a/sql-to-dot.sed +++ b/sql-to-dot.sed @@ -11,6 +11,11 @@ H;$!d;$x # remove all single-line comment lines s/\n--[^\n]*//g +# encode html entities +s/&/\&##SEMICOLON##/g +s//\>##SEMICOLON##/g + # reduce spaces s,\t\| \+, ,g @@ -21,7 +26,7 @@ s,\t\| \+, ,g s,\n\+,\n,g # remove unknown commands -s,\(;\|\n\) *\(DELIMITER\|USE\|DROP\|CREATE[ \n]\+DATABASE\)[ \n]\+[^;]*;\+,,ig +s,\(;\|\n\) *\(INSERT\|DELIMITER\|USE\|DROP\|CREATE[ \n]\+DATABASE\)[ \n]\+[^;]*;\+,,ig # convert special characters within quotes :a;s/^\(\([^"]*"[^",]*"\)*[^"]*"[^"]*\),\([^"]*".*\)/\1\##COMMA##\3/g;ta @@ -34,17 +39,18 @@ h s,.*\(create[ \n]\+table[^;]*;\).*,\1,ig # start html table node -s|CREATE[ \n]\+TABLE[ \n]\+\(if[ \n]\+not[ \n]\+exists[ \n]\+\)\?`\?\(\w\+\)`\?| \2\n [shape=none, margin=0, label=<\n \n |ig +s|CREATE[ \n]\+TABLE[ \n]\+\(IF[ \n]\+NOT[ \n]\+EXISTS[ \n]\+\)\?`\?\(\w\+\)`\?| \2\n [shape=none, margin=0, label=<\n
\2
\n |ig # remove key definitions -s/[),][\n ]*\(PRIMARY[ \n]\+\)\?KEY[ \n]\+[^(]*([^)]*)//gi +s/[),][\n ]*\(\(UNIQUE\|PRIMARY\)[ \n]\+\)\?KEY[ \n]\+[^(]*([^)]*)//gi # move foreign keys as relation to the end :b;s/\(\w\+\)\([^;]*\)FOREIGN[\n ]\+KEY[ \n]*([ \n]*`\?\([a-z]\+\)`\?[ \n]*)[ \n]*REFERENCES[ \n]*`\?\([a-z]\+\)`\?[ \n]*([ \n]*`\?\([a-z]\+\)`\?[ \n]*)[ \n]*\([^,)]*\)\([,)].*\)/\1\2\7\n \1:\3 -> \4:\5 [label="\6"]##SEMICOLON##/ig;tb # create table rows -s|[(,][ \n]*`\?\(\w\+\)`\?[ \n]\+\(\w\+\(([^)]\+)\)\?\)[ \n]*\([^,)]*\)[ \n]\+COMMENT[ \n]*["']\([^"']*\)["'][ \n]*|\n |gi -s|[(,][ \n]*`\?\(\w\+\)`\?[ \n]\+\(\w\+\(([^)]\+)\)\?\)[ \n]*\([^,)]*\)|\n |g +s|[(,][ \n]*`\?\(\w\+\)`\?[ \n]\+\(\w\+\(([^)]\+)\)\?\)[ \n]*\([^,)]*\)|\n |g +# extract comment +s|\([^<]*\)COMMENT[ \n]\+["']\([^"']*\)["']\([^<]*\)|\1\4|g # add line breaks for long lines s|\(]*>[^<]\{30,40\}\)[ \n]\+\([^<]\{20,\}\)|\1
\2|g 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 <
\2
\1\2\4\5
\1\2\4
\1\2\4
\3