diff --git a/ChangeLog b/ChangeLog index d260a94..907c91d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2015-11-16 12:38 marc + + * doc/doxyfile.in: SVG must not be interactive for embedding in + redmine + +2015-11-09 11:22 marc + + * ChangeLog, ax_init_standard_project.m4, bootstrap.sh, + debian/control.in, resolve-debbuilddeps.sh: fixed build + dependencies + 2015-11-07 10:47 marc * bootstrap.sh: there is no qt4-default diff --git a/ax_init_standard_project.m4 b/ax_init_standard_project.m4 index f475e4f..a7e207d 100644 --- a/ax_init_standard_project.m4 +++ b/ax_init_standard_project.m4 @@ -90,16 +90,19 @@ AC_DEFUN([AX_ADD_MAKEFILE_TARGET_DEP], [ fi ]) -# Same as AC_SUBST, but adds -Dname="value" option to CPPFLAGS +# Same as AC_SUBST, but adds -Dname="value" option to CPPFLAGS and a +# notz only a @name@ replacement, but also a @name_ENCODED@ one to be +# used in code. # - parameters: # $1 = variable name AC_DEFUN([AX_SUBST], [ + [$1]_ENCODED=$(echo "${$1}" | awk 1 ORS='\\n' | sed 's,\\n$,,') + [$1]_ENCODED=${[$1]_ENCODED//\"/\\\"} + [$1]_ENCODED=${[$1]_ENCODED//\'/\'\"\'\"\'} + [$1]_ENCODED=${[$1]_ENCODED//#/\\#} + AM_CPPFLAGS+=" '-D$1=\"${[$1]_ENCODED}\"'" AC_SUBST([$1]) - tmp_var=$(echo "${$1}" | awk 1 ORS='\\n' | sed 's,\\n$,,') - tmp_var=${tmp_var//\"/\\\"} - tmp_var=${tmp_var//\'/\'\"\'\"\'} - tmp_var=${tmp_var//#/\\#} - AM_CPPFLAGS+=" '-D$1=\"${tmp_var}\"'" + AC_SUBST([$1]_ENCODED) AC_SUBST(AM_CPPFLAGS) ]) @@ -167,14 +170,18 @@ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [ AX_SUBST(BUILD_NUMBER) BUILD_DATE=$(LANG= date +"%a, %d %b %Y %H:%M:%S %z") AX_SUBST(BUILD_DATE) - if test -f "${PROJECT_NAME}-logo.png"; then - PROJECT_LOGO="${PROJECT_NAME}-logo.png" + if test -f "${PACKAGE_NAME}.desktop.in"; then + PACKAGE_DESKTOP="${PACKAGE_NAME}.desktop" fi - AX_SUBST(PROJECT_LOGO) - if test -f "${PROJECT_NAME}-icon.png"; then - PROJECT_ICON="${PROJECT_NAME}-icon.png" + AX_SUBST(PACKAGE_DESKTOP) + if test -f "${PACKAGE_NAME}-logo.png"; then + PACKAGE_LOGO="${PACKAGE_NAME}-logo.png" fi - AX_SUBST(PROJECT_ICON) + AX_SUBST(PACKAGE_LOGO) + if test -f "${PACKAGE_NAME}-icon.png"; then + PACKAGE_ICON="${PACKAGE_NAME}-icon.png" + fi + AX_SUBST(PACKAGE_ICON) AC_ARG_ENABLE(pedantic, [AS_HELP_STRING([--enable-pedantic], @@ -203,6 +210,10 @@ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [ else AM_CPPFLAGS="${AM_CPPFLAGS} -DQT_NO_DEBUG_OUTPUT -DQT_NO_DEBUG" fi + + if test -f ${PACKAGE_NAME}.desktop.in; then + AC_CONFIG_FILES([${PACKAGE_NAME}.desktop]) + fi AC_CONFIG_FILES([makefile]) AX_ADD_MAKEFILE_TARGET_DEP([clean-am], [clean-standard-project-targets], [makefile.in]) diff --git a/bootstrap.sh b/bootstrap.sh index 22ceaf9..39e31b7 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -20,7 +20,7 @@ DEFAULT_PROJECT_NAME=${PROJECT_PATH##*/} configure=0 build=0 docker=0 -buildtarget="distcheck" +buildtarget="" overwrite=0 rebuild=0 rebuildfiles=() @@ -28,8 +28,9 @@ while test $# -gt 0; do case "$1" in (--configure|-c) configure=1;; (--docker|-d) docker=1;; - (--build|-b) configure=1; build=1;; - (--target|-t) shift; configure=1; build=1; buildtarget="$1";; + (--build|-b) configure=1; build=1; buildtarget+=" distcheck";; + (--target|-t) shift; configure=1; build=1; buildtarget+=" $1";; + (--clean) shift; configure=1; build=1; buildtarget+=" maintainer-clean";; (--overwrite|-o) overwrite=1;; (--rebuild|-r) rebuild=1;; (--rebuild-file|-f) shift; rebuildfiles+=("$1");; @@ -110,12 +111,15 @@ GENERATED FILES * resolve-rpmbuilddeps.sh - script to install RPM package dependencies * build-in-docker.sh - script to build the project encapsulated in a docker container * 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 + * 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) * 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 @@ -196,7 +200,7 @@ FILES use given docker image instead of ${img}" + echo " -t, --targets targets specify build targets, default: ${targets}" + echo " -r, --repo add given apt repository" + echo " -k, --key add public key from url" + echo " -e, --env = set environment variable in docker" + echo " -d, --dir access given directory read only" + echo " -p, --package install extra debian packages" + echo " -c, --cmd execute commands as root in docker" + echo + echo " The options -r -k -e -d -p -c can be repeated several times." + echo + echo " The options -r -p -c allow an if-then-else contruct" + echo " depending on the operating system:" + echo " ::::::" + echo " :::" + echo " Read as: On linux type use else use " + echo " That means: If the distributer ID or codename in lsb_release" + echo " matches regular expression , then is replaced, else is replaced." + echo " The three colons are for splitting from and part." + echo " E.g.: Install package curl on wheezy and npm on olter systems:" + echo " $0 -p Debian|precise:::curl:::npm" + echo + echo "EXAMPLE:" + echo + echo "$0 -i mwaeckerlin/ubuntu:trusty-i386 \\" + echo " -t deb \\" + 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 " -p mrw-c++" + echo + exit 0 + ;; + (-i|--image) shift; + img="$1" + ;; + (-t|--targets) shift; + targets="$1" + ;; + (-r|--repo) shift; + repos+=("$1") + ;; + (-k|--key) shift; + keys+=("$1") + ;; + (-e|--env) shift; + envs+=("-e $1") + ;; + (-d|--dirs) shift; + dirs+=("-v $1:$1:ro") + ;; + (-p|--package) shift; + packages+=("$1") + ;; + (-c|--cmd) shift; + commands+=("$1") + ;; + (*) + echo "**** ERROR: unknown option '$1', try --help" 1>&2 + exit 1 + ;; + esac + if test $# -eq 0; then + echo "**** ERROR: missing value, try --help" 2>61 + exit 1 + fi + shift +done -DOCKER_ID=$(docker run -d -v $(pwd):/workdir -w /workdir ubuntu sleep infinity) -trap "docker rm -f ${DOCKER_ID}" INT TERM EXIT -docker exec ${DOCKER_ID} apt-get install -y software-properties-common apt-transport-https dpkg-dev -docker exec ${DOCKER_ID} apt-add-repository universe -docker exec ${DOCKER_ID} apt-add-repository https://dev.marc.waeckerlin.org/repository -wget -O- https://dev.marc.waeckerlin.org/repository/PublicKey \ - | docker exec -i ${DOCKER_ID} apt-key add - +function traperror() { + set +x + local DOCKER_ID="$1" + local err=($2) # error status + local line="$3" # LINENO + local linecallfunc="$4" + local command="$5" + local funcstack="$6" + for e in ${err[@]}; do + if test -n "$e" -a "$e" != "0"; then + echo "<---" + echo "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 + echo -n " ... cleanup docker: " + docker rm -f "${DOCKER_ID}" + echo "returning status: $e" + echo "--->" + exit $e + fi + done + echo -n " SUCCESS ... cleanup docker: " + docker rm -f "${DOCKER_ID}" + exit 0 +} + +function ifthenelse() { + arg="$1" + shift + cmd="$*" + if test "${arg/:::/}" = "${arg}"; then + docker exec ${DOCKER_ID} bash -c "${cmd//ARG/${arg}}" + 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="${thenpart##*:::}" + thenpart="${thenpart%:::*}" + 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 + fi + fi +} + +set -x + +docker pull $img +DOCKER_ID=$(docker run -d ${dirs[@]} ${envs[@]} -w /workdir $img sleep infinity) +trap 'traperror '"${DOCKER_ID}"' "$? ${PIPESTATUS[@]}" $LINENO $BASH_LINENO "$BASH_COMMAND" "${FUNCNAME[@]}" "${FUNCTION}"' SIGINT INT TERM EXIT +docker exec ${DOCKER_ID} apt-get update +docker exec ${DOCKER_ID} apt-get upgrade -y +docker exec ${DOCKER_ID} apt-get install -y python-software-properties software-properties-common apt-transport-https dpkg-dev lsb-release || \ + docker exec ${DOCKER_ID} apt-get install -y software-properties-common apt-transport-https dpkg-dev lsb-release || \ + docker exec ${DOCKER_ID} apt-get install -y python-software-properties apt-transport-https dpkg-dev lsb-release; +for repo in "${repos[@]}"; do + ifthenelse "${repo}" "apt-add-repository ARG" +done +for key in "${keys[@]}"; do + wget -O- "$key" \ + | docker exec -i ${DOCKER_ID} apt-key add - +done docker exec ${DOCKER_ID} apt-get update +for package in "${packages[@]}"; do + ifthenelse "${package}" "apt-get install -y --force-yes ARG" +done +for command in "${commands[@]}"; do + ifthenelse "${command}" "ARG" +done docker exec ${DOCKER_ID} ./resolve-debbuilddeps.sh docker exec -u $(id -u) ${DOCKER_ID} svn upgrade || true -docker exec -u $(id -u) ${DOCKER_ID} ./bootstrap.sh -t "all check distcheck" +docker exec -u $(id -u) ${DOCKER_ID} ./bootstrap.sh -t "${targets}" diff --git a/libpcscxx.desktop.in b/libpcscxx.desktop.in new file mode 100644 index 0000000..3f7fcd3 --- /dev/null +++ b/libpcscxx.desktop.in @@ -0,0 +1,9 @@ +[Desktop Entry] +Type=Application +Name=libpcscxx +GenericName=libpcscxx +Comment=@DESCRIPTION@ +Icon=@prefix@/share/@PACKAGE_NAME@/@PACKAGE_ICON@ +Exec=libpcscxx %u +Terminal=false +Categories=Qt;Utility; diff --git a/resolve-debbuilddeps.sh b/resolve-debbuilddeps.sh index 5828d1c..ecd5522 100755 --- a/resolve-debbuilddeps.sh +++ b/resolve-debbuilddeps.sh @@ -16,7 +16,11 @@ if test -n "${SCHROOTNAME}"; then SUDO="schroot -c "${SCHROOTNAME}" -u root -d / --" else DO="" - SUDO="sudo" + if grep -q '/docker/' /proc/1/cgroup; then + SUDO="" + else + SUDO="sudo" + fi fi function install() { @@ -31,7 +35,7 @@ TO_INSTALL= 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} dpkg -l "${f}"; then + 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}" fi done @@ -41,7 +45,7 @@ if test -e debian/control.in -a ! -e debian/control; then fi install dpkg-dev -DEPS=$(${DO} dpkg-checkbuilddeps 2>&1 || true) +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}') for pa in ${DEPS}; do diff --git a/sql-to-dot.sed b/sql-to-dot.sed new file mode 100755 index 0000000..07b2989 --- /dev/null +++ b/sql-to-dot.sed @@ -0,0 +1,81 @@ +#! /bin/sed -nf +1i\ +/** @page database Database Schema\ +\ +@dot\ +digraph schema { + +# get everithing on one single line +H;$!d;$x + +# remove all single-line comment lines +s/\n--[^\n]*//g + +# reduce spaces +s,\t\| \+, ,g + +# remove multiline comments +:f;s,\(.*\)/\*.*\*/[ \n]*;*,\1,g;tf + +# remove empty lines +s,\n\+,\n,g + +# remove unknown commands +s,\(;\|\n\) *\(DELIMITER\|USE\|DROP\|CREATE[ \n]\+DATABASE\)[ \n]\+[^;]*;\+,,ig + +# convert special characters within quotes +:a;s/^\(\([^"]*"[^",]*"\)*[^"]*"[^"]*\),\([^"]*".*\)/\1\##COMMA##\3/g;ta +:c;s/^\(\([^']*'[^',]*'\)*[^']*'[^']*\),\([^']*'.*\)/\1\##COMMA##\3/g;tc + +# backup everything to the buffer +# then analyze only on one create table +:i +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 + +# remove key definitions +s/[),][\n ]*\(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 + +# add line breaks for long lines +s|\(]*>[^<]\{30,40\}\)[ \n]\+\([^<]\{20,\}\)|\1
\2|g +#:d;s|\(
[^<]\{30,40\}\)[ \n]\+\([^<]\{20,\}\)|\1
\2|g;td + +# add table comment below +:k;tk +s|[ \n]*)[^)]*COMMENT[ \n]*=[ \n]*["']\?\([^"']*\)["']\?[^;]*|\n
|ig;th +s|)[^);]*;|\n;|ig +:h + +# cleanup comment below, add line breaksfor long lines +s|\(]*>[^<]\{60,80\}\)[ \n]\+\([^<]\{30,\}\)|\1
\2|g +#:e;s|\(
[^<]\{60,80\}\)[ \n]\+\([^<]\{30,\}\)|\1
\2|g;te + +# close table +s|;|\n
\2
\1\2\4\5
\1\2\4
\1
\n >];|ig + +# convert ##COMMA## to , +s|##COMMA##|,|g +# convert ##SEMICOLON## to ; +s,##SEMICOLON##,;,g + +# print one table +p +# get buffer back and remove the table that has just been analyzed +x +s,\(.*\)create[ \n]\+table[^;]*;\(.*\),\1\2,ig +ti + +$a\ +}\ +@enddot\ +*/