diff --git a/ChangeLog b/ChangeLog index ec7ea6c..b74188c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -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 * ChangeLog, ax_check_qt.m4, ax_init_standard_project.m4, diff --git a/ax_check_qt.m4 b/ax_check_qt.m4 index 61724b6..479f65c 100644 --- a/ax_check_qt.m4 +++ b/ax_check_qt.m4 @@ -1,16 +1,16 @@ # SYNOPSIS # # 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: -# 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 # # 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, # usually provided in uppercase, is used as prefix to the # variables holding the compiler flags and libraries reported by @@ -35,27 +35,46 @@ # 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} - $1=${$1:-$(pkg-config --variable=$2_location QtCore)} - $1=${$1:-$(pkg-config --variable=host_bins QtCore)/$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" > /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) + AM_CONDITIONAL(HAVE_$1, test $HAVE_[$1] -eq 1) if test $HAVE_$1 -eq 1; then AC_MSG_RESULT([$$1]) else @@ -73,55 +92,50 @@ AC_DEFUN([AX_CXX_QT_TOOLS], [ 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], [ 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]) - 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}" - AM_CXXFLAGS+=" ${[$1]5_CFLAGS}" - LIBS+=" ${[$1]5_LIBS}" - modules=${qt_modules//Qt/Qt5} - if test -z "$PKG_REQUIREMENTS"; then - PKG_REQUIREMENTS="${modules// /, }" + [$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 - PKG_REQUIREMENTS="${PKG_REQUIREMENTS}, ${modules// /, }" + 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}], [ - AM_CPPFLAGS+=" ${[$1]5_OPTIONAL_CFLAGS}" MOC_FLAGS+=" ${[$1]5_OPTIONAL_CFLAGS}" - AM_CXXFLAGS+=" ${[$1]5_OPTIONAL_CFLAGS}" - LIBS+=" ${[$1]5_OPTIONAL_LIBS}" - modules=${qt_modules_optional//Qt/Qt5} - if test -z "$PKG_REQUIREMENTS"; then - PKG_REQUIREMENTS="${modules// /, }" + [$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 - PKG_REQUIREMENTS="${PKG_REQUIREMENTS}, ${modules// /, }" + 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}]) ]) @@ -130,41 +144,60 @@ AC_DEFUN([AX_CHECK_QT], [ PKG_CHECK_MODULES([$1], [${qt_modules}], [ HAVE_$1=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}" - AM_CXXFLAGS+=" ${$1_CFLAGS}" - LIBS+=" ${$1_LIBS}" - modules=${qt_modules} - if test -z "$PKG_REQUIREMENTS"; then - PKG_REQUIREMENTS="${modules// /, }" - else - PKG_REQUIREMENTS="${PKG_REQUIREMENTS}, ${modules// /, }" + [$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}], [ - AM_CPPFLAGS+=" ${$1_OPTIONAL_CFLAGS}" - MOC_FLAGS+=" ${$1_OPTIONAL_CFLAGS}" - AM_CXXFLAGS+=" ${$1_OPTIONAL_CFLAGS}" - LIBS+=" ${$1_OPTIONAL_LIBS}" - modules=${qt_modules_optional} - if test -z "$PKG_REQUIREMENTS"; then - PKG_REQUIREMENTS="${modules// /, }" + 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 - PKG_REQUIREMENTS="${PKG_REQUIREMENTS}, ${modules// /, }" + 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_FLAG([-fPIC -fPIE], [position independent code flag]) - AC_SUBST(AM_CPPFLAGS) + 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 + AC_SUBST(QTDIR) + AC_SUBST(QT_PLUGIN_PATH) + AC_SUBST(CPPFLAGS) AC_SUBST(MOC_FLAGS) - AC_SUBST(AM_CXXFLAGS) + AC_SUBST(CXXFLAGS) AC_SUBST(PKG_REQUIREMENTS) AX_ADDITIONAL_QT_RULES_HACK=' + +LANGUAGE_FILE_BASE ?= translations + ui_%.hxx: %.ui $(UIC) -o [$][@] $< @@ -172,46 +205,24 @@ moc_%.cxx: %.hxx $(MOC) $(MOC_FLAGS) -o [$][@] $< qrc_%.cxx: %.qrc - $(RCC) -o [$][@] $<' + $(RCC) -o [$][@] -name ${<:%.qrc=%} $< AC_SUBST(AX_ADDITIONAL_QT_RULES_HACK) -]) -# SYNOPSIS -# -# AX_CXX_CHECK_QT([qt_prefix], [list-of-qt-modules], [optional-modules]) -# -# DESCRIPTIONS -# -# qt_prefix -# -# Each call to AX_CXX_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 +#%.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]) + AX_CHECK_QT([$1], [$2], [$3], [$4]) if ! test "$HAVE_$1" -eq 1; then AC_MSG_ERROR([Required Qt modules not found: $2]) fi @@ -220,7 +231,6 @@ AC_DEFUN([AX_REQUIRE_QT], [ # Omit Qt Keywords # AX_QT_NO_KEYWORDS - AC_DEFUN([AX_QT_NO_KEYWORDS], [ - AM_CPPFLAGS+=" -DQT_NO_KEYWORDS" + CPPFLAGS+=" -DQT_NO_KEYWORDS" ]) diff --git a/ax_init_standard_project.m4 b/ax_init_standard_project.m4 index a882473..ae31fdd 100644 --- a/ax_init_standard_project.m4 +++ b/ax_init_standard_project.m4 @@ -3,45 +3,53 @@ ## 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_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" 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') - (cd $path && svn2cl) 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_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" 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') - (cd $path && svn2cl) break; - fi + fi; done # Mac does not support LEAST > 255 - echo $ECHO_N $((x_minor+$SVN_REVISION/256)) -)) + echo $ECHO_N $(($SVN_REVISION/256)) +])) # setup version number -m4_define(x_version, m4_esyscmd_s( - echo $ECHO_N x_major.x_minor_fixed.x_least -)) +m4_define(x_version, [x_major.m4_ifdef([x_least_diff], x_minor, m4_eval(x_minor+x_minor_diff)).m4_eval(m4_ifdef([x_least_diff], [x_least-x_least_diff], [x_least]))]) ## bugreport mail address is taken from in first line of AUTHORS -m4_define(x_bugreport, m4_esyscmd_s( +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) @@ -68,7 +76,7 @@ dnl refers to ${prefix}. Thus we have to use `eval' twice. # $3 = filename of makefile.in AC_DEFUN([AX_ADD_MAKEFILE_TARGET_DEP], [ sh_add_makefile_target_dep() { - sed -i ':a;/^'${1}':.*\\$/{N;s/\\\n//;ta};s/^'${1}':.*$/& '${2}'/' "${srcdir}/${3}" + sed -i -e ':a;/^'${1}':.*\\$/{N;s/\\\n//;ta};s/^'${1}':.*$/& '${2}'/' "${srcdir}/${3}" if ! egrep -q "${1}:.* ${2}" "${srcdir}/${3}"; then echo "${1}: ${2}" >> "${srcdir}/${3}" fi @@ -84,7 +92,7 @@ AC_DEFUN([AX_ADD_MAKEFILE_TARGET_DEP], [ # $1 = variable name AC_DEFUN([AX_SUBST], [ 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//#/\\#} @@ -108,7 +116,28 @@ AC_DEFUN([AX_SUBST], [ # # configures the basic environment 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(HOME) README=$(tail -n +3 README) @@ -120,11 +149,20 @@ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [ AUTHOR=$(head -1 AUTHORS) AX_SUBST(AUTHOR) _AM_SUBST_NOTMAKE([AUTHOR]) - DISTRO=$(lsb_release -sc) + 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") + 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" @@ -134,14 +172,45 @@ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [ 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 <> src/makefile.in <> html/makefile.in <> makefile.in < /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 - AM_CPPFLAGS+=" ${$1_CFLAGS}" - AM_CXXFLAGS+=" ${$1_CFLAGS}" - LIBS+=" ${$1_LIBS}" + [$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 @@ -483,9 +573,126 @@ AC_DEFUN([AX_PKG_CHECK], [ ], [ 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(AM_CPPFLAGS) - AC_SUBST(AM_CXXFLAGS) + 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]) +]) diff --git a/bootstrap.sh b/bootstrap.sh index 82ab6df..3154dba 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -17,16 +17,17 @@ MY_NAME=${0##*/} PROJECT_PATH=$(pwd) DEFAULT_PROJECT_NAME=${PROJECT_PATH##*/} - configure=0 build=0 +buildtarget="distcheck" overwrite=0 rebuild=0 rebuildfiles=() while test $# -gt 0; do case "$1" in (--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;; (--rebuild|-r) rebuild=1;; (--rebuild-file|-f) shift; rebuildfiles+=("$1");; @@ -41,7 +42,8 @@ SYNOPSIS OPTIONS --configure, -c call ./configure after initialization - --build, -c build, also call ./configure && make + --build, -b build, also call ./configure && make distcheck + --target, -t 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 rebild specific file (can be added multiple times) @@ -101,12 +103,19 @@ GENERATED FILES * ax_init_standard_project.m4 - auxiliary macro definition file * ax_cxx_compile_stdcxx_11.m4 - auxiliary macro definition file * ax_check_qt.m4 - auxiliary macro definition file + * 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 + * 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.in - if you enabled AX_USE_SCRIPTS * doc/makefile.am - 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/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 @@ -144,9 +154,11 @@ FILES TO EDIT The following files normally require editing: * AUTHORS + * NEWS * README * configure.ac * src/makefile.am + * html/makefile.am * test/makefile.am * examples/makefile.am @@ -156,19 +168,23 @@ FILE DEPENDENCIES 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_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}.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 @@ -189,12 +205,12 @@ FILES * Enable Scripts: AX_USE_SCRIPTS * Enable Doxygen documentation generation: AX_USE_DOXYGEN * 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++ 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) + * 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) @@ -266,7 +282,8 @@ run() { } testtag() { - egrep -q '^ *'"$1" configure.ac + local IFS="|" + egrep -q '^ *'"($*)" configure.ac } contains() { @@ -295,7 +312,7 @@ to() { mode="u=rw,g=rw,o=r" case "$1" in (--condition) shift # test for a tag, abort if not set - if ! testtag "$1" configure.ac; then + if ! testtag "$1"; then return fi;; (--mode) shift # test for a tag, abort if not set @@ -304,7 +321,7 @@ to() { esac shift; done - if checkfile "$1" && test $rebuild -eq 0 \ + 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 @@ -371,18 +388,32 @@ 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-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) " fi -echo "$AUTHOR" | to AUTHORS && notice "please edit AUTHORS" +to AUTHORS <.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 "" > ${TARGET} +for d in $(find resources -mindepth 1 -type d); do + echo " " >> ${TARGET} + for f in $(find $d -mindepth 1 -maxdepth 1 -type f); do + echo " $f" >> ${TARGET} + done + echo " " >> ${TARGET} +done +echo "" >> ${TARGET} diff --git a/mac-create-app-bundle.sh b/mac-create-app-bundle.sh new file mode 100755 index 0000000..6ced200 --- /dev/null +++ b/mac-create-app-bundle.sh @@ -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 < + + + + CFBundleIdentifier + ${2} + CFBundleExecutable + ${executablefile##/} + + +EOF +fi \ No newline at end of file diff --git a/resolve-debbuilddeps.sh b/resolve-debbuilddeps.sh new file mode 100755 index 0000000..9da3c80 --- /dev/null +++ b/resolve-debbuilddeps.sh @@ -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" diff --git a/resolve-rpmbuilddeps.sh b/resolve-rpmbuilddeps.sh new file mode 100755 index 0000000..f36a875 --- /dev/null +++ b/resolve-rpmbuilddeps.sh @@ -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" diff --git a/src/commands.hxx b/src/commands.hxx index c339c07..8080582 100644 --- a/src/commands.hxx +++ b/src/commands.hxx @@ -2234,7 +2234,11 @@ class For: public Command { " <...>" "\n\n" "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" " 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(" "); } std::shared_ptr parse(Script*, QString args, - QStringList&, QString, int, int) { + QStringList& in, QString file, int line, int indent) { std::shared_ptr cmd(new For()); if (!args.size()) throw BadArgument(tag()+" requires a "); QStringList allargs(args.split("->")); - ... + cmd->_variable = allargs.takeFirst().trimmed(); + cmd->_vals = commaSeparatedList(allargs.join(' ')); + cmd->_script = std::shared_ptr