Browse Source

initial copy from old project

master
Marc Wäckerlin 6 years ago
commit
ec320a53cd
  1. 1
      AUTHORS
  2. 1
      NEWS
  3. 16
      README
  4. 256
      ax_check_qt.m4
  5. 133
      ax_cxx_compile_stdcxx_11.m4
  6. 718
      ax_init_standard_project.m4
  7. 60
      backup-generic.spec.in
  8. 1072
      bootstrap.sh
  9. 15
      build-in-docker.sh
  10. 31
      build-resource-file.sh
  11. 37
      configure.ac
  12. 5
      debian/changelog.in
  13. 1
      debian/compat
  14. 12
      debian/control.in
  15. 2
      debian/docs
  16. 12
      debian/rules
  17. 2310
      doc/doxyfile.in
  18. 11
      doc/makefile.am
  19. 103
      mac-create-app-bundle.sh
  20. 15
      makefile.am
  21. 74
      resolve-debbuilddeps.sh
  22. 34
      resolve-rpmbuilddeps.sh
  23. 272
      scripts/backup-generic.in
  24. 485
      scripts/backup-generic.texi
  25. 27
      scripts/backup.conf
  26. 1
      scripts/check_backup.cfg.in
  27. 63
      scripts/check_backup.in
  28. 36
      scripts/escalate-backup.in
  29. BIN
      scripts/icinga-monitoring.png
  30. 30
      scripts/makefile.am
  31. 28
      scripts/setup-backup.in
  32. 2
      scripts/variables.texi.in

1
AUTHORS

