diff --git a/COPYING b/COPYING index caeca07..88798ab 120000 --- a/COPYING +++ b/COPYING @@ -1 +1 @@ -/usr/share/automake-1.14/COPYING \ No newline at end of file +/usr/share/automake-1.15/COPYING \ No newline at end of file diff --git a/ChangeLog b/ChangeLog index d5488fd..e69de29 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,605 +0,0 @@ -2015-12-04 07:05 marc - - * COPYING, ChangeLog, INSTALL, build-in-docker.conf, - build-in-docker.sh, cordova/makefile.am, - cordova/platforms/android/AndroidManifest.xml, - cordova/platforms/android/assets/www/cordova_plugins.js, - cordova/platforms/android/res/xml/config.xml, - cordova/plugins/android.json, cordova/plugins/fetch.json, - html/index.html.in: build all in docker - -2015-12-02 15:58 marc - - * build-in-docker.conf, build-in-docker.sh, - resolve-debbuilddeps.sh: enhanced build in docker - -2015-12-02 07:17 marc - - * build-in-docker.conf: build requires universe for npm - -2015-12-01 14:50 marc - - * build-in-docker.conf, build-in-docker.sh, debian/control.in: - improved dependencies for more ubuntu support - -2015-12-01 13:10 marc - - * build-in-docker.conf: build everything in docker now, 2nd try - -2015-12-01 12:17 marc - - * bootstrap.sh, build-in-docker.conf, build-in-docker.sh, - configure.ac, makefile.am: build everithing in docker now - -2015-11-25 15:25 marc - - * build-in-docker.sh: allow add repositories (for cordova-cli) - -2015-11-25 12:45 marc - - * configure.ac, debian/control.in: install cordova from ubuntu ppa - -2015-11-25 10:05 marc - - * configure.ac, cordova/makefile.am, debian/control.in: fixes for - cordova - -2015-11-25 08:57 marc - - * ax_init_standard_project.m4, bootstrap.sh, configure.ac, - debian/control.in, sql-to-dot.sed: check for android and cordova - separately; depend on npm and nodejs for cordova - -2015-11-20 14:05 marc - - * ChangeLog, cordova/config.xml.in, cordova/makefile.am, - html/safechat.js, safechat.desktop.in: try to allow background - process - -2015-11-09 22:34 marc - - * html/documentation.dox, html/makefile.am: added missing doc - -2015-11-09 22:13 marc - - * doc/doxyfile.in, html/checknewuser.php, html/get.php, - html/login.php, html/pubkey.php, html/send.php: improved - documentation, better api documentation - -2015-11-09 18:04 marc - - * ChangeLog, cordova/platforms/android/AndroidManifest.xml, - cordova/platforms/android/res/xml/config.xml, doc/doxyfile.in, - html/safechat.js, makefile.am, test/settings.wt, - test/testcase.wt: minor docu fixes - -2015-11-09 15:12 marc - - * ChangeLog, bootstrap.sh, doc/doxyfile.in, html/makefile.am, - html/opendb.php, resolve-debbuilddeps.sh, sql-to-dot.sed: better - documentation - -2015-11-09 11:13 marc - - * ChangeLog, ax_init_standard_project.m4, bootstrap.sh, - configure.ac, cordova/platforms/android/AndroidManifest.xml, - cordova/platforms/android/res/xml/config.xml, - html/checknewuser.php, html/get.php, html/login.php, - html/messagetable.php, html/messagetable.sql, html/opendb.php, - html/pubkey.php, html/safechat.js, html/schema.sql, - html/send.php, html/usertable.php, html/usertable.sql, test, - test/makefile.am, test/runtests.sh: new way to generate database - fromseparate schema.sql - -2015-11-07 10:47 marc - - * bootstrap.sh: there is no qt4-default - -2015-11-07 09:23 marc - - * bootstrap.sh: there is no qt4-default - -2015-11-06 15:39 marc - - * html/makefile.am, html/messagetable.php, html/messagetable.sql, - html/usertable.php, html/usertable.sql: split sql schema from php - -2015-11-05 16:01 marc - - * ChangeLog, html/messagetable.php, html/usertable.php: - documentation added to tables - -2015-11-05 13:24 marc - - * ChangeLog, bootstrap.sh, - cordova/platforms/android/AndroidManifest.xml, - cordova/platforms/android/res/xml/config.xml, debian, - debian/control.in, makefile.am, scripts/safechat-install.sh: - build in docker successful - -2015-11-05 12:53 marc - - * bootstrap.sh, debian, debian/changelog.in, debian/compat, - debian/control.in, debian/docs, debian/rules: updated build - system - -2015-11-05 09:58 marc - - * ChangeLog, ax_check_qt.m4, ax_init_standard_project.m4, - bootstrap.sh, build-in-docker.sh, resolve-debbuilddeps.sh: - updated build system - -2015-11-04 15:48 marc - - * html/messagetable.php, html/safechat.js, html/usertable.php: - added foreign key to database - -2015-11-03 22:02 marc - - * AUTHORS, ax_check_qt.m4, ax_init_standard_project.m4, - bootstrap.sh, configure.ac, - cordova/platforms/android/AndroidManifest.xml, - cordova/platforms/android/res/xml/config.xml, html/functions.php, - html/login.php, html/messagetable.php, html/pubkey.php, - html/safechat.js, html/send.php, html/usertable.php, makefile.am, - resolve-rpmbuilddeps.sh, safechat.spec.in, scripts, - scripts/makefile.am: AUTHOR updated to new homepage - -2015-09-25 05:58 marc - - * html/login.php: typo - -2015-09-24 21:47 marc - - * ChangeLog, cordova/makefile.am, html/index.html.in, - html/login.php, html/newuser.html, html/safechat.css, - html/safechat.js: better welcome page; - password-forgotten-feature; refs #32 - -2015-09-22 18:09 marc - - * ChangeLog, cordova/config.xml.in, - cordova/platforms/android/AndroidManifest.xml, - cordova/platforms/android/res/xml/config.xml: fixed android - problems; uninstall before update; closes #29 - -2015-09-21 19:46 marc - - * cordova/makefile.am: fix build error message - -2015-09-21 15:02 marc - - * ChangeLog, cordova/makefile.am, - cordova/platforms/android/AndroidManifest.xml, - cordova/platforms/android/res/xml/config.xml: more stable build - - cordova often crashes, so retry - -2015-09-21 14:44 marc - - * html/index.html.in: added menu about - -2015-09-20 20:45 marc - - * configure.ac, cordova/makefile.am, - cordova/platforms/android/AndroidManifest.xml, - cordova/platforms/android/res/xml/config.xml, html/index.html.in, - html/safechat.css: build debian packages should work now - -2015-09-20 13:13 marc - - * configure.ac, cordova/makefile.am, debian/control.in: build for - cordova an android is now optional, only if tools are available - -2015-09-19 13:24 marc - - * ax_init_standard_project.m4, cordova/makefile.am: make distcheck - is now successful - -2015-09-19 08:42 marc - - * ax_check_qt.m4, ax_init_standard_project.m4, bootstrap.sh, - build-resource-file.sh, cordova/logo.png, cordova/makefile.am, - cordova/platforms/android/.gradle, - cordova/platforms/android/res/drawable-hdpi/icon.png, - cordova/platforms/android/res/drawable-ldpi/icon.png, - cordova/platforms/android/res/drawable-mdpi/icon.png, - cordova/platforms/android/res/drawable-xhdpi/icon.png, - cordova/platforms/android/res/drawable/icon.png, - resolve-debbuilddeps.sh, resolve-rpmbuilddeps.sh: basic android - abb works, distcheck fails; refs #24 - -2015-09-15 19:24 marc - - * configure.ac, cordova, cordova/config.xml.in, cordova/hooks, - cordova/hooks/README.md, cordova/makefile.am, cordova/platforms, - cordova/platforms/android, cordova/platforms/android/.gitignore, - cordova/platforms/android/.gradle, - cordova/platforms/android/.gradle/2.2.1, - cordova/platforms/android/.gradle/2.2.1/taskArtifacts, - cordova/platforms/android/.project, - cordova/platforms/android/AndroidManifest.xml, - cordova/platforms/android/CordovaLib, - cordova/platforms/android/CordovaLib/.project, - cordova/platforms/android/CordovaLib/AndroidManifest.xml, - cordova/platforms/android/CordovaLib/build.gradle, - cordova/platforms/android/CordovaLib/cordova.gradle, - cordova/platforms/android/CordovaLib/project.properties, - cordova/platforms/android/CordovaLib/src, - cordova/platforms/android/CordovaLib/src/org, - cordova/platforms/android/CordovaLib/src/org/apache, - cordova/platforms/android/CordovaLib/src/org/apache/cordova, - cordova/platforms/android/CordovaLib/src/org/apache/cordova/AuthenticationToken.java, - cordova/platforms/android/CordovaLib/src/org/apache/cordova/CallbackContext.java, - cordova/platforms/android/CordovaLib/src/org/apache/cordova/Config.java, - cordova/platforms/android/CordovaLib/src/org/apache/cordova/ConfigXmlParser.java, - cordova/platforms/android/CordovaLib/src/org/apache/cordova/CordovaActivity.java, - cordova/platforms/android/CordovaLib/src/org/apache/cordova/CordovaArgs.java, - cordova/platforms/android/CordovaLib/src/org/apache/cordova/CordovaBridge.java, - cordova/platforms/android/CordovaLib/src/org/apache/cordova/CordovaClientCertRequest.java, - cordova/platforms/android/CordovaLib/src/org/apache/cordova/CordovaDialogsHelper.java, - cordova/platforms/android/CordovaLib/src/org/apache/cordova/CordovaHttpAuthHandler.java, - cordova/platforms/android/CordovaLib/src/org/apache/cordova/CordovaInterface.java, - cordova/platforms/android/CordovaLib/src/org/apache/cordova/CordovaInterfaceImpl.java, - cordova/platforms/android/CordovaLib/src/org/apache/cordova/CordovaPlugin.java, - cordova/platforms/android/CordovaLib/src/org/apache/cordova/CordovaPreferences.java, - cordova/platforms/android/CordovaLib/src/org/apache/cordova/CordovaResourceApi.java, - cordova/platforms/android/CordovaLib/src/org/apache/cordova/CordovaWebView.java, - cordova/platforms/android/CordovaLib/src/org/apache/cordova/CordovaWebViewEngine.java, - cordova/platforms/android/CordovaLib/src/org/apache/cordova/CordovaWebViewImpl.java, - cordova/platforms/android/CordovaLib/src/org/apache/cordova/CoreAndroid.java, - cordova/platforms/android/CordovaLib/src/org/apache/cordova/ExposedJsApi.java, - cordova/platforms/android/CordovaLib/src/org/apache/cordova/ICordovaClientCertRequest.java, - cordova/platforms/android/CordovaLib/src/org/apache/cordova/ICordovaCookieManager.java, - cordova/platforms/android/CordovaLib/src/org/apache/cordova/ICordovaHttpAuthHandler.java, - cordova/platforms/android/CordovaLib/src/org/apache/cordova/LOG.java, - cordova/platforms/android/CordovaLib/src/org/apache/cordova/NativeToJsMessageQueue.java, - cordova/platforms/android/CordovaLib/src/org/apache/cordova/PluginEntry.java, - cordova/platforms/android/CordovaLib/src/org/apache/cordova/PluginManager.java, - cordova/platforms/android/CordovaLib/src/org/apache/cordova/PluginResult.java, - cordova/platforms/android/CordovaLib/src/org/apache/cordova/Whitelist.java, - cordova/platforms/android/CordovaLib/src/org/apache/cordova/engine, - cordova/platforms/android/CordovaLib/src/org/apache/cordova/engine/SystemCookieManager.java, - cordova/platforms/android/CordovaLib/src/org/apache/cordova/engine/SystemExposedJsApi.java, - cordova/platforms/android/CordovaLib/src/org/apache/cordova/engine/SystemWebChromeClient.java, - cordova/platforms/android/CordovaLib/src/org/apache/cordova/engine/SystemWebView.java, - cordova/platforms/android/CordovaLib/src/org/apache/cordova/engine/SystemWebViewClient.java, - cordova/platforms/android/CordovaLib/src/org/apache/cordova/engine/SystemWebViewEngine.java, - cordova/platforms/android/assets, - cordova/platforms/android/assets/_where-is-www.txt, - cordova/platforms/android/assets/www, - cordova/platforms/android/assets/www/cordova.js, - cordova/platforms/android/assets/www/cordova_plugins.js, - cordova/platforms/android/assets/www/css, - cordova/platforms/android/assets/www/css/index.css, - cordova/platforms/android/assets/www/img, - cordova/platforms/android/assets/www/img/logo.png, - cordova/platforms/android/assets/www/index.html, - cordova/platforms/android/assets/www/js, - cordova/platforms/android/assets/www/js/index.js, - cordova/platforms/android/assets/www/plugins, - cordova/platforms/android/assets/www/plugins/cordova-plugin-whitelist, - cordova/platforms/android/assets/www/plugins/cordova-plugin-whitelist/whitelist.js, - cordova/platforms/android/build.gradle, - cordova/platforms/android/cordova, - cordova/platforms/android/cordova/android_sdk_version, - cordova/platforms/android/cordova/build, - cordova/platforms/android/cordova/build.bat, - cordova/platforms/android/cordova/check_reqs, - cordova/platforms/android/cordova/clean, - cordova/platforms/android/cordova/clean.bat, - cordova/platforms/android/cordova/defaults.xml, - cordova/platforms/android/cordova/lib, - cordova/platforms/android/cordova/lib/android_sdk_version.js, - cordova/platforms/android/cordova/lib/appinfo.js, - cordova/platforms/android/cordova/lib/build.js, - cordova/platforms/android/cordova/lib/check_reqs.js, - cordova/platforms/android/cordova/lib/device.js, - cordova/platforms/android/cordova/lib/emulator.js, - cordova/platforms/android/cordova/lib/exec.js, - cordova/platforms/android/cordova/lib/install-device, - cordova/platforms/android/cordova/lib/install-device.bat, - cordova/platforms/android/cordova/lib/install-emulator, - cordova/platforms/android/cordova/lib/install-emulator.bat, - cordova/platforms/android/cordova/lib/list-devices, - cordova/platforms/android/cordova/lib/list-devices.bat, - cordova/platforms/android/cordova/lib/list-emulator-images, - cordova/platforms/android/cordova/lib/list-emulator-images.bat, - cordova/platforms/android/cordova/lib/list-started-emulators, - cordova/platforms/android/cordova/lib/list-started-emulators.bat, - cordova/platforms/android/cordova/lib/log.js, - cordova/platforms/android/cordova/lib/plugin-build.gradle, - cordova/platforms/android/cordova/lib/run.js, - cordova/platforms/android/cordova/lib/spawn.js, - cordova/platforms/android/cordova/lib/start-emulator, - cordova/platforms/android/cordova/lib/start-emulator.bat, - cordova/platforms/android/cordova/log, - cordova/platforms/android/cordova/log.bat, - cordova/platforms/android/cordova/node_modules, - cordova/platforms/android/cordova/node_modules/.bin, - cordova/platforms/android/cordova/node_modules/.bin/shjs, - cordova/platforms/android/cordova/node_modules/nopt, - cordova/platforms/android/cordova/node_modules/nopt/LICENSE, - cordova/platforms/android/cordova/node_modules/nopt/lib, - cordova/platforms/android/cordova/node_modules/nopt/lib/nopt.js, - cordova/platforms/android/cordova/node_modules/nopt/node_modules, - cordova/platforms/android/cordova/node_modules/nopt/node_modules/abbrev, - cordova/platforms/android/cordova/node_modules/nopt/node_modules/abbrev/LICENSE, - cordova/platforms/android/cordova/node_modules/nopt/node_modules/abbrev/abbrev.js, - cordova/platforms/android/cordova/node_modules/nopt/node_modules/abbrev/package.json, - cordova/platforms/android/cordova/node_modules/nopt/package.json, - cordova/platforms/android/cordova/node_modules/q, - cordova/platforms/android/cordova/node_modules/q/CONTRIBUTING.md, - cordova/platforms/android/cordova/node_modules/q/LICENSE, - cordova/platforms/android/cordova/node_modules/q/README.md, - cordova/platforms/android/cordova/node_modules/q/benchmark, - cordova/platforms/android/cordova/node_modules/q/benchmark/compare-with-callbacks.js, - cordova/platforms/android/cordova/node_modules/q/benchmark/scenarios.js, - cordova/platforms/android/cordova/node_modules/q/package.json, - cordova/platforms/android/cordova/node_modules/q/q.js, - cordova/platforms/android/cordova/node_modules/q/queue.js, - cordova/platforms/android/cordova/node_modules/shelljs, - cordova/platforms/android/cordova/node_modules/shelljs/.documentup.json, - cordova/platforms/android/cordova/node_modules/shelljs/.jshintrc, - cordova/platforms/android/cordova/node_modules/shelljs/.npmignore, - cordova/platforms/android/cordova/node_modules/shelljs/.travis.yml, - cordova/platforms/android/cordova/node_modules/shelljs/LICENSE, - cordova/platforms/android/cordova/node_modules/shelljs/README.md, - cordova/platforms/android/cordova/node_modules/shelljs/bin, - cordova/platforms/android/cordova/node_modules/shelljs/bin/shjs, - cordova/platforms/android/cordova/node_modules/shelljs/global.js, - cordova/platforms/android/cordova/node_modules/shelljs/make.js, - cordova/platforms/android/cordova/node_modules/shelljs/package.json, - cordova/platforms/android/cordova/node_modules/shelljs/scripts, - cordova/platforms/android/cordova/node_modules/shelljs/scripts/generate-docs.js, - cordova/platforms/android/cordova/node_modules/shelljs/scripts/run-tests.js, - cordova/platforms/android/cordova/node_modules/shelljs/shell.js, - cordova/platforms/android/cordova/node_modules/shelljs/src, - cordova/platforms/android/cordova/node_modules/shelljs/src/cat.js, - cordova/platforms/android/cordova/node_modules/shelljs/src/cd.js, - cordova/platforms/android/cordova/node_modules/shelljs/src/chmod.js, - cordova/platforms/android/cordova/node_modules/shelljs/src/common.js, - cordova/platforms/android/cordova/node_modules/shelljs/src/cp.js, - cordova/platforms/android/cordova/node_modules/shelljs/src/dirs.js, - cordova/platforms/android/cordova/node_modules/shelljs/src/echo.js, - cordova/platforms/android/cordova/node_modules/shelljs/src/error.js, - cordova/platforms/android/cordova/node_modules/shelljs/src/exec.js, - cordova/platforms/android/cordova/node_modules/shelljs/src/find.js, - cordova/platforms/android/cordova/node_modules/shelljs/src/grep.js, - cordova/platforms/android/cordova/node_modules/shelljs/src/ls.js, - cordova/platforms/android/cordova/node_modules/shelljs/src/mkdir.js, - cordova/platforms/android/cordova/node_modules/shelljs/src/mv.js, - cordova/platforms/android/cordova/node_modules/shelljs/src/popd.js, - cordova/platforms/android/cordova/node_modules/shelljs/src/pushd.js, - cordova/platforms/android/cordova/node_modules/shelljs/src/pwd.js, - cordova/platforms/android/cordova/node_modules/shelljs/src/rm.js, - cordova/platforms/android/cordova/node_modules/shelljs/src/sed.js, - cordova/platforms/android/cordova/node_modules/shelljs/src/tempdir.js, - cordova/platforms/android/cordova/node_modules/shelljs/src/test.js, - cordova/platforms/android/cordova/node_modules/shelljs/src/to.js, - cordova/platforms/android/cordova/node_modules/shelljs/src/toEnd.js, - cordova/platforms/android/cordova/node_modules/shelljs/src/which.js, - cordova/platforms/android/cordova/node_modules/which, - cordova/platforms/android/cordova/node_modules/which/LICENSE, - cordova/platforms/android/cordova/node_modules/which/README.md, - cordova/platforms/android/cordova/node_modules/which/bin, - cordova/platforms/android/cordova/node_modules/which/bin/which, - cordova/platforms/android/cordova/node_modules/which/package.json, - cordova/platforms/android/cordova/node_modules/which/which.js, - cordova/platforms/android/cordova/run, - cordova/platforms/android/cordova/run.bat, - cordova/platforms/android/cordova/version, - cordova/platforms/android/cordova/version.bat, - cordova/platforms/android/gradle, - cordova/platforms/android/gradle/wrapper, - cordova/platforms/android/gradle/wrapper/gradle-wrapper.jar, - cordova/platforms/android/gradle/wrapper/gradle-wrapper.properties, - cordova/platforms/android/gradlew, - cordova/platforms/android/libs, - cordova/platforms/android/platform_www, - cordova/platforms/android/platform_www/cordova.js, - cordova/platforms/android/project.properties, - cordova/platforms/android/res, - cordova/platforms/android/res/drawable, - cordova/platforms/android/res/drawable-hdpi, - cordova/platforms/android/res/drawable-hdpi/icon.png, - cordova/platforms/android/res/drawable-land-hdpi, - cordova/platforms/android/res/drawable-land-hdpi/screen.png, - cordova/platforms/android/res/drawable-land-ldpi, - cordova/platforms/android/res/drawable-land-ldpi/screen.png, - cordova/platforms/android/res/drawable-land-mdpi, - cordova/platforms/android/res/drawable-land-mdpi/screen.png, - cordova/platforms/android/res/drawable-land-xhdpi, - cordova/platforms/android/res/drawable-land-xhdpi/screen.png, - cordova/platforms/android/res/drawable-ldpi, - cordova/platforms/android/res/drawable-ldpi/icon.png, - cordova/platforms/android/res/drawable-mdpi, - cordova/platforms/android/res/drawable-mdpi/icon.png, - cordova/platforms/android/res/drawable-port-hdpi, - cordova/platforms/android/res/drawable-port-hdpi/screen.png, - cordova/platforms/android/res/drawable-port-ldpi, - cordova/platforms/android/res/drawable-port-ldpi/screen.png, - cordova/platforms/android/res/drawable-port-mdpi, - cordova/platforms/android/res/drawable-port-mdpi/screen.png, - cordova/platforms/android/res/drawable-port-xhdpi, - cordova/platforms/android/res/drawable-port-xhdpi/screen.png, - cordova/platforms/android/res/drawable-xhdpi, - cordova/platforms/android/res/drawable-xhdpi/icon.png, - cordova/platforms/android/res/drawable/icon.png, - cordova/platforms/android/res/values, - cordova/platforms/android/res/values/strings.xml, - cordova/platforms/android/res/xml, - cordova/platforms/android/res/xml/config.xml, - cordova/platforms/android/settings.gradle, - cordova/platforms/android/src, cordova/platforms/android/src/ch, - cordova/platforms/android/src/ch/safechat, - cordova/platforms/android/src/ch/safechat/MainActivity.java, - cordova/platforms/android/src/org, - cordova/platforms/android/src/org/apache, - cordova/platforms/android/src/org/apache/cordova, - cordova/platforms/android/src/org/apache/cordova/whitelist, - cordova/platforms/android/src/org/apache/cordova/whitelist/WhitelistPlugin.java, - cordova/platforms/platforms.json, cordova/plugins, - cordova/plugins/android.json, - cordova/plugins/cordova-plugin-whitelist, - cordova/plugins/cordova-plugin-whitelist/CONTRIBUTING.md, - cordova/plugins/cordova-plugin-whitelist/LICENSE, - cordova/plugins/cordova-plugin-whitelist/NOTICE, - cordova/plugins/cordova-plugin-whitelist/README.md, - cordova/plugins/cordova-plugin-whitelist/RELEASENOTES.md, - cordova/plugins/cordova-plugin-whitelist/package.json, - cordova/plugins/cordova-plugin-whitelist/plugin.xml, - cordova/plugins/cordova-plugin-whitelist/src, - cordova/plugins/cordova-plugin-whitelist/src/android, - cordova/plugins/cordova-plugin-whitelist/src/android/WhitelistPlugin.java, - cordova/plugins/cordova-plugin-whitelist/src/ios, - cordova/plugins/cordova-plugin-whitelist/src/ios/CDVNavigationWhitelistPlugin.h, - cordova/plugins/cordova-plugin-whitelist/src/ios/CDVNavigationWhitelistPlugin.m, - cordova/plugins/cordova-plugin-whitelist/whitelist.js, - cordova/plugins/fetch.json, cordova/www, cordova/www/css, - cordova/www/css/index.css, cordova/www/img, - cordova/www/img/logo.png, cordova/www/index.html, cordova/www/js, - cordova/www/js/index.js, html/index.html.in, html/makefile.am, - html/safechat.js, makefile.am: added first try of an android app - using cordova; refs #24 - -2015-08-27 20:55 marc - - * ChangeLog, html/safechat.css, html/safechat.js: need to make sure - that get loop runs only once; closes #20 - -2015-08-26 22:43 marc - - * ax_init_standard_project.m4, bootstrap.sh, configure.ac, - html/index.html.in, html/safechat.css, html/safechat.js: profile - download implemented; closes #16 - -2015-08-26 21:30 marc - - * html/chat.html, html/index.html.in, html/safechat.js: profile - download implemented; closes #15 - -2015-08-26 21:13 marc - - * html/index.html.in, html/menu.svg, html/safechat.css, - html/safechat.js: profile download implemented; closes #15 - -2015-08-16 15:07 marc - - * ChangeLog, ax_check_qt.m4, ax_init_standard_project.m4, - bootstrap.sh, configure.ac, html/index.html, html/index.html.in, - html/safechat.js, mac-create-app-bundle.sh: Fixes #13 by - introducing vibration where available - -2015-07-16 10:54 marc - - * ChangeLog, doc/doxyfile.in: try without searchbox - -2015-07-15 21:33 marc - - * ChangeLog, html/checknewuser.php, html/documentation.dox, - html/get.php, html/login.php, html/messagetable.php, - html/pubkey.php, html/safechat.js, html/send.php, - html/usertable.php: more docs - -2015-07-15 13:54 marc - - * ChangeLog, ax_check_qt.m4, ax_init_standard_project.m4, - bootstrap.sh, configure.ac, doc, doc/doxyfile.in, - doc/makefile.am, html/checknewuser.php, html/documentation.dox, - html/functions.php, html/makefile.am, html/newuser.html, - html/safechat.js, mac-create-app-bundle.sh, makefile.am: added - some comments and dokus - -2015-07-09 11:14 marc - - * ChangeLog: but one change is necessary for the test to succeed: - We need libcryptoki installed; refs #2200, #2227 - -2015-07-08 07:13 marc - - * html/functions.php, html/update-messages.js: added missing files - -2015-07-08 05:48 marc - - * ChangeLog, html/login.php, html/makefile.am, - html/messagetable.php, html/safechat.js, html/send.php, - html/usertable.php: added missing files - -2015-07-06 11:34 marc - - * debian/control.in: debian needs a section - -2015-07-02 07:08 marc - - * html/login.php, html/pubkey.php, html/safechat.js, html/send.php: - some checks on server side - -2015-07-01 13:34 marc - - * README: build need description - -2015-07-01 13:08 marc - - * ChangeLog, html/makefile.am: too much isn't good either - -2015-07-01 11:45 marc - - * html/chat-rodrigo-angleton.svg, html/makefile.am, html/menu.svg, - html/safe-mimooh.svg, html/safechat-rodrigo-angleton.svg: missing - files added - -2015-07-01 00:08 marc - - * html/abort.svg, html/audio.svg, html/envelope.svg, - html/pfeil.svg, html/photo.svg, html/send.svg, html/video.svg: - with image support - -2015-07-01 00:07 marc - - * html/attachment.svg, html/chat.html, html/messagetable.php, - html/safechat.css, html/safechat.js, html/send.php: with image - support - -2015-06-30 14:09 marc - - * html/attachment.svg, html/photo.png, html/video.png: file upload - preparations - -2015-06-30 14:09 marc - - * html/chat.html, html/safechat.js: file upload preparations - -2015-06-29 22:34 marc - - * html/chat.html, html/index.html, html/newuser.html, - html/safechat.css, html/safechat.js: first design - -2015-06-29 13:19 marc - - * html/A-Tone-His_Self-1266414414.mp3, - html/Checkout-Scanner-Beep-SoundBible.com-593325210-by-Mike-Koenig.mp3, - html/index.html, html/javascripts, html/jquery.cssemoticons.css, - html/jquery.cssemoticons.js, html/safechat.css, html/safechat.js, - html/stylesheets: beep on new message + first css - -2015-06-28 20:58 marc - - * AUTHORS, COPYING, ChangeLog, INSTALL, NEWS, README, - ax_check_qt.m4, ax_cxx_compile_stdcxx_11.m4, - ax_init_standard_project.m4, bootstrap.sh, configure.ac, debian, - debian/changelog.in, debian/compat, debian/control.in, - debian/docs, debian/rules, html, html/chat.html, - html/checknewuser.php, html/get.php, html/index.html, - html/javascripts, html/javascripts/jquery-1.4.2.min.js, - html/javascripts/jquery.cssemoticons.js, - html/javascripts/jquery.cssemoticons.min.js, html/jquery.js, - html/login.php, html/makefile.am, html/messagetable.php, - html/newuser.html, html/openpgp.js, html/pubkey.php, - html/safechat.js, html/send.php, html/stylesheets, - html/stylesheets/jquery.cssemoticons.css, html/usertable.php, - makefile.am: copied files - -2015-06-28 19:57 marc - - * .: init - diff --git a/INSTALL b/INSTALL index f812f5a..ddcdb76 120000 --- a/INSTALL +++ b/INSTALL @@ -1 +1 @@ -/usr/share/automake-1.14/INSTALL \ No newline at end of file +/usr/share/automake-1.15/INSTALL \ No newline at end of file diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 0000000..e2149c3 --- /dev/null +++ b/autogen.sh @@ -0,0 +1,8 @@ +#!/bin/bash -e +if test -n "git" -a -d ".git" -a -e -x "$(which git2cl)"; then + git2cl > ChangeLog +fi +aclocal + +automake -a +autoconf diff --git a/ax_check_qt.m4 b/ax_check_qt.m4 index af3a238..e0eecf2 100644 --- a/ax_check_qt.m4 +++ b/ax_check_qt.m4 @@ -51,18 +51,33 @@ AC_DEFUN([AX_CXX_QT_TOOL], [ PKG_PROG_PKG_CONFIG - if test -z "$HAVE_$1"; then + if test -z "${HAVE_$1}"; then HAVE_$1=1 AC_MSG_CHECKING([for $2]) AC_ARG_VAR([$1], [path to Qt tool $2]) - $1=${$1:-$(${PKG_CONFIG} --variable=$2_location Qt5Core)} - $1=${$1:-$(${PKG_CONFIG} --variable=host_bins Qt5Core)/$2-qt5} - $1=${$1:-$(${PKG_CONFIG} --variable=host_bins Qt5Core)/$2} - $1=${$1:-$(${PKG_CONFIG} --variable=$2_location QtCore)} - $1=${$1:-$(${PKG_CONFIG} --variable=host_bins QtCore)/$2} - $1=${$1:-$(${PKG_CONFIG} --variable=host_bins QtCore)/$2-qt4} - if ! which "${$1%% *}" > /dev/null; then - if which "$2-qt5" > /dev/null; then + for package in Qt5Core QtCore; do + if test -x "${$1}"; then + break + fi + tool=$(${PKG_CONFIG} --variable=$2_location $package 2> /dev/null) + if test -x "${tool}"; then + $1="${tool}" + break + fi + tool=$(${PKG_CONFIG} --variable=host_bins $package 2> /dev/null) + if test -n "$tool"; then + for name in $2 $2-qt5 $2-qt4; do + if test -x "${tool}/${name}"; then + $1="${tool}/${name}" + break + fi + done + fi + done + if ! test -x "${$1}"; then + if which "$2" > /dev/null; then + $1=$2 + elif which "$2-qt5" > /dev/null; then $1=$2-qt5 elif which "$2" > /dev/null; then $1=$2 @@ -70,15 +85,15 @@ AC_DEFUN([AX_CXX_QT_TOOL], [ $1=$2-qt4 else HAVE_$1=0 - $1="" + unset $1 fi fi AC_SUBST($1) AM_CONDITIONAL(HAVE_$1, test $HAVE_[$1] -eq 1) if test $HAVE_$1 -eq 1; then - AC_MSG_RESULT([$$1]) + AC_MSG_RESULT([$$1]) else - AC_MSG_RESULT([not found]) + AC_MSG_RESULT([not found]) fi fi ]) @@ -215,6 +230,7 @@ AC_DEFUN([AX_CHECK_QT], [ AC_SUBST(CXXFLAGS) AC_SUBST(PKG_REQUIREMENTS) AX_ADDITIONAL_QT_RULES_HACK=' +#### Begin: Appended by $0 LANGUAGE_FILE_BASE ?= translations @@ -226,7 +242,6 @@ moc_%.cxx: %.hxx qrc_%.cxx: %.qrc $(RCC) -o [$][@] -name ${<:%.qrc=%} $< - AC_SUBST(AX_ADDITIONAL_QT_RULES_HACK) #%.qrc: % # cwd=$$(pwd) && cd $< && $(RCC) -project -o $${cwd}/[$][@] @@ -234,12 +249,15 @@ qrc_%.cxx: %.qrc %.qm: %.ts ${LRELEASE} $< -qm [$][@] -%.ts: ${LANGUAGE_FILES:%=%} +%.ts: ${LANGUAGE_FILES} ${LUPDATE} -no-obsolete \ - -target-language ${@:${LANGUAGE_FILE_BASE}_%.ts=%} \ - -ts [$][@] $< + -target-language [$]{@:${LANGUAGE_FILE_BASE}_%.ts=%} \ + [$][^] \ + -ts [$][@] -']) +#### End: $0 +' +]) AC_DEFUN([AX_REQUIRE_QT], [ AX_CHECK_QT([$1], [$2], [$3], [$4]) @@ -254,3 +272,13 @@ AC_DEFUN([AX_REQUIRE_QT], [ AC_DEFUN([AX_QT_NO_KEYWORDS], [ CPPFLAGS+=" -DQT_NO_KEYWORDS" ]) + +AC_DEFUN([AX_INIT_QT], [ + if test -n "${AX_ADDITIONAL_QT_RULES_HACK}"; then + for f in $(find test examples src -name makefile.in); do + test -f "$f" && cat >> "$f" <&1 > /dev/null; then - SVN_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p') - if test -z "${SVN_REVISION}"; then SVN_REVISION=0; fi - break; - fi - done - echo $ECHO_N $(($SVN_REVISION)) -]), mrw_esyscmd_s([ - SVN_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-svn-checkout" - for path in . .. ../..; do - if svn info $path 2>&1 > /dev/null; then - SVN_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p') - if test -z "${SVN_REVISION}"; then SVN_REVISION=0; fi - break; - fi - done - # Mac does not support LEAST > 255 - echo $ECHO_N $(($SVN_REVISION%256)) -]))) +# it is taken modulo 256 due to a bug on Apple's MaxOSX +m4_define(x_least, m4_ifdef([x_least_fix], [x_least_fix], + m4_ifdef([x_least_diff], + mrw_esyscmd_s([ + VCS_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-checkout" + for path in . .. ../.. ../../..; do + if test -d ${path}/.svn; then + (cd $path; svn upgrade 1>&2 > /dev/null || true) + VCS_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p') + if test -n "${VCS_REVISION}"; then break; fi + elif test -d ${path}/.git; then + VCS_REVISION=$(cd ${path} > /dev/null 2/dev/null; git rev-list --all --count) + if test -n "${VCS_REVISION}"; then break; fi + fi + done + echo $ECHO_N $(($VCS_REVISION)) + ]), mrw_esyscmd_s([ + VCS_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-checkout" + for path in . .. ../.. ../../..; do + if test -d ${path}/.svn; then + (cd $path; svn upgrade 1>&2 > /dev/null || true) + VCS_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p') + if test -n "${VCS_REVISION}"; then break; fi + elif test -d ${path}/.git; then + VCS_REVISION=$(cd ${path} > /dev/null 2/dev/null; git rev-list --all --count) + if test -n "${VCS_REVISION}"; then break; fi + fi + done + # Mac does not support LEAST > 255 + echo $ECHO_N $(($VCS_REVISION%256))])))) + # define version number from subversion's revision number: # it is taken modulo 256 due to a bug on Apple's MacOSX # add to x_minor if revision number is > 256 -m4_define(x_minor_diff, mrw_esyscmd_s([ - SVN_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-svn-checkout" - for path in . .. ../..; do - if svn info $path 2>&1 > /dev/null; then - SVN_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p') - if test -z "${SVN_REVISION}"; then SVN_REVISION=0; fi - break; +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" + for path in . .. ../.. ../../..; do + if test -d ${path}/.svn; then + (cd $path; svn upgrade 1>&2 > /dev/null || true) + VCS_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p') + if test -n "${VCS_REVISION}"; then break; fi + elif test -d ${path}/.git; then + VCS_REVISION=$(cd ${path} > /dev/null 2/dev/null; git rev-list --all --count) + if test -n "${VCS_REVISION}"; then break; fi fi; done # Mac does not support LEAST > 255 - echo $ECHO_N $(($SVN_REVISION/256)) -])) + echo $ECHO_N $(($VCS_REVISION/256))]))) + # setup version number m4_define(x_version, [x_major.m4_ifdef([x_least_diff], x_minor, m4_eval(x_minor+x_minor_diff)).m4_eval(m4_ifdef([x_least_diff], [x_least-x_least_diff], [x_least]))]) @@ -79,7 +90,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 -e ':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 @@ -115,13 +126,25 @@ AC_DEFUN([AX_SUBST], [ # m4_define(x_minor, MINOR_NUMBER) # project's minor version # m4_include(ax_init_standard_project.m4) # AC_INIT(x_package_name, x_version, x_bugreport, x_package_name) -# AM_INIT_AUTOMAKE([1.9 tar-pax]) +# AM_INIT_AUTOMAKE([1.9 tar-pax parallel-tests color-tests]) # AX_INIT_STANDARD_PROJECT # # you change nothing but: YOUR_PACKAGE_NAME, MAJOR_NUMBER, MINOR_NUMBER # # configures the basic environment AC_DEFUN([AX_INIT_STANDARD_PROJECT], [ + PREFIX=$(test "$prefix" = NONE && prefix=$ac_default_prefix; eval echo "${prefix}") + AX_SUBST(PREFIX) + SYSCONFDIR=$(test "$prefix" = NONE && prefix=$ac_default_prefix; eval echo "${sysconfdir}") + AX_SUBST(SYSCONFDIR) + PKGSYSCONFDIR=$(test "$prefix" = NONE && prefix=$ac_default_prefix; eval echo "${SYSCONFDIR}/${PACKAGE_NAME}") + AX_SUBST(PKGSYSCONFDIR) + DATADIR=$(test "$prefix" = NONE && prefix=$ac_default_prefix; eval echo "${datadir}") + AX_SUBST(DATADIR) + PKGDATADIR=$(test "$prefix" = NONE && prefix=$ac_default_prefix; eval echo "${DATADIR}/${PACKAGE_NAME}") + AX_SUBST(PKGDATADIR) + LOCALSTATEDIR=$(test "$prefix" = NONE && prefix=$ac_default_prefix; eval echo "${localstatedir}") + AX_SUBST(LOCALSTATEDIR) AC_MSG_CHECKING([target platfrom]) UNIX=1 MINGW= @@ -146,17 +169,68 @@ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [ AM_CPPFLAGS+=" '-DMAKE_STRING(X)=\#X' '-DNAMESPACE=${PACKAGE_TARNAME//[^a-zA-Z0-9]/_}'" AX_SUBST(NUMBERS) AX_SUBST(HOME) - README=$(tail -n +3 README) + if test -f README.md; then + README=$(tail -n +3 README.md) + DESCRIPTION=$(head -1 README.md | sed 's,^#\+ *,,;s, *#\+$,,') + else + 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,\\\(.\),\\\\\1,g;s/\n/\\n/g;s,",\\",g;s, ,\ \ ,g') + else + README_HTML="${README}" + fi AX_SUBST(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) _AM_SUBST_NOTMAKE([DESCRIPTION]) + LICENSE=$(echo $(head -1 COPYING)) + AX_SUBST(LICENSE) + COPYING=$(.*,\1,') + PACKAGER=$(gpg -K --display-charset utf-8 --lock-never 2>/dev/null | sed -n 's,uid *\(\[[ultimate\]] *\)\?,,p' | head -1) + if test -z "${PACKAGER}"; then + PACKAGER="$AUTHOR" + fi AX_SUBST(AUTHOR) _AM_SUBST_NOTMAKE([AUTHOR]) + AX_SUBST(AUTHOR_NAME) + AX_SUBST(AUTHOR_URL) + AX_SUBST(AUTHOR_MAIL) + AX_SUBST(PACKAGER) + 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) + VENDOR=$((lsb_release -is 2>/dev/null || echo unknown) | tr ' ' '_') + AX_SUBST(VENDOR) DISTRO=$(lsb_release -sc 2>/dev/null || uname -s 2>/dev/null) + if test "${DISTRO}" = "n/a"; then + DISTRO="${VENDOR}_$(lsb_release -sr 2>/dev/null | tr ' ' '_')" + fi 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) case "${DISTRIBUTOR// /-}" in (Ubuntu) UBUNTU=1; AX_SUBST(UBUNTU);; @@ -178,8 +252,14 @@ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [ PACKAGE_LOGO="${PACKAGE_NAME}-logo.png" fi AX_SUBST(PACKAGE_LOGO) - if test -f "${PACKAGE_NAME}-icon.png"; then + if test -f "${PACKAGE_NAME}-icon.svg"; then + PACKAGE_ICON="${PACKAGE_NAME}-icon.svg" + elif test -f "${PACKAGE_NAME}-icon.png"; then PACKAGE_ICON="${PACKAGE_NAME}-icon.png" + elif test -f "${PACKAGE_NAME}.svg"; then + PACKAGE_ICON="${PACKAGE_NAME}.svg" + elif test -f "${PACKAGE_NAME}.png"; then + PACKAGE_ICON="${PACKAGE_NAME}.png" fi AX_SUBST(PACKAGE_ICON) @@ -210,6 +290,25 @@ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [ else AM_CPPFLAGS="${AM_CPPFLAGS} -DQT_NO_DEBUG_OUTPUT -DQT_NO_DEBUG" 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 AC_CONFIG_FILES([${PACKAGE_NAME}.desktop]) @@ -241,7 +340,7 @@ EOF AC_DEFUN([AX_USE_CXX], [ m4_include(ax_cxx_compile_stdcxx_11.m4) AC_LANG(C++) - AX_CXX_COMPILE_STDCXX_11(noext, optional) + AX_CXX_COMPILE_STDCXX_14(noext, optional) AC_PROG_CXX AC_PROG_CPP @@ -279,6 +378,43 @@ maintainer-clean-cxx-targets: 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 <> nodejs/makefile.in <> cordova/makefile.in <> html/makefile.in <> makefile.in </dev/null) | sort -V | head -1)) PDF_DOC=${PACKAGE_NAME}-${PACKAGE_VERSION}.pdf AC_SUBST(PDF_DOC) if test "$have_doxygen" = "no"; then @@ -415,22 +639,38 @@ AC_DEFUN([AX_USE_DOXYGEN], [ AC_MSG_WARN([Missing program mscgen! - when you rebild documentation, there are no message state charts - there are precompiled derived files in the distribution]); fi - AC_CONFIG_FILES([doc/makefile doc/doxyfile]) + 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([distclean-am], [distclean-documentation], [doc/makefile.in]) AX_ADD_MAKEFILE_TARGET_DEP([maintainer-clean-am], [maintainer-clean-documentation], [doc/makefile.in]) AX_ADD_MAKEFILE_TARGET_DEP([install-data-am], [install-data-documentation], [doc/makefile.in]) AX_ADD_MAKEFILE_TARGET_DEP([uninstall-am], [uninstall-documentation], [doc/makefile.in]) AX_ADD_MAKEFILE_TARGET_DEP([all], [doc], [doc/makefile.in]) - AX_ADD_MAKEFILE_TARGET_DEP([.PHONY], [pdf], [doc/makefile.in]) + AX_ADD_MAKEFILE_TARGET_DEP([.PHONY], [pdf gen-uml-images], [doc/makefile.in]) test -f doc/makefile.in && cat >> doc/makefile.in <> doc/makefile.in <Perl Documentation

