new feature: «for»-loop; updated buildsystem

master
Marc Wäckerlin 9 years ago
parent 023ffc3c78
commit 4f0af7e32a
  1. 45
      ChangeLog
  2. 200
      ax_check_qt.m4
  3. 459
      ax_init_standard_project.m4
  4. 294
      bootstrap.sh
  5. 31
      build-resource-file.sh
  6. 103
      mac-create-app-bundle.sh
  7. 44
      resolve-debbuilddeps.sh
  8. 34
      resolve-rpmbuilddeps.sh
  9. 22
      src/commands.hxx

@ -1,3 +1,48 @@
2015-10-09 15:01 marc
* src/commands.hxx, src/networkaccessmanager.hxx: unfinished: new
feature: for loop
2015-07-12 18:38 marc
* debian/control.in: requires qt5
2015-07-12 18:16 marc
* debian/control.in: requires qt5
2015-05-20 15:22 marc
* src/commands.hxx: some bugs fixed, logging is quite good now
2015-05-20 14:35 marc
* src/commands.hxx: fixed stupid error in Do::execute; nicer
logging
2015-05-20 11:52 marc
* src/commands.hxx, src/exceptions.hxx, src/testgui.hxx,
src/webrunner.cxx: improved logging, bugfix in function handling
2015-05-19 14:34 marc
* src/commands.hxx, src/testgui.hxx: click has an optional
clicktype; do has an optional selector; better detection and
handling of moo-tool (joomla3) elements
2015-05-11 12:13 marc
* src/commands.hxx, src/exceptions.hxx: new command check to
compare two values or to compare a value to the result of a
command - command call now returns the value of the last
statement
2015-05-11 09:54 marc
* ChangeLog, doc/makefile.amto, src/commands.hxx: now also supports
optional else after command if
2015-05-09 12:27 marc 2015-05-09 12:27 marc
* ChangeLog, ax_check_qt.m4, ax_init_standard_project.m4, * ChangeLog, ax_check_qt.m4, ax_init_standard_project.m4,

