login is possible

This commit is contained in:
Marc Wäckerlin
2016-09-20 15:00:00 +00:00
parent 82bb795b85
commit 53a51b354c
22 changed files with 1721 additions and 1018 deletions

8
autogen.sh Executable file
View File

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

View File

@@ -4,12 +4,16 @@
# #
# SYNOPSIS # SYNOPSIS
# #
# AX_REQUIRE_STDCXX_11
# AX_REQUIRE_STDCXX_14
# AX_CXX_COMPILE_STDCXX_11([ext|noext],[mandatory|optional]) # AX_CXX_COMPILE_STDCXX_11([ext|noext],[mandatory|optional])
# AX_CXX_COMPILE_STDCXX_14([ext|noext],[mandatory|optional])
# #
# DESCRIPTION # DESCRIPTION
# #
# Check for baseline language coverage in the compiler for the C++11 # Check for baseline language coverage in the compiler for the C++11
# standard; if necessary, add switches to CXXFLAGS to enable support. # or C++14 standard; if necessary, add switches to CXXFLAGS to
# enable support.
# #
# The first argument, if specified, indicates whether you insist on an # The first argument, if specified, indicates whether you insist on an
# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g. # extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g.
@@ -131,3 +135,97 @@ AC_DEFUN([AX_CXX_COMPILE_STDCXX_11], [dnl
AC_SUBST(HAVE_CXX11) AC_SUBST(HAVE_CXX11)
fi fi
]) ])
AC_DEFUN([AX_CXX_COMPILE_STDCXX_14], [dnl
m4_if([$1], [], [],
[$1], [ext], [],
[$1], [noext], [],
[m4_fatal([invalid argument `$1' to AX_CXX_COMPILE_STDCXX_14])])dnl
m4_if([$2], [], [ax_cxx_compile_cxx14_required=true],
[$2], [mandatory], [ax_cxx_compile_cxx14_required=true],
[$2], [optional], [ax_cxx_compile_cxx14_required=false],
[m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX_14])])dnl
AC_LANG_PUSH([C++])dnl
ac_success=no
AC_CACHE_CHECK(whether $CXX supports C++14 features by default,
ax_cv_cxx_compile_cxx14,
[AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
[ax_cv_cxx_compile_cxx14=yes],
[ax_cv_cxx_compile_cxx14=no])])
if test x$ax_cv_cxx_compile_cxx14 = xyes; then
ac_success=yes
fi
m4_if([$1], [noext], [], [dnl
if test x$ac_success = xno; then
for switch in -std=gnu++14 -std=gnu++0y; do
cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx14_$switch])
AC_CACHE_CHECK(whether $CXX supports C++14 features with $switch,
$cachevar,
[ac_save_CXXFLAGS="$CXXFLAGS"
CXXFLAGS="$CXXFLAGS $switch"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
[eval $cachevar=yes],
[eval $cachevar=no])
CXXFLAGS="$ac_save_CXXFLAGS"])
if eval test x\$$cachevar = xyes; then
CXXFLAGS="$CXXFLAGS $switch"
ac_success=yes
break
fi
done
fi])
m4_if([$1], [ext], [], [dnl
if test x$ac_success = xno; then
for switch in -std=c++14 -std=c++0y; do
cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx14_$switch])
AC_CACHE_CHECK(whether $CXX supports C++14 features with $switch,
$cachevar,
[ac_save_CXXFLAGS="$CXXFLAGS"
CXXFLAGS="$CXXFLAGS $switch"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
[eval $cachevar=yes],
[eval $cachevar=no])
CXXFLAGS="$ac_save_CXXFLAGS"])
if eval test x\$$cachevar = xyes; then
CXXFLAGS="$CXXFLAGS $switch"
ac_success=yes
break
fi
done
fi])
AC_LANG_POP([C++])
if test x$ax_cxx_compile_cxx14_required = xtrue; then
if test x$ac_success = xno; then
AC_MSG_ERROR([*** A compiler with support for C++14 language features is required.])
fi
else
if test x$ac_success = xno; then
HAVE_CXX14=0
AC_MSG_NOTICE([No compiler with C++14 support was found])
AX_CXX_COMPILE_STDCXX_11([$1], [optional])
else
HAVE_CXX11=1
HAVE_CXX14=1
AC_DEFINE(HAVE_CXX14,1,
[define if the compiler supports basic C++14 syntax])
AC_DEFINE(HAVE_CXX11,1,
[define if the compiler supports basic C++14 syntax])
fi
AC_SUBST(HAVE_CXX11)
AC_SUBST(HAVE_CXX14)
fi
])
AC_DEFUN([AX_REQUIRE_STDCXX_11], [
if test x${HAVE_CXX11} != x1; then
AC_MSG_ERROR([*** A compiler with support for C++11 language features is required.])
fi
])
AC_DEFUN([AX_REQUIRE_STDCXX_14], [
if test x${HAVE_CXX14} != x1; then
AC_MSG_ERROR([*** A compiler with support for C++14 language features is required.])
fi
])

View File

@@ -7,34 +7,32 @@
m4_define([mrw_esyscmd_s], [m4_normalize(m4_esyscmd([$1]))]) 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 SX
m4_define(x_least, m4_ifdef([x_least_fix], [x_least_fix], m4_define(x_least, m4_ifdef([x_least_fix], [x_least_fix],
m4_ifdef([x_least_diff], m4_ifdef([x_least_diff],
mrw_esyscmd_s([ mrw_esyscmd_s([
VCS_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-checkout" VCS_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-checkout"
for path in . .. ../..; do for path in . .. ../.. ../../..; do
if test -d .svn; then if test -d .svn; then
svn upgrade 1>&2 > /dev/null || true
VCS_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p') VCS_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p')
if test -z "${VCS_REVISION}"; then VCS_REVISION=0; fi if test -n "${VCS_REVISION}"; then break; fi
break;
elif test -d .git; then elif test -d .git; then
VCS_REVISION=$(git rev-list --all --count) VCS_REVISION=$(git rev-list --all --count)
if test -z "${VCS_REVISION}"; then VCS_REVISION=0; fi if test -n "${VCS_REVISION}"; then break; fi
break;
fi fi
done done
echo $ECHO_N $(($VCS_REVISION)) echo $ECHO_N $(($VCS_REVISION))
]), mrw_esyscmd_s([ ]), mrw_esyscmd_s([
VCS_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-checkout" VCS_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-checkout"
for path in . .. ../..; do for path in . .. ../.. ../../..; do
if test -d .svn; then if test -d .svn; then
svn upgrade 1>&2 > /dev/null || true
VCS_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p') VCS_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p')
if test -z "${VCS_REVISION}"; then VCS_REVISION=0; fi if test -n "${VCS_REVISION}"; then break; fi
break;
elif test -d .git; then elif test -d .git; then
VCS_REVISION=$(git rev-list --all --count) VCS_REVISION=$(git rev-list --all --count)
if test -z "${VCS_REVISION}"; then VCS_REVISION=0; fi if test -n "${VCS_REVISION}"; then break; fi
break;
fi fi
done done
# Mac does not support LEAST > 255 # Mac does not support LEAST > 255
@@ -48,15 +46,14 @@ m4_define(x_least, m4_ifdef([x_least_fix], [x_least_fix],
# add to x_minor if revision number is > 256 # add to x_minor if revision number is > 256
m4_define(x_minor_diff, m4_ifdef([x_least_fix], 0, mrw_esyscmd_s([ m4_define(x_minor_diff, m4_ifdef([x_least_fix], 0, mrw_esyscmd_s([
VCS_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-checkout" VCS_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-checkout"
for path in . .. ../..; do for path in . .. ../.. ../../..; do
if test -d .svn; then if test -d .svn; then
svn upgrade 1>&2 > /dev/null || true
VCS_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p') VCS_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p')
if test -z "${VCS_REVISION}"; then VCS_REVISION=0; fi if test -n "${VCS_REVISION}"; then break; fi
break;
elif test -d .git; then elif test -d .git; then
VCS_REVISION=$(git rev-list --all --count) VCS_REVISION=$(git rev-list --all --count)
if test -z "${VCS_REVISION}"; then VCS_REVISION=0; fi if test -n "${VCS_REVISION}"; then break; fi
break;
fi; fi;
done done
# Mac does not support LEAST > 255 # Mac does not support LEAST > 255
@@ -132,7 +129,7 @@ AC_DEFUN([AX_SUBST], [
# m4_define(x_minor, MINOR_NUMBER) # project's minor version # m4_define(x_minor, MINOR_NUMBER) # 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_bugreport, 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 parallel-tests color-tests])
# AX_INIT_STANDARD_PROJECT # AX_INIT_STANDARD_PROJECT
# #
# you change nothing but: YOUR_PACKAGE_NAME, MAJOR_NUMBER, MINOR_NUMBER # you change nothing but: YOUR_PACKAGE_NAME, MAJOR_NUMBER, MINOR_NUMBER
@@ -173,17 +170,49 @@ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [
AM_CPPFLAGS+=" '-DMAKE_STRING(X)=\#X' '-DNAMESPACE=${PACKAGE_TARNAME//[^a-zA-Z0-9]/_}'" 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)
if test -f README.md; then
README=$(tail -n +3 README.md)
DESCRIPTION=$(head -1 README.md)
else
README=$(tail -n +3 README) README=$(tail -n +3 README)
DESCRIPTION=$(head -1 README)
fi
README_ESCAPED=$(echo "$README" | sed ':a;N;$!ba;s/\n/\\n/g;s,",\\",g')
if which pandoc 2>&1 > /dev/null; then
README_HTML=$(echo "$README" | pandoc -f markdown_github -t html | sed ':a;N;$!ba;s,\\\(.\),\\\\<span>\1</span>,g;s/\n/\\n/g;s,",\\",g;s, ,\&nbsp;\&nbsp;,g')
else
README_HTML="${README}"
fi
AX_SUBST(README) AX_SUBST(README)
_AM_SUBST_NOTMAKE([README]) _AM_SUBST_NOTMAKE([README])
DESCRIPTION=$(head -1 README) AX_SUBST(README_ESCAPED)
_AM_SUBST_NOTMAKE([README_ESCAPED])
AX_SUBST(README_HTML)
_AM_SUBST_NOTMAKE([README_HTML])
AX_SUBST(DESCRIPTION) AX_SUBST(DESCRIPTION)
_AM_SUBST_NOTMAKE([DESCRIPTION]) _AM_SUBST_NOTMAKE([DESCRIPTION])
LICENSE=$(echo $(head -1 COPYING))
AX_SUBST(LICENSE)
COPYING=$(<COPYING)
AX_SUBST(COPYING)
_AM_SUBST_NOTMAKE([COPYING])
AUTHOR=$(head -1 AUTHORS) AUTHOR=$(head -1 AUTHORS)
AUTHOR_NAME=$(echo $AUTHOR | sed 's, *[[<(]].*$,,')
AUTHOR_URL=$(echo $AUTHOR | sed 's,.*(\(http[[^)]]*\)).*,\1,')
AUTHOR_MAIL=$(echo $AUTHOR | sed 's,.*<\(.*@.*\)>.*,\1,')
AX_SUBST(AUTHOR) AX_SUBST(AUTHOR)
_AM_SUBST_NOTMAKE([AUTHOR]) _AM_SUBST_NOTMAKE([AUTHOR])
AX_SUBST(AUTHOR_NAME)
AX_SUBST(AUTHOR_URL)
AX_SUBST(AUTHOR_MAIL)
PROJECT_URL="${PROJECT_URL:-${AUTHOR_URL}/projects/${PACKAGE_NAME}}"
SOURCE_DOWNLOAD="${SOURCE_DOWNLOAD:-${AUTHOR_URL}/downloads/${PACKAGE_NAME}}"
AX_SUBST(PROJECT_URL)
AX_SUBST(SOURCE_DOWNLOAD)
DISTRO=$(lsb_release -sc 2>/dev/null || uname -s 2>/dev/null) DISTRO=$(lsb_release -sc 2>/dev/null || uname -s 2>/dev/null)
AX_SUBST(DISTRO) AX_SUBST(DISTRO)
ARCH=$((@<:@@<:@ $(uname -sm) =~ 64 @:>@@:>@ && echo amd64) || (@<:@@<:@ $(uname -sm) =~ 'i?86' @:>@@:>@ && echo i386 || uname -sm))
AX_SUBST(ARCH)
DISTRIBUTOR=$(lsb_release -si 2>/dev/null || uname -s 2>/dev/null) DISTRIBUTOR=$(lsb_release -si 2>/dev/null || uname -s 2>/dev/null)
case "${DISTRIBUTOR// /-}" in case "${DISTRIBUTOR// /-}" in
(Ubuntu) UBUNTU=1; AX_SUBST(UBUNTU);; (Ubuntu) UBUNTU=1; AX_SUBST(UBUNTU);;
@@ -244,6 +273,25 @@ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [
AM_CPPFLAGS="${AM_CPPFLAGS} -DQT_NO_DEBUG_OUTPUT -DQT_NO_DEBUG" AM_CPPFLAGS="${AM_CPPFLAGS} -DQT_NO_DEBUG_OUTPUT -DQT_NO_DEBUG"
fi fi
AC_ARG_WITH(gcov,
[AS_HELP_STRING([--with-gcov=FILE],
[enable gcov, set gcov file (defaults to gcov)])],
[GCOV="$enableval"], [GCOV="no"])
AM_CONDITIONAL(COVERAGE, test "$GCOV" != "no")
if test "$GCOV" != "no"; then
if test "$GCOV" == "yes"; then
GCOV=gcov
fi
AC_CHECK_PROG(has_gcov, [$GCOV], [yes], [no])
if test "$has_gcov" != "yes"; then
AC_MSG_ERROR([gcov: program $GCOV not found])
fi
AC_MSG_NOTICE([Coverage tests enabled, using ${GCOV}]);
AM_CXXFLAGS="${AM_CXXFLAGS:-} -O0 --coverage -fprofile-arcs -ftest-coverage"
AM_LDFLAGS="${AM_LDFLAGS} -O0 --coverage -fprofile-arcs"
AX_SUBST(GCOV)
fi
if test -f ${PACKAGE_NAME}.desktop.in; then if test -f ${PACKAGE_NAME}.desktop.in; then
AC_CONFIG_FILES([${PACKAGE_NAME}.desktop]) AC_CONFIG_FILES([${PACKAGE_NAME}.desktop])
fi fi
@@ -274,7 +322,7 @@ EOF
AC_DEFUN([AX_USE_CXX], [ AC_DEFUN([AX_USE_CXX], [
m4_include(ax_cxx_compile_stdcxx_11.m4) m4_include(ax_cxx_compile_stdcxx_11.m4)
AC_LANG(C++) AC_LANG(C++)
AX_CXX_COMPILE_STDCXX_11(noext, optional) AX_CXX_COMPILE_STDCXX_14(noext, optional)
AC_PROG_CXX AC_PROG_CXX
AC_PROG_CPP AC_PROG_CPP
@@ -312,6 +360,43 @@ maintainer-clean-cxx-targets:
EOF EOF
]) ])
# use this in configure.ac to support old school C
AC_DEFUN([AX_USE_C], [
AC_LANG(C)
AC_PROG_CC
AC_PROG_CPP
AC_CONFIG_FILES([src/makefile])
AM_CPPFLAGS+=' -I ${top_srcdir}/src -I ${top_builddir}/src -I ${srcdir} -I ${builddir}'
AM_LDFLAGS+=' -L ${top_srcdir}/src -L ${top_builddir}/src'
# Get rid of those stupid -g -O2 options!
CXXFLAGS="${CXXFLAGS//-g -O2/}"
CFLAGS="${CFLAGS//-g -O2/}"
# pass compile flags to make distcheck
AM_DISTCHECK_CONFIGURE_FLAGS="CFLAGS='${CFLAGS}' CPPFLAGS='${CPPFLAGS}' CFLAGS='${CFLAGS}' LDFLAGS='${LDFLAGS}'"
AC_SUBST(AM_DISTCHECK_CONFIGURE_FLAGS)
AC_SUBST(AM_CFLAGS)
AC_SUBST(AM_CPPFLAGS)
AC_SUBST(AM_LDFLAGS)
AX_ADD_MAKEFILE_TARGET_DEP([maintainer-clean-am], [maintainer-clean-c-targets], [src/makefile.in])
test -f src/makefile.in && cat >> src/makefile.in <<EOF
#### Begin: Appended by $0
%.app: %
-rm -r [\$][@]
\$(MAKE) DESTDIR=[\$][\$](pwd)/[\$][@]/tmp install
\${top_builddir}/mac-create-app-bundle.sh \
[\$][@] [\$][<] [\$][\$](pwd)/[\$][@]/tmp\${prefix}
maintainer-clean-c-targets:
-rm makefile.in
#### End: $0
EOF
])
# use this in configure.ac to support tests without CppUnit # use this in configure.ac to support tests without CppUnit
AC_DEFUN([AX_BUILD_TEST], [ AC_DEFUN([AX_BUILD_TEST], [
AC_CONFIG_FILES([test/makefile]) AC_CONFIG_FILES([test/makefile])
@@ -347,6 +432,33 @@ maintainer-clean-example-targets:
EOF EOF
]) ])
# use this in configure.ac to support C++ examples
AC_DEFUN([AX_USE_NODEJS], [
AC_PATH_PROG(ANDROID, [android], [0],
[${PATH}${PATH_SEPARATOR}${ANDROID_HOME}/tools])
AC_PATH_PROG(CORDOVA, [cordova], [0],
[${PATH}${PATH_SEPARATOR}$(pwd)/node_modules/cordova/bin])
if test ${CORDOVA} = 0; then
AC_MSG_WARN([cordova is missing, on ubuntu install cordova-cli from repository ppa:cordova-ubuntu/ppa])
fi
if test ${ANDROID} = 0; then
AC_MSG_WARN([android sdk is missing, set variable ANDROID_HOME after installation])
fi
AM_CONDITIONAL(HAVE_CORDOVA, [test ${CORDOVA} != 0 -a ${ANDROID} != 0])
AX_SUBST(CORDOVA)
AC_CONFIG_FILES([nodejs/package.json])
AC_CONFIG_FILES([nodejs/makefile])
AC_CONFIG_FILES([cordova/makefile])
AC_CONFIG_FILES([cordova/config.xml])
AX_ADD_MAKEFILE_TARGET_DEP([maintainer-clean-am], [maintainer-clean-example-targets], [examples/makefile.in])
test -f examples/makefile.in && cat >> examples/makefile.in <<EOF
#### Begin: Appended by $0
maintainer-clean-example-targets:
-rm makefile.in
#### End: $0
EOF
])
# use this in configure.ac to support HTML data for webservers # use this in configure.ac to support HTML data for webservers
AC_DEFUN([AX_BUILD_HTML], [ AC_DEFUN([AX_BUILD_HTML], [
AC_CONFIG_FILES([html/makefile]) AC_CONFIG_FILES([html/makefile])
@@ -389,7 +501,11 @@ EOF
# use this in configure.ac to support debian packages # use this in configure.ac to support debian packages
AC_DEFUN([AX_USE_DEBIAN_PACKAGING], [ AC_DEFUN([AX_USE_DEBIAN_PACKAGING], [
if test -f README.md; then
README_DEB=$(tail -n +3 README.md | sed -e 's/^ *$/./g' -e 's/^/ /g')
else
README_DEB=$(tail -n +3 README | sed -e 's/^ *$/./g' -e 's/^/ /g') README_DEB=$(tail -n +3 README | sed -e 's/^ *$/./g' -e 's/^/ /g')
fi
AC_SUBST(README_DEB) AC_SUBST(README_DEB)
_AM_SUBST_NOTMAKE([README_DEB]) _AM_SUBST_NOTMAKE([README_DEB])
AC_CONFIG_FILES([debian/changelog debian/control]) AC_CONFIG_FILES([debian/changelog debian/control])
@@ -412,12 +528,15 @@ EOF
AC_DEFUN([AX_USE_RPM_PACKAGING], [ AC_DEFUN([AX_USE_RPM_PACKAGING], [
AC_CONFIG_FILES([${PACKAGE_NAME}.spec]) AC_CONFIG_FILES([${PACKAGE_NAME}.spec])
#AX_ADD_MAKEFILE_TARGET_DEP([clean-am], [clean-rpm-targets], [makefile.in]) #AX_ADD_MAKEFILE_TARGET_DEP([clean-am], [clean-rpm-targets], [makefile.in])
AX_ADD_MAKEFILE_TARGET_DEP([clean-am], [clean-rpm-targets], [makefile.in])
AX_ADD_MAKEFILE_TARGET_DEP([distclean-am], [distclean-rpm-targets], [makefile.in]) AX_ADD_MAKEFILE_TARGET_DEP([distclean-am], [distclean-rpm-targets], [makefile.in])
test -f makefile.in && cat >> makefile.in <<EOF test -f makefile.in && cat >> makefile.in <<EOF
#### Begin: Appended by $0 #### Begin: Appended by $0
EXTRA_DIST += \${PACKAGE_NAME}.spec.in EXTRA_DIST += \${PACKAGE_NAME}.spec.in
rpm: dist rpm: dist
rpmbuild -ba --define "_topdir \$\$(pwd)" --define "_sourcedir \$\$(pwd)" \${PACKAGE_NAME}.spec rpmbuild -ba --define "_topdir \$\$(pwd)" --define "_sourcedir \$\$(pwd)" \${PACKAGE_NAME}.spec
clean-rpm-targets:
-rm -rf BUILD BUILDROOT RPMS SPECS SRPMS
distclean-rpm-targets: distclean-rpm-targets:
-rm \${PACKAGE_NAME}.spec -rm \${PACKAGE_NAME}.spec
#### End: $0 #### End: $0
@@ -434,6 +553,7 @@ AC_DEFUN([AX_USE_DOXYGEN], [
AC_CHECK_PROG(have_doxygen, doxygen, yes, no) AC_CHECK_PROG(have_doxygen, doxygen, yes, no)
AC_CHECK_PROG(have_dot, dot, yes, no) AC_CHECK_PROG(have_dot, dot, yes, no)
AC_CHECK_PROG(have_mscgen, mscgen, yes, no) AC_CHECK_PROG(have_mscgen, mscgen, yes, no)
AM_CONDITIONAL(NEED_PLANTUML, test "$have_doxygen" = "yes" -a "1.8.11" != $((echo "1.8.11"; doxygen -v) | sort -V | head -1))
PDF_DOC=${PACKAGE_NAME}-${PACKAGE_VERSION}.pdf PDF_DOC=${PACKAGE_NAME}-${PACKAGE_VERSION}.pdf
AC_SUBST(PDF_DOC) AC_SUBST(PDF_DOC)
if test "$have_doxygen" = "no"; then if test "$have_doxygen" = "no"; then
@@ -448,22 +568,38 @@ AC_DEFUN([AX_USE_DOXYGEN], [
AC_MSG_WARN([Missing program mscgen! AC_MSG_WARN([Missing program mscgen!
- when you rebild documentation, there are no message state charts - when you rebild documentation, there are no message state charts
- there are precompiled derived files in the distribution]); fi - there are precompiled derived files in the distribution]); fi
AC_CONFIG_FILES([doc/makefile doc/doxyfile]) AC_CONFIG_FILES([doc/makefile doc/doxyfile doc/header.html doc/footer.html])
AX_ADD_MAKEFILE_TARGET_DEP([clean-am], [clean-documentation], [doc/makefile.in]) AX_ADD_MAKEFILE_TARGET_DEP([clean-am], [clean-documentation], [doc/makefile.in])
AX_ADD_MAKEFILE_TARGET_DEP([distclean-am], [distclean-documentation], [doc/makefile.in]) AX_ADD_MAKEFILE_TARGET_DEP([distclean-am], [distclean-documentation], [doc/makefile.in])
AX_ADD_MAKEFILE_TARGET_DEP([maintainer-clean-am], [maintainer-clean-documentation], [doc/makefile.in]) AX_ADD_MAKEFILE_TARGET_DEP([maintainer-clean-am], [maintainer-clean-documentation], [doc/makefile.in])
AX_ADD_MAKEFILE_TARGET_DEP([install-data-am], [install-data-documentation], [doc/makefile.in]) AX_ADD_MAKEFILE_TARGET_DEP([install-data-am], [install-data-documentation], [doc/makefile.in])
AX_ADD_MAKEFILE_TARGET_DEP([uninstall-am], [uninstall-documentation], [doc/makefile.in]) AX_ADD_MAKEFILE_TARGET_DEP([uninstall-am], [uninstall-documentation], [doc/makefile.in])
AX_ADD_MAKEFILE_TARGET_DEP([all], [doc], [doc/makefile.in]) AX_ADD_MAKEFILE_TARGET_DEP([all], [doc], [doc/makefile.in])
AX_ADD_MAKEFILE_TARGET_DEP([.PHONY], [pdf], [doc/makefile.in]) AX_ADD_MAKEFILE_TARGET_DEP([.PHONY], [pdf gen-uml-images], [doc/makefile.in])
test -f doc/makefile.in && cat >> doc/makefile.in <<EOF test -f doc/makefile.in && cat >> doc/makefile.in <<EOF
#### Begin: Appended by $0 #### Begin: Appended by $0
doc: doxyfile doc: doxyfile @NEED_PLANTUML_TRUE@ gen-uml-images
@NEED_PLANTUML_TRUE@ doxyadd() { grep -q "\$\$[1] += \$\$[2]" doxyfile || sed -i '/^'"\$\$[1]"' *=/a'"\$\$[1]"' += '"\$\$[2]" doxyfile; }; \\
@NEED_PLANTUML_TRUE@ doxyadd ALIASES '"startuml{1}=@image html \\\\1\\\\n@image latex \\\\1\\\\n\\\\if DontIgnorePlantUMLCode"'; \\
@NEED_PLANTUML_TRUE@ doxyadd ALIASES '"enduml=\\\\endif"'; \\
@NEED_PLANTUML_TRUE@ doxyadd IMAGE_PATH '"gen-uml-images"';
doxygen doxyfile doxygen doxyfile
@PEDANTIC_TRUE@ test \! -s doxygen.errors @PEDANTIC_TRUE@ test \! -s doxygen.errors
@NEED_PLANTUML_TRUE@EXTRA_DIST = ${EXTRA_DIST} plantuml.jar
@NEED_PLANTUML_TRUE@
@NEED_PLANTUML_TRUE@gen-uml-images:
@NEED_PLANTUML_TRUE@ test -d gen-uml-images || mkdir gen-uml-images
@NEED_PLANTUML_TRUE@ eval \$\$(sed -n 's, *INPUT *\\(+\\?\\)= *\\(.*\\),INPUT\\1=" \\2",gp' doxyfile); \\
@NEED_PLANTUML_TRUE@ eval \$\$(sed -n 's, *FILE_PATTERNS *\\(+\\?\\)= *\\(.*\\),FILE_PATTERNS\\1=" \\2",gp' doxyfile); \\
@NEED_PLANTUML_TRUE@ SOURCES="**.("\$\$(echo \$\${FILE_PATTERNS} | sed 's,*.,,g;s, ,|,g')")"; \\
@NEED_PLANTUML_TRUE@ for src in \$\$INPUT; do \\
@NEED_PLANTUML_TRUE@ java -Djava.awt.headless=true -jar \${top_srcdir}/doc/plantuml.jar -v -o \$\$(pwd)/gen-uml-images "\$\$src/\$\$SOURCES"; \\
@NEED_PLANTUML_TRUE@ done
clean-documentation: clean-documentation:
-rm doxygen.errors @PDF_DOC@ -rm doxygen.errors @PDF_DOC@
@NEED_PLANTUML_TRUE@ -rm -rf gen-uml-images
distclean-documentation: distclean-documentation:
-rm -r html -rm -r html
-rm @PACKAGE_NAME@.doxytag -rm @PACKAGE_NAME@.doxytag
@@ -480,6 +616,55 @@ uninstall-documentation:
EOF EOF
]) ])
# use this in configure.ac to support Doxygen documentation generation
AC_DEFUN([AX_USE_PERLDOC], [
PERL_SOURCES="m4_default([$1], [perl])"
AX_SUBST(PERL_SOURCES)
if test -z "$PERL_SOURCES"; then
AC_MSG_ERROR([You must specify the path to per files
- use [AX]_[USE]_PERLDOC([[pathes to perldoc]])]); fi
AC_CHECK_PROG(have_perldoc, pods2html, yes, no)
if test "$have_doxygen" = "no"; then
AC_MSG_WARN([Missing program pods2html!
- you cannot rebuild the documentation
- there are precompiled derived files in the distribution
- if you need to generate documentation, install libpod-tree-perl]); fi
AC_CONFIG_FILES([doc/makefile])
AX_ADD_MAKEFILE_TARGET_DEP([distclean-am], [distclean-perldoc], [doc/makefile.in])
AX_ADD_MAKEFILE_TARGET_DEP([maintainer-clean-am], [maintainer-clean-perldoc], [doc/makefile.in])
AX_ADD_MAKEFILE_TARGET_DEP([install-data-am], [install-data-perldoc], [doc/makefile.in])
AX_ADD_MAKEFILE_TARGET_DEP([uninstall-am], [uninstall-perldoc], [doc/makefile.in])
AX_ADD_MAKEFILE_TARGET_DEP([all], [doc], [doc/makefile.in])
AX_ADD_MAKEFILE_TARGET_DEP([.PHONY], [doc], [doc/makefile.in])
test -f doc/makefile.in && cat >> doc/makefile.in <<EOF
#### Begin: Appended by $0
doc: perldoc/index.html
perldoc/index.html: \${PERL_SOURCES:%=perldoc/%}
echo "<html><head><title>Perl Documentation</title></head><body><h1>Perl Documentation</h1><ul>" > perldoc/index.html
for p in \${PERL_SOURCES:%=perldoc/%}; do \
echo '<li><a href="'"\$\${p#perldoc/}"'/index.html">'"\$\${p#perldoc/}"'</a></li>' >> perldoc/index.html; \
done
echo "</ul></body></html>" >> perldoc/index.html
perldoc/%:
pods2html --notoc --empty --index index @top_srcdir@/\${@:perldoc/%=%} \$[@]
distclean-perldoc:
-rm -r perldoc
maintainer-clean-perldoc:
-rm makefile.in
install-data-perldoc:
test -d \$(DESTDIR)\${docdir} || mkdir -p \$(DESTDIR)\${docdir}
chmod -R u+w \$(DESTDIR)\${docdir}
cp -r perldoc \$(DESTDIR)\${docdir}/
uninstall-perldoc:
-chmod -R u+w \$(DESTDIR)\${docdir}
-rm -rf \$(DESTDIR)\${docdir}/perldoc
#### End: $0
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)

View File

@@ -23,17 +23,22 @@ docker=0
buildtarget="" buildtarget=""
overwrite=0 overwrite=0
rebuild=0 rebuild=0
novcs=0
excludevcs=()
rebuildfiles=() rebuildfiles=()
while test $# -gt 0; do while test $# -gt 0; do
case "$1" in case "$1" in
(--configure|-c) configure=1;; (--configure|-c) configure=1;;
(--docker|-d) docker=1;; (--docker|-d) docker=1;;
(--build|-b) configure=1; build=1; buildtarget+=" distcheck";; (--build|-b) configure=1; build=1; buildtarget+=" distcheck";;
(--target|-t) shift; configure=1; build=1; buildtarget+=" $1";; (--all|-a) shift; configure=1; build=1; buildtarget+=" all";;
(--clean) shift; configure=1; build=1; buildtarget+=" maintainer-clean";; (--clean) shift; configure=1; build=1; buildtarget+=" maintainer-clean";;
(--target|-t) shift; configure=1; build=1; buildtarget+=" $1";;
(--overwrite|-o) overwrite=1;; (--overwrite|-o) overwrite=1;;
(--rebuild|-r) rebuild=1;; (--rebuild|-r) rebuild=1;;
(--rebuild-file|-f) shift; rebuildfiles+=("$1");; (--rebuild-file|-f) shift; rebuildfiles+=("$1");;
(--no-vcs|-n) novcs=1;;
(--exclude-vcs|-x) shift; excludevcs+=("$1");;
(--version|-v) (--version|-v)
echo "$Id$"; echo "$Id$";
exit;; exit;;
@@ -47,10 +52,14 @@ OPTIONS
--configure, -c call ./configure after initialization --configure, -c call ./configure after initialization
--docker, -d build and run tests in a docker instance --docker, -d build and run tests in a docker instance
--build, -b build, also call ./configure && make distcheck --build, -b build, also call ./configure && make distcheck
--all, -a same as -b, but make target all
--clean same as -b, but make target maintainer-clean
--target, -t <target> same as -b, but specify target instead of distcheck --target, -t <target> same as -b, but specify target instead of distcheck
--overwrite, -o overwrite all basic files (bootstrap.sh, m4-macros) --overwrite, -o overwrite all basic files (bootstrap.sh, m4-macros)
--rebuild, -r force rebuild of generated files, even if modified --rebuild, -r force rebuild of generated files, even if modified
--rebuild-file, -f <file> rebild specific file (can be added multiple times) --rebuild-file, -f <file> rebild specific file (can be added multiple times)
--no-vcs, -n do not automatically add files to version control
--exclude-vcs, -x <file> exclude specific file from version control
--help, -h show this help --help, -h show this help
--version, -v show version and date of this file --version, -v show version and date of this file
@@ -109,18 +118,22 @@ RUNNING
If you run ${MY_NAME}, it first generates the necessary files (see If you run ${MY_NAME}, it first generates the necessary files (see
below), then first runs make distclean if a makefile exists. After below), then first runs make distclean if a makefile exists. After
this it calles aclocal, libtoolize, automake, autoconf and this it calles aclocal, libtoolize, automake, autoconf and
optionally ./configure. optionally ./configure. If necessary, files are added to version
control.
GENERATED FILES GENERATED FILES
This script copies the following files into your project environment: This script copies the following files into your project environment:
* ${MY_NAME} * ${MY_NAME}
* autogen.sh - just the basics to initialize auto tools and create configure
* ax_init_standard_project.m4 - auxiliary macro definition file * ax_init_standard_project.m4 - auxiliary macro definition file
* ax_cxx_compile_stdcxx_11.m4 - auxiliary macro definition file * ax_cxx_compile_stdcxx_11.m4 - auxiliary macro definition file
* ax_check_qt.m4 - auxiliary macro definition file * ax_check_qt.m4 - auxiliary macro definition file
* makefile_test.inc.am - makefile to be included in tests
* resolve-debbuilddeps.sh - script to install debian package dependencies * resolve-debbuilddeps.sh - script to install debian package dependencies
* resolve-rpmbuilddeps.sh - script to install RPM package dependencies * resolve-rpmbuilddeps.sh - script to install RPM package dependencies
* build-in-docker.sh - script to build the project encapsulated in a docker container * build-in-docker.sh - script to build the project encapsulated in a docker container
* build-in-docker.conf - additional configuration for build-in-docker.sh
* build-resource-file.sh - build resource.qrc file from a resource directory * build-resource-file.sh - build resource.qrc file from a resource directory
* sql-to-dot.sed - script to convert SQL schema files to graphviz dot in doxygen * sql-to-dot.sed - script to convert SQL schema files to graphviz dot in doxygen
* mac-create-app-bundle.sh - script to create apple mac os-x app-bundle * mac-create-app-bundle.sh - script to create apple mac os-x app-bundle
@@ -136,9 +149,14 @@ GENERATED FILES
* 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 * html/makefile.am - if you enabled AX_BUILD_HTML
* scripts/makefile.am - if you enabled AX_USE_SCRIPTS * scripts/makefile.am - if you enabled AX_USE_SCRIPTS
* doc/makefile.am - if you enabled AX_USE_DOXYGEN * doc/makefile.am - if you enabled AX_USE_DOXYGEN or AX_USE_PERLDOC
* doc/doxyfile.in - if you enabled AX_USE_DOXYGEN * doc/doxyfile.in - if you enabled AX_USE_DOXYGEN
* test/makefile.am - if you enabled AX_BUILD_TEST or AX_USE_CPPUNIT * doc/header.html.in - if you enabled AX_USE_DOXYGEN
* doc/footer.html.in - if you enabled AX_USE_DOXYGEN
* doc/style.css - if you enabled AX_USE_DOXYGEN
* doc/plantuml.jar - if you enable AX_USE_DOXYGEN
* test/makefile.am - if you enabled AX_USE_CPPUNIT and AX_USE_CXX
* test/${DEFAULT_PROJECT_NAME#lib}.cxx - if you enabled AX_BUILD_TEST or AX_USE_CPPUNIT
* examples/makefile.am - if you enabled AX_BUILD_EXAMPLES * examples/makefile.am - if you enabled AX_BUILD_EXAMPLES
* debian/changelog.in - if you enabled AX_USE_DEBIAN_PACKAGING * debian/changelog.in - if you enabled AX_USE_DEBIAN_PACKAGING
* debian/control.in - if you enabled AX_USE_DEBIAN_PACKAGING * debian/control.in - if you enabled AX_USE_DEBIAN_PACKAGING
@@ -179,6 +197,7 @@ FILES TO EDIT
* src/makefile.am * src/makefile.am
* html/makefile.am * html/makefile.am
* test/makefile.am * test/makefile.am
* test/${DEFAULT_PROJECT_NAME}.cxx
* examples/makefile.am * examples/makefile.am
FILE DEPENDENCIES FILE DEPENDENCIES
@@ -189,8 +208,8 @@ FILE DEPENDENCIES
* test/makefile.am depends on AX_USE_LIBTOOL * test/makefile.am depends on AX_USE_LIBTOOL
* html/makefile.am depends on AX_BUILD_HTML * 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_PERLDOC,
AX_CXX_QT, AX_CHECK_QT, AX_REQUIRE_QT, AX_USE_LIBTOOL AX_USE_CPPUNIT AX_CXX_QT, AX_CHECK_QT, AX_REQUIRE_QT, AX_USE_LIBTOOL
* debian/${DEFAULT_PROJECT_NAME}.install depends on AX_USE_LIBTOOL * debian/${DEFAULT_PROJECT_NAME}.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
@@ -224,6 +243,7 @@ FILES
* Enable LibTool library creation: AX_USE_LIBTOOL * Enable LibTool library creation: AX_USE_LIBTOOL
* 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 Perldoc documentation generation: AX_USE_PERLDOC
* Enable Debian packaging by calling "make deb": AX_USE_DEBIAN_PACKAGING * Enable Debian packaging by calling "make deb": AX_USE_DEBIAN_PACKAGING
* Enable RPM packaging by calling "make rpm": 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
@@ -345,7 +365,7 @@ contains() {
checkdir() { checkdir() {
if ! test -d "$1"; then # create path if ! test -d "$1"; then # create path
run mkdir -p "$1" run mkdir -p "$1"
if test -n "${VCS}"; then if test -n "${VCS}" -a $novcs -eq 0 && ! contains "$1" "${excludevcs[@]}"; then
run ${VCS} add "$1" run ${VCS} add "$1"
fi fi
fi fi
@@ -360,13 +380,17 @@ checkfile() {
} }
to() { to() {
while test $# -gt 0; do
mode="u=rw,g=rw,o=r" mode="u=rw,g=rw,o=r"
while test $# -gt 0; do
case "$1" in case "$1" in
(--condition) shift # test for a tag, abort if not set (--condition) shift # test for a tag, abort if not set
if ! testtag "$1"; then if ! testtag "$1"; then
return 0 return 0
fi;; fi;;
(--unless) shift # test for a tag, abort if set
if testtag "$1"; then
return 0
fi;;
(--mode) shift # test for a tag, abort if not set (--mode) shift # test for a tag, abort if not set
mode="$1";; mode="$1";;
(*) break;; (*) break;;
@@ -392,9 +416,9 @@ to() {
else else
echo -e " \e[32msuccess\e[0m" echo -e " \e[32msuccess\e[0m"
fi fi
chmod $mode $1 run chmod $mode $1
if test $exists -eq 0; then if test $exists -eq 0; then
if test -n "${VCS}"; then if test -n "${VCS}" -a $novcs -eq 0 && ! contains "$1" "${excludevcs[@]}"; then
run ${VCS} add "$1" run ${VCS} add "$1"
if test "${VCS}" = "svn"; then if test "${VCS}" = "svn"; then
run svn propset svn:keywords "Id" "$1" run svn propset svn:keywords "Id" "$1"
@@ -417,9 +441,12 @@ copy() {
source="${0%/*}/$1" source="${0%/*}/$1"
fi fi
fi fi
if test "${1%/*}" != "$1"; then
test -d "${1%/*}" || svn mkdir "${1%/*}"
fi
run cp "${source}" "$1" run cp "${source}" "$1"
if test $exists -eq 0; then if test $exists -eq 0; then
if test -n "${VCS}"; then if test -n "${VCS}" -a $novcs -eq 0 && ! contains "$1" "${excludevcs[@]}"; then
run ${VCS} add "$1" run ${VCS} add "$1"
if test "${VCS}" = "svn"; then if test "${VCS}" = "svn"; then
run svn propset svn:keywords "Id" "$1" run svn propset svn:keywords "Id" "$1"
@@ -452,23 +479,27 @@ doxyadd() {
vcs2cl() { vcs2cl() {
exists=0 exists=0
if test -f "Changelog"; then if test -f "ChangeLog"; then
exists=1 exists=1
else
touch "ChangeLog"
fi fi
if test -x $(which ${VCS}2cl); then
if test "${VCS}" = "git"; then if test "${VCS}" = "git"; then
${VCS}2cl > ChangeLog ${VCS}2cl > ChangeLog
elif test -n "${VCS}"; then elif test -n "${VCS}"; then
${VCS}2cl ${VCS}2cl
fi fi
fi
if test $exists -eq 0; then if test $exists -eq 0; then
if test -n "${VCS}"; then if test -n "${VCS}" -a $novcs -eq 0 && ! contains "ChangeLog" "${excludevcs[@]}"; then
run ${VCS} add ChangeLog run ${VCS} add ChangeLog
fi fi
fi fi
} }
# Check if we are in subversion root, if so, create trunk, branches, tags: # Check if we are in subversion root, if so, create trunk, branches, tags:
if test "${VCS}" = "svn"; then if test "${VCS}" = "svn" -a $novcs -eq 0; then
if test "$(LANG= svn info | sed -n 's,Relative URL: *,,p')" = "^/"; then if test "$(LANG= svn info | sed -n 's,Relative URL: *,,p')" = "^/"; then
svn mkdir trunk branches tags svn mkdir trunk branches tags
cd trunk cd trunk
@@ -480,6 +511,7 @@ 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 makefile_test.inc.am
copy resolve-debbuilddeps.sh copy resolve-debbuilddeps.sh
copy resolve-rpmbuilddeps.sh copy resolve-rpmbuilddeps.sh
copy build-in-docker.sh copy build-in-docker.sh
@@ -502,7 +534,11 @@ ${DEFAULT_PROJECT_NAME}
add description for ${DEFAULT_PROJECT_NAME} add description for ${DEFAULT_PROJECT_NAME}
EOF EOF
to configure.ac <<EOF && notice "please edit configure.ac, then rerun $0" && exit 0 to configure.ac <<EOF && notice "please edit configure.ac, then rerun $0" && exit 0
${HEADER}m4_define(x_package_name, ${DEFAULT_PROJECT_NAME}) # project's name ${HEADER}# default is generated from AUTHORS and project name
PROJECT_URL=
SOURCE_DOWNLOAD=
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)
@@ -515,6 +551,7 @@ AX_INIT_STANDARD_PROJECT
#AX_USE_LIBTOOL #AX_USE_LIBTOOL
#AX_USE_SCRIPTS #AX_USE_SCRIPTS
#AX_USE_DOXYGEN #AX_USE_DOXYGEN
#AX_USE_PERLDOC
#AX_USE_DEBIAN_PACKAGING #AX_USE_DEBIAN_PACKAGING
#AX_USE_RPM_PACKAGING #AX_USE_RPM_PACKAGING
#AX_USE_CPPUNIT #AX_USE_CPPUNIT
@@ -542,6 +579,20 @@ if ! testtag AX_CHECK_QT && \
! testtag AX_REQUIRE_QT; then ! testtag AX_REQUIRE_QT; then
echo "${HEADER}MAINTAINERCLEANFILES = makefile.in" | \ echo "${HEADER}MAINTAINERCLEANFILES = makefile.in" | \
to --condition AX_USE_CXX src/makefile.am to --condition AX_USE_CXX src/makefile.am
if ! ls src/*.[ch]xx; then
to --condition AX_USE_CXX src/${PACKAGE_NAME#lib}.hxx <<EOF
${CHEADER}#ifndef ${PackageName^^}_HXX
#define ${PackageName^^}_HXX
/** @mainpage @description
@readme
*/
#endif
EOF
fi
elif ! test -e src/makefile.am; then elif ! test -e src/makefile.am; then
to --condition AX_USE_CXX src/makefile.am <<EOF to --condition AX_USE_CXX src/makefile.am <<EOF
${HEADER}bin_PROGRAMS = ${PACKAGE_NAME} ${HEADER}bin_PROGRAMS = ${PACKAGE_NAME}
@@ -632,10 +683,17 @@ int main(int argc, char *argv[]) try {
return 1; return 1;
} }
EOF EOF
to --condition AX_USE_CXX src/${PACKAGE_NAME}.hxx <<EOF if ! ls src/*.[ch]xx; then
to --condition AX_USE_CXX src/${PACKAGE_NAME#lib}.hxx <<EOF
${CHEADER}#ifndef ${PackageName^^}_HXX ${CHEADER}#ifndef ${PackageName^^}_HXX
#define ${PackageName^^}_HXX #define ${PackageName^^}_HXX
/** @mainpage @description
@readme
*/
#include <QMainWindow> #include <QMainWindow>
#include <ui_${PACKAGE_NAME}.hxx> #include <ui_${PACKAGE_NAME}.hxx>
@@ -652,7 +710,8 @@ class ${PackageName}: public QMainWindow, protected Ui::${PackageName} {
#endif #endif
EOF EOF
to --condition AX_USE_CXX src/${PACKAGE_NAME}.ui <<EOF fi
to --condition AX_USE_CXX src/${PACKAGE_NAME#lib}.ui <<EOF
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>${PackageName}</class> <class>${PackageName}</class>
@@ -734,7 +793,7 @@ EOF
to --condition AX_USE_CXX src/version.cxx <<EOF to --condition AX_USE_CXX src/version.cxx <<EOF
/*! @file /*! @file
@id $Id\$ @id \$Id\$
*/ */
// 1 2 3 4 5 6 7 8 // 1 2 3 4 5 6 7 8
// 45678901234567890123456789012345678901234567890123456789012345678901234567890 // 45678901234567890123456789012345678901234567890123456789012345678901234567890
@@ -778,7 +837,7 @@ ${HEADER}dist_bin_SCRIPTS =
MAINTAINERCLEANFILES = makefile.in MAINTAINERCLEANFILES = makefile.in
EOF EOF
echo "${HEADER}MAINTAINERCLEANFILES = makefile.in" | to --condition AX_USE_DOXYGEN doc/makefile.am echo "${HEADER}MAINTAINERCLEANFILES = makefile.in" | to --condition 'AX_USE_DOXYGEN|AX_USE_PERLDOC' doc/makefile.am
if testtag AX_BUILD_TEST; then if testtag AX_BUILD_TEST; then
to test/runtests.sh < ${0%/*}/test/runtests.sh to test/runtests.sh < ${0%/*}/test/runtests.sh
fi fi
@@ -789,16 +848,51 @@ AM_CPPFLAGS = -I\${top_srcdir}/src -I\${top_builddir}/src
AM_LDFLAGS = -L\${abs_top_builddir}/src/.libs AM_LDFLAGS = -L\${abs_top_builddir}/src/.libs
$(if testtag AX_USE_LIBTOOL; then $(if testtag AX_USE_LIBTOOL; then
cat <<EOF3 cat <<EOF3
LDADD = -l${PACKAGE_NAME#lib} LDADD = -lcppunit -l${PACKAGE_NAME#lib}
EOF3 EOF3
fi) fi)
EOF2 EOF2
fi) fi)
TESTS = check_PROGRAMS = ${PACKAGE_NAME#lib}
TESTS = \${check_PROGRAMS}
${PACKAGE_NAME#lib}_SOURCES = ${PACKAGE_NAME#lib}.cxx
MAINTAINERCLEANFILES = makefile.in MAINTAINERCLEANFILES = makefile.in
EOF EOF
to --condition AX_USE_CPPUNIT --condition AX_USE_CXX test/${PACKAGE_NAME#lib}.cxx <<EOF
${CHEADER}
#include <cppunit/TestFixture.h>
#include <cppunit/ui/text/TestRunner.h>
#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/XmlOutputter.h>
#include <fstream>
/// @todo Rename DummyTest and DummyTest::dummy()
/// @todo Write test cases
class DummyTest: public CppUnit::TestFixture {
public:
void dummy() {
}
CPPUNIT_TEST_SUITE(DummyTest);
CPPUNIT_TEST(dummy);
CPPUNIT_TEST_SUITE_END();
};
CPPUNIT_TEST_SUITE_REGISTRATION(DummyTest);
int main(int argc, char** argv) try {
std::ofstream ofs((*argv+std::string(".xml")).c_str());
CppUnit::TextUi::TestRunner runner;
runner.setOutputter(new CppUnit::XmlOutputter(&runner.result(), ofs));
runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
return runner.run() ? 0 : 1;
} catch (std::exception& e) {
std::cerr<<"***Exception: "<<e.what()<<std::endl;
return 1;
}
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\${abs_top_builddir}/src/.libs AM_LDFLAGS = -L\${abs_top_builddir}/src/.libs
@@ -814,12 +908,100 @@ www_DATA =
MAINTAINERCLEANFILES = makefile.in MAINTAINERCLEANFILES = makefile.in
EOF EOF
to --condition AX_USE_DOXYGEN doc/header.html.in <<EOF
<!-- HTML header for doxygen 1.8.6-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen \$doxygenversion"/>
<!--BEGIN PROJECT_NAME--><title>\$projectname: \$title</title><!--END PROJECT_NAME-->
<!--BEGIN !PROJECT_NAME--><title>\$title</title><!--END !PROJECT_NAME-->
<link href="\$relpath^tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="\$relpath^jquery.js"></script>
<script type="text/javascript" src="\$relpath^dynsections.js"></script>
\$treeview
\$search
\$mathjax
<link href="\$relpath^\$stylesheet" rel="stylesheet" type="text/css" />
\$extrastylesheet
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<div id="projecthead">
<div id="projectlogo"><img alt="" src="\$relpath^\$projectlogo"/></div>
<div id="projectname">\$projectname</span>&#160;<span id="projectnumber">\$projectnumber</div>
<div id="projectbrief">\$projectbrief</div>
</div>
<nav>
<a href="@PROJECT_URL@" target="_blank">Project Management</a>
<a href="@SOURCE_DOWNLOAD@" target="_blank">Download</a>
<div>\$searchbox</div>
</nav>
</div>
EOF
to --condition AX_USE_DOXYGEN doc/footer.html.in <<EOF
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
\$navpath
<li class="footer"><a href="@AUTHOR_URL@" target="_blank">@AUTHOR_NAME@</a></li>
</ul>
</div>
</body>
</html>
EOF
to --condition AX_USE_DOXYGEN doc/style.css <<EOF
#titlearea {
display: flex;
justify-content: space-between;
align-items: flex-begin;
}
#titlearea nav {
padding: 0;
margin: 0;
}
#titlearea nav a {
background-color: lightgray;
border: 1px solid gray;
color: black;
padding: 1ex;
margin: 0;
}
img, object {
max-width: 100% !important;
}
@media (max-width: 50em) {
#navrow1, #navrow2 {
display: block
}
#side-nav, #splitbar, .ui-resizable-handle ui-resizable-e, .ui-resizable-handle ui-resizable-s {
display: none;
}
#doc-content {
margin-left: 0 !important;
}
}
@media (min-width: 50em) {
#navrow1, #navrow2 {
display: none;
}
#side-nav, #splitbar, .ui-resizable-handle ui-resizable-e, .ui-resizable-handle ui-resizable-s {
display: block
}
}
EOF
if testtag AX_USE_DOXYGEN; then
copy doc/plantuml.jar
fi
if testtag AX_USE_DOXYGEN; then if testtag AX_USE_DOXYGEN; then
if ! checkfile doc/doxyfile.in || \ if ! checkfile doc/doxyfile.in || \
contains doc/doxyfile.in "${rebuildfiles[@]}"; then contains doc/doxyfile.in "${rebuildfiles[@]}"; then
run doxygen -g doc/doxyfile.in run doxygen -g doc/doxyfile.in
if test $exists -eq 0; then if test $exists -eq 0; then
if test -n "${VCS}"; then if test -n "${VCS}" -a $novcs -eq 0 && ! contains "doc/doxyfile" "${excludevcs[@]}"; then
run ${VCS} add doc/doxyfile.in run ${VCS} add doc/doxyfile.in
if test "${VCS}" = "svn"; then if test "${VCS}" = "svn"; then
run svn propset svn:keywords "Id" doc/doxyfile.in run svn propset svn:keywords "Id" doc/doxyfile.in
@@ -829,17 +1011,21 @@ if testtag AX_USE_DOXYGEN; then
doxyreplace PROJECT_NAME "@PACKAGE_NAME@" doxyreplace PROJECT_NAME "@PACKAGE_NAME@"
doxyreplace PROJECT_NUMBER "@PACKAGE_VERSION@" doxyreplace PROJECT_NUMBER "@PACKAGE_VERSION@"
doxyreplace PROJECT_BRIEF "@DESCRIPTION@" doxyreplace PROJECT_BRIEF "@DESCRIPTION@"
doxyreplace PROJECT_LOGO "@top_srcdir@/@PACKACE_LOGO@" doxyreplace PROJECT_LOGO "@top_srcdir@/@PACKAGE_LOGO@"
doxyreplace INLINE_INHERITED_MEMB YES doxyreplace INLINE_INHERITED_MEMB YES
doxyreplace MULTILINE_CPP_IS_BRIEF YES doxyreplace MULTILINE_CPP_IS_BRIEF YES
doxyreplace TAB_SIZE 2 doxyreplace TAB_SIZE 2
doxyreplace ALIASES '"id=\\par File-ID\\n"' doxyreplace ALIASES '"id=\\par File-ID\\n"'
doxyadd ALIASES '"copy=\\par Copyright\\n"' doxyadd ALIASES '"copy=\\par Copyright by <a href="@AUTHOR_URL@" target="_blank">@AUTHOR_NAME@</a>\\n"'
doxyadd ALIASES '"license=\\par License\\n"' doxyadd ALIASES '"license=\\par License\\n"'
doxyadd ALIASES '"classmutex=\\par Reentrant:\\nAccess is locked with class static mutex @c "' doxyadd ALIASES '"classmutex=\\par Reentrant:\\nAccess is locked with class static mutex @c "'
doxyadd ALIASES '"instancemutex=\\par Reentrant:\\nAccess is locked with per instance mutex @c "' doxyadd ALIASES '"instancemutex=\\par Reentrant:\\nAccess is locked with per instance mutex @c "'
doxyadd ALIASES '"mutex=\\par Reentrant:\\nAccess is locked with mutex @c "' doxyadd ALIASES '"mutex=\\par Reentrant:\\nAccess is locked with mutex @c "'
doxyadd ALIASES '"api=\\xrefitem api \\"API Call\\" \\"\\""' doxyadd ALIASES '"api=\\xrefitem api \\"API Call\\" \\"\\""'
doxyadd ALIASES '"description=@DESCRIPTION@"'
doxyadd ALIASES '"readme=@README_HTML@"'
doxyadd ALIASES '"author=<a href="@AUTHOR_URL@" target="_blank">@AUTHOR_NAME@</a>"'
doxyreplace PLANTUML_JAR_PATH '"@top_srcdir@/doc/plantuml.jar"'
doxyreplace ENABLE_PREPROCESSING YES doxyreplace ENABLE_PREPROCESSING YES
doxyreplace MACRO_EXPANSION YES doxyreplace MACRO_EXPANSION YES
doxyadd PREDEFINED '"NAMESPACE=@PACKAGE_NAME@"' doxyadd PREDEFINED '"NAMESPACE=@PACKAGE_NAME@"'
@@ -866,9 +1052,20 @@ if testtag AX_USE_DOXYGEN; then
if testtag AX_BUILD_TEST AX_USE_CPPUNIT; then if testtag AX_BUILD_TEST AX_USE_CPPUNIT; then
doxyadd INPUT "@top_srcdir@/test" doxyadd INPUT "@top_srcdir@/test"
fi fi
if testtag AX_USE_NODEJS; then
doxyadd INPUT "@top_srcdir@/nodejs"
doxyadd EXCLUDE "@top_srcdir@/nodejs/node_modules"
doxyadd EXCLUDE "@top_srcdir@/nodejs/public/javascripts/ext"
fi
doxyreplace FILE_PATTERNS '*.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.idl *.ddl *.odl *.h *.hh *.hxx *.hpp *.h++ *.cs *.d *.php *.php4 *.php5 *.phtml *.inc *.m *.markdown *.md *.mm *.dox *.py *.f90 *.f *.for *.tcl *.vhd *.vhdl *.ucf *.qsf *.as *.js *.wt *.sql' doxyreplace FILE_PATTERNS '*.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.idl *.ddl *.odl *.h *.hh *.hxx *.hpp *.h++ *.cs *.d *.php *.php4 *.php5 *.phtml *.inc *.m *.markdown *.md *.mm *.dox *.py *.f90 *.f *.for *.tcl *.vhd *.vhdl *.ucf *.qsf *.as *.js *.wt *.sql'
doxyreplace RECURSIVE YES doxyreplace RECURSIVE YES
doxyreplace EXCLUDE_PATTERNS "moc_* uic_* qrc_*" doxyreplace EXCLUDE_PATTERNS "moc_* uic_* qrc_* version.[ch]xx"
doxyreplace HTML_HEADER header.html
doxyreplace HTML_FOOTER footer.html
doxyreplace HTML_EXTRA_STYLESHEET style.css
doxyreplace HTML_DYNAMIC_SECTIONS YES
doxyreplace DISABLE_INDEX NO
doxyreplace GENERATE_TREEVIEW YES
if testtag AX_BUILD_EXAMPLES; then if testtag AX_BUILD_EXAMPLES; then
doxyreplace EXAMPLE_PATH @top_srcdir@/examples doxyreplace EXAMPLE_PATH @top_srcdir@/examples
fi fi
@@ -877,7 +1074,6 @@ if testtag AX_USE_DOXYGEN; then
doxyreplace SOURCE_BROWSER YES doxyreplace SOURCE_BROWSER YES
doxyreplace INLINE_SOURCES YES doxyreplace INLINE_SOURCES YES
doxyreplace GENERATE_TESTLIST YES doxyreplace GENERATE_TESTLIST YES
doxyreplace GENERATE_TREEVIEW NO
doxyreplace SEARCHENGINE NO doxyreplace SEARCHENGINE NO
doxyreplace GENERATE_HTML YES doxyreplace GENERATE_HTML YES
doxyreplace GENERATE_LATEX NO doxyreplace GENERATE_LATEX NO
@@ -904,7 +1100,7 @@ if testtag AX_USE_DEBIAN_PACKAGING; then
-- @AUTHOR@ @BUILD_DATE@ -- @AUTHOR@ @BUILD_DATE@
EOF EOF
BUILD_DEPENDS="debhelper, ${VCSDEPENDS} pkg-config, automake, libtool, autotools-dev, lsb-release $(if testtag AX_USE_DOXYGEN; then echo -n ", doxygen, graphviz, mscgen"; fi; if testtag AX_USE_CPPUNIT; then echo -n ", libcppunit-dev"; fi; if testtag AX_CXX_QT || testtag AX_CHECK_QT AX_REQUIRE_QT; then echo -n ", qt5-default | libqt4-core | libqtcore4, qt5-qmake | qt4-qmake, qtbase5-dev | libqt4-dev, qtbase5-dev-tools | qt4-dev-tools, qttools5-dev-tools | qt4-dev-tools, qttools5-dev-tools | qt4-dev-tools"; fi)" BUILD_DEPENDS="debhelper, ${VCSDEPENDS} pkg-config, automake, libtool, autotools-dev, pandoc, lsb-release $(if testtag AX_USE_DOXYGEN; then echo -n ", doxygen, graphviz, mscgen"; fi; if testtag AX_USE_PERLDOC; then echo -n ", libpod-tree-perl"; fi; if testtag AX_USE_PLANTUML; then echo -n ", default-jre-headless|default-jre"; fi; if testtag AX_USE_CPPUNIT; then echo -n ", libcppunit-dev"; fi; if testtag AX_CXX_QT || testtag AX_CHECK_QT AX_REQUIRE_QT; then echo -n ", qt5-default | libqt4-core | libqtcore4, qt5-qmake | qt4-qmake, qtbase5-dev | libqt4-dev, qtbase5-dev-tools | qt4-dev-tools, qttools5-dev-tools | qt4-dev-tools, qttools5-dev-tools | qt4-dev-tools"; fi)"
to debian/control.in <<EOF to debian/control.in <<EOF
Source: @PACKAGE_NAME@ Source: @PACKAGE_NAME@
Priority: extra Priority: extra
@@ -975,10 +1171,17 @@ else
fi) fi)
Source0: %{name}-%{version}.tar.gz Source0: %{name}-%{version}.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
BuildRequires: gnupg, ${VCSDEPENDS} automake, autoconf$( BuildRequires: gnupg, ${VCSDEPENDS} make, automake, autoconf, rpm-build$(
if testtag AX_USE_DOXYGEN; then if testtag AX_USE_DOXYGEN; then
echo -n ", doxygen"; echo -n ", doxygen";
fi) fi
if testtag AX_USE_PERLDOC; then
echo -n ", libpod-tree-perl";
fi
if testtag AX_USE_PLANTUML; then
echo -n ", default-jre-headless";
fi
)
%if 0%{?fedora} != 20 %if 0%{?fedora} != 20
$(if testtag AX_USE_DOXYGEN; then echo -n "BuildRequires: graphviz"; fi) $(if testtag AX_USE_DOXYGEN; then echo -n "BuildRequires: graphviz"; fi)
%endif %endif
@@ -1089,7 +1292,7 @@ fi
if testtag AX_USE_SCRIPTS; then if testtag AX_USE_SCRIPTS; then
SUBDIRS="${SUBDIRS} scripts" SUBDIRS="${SUBDIRS} scripts"
fi fi
if testtag AX_USE_DOXYGEN; then if testtag 'AX_USE_DOXYGEN|AX_USE_PERLDOC'; then
SUBDIRS="${SUBDIRS} doc" SUBDIRS="${SUBDIRS} doc"
fi fi
if testtag AX_BUILD_EXAMPLES; then if testtag AX_BUILD_EXAMPLES; then
@@ -1103,13 +1306,26 @@ for d in src test scripts doc examples html; do
SUBDIRS="${SUBDIRS} $d" SUBDIRS="${SUBDIRS} $d"
fi fi
done done
to --mode "u=rwx,g=rwx,o=rx" autogen.sh <<EOF
#!/bin/bash -e
if test -n "$VCS" -a -d .$VCS -a -e -x $(which ${VCS}2cl); then
$(case "$VCS" in
(svn) echo " ${VCS}2cl";;
(git) echo " ${VCS}2cl > ChangeLog";;
esac)
fi
aclocal
$(if testtag AX_USE_LIBTOOL; then echo libtoolize --force; fi)
automake -a
autoconf
EOF
to makefile.am<<EOF to makefile.am<<EOF
${HEADER}SUBDIRS =${SUBDIRS} ${HEADER}SUBDIRS =${SUBDIRS}
desktopdir = \${datadir}/applications desktopdir = \${datadir}/applications
desktop_DATA = @PACKAGE_DESKTOP@ desktop_DATA = @PACKAGE_DESKTOP@
dist_pkgdata_DATA = @PACKAGE_ICON@ ax_check_qt.m4 bootstrap.sh \\ dist_pkgdata_DATA = @PACKAGE_ICON@ ax_check_qt.m4 bootstrap.sh \\
resolve-rpmbuilddeps.sh \\ resolve-rpmbuilddeps.sh autogen.sh \\
ax_cxx_compile_stdcxx_11.m4 build-in-docker.sh \\ ax_cxx_compile_stdcxx_11.m4 build-in-docker.sh \\
build-resource-file.sh \\ build-resource-file.sh \\
ax_init_standard_project.m4 \\ ax_init_standard_project.m4 \\
@@ -1133,6 +1349,12 @@ Libs: -L\${libdir} -l${PACKAGE_NAME#lib} @LDFLAGS@
Cflags: -I\${includedir} @CPPFLAGS@ Cflags: -I\${includedir} @CPPFLAGS@
Requires: @PKG_REQUIREMENTS@ Requires: @PKG_REQUIREMENTS@
EOF EOF
to build-in-docker.conf <<EOF
repos+=("Debian|Ubuntu-precise::::::universe")
repos+=("Ubuntu-precise:::'deb http://archive.ubuntu.com/ubuntu precise universe'")
envs+=("-e 'HOME=\${HOME}'")
dirs+=("-v \${HOME}/.gnupg:\${HOME}/.gnupg:ro")
EOF
#### Cleanup If Makefile Exists #### #### Cleanup If Makefile Exists ####
if test -f makefile; then if test -f makefile; then
@@ -1148,15 +1370,15 @@ run autoconf
#### Run Configure If User Requires #### #### Run Configure If User Requires ####
if test "$configure" -eq 1; then if test "$configure" -eq 1; then
./configure $* ./configure $* || exit 1
fi fi
#### Run Make If User Requires #### #### Run Make If User Requires ####
if test "$build" -eq 1; then if test "$build" -eq 1; then
make $buildtarget make $buildtarget || exit 1
fi fi
#### Build In Docker If User Requires #### #### Build In Docker If User Requires ####
if test "$docker" -eq 1; then if test "$docker" -eq 1; then
./build-in-docker.sh ./build-in-docker.sh || exit 1
fi fi

View File

@@ -2,6 +2,7 @@
set -o errtrace set -o errtrace
# build and test everything in a fresh docker installation # build and test everything in a fresh docker installation
mode="apt"
img="ubuntu:latest" img="ubuntu:latest"
repos=() repos=()
keys=() keys=()
@@ -24,6 +25,7 @@ while test $# -gt 0; do
echo "OPTIONS:" echo "OPTIONS:"
echo echo
echo " -h, --help show this help" echo " -h, --help show this help"
echo " -m, --mode <type> mode: apt or yum, default: ${mode}"
echo " -i, --image <image> use given docker image instead of ${img}" echo " -i, --image <image> use given docker image instead of ${img}"
echo " -t, --targets targets specify build targets, default: ${targets}" echo " -t, --targets targets specify build targets, default: ${targets}"
echo " -r, --repo <url> add given apt repository" echo " -r, --repo <url> add given apt repository"
@@ -34,6 +36,8 @@ while test $# -gt 0; do
echo " -c, --cmd <command> execute commands as root in docker" echo " -c, --cmd <command> execute commands as root in docker"
echo " -w, --wait on error keep docker container and wait for enter" echo " -w, --wait on error keep docker container and wait for enter"
echo echo
echo " The option -i must be after -m, because mode sets a new default image"
echo
echo " The options -r -k -e -d -p -c can be repeated several times." echo " The options -r -k -e -d -p -c can be repeated several times."
echo echo
echo " The options -r -p -c allow an if-then-else contruct" echo " The options -r -p -c allow an if-then-else contruct"
@@ -60,6 +64,17 @@ while test $# -gt 0; do
echo echo
exit 0 exit 0
;; ;;
(-m|--mode) shift;
mode="$1"
case "$mode" in
(apt) img="ubuntu:latest";;
(yum) img="centos:latest";;
(*)
echo "**** ERROR: unknown mode '$1', try --help" 1>&2
exit 1
;;
esac
;;
(-i|--image) shift; (-i|--image) shift;
img="$1" img="$1"
;; ;;
@@ -167,14 +182,16 @@ function ifthenelse() {
set -x set -x
OPTIONS='-o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confnew -y --force-yes --no-install-suggests --no-install-recommends'
docker pull $img docker pull $img
DOCKER_ID=$(docker run -d ${dirs[@]} ${envs[@]} -w /workdir $img sleep infinity) DOCKER_ID=$(docker run -d ${dirs[@]} ${envs[@]} -e HOME="${HOME}" -w /workdir $img sleep infinity)
trap 'traperror '"${DOCKER_ID}"' "$? ${PIPESTATUS[@]}" $LINENO $BASH_LINENO "$BASH_COMMAND" "${FUNCNAME[@]}" "${FUNCTION}"' SIGINT INT TERM EXIT trap 'traperror '"${DOCKER_ID}"' "$? ${PIPESTATUS[@]}" $LINENO $BASH_LINENO "$BASH_COMMAND" "${FUNCNAME[@]}" "${FUNCTION}"' SIGINT INT TERM EXIT
case $mode in
(apt)
OPTIONS='-o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confnew -y --force-yes --no-install-suggests --no-install-recommends'
for f in 'libpam-systemd:amd64' 'policykit*' 'colord'; do for f in 'libpam-systemd:amd64' 'policykit*' 'colord'; do
docker exec -it ${DOCKER_ID} bash -c "echo 'Package: $f' >> /etc/apt/preferences" docker exec ${DOCKER_ID} bash -c "echo 'Package: $f' >> /etc/apt/preferences"
docker exec -it ${DOCKER_ID} bash -c "echo 'Pin-Priority: -100' >> /etc/apt/preferences" docker exec ${DOCKER_ID} bash -c "echo 'Pin-Priority: -100' >> /etc/apt/preferences"
docker exec -it ${DOCKER_ID} bash -c "echo >> /etc/apt/preferences" docker exec ${DOCKER_ID} bash -c "echo >> /etc/apt/preferences"
done done
docker exec ${DOCKER_ID} apt-get update ${OPTIONS} docker exec ${DOCKER_ID} apt-get update ${OPTIONS}
docker exec ${DOCKER_ID} apt-get upgrade ${OPTIONS} docker exec ${DOCKER_ID} apt-get upgrade ${OPTIONS}
@@ -196,5 +213,25 @@ for command in "${commands[@]}"; do
ifthenelse "${command}" "ARG" ifthenelse "${command}" "ARG"
done done
docker exec ${DOCKER_ID} ./resolve-debbuilddeps.sh docker exec ${DOCKER_ID} ./resolve-debbuilddeps.sh
docker exec -u $(id -u) ${DOCKER_ID} test -d .svn && svn upgrade || true ;;
docker exec -u $(id -u) ${DOCKER_ID} ./bootstrap.sh -t "${targets}" (yum)
./bootstrap.sh -t dist
if [[ "$img" =~ "centos" ]]; then
docker exec ${DOCKER_ID} yum install -y redhat-lsb
docker exec -i ${DOCKER_ID} bash -c 'cat > /etc/yum.repos.d/wandisco-svn.repo' <<EOF
[WandiscoSVN]
name=Wandisco SVN Repo
EOF
docker exec -i ${DOCKER_ID} bash -c 'echo "baseurl=http://opensource.wandisco.com/centos/$(lsb_release -sr | sed '"'"'s,[^0-9].*,,'"'"')/svn-'$(svn --version | head -1 | sed 's,[^0-9]*\([0-9]\+\.[0-9]\+\).*,\1,')'/RPMS/$(uname -i)/" >> /etc/yum.repos.d/wandisco-svn.repo'
docker exec -i ${DOCKER_ID} bash -c 'cat >> /etc/yum.repos.d/wandisco-svn.repo' <<EOF
enabled=1
gpgcheck=0
EOF
fi
docker exec ${DOCKER_ID} yum install -y rpm-build
docker exec ${DOCKER_ID} groupadd -g $(id -g) build
docker exec ${DOCKER_ID} useradd -g $(id -g) -u $(id -u) build
docker exec ${DOCKER_ID} ./resolve-rpmbuilddeps.sh || true
;;
esac
docker exec -u $(id -u):$(id -g) ${DOCKER_ID} ./bootstrap.sh -t "${targets}"

View File

@@ -51,7 +51,7 @@ PROJECT_BRIEF = @DESCRIPTION@
# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo # and the maximum width should not exceed 200 pixels. Doxygen will copy the logo
# to the output directory. # to the output directory.
PROJECT_LOGO = @top_srcdir@/@PACKACE_LOGO@ PROJECT_LOGO = @top_srcdir@/@PACKAGE_LOGO@
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
# into which the generated documentation will be written. If a relative path is # into which the generated documentation will be written. If a relative path is

8
doc/footer.html.in Normal file
View File

@@ -0,0 +1,8 @@
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
$navpath
<li class="footer"><a href="@AUTHOR_URL@" target="_blank">@AUTHOR_NAME@</a></li>
</ul>
</div>
</body>
</html>

33
doc/header.html.in Normal file
View File

@@ -0,0 +1,33 @@
<!-- HTML header for doxygen 1.8.6-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen $doxygenversion"/>
<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->
<link href="$relpath^tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="$relpath^jquery.js"></script>
<script type="text/javascript" src="$relpath^dynsections.js"></script>
$treeview
$search
$mathjax
<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
$extrastylesheet
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<div id="projecthead">
<div id="projectlogo"><img alt="" src="$relpath^$projectlogo"/></div>
<div id="projectname">$projectname</span>&#160;<span id="projectnumber">$projectnumber</div>
<div id="projectbrief">$projectbrief</div>
</div>
<nav>
<a href="@PROJECT_URL@" target="_blank">Project Management</a>
<a href="@SOURCE_DOWNLOAD@" target="_blank">Download</a>
<div>$searchbox</div>
</nav>
</div>

BIN
doc/plantuml.jar Normal file

Binary file not shown.

38
doc/style.css Normal file
View File

@@ -0,0 +1,38 @@
#titlearea {
display: flex;
justify-content: space-between;
align-items: flex-begin;
}
#titlearea nav {
padding: 0;
margin: 0;
}
#titlearea nav a {
background-color: lightgray;
border: 1px solid gray;
color: black;
padding: 1ex;
margin: 0;
}
img, object {
max-width: 100% !important;
}
@media (max-width: 50em) {
#navrow1, #navrow2 {
display: block
}
#side-nav, #splitbar, .ui-resizable-handle ui-resizable-e, .ui-resizable-handle ui-resizable-s {
display: none;
}
#doc-content {
margin-left: 0 !important;
}
}
@media (min-width: 50em) {
#navrow1, #navrow2 {
display: none;
}
#side-nav, #splitbar, .ui-resizable-handle ui-resizable-e, .ui-resizable-handle ui-resizable-s {
display: block
}
}

9
makefile_test.inc.am Normal file
View File

@@ -0,0 +1,9 @@
## @id $Id$
## 1 2 3 4 5 6 7 8
## 45678901234567890123456789012345678901234567890123456789012345678901234567890
%.gcda: %
gcov $<
CLEANFILES += ${CLEANFILES} ${TEST:%=%.gcno} ${TEST:%=%.gcda} *.gcov

View File

@@ -1,69 +1,49 @@
module.exports = function(config) { module.exports = function(config) {
const crypto = require('crypto'); authentication = function (username, password, success, fail) {
const password = crypto.randomBytes(256);
var cookie = require('cookie-encryption');
// const cipher = crypto.createCipher('aes256', password);
// const decipher = crypto.createDecipher('aes256', password);
// var encrypted = cipher.update(JSON.stringify(user), 'utf8', 'base64')
// + cipher.final('base64');
// console.log("encrypted", encrypted);
// var decrypted = decipher.update(encrypted, 'base64', 'utf8') + decipher.final('utf8');
// console.log("decrypted", decrypted);
var authentication = function (req, res, next) {
return next();
}
if (config) { if (config) {
const crypto = require('crypto');
var cipher = config.cookies && config.cookies.cipher ? config.cookies.cipher : "aes256"; if (config.passwords && config.passwords[username]) {
if (crypto.getHashes().indexOf(config.passwords[username][0])>=0) {
authentication = function (req, res, next) { if (crypto.createHash(config.passwords[username][0]).update(password, 'utf8').digest('hex') === config.passwords[username][1]) {
success();
function unauthorized(res) { return;
res.setHeader('WWW-Authenticate', 'Basic realm=Authorization Required'); } else {
res.status(401).send('Not logged in. <a href="/">Login</a>'); fail();
}; return;
var user = require('basic-auth')(req);
var vault = cookie('credentials');
if (!user || !user.name || !user.pass) {
return unauthorized(res);
};
if (config.passwords && config.passwords[user.name]) {
if (crypto.getHashes().indexOf(config.passwords[user.name][0])>=0) {
if (crypto.createHash(config.passwords[user.name][0])
.update(user.pass, 'utf8').digest('hex') === config.passwords[user.name][1]) {
return next();
} }
} else { } else {
console.log("**** HASH NOT FOUND ****"); console.log("**** HASH NOT FOUND ****");
console.log(config.passwords[user.name][0]); console.log(config.passwords[username][0]);
console.log(crypto.getHashes()); console.log(crypto.getHashes());
fail();
return;
} }
} }
if (config.ldap) try { if (config.ldap) try {
var LdapAuth = require('ldapauth'); var LdapAuth = require('ldapauth');
var auth = new LdapAuth(config.ldap); var auth = new LdapAuth(config.ldap);
auth.authenticate(user.name, user.pass, function(err, usr) { auth.authenticate(username, password, function(err, usr) {
auth.close(function(err) {}) auth.close(function(err) {})
if (err) { if (err) {
console.log("**** ERROR: LDAP Authentication failed:", err); console.log("**** ERROR: LDAP Authentication failed:", err);
return unauthorized(res); fail();
return;
} }
console.log("**** SUCCESS: LDAP Authentication:"); console.log("**** SUCCESS: LDAP Authentication:");
return next(); success();
return;
}); });
return; // need to block here! return; // need to block here!
} catch (e) { } catch (e) {
console.log("**** Error: LDAP failed: ", e, e.stack); console.log("**** Error: LDAP failed: ", e, e.stack);
fail();
return;
} }
return unauthorized(res); }
}; fail();
return;
} }
return authentication; return authentication;

View File

@@ -1,9 +1,6 @@
{ {
"port": 8888, "port": 8888,
"restrict": { "restrict": {
"cookies": {
"cipher": "aes256"
},
"passwords": { "passwords": {
"marc": ["sha256", "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"], "marc": ["sha256", "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"],
"foo": ["sha256", "fcde2b2edba56bf408601fb721fe9b5c338d10ee429ea04fae5511b68fbf8fb9"] "foo": ["sha256", "fcde2b2edba56bf408601fb721fe9b5c338d10ee429ea04fae5511b68fbf8fb9"]

View File

@@ -2,14 +2,23 @@
"name": "@PACKAGE_NAME@", "name": "@PACKAGE_NAME@",
"version": "@PACKAGE_VERSION@", "version": "@PACKAGE_VERSION@",
"private": true, "private": true,
"description": "Docker as a Service", "dependencies": {
"main": "servicedock.js", "express": "~2.5.8",
"stylus": "~0.53.0",
"ejs": ">= 0.0.1",
"socket.io": "~1.4.4",
"pty.js": "~0.3.0",
"async": "~1.5.2",
"socketio-auth": "0.0.5"
},
"description": "@DESCRIPTION@",
"main": "@PACKAGE_NAME@.js",
"devDependencies": {}, "devDependencies": {},
"scripts": { "scripts": {
"test": "echo \"Error: no test specified\" && exit 1" "test": "echo \"Error: no test specified\" && exit 1"
}, },
"author": "Marc Wäckerlin", "author": "@AUTHOR@",
"license": "LGPL3", "license": "@LICENSE@",
"path": { "path": {
"prefix": "@PREFIX@", "prefix": "@PREFIX@",
"sysconf": "@SYSCONFDIR@", "sysconf": "@SYSCONFDIR@",
@@ -18,16 +27,5 @@
"log": "@LOCALSTATEDIR@/log/@PACKAGE_NAME@.log", "log": "@LOCALSTATEDIR@/log/@PACKAGE_NAME@.log",
"config": "@SYSCONFDIR@/@PACKAGE_NAME@.json", "config": "@SYSCONFDIR@/@PACKAGE_NAME@.json",
"nodejs": "@PKGDATADIR@/nodejs" "nodejs": "@PKGDATADIR@/nodejs"
},
"dependencies": {
"express": "~2.5.8",
"stylus": "~0.53.0",
"ejs": ">= 0.0.1",
"socket.io": "~1.4.4",
"pty.js": "~0.3.0",
"async": "~1.5.2",
"basic-auth": "~1.0.3",
"ldapauth": "~2.2.4",
"cookie-encryption": "~1.4.2"
} }
} }

View File

@@ -95,7 +95,6 @@ function status(text, msg) {
if (msg) success(msg); if (msg) success(msg);
else setTimeout("$('#status').fadeOut('slow')", 5000); else setTimeout("$('#status').fadeOut('slow')", 5000);
zoom(0); zoom(0);
stats();
$("#main").show(); $("#main").show();
$("form input:first-child").focus(); $("form input:first-child").focus();
docker.containers.contextmenu("#main"); docker.containers.contextmenu("#main");
@@ -106,24 +105,47 @@ function emit(signal, data) {
socket.emit(signal, data); socket.emit(signal, data);
} }
function connected() { function connect() {
console.log("server connected"); $("#server").html($("#username").val()+'@'+window.location.hostname)
console.log("server connect");
$("#connectionstatus #bad").hide(); $("#connectionstatus #bad").hide();
$("#connectionstatus #authentication").show();
$("#connectionstatus #good").hide();
success("login to server");
socket.emit('authentication', {
username: $("#username").val(),
password: $("#password").val()
});
}
function authenticated() {
$("#server").html($("#username").val()+'@'+window.location.hostname)
console.log("server authenticated");
$("#connectionstatus #bad").hide();
$("#connectionstatus #authentication").hide();
$("#connectionstatus #good").show(); $("#connectionstatus #good").show();
success("server connected"); success("server connected");
start();
}
function unauthorized() {
$("#server").html($("#username").val()+'@'+window.location.hostname)
console.log("authentication failed");
$("#connectionstatus #good").hide();
$("#connectionstatus #authentication").hide();
$("#connectionstatus #bad").show();
error("authentication failed", true);
} }
function disconnected() { function disconnected() {
$("#server").html($("#username").val()+'@'+window.location.hostname)
console.log("server disconnected"); console.log("server disconnected");
$("#connectionstatus #good").hide(); $("#connectionstatus #good").hide();
$("#connectionstatus #authentication").hide();
$("#connectionstatus #bad").show(); $("#connectionstatus #bad").show();
error("server disconnected", true); error("server disconnected", true);
} }
function connectionstatus() {
if (socket.connected) connected(); else disconnected();
}
/// Toggle Menu Display /// Toggle Menu Display
function togglemenu() { function togglemenu() {
$("#menu").toggle(); $("#menu").toggle();
@@ -371,44 +393,58 @@ function containers(c) {
overview(); overview();
} }
function showImage() { function showLogin() {
$("#create").hide();
$("#logs").hide();
$("#console").hide();
$("#close").hide(); $("#close").hide();
$("#console").hide();
$("#create").hide();
$("#imagetools").hide();
$("#login").show();
$("#logs").hide();
$("#main").hide();
}
function showImage() {
$("#close").hide();
$("#console").hide();
$("#create").hide();
$("#imagetools").show(); $("#imagetools").show();
$("#login").hide();
$("#logs").hide();
$("#main").show(); $("#main").show();
} }
function showCreate() { function showCreate() {
$("#main").hide();
$("#logs").hide();
$("#console").hide();
$("#imagetools").show();
$("#close").show(); $("#close").show();
$("#console").hide();
$("#create").show(); $("#create").show();
$("#imagetools").show();
$("#login").hide();
$("#logs").hide();
$("#main").hide();
previewCreate(); previewCreate();
} }
function showConsole() { function showConsole() {
$("#main").hide();
$("#create").hide();
$("#logs").hide();
$("#imagetools").hide();
$("#console").show();
$("#close").show(); $("#close").show();
$("#console").show();
$("#create").hide();
$("#imagetools").hide();
$("#login").hide();
$("#logs").hide();
$("#main").hide();
// $("#command").focus(); // $("#command").focus();
// $("#command").val(""); // $("#command").val("");
// if ($("#screen").val()!="") $("#screen").append("\n"); // if ($("#screen").val()!="") $("#screen").append("\n");
} }
function showLogs() { function showLogs() {
$("#main").hide();
$("#create").hide();
$("#console").hide();
$("#imagetools").hide();
$("#close").show(); $("#close").show();
$("#console").hide();
$("#create").hide();
$("#imagetools").hide();
$("#login").hide();
$("#logs").show(); $("#logs").show();
$("#main").hide();
} }
function logs(data) { function logs(data) {
@@ -542,13 +578,12 @@ function overview() {
} }
/// Initial Function: Startup /// Initial Function: Startup
/** Decide whether to login or to create a new user */ /** To be called after login */
function start() { function start() {
$("#imagetools").hide(); $("#imagetools").hide();
$("#close").hide(); $("#close").hide();
$("#popup").hide(); $("#popup").hide();
$("#menu").hide(); $("#menu").hide();
$("#username").html(window.location.hostname)
try { try {
status("Starting up ..."); status("Starting up ...");
emit("images"); emit("images");
@@ -597,26 +632,25 @@ function initForms() {
} }
function init() { function init() {
$("#logout").attr("href",
window.location.protocol+"//X:X@"
+window.location.hostname
+(window.location.port?":":"")+window.location.port
+window.location.pathname);
socket = io.connect(); socket = io.connect();
socket.io socket
.on("connect", connected) .io
.on("reconnect", connected) .on("connect", connect)
.on("reconnect", connect)
.on("disconnect", disconnected) .on("disconnect", disconnected)
.on("error", disconnected); .on("error", disconnected);
socket socket
.on("authenticated", authenticated)
.on("unauthorized", unauthorized)
.on("fail", error) .on("fail", error)
.on("containers", containers) .on("containers", containers)
.on("images", images) .on("images", images)
.on("stats", stats) .on("stats", stats)
.on("logs", logs) .on("logs", logs)
.on("bash-data", bash_data); .on("bash-data", bash_data);
$("#server").html($("#username").value+'@'+window.location.hostname)
initForms(); initForms();
start(); showLogin();
} }
/// On Load, Call @ref start /// On Load, Call @ref start

View File

@@ -156,6 +156,7 @@ table.docker li+li {
#statusbar { #statusbar {
position: fixed; position: fixed;
width: 100%;
left: 0; left: 0;
right: 0; right: 0;
bottom: 0; bottom: 0;
@@ -163,8 +164,22 @@ table.docker li+li {
padding: 0 1em 0 1em; padding: 0 1em 0 1em;
color: white; color: white;
} }
#status: {
float: right; #status {
position: fixed;
right: 0;
bottom: 0;
margin: 0 1em 0 1em;
padding: 0 1em 0 1em;
}
#good {
color: green;
}
#authentication {
color: yellow;
}
#bad {
color: red;
} }
@media (max-width: 45em) { @media (max-width: 45em) {
#username { #username {
@@ -234,7 +249,7 @@ table.docker li+li {
background-color: #777; background-color: #777;
} }
#main, #logs, #console, #create { #main, #logs, #console, #create, #login {
position: fixed; position: fixed;
top: 1.5em; top: 1.5em;
left: 0; left: 0;
@@ -246,7 +261,7 @@ table.docker li+li {
bottom: 1.5em; bottom: 1.5em;
} }
#main, #create { #main, #create, #login {
background-color: white; background-color: white;
} }

View File

@@ -16,20 +16,20 @@ try {
var app = module.exports = express.createServer(); var app = module.exports = express.createServer();
var io = require('socket.io').listen(app); var io = require('socket.io').listen(app);
var sockets = require(__dirname+'/sockets')(io);
var package = require(__dirname+'/package.json'); var package = require(__dirname+'/package.json');
var config = require(package.path.config); var config = require(package.path.config);
var docker = require(__dirname+'/docker')(app); var docker = require(__dirname+'/docker')(app);
var authentication = require(__dirname+'/authentication')(config.restrict); //var authentication = require(__dirname+'/authentication')(config.restrict);
var sockets = require(__dirname+'/sockets')(io);
// Configuration // Configuration
process.argv.forEach(function(val, index) { process.argv.forEach(function(val, index) {
if (index<2) {return} if (index<2) {return}
if (index!=2 || typeof val != 'number') { if (index!=2 || isNaN(val)) {
console.log("**** ERROR: Unexpected Argument - allowed is only a port number"); console.log("**** ERROR: Unexpected Argument - allowed is only a port number");
process.exit(1); process.exit(1);
} }
config.port = val; config.port = parseInt(val);
}); });
if (typeof config.port != 'number') { if (typeof config.port != 'number') {
console.log("**** WARNING: no valid port given, defaults to 8888"); console.log("**** WARNING: no valid port given, defaults to 8888");
@@ -55,7 +55,7 @@ try {
}); });
// Routes // Routes
app.get('/', authentication, routes.index); app.get('/', routes.index);
app.listen(config.port, function() { app.listen(config.port, function() {
console.log("Express server listening on port %d in %s mode", console.log("Express server listening on port %d in %s mode",

View File

@@ -84,9 +84,9 @@ module.exports = function(io) {
exec("docker images -q --no-trunc", imagelist); exec("docker images -q --no-trunc", imagelist);
} }
function connection(socket) { function connection(socket, userdata) {
console.log("new connection"); console.log("=> new connection from "+userdata.username);
function emit(signal, data, info) { function emit(signal, data, info) {
if (typeof data == 'string' && !data.match("\n")) { if (typeof data == 'string' && !data.match("\n")) {
@@ -281,7 +281,20 @@ module.exports = function(io) {
} }
// Handle Connection // Handle Connection
io.sockets.on('connection', connection); require('socketio-auth')(io, {
authenticate: function (socket, data, callback) {
console.log("=> authenticate: ", data.username);
//get credentials sent by the client
var username = data.username;
var password = data.password;
if (username=="hello")
return callback(null, "world" == password);
else
return callback(new Error("wrong credentials"));
},
postAuthenticate: connection,
timeout: "none"
});
// Regular Update of Stats // Regular Update of Stats
setInterval(function() { setInterval(function() {

View File

@@ -31,7 +31,6 @@
<ul id="menu" style="display: none" onmouseleave="$('#menu').hide();"> <ul id="menu" style="display: none" onmouseleave="$('#menu').hide();">
<li onclick="$('#menu').hide(); showCreate()">Create</li> <li onclick="$('#menu').hide(); showCreate()">Create</li>
<li><label for="upload">Upload</label><input autocomplete="off" type="file" accept="*.json" id="upload"/></li> <li><label for="upload">Upload</label><input autocomplete="off" type="file" accept="*.json" id="upload"/></li>
<li><a id="logout" href="">Logout</a></li>
</ul> </ul>
<script type="text/javascript"> <script type="text/javascript">
$(function() { $(function() {
@@ -46,6 +45,17 @@
</div> </div>
<div id="login">
<h1>Login</h1>
<form onsubmit="connect()">
<label for="username">User Name</label>
<input id="username" type="text" />
<label for="password">Password</label>
<input id="password" type="password" />
<button type="button" onclick="connect()">Login</button>
</form>
</div>
<div id="create" style="display: none"> <div id="create" style="display: none">
<form> <form>
<fieldset> <fieldset>
@@ -119,14 +129,15 @@
</div> </div>
<div id="statusbar"> <div id="statusbar">
<span id="status"> <span id="server">[unknown]</span>
<noscript>JavaScript is required for the interface.</noscript>
</span>
<span id="username">[unknown]</span>
<span id="connectionstatus"> <span id="connectionstatus">
<span id="good" title="connected" style="display: none">&#x2714;</span> <span id="good" title="connected" style="display: none">&#x2714;</span>
<span id="authentication" title="authentication" style="display:none">&#x1f511;</span>
<span id="bad" title="disconnected">&#x2718;</span> <span id="bad" title="disconnected">&#x2718;</span>
</span> </span>
<span id="status">
<noscript>JavaScript is required for the interface.</noscript>
</span>
</div> </div>
</body> </body>

View File

@@ -16,7 +16,7 @@ if test -n "${SCHROOTNAME}"; then
SUDO="schroot -c "${SCHROOTNAME}" -u root -d / --" SUDO="schroot -c "${SCHROOTNAME}" -u root -d / --"
else else
DO="" DO=""
if grep -q '/docker/' /proc/1/cgroup; then if grep -q '/docker' /proc/1/cgroup; then
SUDO="" SUDO=""
else else
SUDO="sudo" SUDO="sudo"

View File

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

View File

@@ -11,6 +11,11 @@ H;$!d;$x
# remove all single-line comment lines # remove all single-line comment lines
s/\n--[^\n]*//g s/\n--[^\n]*//g
# encode html entities
s/&/\&amp##SEMICOLON##/g
s/</\&lt##SEMICOLON##/g
s/>/\&gt##SEMICOLON##/g
# reduce spaces # reduce spaces
s,\t\| \+, ,g s,\t\| \+, ,g
@@ -21,7 +26,7 @@ s,\t\| \+, ,g
s,\n\+,\n,g s,\n\+,\n,g
# remove unknown commands # remove unknown commands
s,\(;\|\n\) *\(DELIMITER\|USE\|DROP\|CREATE[ \n]\+DATABASE\)[ \n]\+[^;]*;\+,,ig s,\(;\|\n\) *\(INSERT\|DELIMITER\|USE\|DROP\|CREATE[ \n]\+DATABASE\)[ \n]\+[^;]*;\+,,ig
# convert special characters within quotes # convert special characters within quotes
:a;s/^\(\([^"]*"[^",]*"\)*[^"]*"[^"]*\),\([^"]*".*\)/\1\##COMMA##\3/g;ta :a;s/^\(\([^"]*"[^",]*"\)*[^"]*"[^"]*\),\([^"]*".*\)/\1\##COMMA##\3/g;ta
@@ -34,17 +39,18 @@ h
s,.*\(create[ \n]\+table[^;]*;\).*,\1,ig s,.*\(create[ \n]\+table[^;]*;\).*,\1,ig
# start html table node # start html table node
s|CREATE[ \n]\+TABLE[ \n]\+\(if[ \n]\+not[ \n]\+exists[ \n]\+\)\?`\?\(\w\+\)`\?| \2\n [shape=none, margin=0, label=<\n <table bgcolor="#dddddd">\n <tr><td bgcolor="#ddddff" colspan="4"><b>\2</b></td></tr>|ig s|CREATE[ \n]\+TABLE[ \n]\+\(IF[ \n]\+NOT[ \n]\+EXISTS[ \n]\+\)\?`\?\(\w\+\)`\?| \2\n [shape=none, margin=0, label=<\n <table bgcolor="#dddddd">\n <tr><td bgcolor="#ddddff" colspan="4"><b>\2</b></td></tr>|ig
# remove key definitions # remove key definitions
s/[),][\n ]*\(PRIMARY[ \n]\+\)\?KEY[ \n]\+[^(]*([^)]*)//gi s/[),][\n ]*\(\(UNIQUE\|PRIMARY\)[ \n]\+\)\?KEY[ \n]\+[^(]*([^)]*)//gi
# move foreign keys as relation to the end # move foreign keys as relation to the end
:b;s/\(\w\+\)\([^;]*\)FOREIGN[\n ]\+KEY[ \n]*([ \n]*`\?\([a-z]\+\)`\?[ \n]*)[ \n]*REFERENCES[ \n]*`\?\([a-z]\+\)`\?[ \n]*([ \n]*`\?\([a-z]\+\)`\?[ \n]*)[ \n]*\([^,)]*\)\([,)].*\)/\1\2\7\n \1:\3 -> \4:\5 [label="\6"]##SEMICOLON##/ig;tb :b;s/\(\w\+\)\([^;]*\)FOREIGN[\n ]\+KEY[ \n]*([ \n]*`\?\([a-z]\+\)`\?[ \n]*)[ \n]*REFERENCES[ \n]*`\?\([a-z]\+\)`\?[ \n]*([ \n]*`\?\([a-z]\+\)`\?[ \n]*)[ \n]*\([^,)]*\)\([,)].*\)/\1\2\7\n \1:\3 -> \4:\5 [label="\6"]##SEMICOLON##/ig;tb
# create table rows # create table rows
s|[(,][ \n]*`\?\(\w\+\)`\?[ \n]\+\(\w\+\(([^)]\+)\)\?\)[ \n]*\([^,)]*\)[ \n]\+COMMENT[ \n]*["']\([^"']*\)["'][ \n]*|\n <tr><td align="left" port="\1"><b>\1</b></td><td align="left">\2</td><td align="left">\4</td><td align="left">\5</td></tr>|gi s|[(,][ \n]*`\?\(\w\+\)`\?[ \n]\+\(\w\+\(([^)]\+)\)\?\)[ \n]*\([^,)]*\)|\n <tr><td align="left" port="\1"><b>\1</b></td><td align="left">\2</td><td align="left">\4</td><td></td></tr>|g
s|[(,][ \n]*`\?\(\w\+\)`\?[ \n]\+\(\w\+\(([^)]\+)\)\?\)[ \n]*\([^,)]*\)|\n <tr><td align="left" port="\1"><b>\1</b></td><td align="left">\2</td><td align="left">\4</td></tr>|g # extract comment
s|\(<td\( *\w*="\w*"\)* *>[^<]*\)COMMENT[ \n]\+["']\([^"']*\)["']\([^<]*</td>\)<td></td>|\1\4<td align="left">\3</td>|g
# add line breaks for long lines # add line breaks for long lines
s|\(<td[^>]*>[^<]\{30,40\}\)[ \n]\+\([^<]\{20,\}</td>\)|\1<br/>\2|g s|\(<td[^>]*>[^<]\{30,40\}\)[ \n]\+\([^<]\{20,\}</td>\)|\1<br/>\2|g