update buildsystem

master
Marc Wäckerlin 8 years ago
parent 6e332be5a9
commit 90e678ad52
  1. 2
      COPYING
  2. 33
      ChangeLog
  3. 2
      INSTALL
  4. 8
      autogen.sh
  5. 174
      ax_init_standard_project.m4
  6. 203
      bootstrap.sh
  7. 4
      build-in-docker.conf
  8. 246
      build-in-docker.sh
  9. 2
      mac-create-app-bundle.sh
  10. 9
      mvfotos.desktop.in
  11. 33
      resolve-debbuilddeps.sh
  12. 17
      resolve-rpmbuilddeps.sh
  13. 81
      sql-to-dot.sed

@ -1 +1 @@
/usr/share/automake-1.14/COPYING /usr/share/automake-1.15/COPYING

@ -0,0 +1,33 @@
2016-04-03 16:18
* bootstrap.sh: after svn-server restore
2015-11-07 10:47 marc
* bootstrap.sh, debian/control.in: there is no qt4-default
2015-11-07 09:23 marc
* bootstrap.sh: there is no qt4-default
2015-11-07 00:20 marc
* debian/control.in: set Section
2015-11-06 23:41 marc
* 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:
initial copy from old project

@ -1 +1 @@
/usr/share/automake-1.14/INSTALL /usr/share/automake-1.15/INSTALL

@ -0,0 +1,8 @@
#!/bin/bash -e
if test -n "svn" -a -d .svn -a -e -x /usr/bin/svn2cl; then
svn2cl
fi
aclocal
automake -a
autoconf