@ -0,0 +1 @@
Marc Wäckerlin (http://marc.waeckerlin.org) <marc@waeckerlin.org>

1
NEWS

@ -0,0 +1 @@
Don Nov 5 18:42:34 CET 2015 created backup-generic

16
README

@ -0,0 +1,16 @@
Differential backup scripts using rsync and hardlinks.
This is a toolset to setup and run a backup server that pulls
differential daily, weekly and monthly backups from any number of
hosts and stores them on the local harddrive. For this, it uses rsync
and its mechanism to hardlink against already existing files, so only
new and changed files are copied over the network. This saves harddisk
space and network bandwidth, but you still have a full file system
hierarchy tree the same way it is represented on the host that has
been backuped. That makes it easy to restore. The only disadvantage of
this method is, that hardlinks on the host are not preserved (but
softlinks and anything else are).
For monitoring your backups, you can provide an email address to get
notification in case of error and there is an Icinga (Nagios) pluging
provided.

256
ax_check_qt.m4

@ -0,0 +1,256 @@
# SYNOPSIS
#
# Check if a module exists:
# AX_CHECK_QT([qt_prefix], [list-of-qt-modules], [optional-modules] [flags])
#
# Abort if a module does not exist:
# AX_REQUIRE_QT([qt_prefix], [list-of-qt-modules], [optional-modules] [flags])
#
# DESCRIPTIONS
#
# qt_prefix
#
# Each call to AX_CHECK_QT should have a different prefix
# value (with a few exceptions discussed later on). This value,
# usually provided in uppercase, is used as prefix to the
# variables holding the compiler flags and libraries reported by
# pkg-config.
#
# For instance, if your prefix was to be FOO you'll be provided
# two variables FOO_CFLAGS and FOO_LIBS.
#
# This will also be used as message during the configure checks:
# checking for FOO....
#
# list-of-modules
#
# A single call to the macro can check for the presence of one or
# more qt modules; you'll see later how to make good use of this
# feature. Each entry in the list can have a version comparison
# specifier, with the same syntax as the Requires keyword in the
# data files themselves.
#
# optional-modules
#
# Optional list of more, optional modules, e.g. modules that
# exist only in Qt5, but not in Qt4, such as QtWidgets or
# QtWebKitWidgets
#
# flags
#
# Optional flages, space separated from this list:
#
# manualflags
#
# CXXFLAGS, CPPFLAGS and LIBS variables are not
# automatically expanded, but you need to add the
# qt_prefix_CXXFLAGS, qt_prefix_CPPFLAGS and qt_prefix_LIBS
# variables manually where you need them. This is useful,
# if some build targets need a feature and some don't.
AC_DEFUN([AX_CXX_QT_TOOL], [
PKG_PROG_PKG_CONFIG
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
$1=$2-qt5
elif which "$2" > /dev/null; then
$1=$2
elif which "$2-qt4" > /dev/null; then
$1=$2-qt4
else
HAVE_$1=0
$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])
else
AC_MSG_RESULT([not found])
fi
fi
])
AC_DEFUN([AX_CXX_QT_TOOLS], [
AX_CXX_QT_TOOL(QMAKE, qmake)
AX_CXX_QT_TOOL(MOC, moc)
AX_CXX_QT_TOOL(UIC, uic)
AX_CXX_QT_TOOL(RCC, rcc)
AX_CXX_QT_TOOL(LUPDATE, lupdate)
AX_CXX_QT_TOOL(LRELEASE, lrelease)
])
AC_DEFUN([AX_CHECK_QT], [
qt_modules="$2"
qt_modules_optional="$3"
qt_flags="$4"
AX_CXX_QT_TOOLS
HAVE_$1=0
PKG_PROG_PKG_CONFIG
PKG_CHECK_MODULES([$1]5, [${qt_modules//Qt/Qt5}], [
HAVE_$1=1
AC_DEFINE([HAVE_$1])
QTDIR=$(${PKG_CONFIG} --variable=prefix Qt5Core)
qt_host_bins=$(${PKG_CONFIG} --variable=host_bins Qt5Core)
if test -d "${qt_host_bins}"; then
QT_PLUGIN_PATH=${qt_host_bins}/../plugins
else
QT_PLUGIN_PATH=${QTDIR}/share/qt5/plugins
fi
MOC_FLAGS+=" -DHAVE_$1=1 ${[$1]5_CFLAGS}"
[$1]_CPPFLAGS="${[$1]5_CFLAGS}"
[$1]_CXXFLAGS="${[$1]5_CFLAGS}"
[$1]_LIBS="${[$1]5_LIBS}"
AC_SUBST([$1]_CPPFLAGS)
AC_SUBST([$1]_CXXFLAGS)
if test "${qt_flags/manualflags/}" = "${qt_flags}"; then
CPPFLAGS+=" ${[$1]_CPPFLAGS}"
CXXFLAGS+=" ${[$1]_CXXFLAGS}"
LIBS+=" ${[$1]_LIBS}"
AC_MSG_NOTICE([Adding flags for $1])
else
AC_MSG_NOTICE([To enable $1, add $1_CPPFLAGS, $1_CXXFLAGS and $1_LIBS])
fi
PKG_REQUIREMENTS+=" ${qt_modules//Qt/Qt5}"
if test -n "${qt_modules_optional}"; then
PKG_CHECK_MODULES([$1]5_OPTIONAL, [${qt_modules_optional//Qt/Qt5}], [
MOC_FLAGS+=" ${[$1]5_OPTIONAL_CFLAGS}"
[$1]_CPPFLAGS+=" ${[$1]5_OPTIONAL_CFLAGS}"
[$1]_CXXFLAGS+=" ${[$1]5_OPTIONAL_CFLAGS}"
[$1]_LIBS+=" ${[$1]5_OPTIONAL_LIBS}"
AC_SUBST([$1]_CPPFLAGS)
AC_SUBST([$1]_CXXFLAGS)
if test "${qt_flags/manualflags/}" = "${qt_flags}"; then
CPPFLAGS+=" ${[$1]5_OPTIONAL_CFLAGS}"
CXXFLAGS+=" ${[$1]5_OPTIONAL_CFLAGS}"
LIBS+=" ${[$1]5_OPTIONAL_LIBS}"
AC_MSG_NOTICE([Adding flags for $1])
else
AC_MSG_NOTICE([To enable $1, add $1_CPPFLAGS, $1_CXXFLAGS and $1_LIBS])
fi
PKG_REQUIREMENTS+=" ${qt_modules_optional//Qt/Qt5}"
], [
AC_MSG_NOTICE([Not found: ${qt_modules_optional//Qt/Qt5}])
])
fi
], [
PKG_CHECK_MODULES([$1], [${qt_modules}], [
HAVE_$1=1
AC_DEFINE([HAVE_$1])
QTDIR=$(${PKG_CONFIG} --variable=prefix QtCore)
qt_host_bins=$(${PKG_CONFIG} --variable=host_bins QtCore)
if test -d "${qt_host_bins}"; then
QT_PLUGIN_PATH=${qt_host_bins}/../plugins
else
QT_PLUGIN_PATH=${QTDIR}/share/qt/plugins
fi
MOC_FLAGS+=" -DHAVE_$1=1 ${$1_CFLAGS}"
[$1]_CPPFLAGS="${[$1]_CFLAGS}"
[$1]_CXXFLAGS="${[$1]_CFLAGS}"
AC_SUBST([$1]_CPPFLAGS)
AC_SUBST([$1]_CXXFLAGS)
if test "${qt_flags/manualflags/}" = "${qt_flags}"; then
CPPFLAGS+=" ${[$1]_CPPFLAGS}"
CXXFLAGS+=" ${[$1]_CXXFLAGS}"
LIBS+=" ${[$1]_LIBS}"
AC_MSG_NOTICE([Adding flags for $1])
else
AC_MSG_NOTICE([To enable $1, add $1_CPPFLAGS, $1_CXXFLAGS and $1_LIBS])
fi
PKG_REQUIREMENTS+=" ${qt_modules}"
if test -n "$3"; then
PKG_CHECK_MODULES($1_OPTIONAL, [${qt_modules_optional}], [
MOC_FLAGS+="${$1_OPTIONAL_CFLAGS}"
[$1]_CPPFLAGS+=" ${$1_OPTIONAL_CFLAGS}"
[$1]_CXXFLAGS+=" ${$1_OPTIONAL_CFLAGS}"
[$1]_LIBS+=" ${$1_OPTIONAL_LIBS}"
AC_SUBST([$1]_CPPFLAGS)
AC_SUBST([$1]_CXXFLAGS)
if test "${qt_flags/manualflags/}" = "${qt_flags}"; then
CPPFLAGS+=" ${$1_OPTIONAL_CFLAGS}"
CXXFLAGS+=" ${$1_OPTIONAL_CFLAGS}"
LIBS+=" ${$1_OPTIONAL_LIBS}"
AC_MSG_NOTICE([Adding flags for $1])
else
AC_MSG_NOTICE([To enable $1, add $1_CPPFLAGS, $1_CXXFLAGS and $1_LIBS])
fi
PKG_REQUIREMENTS+=" ${qt_modules_optional}"
], [
AC_MSG_NOTICE([Not found: ${qt_modules_optional}])
])
fi
], [HAVE_$1=0])
])
AM_CONDITIONAL(HAVE_$1, test $HAVE_[$1] -eq 1)
AX_CHECK_VALID_CXX_FLAG([-fPIC -fPIE], [position independent code flag])
if test -n "${MINGW}"; then
AX_CHECK_VALID_CXX_FLAG([-Wl,-subsystem,windows], [windows console flag])
fi
test "x$prefix" = xNONE && prefix=$ac_default_prefix
if test "${QT_PLUGIN_PATH}" = "${QT_PLUGIN_PATH#${prefix}}"; then
QT_PLUGIN_PATH=${prefix}${QT_PLUGIN_PATH#/usr}
fi
AC_ARG_WITH([qt-plugin-path],
[AS_HELP_STRING([--with-qt-plugin-path=PATH],
[define a different qt plugin path, current @<:@default=check@:>@])],
[QT_PLUGIN_PATH=$with_qt_plugin_path],
[])
AC_MSG_NOTICE([Qt Plugins are installed to ${QT_PLUGIN_PATH}])
AC_SUBST(QTDIR)
AC_SUBST(QT_PLUGIN_PATH)
AC_SUBST(CPPFLAGS)
AC_SUBST(MOC_FLAGS)
AC_SUBST(CXXFLAGS)
AC_SUBST(PKG_REQUIREMENTS)
AX_ADDITIONAL_QT_RULES_HACK='
LANGUAGE_FILE_BASE ?= translations
ui_%.hxx: %.ui
$(UIC) -o [$][@] $<
moc_%.cxx: %.hxx
$(MOC) $(MOC_FLAGS) -o [$][@] $<
qrc_%.cxx: %.qrc
$(RCC) -o [$][@] -name ${<:%.qrc=%} $<
AC_SUBST(AX_ADDITIONAL_QT_RULES_HACK)
#%.qrc: %
# cwd=$$(pwd) && cd $< && $(RCC) -project -o $${cwd}/[$][@]
%.qm: %.ts
${LRELEASE} $< -qm [$][@]
%.ts: ${LANGUAGE_FILES:%=%}
${LUPDATE} -no-obsolete \
-target-language ${@:${LANGUAGE_FILE_BASE}_%.ts=%} \
-ts [$][@] $<
'])
AC_DEFUN([AX_REQUIRE_QT], [
AX_CHECK_QT([$1], [$2], [$3], [$4])
if ! test "$HAVE_$1" -eq 1; then
AC_MSG_ERROR([Required Qt modules not found: $2])
fi
])
# Omit Qt Keywords
# AX_QT_NO_KEYWORDS
AC_DEFUN([AX_QT_NO_KEYWORDS], [
CPPFLAGS+=" -DQT_NO_KEYWORDS"
])

133
ax_cxx_compile_stdcxx_11.m4

@ -0,0 +1,133 @@
# ============================================================================
# http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_11.html
# ============================================================================
#
# SYNOPSIS
#
# AX_CXX_COMPILE_STDCXX_11([ext|noext],[mandatory|optional])
#
# DESCRIPTION
#
# Check for baseline language coverage in the compiler for the C++11
# standard; if necessary, add switches to CXXFLAGS to enable support.
#
# The first argument, if specified, indicates whether you insist on an
# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g.
# -std=c++11). If neither is specified, you get whatever works, with
# preference for an extended mode.
#
# The second argument, if specified 'mandatory' or if left unspecified,
# indicates that baseline C++11 support is required and that the macro
# should error out if no mode with that support is found. If specified
# 'optional', then configuration proceeds regardless, after defining
# HAVE_CXX11 if and only if a supporting mode is found.
#
# LICENSE
#
# Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com>
# Copyright (c) 2012 Zack Weinberg <zackw@panix.com>
# Copyright (c) 2013 Roy Stogner <roystgnr@ices.utexas.edu>
#
# Copying and distribution of this file, with or without modification, are
# permitted in any medium without royalty provided the copyright notice
# and this notice are preserved. This file is offered as-is, without any
# warranty.
#serial 3
m4_define([_AX_CXX_COMPILE_STDCXX_11_testbody], [
template <typename T>
struct check
{
static_assert(sizeof(int) <= sizeof(T), "not big enough");
};
typedef check<check<bool>> right_angle_brackets;
int a;
decltype(a) b;
typedef check<int> check_type;
check_type c;
check_type&& cr = static_cast<check_type&&>(c);
auto d = a;
])
AC_DEFUN([AX_CXX_COMPILE_STDCXX_11], [dnl
m4_if([$1], [], [],
[$1], [ext], [],
[$1], [noext], [],
[m4_fatal([invalid argument `$1' to AX_CXX_COMPILE_STDCXX_11])])dnl
m4_if([$2], [], [ax_cxx_compile_cxx11_required=true],
[$2], [mandatory], [ax_cxx_compile_cxx11_required=true],
[$2], [optional], [ax_cxx_compile_cxx11_required=false],
[m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX_11])])dnl
AC_LANG_PUSH([C++])dnl
ac_success=no
AC_CACHE_CHECK(whether $CXX supports C++11 features by default,
ax_cv_cxx_compile_cxx11,
[AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
[ax_cv_cxx_compile_cxx11=yes],
[ax_cv_cxx_compile_cxx11=no])])
if test x$ax_cv_cxx_compile_cxx11 = xyes; then
ac_success=yes
fi
m4_if([$1], [noext], [], [dnl
if test x$ac_success = xno; then
for switch in -std=gnu++11 -std=gnu++0x; do
cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch])
AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch,
$cachevar,
[ac_save_CXXFLAGS="$CXXFLAGS"
CXXFLAGS="$CXXFLAGS $switch"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
[eval $cachevar=yes],
[eval $cachevar=no])
CXXFLAGS="$ac_save_CXXFLAGS"])
if eval test x\$$cachevar = xyes; then
CXXFLAGS="$CXXFLAGS $switch"
ac_success=yes
break
fi
done
fi])
m4_if([$1], [ext], [], [dnl
if test x$ac_success = xno; then
for switch in -std=c++11 -std=c++0x; do
cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch])
AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch,
$cachevar,
[ac_save_CXXFLAGS="$CXXFLAGS"
CXXFLAGS="$CXXFLAGS $switch"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
[eval $cachevar=yes],
[eval $cachevar=no])
CXXFLAGS="$ac_save_CXXFLAGS"])
if eval test x\$$cachevar = xyes; then
CXXFLAGS="$CXXFLAGS $switch"
ac_success=yes
break
fi
done
fi])
AC_LANG_POP([C++])
if test x$ax_cxx_compile_cxx11_required = xtrue; then
if test x$ac_success = xno; then
AC_MSG_ERROR([*** A compiler with support for C++11 language features is required.])
fi
else
if test x$ac_success = xno; then
HAVE_CXX11=0
AC_MSG_NOTICE([No compiler with C++11 support was found])
else
HAVE_CXX11=1
AC_DEFINE(HAVE_CXX11,1,
[define if the compiler supports basic C++11 syntax])
fi
AC_SUBST(HAVE_CXX11)
fi
])

718
ax_init_standard_project.m4

@ -0,0 +1,718 @@
## @id $Id$
## 1 2 3 4 5 6 7 8
## 45678901234567890123456789012345678901234567890123456789012345678901234567890
# m4_esyscmd_s does not exist on centos 5 and 6
m4_define([mrw_esyscmd_s], [m4_normalize(m4_esyscmd([$1]))])
# define least version number from subversion's revision number:
# 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([
SVN_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-svn-checkout"
for path in . .. ../..; do
if svn info $path 2>&1 > /dev/null; then
SVN_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p')
if test -z "${SVN_REVISION}"; then SVN_REVISION=0; fi
break;
fi
done
echo $ECHO_N $(($SVN_REVISION))
]), mrw_esyscmd_s([
SVN_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-svn-checkout"
for path in . .. ../..; do
if svn info $path 2>&1 > /dev/null; then
SVN_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p')
if test -z "${SVN_REVISION}"; then SVN_REVISION=0; fi
break;
fi
done
# Mac does not support LEAST > 255
echo $ECHO_N $(($SVN_REVISION%256))
])))
# define version number from subversion's revision number:
# it is taken modulo 256 due to a bug on Apple's MacOSX
# add to x_minor if revision number is > 256
m4_define(x_minor_diff, mrw_esyscmd_s([
SVN_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-svn-checkout"
for path in . .. ../..; do
if svn info $path 2>&1 > /dev/null; then
SVN_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p')
if test -z "${SVN_REVISION}"; then SVN_REVISION=0; fi
break;
fi;
done
# Mac does not support LEAST > 255
echo $ECHO_N $(($SVN_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]))])
## bugreport mail address is taken from <user@host> in first line of AUTHORS
m4_define(x_bugreport, mrw_esyscmd_s([
head -1 AUTHORS | \
sed -n 's,.*<\([-_.a-z0-9A-Z]*@[-_.a-z0-9A-Z]*\)>.*,\1,gp'
]))
m4_include(ax_check_qt.m4)
AC_ALIAS([AC_DEFINE_DIR], [AX_DEFINE_DIR])
AC_DEFUN([AX_DEFINE_DIR], [
prefix_NONE=
exec_prefix_NONE=
test "x$prefix" = xNONE && prefix_NONE=yes && prefix=$ac_default_prefix
test "x$exec_prefix" = xNONE && exec_prefix_NONE=yes && exec_prefix=$prefix
dnl In Autoconf 2.60, ${datadir} refers to ${datarootdir}, which in turn
dnl refers to ${prefix}. Thus we have to use `eval' twice.
eval ax_define_dir="\"[$]$2\""
eval ax_define_dir="\"$ax_define_dir\""
AC_SUBST($1, "$ax_define_dir")
AC_DEFINE_UNQUOTED($1, "$ax_define_dir", [$3])
test "$prefix_NONE" && prefix=NONE
test "$exec_prefix_NONE" && exec_prefix=NONE
])
# add target dependencies to an existing makefile.in
# - parameters:
# $1 = existing target
# $2 = new dependency for that target
# $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}"
if ! egrep -q "${1}:.* ${2}" "${srcdir}/${3}"; then
echo "${1}: ${2}" >> "${srcdir}/${3}"
fi
}
sh_add_makefile_target_dep "$1" "$2" "$3"
if test "$1" != ".PHONY"; then
sh_add_makefile_target_dep ".PHONY" "$2" "$3"
fi
])
# Same as AC_SUBST, but adds -Dname="value" option to CPPFLAGS
# - parameters:
# $1 = variable name
AC_DEFUN([AX_SUBST], [
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(AM_CPPFLAGS)
])
# must be called on the right position in configure.ac
#
# configure.ac must start with:
#
# m4_define(x_package_name, YOUR_PACKAGE_NAME) # project's name
# m4_define(x_major, MAJOR_NUMBER) # project's major version
# 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])
# AX_INIT_STANDARD_PROJECT
#
# you change nothing but: YOUR_PACKAGE_NAME, MAJOR_NUMBER, MINOR_NUMBER
#
# configures the basic environment
AC_DEFUN([AX_INIT_STANDARD_PROJECT], [
AC_MSG_CHECKING([target platfrom])
UNIX=1
MINGW=
MACOSX=
for h in ${target} ${target_os} ${host} ${host_os} \
${build} ${build_os} $(uname -s 2> /dev/null); do
p="$h is generic Unix"
case "$h" in
(*mingw*)
UNIX=; MINGW=1; p="MinGW"; break;;
(*Darwin*|*darwin*|*rhapsody*|*macosx*)
UNIX=; MACOSX=1; p="MacOSX"; break;;
esac
done
AC_MSG_RESULT($p)
AM_CONDITIONAL(UNIX, test "$UNIX" = "1")
AM_CONDITIONAL(MINGW, test "$MINGW" = "1")
AM_CONDITIONAL(MACOSX, test "$MACOSX" = "1")
AX_SUBST(UNIX)
AX_SUBST(MINGW)
AX_SUBST(MACOSX)
AM_CPPFLAGS+=" '-DMAKE_STRING(X)=\#X' '-DNAMESPACE=${PACKAGE_TARNAME//[^a-zA-Z0-9]/_}'"
AX_SUBST(NUMBERS)
AX_SUBST(HOME)
README=$(tail -n +3 README)
AX_SUBST(README)
_AM_SUBST_NOTMAKE([README])
DESCRIPTION=$(head -1 README)
AX_SUBST(DESCRIPTION)
_AM_SUBST_NOTMAKE([DESCRIPTION])
AUTHOR=$(head -1 AUTHORS)
AX_SUBST(AUTHOR)
_AM_SUBST_NOTMAKE([AUTHOR])
DISTRO=$(lsb_release -sc 2>/dev/null || uname -s 2>/dev/null)
AX_SUBST(DISTRO)
DISTRIBUTOR=$(lsb_release -si 2>/dev/null || uname -s 2>/dev/null)
case "${DISTRIBUTOR// /-}" in
(Ubuntu) UBUNTU=1; AX_SUBST(UBUNTU);;
(Debian) DEBIAN=1; AX_SUBST(DEBIAN);;
(SUSE-LINUX) SUSE=1; AX_SUBST(SUSE);;
(Fedora) FEDORA=1; AX_SUBST(FEDORA);;
(Centos) CENTOS=1; AX_SUBST(CENTOS);;
esac
AX_SUBST(DISTRIBUTOR)
BUILD_NUMBER=${BUILD_NUMBER:-1}
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"
fi
AX_SUBST(PROJECT_LOGO)
if test -f "${PROJECT_NAME}-icon.png"; then
PROJECT_ICON="${PROJECT_NAME}-icon.png"
fi
AX_SUBST(PROJECT_ICON)
AC_ARG_ENABLE(pedantic,
[AS_HELP_STRING([--enable-pedantic],
[enable all warnings and checks, abort on warnings])],
[have_pedantic="$enableval"; test "$enableval" = "yes" && \
AM_CXXFLAGS="${AM_CXXFLAGS:-} -pedantic-errors -Wall -W -Wfloat-equal -Wundef -Wendif-labels -Wpointer-arith -Wcast-align -Wwrite-strings -Wconversion -Wsign-compare -Wmissing-format-attribute -Wno-multichar -Wpacked -Wredundant-decls -Werror -Wshadow -Wcast-qual -Wno-ctor-dtor-privacy"])
dnl problem in libs: -Wshadow -Wcast-qual
dnl auto.hpp: -Wno-ctor-dtor-privacy (removed)
AM_CONDITIONAL(PEDANTIC, test "$enableval" = "yes")
if test "$have_pedantic" == "yes"; then
AC_MSG_NOTICE([Pedantic compile mode enabled!
- all warnings for GNU g++ are enabled
- all warnings result in an error
- doxygen warnings are treated as error too]); fi
AC_ARG_ENABLE(debug,
[AS_HELP_STRING([--enable-debug],
[compile for debugger])],
[have_debug="$enableval"], [have_debug="no"])
AM_CONDITIONAL(DEBUG, test "$enableval" = "yes")
if test "$have_debug" == "yes"; then
AC_MSG_NOTICE([Debug compile mode enabled]);
AM_CPPFLAGS="${AM_CPPFLAGS} -DDEBUG"
AM_CXXFLAGS="${AM_CXXFLAGS:-} -ggdb3 -O0"
AM_LDFLAGS="${AM_LDFLAGS} -ggdb3 -O0"
else
AM_CPPFLAGS="${AM_CPPFLAGS} -DQT_NO_DEBUG_OUTPUT -DQT_NO_DEBUG"
fi
AC_CONFIG_FILES([makefile])
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([maintainer-clean-am], [maintainer-clean-standard-project-targets], [makefile.in])
test -f makefile.in && cat >> makefile.in <<EOF
#### Begin: Appended by $0
EXTRA_DIST += bootstrap.sh ax_init_standard_project.m4 ax_cxx_compile_stdcxx_11.m4 \
ax_check_qt.m4 resolve-debbuilddeps.sh resolve-rpmbuilddeps.sh \
build-resource-file.sh mac-create-app-bundle.sh
clean-standard-project-targets:
-rm -rf \${PACKAGE_NAME}-\${PACKAGE_VERSION}
-rm \${PACKAGE_TARNAME}-\${PACKAGE_VERSION}.tar.gz
distclean-standard-project-targets:
-rm -r autom4te.cache
-rm aclocal.m4 config.guess config.sub configure depcomp compile install-sh ltmain.sh makefile missing mkinstalldirs test-driver
maintainer-clean-standard-project-targets:
-rm makefile.in
#### End: $0
EOF
])
# use this in configure.ac to support C++
AC_DEFUN([AX_USE_CXX], [
m4_include(ax_cxx_compile_stdcxx_11.m4)
AC_LANG(C++)
AX_CXX_COMPILE_STDCXX_11(noext, optional)
AC_PROG_CXX
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="CXXFLAGS='${CXXFLAGS}' CPPFLAGS='${CPPFLAGS}' CFLAGS='${CFLAGS}' LDFLAGS='${LDFLAGS}'"
AC_SUBST(AM_DISTCHECK_CONFIGURE_FLAGS)
AC_SUBST(AM_CXXFLAGS)
AC_SUBST(AM_CPPFLAGS)
AC_SUBST(AM_LDFLAGS)
AX_ADD_MAKEFILE_TARGET_DEP([maintainer-clean-am], [maintainer-clean-cxx-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
QTDIR="\${QTDIR}" \
QT_PLUGINS="\${QT_PLUGINS}" \
QT_PLUGIN_PATH="\${QT_PLUGIN_PATH}" \
\${top_builddir}/mac-create-app-bundle.sh \
[\$][@] [\$][<] [\$][\$](pwd)/[\$][@]/tmp\${prefix}
maintainer-clean-cxx-targets:
-rm makefile.in
#### End: $0
EOF
])
# use this in configure.ac to support tests without CppUnit
AC_DEFUN([AX_BUILD_TEST], [
AC_CONFIG_FILES([test/makefile])
AX_ADD_MAKEFILE_TARGET_DEP([maintainer-clean-am], [maintainer-clean-test-targets], [test/makefile.in])
test -f test/makefile.in && cat >> test/makefile.in <<EOF
#### Begin: Appended by $0
maintainer-clean-test-targets:
-rm makefile.in
#### End: $0
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"])
# infos and warnings
if test "$have_cppunit" = "no"; then
AC_MSG_WARN([Missing cppunit development library!
- you cannot check the project using "make check"
- everything else works perfectly]); fi
AX_BUILD_TEST
])
# use this in configure.ac to support C++ examples
AC_DEFUN([AX_BUILD_EXAMPLES], [
AC_CONFIG_FILES([examples/makefile])
AX_ADD_MAKEFILE_TARGET_DEP([maintainer-clean-am], [maintainer-clean-example-targets], [examples/makefile.in])
test -f examples/makefile.in && cat >> examples/makefile.in <<EOF
#### Begin: Appended by $0
maintainer-clean-example-targets:
-rm makefile.in
#### End: $0
EOF
])
# use this in configure.ac to support HTML data for webservers
AC_DEFUN([AX_BUILD_HTML], [
AC_CONFIG_FILES([html/makefile])
AX_ADD_MAKEFILE_TARGET_DEP([maintainer-clean-am], [maintainer-clean-html-targets], [html/makefile.in])
test -f html/makefile.in && cat >> html/makefile.in <<EOF
#### Begin: Appended by $0
maintainer-clean-html-targets:
-rm makefile.in
#### End: $0
EOF
])
# use this in configure.ac to support C++ libraries
AC_DEFUN([AX_USE_LIBTOOL], [
# libtool versioning
LIB_MAJOR=m4_eval(x_major+x_minor+x_minor_diff)
LIB_MINOR=x_least
LIB_LEAST=m4_eval(x_minor+x_minor_diff)
LIB_VERSION="${LIB_MAJOR}:${LIB_MINOR}:${LIB_LEAST}"
AM_LDFLAGS="-version-info ${LIB_VERSION}"
AC_SUBST(AM_LDFLAGS)
AC_SUBST(LIB_VERSION)
AC_PROG_LIBTOOL
AC_CONFIG_FILES([src/${PACKAGE_NAME}.pc])
AX_ADD_MAKEFILE_TARGET_DEP([install-data-am], [install-data-libtool-pkg], [src/makefile.in])
AX_ADD_MAKEFILE_TARGET_DEP([uninstall-am], [uninstall-data-am], [src/makefile.in])
AX_ADD_MAKEFILE_TARGET_DEP([uninstall-data-am], [uninstall-data-libtool-pkg], [src/makefile.in])
test -f src/makefile.in && cat >> src/makefile.in <<EOF
#### Begin: Appended by $0
install-data-libtool-pkg:
test -d \$(DESTDIR)\${libdir}/pkgconfig || mkdir -p \$(DESTDIR)\${libdir}/pkgconfig
chmod -R u+w \$(DESTDIR)\${libdir}/pkgconfig
cp \${PACKAGE_NAME}.pc \$(DESTDIR)\${libdir}/pkgconfig/
uninstall-data-libtool-pkg:
-chmod -R u+w \$(DESTDIR)\${libdir}/pkgconfig
-rm -f \$(DESTDIR)\${libdir}/pkgconfig/\${PACKAGE_NAME}.pc
#### End: $0
EOF
])
# use this in configure.ac to support debian packages
AC_DEFUN([AX_USE_DEBIAN_PACKAGING], [
README_DEB=$(tail -n +3 README | sed -e 's/^$/./g' -e 's/^/ /g')
AC_SUBST(README_DEB)
_AM_SUBST_NOTMAKE([README_DEB])
AC_CONFIG_FILES([debian/changelog debian/control])
AX_ADD_MAKEFILE_TARGET_DEP([clean-am], [clean-debian-targets], [makefile.in])
AX_ADD_MAKEFILE_TARGET_DEP([distclean-am], [distclean-debian-targets], [makefile.in])
test -f makefile.in && cat >> makefile.in <<EOF
#### Begin: Appended by $0
EXTRA_DIST += debian
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)
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 )
distclean-debian-targets:
-rm debian/changelog debian/control
#### End: $0
EOF
])
# use this in configure.ac to support RPM packages
AC_DEFUN([AX_USE_RPM_PACKAGING], [
AC_CONFIG_FILES([${PACKAGE_NAME}.spec])
#AX_ADD_MAKEFILE_TARGET_DEP([clean-am], [clean-rpm-targets], [makefile.in])
AX_ADD_MAKEFILE_TARGET_DEP([distclean-am], [distclean-rpm-targets], [makefile.in])
test -f makefile.in && cat >> makefile.in <<EOF
#### Begin: Appended by $0
EXTRA_DIST += \${PACKAGE_NAME}.spec.in
rpm: dist
rpmbuild -ba --define "_topdir \$\$(pwd)" --define "_sourcedir \$\$(pwd)" \${PACKAGE_NAME}.spec
distclean-rpm-targets:
-rm \${PACKAGE_NAME}.spec
#### End: $0
EOF
])
# use this in configure.ac to support scripts, e.g. bash scripts
AC_DEFUN([AX_USE_SCRIPTS], [
AC_CONFIG_FILES([scripts/makefile])
])
# use this in configure.ac to support Doxygen documentation generation
AC_DEFUN([AX_USE_DOXYGEN], [
AC_CHECK_PROG(have_doxygen, doxygen, yes, no)
AC_CHECK_PROG(have_dot, dot, yes, no)
AC_CHECK_PROG(have_mscgen, mscgen, yes, no)
PDF_DOC=${PACKAGE_NAME}-${PACKAGE_VERSION}.pdf
AC_SUBST(PDF_DOC)
if test "$have_doxygen" = "no"; then
AC_MSG_WARN([Missing program doxygen!
- you cannot rebuild the documentation
- there are precompiled derived files in the distribution]); fi
if test "$have_dot" = "no"; then
AC_MSG_WARN([Missing program dot!
- when you rebild documentation, there are no generated images
- there are precompiled derived files in the distribution]); fi
if test "$have_mscgen" = "no"; then
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])
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])
test -f doc/makefile.in && cat >> doc/makefile.in <<EOF
#### Begin: Appended by $0
doc: doxyfile
doxygen doxyfile
@PEDANTIC_TRUE@ test \! -s doxygen.errors
clean-documentation:
-rm doxygen.errors @PDF_DOC@
distclean-documentation:
-rm -r html
-rm @PACKAGE_NAME@.doxytag
maintainer-clean-documentation:
-rm makefile.in
install-data-documentation:
test -d \$(DESTDIR)\${docdir} || mkdir -p \$(DESTDIR)\${docdir}
chmod -R u+w \$(DESTDIR)\${docdir}
cp -r html \$(DESTDIR)\${docdir}/
uninstall-documentation:
-chmod -R u+w \$(DESTDIR)\${docdir}
-rm -rf \$(DESTDIR)\${docdir}/html
#### End: $0
EOF
])
# require a specific package, with fallback: test for a header
# - parameter:
# $1 = unique id (no special characters)
# $2 = module name (optional, if different from id)
# $3 = a header file to find (optional)
# $4 = alternative module names (space separated, optional)
# $5 = optional flags:
# manualflags if CXXFLAGS, CPPFLAGS, LIBS should remain unchanged
#
# uses PKG_CHECK_MODULES to test for a module
# then, if given, looks for the header file
# if header file is not found, searches in alternative modules
# sets all flags, so that the module can be used everywhere
# fails if not found
AC_DEFUN([AX_PKG_REQUIRE], [
PKG_PROG_PKG_CONFIG
optional_flags="$5"
$1_found=no
secondpar="m4_default([$2], [$1])"
PKG_CHECK_MODULES([$1], [m4_default([$2], [$1])], [
$1_found=$secondpar
PKG_REQUIREMENTS+=" $secondpar"
], [
if test -n "$4"; then
AC_MSG_WARN([Recommended package $secondpar for feature $1 not installed, trying $4])
for pkg in $4; do
PKG_CHECK_MODULES([$1], [$pkg], [
PKG_REQUIREMENTS+=" $pkg"
$1_found=$pkg
break;
], [
AC_MSG_WARN([Recommended package $pkg for feature $1 not installed])
])
done
fi
])
AC_SUBST(CPPFLAGS)
AC_SUBST(CXXFLAGS)
AC_SUBST(PKG_REQUIREMENTS)
if test -n "$3"; then
if test "${$1_found}" = "no"; then
tmp_package="yes"
else
tmp_package=${$1_found}
fi
$1_found=no
old_CPPFLAGS=${CPPFLAGS}
CPPFLAGS=" ${$1_CFLAGS} ${CPPFLAGS}"
AC_CHECK_HEADER([$3], [
$1_found=${tmp_package}
], [
for x in ${$1_CFLAGS}; do
AC_MSG_NOTICE([search for $3 in ${x[#]-I}])
for f in $(find ${x[#]-I} -name "$3" 2> /dev/null); do
if test -f "$f"; then
$1_found=${tmp_package}
$1_CFLAGS+=" -I${f%/*}"
AC_MSG_NOTICE([added path ${f%/*}])
break;
fi
done
if test "${$1_found}" != "no"; then
break;
fi
done
if test "${$1_found}" = "no"; then
tmp_includedir=$(${PKG_CONFIG} --variable=includedir $tmp_package)
for x in ${tmp_includedir}; do
AC_MSG_NOTICE([search for $3 in $x])
for f in $(find ${x} -name "$3" 2> /dev/null); do
if test -f "$f"; then
$1_found=${tmp_package}
$1_CFLAGS+=" -I${f%/*}"
AC_MSG_NOTICE([added path ${f%/*}])
break;
fi
done
if test "${$1_found}" != "no"; then
break;
fi
done
fi
])
CPPFLAGS=${old_CPPFLAGS}
fi
if test "${$1_found}" = "no"; then
if test -n "$3"; then
if test -n "$4"; then
AC_MSG_ERROR([Feature $1 not found, need header $3 in modules $secondpar or $4])
else
AC_MSG_ERROR([Feature $1 not found, need header $3 in module $secondpar])
fi
else
AC_MSG_ERROR([Feature $1 not found please install module $secondpar])
fi
fi
[$1]_CPPFLAGS="${$1_CFLAGS}"
[$1]_CXXFLAGS="${$1_CFLAGS}"
AC_SUBST([$1]_CPPFLAGS)
AC_SUBST([$1]_CXXFLAGS)
if test "${optional_flags/manualflags/}" = "${optional_flags}"; then
CPPFLAGS+=" ${$1_CPPFLAGS}"
CXXFLAGS+=" ${$1_CXXFLAGS}"
LIBS+=" ${$1_LIBS}"
AC_MSG_NOTICE([Adding flags for $1])
else
AC_MSG_NOTICE([To enable $1, add $1_CPPFLAGS, $1_CXXFLAGS and $1_LIBS])
fi
])
# check if a specific package exists
# - parameter:
# $1 = unique id (no special characters)
# $2 = module name (optional, if different from id)
# $3 = optional flags:
# manualflags if CXXFLAGS, CPPFLAGS, LIBS should remain unchanged
#
# uses PKG_CHECK_MODULES to test for a module
# sets automake conditional HAVE_$1 to 0 (not found) or 1 (found)
# sets all flags, so that the module can be used everywhere
AC_DEFUN([AX_PKG_CHECK], [
optional_flags="$3"
PKG_PROG_PKG_CONFIG
PKG_CHECK_MODULES([$1], [m4_default([$2], [$1])], [
HAVE_$1=1
[$1]_CPPFLAGS="${$1_CFLAGS}"
[$1]_CXXFLAGS="${$1_CFLAGS}"
AC_SUBST([$1]_CPPFLAGS)
AC_SUBST([$1]_CXXFLAGS)
if test "${optional_flags/manualflags/}" = "${optional_flags}"; then
CPPFLAGS+=" ${$1_CPPFLAGS}"
CXXFLAGS+=" ${$1_CXXFLAGS}"
LIBS+=" ${$1_LIBS}"
AC_MSG_NOTICE([Adding flags for $1])
else
AC_MSG_NOTICE([To enable $1, add $1_CPPFLAGS, $1_CXXFLAGS and $1_LIBS])
fi
if test -z "$PKG_REQUIREMENTS"; then
PKG_REQUIREMENTS="m4_default([$2], [$1])"
else
PKG_REQUIREMENTS="${PKG_REQUIREMENTS}, m4_default([$2], [$1])"
fi
], [
HAVE_$1=0
])
AM_CONDITIONAL(HAVE_$1, test $HAVE_[$1] -eq 1)
AC_SUBST(HAVE_$1)
AC_SUBST(CPPFLAGS)
AC_SUBST(CXXFLAGS)
AC_SUBST(PKG_REQUIREMENTS)
])
# make sure, a specific header exists
# - parameter:
# $1 = header name
AC_DEFUN([AX_REQUIRE_HEADER], [
AC_CHECK_HEADER($1, [], [
if test -n "$2"; then
found=0
for d in $2; do
if test -f "${d}/$1"; then
AC_MSG_NOTICE([found file ${d}/$1])
CPPFLAGS+=" -I${d}"
found=1
break;
else
AC_MSG_NOTICE([not found file ${d}/$1])
fi
done
fi
if test $found -eq 0; then
AC_MSG_ERROR([Header $1 not found])
fi
], [])
], [])
])
# Check within a list of CPP-Flags for the first that is usable and
# configure it
# - parameter:
# $1 = white-space separated list of alternative flags
# $2 = module name (optional, if different from id)
AC_DEFUN([AX_CHECK_VALID_CPP_FLAG], [
AC_MSG_CHECKING([m4_default([$2], [for valid flag in "$1"])])
save_cppflags="$CPPFLAGS"
newflag="no"
for test_flag in $1; do
CPPFLAGS+=" ${test_flag}"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], [
newflag="$test_flag"
CPPFLAGS="$save_cppflags"
CPPFLAGS+=" ${test_flag}"
break;
])
CPPFLAGS="$save_cppflags"
done
AC_SUBST(CPPFLAGS)
AC_MSG_RESULT([$newflag in $CPPFLAGS])
])
# Check within a list of CXX-Flags for the first that is usable and
# configure it
# - parameter:
# $1 = white-space separated list of alternative flags
# $2 = module name (optional, if different from id)
AC_DEFUN([AX_CHECK_VALID_CXX_FLAG], [
AC_MSG_CHECKING([m4_default([$2], [for valid flag in "$1"])])
save_cxxflags="$CXXFLAGS"
newflag="no"
for test_flag in $1; do
CXXFLAGS+=" ${test_flag}"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], [
newflag="$test_flag"
CXXFLAGS="$save_cxxflags"
CXXFLAGS+=" ${test_flag}"
break;
])
CXXFLAGS="$save_cxxflags"
done
AC_SUBST(CXXFLAGS)
AC_MSG_RESULT([$newflag in $CXXFLAGS])
])
# Check within a list of C-Flags for the first that is usable and
# configure it
# - parameter:
# $1 = white-space separated list of alternative flags
# $2 = module name (optional, if different from id)
AC_DEFUN([AX_CHECK_VALID_C_FLAG], [
AC_MSG_CHECKING([m4_default([$2], [for valid flag in "$1"])])
save_cflags="$CFLAGS"
newflag="no"
for test_flag in $1; do
CFLAGS+=" ${test_flag}"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], [
newflag="$test_flag"
CFLAGS="$save_cflags"
CFLAGS+=" ${test_flag}"
break;
])
CFLAGS="$save_cflags"
done
AC_SUBST(CFLAGS)
AC_MSG_RESULT([$newflag in $CFLAGS])
])
# Check within a list of LD-Flags for the first that is usable and
# configure it
# - parameter:
# $1 = white-space separated list of alternative flags
# $2 = module name (optional, if different from id)
AC_DEFUN([AX_CHECK_VALID_LD_FLAG], [
AC_MSG_CHECKING([m4_default([$2], [for valid flag in "$1"])])
save_ldflags="$LDFLAGS"
newflag="no"
for test_flag in $1; do
LDFLAGS+=" ${test_flag}"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], [
newflag="$test_flag"
LDFLAGS="$save_ldflags"
LDFLAGS+=" ${test_flag}"
break;
])
LDFLAGS="$save_ldflags"
done
AC_SUBST(LDFLAGS)
AC_MSG_RESULT([$newflag in $LDFLAGS])
])
# Check if a package exists in the current distribution, if yes, require it
# in debian/control.in append @DEB_DEPEND_IFEXISTS@ to Build-Depends
# - parameter:
# $1 = package name
AC_DEFUN([AX_DEB_DEPEND_IFEXISTS], [
pkg=$1
if test -n "$(apt-cache policy -q ${pkg} 2> /dev/null)"; then
DEB_DEPEND_IFEXISTS+=", ${pkg}"
fi
AC_SUBST(DEB_DEPEND_IFEXISTS)
])

60
backup-generic.spec.in

@ -0,0 +1,60 @@
Summary: @DESCRIPTION@
Name: @PACKAGE_NAME@
Version: @VERSION@
Release: @BUILD_NUMBER@%{?dist}
License: LGPL
Group: Applications/...
Source0: %{name}-%{version}.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
BuildRequires: gnupg, subversion, automake, autoconf, doxygen
%if 0%{?fedora} != 20
BuildRequires: graphviz
%endif
%if 0%{?fedora} || 0%{?rhel} || 0%{?rhl} || 0%{?centos} || 0%{?centos_ver} || 0%{?centos_version}
BuildRequires: pkgconfig, redhat-lsb
%if ! ( 0%{?centos} || 0%{?centos_ver} || 0%{?centos_version} )
BuildRequires: mscgen
%else
%endif
%else%if 0%{?suse_version} || 0%{?sles_version}
BuildRequires: pkg-config, lsb-release
%if 0%{?suse_version} < 1200 || 0%{?sles_version} < 1200
%else
%endif
%endif%endif
%description
@README@
%prep
%setup -q
./configure --prefix=/usr \
--sysconfdir=/etc \
--docdir=/usr/share/doc/packages/@PACKAGE_NAME@ \
--libdir=/usr/%_lib
%build
make
%install
DESTDIR=$RPM_BUILD_ROOT make install
%clean
rm -rf $RPM_BUILD_ROOT
%files
%defattr(-,root,root,-)
/usr/bin/*
%doc
/usr/share/*
%changelog

1072
bootstrap.sh

@ -0,0 +1,1072 @@
#! /bin/bash
## @file
##
## $Id$
##
## $Date: 2004/08/31 15:57:19 $
## $Author: marc $
##
## @copy &copy; Marc W&auml;ckerlin
## @license LGPL, see file <a href="license.html">COPYING</a>
##
## $Log: bootstrap.sh,v $
## Revision 1.3 2004/08/31 15:57:19 marc
## added file header
##
MY_NAME=${0##*/}
PROJECT_PATH=$(pwd)
DEFAULT_PROJECT_NAME=${PROJECT_PATH##*/}
configure=0
build=0
docker=0
buildtarget="distcheck"
overwrite=0
rebuild=0
rebuildfiles=()
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";;
(--overwrite|-o) overwrite=1;;
(--rebuild|-r) rebuild=1;;
(--rebuild-file|-f) shift; rebuildfiles+=("$1");;
(--version|-v)
echo "$Id$";
exit;;
(--help|-h) less <<EOF
SYNOPSIS
${MY_NAME} [--help|-h] [OPTIOS]
OPTIONS
--configure, -c call ./configure after initialization
--docker, -d build and run tests in a docker instance
--build, -b build, also call ./configure && make distcheck
--target, -t <target> same as -b, but specify target instead of distcheck
--overwrite, -o overwrite all basic files (bootstrap.sh, m4-macros)
--rebuild, -r force rebuild of generated files, even if modified
--rebuild-file, -f <file> rebild specific file (can be added multiple times)
--help, -h show this help
--version, -v show version and date of this file
DESCRIPTION
Initializes your build environment, as far as neccessary. Reads your
used features from configure.ac, if that file exists, or creates a
configure.ac. Automatically copies or creates all required template
files.
From your new and empty project's subversion path, call $0 to
initialize your build environment.
Before you call ${MY_NAME} the very first time, edit ${0#/*}/AUTHORS
and replace it with your name (or the authors of your project, one
name each line, main developper and copyright holder on the first
line).
The first call to ${MY_NAME} should be something like
../bootstrap-build-environment/${MY_NAME} and not
./${MY_NAME}. Actually, you called $0.
In the way you called ${MY_NAME}, it has detected
${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
${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 repository, since this build environment
relies on subversion.
Example for an initial run, where your new projet is stored in
subversion on svn:/path/to/your/new-project:
cd ~/svn
svn co https://dev.marc.waeckerlin.org/svn/bootstrap-build-environment/trunk \\
bootstrap-build-environment
svn co svn:/path/to/your/new-project/trunk new-project
cd new-project
../bootstrap-build-environment/bootstrap.sh
RUNNING
If you run ${MY_NAME}, it first generates the necessary files (see
below), then first runs make distclean if a makefile exists. After
this it calles aclocal, libtoolize, automake, autoconf and
optionally ./configure.
GENERATED FILES
This script copies the following files into your project environment:
* ${MY_NAME}
* ax_init_standard_project.m4 - auxiliary macro definition file
* ax_cxx_compile_stdcxx_11.m4 - auxiliary macro definition file
* ax_check_qt.m4 - auxiliary macro definition file
* resolve-debbuilddeps.sh - script to install debian package dependencies
* resolve-rpmbuilddeps.sh - script to install RPM package dependencies
* build-in-docker.sh - script to build the project encapsulated in a docker container
* build-resource-file.sh - build resource.qrc file from a resource directory
* mac-create-app-bundle.sh - script to create apple mac os-x app-bundle
* 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
* 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
* scripts/makefile.am - if you enabled AX_USE_SCRIPTS
* doc/makefile.am - if you enabled AX_USE_DOXYGEN
* doc/doxyfile.in - if you enabled AX_USE_DOXYGEN
* test/makefile.am - 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
* debian/docs - if you enabled AX_USE_DEBIAN_PACKAGING
* debian/${DEFAULT_PROJECT_NAME}.install - if you enabled AX_USE_DEBIAN_PACKAGING
* debian/${DEFAULT_PROJECT_NAME}.dirs - if you enabled AX_USE_DEBIAN_PACKAGING
* debian/${DEFAULT_PROJECT_NAME}-dev.install - if you enabled AX_USE_DEBIAN_PACKAGING
* debian/${DEFAULT_PROJECT_NAME}-dev.dirs - if you enabled AX_USE_DEBIAN_PACKAGING
* debian/rules - if you enabled AX_USE_DEBIAN_PACKAGING
* debian/compat - if you enabled AX_USE_DEBIAN_PACKAGING
* ${DEFAULT_PROJECT_NAME}.spec.in - if you enable AX_USE_RPM_PACKAGING
* src/${DEFAULT_PROJECT_NAME}.pc.in - if you enabled AX_USE_LIBTOOL
REBUILDING FILES
To rebuild all these files, just run "${MY_NAME} -r".
To copy only the files provided by this package, that means those
files you must never change, that means to update the build system
to the latest release, run "${MY_NAME} -o"
You can also rebuild a list of singleany list of specific file files
by adding option "${MY_NAME} -f <file>" to rebuild file
"<file>". You can add option "-f" more than once.
FILES TO EDIT
After creation of the files, you can edit them according to your
needs. Please don't forget to redo your edits after rebuilding a
file. Most files don't even need to be edited, they work out of the
box.
The following files normally require editing:
* AUTHORS
* NEWS
* README
* configure.ac
* src/makefile.am
* html/makefile.am
* test/makefile.am
* examples/makefile.am
FILE DEPENDENCIES
You should rebuild (see above) the files, whenever you change the
configuration a dependent, i.e.:
* test/makefile.am depends on AX_USE_LIBTOOL
* html/makefile.am depends on AX_BUILD_HTML
* 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/${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
* debian/${DEFAULT_PROJECT_NAME}-dev.dirs depends on AX_USE_LIBTOOL
* ${DEFAULT_PROJECT_NAME}.spec.in depends on AX_USE_RPM_PACKAGING,
AX_USE_LIBTOOL, AX_CHECK_QT, AX_REQUIRE_QT, AX_CXX_QT, AX_USE_CPPUNIT
FILES
* AUTHORS: First line is the main author and used in Debian and RPM
packaging, so there must be a GPG key that matches
to this line.
* NEWS: File to add project news.
* README: First line is a short description of your project, then an
empty line must follow. All remaining lines are a
long description of your project. this information
is copied, e.g. in Debian or RPM packages. In C++
<ou can access the readme by calling
${DEFAULT_PROJECT_NAME}::description().
* ChangeLog: Your changelog is automatically maintained from
subversion history, using svn2cl. You don't need to
care about.
* configure.ac: This file becomes very short and simple. You provide
the project name, the major and minor version. The
least version number is automatically taken from
subversion's revision, so every checkin
automatically increments the least version
number. The following macros are supported:
* Enable C++: AX_USE_CXX
* Enable LibTool library creation: AX_USE_LIBTOOL
* Enable Scripts: AX_USE_SCRIPTS
* Enable Doxygen documentation generation: AX_USE_DOXYGEN
* 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
* Enable other tests: AX_BUILD_TEST
* Enable C++ examples, i.e. for libraries: AX_BUILD_EXAMPLES
* Check for C++11 support: AX_CXX_COMPILE_STDCXX_11 (see ax_cxx_compile_stdcxx_11.m4)
* Require a QT module: AX_REQUIRE_QT (see ax_check_qt.m4)
* Optionally use a QT module: AX_CHECK_QT (see ax_check_qt.m4)
* Require a module: AX_PKG_REQUIRE (see ax_init_standard_project.m4)
* Check for an optional module: AX_PKG_CHECK (see ax_init_standard_project.m4)
EXAMPLES: src/makefile.am in a QT project
In this example, you wrote the following files:
* ${DEFAULT_PROJECT_NAME}.hxx - Qt Header file, passed to moc
* ${DEFAULT_PROJECT_NAME}.cxx - C++ file containing main()
* ${DEFAULT_PROJECT_NAME}.ui - UI file
All rules are implicitely added, all you need to do is to add the
following definitions, most lines are generic:
bin_PROGRAMS = ${DEFAULT_PROJECT_NAME}
${DEFAULT_PROJECT_NAME}_MOCFILES = moc_${DEFAULT_PROJECT_NAME}.cxx
${DEFAULT_PROJECT_NAME}_UIFILES = ui_${DEFAULT_PROJECT_NAME}.hxx
${DEFAULT_PROJECT_NAME}_SOURCES = version.cxx version.hxx ${DEFAULT_PROJECT_NAME}.cxx ${DEFAULT_PROJECT_NAME}_MOCFILES ${DEFAULT_PROJECT_NAME}_UIFILES
BUILT_SOURCES = \${${DEFAULT_PROJECT_NAME}_MOCFILES} \${${DEFAULT_PROJECT_NAME}_UIFILES}
EXTRA_DIST = \${${DEFAULT_PROJECT_NAME}_MOCFILES:moc_%.cxx=%.hxx} \${${DEFAULT_PROJECT_NAME}_UIFILES:ui_%.hxx=%.ui}
MAINTAINERCLEANFILES = makefile.in
EOF
exit;;
(*) break;;
esac
shift;
done
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
'
notice() {
echo -e "\e[1;33m$*\e[0m"
}
run() {
check=1
while test $# -gt 0; do
case "$1" in
(--no-check) check=0;;
(*) break;;
esac
shift;
done
echo -en "\e[1m-> running:\e[0m $* ..."
result=$($* 2>&1)
res=$?
if test $res -ne 0; then
if test $check -eq 1; then
echo -e " \e[31merror\e[0m"
echo -e "\e[1m*** Failed with return code: $res\e[0m"
if test -n "$result"; then
echo "$result"
fi
exit 1
else
echo -e " \e[33mignored\e[0m"
fi
else
echo -e " \e[32msuccess\e[0m"
fi
}
testtag() {
local IFS="|"
egrep -q '^ *'"($*)" configure.ac
}
contains() {
local e
for e in "${@:2}"; do [[ "$e" == "$1" ]] && return 0; done
return 1
}
checkdir() {
if ! test -d "$1"; then # create path
run mkdir -p "$1"
run svn add "$1"
fi
}
checkfile() {
exists=0
if test -f "$1"; then
exists=1
fi
test $exists -eq 1
}
to() {
while test $# -gt 0; do
mode="u=rw,g=rw,o=r"
case "$1" in
(--condition) shift # test for a tag, abort if not set
if ! testtag "$1"; then
return 0
fi;;
(--mode) shift # test for a tag, abort if not set
mode="$1";;
(*) break;;
esac
shift;
done
if checkfile "$1" && test $rebuild -eq 0 -o "$1" = "configure.ac" \
&& ! contains "$1" "${rebuildfiles[@]}"; then
# file already exists and must not be rebuilt
return 1
fi
checkdir "$(dirname ${1})"
echo -en "\e[1m-> generating:\e[0m $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
else
echo -e " \e[32msuccess\e[0m"
fi
chmod $mode $1
if test $exists -eq 0; then
run svn add "$1"
run svn propset svn:keywords "Id" "$1"
fi
return 0
}
copy() {
if checkfile "$1" && test $overwrite -eq 0 \
&& ! contains "$1" "${rebuildfiles[@]}"; then
# file already exists and must not be rebuilt
return
fi
local source="${0%/*}/$1"
if ! test -r "${source}"; then
source="../${source}"
if ! test -r "${source}"; then
source="${0%/*}/$1"
fi
fi
run cp "${source}" "$1"
if test $exists -eq 0; then
run svn add "$1"
run svn propset svn:keywords "Id" "$1"
fi
}
doxyreplace() {
echo -en "\e[1m-> doxyfile:\e[0m configure $1 ..."
if sed -i 's|\(^'"$1"' *=\) *.*|\1'" $2"'|g' doc/doxyfile.in; then
echo -e " \e[32msuccess\e[0m"
else
echo -e " \e[31merror\e[0m"
echo -e "\e[1m**** command: $0 $*\e[0m"
exit 1
fi
}
doxyadd() {
echo -en "\e[1m-> doxyfile:\e[0m configure $1 ..."
if sed -i '/^'"$1"' *=/a'"$1"' += '"$2" doc/doxyfile.in; then
echo -e " \e[32msuccess\e[0m"
else
echo -e " \e[31merror\e[0m"
echo -e "\e[1m**** command: $0 $*\e[0m"
exit 1
fi
}
# 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
svn mkdir trunk branches tags
cd trunk
fi
# Initialize the environment:
copy ${MY_NAME}
copy ax_init_standard_project.m4
copy ax_cxx_compile_stdcxx_11.m4
copy ax_check_qt.m4
copy resolve-debbuilddeps.sh
copy resolve-rpmbuilddeps.sh
copy build-in-docker.sh
copy build-resource-file.sh
copy mac-create-app-bundle.sh
AUTHOR=$(gpg -K | sed -n 's,uid *,,p' | sort | head -1)
if test -z "${AUTHOR}"; then
AUTHOR="FIRSTNAME LASTNAME (URL) <EMAIL>"
fi
to AUTHORS <<EOF && notice "please edit AUTHORS"
$AUTHOR
EOF
to NEWS <<EOF && notice "please edit NEWS"
$(date) created ${DEFAULT_PROJECT_NAME}
EOF
to README <<EOF && notice "please edit README"
${DEFAULT_PROJECT_NAME}
add description for ${DEFAULT_PROJECT_NAME}
EOF
to configure.ac <<EOF && notice "please edit configure.ac, then rerun $0" && exit 0
${HEADER}m4_define(x_package_name, ${DEFAULT_PROJECT_NAME}) # project's name
m4_define(x_major, 0) # project's major version
m4_define(x_minor, 0) # 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])
AX_INIT_STANDARD_PROJECT
# requirements, uncomment, what you need:
#AX_USE_CXX
#AX_USE_LIBTOOL
#AX_USE_SCRIPTS
#AX_USE_DOXYGEN
#AX_USE_DEBIAN_PACKAGING
#AX_USE_RPM_PACKAGING
#AX_USE_CPPUNIT
#AX_BUILD_TEST
#AX_BUILD_EXAMPLES
#AX_BUILD_HTML
# qt features, uncomment, what you need:
#AX_CHECK_QT([QT], [QtCore QtGui QtNetwork], [QtWidgets])
#AX_REQUIRE_QT([QT], [QtCore QtGui QtNetwork], [QtWidgets])
#AX_QT_NO_KEYWORDS
# create output
AC_OUTPUT
EOF
PACKAGE_NAME=$(sed -n 's/.*m4_define *( *x_package_name *, *\([^ ]*\) *).*/\1/p' configure.ac)
SAVEIFS="$IFS"
IFS="-" PackageName=( $PACKAGE_NAME )
IFS="$SAVEIFS"
PackageName=${PackageName[*]^}
PackageName=${PackageName// /}
if ! testtag AX_CHECK_QT && \
! testtag AX_REQUIRE_QT; then
echo "${HEADER}MAINTAINERCLEANFILES = makefile.in" | \
to --condition AX_USE_CXX src/makefile.am
elif ! test -e src/makefile.am; then
to --condition AX_USE_CXX src/makefile.am <<EOF
${HEADER}bin_PROGRAMS = ${PACKAGE_NAME}
## required to enable the translation feature
LANGUAGE_FILE_BASE = ${PACKAGE_NAME}
## list here the Qt plugins your project depends on
## required to build Mac OS-X app-bundle
QT_PLUGINS = iconengines imageformats platforms
#### enable if you deliver a KDE/Gnome desktop file
#applicationsdir = ${datarootdir}/applications
#dist_applications_DATA = ${PACKAGE_NAME}.desktop
#### enable (ev. instead of bin_PROGRAMS) if you build a library
#lib_LTLIBRARIES = ${PACKAGE_NAME}.la
#${PACKAGE_NAME}_la_SOURCES = libmain.cxx version.cxx
## noop to prevent:
## «src/makefile.am: error: object 'version.\$(OBJEXT)' created both with
## libtool and without»
#${PACKAGE_NAME}_la_CXXFLAGS = \$(AM_CXXFLAGS)
## list headers that are required for build, but that are not installed
noinst_HEADERS = version.hxx
## list all %.hxx files with Q_OBJECT as moc_%.cxx
${PACKAGE_NAME//-/_}_MOCFILES = moc_${PACKAGE_NAME}.cxx
## list all %.ui files as ui_%.hxx
${PACKAGE_NAME//-/_}_UIFILES = ui_${PACKAGE_NAME}.hxx
## list all %.qrc resource files as qrc_%.cxx
## note: if there exists a directory %, the file %.qrc is generated from that
${PACKAGE_NAME//-/_}_RESOURCES = qrc_languages.cxx # qrc_resources.cxx
## list all final translation files, list all supported languages here
${PACKAGE_NAME//-/_}_TRANSLATIONS = \${LANGUAGE_FILE_BASE}_en.qm \\
\${LANGUAGE_FILE_BASE}_de.qm \\
\${LANGUAGE_FILE_BASE}_fr.qm \\
\${LANGUAGE_FILE_BASE}_it.qm
## list all C++ files that need translation
${PACKAGE_NAME//-/_}_TR_FILES = main.cxx version.cxx
## automatic assembly, no need to change
${PACKAGE_NAME//-/_}_SOURCES = \${${PACKAGE_NAME//-/_}_TR_FILES} \${BUILT_SOURCES}
## automatic assembly, no need to change
BUILT_SOURCES = \${${PACKAGE_NAME//-/_}_MOCFILES} \
\${${PACKAGE_NAME//-/_}_UIFILES} \
\${${PACKAGE_NAME//-/_}_TRANSLATIONS} \
\${${PACKAGE_NAME//-/_}_RESOURCES}
## automatic assembly, no need to change
EXTRA_DIST_TR = \${${PACKAGE_NAME//-/_}_MOCFILES:moc_%.cxx=%.hxx} \
\${${PACKAGE_NAME//-/_}_UIFILES:ui_%.hxx=%.ui}
## automatic assembly, no need to change
## except: adapt the pre-delivered qt_%.qm list (language files you copy from qt
EXTRA_DIST = \${EXTRA_DIST_TR} \
\${${PACKAGE_NAME//-/_}_RESOURCES:qrc_%.cxx:%.qrc} \
\${${PACKAGE_NAME//-/_}_TRANSLATIONS:%.qm=%.ts} \
qt_de.qm qt_fr.qm
## automatic assembly, no need to change
LANGUAGE_FILES = \${EXTRA_DIST_TR} \${${PACKAGE_NAME//-/_}_TR_FILES}
MAINTAINERCLEANFILES = makefile.in
EOF
to --condition AX_USE_CXX src/main.cxx <<EOF
${CHEADER}#include <${PACKAGE_NAME}.hxx>
#include <QApplication>
#include <QCommandLineParser>
#include <iostream>
int main(int argc, char *argv[]) try {
QApplication a(argc, argv);
QCommandLineParser parser;
parser.addHelpOption();
parser.process(a);
QStringList scripts(parser.positionalArguments());
${PackageName} w;
w.show();
return a.exec();
} catch (std::exception &x) {
std::cerr<<"**** error: "<<x.what()<<std::endl;
return 1;
}
EOF
to --condition AX_USE_CXX src/${PACKAGE_NAME}.hxx <<EOF
${CHEADER}#ifndef ${PackageName^^}_HXX
#define ${PackageName^^}_HXX
#include <QMainWindow>
#include <ui_${PACKAGE_NAME}.hxx>
/// Main Window
/** Main window for ${PACKAGE_NAME} */
class ${PackageName}: public QMainWindow, protected Ui::${PackageName} {
Q_OBJECT;
public:
explicit ${PackageName}(QWidget *parent = 0): QMainWindow(parent) {
setupUi(this);
}
virtual ~${PackageName}() {}
};
#endif
EOF
to --condition AX_USE_CXX src/${PACKAGE_NAME}.ui <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>${PackageName}</class>
<widget class="QMainWindow" name="${PackageName}">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>600</height>
</rect>
</property>
<property name="windowTitle">
<string>${PackageName}</string>
</property>
<widget class="QWidget" name="centralwidget"/>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>22</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>
EOF
to --condition AX_USE_CXX src/languages.qrc <<EOF
<RCC>
<qresource prefix="/language">
<file>${PACKAGE_NAME}_de.qm</file>
<file>${PACKAGE_NAME}_fr.qm</file>
<file>${PACKAGE_NAME}_it.qm</file>
<file>${PACKAGE_NAME}_en.qm</file>
</qresource>
</RCC>
EOF
fi
to --condition AX_USE_CXX src/version.hxx <<EOF
/*! @file
@id \$Id\$
*/
// 1 2 3 4 5 6 7 8
// 45678901234567890123456789012345678901234567890123456789012345678901234567890
#include <string>
namespace NAMESPACE {
/// get package string which consists of package name and package version
std::string package_string();
/// get package name
std::string package_name();
/// get package version
std::string version();
/// get code build date
std::string build_date();
/// get author, i.e. copyright holder
std::string author();
/// get short package description (1st line of README)
std::string description();
/// get long package description (starting at 3rd line in README)
std::string readme();
/// get package logo file name
std::string logo();
/// get package icon file name
std::string icon();
/// used for <code>what filename</code>
extern const std::string WHAT;
/// used for <code>ident filename</code>
extern const std::string IDENT;
}
EOF
to --condition AX_USE_CXX src/version.cxx <<EOF