Perl Documentation

    " > perldoc/index.html + for p in \${PERL_SOURCES:%=perldoc/%}; do \ + echo '
  • '"\$\${p#perldoc/}"'
  • ' >> perldoc/index.html; \ + done + echo "
" >> 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 # - parameter: # $1 = unique id (no special characters) @@ -455,6 +744,13 @@ EOF # $4 = alternative module names (space separated, optional) # $5 = optional flags: # manualflags if CXXFLAGS, CPPFLAGS, LIBS should remain unchanged +# $6 = optional parameters, allowed are (evaluated in this order): +# - DEV_RPM_DIST_PKG= +# special name for the RPM development package +# - DEV_DEB_DIST_PKG= +# special name for the debian development package +# - DEV_DIST_PKG= +# if the name of the development package is different # # uses PKG_CHECK_MODULES to test for a module # then, if given, looks for the header file @@ -555,6 +851,33 @@ AC_DEFUN([AX_PKG_REQUIRE], [ else AC_MSG_NOTICE([To enable $1, add $1_CPPFLAGS, $1_CXXFLAGS and $1_LIBS]) fi + + DEV_DEB_DIST_PKG= + DEV_RPM_DIST_PKG= + DEV_DIST_PKG= + pkg=m4_default([$2], [$1]) + $6 + dep_pkg=${DEV_DEB_DIST_PKG:-${DEV_DIST_PKG:-${pkg}}-dev} + rpm_pkg=${DEV_RPM_DIST_PKG:-${DEV_DIST_PKG:-${pkg}}-devel} + if test -n "$4"; then + for f in $pkg $4; do + if test -n "$(apt-cache policy -q ${f}-dev 2> /dev/null)"; then + deb_pkg=${f}-dev + break + fi + done + for f in $pkg $4; do + if (test -x /usr/bin/zypper && zypper search -x "${f}-devel" 1>&2 > /dev/null) || \ + (test -x /usr/bin/dnf && dnf list -q "${f}-devel" 1>&2 > /dev/null) || \ + (test -x /usr/bin/yum && yum list -q "${f}-devel" 1>&2 > /dev/null) || \ + (test -x /usr/sbin/urpmq && urpmq "${f}-devel" 1>&2 > /dev/null); then + rpm_pkg=${f}-devel + break + fi + done + fi + AX_DEB_BUILD_DEPEND([$deb_pkg]) + AX_RPM_BUILD_DEPEND([$rpm_pkg]) ]) # check if a specific package exists @@ -563,6 +886,13 @@ AC_DEFUN([AX_PKG_REQUIRE], [ # $2 = module name (optional, if different from id) # $3 = optional flags: # manualflags if CXXFLAGS, CPPFLAGS, LIBS should remain unchanged +# $4 = optional parameters, allowed are (evaluated in this order): +# - DEV_RPM_DIST_PKG= +# special name for the RPM development package +# - DEV_DEB_DIST_PKG= +# special name for the debian development package +# - DEV_DIST_PKG= +# if the name of the development package is different # # uses PKG_CHECK_MODULES to test for a module # sets automake conditional HAVE_$1 to 0 (not found) or 1 (found) @@ -597,11 +927,29 @@ AC_DEFUN([AX_PKG_CHECK], [ AC_SUBST(CPPFLAGS) AC_SUBST(CXXFLAGS) AC_SUBST(PKG_REQUIREMENTS) + + DEV_DEB_DIST_PKG= + DEV_RPM_DIST_PKG= + DEV_DIST_PKG= + pkg=m4_default([$2], [$1]) + $4 + dep_pkg=${DEV_DEB_DIST_PKG:-${DEV_DIST_PKG:-${pkg}}-dev} + rpm_pkg=${DEV_RPM_DIST_PKG:-${DEV_DIST_PKG:-${pkg}}-devel} + if test -n "$(apt-cache policy -q ${deb_pkg} 2> /dev/null)"; then + AX_DEB_BUILD_DEPEND([$deb_pkg]) + fi + if (test -x /usr/bin/zypper && zypper search -x "$rpm_pkg" 1>&2 > /dev/null) || \ + (test -x /usr/bin/dnf && dnf list -q "$rpm_pkg" 1>&2 > /dev/null) || \ + (test -x /usr/bin/yum && yum list -q "$rpm_pkg" 1>&2 > /dev/null) || \ + (test -x /usr/sbin/urpmq && urpmq "$rpm_pkg" 1>&2 > /dev/null); then + AX_RPM_BUILD_DEPEND([$rpm_pkg]) + fi ]) # make sure, a specific header exists # - parameter: # $1 = header name +# $2 = pathes to search for AC_DEFUN([AX_REQUIRE_HEADER], [ AC_CHECK_HEADER($1, [], [ if test -n "$2"; then @@ -718,12 +1066,160 @@ AC_DEFUN([AX_CHECK_VALID_LD_FLAG], [ # Check if a package exists in the current distribution, if yes, require it # in debian/control.in append @DEB_DEPEND_IFEXISTS@ to Build-Depends +# if you pass a list, it will require the first matching, if any matches +# - parameter: +# $1 = space separated list of package names +AC_DEFUN([AX_DEB_DEPEND_IFEXISTS], [ + for pkg in $1; do + if test -n "$(apt-cache policy -q ${pkg} 2> /dev/null)"; then + DEB_DEPEND_IFEXISTS="${DEB_DEPEND_IFEXISTS}, ${pkg}" + break + fi + done +]) + +# require package in debian/control.in append @DEB_BUILD_DEPEND@ to Build-Depends # - parameter: # $1 = package name -AC_DEFUN([AX_DEB_DEPEND_IFEXISTS], [ - pkg=$1 - if test -n "$(apt-cache policy -q ${pkg} 2> /dev/null)"; then - DEB_DEPEND_IFEXISTS+=", ${pkg}" - fi +AC_DEFUN([AX_DEB_BUILD_DEPEND], [ + pkg="$1" + DEB_BUILD_DEPEND="${DEB_BUILD_DEPEND}, ${pkg}" +]) + +# require package in debian/control.in append @DEB_DEPEND@ to Depends +# - parameter: +# $1 = package name +AC_DEFUN([AX_DEB_DEPEND], [ + pkg="$1" + DEB_DEPEND="${DEB_DEPEND}, ${pkg}" +]) + +# require package in debian/control.in append @DEB_DEPEND@ to Depends +# - parameter: +# $1 = package name +AC_DEFUN([AX_DEB_SECTION], [ + pkg="$1" + DEB_SECTION="${pkg}" +]) + +# call after setting debian dependencies +AC_DEFUN([AX_DEB_RESOLVE], [ + AC_SUBST(DEB_BUILD_DEPEND) + AC_SUBST(DEB_DEPEND) + AC_SUBST(DEB_SECTION) AC_SUBST(DEB_DEPEND_IFEXISTS) ]) + +# Check if a package exists in the current distribution, if yes, require it +# in .spec.in append @RPM_DEPEND_IFEXISTS@ to Build-Depends +# if you pass a list, it will require the first matching, if any matches +# - parameter: +# $1 = space separated package names +AC_DEFUN([AX_RPM_DEPEND_IFEXISTS], [ + for pkg in $1; do + if (test -x /usr/bin/zypper && zypper search -x "$pkg" 1>&2 > /dev/null) || \ + (test -x /usr/bin/dnf && dnf list -q "$pkg" 1>&2 > /dev/null) || \ + (test -x /usr/bin/yum && yum list -q "$pkg" 1>&2 > /dev/null) || \ + (test -x /usr/sbin/urpmq && urpmq "$pkg" 1>&2 > /dev/null); then + RPM_DEPEND_IFEXISTS="${RPM_DEPEND_IFEXISTS}, ${pkg}" + break + fi + done +]) + +# require package in .spec.in append @RPM_BUILD_DEPEND@ to Build-Depends +# - parameter: +# $1 = package name +AC_DEFUN([AX_RPM_BUILD_DEPEND], [ + pkg="$1" + RPM_BUILD_DEPEND="${RPM_BUILD_DEPEND}, ${pkg}" +]) + +# require package in .spec.in append @RPM_DEPEND@ to Depends +# - parameter: +# $1 = package name +AC_DEFUN([AX_RPM_DEPEND], [ + pkg="$1" + if test -z "${RPM_DEPEND}"; then + RPM_DEPEND="${pkg}" + else + RPM_DEPEND="${RPM_DEPEND}, ${pkg}" + fi +]) + +# require package in debian/control.in append @DEB_DEPEND@ to Depends +# - parameter: +# $1 = package name +AC_DEFUN([AX_RPM_GROUP], [ + pkg="$1" + RPM_GROUP="${pkg}" +]) + +# call after setting rpmian dependencies +AC_DEFUN([AX_RPM_RESOLVE], [ + AC_SUBST(RPM_BUILD_DEPEND) + AC_SUBST(RPM_DEPEND) + AC_SUBST(RPM_GROUP) + AC_SUBST(RPM_DEPEND_IFEXISTS) +]) + +# Check if a package exists in the current distribution, if yes, require it +# in .spec.in append @ALL_DEPEND_IFEXISTS@ to Build-Depends +# if you pass a list, it will require the first matching, if any matches +# - parameter: +# $1 = space separated list of package names +AC_DEFUN([AX_ALL_DEPEND_IFEXISTS], [ + AX_DEB_DEPEND_IFEXISTS([$1]) + AX_RPM_DEPEND_IFEXISTS([$1]) +]) + +# Check if a package exists in the current distribution, if yes, require it +# in .spec.in append @ALL_DEPEND_IFEXISTS@ to Build-Depends +# if you pass a list, it will require the first matching, if any matches +# - parameter: +# $1 = package name +AC_DEFUN([AX_ALL_DEPEND_IFEXISTS_DEV], [ + pkgs="$1" + AX_DEB_DEPEND_IFEXISTS([${pkgs// /-dev }-dev]) + AX_RPM_DEPEND_IFEXISTS([${pkgs// /-devel }-devel]) +]) + +# require package in .spec.in append @ALL_BUILD_DEPEND@ to Build-Depends +# - parameter: +# $1 = package name +AC_DEFUN([AX_ALL_BUILD_DEPEND], [ + pkg="$1" + DEB_BUILD_DEPEND="${DEB_BUILD_DEPEND}, ${pkg}" + RPM_BUILD_DEPEND="${RPM_BUILD_DEPEND}, ${pkg}" +]) + +# require package in .spec.in append @ALL_BUILD_DEPEND@ to Build-Depends +# - parameter: +# $1 = package name +AC_DEFUN([AX_ALL_BUILD_DEPEND_DEV], [ + pkg="$1" + DEB_BUILD_DEPEND="${DEB_BUILD_DEPEND}, ${pkg// /-dev}-dev" + RPM_BUILD_DEPEND="${RPM_BUILD_DEPEND}, ${pkg// /-devel}-devel" +]) + +# require package in .spec.in append @ALL_DEPEND@ to Depends +# - parameter: +# $1 = package name +AC_DEFUN([AX_ALL_DEPEND], [ + pkg="$1" + DEB_DEPEND="${DEB_DEPEND}, ${pkg}" + if test -z "${RPM_DEPEND}"; then + RPM_DEPEND="${pkg}" + else + RPM_DEPEND="${RPM_DEPEND}, ${pkg}" + fi +]) + +# finish configuration - to be called instead of AC_OUTPUT +AC_DEFUN([AX_OUTPUT], [ + AX_INIT_QT + AX_DEB_RESOLVE + AX_RPM_RESOLVE + AC_OUTPUT + AC_MSG_NOTICE([configured for ${PACKAGE_NAME}-${VERSION}]) +]) diff --git a/bootstrap.sh b/bootstrap.sh index 39e31b7..705fb76 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -1,7 +1,7 @@ #! /bin/bash ## @file ## -## $Id$ +## $Id: bootstrap.sh 52 2015-11-03 15:38:21Z marc $ ## ## $Date: 2004/08/31 15:57:19 $ ## $Author: marc $ @@ -23,19 +23,25 @@ docker=0 buildtarget="" overwrite=0 rebuild=0 +novcs=0 +excludevcs=() rebuildfiles=() while test $# -gt 0; do case "$1" in (--configure|-c) configure=1;; (--docker|-d) docker=1;; (--build|-b) configure=1; build=1; buildtarget+=" distcheck";; + (--all|-a) configure=1; build=1; buildtarget+=" all";; + (--install|-i) configure=1; build=1; buildtarget+=" all install";; + (--clean) configure=1; build=1; buildtarget+=" maintainer-clean";; (--target|-t) shift; configure=1; build=1; buildtarget+=" $1";; - (--clean) shift; configure=1; build=1; buildtarget+=" maintainer-clean";; (--overwrite|-o) overwrite=1;; (--rebuild|-r) rebuild=1;; (--rebuild-file|-f) shift; rebuildfiles+=("$1");; + (--no-vcs|-n) novcs=1;; + (--exclude-vcs|-x) shift; excludevcs+=("$1");; (--version|-v) - echo "$Id$"; + echo "$Id: bootstrap.sh 52 2015-11-03 15:38:21Z marc $"; exit;; (--help|-h) less < 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) + --no-vcs, -n do not automatically add files to version control + --exclude-vcs, -x exclude specific file from version control --help, -h show this help --version, -v show version and date of this file @@ -61,7 +72,7 @@ DESCRIPTION configure.ac. Automatically copies or creates all required template files. - From your new and empty project's subversion path, call $0 to + From your new and empty project's subversion or git path, call $0 to initialize your build environment. Before you call ${MY_NAME} the very first time, edit ${0#/*}/AUTHORS @@ -77,19 +88,30 @@ DESCRIPTION ${DEFAULT_PROJECT_NAME} as the project name for your project in ${PROJECT_PATH}. In the first run, you should call ${MY_NAME} from a checked out the bootstrap-build-environment from - https://dev.marc.waeckerlin.org/, and the path from where you call + https://mrw.sh/, and the path from where you call ${MY_NAME} (which is actually ${PROJECT_PATH}) should be the path to your newly created project. Please note that your project must be a - checked out subversion repository, since this build environment - relies on subversion. + checked out subversion or git repository, since this build + environment relies on subversion or git. Example for an initial run, where your new projet is stored in - subversion on svn:/path/to/your/new-project: + subversion on https:/path/to/your/new-project: cd ~/svn - svn co https://dev.marc.waeckerlin.org/svn/bootstrap-build-environment/trunk \\ + svn co https://svn.mrw.sh/bootstrap-build-environment/trunk \\ bootstrap-build-environment - svn co svn:/path/to/your/new-project/trunk new-project + svn co https:/path/to/your/new-project/trunk new-project + cd new-project + ../bootstrap-build-environment/bootstrap.sh + + Example for an initial run, where your new projet is stored in + git on https:/path/to/your/new-project: + + cd ~/svn + svn co https://svn.mrw.sh/bootstrap-build-environment/trunk \\ + bootstrap-build-environment + cd ~/git + git clone https:/path/to/your/new-project cd new-project ../bootstrap-build-environment/bootstrap.sh @@ -98,36 +120,66 @@ RUNNING If you run ${MY_NAME}, it first generates the necessary files (see below), then first runs make distclean if a makefile exists. After this it calles aclocal, libtoolize, automake, autoconf and - optionally ./configure. + optionally ./configure. If necessary, files are added to version + control. GENERATED FILES This script copies the following files into your project environment: * ${MY_NAME} + * autogen.sh - just the basics to initialize auto tools and create configure * 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 + * makefile_test.inc.am - makefile to be included in tests * resolve-debbuilddeps.sh - script to install debian package dependencies * resolve-rpmbuilddeps.sh - script to install RPM package dependencies * build-in-docker.sh - script to build the project encapsulated in a docker container + * build-in-docker.conf - additional configuration for build-in-docker.sh + * rpmsign.exp - script for signing rpms unattended * build-resource-file.sh - build resource.qrc file from a resource directory * sql-to-dot.sed - script to convert SQL schema files to graphviz dot in doxygen * mac-create-app-bundle.sh - script to create apple mac os-x app-bundle + * dependency-graph.sh - script to draw project dependencies + * template.sh - generic template for bash scripts * test/runtests.sh - template file to run test scripts, i.e. docker based * 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) + * README (or README.md) - add project description (first line: header, followed by empty line) * configure.ac - global configuration file template * makefile.am - global makefile template * ${DEFAULT_PROJECT_NAME}.desktop.in - linux desktop file * 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 + * etc/makefile.am - if you enable AX_USE_ETC + * html/makefile.am - if you enabled AX_BUILD_HTML or AX_BUILD_HTML_NPM + * html/package.json.in - if you enabled AX_BUILD_HTML_NPM * scripts/makefile.am - if you enabled AX_USE_SCRIPTS - * doc/makefile.am - if you enabled AX_USE_DOXYGEN + * nodejs/makefile.am - if you add AX_USE_NODEJS + * nodejs/${DEFAULT_PROJECT_NAME}.js - if you add AX_USE_NODEJS + * nodejs/package.json.in - if you add AX_USE_NODEJS + * nodejs/etc/${DEFAULT_PROJECT_NAME}.json - if you add AX_USE_NODEJS + * nodejs/etc/default/${DEFAULT_PROJECT_NAME} - if you add AX_USE_NODEJS + * nodejs/etc/init/${DEFAULT_PROJECT_NAME}.conf - if you add AX_USE_NODEJS + * nodejs/etc/systemd/system/${DEFAULT_PROJECT_NAME}.service - if you add AX_USE_NODEJS + * nodejs/public - if you add AX_USE_NODEJS + * nodejs/public/images - if you add AX_USE_NODEJS + * nodejs/public/javascripts/${DEFAULT_PROJECT_NAME}.js - if you add AX_USE_NODEJS + * nodejs/public/stylesheets/style.styl - if you add AX_USE_NODEJS + * nodejs/routes/index.js - if you add AX_USE_NODEJS + * nodejs/sockets/index.js - if you add AX_USE_NODEJS + * nodejs/views/index.ejs - if you add AX_USE_NODEJS + * nodejs/views/layout.ejs - if you add AX_USE_NODEJS + * nodejs/node_modules - if you add AX_USE_NODEJS + * doc/makefile.am - if you enabled AX_USE_DOXYGEN or AX_USE_PERLDOC * 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 * debian/changelog.in - if you enabled AX_USE_DEBIAN_PACKAGING * debian/control.in - if you enabled AX_USE_DEBIAN_PACKAGING @@ -168,6 +220,7 @@ FILES TO EDIT * src/makefile.am * html/makefile.am * test/makefile.am + * test/${DEFAULT_PROJECT_NAME}.cxx * examples/makefile.am FILE DEPENDENCIES @@ -176,10 +229,10 @@ FILE DEPENDENCIES configuration a dependent, i.e.: * test/makefile.am depends on AX_USE_LIBTOOL - * html/makefile.am depends on AX_BUILD_HTML + * html/makefile.am depends on AX_BUILD_HTML or AX_BUILD_HTML_NPM * doc/doxyfile.in depends on AX_BUILD_EXAMPLES - * debian/control.in depends on AX_USE_DOXYGEN, AX_USE_CPPUNIT - AX_CXX_QT, AX_CHECK_QT, AX_REQUIRE_QT, AX_USE_LIBTOOL + * debian/control.in depends on AX_USE_DOXYGEN, AX_USE_PERLDOC, + AX_USE_CPPUNIT AX_CXX_QT, AX_CHECK_QT, AX_REQUIRE_QT, AX_USE_LIBTOOL * debian/${DEFAULT_PROJECT_NAME}.install depends on AX_USE_LIBTOOL * debian/${DEFAULT_PROJECT_NAME}.dirs depends on AX_USE_LIBTOOL * debian/${DEFAULT_PROJECT_NAME}-dev.install depends on AX_USE_LIBTOOL @@ -201,17 +254,21 @@ FILES ${DEFAULT_PROJECT_NAME}::description(). * ChangeLog: Your changelog is automatically maintained from subversion history, using svn2cl. You don't need to - care about. + care about. It uses git2cl on git repositories. * configure.ac: This file becomes very short and simple. You provide the project name, the major and minor version. The least version number is automatically taken from subversion's revision, so every checkin automatically increments the least version - number. The following macros are supported: + number. In git, git rev-list --all --count is used. + The following macros are supported in configure.ac: * Enable C++: AX_USE_CXX + * Enable system config files in /etc: AX_USE_ETC * Enable LibTool library creation: AX_USE_LIBTOOL * Enable Scripts: AX_USE_SCRIPTS + * Enable NodeJS project: AX_USE_NODEJS * 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 RPM packaging by calling "make rpm": AX_USE_RPM_PACKAGING * Enable C++ testing using CppUnit: AX_USE_CPPUNIT @@ -247,6 +304,111 @@ EOF shift; done +# check if stdout is a terminal... +if test -t 1; then + + # see if it supports colors... + ncolors=$(tput colors) + + if test -n "$ncolors" && test $ncolors -ge 8; then + bold="$(tput bold)" + underline="$(tput smul)" + standout="$(tput smso)" + normal="$(tput sgr0)" + black="$(tput setaf 0)" + red="$(tput setaf 1)" + green="$(tput setaf 2)" + yellow="$(tput setaf 3)" + blue="$(tput setaf 4)" + magenta="$(tput setaf 5)" + cyan="$(tput setaf 6)" + white="$(tput setaf 7)" + fi +fi + +notice() { + echo "${yellow}→ notice: ${bold}$*${normal}" +} + +running() { + echo -n "${bold}${blue}→ running: ${bold}${white}$*${normal} … " +} + +checking() { + echo -n "${bold}${blue}→ checking: ${bold}${white}$*${normal} … " +} + +generating() { + echo -n "${bold}${blue}→ generating: ${bold}${white}$*${normal} … " +} + +configuring() { + echo -n "${bold}${blue}→ configuring ${bold}${white}$1${normal}:" + shift + echo -n "${white}$*${normal} … " +} + +ignored() { + echo "${bold}${yellow}ignored $*${normal}" +} + +success() { + echo "${bold}${green}success $*${normal}" +} + +error() { + echo "${bold}${red}→ error: $1${normal}" + shift + if test -n "$*"; then + echo "${bold}$*${normal}" + fi + exit 1 +} + +run() { + check=1 + while test $# -gt 0; do + case "$1" in + (--no-check) check=0;; + (*) break;; + esac + shift; + done + running $* + result=$($* 2>&1) + res=$? + if test $res -ne 0; then + if test $check -eq 1; then + error "Failed with return code: $res" "$result" + else + ignored + fi + else + success + fi +} + +checking for version control system +VCS="" +VCSDEPENDS="" +for path in . .. ../.. ../../..; do + if test -d ${path}/.svn; then + VCS="svn" + VCSDEPENDS_DEB="svn2cl, subversion, subversion-tools," + VCSDEPENDS_RPM="subversion, " + success detected ${VCS} + break + elif test -d ${path}/.git; then + VCS="git" + VCSDEPENDS_DEB="git2cl, git," + VCSDEPENDS_RPM="git, " + success detected ${VCS} + break + fi +done +if test -z "$VCS"; then + ignored +fi HEADER='## @id '"\$Id\$"' ## @@ -270,43 +432,12 @@ CHEADER='/** @id '"\$Id\$"' // 1 2 3 4 5 6 7 8 // 45678901234567890123456789012345678901234567890123456789012345678901234567890 + ' -notice() { - echo -e "\e[1;33m$*\e[0m" -} - -run() { - check=1 - while test $# -gt 0; do - case "$1" in - (--no-check) check=0;; - (*) break;; - esac - shift; - done - echo -en "\e[1m-> running:\e[0m $* ..." - result=$($* 2>&1) - res=$? - if test $res -ne 0; then - if test $check -eq 1; then - echo -e " \e[31merror\e[0m" - echo -e "\e[1m*** Failed with return code: $res\e[0m" - if test -n "$result"; then - echo "$result" - fi - exit 1 - else - echo -e " \e[33mignored\e[0m" - fi - else - echo -e " \e[32msuccess\e[0m" - fi -} - testtag() { local IFS="|" - egrep -q '^ *'"($*)" configure.ac + egrep -q '^ *'"($*)"' *(\(.*)? *$' configure.ac } contains() { @@ -318,7 +449,9 @@ contains() { checkdir() { if ! test -d "$1"; then # create path run mkdir -p "$1" - run svn add "$1" + if test -n "${VCS}" -a $novcs -eq 0 && ! contains "$1" "${excludevcs[@]}"; then + run ${VCS} add "$1" + fi fi } @@ -331,13 +464,17 @@ checkfile() { } to() { + mode="u=rw,g=rw,o=r" while test $# -gt 0; do - mode="u=rw,g=rw,o=r" case "$1" in (--condition) shift # test for a tag, abort if not set if ! testtag "$1"; then return 0 fi;; + (--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="$1";; (*) break;; @@ -350,23 +487,22 @@ to() { return 1 fi checkdir "$(dirname ${1})" - echo -en "\e[1m-> generating:\e[0m $1 ..." + generating $1 result=$(cat > "$1" 2>&1) res=$? if test $res -ne 0; then - echo -e " \e[31merror\e[0m" - echo -e "\e[1m*** Failed with return code: $res\e[0m" - if test -n "$result"; then - echo "$result" - fi - exit 1 + error "Failed with return code: $res" "$result" else - echo -e " \e[32msuccess\e[0m" + success fi - chmod $mode $1 + run chmod $mode $1 if test $exists -eq 0; then - run svn add "$1" - run svn propset svn:keywords "Id" "$1" + if test -n "${VCS}" -a $novcs -eq 0 && ! contains "$1" "${excludevcs[@]}"; then + run ${VCS} add "$1" + if test "${VCS}" = "svn"; then + run svn propset svn:keywords "Id" "$1" + fi + fi fi return 0 } @@ -384,39 +520,72 @@ copy() { source="${0%/*}/$1" fi fi + if test "${1%/*}" != "$1"; then + test -d "${1%/*}" || svn mkdir "${1%/*}" + fi run cp "${source}" "$1" if test $exists -eq 0; then - run svn add "$1" - run svn propset svn:keywords "Id" "$1" + if test -n "${VCS}" -a $novcs -eq 0 && ! contains "$1" "${excludevcs[@]}"; then + run ${VCS} add "$1" + if test "${VCS}" = "svn"; then + run svn propset svn:keywords "Id" "$1" + fi + fi fi } doxyreplace() { - echo -en "\e[1m-> doxyfile:\e[0m configure $1 ..." + configuring doxyfile $1 if sed -i 's|\(^'"$1"' *=\) *.*|\1'" $2"'|g' doc/doxyfile.in; then - echo -e " \e[32msuccess\e[0m" + success else - echo -e " \e[31merror\e[0m" - echo -e "\e[1m**** command: $0 $*\e[0m" - exit 1 + error $0 $* fi } doxyadd() { - echo -en "\e[1m-> doxyfile:\e[0m configure $1 ..." + configuring doxyfile $1 if sed -i '/^'"$1"' *=/a'"$1"' += '"$2" doc/doxyfile.in; then - echo -e " \e[32msuccess\e[0m" + success else - echo -e " \e[31merror\e[0m" - echo -e "\e[1m**** command: $0 $*\e[0m" - exit 1 + error $0 $* + fi +} + +vcs2cl() { + exists=0 + if test -f "ChangeLog"; then + exists=1 + else + touch "ChangeLog" + fi + if test -x $(which timeout); then + local TIMEOUT="timeout 10" + else + local TIMEOUT= + fi + if test -x $(which ${VCS}2cl); then + if test "${VCS}" = "git"; then + $TIMEOUT ${VCS}2cl || true > ChangeLog + elif test "${VCS}" = "svn"; then + $TIMEOUT ${VCS}2cl --break-before-msg -a -i || true + elif test -n "${VCS}"; then + $TIMEOUT ${VCS}2cl || true + fi + fi + if test $exists -eq 0; then + if test -n "${VCS}" -a $novcs -eq 0 && ! contains "ChangeLog" "${excludevcs[@]}"; then + run ${VCS} add ChangeLog + fi fi } # Check if we are in subversion root, if so, create trunk, branches, tags: -if test "$(LANG= svn info | sed -n 's,Relative URL: *,,p')" = "^/"; then - svn mkdir trunk branches tags - cd trunk +if test "${VCS}" = "svn" -a $novcs -eq 0; then + if test "$(LANG= svn info | sed -n 's,Relative URL: *,,p')" = "^/"; then + svn mkdir trunk branches tags + cd trunk + fi fi # Initialize the environment: @@ -424,13 +593,17 @@ copy ${MY_NAME} copy ax_init_standard_project.m4 copy ax_cxx_compile_stdcxx_11.m4 copy ax_check_qt.m4 +copy makefile_test.inc.am copy resolve-debbuilddeps.sh copy resolve-rpmbuilddeps.sh copy build-in-docker.sh +copy rpmsign.exp copy build-resource-file.sh copy sql-to-dot.sed copy mac-create-app-bundle.sh -AUTHOR=$(gpg -K | sed -n 's,uid *,,p' | sort | head -1) +copy dependency-graph.sh +copy template.sh +AUTHOR=$(gpg -K 2>/dev/null | sed -n 's,uid *\(\[ultimate\] *\)\?,,p' | head -1) if test -z "${AUTHOR}"; then AUTHOR="FIRSTNAME LASTNAME (URL) " fi @@ -440,13 +613,24 @@ EOF to NEWS < #include #include #include +#include int main(int argc, char *argv[]) try { QApplication a(argc, argv); + a.setApplicationDisplayName(a.tr("${PACKAGE_NAME}")); + a.setApplicationName(${PACKAGE_NAME}::package_name().c_str()); + a.setApplicationVersion(${PACKAGE_NAME}::version().c_str()); QCommandLineParser parser; parser.addHelpOption(); parser.process(a); @@ -576,10 +783,17 @@ int main(int argc, char *argv[]) try { return 1; } EOF - to --condition AX_USE_CXX src/${PACKAGE_NAME}.hxx < #include @@ -589,6 +803,7 @@ class ${PackageName}: public QMainWindow, protected Ui::${PackageName} { Q_OBJECT; public: explicit ${PackageName}(QWidget *parent = 0): QMainWindow(parent) { + setTitle(tr("${PACKAGE_NAME}[*]")); setupUi(this); } virtual ~${PackageName}() {} @@ -596,7 +811,8 @@ class ${PackageName}: public QMainWindow, protected Ui::${PackageName} { #endif EOF - to --condition AX_USE_CXX src/${PACKAGE_NAME}.ui < ${PackageName} @@ -678,7 +894,7 @@ EOF to --condition AX_USE_CXX src/version.cxx <= 0.0.1", + "socket.io": "~1.4.4", + "socketio-auth": "0.0.5", + "ldapauth": "git+https://github.com/DimensionSoftware/node-ldapauth.git" + }, + "description": "@DESCRIPTION@", + "main": "@PACKAGE_NAME@.js", + "devDependencies": {}, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "@AUTHOR@", + "license": "@LICENSE@", + "path": { + "prefix": "@PREFIX@", + "sysconf": "@SYSCONFDIR@", + "pkgdata": "@PKGDATADIR@", + "localstate": "@LOCALSTATEDIR@", + "log": "@LOCALSTATEDIR@/log/@PACKAGE_NAME@.log", + "config": "@SYSCONFDIR@/@PACKAGE_NAME@.json", + "nodejs": "@PKGDATADIR@/nodejs" + } +} +EOF +to --condition AX_USE_NODEJS nodejs/etc/${PACKAGE_NAME}.json < /var/run/${PACKAGE_NAME}.pid + # there are some useful defaults + # do not edit this file, overwrite values in /etc/default/${PACKAGE_NAME} + EXEC_${PACKAGE_NAME_UPPER}="/usr/bin/nodejs /usr/share/${PACKAGE_NAME}/nodejs/${PACKAGE_NAME}" + ${PACKAGE_NAME_UPPER}_LOG="/var/log/${PACKAGE_NAME}.log" + ${PACKAGE_NAME_UPPER}_USER="${PACKAGE_NAME}" + ${PACKAGE_NAME_UPPER}_PORT="" + [ -r /etc/default/${PACKAGE_NAME} ] && . /etc/default/${PACKAGE_NAME} + if test -n "\${${PACKAGE_NAME_UPPER}_USER}"; then + exec sudo -u "\${${PACKAGE_NAME_UPPER}_USER}" \${EXEC_${PACKAGE_NAME_UPPER}} \${${PACKAGE_NAME_UPPER}_PORT} >> \${${PACKAGE_NAME_UPPER}_LOG} 2>&1 + else + exec \${EXEC_${PACKAGE_NAME_UPPER}} \${${PACKAGE_NAME_UPPER}_PORT} >> \${${PACKAGE_NAME_UPPER}_LOG} 2>&1 + fi +end script + +pre-start script + ${PACKAGE_NAME_UPPER}_LOG="/var/log/${PACKAGE_NAME}.log" + [ -r /etc/default/${PACKAGE_NAME} ] && . /etc/default/${PACKAGE_NAME} + # Date format same as (new Date()).toISOString() for consistency + echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> \${${PACKAGE_NAME_UPPER}_LOG} +end script + +pre-stop script + ${PACKAGE_NAME_UPPER}_LOG="/var/log/${PACKAGE_NAME}.log" + [ -r /etc/default/${PACKAGE_NAME} ] && . /etc/default/${PACKAGE_NAME} + rm /var/run/${PACKAGE_NAME}.pid + echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> \${${PACKAGE_NAME_UPPER}_LOG} +end script +EOF +to --condition AX_USE_NODEJS nodejs/etc/systemd/system/${PACKAGE_NAME}.service < new connection from "+userdata.username); + + function emit(signal, data, info) { + if (typeof data == 'string' && !data.match("\n")) { + console.log("<- signal: "+signal+"("+data+")"); + } else { + console.log("<- signal: "+signal); + } + if (info) console.log(info); + socket.emit(signal, data); + } + + function fail(txt, data) { + console.log("** "+txt, data); + emit("fail", txt); + } + + /* + socket + .on("xxx", xxx) + .on("yyy", yyy; + */ + + } + + // Handle 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; + authentication(data.username, data.password, + function() { + console.log("####LOGIN-SUCESS####"); + callback(null, true) + }, + function() { + console.log("####LOGIN-FAIL####"); + callback(new Error("wrong credentials")) + }); + }, + postAuthenticate: connection, + timeout: "none" + }); + + return module; +} +EOF +to --condition AX_USE_NODEJS nodejs/views/index.ejs < + + + + + + + + $DESCRIPTION + + + +

$DESCRIPTION

+

generated by bootstrap, please edit

+ + + +EOF +to --condition AX_USE_NODEJS nodejs/views/layout.ejs < +EOF +echo "${HEADER}MAINTAINERCLEANFILES = makefile.in" | to --condition 'AX_USE_DOXYGEN|AX_USE_PERLDOC' doc/makefile.am +if testtag AX_BUILD_TEST; then + to test/runtests.sh < ${0%/*}/test/runtests.sh +fi to --condition 'AX_BUILD_TEST|AX_USE_CPPUNIT' test/makefile.am < +#include +#include +#include +#include +#include + +/// @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: "< + + + + + + +\$projectname: \$title +\$title + + + +\$treeview +\$search +\$mathjax + +\$extrastylesheet + + +
+ +
+
+ +
\$projectname \$projectnumber
+
\$projectbrief
+
+ +
+EOF +to --condition AX_USE_DOXYGEN doc/footer.html.in < + +
+ + +EOF +to --condition AX_USE_DOXYGEN doc/style.css <@AUTHOR_NAME@\\n"' doxyadd ALIASES '"license=\\par License\\n"' 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 '"mutex=\\par Reentrant:\\nAccess is locked with mutex @c "' doxyadd ALIASES '"api=\\xrefitem api \\"API Call\\" \\"\\""' + doxyadd ALIASES '"description=@DESCRIPTION@"' + doxyadd ALIASES '"readme=@README_HTML@"' + doxyadd ALIASES '"author=@AUTHOR_NAME@"' + doxyreplace PLANTUML_JAR_PATH '"@top_srcdir@/doc/plantuml.jar"' doxyreplace ENABLE_PREPROCESSING YES doxyreplace MACRO_EXPANSION YES doxyadd PREDEFINED '"NAMESPACE=@PACKAGE_NAME@"' @@ -804,9 +1557,20 @@ if testtag AX_USE_DOXYGEN; then if testtag AX_BUILD_TEST AX_USE_CPPUNIT; then doxyadd INPUT "@top_srcdir@/test" 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 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 doxyreplace EXAMPLE_PATH @top_srcdir@/examples fi @@ -815,7 +1579,6 @@ if testtag AX_USE_DOXYGEN; then doxyreplace SOURCE_BROWSER YES doxyreplace INLINE_SOURCES YES doxyreplace GENERATE_TESTLIST YES - doxyreplace GENERATE_TREEVIEW NO doxyreplace SEARCHENGINE NO doxyreplace GENERATE_HTML YES doxyreplace GENERATE_LATEX NO @@ -838,21 +1601,22 @@ if testtag AX_USE_DEBIAN_PACKAGING; then to debian/changelog.in < ChangeLog";; +esac) +fi +aclocal +$(if testtag AX_USE_LIBTOOL; then +cat < /dev/null; then + run libtoolize --force; +elif which glibtoolize > /dev/null; then + run glibtoolize --force; +else + echo "error: libtoolize not found" 1>&2 + exit 1 +fi +EOF1 +fi) +automake -a +autoconf +EOF to makefile.am< /dev/null; then + run libtoolize --force; + elif which glibtoolize > /dev/null; then + run glibtoolize --force; + else + error libtoolize not found + fi + fi + run automake -a + run autoconf + + #### Run Configure If User Requires #### + if test "$configure" -eq 1; then + ./configure $* || exit 1 + fi + + #### Run Make If User Requires #### + if test "$build" -eq 1; then + make $buildtarget || exit 1 + fi + fi diff --git a/build-in-docker.sh b/build-in-docker.sh index f63e0e9..5559f63 100755 --- a/build-in-docker.sh +++ b/build-in-docker.sh @@ -2,19 +2,30 @@ set -o errtrace # build and test everything in a fresh docker installation -img="ubuntu:latest" +myarch=$(dpkg --print-architecture) +if test "${arch}" = "amd64"; then + myarch="amd64|i386" +fi +mode="deb" +img="mwaeckerlin/ubuntu:latest" repos=() keys=() -envs=() -dirs=("-v $(pwd):/workdir") +dns=() +envs=("-e LANG=${LANG}" "-e HOME=${HOME}" "-e TERM=xterm" "-e DEBIAN_FRONTEND=noninteractive" "-e DEBCONF_NONINTERACTIVE_SEEN=true") +dirs=("-v $(pwd):/workdir" "-v ${HOME}/.gnupg:${HOME}/.gnupg") packages=() targets="all check distcheck" commands=() +arch=$((which dpkg > /dev/null 2> /dev/null && dpkg --print-architecture) || echo amd64) +host= +flags=() +wait=0 if test -e ./build-in-docker.conf; then # you can preconfigure the variables in file build-in-docker.conf # if you do so, add the file to EXTRA_DIST in makefile.am source ./build-in-docker.conf fi + while test $# -gt 0; do case "$1" in (-h|--help) @@ -23,14 +34,26 @@ while test $# -gt 0; do echo "OPTIONS:" echo echo " -h, --help show this help" + echo " -m, --mode mode: deb, rpm, win, default: ${mode}" echo " -i, --image use given docker image instead of ${img}" + echo " -a, --arch build for given hardware architecture" echo " -t, --targets targets specify build targets, default: ${targets}" + echo " --host host for cross compiling, e.g. i686-w64-mingw32" + echo " -f, --flag add flag to ./bootstrap.sh or ./configure" echo " -r, --repo add given apt repository" echo " -k, --key add public key from url" + echo " -n, --dns add ip as dns server" echo " -e, --env = set environment variable in docker" echo " -d, --dir access given directory read only" echo " -p, --package install extra debian packages" echo " -c, --cmd execute commands as root in docker" + echo " -w, --wait on error keep docker container and wait for enter" + echo + echo " The option -i must be after -m, because mode sets a new default image" + echo " The option -m must be after -t, because mode may be auto detected from targets" + echo " The option -m must be after -h, because mode may set a host" + echo " If target is either deb or rpm, mode is set to the same value" + echo " If target is win, host is set to i686-w64-mingw32" echo echo " The options -r -k -e -d -p -c can be repeated several times." echo @@ -52,19 +75,53 @@ while test $# -gt 0; do echo " -e ANDROID_HOME=/opt/local/android \\" echo " -d /opt/local/android \\" echo " -r universe \\" - echo " -r https://dev.marc.waeckerlin.org/repository \\" - echo " -k https://dev.marc.waeckerlin.org/repository/PublicKey \\" + echo " -r https://repository.mrw.sh \\" + echo " -k https://repository.mrw.sh/PublicKey \\" echo " -p mrw-c++" echo exit 0 ;; + (-m|--mode) shift; + mode="$1" + case "$mode" in + (deb|apt) img="mwaeckerlin/ubuntu:latest";; + (rpm|zypper) img="opensuse:latest";; + (yum) img="centos:latest";; + (dnf) img="fedora:latest";; + (win) + img="mwaeckerlin/ubuntu:latest"; host="${host:---host=i686-w64-mingw32}" + targets="all install" + flags+=("--prefix=/workdir/usr") + packages+=("mingw-w64") + ;; + (*) + echo "**** ERROR: unknown mode '$1', try --help" 1>&2 + exit 1 + ;; + esac + ;; (-i|--image) shift; img="$1" ;; + (-a|--arch) shift; + arch="$1" + ;; (-t|--targets) shift; targets="$1" + if test "$1" = "deb" -o "$1" = "rpm"; then + # set mode to same value + set -- "-m" "$@" + continue + fi + ;; + (--host) shift; + host="--host=$1" + ;; + (-f|--flag) shift; + flags+=("$1") ;; (-r|--repo) shift; + echo "OPTION: $1" repos+=("$1") ;; (-k|--key) shift; @@ -73,6 +130,9 @@ while test $# -gt 0; do (-e|--env) shift; envs+=("-e $1") ;; + (-n|--dns) shift; + dns+=("--dns $1") + ;; (-d|--dirs) shift; dirs+=("-v $1:$1:ro") ;; @@ -82,6 +142,9 @@ while test $# -gt 0; do (-c|--cmd) shift; commands+=("$1") ;; + (-w|--wait) + wait=1 + ;; (*) echo "**** ERROR: unknown option '$1', try --help" 1>&2 exit 1 @@ -113,15 +176,22 @@ function traperror() { fi echo fi - echo "**** Entering docker container ${DOCKER_ID}, exit with Ctrl-D" + if [ "$wait" -eq 1 ]; then + echo " ... now you can access the docker container as root or user:" + echo " docker exec -it ${DOCKER_ID} bash" + echo " docker exec -u $(id -u) -it ${DOCKER_ID} bash" + echo -n " ... press enter to cleanup: " + read + fi echo -n " ... cleanup docker: " - docker rm -f "${DOCKER_ID}" + docker stop "${DOCKER_ID}" || true + docker rm "${DOCKER_ID}" echo "returning status: $e" echo "--->" exit $e fi done - echo -n " SUCCESS ... cleanup docker: " + echo -n "SUCCESS ... cleanup docker: " docker rm -f "${DOCKER_ID}" exit 0 } @@ -130,21 +200,27 @@ function ifthenelse() { arg="$1" shift cmd="$*" + DISTRIBUTOR=$(docker exec ${DOCKER_ID} lsb_release -si | sed 's, .*,,' | tr [:upper:] [:lower:]) + CODENAME=$(docker exec ${DOCKER_ID} lsb_release -cs) + ARCH=$((docker exec ${DOCKER_ID} which dpkg > /dev/null 2> /dev/null && docker exec ${DOCKER_ID} dpkg --print-architecture) || echo amd64) if test "${arg/:::/}" = "${arg}"; then - docker exec ${DOCKER_ID} bash -c "${cmd//ARG/${arg}}" + docker exec ${DOCKER_ID} bash -c "${cmd//ARG/${arg//@DISTRIBUTOR@/${DISTRIBUTOR}}}" else os="${arg%%:::*}" thenpart="${arg#*:::}" - if test "${thenpart/:::/}" = "${thenpart}"; then - docker exec ${DOCKER_ID} bash -c 'os="'$os'"; if [[ "$(lsb_release -is)-$(lsb_release -cs)-$(dpkg --print-architecture)" =~ ${os} ]]; then '"${cmd//ARG/${thenpart}}"'; fi' - else + elsepart= + if test "${thenpart/:::/}" != "${thenpart}"; then elsepart="${thenpart##*:::}" - thenpart="${thenpart%:::*}" + thenpart="${thenpart%%:::*}" + fi + if [[ "${DISTRIBUTOR}-${CODENAME}-${ARCH}" =~ ${os} ]]; then if test -n "${thenpart}"; then - docker exec ${DOCKER_ID} bash -c 'os="'$os'"; if [[ "$(lsb_release -is)-$(lsb_release -cs)-$(dpkg --print-architecture)" =~ ${os} ]]; then '"${cmd//ARG/${thenpart}}"'; else '"${cmd//ARG/${elsepart}}"'; fi' - else - docker exec ${DOCKER_ID} bash -c 'os="'$os'"; if [[ "$(lsb_release -is)-$(lsb_release -cs)-$(dpkg --print-architecture)" =~ ${os} ]]; then true; else '"${cmd//ARG/${elsepart}}"'; fi' - fi + docker exec ${DOCKER_ID} bash -c "${cmd//ARG/${thenpart//@DISTRIBUTOR@/${DISTRIBUTOR}}}" + fi + else + if test -n "${elsepart}"; then + docker exec ${DOCKER_ID} bash -c "${cmd//ARG/${elsepart//@DISTRIBUTOR@/${DISTRIBUTOR}}}" + fi fi fi } @@ -152,27 +228,95 @@ function ifthenelse() { set -x docker pull $img -DOCKER_ID=$(docker run -d ${dirs[@]} ${envs[@]} -w /workdir $img sleep infinity) +DOCKER_ID=$(docker create ${dns[@]} ${dirs[@]} ${envs[@]} -w /workdir $img sleep infinity) trap 'traperror '"${DOCKER_ID}"' "$? ${PIPESTATUS[@]}" $LINENO $BASH_LINENO "$BASH_COMMAND" "${FUNCNAME[@]}" "${FUNCTION}"' SIGINT INT TERM EXIT -docker exec ${DOCKER_ID} apt-get update -docker exec ${DOCKER_ID} apt-get upgrade -y -docker exec ${DOCKER_ID} apt-get install -y python-software-properties software-properties-common apt-transport-https dpkg-dev lsb-release || \ - docker exec ${DOCKER_ID} apt-get install -y software-properties-common apt-transport-https dpkg-dev lsb-release || \ - docker exec ${DOCKER_ID} apt-get install -y python-software-properties apt-transport-https dpkg-dev lsb-release; -for repo in "${repos[@]}"; do - ifthenelse "${repo}" "apt-add-repository ARG" +if ! [[ $arch =~ $myarch ]]; then + docker cp "/usr/bin/qemu-${arch}-static" "${DOCKER_ID}:/usr/bin/qemu-${arch}-static" +fi +docker start "${DOCKER_ID}" +if ! docker exec ${DOCKER_ID} getent group $(id -g) > /dev/null 2>&1; then + docker exec ${DOCKER_ID} groupadd -g $(id -g) $(id -gn) +fi +if ! docker exec ${DOCKER_ID} getent passwd $(id -u) > /dev/null 2>&1; then + docker exec ${DOCKER_ID} useradd -m -u $(id -u) -g $(id -g) -d"${HOME}" $(id -un) +fi +docker exec ${DOCKER_ID} chown $(id -u):$(id -g) "${HOME}" +case $mode in + (deb|apt|win) + if [[ "${img}" =~ "ubuntu" ]]; then + docker exec ${DOCKER_ID} locale-gen ${LANG} + docker exec ${DOCKER_ID} update-locale LANG=${LANG} + fi + OPTIONS='-o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confnew -y --force-yes --no-install-suggests --no-install-recommends' + for f in 'libpam-systemd:amd64' 'policykit*' 'colord'; do + docker exec ${DOCKER_ID} bash -c "echo 'Package: $f' >> /etc/apt/preferences" + docker exec ${DOCKER_ID} bash -c "echo 'Pin-Priority: -100' >> /etc/apt/preferences" + docker exec ${DOCKER_ID} bash -c "echo >> /etc/apt/preferences" + done + docker exec ${DOCKER_ID} apt-get update ${OPTIONS} + docker exec ${DOCKER_ID} apt-get upgrade ${OPTIONS} + docker exec ${DOCKER_ID} apt-get install ${OPTIONS} python-software-properties software-properties-common apt-transport-https dpkg-dev lsb-release wget || \ + docker exec ${DOCKER_ID} apt-get install ${OPTIONS} software-properties-common apt-transport-https dpkg-dev lsb-release wget || \ + docker exec ${DOCKER_ID} apt-get install ${OPTIONS} python-software-properties apt-transport-https dpkg-dev lsb-release wget; + for key in "${keys[@]}"; do + wget -O- "$key" \ + | docker exec -i ${DOCKER_ID} apt-key add - + done + for repo in "${repos[@]}"; do + ifthenelse "${repo}" "apt-add-repository 'ARG'" + done + docker exec ${DOCKER_ID} apt-get update ${OPTIONS} + for package in "${packages[@]}"; do + ifthenelse "${package}" "apt-get install ${OPTIONS} ARG" + done + for command in "${commands[@]}"; do + ifthenelse "${command}" "ARG" + done + docker exec ${DOCKER_ID} ./resolve-debbuilddeps.sh + ;; + (rpm|yum|dnf|zypper|urpmi) + 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' <> /etc/yum.repos.d/wandisco-svn.repo' + docker exec -i ${DOCKER_ID} bash -c 'cat >> /etc/yum.repos.d/wandisco-svn.repo' <&3 +} + +# write error message +error() { + echo -en "\e[1;31merror" 1>&2 + append_msg $* 1>&2 +} + +# write a warning message +warning() { + echo -en "\e[1;33mwarning" 1>&2 + append_msg $* 1>&2 +} + +# write a success message +success() { + echo -en "\e[1;32msuccess" 1>&2 + append_msg $* 1>&2 +} + +# commandline parameter evaluation +files=${0%/*}/configure.ac +short=0 +while test $# -gt 0; do + case "$1" in + (--short|-s) short=1;; + (--help|-h) less < + +OPTIONS + + --help, -h show this help + --short, -s short graph with no external dependencies + + list of zero or more configure.ac files + (default: ${files}) + +DESCRIPTION + + Evaluates dependencies of all the given configure.ac file. By + default takes the local configure.ac. Outputs a graphwiz dot file + with the dependencies. Solid lines are required dependencies, dotted + lines are optional dependencies. + +EXAMPLE + + Evaluate all dependencies between all local subversion and git + projects, if they are in the path ~/svn and ~/git: + + $0 ~/svn/*/configure.ac ~/git/*/configure.ac + +EOF + exit;; + (*) files=$*; break;; + esac + if test $# -eq 0; then + error "missing parameter, try $0 --help"; exit 1 + fi + shift; +done + +# run a command, print the result and abort in case of error +# option: --no-check: ignore the result, continue in case of error +run() { + check=1 + while test $# -gt 0; do + case "$1" in + (--no-check) check=0;; + (*) break;; + esac + shift; + done + echo -en "\e[1m-> running:\e[0m $* ..." + result=$($* 2>&1) + res=$? + if test $res -ne 0; then + if test $check -eq 1; then + error "failed with return code: $res" + if test -n "$result"; then + echo "$result" + fi + exit 1 + else + warning "ignored return code: $res" + fi + else + success + fi +} + +# error handler +function traperror() { + set +x + local err=($1) # error status + local line="$2" # LINENO + local linecallfunc="$3" + local command="$4" + local funcstack="$5" + for e in ${err[@]}; do + if test -n "$e" -a "$e" != "0"; then + error "line $line - command '$command' exited with status: $e (${err[@]})" + if [ "${funcstack}" != "main" -o "$linecallfunc" != "0" ]; then + echo -n " ... error at ${funcstack} " + if [ "$linecallfunc" != "" ]; then + echo -n "called at line $linecallfunc" + fi + echo + fi + exit $e + fi + done + success + exit 0 +} + +# catch errors +trap 'traperror "$? ${PIPESTATUS[@]}" $LINENO $BASH_LINENO "$BASH_COMMAND" "${FUNCNAME[@]}" "${FUNCTION}"' ERR SIGINT INT TERM EXIT + +########################################################################################## + +filter() { + if test $short -eq 1; then + all=$(cat) + allowed=$(sed -n '/"\(.*\)" \[style=solid\];/{s//\1/;H};${x;s/\n//;s/\n/\\|/gp}' <<<"${all}") + sed -n '/"\('"${allowed}"'\)" -> "\('"${allowed}"'\)"/p' <<<"${all}" + else + cat + fi +} + +echo "digraph G {" +if test $short -eq 0; then + echo "node [style=dashed];" +fi +( + for file in $files; do + if ! test -e $file; then + error "file $file not found"; exit 1 + fi + sed -n ' + /^ *m4_define(x_package_name, */ {s//"/;s/ *).*/"/;h;s/.*/& [style=solid];/p} + /^ *AX_REQUIRE_QT/ {s/.*/"qt" -> /;G;s/\n//;s/.*/&;/p} + /^ *AX_PKG_REQUIRE(\[\?\([^],)]\+\)\]\?, \[\?\([^],)]\+\)\]\?.*/ {s//"\2" -> /;G;s/\n//;s/.*/&;/p} + /^ *AX_PKG_REQUIRE(\[\?\([^],)]\+\)\]\?.*/ {s//"\1" -> /;G;s/\n//;s/.*/&;/p} + /^ *AX_CHECK_QT/ {s/.*/"qt" -> /;G;s/\n//;s/.*/& [style=dashed];/p} + /^ *AX_PKG_CHECK(\[\?\([^],)]\+\)\]\?, \[\?\([^],)]\+\)\]\?.*/ {s//"\2" -> /;G;s/\n//;s/.*/& [style=dotted];/p} + /^ *AX_PKG_CHECK(\[\?\([^],)]\+\)\]\?.*/ {s//"\1" -> /;G;s/\n//;s/.*/& [style=dotted];/p} + ' $file + done +) | filter +echo "}" diff --git a/doc/footer.html.in b/doc/footer.html.in new file mode 100644 index 0000000..273be21 --- /dev/null +++ b/doc/footer.html.in @@ -0,0 +1,8 @@ + + + diff --git a/doc/header.html.in b/doc/header.html.in new file mode 100644 index 0000000..311876f --- /dev/null +++ b/doc/header.html.in @@ -0,0 +1,33 @@ + + + + + + + +$projectname: $title +$title + + + +$treeview +$search +$mathjax + +$extrastylesheet + + +
+ +
+
+ +
$projectname $projectnumber
+
$projectbrief
+
+ +
diff --git a/doc/plantuml.jar b/doc/plantuml.jar new file mode 100644 index 0000000..9502c23 Binary files /dev/null and b/doc/plantuml.jar differ diff --git a/doc/style.css b/doc/style.css new file mode 100644 index 0000000..303c151 --- /dev/null +++ b/doc/style.css @@ -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 + } +} diff --git a/mac-create-app-bundle.sh b/mac-create-app-bundle.sh index 6ced200..7ff4573 100755 --- a/mac-create-app-bundle.sh +++ b/mac-create-app-bundle.sh @@ -7,7 +7,7 @@ ## Parameters: ## $1: name of the app-target ## $2: name of the project -## $3: installation source +## $3: package installation target ## ## 1 2 3 4 5 6 7 8 ## 45678901234567890123456789012345678901234567890123456789012345678901234567890 @@ -16,30 +16,33 @@ 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" + +cd ${0%/*} + +project=${2:-$(sed -n 's/ *m4_define *( *x_package_name, *\(.*\) *).*/\1/p' $(pwd)/configure.ac)} +apptarget=${1:-${project}.app} +sources=${3:-$(pwd)/usr} +test -n "$project" +test -d "$sources" +! test -e "$apptarget" || rm -rf "$apptarget" +target="$(pwd)/${apptarget}/Contents/MacOS" + +echo "Creating $apptarget for $project from $sources" # 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 +mkdir -p ${apptarget}/Contents/{Resources,MacOS} +! test -d ${sources}/bin || \ + find ${sources}/bin -mindepth 1 -maxdepth 1 -exec cp -a {} ${apptarget}/Contents/MacOS/ \; +executablefile=${apptarget}/Contents/MacOS/${project} +test -x $executablefile || executablefile=$(ls -1 ${apptarget}/Contents/MacOS/ | head -1) +! test -d ${sources}/lib || \ + find ${sources}/lib -mindepth 1 -maxdepth 1 -exec cp -a {} ${apptarget}/Contents/MacOS/ \; +! test -d ${sources}/share/${project} || \ + find ${sources}/share/${project} -mindepth 1 -maxdepth 1 -exec cp -a {} ${apptarget}/Contents/Resources/ \; +! test -d ${sources}/share || \ + find ${sources}/share -mindepth 1 -maxdepth 1 -exec cp -a {} ${apptarget}/Contents/Resources/ \; +! test -d ${sources} || \ + find ${sources} -mindepth 1 -maxdepth 1 -exec cp -a {} ${apptarget}/Contents/Resources/ \; # Step 2: copy qt plugins, if necessary for f in ${QT_PLUGINS}; do @@ -75,29 +78,29 @@ 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 \ + MENU_NIB=$(find ${QTDIR} -name .svn -o -name .git -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 + rsync -r "${MENU_NIB}" ${apptarget}/Contents/Resources/ + test -d ${apptarget}/Contents/Resources/qt_menu.nib fi fi # Step 5: copy or create info.plist -infoplist=$(find ${1}/Contents/Resources -name Info.plist) +infoplist=$(find ${apptarget}/Contents/Resources -name Info.plist) if test -f "${infoplist}"; then - mv "${infoplist}" ${1}/Contents/Info.plist + cp -a "${infoplist}" ${apptarget}/Contents/Info.plist else - cat > ${1}/Contents/Info.plist < ${apptarget}/Contents/Info.plist < CFBundleIdentifier - ${2} + ${project} CFBundleExecutable ${executablefile##/} EOF -fi \ No newline at end of file +fi diff --git a/makefile_test.inc.am b/makefile_test.inc.am new file mode 100644 index 0000000..baf81c4 --- /dev/null +++ b/makefile_test.inc.am @@ -0,0 +1,9 @@ +## @id $Id$ + +## 1 2 3 4 5 6 7 8 +## 45678901234567890123456789012345678901234567890123456789012345678901234567890 + +%.gcda: % + gcov $< + +CLEANFILES += ${CLEANFILES} ${TEST:%=%.gcno} ${TEST:%=%.gcda} *.gcov diff --git a/resolve-debbuilddeps.sh b/resolve-debbuilddeps.sh index 6486a4e..36a94e6 100755 --- a/resolve-debbuilddeps.sh +++ b/resolve-debbuilddeps.sh @@ -16,7 +16,7 @@ if test -n "${SCHROOTNAME}"; then SUDO="schroot -c "${SCHROOTNAME}" -u root -d / --" else DO="" - if grep -q '/docker/' /proc/1/cgroup; then + if grep -q '/docker' /proc/1/cgroup; then SUDO="" else SUDO="sudo" @@ -32,24 +32,76 @@ function install() { } TO_INSTALL= +DEPS= if test -e debian/control.in -a ! -e debian/control; then - for f in $(sed -n 's, *AX_DEB_DEPEND_IFEXISTS(\([^)]*\)).*,\1,p' configure.ac); do - if test -n "$(${DO} apt-cache policy -q ${f})" && ! ${DO} dpkg -l "${f}"; then - TO_INSTALL+=" ${f}" + function pkg_exists() { + test -n "$(${DO} apt-cache policy -q ${1})" + } + function AX_PKG_CHECK() { + local DEV_DEB_DIST_PKG= + local DEV_DIST_PKG= + local pkg= + eval $4 + if test -z "$2"; then + pkg=$1 + else + pkg=$2 + fi + pkg=${DEV_DEB_DIST_PKG:-${DEV_DIST_PKG:-${pkg}}-dev} + if pkg_exists "${pkg}"; then + echo $pkg + fi + } + function AX_PKG_REQUIRE() { + local DEV_DEB_DIST_PKG= + local DEV_DIST_PKG= + local pkg= + eval $6 + if test -z "$2"; then + pkg=$1 + else + pkg=$2 + fi + if test -n "$4"; then + for f in $pkg $4; do + if pkg_exists "${f}-dev"; then + pkg=$f + break + fi + done + fi + echo ${DEV_DEB_DIST_PKG:-${DEV_DIST_PKG:-${pkg}}-dev} + } + DEPS+=" $(eval $(sed -n '/^ *AX_PKG_REQUIRE/{s,^ *\(AX_PKG_REQUIRE\) *(\(.*\)).*,\1 \2,;s.\[\([^]]*\)\],\?."\1".g;s,$,;,g;p}' configure.ac))" + DEPS+=" $(eval $(sed -n '/^ *AX_PKG_CHECK/{s,^ *\(AX_PKG_CHECK\) *(\(.*\)).*,\1 \2,;s.\[\([^]]*\)\],\?."\1".g;s,$,;,g;p}' configure.ac))" + for f in $(sed -n 's, *AX_\(DEB\|ALL\)_DEPEND_IFEXISTS(\([^)]*\)).*,\2,p' configure.ac); do + if pkg_exists "${f}"; then + DEPS+=" ${f}" fi done + for f in $(sed -n 's, *AX_\(DEB\|ALL\)_DEPEND_IFEXISTS_DEV(\([^)]*\)).*,\2,p' configure.ac); do + if pkg_exists "${f}-dev"; then + DEPS+=" ${f}-dev" + fi + done + for f in $(sed -n 's, *AX_\(DEB\|ALL\)\(_BUILD\)\?_DEPEND(\([^)]*\)).*,\3,p' configure.ac); do + DEPS+=" ${f}" + done + for f in $(sed -n 's, *AX_\(DEB\|ALL\)\(_BUILD\)\?_DEPEND_DEV(\([^)]*\)).*,\3,p' configure.ac); do + DEPS+=" ${f}-dev" + done trap "rm debian/control" INT TERM EXIT - sed 's,@DEB_DEPEND_IFEXISTS@,,g' debian/control.in | \ + sed 's,@\(\(ALL\|DEB\)_DEPEND_IFEXISTS\|\(ALL\|DEB\)_BUILD_DEPEND\|\(ALL\|DEB\)_DEPEND\)@,,g' debian/control.in | \ sed 's,@[^@]*@, dummytext,g' > debian/control fi install dpkg-dev -DEPS=$(${DO} dpkg-checkbuilddeps 2>&1 || true) -DEPS=$(echo "$DEPS" | sed -n '/Unmet build dependencies/ { s,.*Unmet build dependencies: ,,g; s, ([^)]*),,g; s, *| *,|,g; p}') + +DEPS+=" $(LANG= ${DO} dpkg-checkbuilddeps 2>&1 | sed -n '/Unmet build dependencies/ { s,.*Unmet build dependencies: ,,g; s, ([^)]*),,g; s, *| *,|,g; p}')" for pa in ${DEPS}; do - if test ${pa//|/} = ${pa}; then + if test "${pa//|/}" = "${pa}"; then TO_INSTALL+=" ${pa}" continue; fi @@ -72,4 +124,10 @@ if test -n "${TO_INSTALL}" && ! install ${TO_INSTALL}; then exit 1 fi +FILES="$(LANG= ${DO} dpkg-checkbuilddeps 2>&1 | sed -n '/Unmet build dependencies/ { s,.*Unmet build dependencies: ,,g; s, ([^)]*),,g; s, *| *,|,g; p}')" +if test -n "${FILES}"; then + echo "**** ERROR: Cannot install: " $FILES + exit 1 +fi + echo "**** Success: All Dependencies Resolved" diff --git a/resolve-rpmbuilddeps.sh b/resolve-rpmbuilddeps.sh index f36a875..7c1843b 100755 --- a/resolve-rpmbuilddeps.sh +++ b/resolve-rpmbuilddeps.sh @@ -10,25 +10,111 @@ ## 1 2 3 4 5 6 7 8 ## 45678901234567890123456789012345678901234567890123456789012345678901234567890 +INSTALL_TOOL=${INSTALL_TOOL:-$((test -x /usr/bin/zypper && echo zypper install -y) || (test -x /usr/bin/dnf && echo dnf install -y) || (test -x /usr/bin/yum && echo yum install -y) || (test -x /usr/sbin/urpmi && echo urpmi --auto))} SCHROOTNAME="$1" PACKAGE_NAME=$(sed -n 's/^ *m4_define(x_package_name, \(.*\)).*/\1/p' configure.ac) +TRAP_CMD="sleep ${SLEEP:-0};" +DEPS= +for f in BUILD BUILDROOT RPMS SPECS SRPMS; do + if ! test -d $f; then + TRAP_CMD+="rm -rf $f;" + mkdir $f + fi +done +if test -e ${PACKAGE_NAME}.spec.in -a ! -e ${PACKAGE_NAME}.spec; then + function pkg_exists() { + (test -x /usr/bin/zypper && zypper search -x "$1" 1>&2 > /dev/null) || \ + (test -x /usr/bin/dnf && dnf list -q "$1" 1>&2 > /dev/null) || \ + (test -x /usr/bin/yum && yum list -q "$1" 1>&2 > /dev/null) || \ + (test -x /usr/sbin/urpmq && urpmq "$1" 1>&2 > /dev/null) + } + function AX_PKG_CHECK() { + local DEV_RPM_DIST_PKG= + local DEV_DIST_PKG= + local pkg= + eval $4 + if test -z "$2"; then + pkg=$1 + else + pkg=$2 + fi + pkg=${DEV_RPM_DIST_PKG:-${DEV_DIST_PKG:-${pkg}}-devel} + if pkg_exists "${pkg}"; then + echo ${pkg} + fi + } + function AX_PKG_REQUIRE() { + local DEV_RPM_DIST_PKG= + local DEV_DIST_PKG= + local pkg= + eval $6 + if test -z "$2"; then + pkg=$1 + else + pkg=$2 + fi + if test -n "$4"; then + for f in $pkg $4; do + if pkg_exists "${f}-devel"; then + pkg=$f + break + fi + done + fi + echo ${DEV_RPM_DIST_PKG:-${DEV_DIST_PKG:-${pkg}}-devel} + } + DEPS+=" $(eval $(sed -n '/^ *AX_PKG_REQUIRE/{s,^ *\(AX_PKG_REQUIRE\) *(\(.*\)).*,\1 \2,;s.\[\([^]]*\)\],\?."\1".g;s,$,;,g;p}' configure.ac))" + DEPS+=" $(eval $(sed -n '/^ *AX_PKG_CHECK/{s,^ *\(AX_PKG_CHECK\) *(\(.*\)).*,\1 \2,;s.\[\([^]]*\)\],\?."\1".g;s,$,;,g;p}' configure.ac))" + for f in $(sed -n 's, *AX_\(RPM\|ALL\)_DEPEND_IFEXISTS(\([^)]*\)).*,\2,p' configure.ac); do + if pkg_exists "${f}"; then + DEPS+=" ${f}" + fi + done + for f in $(sed -n 's, *AX_\(RPM\|ALL\)_DEPEND_IFEXISTS_DEV(\([^)]*\)).*,\2,p' configure.ac); do + if pkg_exists "${f}-devel"; then + DEPS+=" ${f}-devel" + fi + done + for f in $(sed -n 's, *AX_\(RPM\|ALL\)\(_BUILD\)\?_DEPEND(\([^)]*\)).*,\3,p' configure.ac); do + DEPS+=" ${f}" + done + for f in $(sed -n 's, *AX_\(RPM\|ALL\)\(_BUILD\)\?_DEPEND_DEV(\([^)]*\)).*,\3,p' configure.ac); do + DEPS+=" ${f}-devel" + done + TRAP_CMD+="rm ${PACKAGE_NAME}.spec;" + trap "${TRAP_CMD}" INT TERM EXIT + sed 's,@\(\(ALL\|RPM\)_DEPEND_IFEXISTS\|\(ALL\|RPM\)_BUILD_DEPEND\|\(ALL\|RPM\)_DEPEND\)@,,g' ${PACKAGE_NAME}.spec.in | \ + sed 's,@[^@]*@,dummytext,g' > ${PACKAGE_NAME}.spec +fi + +TGZFILE=$(sed -n '/^Name: */{s///;h};/^Version: */{s///;H;x;s/\n/-/;s/$/.tar.gz/;p}' ${PACKAGE_NAME}.spec) +if ! test -e $TGZFILE; then + TRAP_CMD+="rm ${TGZFILE};" + trap "${TRAP_CMD}" INT TERM EXIT + touch $TGZFILE +fi + 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} + schroot -c ${SCHROOTNAME} -u root -- ${INSTALL_TOOL} ${FILES} ${DEPS} 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} + ${INSTALL_TOOL} ${FILES} ${DEPS} fi fi +if test -n "${SCHROOTNAME}"; then + 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') +else + FILES=$(LANG= rpmbuild -bb --clean --nobuild --define "_topdir ." --define "_sourcedir ." ${PACKAGE_NAME}.spec 2>&1 | sed -n 's, is needed by.*,,p') +fi +if test -n "${FILES}"; then + echo "**** ERROR: Cannot install: " $FILES + exit 1 +fi + echo "**** Success: All Dependencies Resolved" diff --git a/rpmsign.exp b/rpmsign.exp new file mode 100755 index 0000000..dc29d94 --- /dev/null +++ b/rpmsign.exp @@ -0,0 +1,14 @@ +#!/usr/bin/expect -f + +set key [lindex $argv 0] +set password [lindex $argv 1] +set files [lrange $argv 2 end] + +### rpm-sign.exp -- Sign RPMs by sending the passphrase. +spawn rpmsign --define "_gpg_name $key" --addsign {*}$files +expect { + "Enter pass phrase: " { + send -- "$password\r" + exp_continue + } eof +} diff --git a/sql-to-dot.sed b/sql-to-dot.sed index 07b2989..e4e99b3 100755 --- a/sql-to-dot.sed +++ b/sql-to-dot.sed @@ -11,6 +11,11 @@ H;$!d;$x # remove all single-line comment lines s/\n--[^\n]*//g +# encode html entities +s/&/\&##SEMICOLON##/g +s//\>##SEMICOLON##/g + # reduce spaces s,\t\| \+, ,g @@ -21,7 +26,7 @@ s,\t\| \+, ,g s,\n\+,\n,g # 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 :a;s/^\(\([^"]*"[^",]*"\)*[^"]*"[^"]*\),\([^"]*".*\)/\1\##COMMA##\3/g;ta @@ -34,17 +39,18 @@ h s,.*\(create[ \n]\+table[^;]*;\).*,\1,ig # start html table node -s|CREATE[ \n]\+TABLE[ \n]\+\(if[ \n]\+not[ \n]\+exists[ \n]\+\)\?`\?\(\w\+\)`\?| \2\n [shape=none, margin=0, label=<\n \n |ig +s|CREATE[ \n]\+TABLE[ \n]\+\(IF[ \n]\+NOT[ \n]\+EXISTS[ \n]\+\)\?`\?\(\w\+\)`\?| \2\n [shape=none, margin=0, label=<\n
\2
\n |ig # 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 :b;s/\(\w\+\)\([^;]*\)FOREIGN[\n ]\+KEY[ \n]*([ \n]*`\?\([a-z]\+\)`\?[ \n]*)[ \n]*REFERENCES[ \n]*`\?\([a-z]\+\)`\?[ \n]*([ \n]*`\?\([a-z]\+\)`\?[ \n]*)[ \n]*\([^,)]*\)\([,)].*\)/\1\2\7\n \1:\3 -> \4:\5 [label="\6"]##SEMICOLON##/ig;tb # create table rows -s|[(,][ \n]*`\?\(\w\+\)`\?[ \n]\+\(\w\+\(([^)]\+)\)\?\)[ \n]*\([^,)]*\)[ \n]\+COMMENT[ \n]*["']\([^"']*\)["'][ \n]*|\n |gi -s|[(,][ \n]*`\?\(\w\+\)`\?[ \n]\+\(\w\+\(([^)]\+)\)\?\)[ \n]*\([^,)]*\)|\n |g +s|[(,][ \n]*`\?\(\w\+\)`\?[ \n]\+\(\w\+\(([^)]\+)\)\?\)[ \n]*\([^,)]*\)|\n |g +# extract comment +s|\([^<]*\)COMMENT[ \n]\+["']\([^"']*\)["']\([^<]*\)|\1\4|g # add line breaks for long lines s|\(]*>[^<]\{30,40\}\)[ \n]\+\([^<]\{20,\}\)|\1
\2|g diff --git a/template.sh b/template.sh new file mode 100755 index 0000000..beb656d --- /dev/null +++ b/template.sh @@ -0,0 +1,160 @@ +#!/bin/bash -e + +########################################################################################## +#### template for bash scripts #### START BELOW ########################################## +########################################################################################## + +############################################################################ begin logging +# check if stdout is a terminal... +if test -t 1; then + + # see if it supports colors... + ncolors=$(tput colors) + + if test -n "$ncolors" && test $ncolors -ge 8; then + bold="$(tput bold)" + underline="$(tput smul)" + standout="$(tput smso)" + normal="$(tput sgr0)" + black="$(tput setaf 0)" + red="$(tput setaf 1)" + green="$(tput setaf 2)" + yellow="$(tput setaf 3)" + blue="$(tput setaf 4)" + magenta="$(tput setaf 5)" + cyan="$(tput setaf 6)" + white="$(tput setaf 7)" + fi +fi + +append_msg() { + if test $# -ne 0; then + echo -n ": ${bold}$*" + fi + echo "${normal}" +} + +# write a message +message() { + if test $# -eq 0; then + return + fi + echo "${bold}${white}$*${normal}" 1>&2 +} + +# write a success message +success() { + echo -n "${bold}${green}success" 1>&2 + append_msg $* 1>&2 +} + +# write a notice +notice() { + echo -n "${bold}${yellow}notice" 1>&2 + append_msg $* 1>&2 +} + +# write a warning message +warning() { + echo -en "${bold}${red}warning" 1>&2 + append_msg $* 1>&2 +} + +# write error message +error() { + echo -en "${bold}${red}error" 1>&2 + append_msg $* 1>&2 +} + +# run a command, print the result and abort in case of error +# option: --ignore: ignore the result, continue in case of error +run() { + ignore=1 + while test $# -gt 0; do + case "$1" in + (--ignore) ignore=0;; + (*) break;; + esac + shift; + done + echo -n "${bold}${yellow}running:${white} $*${normal} … " + set +e + result=$($* 2>&1) + res=$? + set -e + if test $res -ne 0; then + if test $ignore -eq 1; then + error "failed with return code: $res" + if test -n "$result"; then + echo "$result" + fi + exit 1 + else + warning "ignored return code: $res" + fi + else + success + fi +} + +############################################################################ error handler +function traperror() { + set +x + local err=($1) # error status + local line="$2" # LINENO + local linecallfunc="$3" + local command="$4" + local funcstack="$5" + IFS=" " + for e in ${err[@]}; do + if test -n "$e" -a "$e" != "0"; then + error "line $line - command '$command' exited with status: $e (${err[@]})" + if [ "${funcstack}" != "main" -o "$linecallfunc" != "0" ]; then + echo -n " ... error at ${funcstack} " 1>&2 + if [ "$linecallfunc" != "" ]; then + echo -n "called at line $linecallfunc" 1>&2 + fi + echo + fi + exit $e + fi + done + success + exit 0 +} + +# catch errors +trap 'traperror "$? ${PIPESTATUS[@]}" $LINENO $BASH_LINENO "$BASH_COMMAND" "${FUNCNAME[@]}" "${FUNCTION}"' ERR SIGINT INT TERM EXIT + + + +########################################################################################## +#### START HERE ########################################################################## +########################################################################################## + +######################################################### commandline parameter evaluation +while test $# -gt 0; do + case "$1" in + (--help|-h) less <
\2
\1\2\4\5
\1\2\4
\1\2\4
\3