@ -8,43 +8,57 @@ m4_define([mrw_esyscmd_s], [m4_normalize(m4_esyscmd([$1]))])
# define least version number from subversion's revision number: # define least version number from subversion's revision number:
# it is taken modulo 256 due to a bug on Apple's MacOSX # it is taken modulo 256 due to a bug on Apple's MacOSX
m4_define(x_least, m4_ifdef([x_least_diff], mrw_esyscmd_s([ m4_define(x_least, m4_ifdef([x_least_fix], [x_least_fix],
SVN_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-svn-checkout" m4_ifdef([x_least_diff],
for path in . .. ../..; do mrw_esyscmd_s([
if svn info $path 2>&1 > /dev/null; then VCS_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-checkout"
SVN_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p') for path in . .. ../.. ../../..; do
if test -z "${SVN_REVISION}"; then SVN_REVISION=0; fi if test -d .svn; then
break; svn upgrade 1>&2 > /dev/null || true
fi VCS_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p')
done if test -n "${VCS_REVISION}"; then break; fi
echo $ECHO_N $(($SVN_REVISION)) elif test -d .git; then
]), mrw_esyscmd_s([ VCS_REVISION=$(git rev-list --all --count)
SVN_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-svn-checkout" if test -n "${VCS_REVISION}"; then break; fi
for path in . .. ../..; do fi
if svn info $path 2>&1 > /dev/null; then done
SVN_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p') echo $ECHO_N $(($VCS_REVISION))
if test -z "${SVN_REVISION}"; then SVN_REVISION=0; fi ]), mrw_esyscmd_s([
break; VCS_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-checkout"
fi for path in . .. ../.. ../../..; do
done if test -d .svn; then
# Mac does not support LEAST > 255 svn upgrade 1>&2 > /dev/null || true
echo $ECHO_N $(($SVN_REVISION%256)) 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)
if test -n "${VCS_REVISION}"; then break; fi
fi
done
# Mac does not support LEAST > 255
echo $ECHO_N $(($VCS_REVISION%256))
])
)
))
# define version number from subversion's revision number: # define version number from subversion's revision number:
# it is taken modulo 256 due to a bug on Apple's MacOSX # it is taken modulo 256 due to a bug on Apple's MacOSX
# add to x_minor if revision number is > 256 # add to x_minor if revision number is > 256
m4_define(x_minor_diff, mrw_esyscmd_s([ m4_define(x_minor_diff, m4_ifdef([x_least_fix], 0, mrw_esyscmd_s([
SVN_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-svn-checkout" VCS_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-checkout"
for path in . .. ../..; do for path in . .. ../.. ../../..; do
if svn info $path 2>&1 > /dev/null; then if test -d .svn; then
SVN_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p') svn upgrade 1>&2 > /dev/null || true
if test -z "${SVN_REVISION}"; then SVN_REVISION=0; fi VCS_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p')
break; if test -n "${VCS_REVISION}"; then break; fi
elif test -d .git; then
VCS_REVISION=$(git rev-list --all --count)
if test -n "${VCS_REVISION}"; then break; fi
fi; fi;
done done
# Mac does not support LEAST > 255 # Mac does not support LEAST > 255
echo $ECHO_N $(($SVN_REVISION/256)) echo $ECHO_N $(($VCS_REVISION/256))
])) ])))
# setup version number # 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]))]) 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]))])
@ -90,16 +104,19 @@ AC_DEFUN([AX_ADD_MAKEFILE_TARGET_DEP], [
fi 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: # - parameters:
# $1 = variable name # $1 = variable name
AC_DEFUN([AX_SUBST], [ 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]) AC_SUBST([$1])
tmp_var=$(echo "${$1}" | awk 1 ORS='\\n' | sed 's,\\n$,,') AC_SUBST([$1]_ENCODED)
tmp_var=${tmp_var//\"/\\\"}
tmp_var=${tmp_var//\'/\'\"\'\"\'}
tmp_var=${tmp_var//#/\\#}
AM_CPPFLAGS+=" '-D$1=\"${tmp_var}\"'"
AC_SUBST(AM_CPPFLAGS) AC_SUBST(AM_CPPFLAGS)
]) ])
@ -119,6 +136,16 @@ AC_DEFUN([AX_SUBST], [
# #
# configures the basic environment # configures the basic environment
AC_DEFUN([AX_INIT_STANDARD_PROJECT], [ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [
PREFIX=$(test "$prefix" = NONE && prefix=$ac_default_prefix; eval echo "${prefix}")
AX_SUBST(PREFIX)
SYSCONFDIR=$(test "$prefix" = NONE && prefix=$ac_default_prefix; eval echo "${sysconfdir}")
AX_SUBST(SYSCONFDIR)
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}")
AX_SUBST(PKGDATADIR)
LOCALSTATEDIR=$(test "$prefix" = NONE && prefix=$ac_default_prefix; eval echo "${localstatedir}")
AX_SUBST(LOCALSTATEDIR)
AC_MSG_CHECKING([target platfrom]) AC_MSG_CHECKING([target platfrom])
UNIX=1 UNIX=1
MINGW= MINGW=
@ -154,6 +181,8 @@ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [
_AM_SUBST_NOTMAKE([AUTHOR]) _AM_SUBST_NOTMAKE([AUTHOR])
DISTRO=$(lsb_release -sc 2>/dev/null || uname -s 2>/dev/null) DISTRO=$(lsb_release -sc 2>/dev/null || uname -s 2>/dev/null)
AX_SUBST(DISTRO) AX_SUBST(DISTRO)
ARCH=$((@<:@@<:@ $(uname -sm) =~ 64 @:>@@:>@ && echo amd64) || (@<:@@<:@ $(uname -sm) =~ 'i?86' @:>@@:>@ && echo i386 || uname -sm))
AX_SUBST(ARCH)
DISTRIBUTOR=$(lsb_release -si 2>/dev/null || uname -s 2>/dev/null) DISTRIBUTOR=$(lsb_release -si 2>/dev/null || uname -s 2>/dev/null)
case "${DISTRIBUTOR// /-}" in case "${DISTRIBUTOR// /-}" in
(Ubuntu) UBUNTU=1; AX_SUBST(UBUNTU);; (Ubuntu) UBUNTU=1; AX_SUBST(UBUNTU);;
@ -167,14 +196,24 @@ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [
AX_SUBST(BUILD_NUMBER) AX_SUBST(BUILD_NUMBER)
BUILD_DATE=$(LANG= date +"%a, %d %b %Y %H:%M:%S %z") BUILD_DATE=$(LANG= date +"%a, %d %b %Y %H:%M:%S %z")
AX_SUBST(BUILD_DATE) AX_SUBST(BUILD_DATE)
if test -f "${PROJECT_NAME}-logo.png"; then if test -f "${PACKAGE_NAME}.desktop.in"; then
PROJECT_LOGO="${PROJECT_NAME}-logo.png" PACKAGE_DESKTOP="${PACKAGE_NAME}.desktop"
fi
AX_SUBST(PACKAGE_DESKTOP)
if test -f "${PACKAGE_NAME}-logo.png"; then
PACKAGE_LOGO="${PACKAGE_NAME}-logo.png"
fi fi
AX_SUBST(PROJECT_LOGO) AX_SUBST(PACKAGE_LOGO)
if test -f "${PROJECT_NAME}-icon.png"; then if test -f "${PACKAGE_NAME}-icon.svg"; then
PROJECT_ICON="${PROJECT_NAME}-icon.png" PACKAGE_ICON="${PACKAGE_NAME}-icon.svg"
elif test -f "${PACKAGE_NAME}-icon.png"; then
PACKAGE_ICON="${PACKAGE_NAME}-icon.png"
elif test -f "${PACKAGE_NAME}.svg"; then
PACKAGE_ICON="${PACKAGE_NAME}.svg"
elif test -f "${PACKAGE_NAME}.png"; then
PACKAGE_ICON="${PACKAGE_NAME}.png"
fi fi
AX_SUBST(PROJECT_ICON) AX_SUBST(PACKAGE_ICON)
AC_ARG_ENABLE(pedantic, AC_ARG_ENABLE(pedantic,
[AS_HELP_STRING([--enable-pedantic], [AS_HELP_STRING([--enable-pedantic],
@ -204,6 +243,10 @@ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [
AM_CPPFLAGS="${AM_CPPFLAGS} -DQT_NO_DEBUG_OUTPUT -DQT_NO_DEBUG" AM_CPPFLAGS="${AM_CPPFLAGS} -DQT_NO_DEBUG_OUTPUT -DQT_NO_DEBUG"
fi fi
if test -f ${PACKAGE_NAME}.desktop.in; then
AC_CONFIG_FILES([${PACKAGE_NAME}.desktop])
fi
AC_CONFIG_FILES([makefile]) AC_CONFIG_FILES([makefile])
AX_ADD_MAKEFILE_TARGET_DEP([clean-am], [clean-standard-project-targets], [makefile.in]) AX_ADD_MAKEFILE_TARGET_DEP([clean-am], [clean-standard-project-targets], [makefile.in])
AX_ADD_MAKEFILE_TARGET_DEP([distclean-am], [distclean-standard-project-targets], [makefile.in]) AX_ADD_MAKEFILE_TARGET_DEP([distclean-am], [distclean-standard-project-targets], [makefile.in])
@ -268,6 +311,43 @@ maintainer-clean-cxx-targets:
EOF EOF
]) ])
# use this in configure.ac to support old school C
AC_DEFUN([AX_USE_C], [
AC_LANG(C)
AC_PROG_CC
AC_PROG_CPP
AC_CONFIG_FILES([src/makefile])
AM_CPPFLAGS+=' -I ${top_srcdir}/src -I ${top_builddir}/src -I ${srcdir} -I ${builddir}'
AM_LDFLAGS+=' -L ${top_srcdir}/src -L ${top_builddir}/src'
# Get rid of those stupid -g -O2 options!
CXXFLAGS="${CXXFLAGS//-g -O2/}"
CFLAGS="${CFLAGS//-g -O2/}"
# pass compile flags to make distcheck
AM_DISTCHECK_CONFIGURE_FLAGS="CFLAGS='${CFLAGS}' CPPFLAGS='${CPPFLAGS}' CFLAGS='${CFLAGS}' LDFLAGS='${LDFLAGS}'"
AC_SUBST(AM_DISTCHECK_CONFIGURE_FLAGS)
AC_SUBST(AM_CFLAGS)
AC_SUBST(AM_CPPFLAGS)
AC_SUBST(AM_LDFLAGS)
AX_ADD_MAKEFILE_TARGET_DEP([maintainer-clean-am], [maintainer-clean-c-targets], [src/makefile.in])
test -f src/makefile.in && cat >> src/makefile.in <<EOF
#### Begin: Appended by $0
%.app: %
-rm -r [\$][@]
\$(MAKE) DESTDIR=[\$][\$](pwd)/[\$][@]/tmp install
\${top_builddir}/mac-create-app-bundle.sh \
[\$][@] [\$][<] [\$][\$](pwd)/[\$][@]/tmp\${prefix}
maintainer-clean-c-targets:
-rm makefile.in
#### End: $0
EOF
])
# use this in configure.ac to support tests without CppUnit # use this in configure.ac to support tests without CppUnit
AC_DEFUN([AX_BUILD_TEST], [ AC_DEFUN([AX_BUILD_TEST], [
AC_CONFIG_FILES([test/makefile]) AC_CONFIG_FILES([test/makefile])
@ -345,7 +425,7 @@ EOF
# use this in configure.ac to support debian packages # use this in configure.ac to support debian packages
AC_DEFUN([AX_USE_DEBIAN_PACKAGING], [ AC_DEFUN([AX_USE_DEBIAN_PACKAGING], [
README_DEB=$(tail -n +3 README | sed -e 's/^$/./g' -e 's/^/ /g') README_DEB=$(tail -n +3 README | sed -e 's/^ *$/./g' -e 's/^/ /g')
AC_SUBST(README_DEB) AC_SUBST(README_DEB)
_AM_SUBST_NOTMAKE([README_DEB]) _AM_SUBST_NOTMAKE([README_DEB])
AC_CONFIG_FILES([debian/changelog debian/control]) AC_CONFIG_FILES([debian/changelog debian/control])
@ -357,7 +437,7 @@ EXTRA_DIST += debian
clean-debian-targets: clean-debian-targets:
-rm -rf \${PACKAGE_NAME}_\${PACKAGE_VERSION}~\${DISTRO}.\${BUILD_NUMBER}.{dsc,tar.gz} \${PACKAGE_NAME}_\${PACKAGE_VERSION}~\${DISTRO}.\${BUILD_NUMBER}*.changes \$\$(sed -n 's,Package: \(.*\),\1_${PACKAGE_VERSION}~${DISTRO}.${BUILD_NUMBER}*.deb,p;' debian/control) -rm -rf \${PACKAGE_NAME}_\${PACKAGE_VERSION}~\${DISTRO}.\${BUILD_NUMBER}.{dsc,tar.gz} \${PACKAGE_NAME}_\${PACKAGE_VERSION}~\${DISTRO}.\${BUILD_NUMBER}*.changes \$\$(sed -n 's,Package: \(.*\),\1_${PACKAGE_VERSION}~${DISTRO}.${BUILD_NUMBER}*.deb,p;' debian/control)
deb: distdir deb: distdir
cd \${PACKAGE_NAME}-\${PACKAGE_VERSION} && ( export CFLAGS="\${CFLAGS}"; export CPPFLAGS="\${CPPFLAGS}"; export CXXFLAGS="\${CXXFLAGS}"; export LDFLAGS="\${LDFLAGS}"; export DEB_CFLAGS_APPEND="\${CFLAGS}"; export DEB_CPPFLAGS_APPEND="\${CPPFLAGS}"; export DEB_CXXFLAGS_APPEND="\${CXXFLAGS}"; export DEB_LDFLAGS_APPEND="\${LDFLAGS}"; dpkg-buildpackage ) cd \${PACKAGE_NAME}-\${PACKAGE_VERSION} && ( export CFLAGS="\${CFLAGS}"; export CPPFLAGS="\${CPPFLAGS}"; export CXXFLAGS="\${CXXFLAGS}"; export LDFLAGS="\${LDFLAGS}"; export DEB_CFLAGS_APPEND="\${CFLAGS}"; export DEB_CPPFLAGS_APPEND="\${CPPFLAGS}"; export DEB_CXXFLAGS_APPEND="\${CXXFLAGS}"; export DEB_LDFLAGS_APPEND="\${LDFLAGS}"; dpkg-buildpackage )
distclean-debian-targets: distclean-debian-targets:
-rm debian/changelog debian/control -rm debian/changelog debian/control
#### End: $0 #### End: $0
@ -368,12 +448,15 @@ EOF
AC_DEFUN([AX_USE_RPM_PACKAGING], [ AC_DEFUN([AX_USE_RPM_PACKAGING], [
AC_CONFIG_FILES([${PACKAGE_NAME}.spec]) AC_CONFIG_FILES([${PACKAGE_NAME}.spec])
#AX_ADD_MAKEFILE_TARGET_DEP([clean-am], [clean-rpm-targets], [makefile.in]) #AX_ADD_MAKEFILE_TARGET_DEP([clean-am], [clean-rpm-targets], [makefile.in])
AX_ADD_MAKEFILE_TARGET_DEP([clean-am], [clean-rpm-targets], [makefile.in])
AX_ADD_MAKEFILE_TARGET_DEP([distclean-am], [distclean-rpm-targets], [makefile.in]) AX_ADD_MAKEFILE_TARGET_DEP([distclean-am], [distclean-rpm-targets], [makefile.in])
test -f makefile.in && cat >> makefile.in <<EOF test -f makefile.in && cat >> makefile.in <<EOF
#### Begin: Appended by $0 #### Begin: Appended by $0
EXTRA_DIST += \${PACKAGE_NAME}.spec.in EXTRA_DIST += \${PACKAGE_NAME}.spec.in
rpm: dist rpm: dist
rpmbuild -ba --define "_topdir \$\$(pwd)" --define "_sourcedir \$\$(pwd)" \${PACKAGE_NAME}.spec rpmbuild -ba --define "_topdir \$\$(pwd)" --define "_sourcedir \$\$(pwd)" \${PACKAGE_NAME}.spec
clean-rpm-targets:
-rm -rf BUILD BUILDROOT RPMS SPECS SRPMS
distclean-rpm-targets: distclean-rpm-targets:
-rm \${PACKAGE_NAME}.spec -rm \${PACKAGE_NAME}.spec
#### End: $0 #### End: $0
@ -591,6 +674,7 @@ AC_DEFUN([AX_PKG_CHECK], [
# make sure, a specific header exists # make sure, a specific header exists
# - parameter: # - parameter:
# $1 = header name # $1 = header name
# $2 = pathes to search for
AC_DEFUN([AX_REQUIRE_HEADER], [ AC_DEFUN([AX_REQUIRE_HEADER], [
AC_CHECK_HEADER($1, [], [ AC_CHECK_HEADER($1, [], [
if test -n "$2"; then if test -n "$2"; then

@ -20,19 +20,25 @@ DEFAULT_PROJECT_NAME=${PROJECT_PATH##*/}
configure=0 configure=0
build=0 build=0
docker=0 docker=0
buildtarget="distcheck" buildtarget=""
overwrite=0 overwrite=0
rebuild=0 rebuild=0
novcs=0
excludevcs=()
rebuildfiles=() rebuildfiles=()
while test $# -gt 0; do while test $# -gt 0; do
case "$1" in case "$1" in
(--configure|-c) configure=1;; (--configure|-c) configure=1;;
(--docker|-d) docker=1;; (--docker|-d) docker=1;;
(--build|-b) configure=1; build=1;; (--build|-b) configure=1; build=1; buildtarget+=" distcheck";;
(--target|-t) shift; configure=1; build=1; buildtarget="$1";; (--all|-a) shift; configure=1; build=1; buildtarget+=" all";;
(--clean) shift; configure=1; build=1; buildtarget+=" maintainer-clean";;
(--target|-t) shift; configure=1; build=1; buildtarget+=" $1";;
(--overwrite|-o) overwrite=1;; (--overwrite|-o) overwrite=1;;
(--rebuild|-r) rebuild=1;; (--rebuild|-r) rebuild=1;;
(--rebuild-file|-f) shift; rebuildfiles+=("$1");; (--rebuild-file|-f) shift; rebuildfiles+=("$1");;
(--no-vcs|-n) novcs=1;;
(--exclude-vcs|-x) shift; excludevcs+=("$1");;
(--version|-v) (--version|-v)
echo "$Id$"; echo "$Id$";
exit;; exit;;
@ -46,10 +52,14 @@ OPTIONS
--configure, -c call ./configure after initialization --configure, -c call ./configure after initialization
--docker, -d build and run tests in a docker instance --docker, -d build and run tests in a docker instance
--build, -b build, also call ./configure && make distcheck --build, -b build, also call ./configure && make distcheck
--all, -a same as -b, but make target all
--clean same as -b, but make target maintainer-clean
--target, -t <target> same as -b, but specify target instead of distcheck --target, -t <target> same as -b, but specify target instead of distcheck
--overwrite, -o overwrite all basic files (bootstrap.sh, m4-macros) --overwrite, -o overwrite all basic files (bootstrap.sh, m4-macros)
--rebuild, -r force rebuild of generated files, even if modified --rebuild, -r force rebuild of generated files, even if modified
--rebuild-file, -f <file> rebild specific file (can be added multiple times) --rebuild-file, -f <file> rebild specific file (can be added multiple times)
--no-vcs, -n do not automatically add files to version control
--exclude-vcs, -x <file> exclude specific file from version control
--help, -h show this help --help, -h show this help
--version, -v show version and date of this file --version, -v show version and date of this file
@ -60,7 +70,7 @@ DESCRIPTION
configure.ac. Automatically copies or creates all required template configure.ac. Automatically copies or creates all required template
files. files.
From your new and empty project's subversion path, call $0 to From your new and empty project's subversion or git path, call $0 to
initialize your build environment. initialize your build environment.
Before you call ${MY_NAME} the very first time, edit ${0#/*}/AUTHORS Before you call ${MY_NAME} the very first time, edit ${0#/*}/AUTHORS
@ -79,16 +89,27 @@ DESCRIPTION
https://dev.marc.waeckerlin.org/, and the path from where you call https://dev.marc.waeckerlin.org/, and the path from where you call
${MY_NAME} (which is actually ${PROJECT_PATH}) should be the path to ${MY_NAME} (which is actually ${PROJECT_PATH}) should be the path to
your newly created project. Please note that your project must be a your newly created project. Please note that your project must be a
checked out subversion repository, since this build environment checked out subversion or git repository, since this build
relies on subversion. environment relies on subversion or git.
Example for an initial run, where your new projet is stored in Example for an initial run, where your new projet is stored in
subversion on svn:/path/to/your/new-project: subversion on https:/path/to/your/new-project:
cd ~/svn cd ~/svn
svn co https://dev.marc.waeckerlin.org/svn/bootstrap-build-environment/trunk \\ svn co https://dev.marc.waeckerlin.org/svn/bootstrap-build-environment/trunk \\
bootstrap-build-environment bootstrap-build-environment
svn co svn:/path/to/your/new-project/trunk new-project svn co https:/path/to/your/new-project/trunk new-project
cd new-project
../bootstrap-build-environment/bootstrap.sh
Example for an initial run, where your new projet is stored in
git on https:/path/to/your/new-project:
cd ~/svn
svn co https://dev.marc.waeckerlin.org/svn/bootstrap-build-environment/trunk \\
bootstrap-build-environment
cd ~/git
git clone https:/path/to/your/new-project
cd new-project cd new-project
../bootstrap-build-environment/bootstrap.sh ../bootstrap-build-environment/bootstrap.sh
@ -97,25 +118,31 @@ RUNNING
If you run ${MY_NAME}, it first generates the necessary files (see If you run ${MY_NAME}, it first generates the necessary files (see
below), then first runs make distclean if a makefile exists. After below), then first runs make distclean if a makefile exists. After
this it calles aclocal, libtoolize, automake, autoconf and this it calles aclocal, libtoolize, automake, autoconf and
optionally ./configure. optionally ./configure. If necessary, files are added to version
control.
GENERATED FILES GENERATED FILES
This script copies the following files into your project environment: This script copies the following files into your project environment:
* ${MY_NAME} * ${MY_NAME}
* autogen.sh - just the basics to initialize auto tools and create configure
* ax_init_standard_project.m4 - auxiliary macro definition file * ax_init_standard_project.m4 - auxiliary macro definition file
* ax_cxx_compile_stdcxx_11.m4 - auxiliary macro definition file * ax_cxx_compile_stdcxx_11.m4 - auxiliary macro definition file
* ax_check_qt.m4 - auxiliary macro definition file * ax_check_qt.m4 - auxiliary macro definition file
* resolve-debbuilddeps.sh - script to install debian package dependencies * resolve-debbuilddeps.sh - script to install debian package dependencies
* resolve-rpmbuilddeps.sh - script to install RPM 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.sh - script to build the project encapsulated in a docker container
* build-in-docker.conf - additional configuration for build-in-docker.sh
* build-resource-file.sh - build resource.qrc file from a resource directory * 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 * 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 * AUTHORS - replace your name in AUTHORS before first run
* NEWS - empty file add your project's news * NEWS - empty file add your project's news
* README - add project description (first line is header, followed by an empty line) * README - add project description (first line is header, followed by an empty line)
* configure.ac - global configuration file template * configure.ac - global configuration file template
* makefile.am - global makefile template * makefile.am - global makefile template
* ${DEFAULT_PROJECT_NAME}.desktop.in - linux desktop file
* src/makefile.am - if you enabled AX_USE_CXX * src/makefile.am - if you enabled AX_USE_CXX
* src/version.hxx - if you enabled AX_USE_CXX * src/version.hxx - if you enabled AX_USE_CXX
* src/version.cxx - if you enabled AX_USE_CXX * src/version.cxx - if you enabled AX_USE_CXX
@ -197,13 +224,14 @@ FILES
${DEFAULT_PROJECT_NAME}::description(). ${DEFAULT_PROJECT_NAME}::description().
* ChangeLog: Your changelog is automatically maintained from * ChangeLog: Your changelog is automatically maintained from
subversion history, using svn2cl. You don't need to subversion history, using svn2cl. You don't need to
care about. care about. It uses git2cl on git repositories.
* configure.ac: This file becomes very short and simple. You provide * configure.ac: This file becomes very short and simple. You provide
the project name, the major and minor version. The the project name, the major and minor version. The
least version number is automatically taken from least version number is automatically taken from
subversion's revision, so every checkin subversion's revision, so every checkin
automatically increments the least version automatically increments the least version
number. The following macros are supported: number. In git, git rev-list --all --count is used.
The following macros are supported in configure.ac:
* Enable C++: AX_USE_CXX * Enable C++: AX_USE_CXX
* Enable LibTool library creation: AX_USE_LIBTOOL * Enable LibTool library creation: AX_USE_LIBTOOL
* Enable Scripts: AX_USE_SCRIPTS * Enable Scripts: AX_USE_SCRIPTS
@ -243,6 +271,20 @@ EOF
shift; shift;
done 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"
fi
HEADER='## @id '"\$Id\$"' HEADER='## @id '"\$Id\$"'
## ##
@ -266,6 +308,7 @@ CHEADER='/** @id '"\$Id\$"'
// 1 2 3 4 5 6 7 8 // 1 2 3 4 5 6 7 8
// 45678901234567890123456789012345678901234567890123456789012345678901234567890 // 45678901234567890123456789012345678901234567890123456789012345678901234567890
' '
notice() { notice() {
@ -314,26 +357,32 @@ contains() {
checkdir() { checkdir() {
if ! test -d "$1"; then # create path if ! test -d "$1"; then # create path
run mkdir -p "$1" run mkdir -p "$1"
run svn add "$1" if test -n "${VCS}" -a $novcs -eq 0 && ! contains "$1" "${excludevcs[@]}"; then
run ${VCS} add "$1"
fi
fi fi
} }
checkfile() { checkfile() {
exists=0 exists=0
if test -f "$1"; then if test -f "$1" -o -f "$1".in; then
exists=1 exists=1
fi fi
test $exists -eq 1 test $exists -eq 1
} }
to() { to() {
mode="u=rw,g=rw,o=r"
while test $# -gt 0; do while test $# -gt 0; do
mode="u=rw,g=rw,o=r"
case "$1" in case "$1" in
(--condition) shift # test for a tag, abort if not set (--condition) shift # test for a tag, abort if not set
if ! testtag "$1"; then if ! testtag "$1"; then
return 0 return 0
fi;; fi;;
(--unless) shift # test for a tag, abort if set
if testtag "$1"; then
return 0
fi;;
(--mode) shift # test for a tag, abort if not set (--mode) shift # test for a tag, abort if not set
mode="$1";; mode="$1";;
(*) break;; (*) break;;
@ -359,10 +408,14 @@ to() {
else else
echo -e " \e[32msuccess\e[0m" echo -e " \e[32msuccess\e[0m"
fi fi
chmod $mode $1 run chmod $mode $1
if test $exists -eq 0; then if test $exists -eq 0; then
run svn add "$1" if test -n "${VCS}" -a $novcs -eq 0 && ! contains "$1" "${excludevcs[@]}"; then
run svn propset svn:keywords "Id" "$1" run ${VCS} add "$1"
if test "${VCS}" = "svn"; then
run svn propset svn:keywords "Id" "$1"
fi
fi
fi fi
return 0 return 0
} }
@ -382,8 +435,12 @@ copy() {
fi fi
run cp "${source}" "$1" run cp "${source}" "$1"
if test $exists -eq 0; then if test $exists -eq 0; then
run svn add "$1" if test -n "${VCS}" -a $novcs -eq 0 && ! contains "$1" "${excludevcs[@]}"; then
run svn propset svn:keywords "Id" "$1" run ${VCS} add "$1"
if test "${VCS}" = "svn"; then
run svn propset svn:keywords "Id" "$1"
fi
fi
fi fi
} }
@ -409,10 +466,33 @@ doxyadd() {
fi fi
} }
vcs2cl() {
exists=0
if test -f "ChangeLog"; then
exists=1
else
touch "ChangeLog"
fi
if test -x $(which ${VCS}2cl); then
if test "${VCS}" = "git"; then
${VCS}2cl > ChangeLog
elif test -n "${VCS}"; then
${VCS}2cl
fi
fi
if test $exists -eq 0; then
if test -n "${VCS}" -a $novcs -eq 0 && ! contains "ChangeLog" "${excludevcs[@]}"; then
run ${VCS} add ChangeLog
fi
fi
}
# Check if we are in subversion root, if so, create trunk, branches, tags: # Check if we are in subversion root, if so, create trunk, branches, tags:
if test "$(LANG= svn info | sed -n 's,Relative URL: *,,p')" = "^/"; then if test "${VCS}" = "svn" -a $novcs -eq 0; then
svn mkdir trunk branches tags if test "$(LANG= svn info | sed -n 's,Relative URL: *,,p')" = "^/"; then
cd trunk svn mkdir trunk branches tags
cd trunk
fi
fi fi
# Initialize the environment: # Initialize the environment:
@ -424,6 +504,7 @@ copy resolve-debbuilddeps.sh
copy resolve-rpmbuilddeps.sh copy resolve-rpmbuilddeps.sh
copy build-in-docker.sh copy build-in-docker.sh
copy build-resource-file.sh copy build-resource-file.sh
copy sql-to-dot.sed
copy mac-create-app-bundle.sh copy mac-create-app-bundle.sh
AUTHOR=$(gpg -K | sed -n 's,uid *,,p' | sort | head -1) AUTHOR=$(gpg -K | sed -n 's,uid *,,p' | sort | head -1)
if test -z "${AUTHOR}"; then if test -z "${AUTHOR}"; then
@ -703,10 +784,10 @@ namespace NAMESPACE {
return README; return README;
} }
std::string logo() { std::string logo() {
return PROJECT_LOGO; return PACKAGE_LOGO;
} }
std::string icon() { std::string icon() {
return PROJECT_ICON; return PACKAGE_ICON;
} }
const std::string WHAT("#(@) " PACKAGE_STRING); const std::string WHAT("#(@) " PACKAGE_STRING);
const std::string IDENT("\$Id: " PACKAGE_STRING); const std::string IDENT("\$Id: " PACKAGE_STRING);
@ -718,6 +799,9 @@ ${HEADER}dist_bin_SCRIPTS =
MAINTAINERCLEANFILES = makefile.in MAINTAINERCLEANFILES = makefile.in
EOF EOF
echo "${HEADER}MAINTAINERCLEANFILES = makefile.in" | to --condition AX_USE_DOXYGEN doc/makefile.am echo "${HEADER}MAINTAINERCLEANFILES = makefile.in" | to --condition AX_USE_DOXYGEN doc/makefile.am
if testtag AX_BUILD_TEST; then
to test/runtests.sh < ${0%/*}/test/runtests.sh
fi
to --condition 'AX_BUILD_TEST|AX_USE_CPPUNIT' test/makefile.am <<EOF to --condition 'AX_BUILD_TEST|AX_USE_CPPUNIT' test/makefile.am <<EOF
${HEADER}$(if testtag AX_USE_CXX; then ${HEADER}$(if testtag AX_USE_CXX; then
cat <<EOF2 cat <<EOF2
@ -755,13 +839,17 @@ if testtag AX_USE_DOXYGEN; then
contains doc/doxyfile.in "${rebuildfiles[@]}"; then contains doc/doxyfile.in "${rebuildfiles[@]}"; then
run doxygen -g doc/doxyfile.in run doxygen -g doc/doxyfile.in
if test $exists -eq 0; then if test $exists -eq 0; then
run svn add doc/doxyfile.in if test -n "${VCS}" -a $novcs -eq 0 && ! contains "doc/doxyfile" "${excludevcs[@]}"; then
run svn propset svn:keywords "Id" doc/doxyfile.in run ${VCS} add doc/doxyfile.in
if test "${VCS}" = "svn"; then
run svn propset svn:keywords "Id" doc/doxyfile.in
fi
fi
fi fi
doxyreplace PROJECT_NAME "@PACKAGE_NAME@" doxyreplace PROJECT_NAME "@PACKAGE_NAME@"
doxyreplace PROJECT_NUMBER "@PACKAGE_VERSION@" doxyreplace PROJECT_NUMBER "@PACKAGE_VERSION@"
doxyreplace PROJECT_BRIEF "@DESCRIPTION@" doxyreplace PROJECT_BRIEF "@DESCRIPTION@"
doxyreplace PROJECT_LOGO "@PROJECT_LOGO@" doxyreplace PROJECT_LOGO "@top_srcdir@/@PACKAGE_LOGO@"
doxyreplace INLINE_INHERITED_MEMB YES doxyreplace INLINE_INHERITED_MEMB YES
doxyreplace MULTILINE_CPP_IS_BRIEF YES doxyreplace MULTILINE_CPP_IS_BRIEF YES
doxyreplace TAB_SIZE 2 doxyreplace TAB_SIZE 2
@ -771,6 +859,7 @@ if testtag AX_USE_DOXYGEN; then
doxyadd ALIASES '"classmutex=\\par Reentrant:\\nAccess is locked with class static mutex @c "' 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 '"instancemutex=\\par Reentrant:\\nAccess is locked with per instance mutex @c "'
doxyadd ALIASES '"mutex=\\par Reentrant:\\nAccess is locked with mutex @c "' doxyadd ALIASES '"mutex=\\par Reentrant:\\nAccess is locked with mutex @c "'
doxyadd ALIASES '"api=\\xrefitem api \\"API Call\\" \\"\\""'
doxyreplace ENABLE_PREPROCESSING YES doxyreplace ENABLE_PREPROCESSING YES
doxyreplace MACRO_EXPANSION YES doxyreplace MACRO_EXPANSION YES
doxyadd PREDEFINED '"NAMESPACE=@PACKAGE_NAME@"' doxyadd PREDEFINED '"NAMESPACE=@PACKAGE_NAME@"'
@ -797,14 +886,14 @@ if testtag AX_USE_DOXYGEN; then
if testtag AX_BUILD_TEST AX_USE_CPPUNIT; then if testtag AX_BUILD_TEST AX_USE_CPPUNIT; then
doxyadd INPUT "@top_srcdir@/test" doxyadd INPUT "@top_srcdir@/test"
fi 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' 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 RECURSIVE YES
doxyreplace EXCLUDE_PATTERNS "moc_* uic_* qrc_*" doxyreplace EXCLUDE_PATTERNS "moc_* uic_* qrc_*"
if testtag AX_BUILD_EXAMPLES; then if testtag AX_BUILD_EXAMPLES; then
doxyreplace EXAMPLE_PATH @top_srcdir@/examples doxyreplace EXAMPLE_PATH @top_srcdir@/examples
fi fi
doxyreplace EXAMPLE_RECURSIVE YES doxyreplace EXAMPLE_RECURSIVE YES
doxyreplace FILTER_PATTERNS '*.wt=doxygen-webtester.sed' doxyreplace FILTER_PATTERNS '*.wt=doxygen-webtester.sed *.sql=@top_srcdir@/sql-to-dot.sed'
doxyreplace SOURCE_BROWSER YES doxyreplace SOURCE_BROWSER YES
doxyreplace INLINE_SOURCES YES doxyreplace INLINE_SOURCES YES
doxyreplace GENERATE_TESTLIST YES doxyreplace GENERATE_TESTLIST YES
@ -822,7 +911,7 @@ if testtag AX_USE_DOXYGEN; then
doxyreplace CLASS_GRAPH YES doxyreplace CLASS_GRAPH YES
doxyreplace TEMPLATE_RELATIONS YES doxyreplace TEMPLATE_RELATIONS YES
doxyreplace DOT_IMAGE_FORMAT svg doxyreplace DOT_IMAGE_FORMAT svg
doxyreplace INTERACTIVE_SVG YES doxyreplace INTERACTIVE_SVG NO
doxyreplace DOT_TRANSPARENT YES doxyreplace DOT_TRANSPARENT YES
fi fi
fi fi
@ -835,7 +924,7 @@ if testtag AX_USE_DEBIAN_PACKAGING; then
-- @AUTHOR@ @BUILD_DATE@ -- @AUTHOR@ @BUILD_DATE@
EOF EOF
BUILD_DEPENDS="debhelper, subversion, pkg-config, automake, libtool, autotools-dev, lsb-release $(if testtag AX_USE_DOXYGEN; then echo -n ", doxygen, graphviz, mscgen"; fi; if testtag AX_USE_CPPUNIT; then echo -n ", libcppunit-dev"; fi; if testtag AX_CXX_QT || testtag AX_CHECK_QT AX_REQUIRE_QT; then echo -n ", qt5-default | libqt4-core | qt5-qmake | qt4-qmake, qtbase5-dev | libqt4-dev, qtbase5-dev-tools | qt4-dev-tools, qttools5-dev-tools | qt4-dev-tools, qttools5-dev-tools | qt4-dev-tools"; fi)" BUILD_DEPENDS="debhelper, ${VCSDEPENDS} pkg-config, automake, libtool, autotools-dev, lsb-release $(if testtag AX_USE_DOXYGEN; then echo -n ", doxygen, graphviz, mscgen"; fi; if testtag AX_USE_CPPUNIT; then echo -n ", libcppunit-dev"; fi; if testtag AX_CXX_QT || testtag AX_CHECK_QT AX_REQUIRE_QT; then echo -n ", qt5-default | libqt4-core | libqtcore4, qt5-qmake | qt4-qmake, qtbase5-dev | libqt4-dev, qtbase5-dev-tools | qt4-dev-tools, qttools5-dev-tools | qt4-dev-tools, qttools5-dev-tools | qt4-dev-tools"; fi)"
to debian/control.in <<EOF to debian/control.in <<EOF
Source: @PACKAGE_NAME@ Source: @PACKAGE_NAME@
Priority: extra Priority: extra
@ -882,6 +971,17 @@ ${HEADER}%:
EOF EOF
echo 7 | to debian/compat echo 7 | to debian/compat
fi fi
to ${PACKAGE_NAME}.desktop.in <<EOF
[Desktop Entry]
Type=Application
Name=${PACKAGE_NAME}
GenericName=${PACKAGE_NAME}
Comment=@DESCRIPTION@
Icon=@prefix@/share/@PACKAGE_NAME@/@PACKAGE_ICON@
Exec=${PACKAGE_NAME} %u
Terminal=false
Categories=Qt;Utility;
EOF
to --condition AX_USE_RPM_PACKAGING ${PACKAGE_NAME}.spec.in <<EOF to --condition AX_USE_RPM_PACKAGING ${PACKAGE_NAME}.spec.in <<EOF
Summary: @DESCRIPTION@ Summary: @DESCRIPTION@
Name: @PACKAGE_NAME@ Name: @PACKAGE_NAME@
@ -895,7 +995,7 @@ else
fi) fi)
Source0: %{name}-%{version}.tar.gz Source0: %{name}-%{version}.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
BuildRequires: gnupg, subversion, automake, autoconf$( BuildRequires: gnupg, ${VCSDEPENDS} make, automake, autoconf, rpm-build$(
if testtag AX_USE_DOXYGEN; then if testtag AX_USE_DOXYGEN; then
echo -n ", doxygen"; echo -n ", doxygen";
fi) fi)
@ -955,6 +1055,7 @@ $(if testtag AX_USE_LIBTOOL; then
echo '/usr/%_lib/@PACKAGE_NAME@.so.*' echo '/usr/%_lib/@PACKAGE_NAME@.so.*'
else else
echo '/usr/bin/*' echo '/usr/bin/*'
echo '/usr/share/applications/*'
fi) fi)
%doc %doc
$(if testtag AX_USE_LIBTOOL; then $(if testtag AX_USE_LIBTOOL; then
@ -1022,10 +1123,32 @@ for d in src test scripts doc examples html; do
SUBDIRS="${SUBDIRS} $d" SUBDIRS="${SUBDIRS} $d"
fi fi
done done
to --mode "u=rwx,g=rwx,o=rx" autogen.sh <<EOF
#!/bin/bash -e
if test -n "$VCS" -a -d .$VCS -a -e -x $(which ${VCS}2cl); then
$(case "$VCS" in
(svn) echo " ${VCS}2cl";;
(git) echo " ${VCS}2cl > ChangeLog";;
esac)
fi
aclocal
$(if testtag AX_USE_LIBTOOL; then echo libtoolize --force; fi)
automake -a
autoconf
EOF
to makefile.am<<EOF to makefile.am<<EOF
${HEADER}SUBDIRS =${SUBDIRS} ${HEADER}SUBDIRS =${SUBDIRS}
doc_DATA = AUTHORS NEWS README COPYING INSTALL ChangeLog desktopdir = \${datadir}/applications
desktop_DATA = @PACKAGE_DESKTOP@
dist_pkgdata_DATA = @PACKAGE_ICON@ 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 \\
sql-to-dot.sed
dist_doc_DATA = AUTHORS NEWS README COPYING INSTALL ChangeLog
MAINTAINERCLEANFILES = makefile.in MAINTAINERCLEANFILES = makefile.in
EOF EOF
@ -1043,6 +1166,12 @@ Libs: -L\${libdir} -l${PACKAGE_NAME#lib} @LDFLAGS@
Cflags: -I\${includedir} @CPPFLAGS@ Cflags: -I\${includedir} @CPPFLAGS@
Requires: @PKG_REQUIREMENTS@ Requires: @PKG_REQUIREMENTS@
EOF EOF
to build-in-docker.conf <<EOF
repos+=("Debian|Ubuntu-precise::::::universe")
repos+=("Ubuntu-precise:::'deb http://archive.ubuntu.com/ubuntu precise universe'")
envs+=("-e 'HOME=\${HOME}'")
dirs+=("-v \${HOME}/.gnupg:\${HOME}/.gnupg:ro")
EOF
#### Cleanup If Makefile Exists #### #### Cleanup If Makefile Exists ####
if test -f makefile; then if test -f makefile; then
@ -1050,7 +1179,7 @@ if test -f makefile; then
fi fi
#### Bootstrap Before Configure #### #### Bootstrap Before Configure ####
run --no-check svn2cl run --no-check vcs2cl
run aclocal run aclocal
if testtag AX_USE_LIBTOOL; then run libtoolize --force; fi if testtag AX_USE_LIBTOOL; then run libtoolize --force; fi
run automake -a run automake -a
@ -1058,15 +1187,15 @@ run autoconf
#### Run Configure If User Requires #### #### Run Configure If User Requires ####
if test "$configure" -eq 1; then if test "$configure" -eq 1; then
./configure $* ./configure $* || exit 1
fi fi
#### Run Make If User Requires #### #### Run Make If User Requires ####
if test "$build" -eq 1; then if test "$build" -eq 1; then
make $buildtarget make $buildtarget || exit 1
fi fi
#### Build In Docker If User Requires #### #### Build In Docker If User Requires ####
if test "$docker" -eq 1; then if test "$docker" -eq 1; then
./build-in-docker.sh ./build-in-docker.sh || exit 1
fi fi

@ -0,0 +1,4 @@
repos+=("Debian|Ubuntu-precise::::::universe")
repos+=("Ubuntu-precise:::'deb http://archive.ubuntu.com/ubuntu precise universe'")
envs+=("-e 'HOME=${HOME}'")
dirs+=("-v ${HOME}/.gnupg:${HOME}/.gnupg:ro")

@ -1,15 +1,237 @@
#! /bin/bash -ex #! /bin/bash -e
set -o errtrace
# build and test everything in a fresh docker installation # build and test everything in a fresh docker installation
mode="apt"
img="ubuntu:latest"
repos=()
keys=()
envs=()
dirs=("-v $(pwd):/workdir")
packages=()
targets="all check distcheck"
commands=()
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)
echo "$0 [OPTIONS]"
echo
echo "OPTIONS:"
echo
echo " -h, --help show this help"
echo " -m, --mode <type> mode: apt or yum, default: ${mode}"
echo " -i, --image <image> use given docker image instead of ${img}"
echo " -t, --targets targets specify build targets, default: ${targets}"
echo " -r, --repo <url> add given apt repository"
echo " -k, --key <url> add public key from url"
echo " -e, --env <var>=<val> set environment variable in docker"
echo " -d, --dir <dir> access given directory read only"
echo " -p, --package <pkg> install extra debian packages"
echo " -c, --cmd <command> execute commands as root in docker"
echo " -w, --wait on error keep docker container and wait for enter"
echo
echo " The option -i must be after -m, because mode sets a new default image"
echo
echo " The options -r -k -e -d -p -c can be repeated several times."
echo
echo " The options -r -p -c allow an if-then-else contruct"
echo " depending on the operating system:"
echo " <os>:::<A>:::<B>"
echo " <os>:::<A>"
echo " Read as: On linux type <os> use <A> else use <B>"
echo " That means: If the distributer ID or codename in lsb_release"
echo " matches regular expression <os>, then <A> is replaced, else <B> is replaced."
echo " The three colons are for splitting <os> from <A> and <B> 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
;;
(-m|--mode) shift;
mode="$1"
case "$mode" in
(apt) img="ubuntu:latest";;
(yum) img="centos:latest";;
(*)
echo "**** ERROR: unknown mode '$1', try --help" 1>&2
exit 1
;;
esac
;;
(-i|--image) shift;
img="$1"
;;
(-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")
;;
(-w|--wait)
wait=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) function traperror() {
trap "docker rm -f ${DOCKER_ID}" INT TERM EXIT set +x
docker exec ${DOCKER_ID} apt-get install -y software-properties-common apt-transport-https dpkg-dev local DOCKER_ID="$1"
docker exec ${DOCKER_ID} apt-add-repository universe local err=($2) # error status
docker exec ${DOCKER_ID} apt-add-repository https://dev.marc.waeckerlin.org/repository local line="$3" # LINENO
wget -O- https://dev.marc.waeckerlin.org/repository/PublicKey \ local linecallfunc="$4"
| docker exec -i ${DOCKER_ID} apt-key add - local command="$5"
docker exec ${DOCKER_ID} apt-get update local funcstack="$6"
docker exec ${DOCKER_ID} ./resolve-debbuilddeps.sh for e in ${err[@]}; do
docker exec -u $(id -u) ${DOCKER_ID} svn upgrade || true if test -n "$e" -a "$e" != "0"; then
docker exec -u $(id -u) ${DOCKER_ID} ./bootstrap.sh -t "all check distcheck" 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
if [ "$wait" -eq 1 ]; then
echo " ... now you can access the docker container:"
echo " docker exec -u $(id -u) -it ${DOCKER_ID} bash"
echo -n " ... press enter to cleanup: "
read
fi
echo -n " ... cleanup docker: "
docker rm -f "${DOCKER_ID}"
echo "returning status: $e"
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: "
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[@]} -e HOME="${HOME}" -w /workdir $img sleep infinity)
trap 'traperror '"${DOCKER_ID}"' "$? ${PIPESTATUS[@]}" $LINENO $BASH_LINENO "$BASH_COMMAND" "${FUNCNAME[@]}" "${FUNCTION}"' SIGINT INT TERM EXIT
case $mode in
(apt)
OPTIONS='-o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confnew -y --force-yes --no-install-suggests --no-install-recommends'
for f in 'libpam-systemd:amd64' 'policykit*' 'colord'; do
docker exec ${DOCKER_ID} bash -c "echo 'Package: $f' >> /etc/apt/preferences"
docker exec ${DOCKER_ID} bash -c "echo 'Pin-Priority: -100' >> /etc/apt/preferences"
docker exec ${DOCKER_ID} bash -c "echo >> /etc/apt/preferences"
done
docker exec ${DOCKER_ID} apt-get update ${OPTIONS}
docker exec ${DOCKER_ID} apt-get upgrade ${OPTIONS}
docker exec ${DOCKER_ID} apt-get install ${OPTIONS} python-software-properties software-properties-common apt-transport-https dpkg-dev lsb-release || \
docker exec ${DOCKER_ID} apt-get install ${OPTIONS} software-properties-common apt-transport-https dpkg-dev lsb-release || \
docker exec ${DOCKER_ID} apt-get install ${OPTIONS} python-software-properties apt-transport-https dpkg-dev lsb-release;
for repo in "${repos[@]}"; do
ifthenelse "${repo}" "apt-add-repository ARG"
done
for key in "${keys[@]}"; do
wget -O- "$key" \
| docker exec -i ${DOCKER_ID} apt-key add -
done
docker exec ${DOCKER_ID} apt-get update ${OPTIONS}
for package in "${packages[@]}"; do
ifthenelse "${package}" "apt-get install ${OPTIONS} ARG"
done
for command in "${commands[@]}"; do
ifthenelse "${command}" "ARG"
done
docker exec ${DOCKER_ID} ./resolve-debbuilddeps.sh
;;
(yum)
./bootstrap.sh -t dist
if [[ "$img" =~ "centos" ]]; then
docker exec ${DOCKER_ID} yum install -y redhat-lsb
docker exec -i ${DOCKER_ID} bash -c 'cat > /etc/yum.repos.d/wandisco-svn.repo' <<EOF
[WandiscoSVN]
name=Wandisco SVN Repo
EOF
docker exec -i ${DOCKER_ID} bash -c 'echo "baseurl=http://opensource.wandisco.com/centos/$(lsb_release -sr | sed '"'"'s,[^0-9].*,,'"'"')/svn-'$(svn --version | head -1 | sed 's,[^0-9]*\([0-9]\+\.[0-9]\+\).*,\1,')'/RPMS/$(uname -i)/" >> /etc/yum.repos.d/wandisco-svn.repo'
docker exec -i ${DOCKER_ID} bash -c 'cat >> /etc/yum.repos.d/wandisco-svn.repo' <<EOF
enabled=1
gpgcheck=0
EOF
fi
docker exec ${DOCKER_ID} yum install -y rpm-build
docker exec ${DOCKER_ID} groupadd -g $(id -g) build
docker exec ${DOCKER_ID} useradd -g $(id -g) -u $(id -u) build
docker exec ${DOCKER_ID} ./resolve-rpmbuilddeps.sh || true
;;
esac
docker exec -u $(id -u):$(id -g) ${DOCKER_ID} ./bootstrap.sh -t "${targets}"

@ -75,7 +75,7 @@ cd ${oldpath}
# Step 4: if necessary, install qt_menu.nib # Step 4: if necessary, install qt_menu.nib
if test -n "${QTDIR}"; then if test -n "${QTDIR}"; then
MENU_NIB=$(find ${QTDIR} -name .svn -prune -o -name qt_menu.nib -print \ MENU_NIB=$(find ${QTDIR} -name .svn -o -name .git -prune -o -name qt_menu.nib -print \
| head -1) | head -1)
if test -e "${MENU_NIB}"; then if test -e "${MENU_NIB}"; then
rsync -r "${MENU_NIB}" ${1}/Contents/Resources/ rsync -r "${MENU_NIB}" ${1}/Contents/Resources/

@ -0,0 +1,9 @@
[Desktop Entry]
Type=Application
Name=mvfotos
GenericName=mvfotos
Comment=@DESCRIPTION@
Icon=@prefix@/share/@PACKAGE_NAME@/@PACKAGE_ICON@
Exec=mvfotos %u
Terminal=false
Categories=Qt;Utility;

@ -11,25 +11,31 @@
## 45678901234567890123456789012345678901234567890123456789012345678901234567890 ## 45678901234567890123456789012345678901234567890123456789012345678901234567890
SCHROOTNAME="$1" SCHROOTNAME="$1"
if test -n "${SCHROOTNAME}"; then
DO="schroot -c "${SCHROOTNAME}" --"
SUDO="schroot -c "${SCHROOTNAME}" -u root -d / --"
else
DO=""
if grep -q '/docker/' /proc/1/cgroup; then
SUDO=""
else
SUDO="sudo"
fi
fi
function install() { function install() {
if test -n "${SCHROOTNAME}"; then if ${SUDO} apt-get -y install $*; then
if schroot -c "${SCHROOTNAME}" -u root -d / -- apt-get -y install $*; then return 0
return 0
fi
else else
if apt-get -y install $*; then return 1
return 0
fi
fi fi
return 1
} }
TO_INSTALL= TO_INSTALL=
if test -e debian/control.in -a ! -e debian/control; then 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 for f in $(sed -n 's, *AX_DEB_DEPEND_IFEXISTS(\([^)]*\)).*,\1,p' configure.ac); do
if test -n "$(apt-cache policy -q ${f})" && ! 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}" TO_INSTALL+=" ${f}"
fi fi
done done
@ -38,13 +44,8 @@ if test -e debian/control.in -a ! -e debian/control; then
sed 's,@[^@]*@, dummytext,g' > debian/control sed 's,@[^@]*@, dummytext,g' > debian/control
fi fi
if test -n "${SCHROOTNAME}"; then install dpkg-dev
schroot -c "${SCHROOTNAME}" -u root -d / -- apt-get -y install dpkg-dev DEPS=$(LANG= ${DO} dpkg-checkbuilddeps 2>&1 || true)
DEPS=$(schroot -c "${SCHROOTNAME}" -- dpkg-checkbuilddeps 2>&1 || true)
else
apt-get -y install dpkg-dev
DEPS=$(dpkg-checkbuilddeps 2>&1 || true)
fi
DEPS=$(echo "$DEPS" | sed -n '/Unmet build dependencies/ { s,.*Unmet build dependencies: ,,g; s, ([^)]*),,g; s, *| *,|,g; p}') DEPS=$(echo "$DEPS" | sed -n '/Unmet build dependencies/ { s,.*Unmet build dependencies: ,,g; s, ([^)]*),,g; s, *| *,|,g; p}')
for pa in ${DEPS}; do for pa in ${DEPS}; do

@ -12,19 +12,30 @@
SCHROOTNAME="$1" SCHROOTNAME="$1"
PACKAGE_NAME=$(sed -n 's/^ *m4_define(x_package_name, \(.*\)).*/\1/p' configure.ac) PACKAGE_NAME=$(sed -n 's/^ *m4_define(x_package_name, \(.*\)).*/\1/p' configure.ac)
PKGCONFIGS="${2:-epel-release}" # packages to configure yum
if test -n "${SCHROOTNAME}"; then if test -n "${SCHROOTNAME}"; then
schroot -c ${SCHROOTNAME} -- ./bootstrap.sh -t dist
FILES=$(LANG= schroot -c ${SCHROOTNAME} -- rpmbuild -bb --clean --nobuild --define "_topdir ." --define "_sourcedir ." ${PACKAGE_NAME}.spec 2>&1 | sed -n 's, is needed by.*,,p') 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 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 -- yum install -y ${FILES} || \
schroot -c ${SCHROOTNAME} -u root -- zypper install -y ${FILES} || \ schroot -c ${SCHROOTNAME} -u root -- zypper install -y ${FILES} || \
schroot -c ${SCHROOTNAME} -u root -- dnf install -y ${FILES} schroot -c ${SCHROOTNAME} -u root -- dnf install -y ${FILES}
fi fi
else else
./bootstrap.sh -t dist
FILES=$(LANG= rpmbuild -bb --clean --nobuild --define "_topdir ." --define "_sourcedir ." ${PACKAGE_NAME}.spec 2>&1 | sed -n 's, is needed by.*,,p') 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 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} || \ yum install -y ${FILES} || \
zypper install -y ${FILES} || \ zypper install -y ${FILES} || \
dnf install -y ${FILES} dnf install -y ${FILES}

@ -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 <table bgcolor="#dddddd">\n <tr><td bgcolor="#ddddff" colspan="4"><b>\2</b></td></tr>|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 <tr><td align="left" port="\1"><b>\1</b></td><td align="left">\2</td><td align="left">\4</td><td align="left">\5</td></tr>|gi
s|[(,][ \n]*`\?\(\w\+\)`\?[ \n]\+\(\w\+\(([^)]\+)\)\?\)[ \n]*\([^,)]*\)|\n <tr><td align="left" port="\1"><b>\1</b></td><td align="left">\2</td><td align="left">\4</td></tr>|g
# add line breaks for long lines
s|\(<td[^>]*>[^<]\{30,40\}\)[ \n]\+\([^<]\{20,\}</td>\)|\1<br/>\2|g
#:d;s|\(<br/>[^<]\{30,40\}\)[ \n]\+\([^<]\{20,\}</td>\)|\1<br/>\2|g;td
# add table comment below
:k;tk
s|[ \n]*)[^)]*COMMENT[ \n]*=[ \n]*["']\?\([^"']*\)["']\?[^;]*|\n <tr><td bgcolor="#ddddff" colspan="4">\1</td></tr>|ig;th
s|)[^);]*;|\n;|ig
:h
# cleanup comment below, add line breaksfor long lines
s|\(<td[^>]*>[^<]\{60,80\}\)[ \n]\+\([^<]\{30,\}</td>\)|\1<br/>\2|g
#:e;s|\(<br/>[^<]\{60,80\}\)[ \n]\+\([^<]\{30,\}</td>\)|\1<br/>\2|g;te
# close table
s|;|\n </table>\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\
*/
Loading…
Cancel
Save