@ -1,16 +1,16 @@
# SYNOPSIS # SYNOPSIS
# #
# Check if a module exists: # Check if a module exists:
# AX_CXX_CHECK_QT([qt_prefix], [list-of-qt-modules], [optional-modules]) # AX_CHECK_QT([qt_prefix], [list-of-qt-modules], [optional-modules] [flags])
# #
# Abort if a module does not exist: # Abort if a module does not exist:
# AX_CXX_REQUIRE_QT([qt_prefix], [list-of-qt-modules], [optional-modules]) # AX_REQUIRE_QT([qt_prefix], [list-of-qt-modules], [optional-modules] [flags])
# #
# DESCRIPTIONS # DESCRIPTIONS
# #
# qt_prefix # qt_prefix
# #
# Each call to AX_CXX_CHECK_QT should have a different prefix # Each call to AX_CHECK_QT should have a different prefix
# value (with a few exceptions discussed later on). This value, # value (with a few exceptions discussed later on). This value,
# usually provided in uppercase, is used as prefix to the # usually provided in uppercase, is used as prefix to the
# variables holding the compiler flags and libraries reported by # variables holding the compiler flags and libraries reported by
@ -35,27 +35,46 @@
# Optional list of more, optional modules, e.g. modules that # Optional list of more, optional modules, e.g. modules that
# exist only in Qt5, but not in Qt4, such as QtWidgets or # exist only in Qt5, but not in Qt4, such as QtWidgets or
# QtWebKitWidgets # 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], [ AC_DEFUN([AX_CXX_QT_TOOL], [
PKG_PROG_PKG_CONFIG
if test -z "$HAVE_$1"; then if test -z "$HAVE_$1"; then
HAVE_$1=1 HAVE_$1=1
AC_MSG_CHECKING([for $2]) AC_MSG_CHECKING([for $2])
AC_ARG_VAR([$1], [path to Qt tool $2]) AC_ARG_VAR([$1], [path to Qt tool $2])
$1=${$1:-$(pkg-config --variable=$2_location Qt5Core)} $1=${$1:-$(${PKG_CONFIG} --variable=$2_location Qt5Core)}
$1=${$1:-$(pkg-config --variable=host_bins Qt5Core)/$2} $1=${$1:-$(${PKG_CONFIG} --variable=host_bins Qt5Core)/$2-qt5}
$1=${$1:-$(pkg-config --variable=$2_location QtCore)} $1=${$1:-$(${PKG_CONFIG} --variable=host_bins Qt5Core)/$2}
$1=${$1:-$(pkg-config --variable=host_bins QtCore)/$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 "${$1%% *}" > /dev/null; then
if which "$2" > /dev/null; then if which "$2-qt5" > /dev/null; then
$1=$2-qt5
elif which "$2" > /dev/null; then
$1=$2 $1=$2
elif which "$2-qt4" > /dev/null; then
$1=$2-qt4
else else
HAVE_$1=0 HAVE_$1=0
$1="" $1=""
fi fi
fi fi
AC_SUBST($1) AC_SUBST($1)
AM_CONDITIONAL(HAVE_$1, test $HAVE_$1 -eq 1) AM_CONDITIONAL(HAVE_$1, test $HAVE_[$1] -eq 1)
if test $HAVE_$1 -eq 1; then if test $HAVE_$1 -eq 1; then
AC_MSG_RESULT([$$1]) AC_MSG_RESULT([$$1])
else else
@ -73,55 +92,50 @@ AC_DEFUN([AX_CXX_QT_TOOLS], [
AX_CXX_QT_TOOL(LRELEASE, lrelease) AX_CXX_QT_TOOL(LRELEASE, lrelease)
]) ])
AC_DEFUN([AX_CHECK_VALID_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"
AM_CXXFLAGS+=" ${test_flag}"
CXXFLAGS="$save_cxxflags"
break;
])
CXXFLAGS="$save_cxxflags"
done
AC_SUBST(AM_CXXFLAGS)
AC_MSG_RESULT([$newflag])
])
AC_DEFUN([AX_CHECK_QT], [ AC_DEFUN([AX_CHECK_QT], [
qt_modules="$2" qt_modules="$2"
qt_modules_optional="$3" qt_modules_optional="$3"
qt_flags="$4"
AX_CXX_QT_TOOLS AX_CXX_QT_TOOLS
HAVE_$1=0 HAVE_$1=0
PKG_PROG_PKG_CONFIG PKG_PROG_PKG_CONFIG
PKG_CHECK_MODULES([$1]5, [${qt_modules//Qt/Qt5}], [ PKG_CHECK_MODULES([$1]5, [${qt_modules//Qt/Qt5}], [
HAVE_$1=1 HAVE_$1=1
AC_DEFINE([HAVE_$1]) AC_DEFINE([HAVE_$1])
AM_CPPFLAGS+=" ${[$1]5_CFLAGS}" QTDIR=$(${PKG_CONFIG} --variable=prefix Qt5Core)
QT_PLUGIN_PATH=${QTDIR}/share/qt5/plugins
MOC_FLAGS+=" -DHAVE_$1=1 ${[$1]5_CFLAGS}" MOC_FLAGS+=" -DHAVE_$1=1 ${[$1]5_CFLAGS}"
AM_CXXFLAGS+=" ${[$1]5_CFLAGS}" [$1]_CPPFLAGS="${[$1]5_CFLAGS}"
LIBS+=" ${[$1]5_LIBS}" [$1]_CXXFLAGS="${[$1]5_CFLAGS}"
modules=${qt_modules//Qt/Qt5} [$1]_LIBS="${[$1]5_LIBS}"
if test -z "$PKG_REQUIREMENTS"; then AC_SUBST([$1]_CPPFLAGS)
PKG_REQUIREMENTS="${modules// /, }" 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 else
PKG_REQUIREMENTS="${PKG_REQUIREMENTS}, ${modules// /, }" AC_MSG_NOTICE([To enable $1, add $1_CPPFLAGS, $1_CXXFLAGS and $1_LIBS])
fi fi
PKG_REQUIREMENTS+=" ${qt_modules//Qt/Qt5}"
if test -n "${qt_modules_optional}"; then if test -n "${qt_modules_optional}"; then
PKG_CHECK_MODULES([$1]5_OPTIONAL, [${qt_modules_optional//Qt/Qt5}], [ PKG_CHECK_MODULES([$1]5_OPTIONAL, [${qt_modules_optional//Qt/Qt5}], [
AM_CPPFLAGS+=" ${[$1]5_OPTIONAL_CFLAGS}"
MOC_FLAGS+=" ${[$1]5_OPTIONAL_CFLAGS}" MOC_FLAGS+=" ${[$1]5_OPTIONAL_CFLAGS}"
AM_CXXFLAGS+=" ${[$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}" LIBS+=" ${[$1]5_OPTIONAL_LIBS}"
modules=${qt_modules_optional//Qt/Qt5} AC_MSG_NOTICE([Adding flags for $1])
if test -z "$PKG_REQUIREMENTS"; then
PKG_REQUIREMENTS="${modules// /, }"
else else
PKG_REQUIREMENTS="${PKG_REQUIREMENTS}, ${modules// /, }" AC_MSG_NOTICE([To enable $1, add $1_CPPFLAGS, $1_CXXFLAGS and $1_LIBS])
fi fi
PKG_REQUIREMENTS+=" ${qt_modules_optional//Qt/Qt5}"
], [ ], [
AC_MSG_NOTICE([Not found: ${qt_modules_optional//Qt/Qt5}]) AC_MSG_NOTICE([Not found: ${qt_modules_optional//Qt/Qt5}])
]) ])
@ -130,41 +144,60 @@ AC_DEFUN([AX_CHECK_QT], [
PKG_CHECK_MODULES([$1], [${qt_modules}], [ PKG_CHECK_MODULES([$1], [${qt_modules}], [
HAVE_$1=1 HAVE_$1=1
AC_DEFINE([HAVE_$1]) AC_DEFINE([HAVE_$1])
AM_CPPFLAGS+=" ${$1_CFLAGS}" QTDIR=$(${PKG_CONFIG} --variable=prefix QtCore)
QT_PLUGIN_PATH=${QTDIR}/share/qt/plugins
MOC_FLAGS+=" -DHAVE_$1=1 ${$1_CFLAGS}" MOC_FLAGS+=" -DHAVE_$1=1 ${$1_CFLAGS}"
AM_CXXFLAGS+=" ${$1_CFLAGS}" [$1]_CPPFLAGS="${[$1]_CFLAGS}"
LIBS+=" ${$1_LIBS}" [$1]_CXXFLAGS="${[$1]_CFLAGS}"
modules=${qt_modules} AC_SUBST([$1]_CPPFLAGS)
if test -z "$PKG_REQUIREMENTS"; then AC_SUBST([$1]_CXXFLAGS)
PKG_REQUIREMENTS="${modules// /, }" 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 else
PKG_REQUIREMENTS="${PKG_REQUIREMENTS}, ${modules// /, }" AC_MSG_NOTICE([To enable $1, add $1_CPPFLAGS, $1_CXXFLAGS and $1_LIBS])
fi fi
PKG_REQUIREMENTS+=" ${qt_modules}"
if test -n "$3"; then if test -n "$3"; then
PKG_CHECK_MODULES($1_OPTIONAL, [${qt_modules_optional}], [ PKG_CHECK_MODULES($1_OPTIONAL, [${qt_modules_optional}], [
AM_CPPFLAGS+=" ${$1_OPTIONAL_CFLAGS}"
MOC_FLAGS+="${$1_OPTIONAL_CFLAGS}" MOC_FLAGS+="${$1_OPTIONAL_CFLAGS}"
AM_CXXFLAGS+=" ${$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}" LIBS+=" ${$1_OPTIONAL_LIBS}"
modules=${qt_modules_optional} AC_MSG_NOTICE([Adding flags for $1])
if test -z "$PKG_REQUIREMENTS"; then
PKG_REQUIREMENTS="${modules// /, }"
else else
PKG_REQUIREMENTS="${PKG_REQUIREMENTS}, ${modules// /, }" AC_MSG_NOTICE([To enable $1, add $1_CPPFLAGS, $1_CXXFLAGS and $1_LIBS])
fi fi
PKG_REQUIREMENTS+=" ${qt_modules_optional}"
], [ ], [
AC_MSG_NOTICE([Not found: ${qt_modules_optional}]) AC_MSG_NOTICE([Not found: ${qt_modules_optional}])
]) ])
fi fi
], [HAVE_$1=0]) ], [HAVE_$1=0])
]) ])
AM_CONDITIONAL(HAVE_$1, test $HAVE_$1 -eq 1) AM_CONDITIONAL(HAVE_$1, test $HAVE_[$1] -eq 1)
AX_CHECK_VALID_FLAG([-fPIC -fPIE], [position independent code flag]) AX_CHECK_VALID_CXX_FLAG([-fPIC -fPIE], [position independent code flag])
AC_SUBST(AM_CPPFLAGS) if test -n "${MINGW}"; then
AX_CHECK_VALID_CXX_FLAG([-Wl,-subsystem,windows], [windows console flag])
fi
AC_SUBST(QTDIR)
AC_SUBST(QT_PLUGIN_PATH)
AC_SUBST(CPPFLAGS)
AC_SUBST(MOC_FLAGS) AC_SUBST(MOC_FLAGS)
AC_SUBST(AM_CXXFLAGS) AC_SUBST(CXXFLAGS)
AC_SUBST(PKG_REQUIREMENTS) AC_SUBST(PKG_REQUIREMENTS)
AX_ADDITIONAL_QT_RULES_HACK=' AX_ADDITIONAL_QT_RULES_HACK='
LANGUAGE_FILE_BASE ?= translations
ui_%.hxx: %.ui ui_%.hxx: %.ui
$(UIC) -o [$][@] $< $(UIC) -o [$][@] $<
@ -172,46 +205,24 @@ moc_%.cxx: %.hxx
$(MOC) $(MOC_FLAGS) -o [$][@] $< $(MOC) $(MOC_FLAGS) -o [$][@] $<
qrc_%.cxx: %.qrc qrc_%.cxx: %.qrc
$(RCC) -o [$][@] $<' $(RCC) -o [$][@] -name ${<:%.qrc=%} $<
AC_SUBST(AX_ADDITIONAL_QT_RULES_HACK) AC_SUBST(AX_ADDITIONAL_QT_RULES_HACK)
])
# SYNOPSIS #%.qrc: %
# # cwd=$$(pwd) && cd $< && $(RCC) -project -o $${cwd}/[$][@]
# AX_CXX_CHECK_QT([qt_prefix], [list-of-qt-modules], [optional-modules])
# %.qm: %.ts
# DESCRIPTIONS ${LRELEASE} $< -qm [$][@]
#
# qt_prefix #%.ts: ${LANGUAGE_FILES:%=%}
# # ${LUPDATE} -no-obsolete \
# Each call to AX_CXX_CHECK_QT should have a different prefix # -target-language ${@:${LANGUAGE_FILE_BASE}_%.ts=%} \
# value (with a few exceptions discussed later on). This value, # -ts [$][@] $<
# 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
AC_DEFUN([AX_REQUIRE_QT], [ AC_DEFUN([AX_REQUIRE_QT], [
AX_CHECK_QT([$1], [$2], [$3]) AX_CHECK_QT([$1], [$2], [$3], [$4])
if ! test "$HAVE_$1" -eq 1; then if ! test "$HAVE_$1" -eq 1; then
AC_MSG_ERROR([Required Qt modules not found: $2]) AC_MSG_ERROR([Required Qt modules not found: $2])
fi fi
@ -220,7 +231,6 @@ AC_DEFUN([AX_REQUIRE_QT], [
# Omit Qt Keywords # Omit Qt Keywords
# AX_QT_NO_KEYWORDS # AX_QT_NO_KEYWORDS
AC_DEFUN([AX_QT_NO_KEYWORDS], [ AC_DEFUN([AX_QT_NO_KEYWORDS], [
AM_CPPFLAGS+=" -DQT_NO_KEYWORDS" CPPFLAGS+=" -DQT_NO_KEYWORDS"
]) ])

@ -3,45 +3,53 @@
## 1 2 3 4 5 6 7 8 ## 1 2 3 4 5 6 7 8
## 45678901234567890123456789012345678901234567890123456789012345678901234567890 ## 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: # 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_esyscmd_s( 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')
break;
fi
done
echo $ECHO_N $(($SVN_REVISION))
]), mrw_esyscmd_s([
SVN_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-svn-checkout" SVN_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-svn-checkout"
for path in . .. ../..; do for path in . .. ../..; do
if svn info $path 2>&1 > /dev/null; then if svn info $path 2>&1 > /dev/null; then
SVN_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p') SVN_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p')
(cd $path && svn2cl)
break; break;
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 $(($SVN_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_fixed, m4_esyscmd_s( m4_define(x_minor_diff, mrw_esyscmd_s([
SVN_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-svn-checkout" SVN_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-svn-checkout"
for path in . .. ../..; do for path in . .. ../..; do
if svn info $path 2>&1 > /dev/null; then if svn info $path 2>&1 > /dev/null; then
SVN_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p') SVN_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p')
(cd $path && svn2cl)
break; break;
fi fi;
done done
# Mac does not support LEAST > 255 # Mac does not support LEAST > 255
echo $ECHO_N $((x_minor+$SVN_REVISION/256)) echo $ECHO_N $(($SVN_REVISION/256))
)) ]))
# setup version number # setup version number
m4_define(x_version, m4_esyscmd_s( 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]))])
echo $ECHO_N x_major.x_minor_fixed.x_least
))
## bugreport mail address is taken from <user@host> in first line of AUTHORS ## bugreport mail address is taken from <user@host> in first line of AUTHORS
m4_define(x_bugreport, m4_esyscmd_s( m4_define(x_bugreport, mrw_esyscmd_s([
head -1 AUTHORS | \ head -1 AUTHORS | \
sed -n 's,.*<\([-_.a-z0-9A-Z]*@[-_.a-z0-9A-Z]*\)>.*,\1,gp' sed -n 's,.*<\([-_.a-z0-9A-Z]*@[-_.a-z0-9A-Z]*\)>.*,\1,gp'
)) ]))
m4_include(ax_check_qt.m4) m4_include(ax_check_qt.m4)
@ -68,7 +76,7 @@ dnl refers to ${prefix}. Thus we have to use `eval' twice.
# $3 = filename of makefile.in # $3 = filename of makefile.in
AC_DEFUN([AX_ADD_MAKEFILE_TARGET_DEP], [ AC_DEFUN([AX_ADD_MAKEFILE_TARGET_DEP], [
sh_add_makefile_target_dep() { sh_add_makefile_target_dep() {
sed -i ':a;/^'${1}':.*\\$/{N;s/\\\n//;ta};s/^'${1}':.*$/& '${2}'/' "${srcdir}/${3}" sed -i -e ':a;/^'${1}':.*\\$/{N;s/\\\n//;ta};s/^'${1}':.*$/& '${2}'/' "${srcdir}/${3}"
if ! egrep -q "${1}:.* ${2}" "${srcdir}/${3}"; then if ! egrep -q "${1}:.* ${2}" "${srcdir}/${3}"; then
echo "${1}: ${2}" >> "${srcdir}/${3}" echo "${1}: ${2}" >> "${srcdir}/${3}"
fi fi
@ -84,7 +92,7 @@ AC_DEFUN([AX_ADD_MAKEFILE_TARGET_DEP], [
# $1 = variable name # $1 = variable name
AC_DEFUN([AX_SUBST], [ AC_DEFUN([AX_SUBST], [
AC_SUBST([$1]) AC_SUBST([$1])
tmp_var=$(echo "${$1}" | awk 1 ORS='\\n') tmp_var=$(echo "${$1}" | awk 1 ORS='\\n' | sed 's,\\n$,,')
tmp_var=${tmp_var//\"/\\\"} tmp_var=${tmp_var//\"/\\\"}
tmp_var=${tmp_var//\'/\'\"\'\"\'} tmp_var=${tmp_var//\'/\'\"\'\"\'}
tmp_var=${tmp_var//#/\\#} tmp_var=${tmp_var//#/\\#}
@ -108,7 +116,28 @@ AC_DEFUN([AX_SUBST], [
# #
# configures the basic environment # configures the basic environment
AC_DEFUN([AX_INIT_STANDARD_PROJECT], [ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [
AM_CPPFLAGS+=" '-DMAKE_STRING(X)=\#X' '-DNAMESPACE=${PACKAGE_NAME}'" 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(NUMBERS)
AX_SUBST(HOME) AX_SUBST(HOME)
README=$(tail -n +3 README) README=$(tail -n +3 README)
@ -120,11 +149,20 @@ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [
AUTHOR=$(head -1 AUTHORS) AUTHOR=$(head -1 AUTHORS)
AX_SUBST(AUTHOR) AX_SUBST(AUTHOR)
_AM_SUBST_NOTMAKE([AUTHOR]) _AM_SUBST_NOTMAKE([AUTHOR])
DISTRO=$(lsb_release -sc) DISTRO=$(lsb_release -sc 2>/dev/null || uname -s 2>/dev/null)
AX_SUBST(DISTRO) 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} BUILD_NUMBER=${BUILD_NUMBER:-1}
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 "${PROJECT_NAME}-logo.png"; then
PROJECT_LOGO="${PROJECT_NAME}-logo.png" PROJECT_LOGO="${PROJECT_NAME}-logo.png"
@ -134,14 +172,45 @@ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [
PROJECT_ICON="${PROJECT_NAME}-icon.png" PROJECT_ICON="${PROJECT_NAME}-icon.png"
fi fi
AX_SUBST(PROJECT_ICON) 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]) 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])
AX_ADD_MAKEFILE_TARGET_DEP([maintainer-clean-am], [maintainer-clean-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 test -f makefile.in && cat >> makefile.in <<EOF
#### Begin: Appended by $0 #### Begin: Appended by $0
EXTRA_DIST = bootstrap.sh EXTRA_DIST += bootstrap.sh ax_init_standard_project.m4 ax_cxx_compile_stdcxx_11.m4 \
doc_DATA = AUTHORS NEWS README COPYING INSTALL ChangeLog ax_check_qt.m4 resolve-debbuilddeps.sh resolve-rpmbuilddeps.sh \
build-resource-file.sh mac-create-app-bundle.sh
clean-standard-project-targets: clean-standard-project-targets:
-rm -rf \${PACKAGE_NAME}-\${PACKAGE_VERSION} -rm -rf \${PACKAGE_NAME}-\${PACKAGE_VERSION}
-rm \${PACKAGE_TARNAME}-\${PACKAGE_VERSION}.tar.gz -rm \${PACKAGE_TARNAME}-\${PACKAGE_VERSION}.tar.gz
@ -167,42 +236,29 @@ AC_DEFUN([AX_USE_CXX], [
AM_CPPFLAGS+=' -I ${top_srcdir}/src -I ${top_builddir}/src -I ${srcdir} -I ${builddir}' AM_CPPFLAGS+=' -I ${top_srcdir}/src -I ${top_builddir}/src -I ${srcdir} -I ${builddir}'
AM_LDFLAGS+=' -L ${top_srcdir}/src -L ${top_builddir}/src' AM_LDFLAGS+=' -L ${top_srcdir}/src -L ${top_builddir}/src'
# Get rid of that stupid -O2 -g opions! # Get rid of those stupid -g -O2 options!
CXXFLAGS="${CXXFLAGS:-}" CXXFLAGS="${CXXFLAGS//-g -O2/}"
CFLAGS="${CFLAGS//-g -O2/}"
# pass compile flags to make distcheck # pass compile flags to make distcheck
AM_DISTCHECK_CONFIGURE_FLAGS="CXXFLAGS='${CXXFLAGS}' CPPFLAGS='${CPPFLAGS}' CFLAGS='${CFLAGS}' LDFLAGS='${LDFLAGS}'" AM_DISTCHECK_CONFIGURE_FLAGS="CXXFLAGS='${CXXFLAGS}' CPPFLAGS='${CPPFLAGS}' CFLAGS='${CFLAGS}' LDFLAGS='${LDFLAGS}'"
AC_SUBST(AM_DISTCHECK_CONFIGURE_FLAGS) AC_SUBST(AM_DISTCHECK_CONFIGURE_FLAGS)
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
MINGW32=no
MAC=no
case $host_os in
*mingw32*) MINGW32=yes;;
*darwin* | *rhapsody* | *macosx*) MAC=yes;;
esac
AM_CONDITIONAL(MINGW32, test "$MINGW32" = "yes")
AM_CONDITIONAL(MAC, test "$MAC" = "yes")
AC_SUBST(AM_CXXFLAGS) AC_SUBST(AM_CXXFLAGS)
AC_SUBST(AM_CPPFLAGS) AC_SUBST(AM_CPPFLAGS)
AC_SUBST(AM_LDFLAGS) AC_SUBST(AM_LDFLAGS)
AX_ADD_MAKEFILE_TARGET_DEP([maintainer-clean-am], [maintainer-clean-cxx-targets], [src/makefile.in]) 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 test -f src/makefile.in && cat >> src/makefile.in <<EOF
#### Begin: Appended by $0 #### 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: maintainer-clean-cxx-targets:
-rm makefile.in -rm makefile.in
#### End: $0 #### End: $0
@ -239,12 +295,24 @@ maintainer-clean-example-targets:
EOF 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 # use this in configure.ac to support C++ libraries
AC_DEFUN([AX_USE_LIBTOOL], [ AC_DEFUN([AX_USE_LIBTOOL], [
# libtool versioning # libtool versioning
LIB_MAJOR=m4_eval(x_major+x_minor) LIB_MAJOR=m4_eval(x_major+x_minor+x_minor_diff)
LIB_MINOR=x_least LIB_MINOR=x_least
LIB_LEAST=x_minor_fixed LIB_LEAST=m4_eval(x_minor+x_minor_diff)
LIB_VERSION="${LIB_MAJOR}:${LIB_MINOR}:${LIB_LEAST}" LIB_VERSION="${LIB_MAJOR}:${LIB_MINOR}:${LIB_LEAST}"
AM_LDFLAGS="-version-info ${LIB_VERSION}" AM_LDFLAGS="-version-info ${LIB_VERSION}"
AC_SUBST(AM_LDFLAGS) AC_SUBST(AM_LDFLAGS)
@ -290,14 +358,16 @@ EOF
# use this in configure.ac to support RPM packages # use this in configure.ac to support RPM packages
AC_DEFUN([AX_USE_RPM_PACKAGING], [ AC_DEFUN([AX_USE_RPM_PACKAGING], [
# m4_include(ax_rpm_rules.m4)
AC_CONFIG_FILES([${PACKAGE_NAME}.spec]) AC_CONFIG_FILES([${PACKAGE_NAME}.spec])
#AX_ADD_MAKEFILE_TARGET_DEP([clean-am], [clean-debian-targets], [makefile.in]) #AX_ADD_MAKEFILE_TARGET_DEP([clean-am], [clean-rpm-targets], [makefile.in])
AX_ADD_MAKEFILE_TARGET_DEP([.PHONY], [rpm], [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
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
distclean-rpm-targets:
-rm \${PACKAGE_NAME}.spec
#### End: $0 #### End: $0
EOF EOF
]) ])
@ -343,7 +413,7 @@ doc: doxyfile
clean-documentation: clean-documentation:
-rm doxygen.errors @PDF_DOC@ -rm doxygen.errors @PDF_DOC@
distclean-documentation: distclean-documentation:
-rm -r html latex -rm -r html
-rm @PACKAGE_NAME@.doxytag -rm @PACKAGE_NAME@.doxytag
maintainer-clean-documentation: maintainer-clean-documentation:
-rm makefile.in -rm makefile.in
@ -353,7 +423,7 @@ install-data-documentation:
cp -r html \$(DESTDIR)\${docdir}/ cp -r html \$(DESTDIR)\${docdir}/
uninstall-documentation: uninstall-documentation:
-chmod -R u+w \$(DESTDIR)\${docdir} -chmod -R u+w \$(DESTDIR)\${docdir}
-rm -rf \$(DESTDIR)\${docdir}/* -rm -rf \$(DESTDIR)\${docdir}/html
#### End: $0 #### End: $0
EOF EOF
]) ])
@ -361,9 +431,11 @@ EOF
# require a specific package, with fallback: test for a header # require a specific package, with fallback: test for a header
# - parameter: # - parameter:
# $1 = unique id (no special characters) # $1 = unique id (no special characters)
# $2 = module name # $2 = module name (optional, if different from id)
# $3 = a header file to find (optional) # $3 = a header file to find (optional)
# $4 = alternative module names (space separated, 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 # uses PKG_CHECK_MODULES to test for a module
# then, if given, looks for the header file # then, if given, looks for the header file
@ -372,109 +444,127 @@ EOF
# fails if not found # fails if not found
AC_DEFUN([AX_PKG_REQUIRE], [ AC_DEFUN([AX_PKG_REQUIRE], [
PKG_PROG_PKG_CONFIG PKG_PROG_PKG_CONFIG
PKG_CHECK_MODULES([$1], [$2], [ optional_flags="$5"
if test -n "$3"; then $1_found=no
$1_found=0; secondpar="m4_default([$2], [$1])"
for p in ${$1_CFLAGS}; do PKG_CHECK_MODULES([$1], [m4_default([$2], [$1])], [
if test -e ${p#-I}/$3; then $1_found=$secondpar
$1_found=1 PKG_REQUIREMENTS+=" $secondpar"
break
fi
done
if test ${$1_found} -eq 0; then
for p in /usr/include ${$1_CFLAGS}; do
$1_file=$(find ${p#-I} -name $3)
if test -e "${$1_file}"; then
AC_MSG_NOTICE([Header file $3 found in sub path as ${$1_file}])
$1_CFLAGS="${$1_CFLAGS} -I${$1_file%/$3}"
$1_found=1
break
fi
done
fi
if test ${$1_found} -eq 0; then
AC_MSG_WARN([Header file $3 not found in $1_CFLAGS = ${$1_CFLAGS}])
fi
fi
AM_CPPFLAGS+=" ${$1_CFLAGS}"
AM_CXXFLAGS+=" ${$1_CFLAGS}"
LIBS+=" ${$1_LIBS}"
if test -z "$PKG_REQUIREMENTS"; then
PKG_REQUIREMENTS="$2"
else
PKG_REQUIREMENTS="${PKG_REQUIREMENTS}, $2"
fi
], [ ], [
AC_MSG_WARN([Recommended package $2 for feature $1 not installed])
if test -n "$4"; then if test -n "$4"; then
AC_MSG_WARN([Recommended package $secondpar for feature $1 not installed, trying $4])
for pkg in $4; do for pkg in $4; do
PKG_CHECK_MODULES([$1], [$pkg], [ PKG_CHECK_MODULES([$1], [$pkg], [
if test -n "$3"; then PKG_REQUIREMENTS+=" $pkg"
$1_found=0; $1_found=$pkg
for p in ${$1_CFLAGS}; do break;
if test -e ${p#-I}/$3; then
$1_found=1
break
fi
done
if test ${$1_found} -eq 0; then
for p in /usr/include ${$1_CFLAGS}; do
$1_file=$(find ${p#-I} -name $3)
if test -e ${$1_file}; then
AC_MSG_NOTICE([Header file $3 found in sub path as ${$1_file}])
$1_CFLAGS="${$1_CFLAGS} -I${$1_file%/$3}"
$1_found=1
break
fi
done
fi
if test ${$1_found} -eq 0; then
AC_MSG_WARN([Header file $3 not found in $1_CFLAGS = ${$1_CFLAGS}])
fi
fi
AM_CPPFLAGS+=" ${$1_CFLAGS}"
AM_CXXFLAGS+=" ${$1_CFLAGS}"
LIBS+=" ${$1_LIBS}"
if test -z "$PKG_REQUIREMENTS"; then
PKG_REQUIREMENTS="$pkg"
else
PKG_REQUIREMENTS="${PKG_REQUIREMENTS}, $pkg"
fi
], [ ], [
AC_MSG_WARN([Recommended package $pkg for feature $1 not installed]) AC_MSG_WARN([Recommended package $pkg for feature $1 not installed])
]) ])
done done
fi fi
]) ])
AC_SUBST(AM_CPPFLAGS) AC_SUBST(CPPFLAGS)
AC_SUBST(AM_CXXFLAGS) AC_SUBST(CXXFLAGS)
AC_SUBST(PKG_REQUIREMENTS) AC_SUBST(PKG_REQUIREMENTS)
if test -n "$3"; then 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} old_CPPFLAGS=${CPPFLAGS}
CPPFLAGS=" ${$1_CFLAGS} ${CPPFLAGS}" CPPFLAGS=" ${$1_CFLAGS} ${CPPFLAGS}"
AC_CHECK_HEADER([$3], [ AC_CHECK_HEADER([$3], [
$1_found=${tmp_package}
], [ ], [
AC_MSG_ERROR([Required header $3 for feature $1 not found]) 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} CPPFLAGS=${old_CPPFLAGS}
fi 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 # check if a specific package exists
# - parameter: # - parameter:
# $1 = unique id (no special characters) # $1 = unique id (no special characters)
# $2 = module name (optional, if different from id) # $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 # uses PKG_CHECK_MODULES to test for a module
# sets automake conditional HAVE_$1 to 0 (not found) or 1 (found) # sets automake conditional HAVE_$1 to 0 (not found) or 1 (found)
# sets all flags, so that the module can be used everywhere # sets all flags, so that the module can be used everywhere
AC_DEFUN([AX_PKG_CHECK], [ AC_DEFUN([AX_PKG_CHECK], [
optional_flags="$3"
PKG_PROG_PKG_CONFIG PKG_PROG_PKG_CONFIG
PKG_CHECK_MODULES([$1], [m4_default([$2], [$1])], [ PKG_CHECK_MODULES([$1], [m4_default([$2], [$1])], [
HAVE_$1=1 HAVE_$1=1
AM_CPPFLAGS+=" ${$1_CFLAGS}" [$1]_CPPFLAGS="${$1_CFLAGS}"
AM_CXXFLAGS+=" ${$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}" 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 if test -z "$PKG_REQUIREMENTS"; then
PKG_REQUIREMENTS="m4_default([$2], [$1])" PKG_REQUIREMENTS="m4_default([$2], [$1])"
else else
@ -483,9 +573,126 @@ AC_DEFUN([AX_PKG_CHECK], [
], [ ], [
HAVE_$1=0 HAVE_$1=0
]) ])
AM_CONDITIONAL(HAVE_$1, test $HAVE_$1 -eq 1) AM_CONDITIONAL(HAVE_$1, test $HAVE_[$1] -eq 1)
AC_SUBST(HAVE_$1) AC_SUBST(HAVE_$1)
AC_SUBST(AM_CPPFLAGS) AC_SUBST(CPPFLAGS)
AC_SUBST(AM_CXXFLAGS) AC_SUBST(CXXFLAGS)
AC_SUBST(PKG_REQUIREMENTS) 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])
])

@ -17,9 +17,9 @@
MY_NAME=${0##*/} MY_NAME=${0##*/}
PROJECT_PATH=$(pwd) PROJECT_PATH=$(pwd)
DEFAULT_PROJECT_NAME=${PROJECT_PATH##*/} DEFAULT_PROJECT_NAME=${PROJECT_PATH##*/}
configure=0 configure=0
build=0 build=0
buildtarget="distcheck"
overwrite=0 overwrite=0
rebuild=0 rebuild=0
rebuildfiles=() rebuildfiles=()
@ -27,6 +27,7 @@ while test $# -gt 0; do
case "$1" in case "$1" in
(--configure|-c) configure=1;; (--configure|-c) configure=1;;
(--build|-b) configure=1; build=1;; (--build|-b) configure=1; build=1;;
(--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");;
@ -41,7 +42,8 @@ SYNOPSIS
OPTIONS OPTIONS
--configure, -c call ./configure after initialization --configure, -c call ./configure after initialization
--build, -c build, also call ./configure && make --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) --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)
@ -101,12 +103,19 @@ GENERATED FILES
* 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-rpmbuilddeps.sh - script to install RPM package dependencies
* 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 * 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 * configure.ac - global configuration file template
* makefile.am - global makefile template * makefile.am - global makefile template
* 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
* html/makefile.am - if you enabled AX_BUILD_HTML
* scripts/makefile.in - if you enabled AX_USE_SCRIPTS * scripts/makefile.in - if you enabled AX_USE_SCRIPTS
* doc/makefile.am - if you enabled AX_USE_DOXYGEN * doc/makefile.am - if you enabled AX_USE_DOXYGEN
* doc/doxyfile.in - if you enabled AX_USE_DOXYGEN * doc/doxyfile.in - if you enabled AX_USE_DOXYGEN
@ -121,6 +130,7 @@ GENERATED FILES
* debian/${DEFAULT_PROJECT_NAME}-dev.dirs - 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/rules - if you enabled AX_USE_DEBIAN_PACKAGING
* debian/compat - 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 * src/${DEFAULT_PROJECT_NAME}.pc.in - if you enabled AX_USE_LIBTOOL
REBUILDING FILES REBUILDING FILES
@ -144,9 +154,11 @@ FILES TO EDIT
The following files normally require editing: The following files normally require editing:
* AUTHORS * AUTHORS
* NEWS
* README * README
* configure.ac * configure.ac
* src/makefile.am * src/makefile.am
* html/makefile.am
* test/makefile.am * test/makefile.am
* examples/makefile.am * examples/makefile.am
@ -156,19 +168,23 @@ FILE DEPENDENCIES
configuration a dependent, i.e.: configuration a dependent, i.e.:
* test/makefile.am depends on AX_USE_LIBTOOL * test/makefile.am depends on AX_USE_LIBTOOL
* html/makefile.am depends on AX_BUILD_HTML
* doc/doxyfile.in depends on AX_BUILD_EXAMPLES * doc/doxyfile.in depends on AX_BUILD_EXAMPLES
* debian/control.in depends on AX_USE_DOXYGEN, AX_USE_CPPUNIT, * debian/control.in depends on AX_USE_DOXYGEN, AX_USE_CPPUNIT,
AX_CXX_QT, AX_CXX_CHECK_QT, AX_USE_LIBTOOL 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}.install depends on AX_USE_LIBTOOL
* debian/${DEFAULT_PROJECT_NAME}.dirs 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.install depends on AX_USE_LIBTOOL
* debian/${DEFAULT_PROJECT_NAME}-dev.dirs 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 FILES
* AUTHORS: First line is the main author and used in Debian and RPM * AUTHORS: First line is the main author and used in Debian and RPM
packaging, so there must be a GPG key that matches packaging, so there must be a GPG key that matches
to this line. to this line.
* NEWS: File to add project news.
* README: First line is a short description of your project, then an * README: First line is a short description of your project, then an
empty line must follow. All remaining lines are a empty line must follow. All remaining lines are a
long description of your project. this information long description of your project. this information
@ -189,7 +205,7 @@ FILES
* Enable Scripts: AX_USE_SCRIPTS * Enable Scripts: AX_USE_SCRIPTS
* Enable Doxygen documentation generation: AX_USE_DOXYGEN * Enable Doxygen documentation generation: AX_USE_DOXYGEN
* Enable Debian packaging by calling "make deb": AX_USE_DEBIAN_PACKAGING * Enable Debian packaging by calling "make deb": AX_USE_DEBIAN_PACKAGING
* Not yet implemented: AX_USE_RPM_PACKAGING * Enable RPM packaging by calling "make rpm": AX_USE_RPM_PACKAGING
* Enable C++ testing using CppUnit: AX_USE_CPPUNIT * Enable C++ testing using CppUnit: AX_USE_CPPUNIT
* Enable C++ examples, i.e. for libraries: AX_BUILD_EXAMPLES * 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) * Check for C++11 support: AX_CXX_COMPILE_STDCXX_11 (see ax_cxx_compile_stdcxx_11.m4)
@ -266,7 +282,8 @@ run() {
} }
testtag() { testtag() {
egrep -q '^ *'"$1" configure.ac local IFS="|"
egrep -q '^ *'"($*)" configure.ac
} }
contains() { contains() {
@ -295,7 +312,7 @@ to() {
mode="u=rw,g=rw,o=r" 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" configure.ac; then if ! testtag "$1"; then
return return
fi;; fi;;
(--mode) shift # test for a tag, abort if not set (--mode) shift # test for a tag, abort if not set
@ -304,7 +321,7 @@ to() {
esac esac
shift; shift;
done done
if checkfile "$1" && test $rebuild -eq 0 \ if checkfile "$1" && test $rebuild -eq 0 -o "$1" = "configure.ac" \
&& ! contains "$1" "${rebuildfiles[@]}"; then && ! contains "$1" "${rebuildfiles[@]}"; then
# file already exists and must not be rebuilt # file already exists and must not be rebuilt
return 1 return 1
@ -371,18 +388,32 @@ copy ${MY_NAME}
copy ax_init_standard_project.m4 copy ax_init_standard_project.m4
copy ax_cxx_compile_stdcxx_11.m4 copy ax_cxx_compile_stdcxx_11.m4
copy ax_check_qt.m4 copy ax_check_qt.m4
copy resolve-debbuilddeps.sh
copy resolve-rpmbuilddeps.sh
copy build-resource-file.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
AUTHOR="FIRSTNAME LASTNAME (URL) <EMAIL>" AUTHOR="FIRSTNAME LASTNAME (URL) <EMAIL>"
fi fi
echo "$AUTHOR" | to AUTHORS && notice "please edit AUTHORS" 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 && \ to configure.ac <<EOF && \
( notice "please edit configure.ac, then rerun $0"; exit 0 ) ( notice "please edit configure.ac, then rerun $0"; exit 0 )
${HEADER}m4_define(x_package_name, ${DEFAULT_PROJECT_NAME}) # project's name ${HEADER}m4_define(x_package_name, ${DEFAULT_PROJECT_NAME}) # project's name
m4_define(x_major, 0) # project's major version m4_define(x_major, 0) # project's major version
m4_define(x_minor, 0) # project's minor version m4_define(x_minor, 0) # project's minor version
m4_include(ax_init_standard_project.m4) m4_include(ax_init_standard_project.m4)
AC_INIT(x_package_name, x_version, x_package_name) AC_INIT(x_package_name, x_version, x_bugreport, x_package_name)
AM_INIT_AUTOMAKE([1.9 tar-pax]) AM_INIT_AUTOMAKE([1.9 tar-pax])
AX_INIT_STANDARD_PROJECT AX_INIT_STANDARD_PROJECT
@ -395,16 +426,92 @@ AX_INIT_STANDARD_PROJECT
#AX_USE_RPM_PACKAGING #AX_USE_RPM_PACKAGING
#AX_USE_CPPUNIT #AX_USE_CPPUNIT
#AX_BUILD_EXAMPLES #AX_BUILD_EXAMPLES
#AX_BUILD_HTML
# qt features, uncomment, what you need: # qt features, uncomment, what you need:
#AX_CHECK_QT([QT], [QtCore QtGui QtNetwork], [QtWidgets]) #AX_CHECK_QT([QT], [QtCore QtGui QtNetwork], [QtWidgets])
#AX_REQUIRE_QT([QT], [QtCore QtGui QtNetwork], [QtWidgets])
#AX_QT_NO_KEYWORDS #AX_QT_NO_KEYWORDS
# create output # create output
AC_OUTPUT AC_OUTPUT
EOF EOF
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)
echo "${HEADER}MAINTAINERCLEANFILES = makefile.in" | to --condition AX_USE_CXX src/makefile.am if ! testtag "AX_CHECK_QT" configure.ac && \
! testtag "AX_REQUIRE_QT" configure.ac; then
echo "${HEADER}MAINTAINERCLEANFILES = makefile.in" | \
to --condition AX_USE_CXX src/makefile.am
else
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 = ${swisssign_pin_entry_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
fi
to --condition AX_USE_CXX src/version.hxx <<EOF to --condition AX_USE_CXX src/version.hxx <<EOF
/*! @file /*! @file
@ -485,22 +592,30 @@ EOF
echo "${HEADER}MAINTAINERCLEANFILES = makefile.in" | to --condition AX_USE_SCRIPTS scripts/makefile.am echo "${HEADER}MAINTAINERCLEANFILES = makefile.in" | to --condition AX_USE_SCRIPTS scripts/makefile.am
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
to --condition AX_USE_CPPUNIT test/makefile.am <<EOF to --condition AX_USE_CPPUNIT test/makefile.am <<EOF
${HEADER}AM_CPPFLAGS = -I${top_srcdir}/src -I${top_builddir}/src ${HEADER}AM_CPPFLAGS = -I\${top_srcdir}/src -I\${top_builddir}/src
AM_LDFLAGS = -L${top_builddir}/src/.libs AM_LDFLAGS = -L\${abs_top_builddir}/src/.libs
LDADD = -l${PACKAGE_NAME} LDADD = -l${PACKAGE_NAME#lib}
MAINTAINERCLEANFILES = makefile.in MAINTAINERCLEANFILES = makefile.in
EOF EOF
to --condition AX_BUILD_EXAMPLES examples/makefile.am <<EOF to --condition AX_BUILD_EXAMPLES examples/makefile.am <<EOF
${HEADER}AM_CPPFLAGS = -I${top_srcdir}/src -I${top_builddir}/src ${HEADER}AM_CPPFLAGS = -I\${top_srcdir}/src -I\${top_builddir}/src
AM_LDFLAGS = -L${top_builddir}/src/.libs AM_LDFLAGS = -L\${abs_top_builddir}/src/.libs
LDADD = -l${PACKAGE_NAME} LDADD = -l${PACKAGE_NAME#lib}
MAINTAINERCLEANFILES = makefile.in MAINTAINERCLEANFILES = makefile.in
EOF EOF
if testtag AX_USE_DOXYGEN && \ to --condition AX_BUILD_HTML html/makefile.am <<EOF
( ! checkfile doc/doxyfile.in || \ ${HEADER}EXTRA_DIST = \${www_DATA}
contains doc/doxyfile.in "${rebuildfiles[@]}" ); then
wwwdir = \${pkgdatadir}/html
www_DATA =
MAINTAINERCLEANFILES = makefile.in
EOF
if testtag AX_USE_DOXYGEN; then
if ! checkfile doc/doxyfile.in || \
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 run svn add doc/doxyfile.in
@ -539,11 +654,13 @@ if testtag AX_USE_DOXYGEN && \
if testtag AX_USE_SCRIPTS; then if testtag AX_USE_SCRIPTS; then
doxyadd INPUT "@top_srcdir@/scripts" doxyadd INPUT "@top_srcdir@/scripts"
fi fi
if testtag AX_BUILD_HTML; then
doxyadd INPUT "@top_srcdir@/html"
fi
if testtag AX_USE_CPPUNIT; then if testtag 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' 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'
doxyadd FILE_PATTERNS *.wt
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
@ -571,6 +688,7 @@ if testtag AX_USE_DOXYGEN && \
doxyreplace INTERACTIVE_SVG YES doxyreplace INTERACTIVE_SVG YES
doxyreplace DOT_TRANSPARENT YES doxyreplace DOT_TRANSPARENT YES
fi fi
fi
if testtag AX_USE_DEBIAN_PACKAGING; then if testtag AX_USE_DEBIAN_PACKAGING; then
checkdir debian checkdir debian
to debian/changelog.in <<EOF to debian/changelog.in <<EOF
@ -584,10 +702,11 @@ EOF
Source: @PACKAGE_NAME@ Source: @PACKAGE_NAME@
Priority: extra Priority: extra
Maintainer: @AUTHOR@ Maintainer: @AUTHOR@
Build-Depends: debhelper, pkg-config, autotools-dev, lsb-release $(if testtag AX_USE_DOXYGEN; then echo -n ", doxygen, graphviz"; fi; if testtag AX_USE_CPPUNIT; then echo -n ", libcppunit-dev"; fi; if testtag AX_CXX_QT || testtag AX_CXX_CHECK_QT; then echo -n ", qtbase5-dev | libqt4-dev, qtbase5-dev-tools | qt4-dev-tools"; fi) Build-Depends: debhelper, subversion, pkg-config, 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 | qt4-default | 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)
Package: @PACKAGE_NAME@ Package: @PACKAGE_NAME@
$(if testtag AX_USE_LIBTOOL; then echo "Section: libs"; fi)Architecture: any Section: $(if testtag AX_USE_LIBTOOL; then echo "libs"; fi)
Architecture: any
Depends: \${shlibs:Depends}, \${misc:Depends} Depends: \${shlibs:Depends}, \${misc:Depends}
Description: @DESCRIPTION@ Description: @DESCRIPTION@
@README_DEB@ @README_DEB@
@ -616,6 +735,7 @@ usr/lib/lib*.a
usr/lib/lib*.so usr/lib/lib*.so
usr/lib/pkgconfig/* usr/lib/pkgconfig/*
usr/lib/*.la usr/lib/*.la
usr/share/${PACKAGE_NAME}
usr/share/doc/${PACKAGE_NAME}/html usr/share/doc/${PACKAGE_NAME}/html
EOF EOF
to --mode "u=rwx,g=rwx,o=rx" debian/rules <<EOF to --mode "u=rwx,g=rwx,o=rx" debian/rules <<EOF
@ -624,13 +744,131 @@ ${HEADER}%:
EOF EOF
echo 7 | to debian/compat echo 7 | to debian/compat
fi fi
to --condition AX_USE_RPM_PACKAGING ${PACKAGE_NAME}.spec.in <<EOF
Summary: @DESCRIPTION@
Name: @PACKAGE_NAME@
Version: @VERSION@
Release: @BUILD_NUMBER@%{?dist}
License: LGPL
Group: $(if testtag AX_USE_LIBTOOL; then
echo Development/Libraries/C++;
else
echo Applications/...;
fi)
Source0: %{name}-%{version}.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
BuildRequires: gnupg, subversion, automake, autoconf$(
if testtag AX_USE_DOXYGEN; then
echo -n ", doxygen";
fi)
%if 0%{?fedora} != 20
$(if testtag AX_USE_DOXYGEN; then echo -n "BuildRequires: graphviz"; fi)
%endif
%if 0%{?fedora} || 0%{?rhel} || 0%{?rhl} || 0%{?centos} || 0%{?centos_ver} || 0%{?centos_version}
BuildRequires: pkgconfig, redhat-lsb$(
if testtag AX_USE_CPPUNIT; then
echo -n ", cppunit-devel";
fi)
%if ! ( 0%{?centos} || 0%{?centos_ver} || 0%{?centos_version} )
$(if testtag AX_USE_DOXYGEN; then echo -n "BuildRequires: mscgen"; fi)
$(if testtag AX_REQUIRE_QT || testtag AX_CHECK_QT AX_REQUIRE_QT; then echo -n "BuildRequires: qt5-qtbase-devel, qt5-qttools, qt5-qtwebkit-devel"; fi)
%else
$(if testtag AX_REQUIRE_QT || testtag AX_CHECK_QT AX_REQUIRE_QT; then echo -n "BuildRequires: qt-devel"; fi)
%endif
%else%if 0%{?suse_version} || 0%{?sles_version}
BuildRequires: pkg-config, lsb-release$(
if testtag AX_USE_CPPUNIT; then
echo -n ", libcppunit-devel";
fi)
%if 0%{?suse_version} < 1200 || 0%{?sles_version} < 1200
$(if testtag AX_REQUIRE_QT || testtag AX_CHECK_QT AX_REQUIRE_QT; then echo -n "BuildRequires: libqt4-devel, qt4-x11-tools, libQtWebKit-devel"; fi)
%else
$(if testtag AX_REQUIRE_QT || testtag AX_CHECK_QT AX_REQUIRE_QT; then echo -n "BuildRequires: libqt5-qtbase-devel, libqt5-qttools, libQt5WebKit5-devel"; fi)
%endif
%endif%endif
%description
@README@
$(if testtag AX_USE_LIBTOOL; then
echo
echo This package contains only the shared libraries required at runtime.
fi)
%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,-)
$(if testtag AX_USE_LIBTOOL; then
echo '/usr/%_lib/@PACKAGE_NAME@.so.*'
else
echo '/usr/bin/*'
fi)
%doc
$(if testtag AX_USE_LIBTOOL; then
cat <<EOF2
/usr/share/doc/packages/@PACKAGE_NAME@/AUTHORS
/usr/share/doc/packages/@PACKAGE_NAME@/COPYING
/usr/share/doc/packages/@PACKAGE_NAME@/ChangeLog
/usr/share/doc/packages/@PACKAGE_NAME@/INSTALL
/usr/share/doc/packages/@PACKAGE_NAME@/NEWS
/usr/share/doc/packages/@PACKAGE_NAME@/README
EOF2
else
echo '/usr/share/*'
fi)
$(if testtag AX_USE_LIBTOOL; then
cat <<EOF2
%package devel
Summary: @DESCRIPTION@
Group: Development/Libraries/C++
Requires: @PACKAGE_NAME@ = @VERSION@
%description devel
@README@
This Package contains all files required for developement.
%files devel
%defattr(-,root,root,-)
/usr/%_lib/@PACKAGE_NAME@.so
/usr/%_lib/@PACKAGE_NAME@.a
/usr/%_lib/@PACKAGE_NAME@.la
/usr/%_lib/pkgconfig
/usr/include/*
%doc
/usr/share/@PACKAGE_NAME@
/usr/share/doc/packages/@PACKAGE_NAME@/html
EOF2
fi)
%changelog
EOF
SUBDIRS="" SUBDIRS=""
for d in src test scripts doc examples; do for d in src test scripts doc examples html; do
test -d $d && SUBDIRS="${SUBDIRS} $d" test -d $d && SUBDIRS="${SUBDIRS} $d"
done done
to makefile.am<<EOF to makefile.am<<EOF
${HEADER}SUBDIRS =${SUBDIRS} ${HEADER}SUBDIRS =${SUBDIRS}
doc_DATA = AUTHORS NEWS README COPYING INSTALL ChangeLog
MAINTAINERCLEANFILES = makefile.in MAINTAINERCLEANFILES = makefile.in
EOF EOF
to --condition AX_USE_LIBTOOL src/${PACKAGE_NAME}.pc.in <<EOF to --condition AX_USE_LIBTOOL src/${PACKAGE_NAME}.pc.in <<EOF
@ -638,11 +876,12 @@ ${HEADER}prefix=@prefix@
exec_prefix=@exec_prefix@ exec_prefix=@exec_prefix@
libdir=\${exec_prefix}/lib libdir=\${exec_prefix}/lib
includedir=\${prefix}/include includedir=\${prefix}/include
translationsdir=@datadir@/@PACKAGE_NAME@/translations
Name: @PACKAGE_NAME@ Name: @PACKAGE_NAME@
Description: @DESCRIPTION@ Description: @DESCRIPTION@
Version: @VERSION@ Version: @VERSION@
Libs: -L\${libdir} -l@PACKAGE_NAME@ @LDFLAGS@ Libs: -L\${libdir} -l${PACKAGE_NAME#lib} @LDFLAGS@
Cflags: -I\${includedir} @CPPFLAGS@ Cflags: -I\${includedir} @CPPFLAGS@
Requires: @PKG_REQUIREMENTS@ Requires: @PKG_REQUIREMENTS@
EOF EOF
@ -653,8 +892,9 @@ if test -f makefile; then
fi fi
#### Bootstrap Before Configure #### #### Bootstrap Before Configure ####
run --no-check svn2cl
run aclocal run aclocal
run libtoolize --force if testtag AX_USE_LIBTOOL; then run libtoolize --force; fi
run automake -a run automake -a
run autoconf run autoconf
@ -665,5 +905,5 @@ fi
#### Run Make If User Requires #### #### Run Make If User Requires ####
if test "$build" -eq 1; then if test "$build" -eq 1; then
make make $buildtarget
fi fi

@ -0,0 +1,31 @@
#! /bin/bash -ex
## @id $Id$
## build resource.qrc file from a resource directory
##
## Argument: $1: resource path (default: resources)
## Result: file named <resource-path>.qrc (default: resources.qrc)
##
## Call:
##
## cd src
## ../build-resource-file.sh
## 1 2 3 4 5 6 7 8
## 45678901234567890123456789012345678901234567890123456789012345678901234567890
RESOURCES=${1:-resources}
TARGET=${RESOURCES}.qrc
test -d ${RESOURCES}
echo "<RCC>" > ${TARGET}
for d in $(find resources -mindepth 1 -type d); do
echo " <qresource prefix=\"${d#${RESOURCES}/}\">" >> ${TARGET}
for f in $(find $d -mindepth 1 -maxdepth 1 -type f); do
echo " <file alias=\"${f##*/}\">$f</file>" >> ${TARGET}
done
echo " </qresource>" >> ${TARGET}
done
echo "</RCC>" >> ${TARGET}

@ -0,0 +1,103 @@
#!/bin/bash -ex
## @id $Id$
##
## Create Mac OS-X App Bundle from built file
##
## Parameters:
## $1: name of the app-target
## $2: name of the project
## $3: installation source
##
## 1 2 3 4 5 6 7 8
## 45678901234567890123456789012345678901234567890123456789012345678901234567890
if test "$(uname -s)" != "Darwin"; then
echo "**** ERROR: run on Mac OS-X: $0"
exit 1
fi
test -n "$1"
test -n "$2"
test -d "$3"
target="$(pwd)/${1}/Contents/MacOS"
# Step 1: create and fill app directory structure
mkdir -p ${1}/Contents/{Resources,MacOS}
! test -d ${3}/bin || \
find ${3}/bin -mindepth 1 -maxdepth 1 -exec mv {} ${1}/Contents/MacOS/ \;
executablefile=$(ls -1 ${1}/Contents/MacOS/ | head -1)
! test -d ${3}/lib || \
find ${3}/lib -mindepth 1 -maxdepth 1 -exec mv {} ${1}/Contents/MacOS/ \;
! test -d ${3}/share/${2} || \
find ${3}/share/${2} -mindepth 1 -maxdepth 1 -exec mv {} ${1}/Contents/Resources/ \;
! test -d ${3}/share/${2} || rmdir ${3}/share/${2}
! test -d ${3}/share || \
find ${3}/share -mindepth 1 -maxdepth 1 -exec mv {} ${1}/Contents/Resources/ \;
! test -d ${3}/bin || rmdir ${3}/bin
! test -d ${3}/lib || rmdir ${3}/lib
! test -d ${3}/share || rmdir ${3}/share
! test -d ${3} || \
find ${3} -mindepth 1 -maxdepth 1 -exec mv {} ${1}/Contents/Resources/ \;
! test -d ${3} || rmdir ${3}
! test -d ${1}/tmp || rm -r ${1}/tmp
# Step 2: copy qt plugins, if necessary
for f in ${QT_PLUGINS}; do
test -d ${target}/${f} \
|| cp -r ${QT_PLUGIN_PATH}/${f} ${target}/${f} \
|| exit 1
done
# Step 3: resolve all library dependencies
found=1
oldpath="$(pwd)"
while [ $found -ne 0 ]; do
found=0
cd "${target}"
for file in $(find . -type f); do
for lib in $(otool -L ${file} | tail -n +2 \
| egrep '/opt/local/|'"${HOME}" \
| grep -v $file | awk '{print $1}'); do
found=1
test -f ${lib##*/} \
|| ( \
cp ${lib} . \
&& chmod u+w ${lib##*/} \
) \
|| exit 1
install_name_tool -change ${lib} \
@executable_path/${lib##*/} ${file} \
|| exit 1
done
done
done
cd ${oldpath}
# Step 4: if necessary, install qt_menu.nib
if test -n "${QTDIR}"; then
MENU_NIB=$(find ${QTDIR} -name .svn -prune -o -name qt_menu.nib -print \
| head -1)
if test -e "${MENU_NIB}"; then
rsync -r "${MENU_NIB}" ${1}/Contents/Resources/
test -d ${1}/Contents/Resources/qt_menu.nib
fi
fi
# Step 5: copy or create info.plist
infoplist=$(find ${1}/Contents/Resources -name Info.plist)
if test -f "${infoplist}"; then
mv "${infoplist}" ${1}/Contents/Info.plist
else
cat > ${1}/Contents/Info.plist <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleIdentifier</key>
<string>${2}</string>
<key>CFBundleExecutable</key>
<string>${executablefile##/}</string>
</dict>
</plist>
EOF
fi

@ -0,0 +1,44 @@
#! /bin/bash -ex
## @id $Id$
## Resolve Debian Build Dependencies
## Installs all the required packages
## Call: ./resolve-debbuilddeps 'name of build schroot'
## e.g. call: ./resolve-debbuilddeps trusty_amd64
## 1 2 3 4 5 6 7 8
## 45678901234567890123456789012345678901234567890123456789012345678901234567890
SCHROOTNAME="$1"
sed 's,@[^@]*@, dummytext,g' debian/control.in > debian/control
if test -n "${SCHROOTNAME}"; then
DEPS=$(schroot -c "${SCHROOTNAME}" -- dpkg-checkbuilddeps 2>&1 || true)
else
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}')
for pa in ${DEPS}; do
success=0
for p in $(echo "${pa}" | sed 's,|, ,g'); do
if test -n "${SCHROOTNAME}"; then
if schroot -c "${SCHROOTNAME}" -u root -d / -- apt-get -y install ${p}; then
success=1
break;
fi
else
if sudo apt-get -y install ${p}; then
success=1
break;
fi
fi
done
if test ${success} -eq 0; then
echo "**** Error: Installation Failed: ${pa}"
fi
done
echo "**** Success: All Dependencies Resolved"

@ -0,0 +1,34 @@
#! /bin/bash -ex
## @id $Id$
## Resolve RPM Build Dependencies
## Installs all the required packages
## Call: ./resolve-rpmbuilddeps 'name of build schroot'
## e.g. call: ./resolve-rpmbuilddeps opensuse-13.2_x86_64
## 1 2 3 4 5 6 7 8
## 45678901234567890123456789012345678901234567890123456789012345678901234567890
SCHROOTNAME="$1"
PACKAGE_NAME=$(sed -n 's/^ *m4_define(x_package_name, \(.*\)).*/\1/p' configure.ac)
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')
if test -n "${FILES}"; then
schroot -c ${SCHROOTNAME} -u root -- yum install -y ${FILES} || \
schroot -c ${SCHROOTNAME} -u root -- zypper install -y ${FILES} || \
schroot -c ${SCHROOTNAME} -u root -- dnf install -y ${FILES}
fi
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')
if test -n "${FILES}"; then
yum install -y ${FILES} || \
zypper install -y ${FILES} || \
dnf install -y ${FILES}
fi
fi
echo "**** Success: All Dependencies Resolved"

@ -2234,7 +2234,11 @@ class For: public Command {
" <...>" " <...>"
"\n\n" "\n\n"
"Executes the given commands with the variable set to the specifier values," "Executes the given commands with the variable set to the specifier values,"
"repeated once per given value. Without values, it is simply a no operation.\n\n"; "repeated once per given value. The variable is treated like a local variale"
" in the loop.\n\n"
"Without values, if there is a global variable with the same name as the"
" local variable the global variable is parsed as if it were the line after"
" the dash (->).\n\n";
"If you quote the values, then quote all values with the same" "If you quote the values, then quote all values with the same"
" quotes. If you need a comma within a value, you must quote."; " quotes. If you need a comma within a value, you must quote.";
} }
@ -2242,17 +2246,28 @@ class For: public Command {
return tag()+" "+_variable+" "+_vals.join(" "); return tag()+" "+_variable+" "+_vals.join(" ");
} }
std::shared_ptr<Command> parse(Script*, QString args, std::shared_ptr<Command> parse(Script*, QString args,
QStringList&, QString, int, int) { QStringList& in, QString file, int line, int indent) {
std::shared_ptr<For> cmd(new For()); std::shared_ptr<For> cmd(new For());
if (!args.size()) throw BadArgument(tag()+" requires a <variable>"); if (!args.size()) throw BadArgument(tag()+" requires a <variable>");
QStringList allargs(args.split("->")); QStringList allargs(args.split("->"));
... cmd->_variable = allargs.takeFirst().trimmed();
cmd->_vals = commaSeparatedList(allargs.join(' '));
cmd->_script = std::shared_ptr<Script>(new Script);
cmd->_script->parse(subCommandBlock(in), file, line+1, indent+1);
return cmd; return cmd;
} }
bool execute(Script* script, QWebFrame* frame) { bool execute(Script* script, QWebFrame* frame) {
Logger log(this, script); Logger log(this, script);
Q_FOREACH(QString i, _vals.size()?_vals:commaSeparatedList(script->variable(_variable))) {
if (!runScript(this, _script, script, frame, QStringList()<<_variable, QStringList()<<i))
return false;
}
return true; return true;
} }
private:
QString _variable;
QStringList _vals;
std::shared_ptr<Script> _script;
}; };
/* Template: /* Template:
@ -2377,6 +2392,7 @@ inline void Script::initPrototypes() {
add(new TestSuite); add(new TestSuite);
add(new TestCase); add(new TestCase);
add(new Check); add(new Check);
add(new For);
} }
#endif #endif

Loading…
Cancel
Save