From a4e1f41de249a24f3a3607b3ed5d5f02c094e8b5 Mon Sep 17 00:00:00 2001 From: tpearson Date: Sat, 9 Jan 2010 10:18:22 +0000 Subject: [PATCH] Added adept (KDE3 version abandoned by original author) git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/adept@1072021 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- Makefile.am | 12 + Makefile.am.in | 11 + acinclude.m4 | 12420 ++++++++++++++ aclocal.m4 | 13333 ++++++++++++++++ adept/COPYING | 29 + adept/Makefile.am | 1 + adept/NEWS | 2 + adept/TODO | 33 + adept/adept/Makefile.am | 35 + adept/adept/acqprogress.cpp | 295 + adept/adept/acqprogress.h | 127 + adept/adept/acqprogresswidget.cpp | 53 + adept/adept/acqprogresswidget.h | 30 + adept/adept/acqprogresswidgetui.ui | 79 + adept/adept/actor.h | 43 + adept/adept/application.cpp | 350 + adept/adept/application.h | 102 + adept/adept/changelog.cpp | 145 + adept/adept/changelog.h | 45 + adept/adept/commitprogress.cpp | 117 + adept/adept/commitprogress.h | 41 + adept/adept/commitprogressui.ui | 197 + adept/adept/desktopentryui.ui | 116 + adept/adept/desktoplist.cpp | 194 + adept/adept/desktoplist.h | 117 + adept/adept/dpkgpm-gui.cpp | 258 + adept/adept/dpkgpm-gui.h | 68 + adept/adept/dpkgpm.cpp | 462 + adept/adept/dpkgpm.h | 49 + adept/adept/easytagfilter.cpp | 81 + adept/adept/easytagfilter.h | 93 + adept/adept/easytagfilterui.ui | 201 + adept/adept/extendablelist.cpp | 339 + adept/adept/extendablelist.h | 166 + adept/adept/filterlist.cpp | 232 + adept/adept/filterlist.h | 149 + adept/adept/filtersidebar.cpp | 72 + adept/adept/filtersidebar.h | 26 + adept/adept/filtersidebarui.ui | 119 + adept/adept/filterwidget.cpp | 36 + adept/adept/filterwidget.h | 39 + adept/adept/groupeddesktopselector.cpp | 137 + adept/adept/groupeddesktopselector.h | 39 + adept/adept/installerview.cpp | 112 + adept/adept/installerview.h | 33 + adept/adept/installerviewui.ui | 203 + adept/adept/lister.cpp | 818 + adept/adept/lister.h | 261 + adept/adept/listerextenderui.ui | 309 + adept/adept/listerpredicate.h | 14 + adept/adept/packagedetails.cpp | 273 + adept/adept/packagedetails.h | 58 + adept/adept/packagedetailsui.ui | 506 + adept/adept/packageinfo.cpp | 181 + adept/adept/packageinfo.h | 49 + adept/adept/packageinfoui.ui | 180 + adept/adept/progress.cpp | 58 + adept/adept/progress.h | 30 + adept/adept/quickfilter.cpp | 79 + adept/adept/quickfilter.h | 119 + adept/adept/quickfilterui.ui | 130 + adept/adept/sourceseditor.cpp | 165 + adept/adept/sourceseditor.h | 63 + adept/adept/sourceseditorui.ui | 173 + adept/adept/statefilter.cpp | 60 + adept/adept/statefilter.h | 144 + adept/adept/statefilterui.ui | 166 + adept/adept/tagchooser.cpp | 147 + adept/adept/tagchooser.h | 83 + adept/adept/tagfilter.cpp | 67 + adept/adept/tagfilter.h | 110 + adept/adept/tagfilterui.ui | 95 + adept/adept/taglist.cpp | 138 + adept/adept/taglist.h | 72 + adept/adept/threadutils.cpp | 44 + adept/adept/utils.h | 71 + adept/adept/view.cpp | 153 + adept/adept/view.h | 66 + adept/batch/Makefile.am | 20 + adept/batch/adept_batchui.rc | 16 + adept/batch/adept_updater.desktop | 70 + adept/batch/app.cpp | 142 + adept/batch/app.h | 54 + adept/batch/main.cpp | 48 + adept/configure.in.in | 5 + adept/deb-build | 21 + adept/icons/Makefile.am | 1 + .../cr128-action-adept_notifier_warning.png | Bin 0 -> 15265 bytes adept/icons/cr16-action-adept_commit.png | Bin 0 -> 883 bytes adept/icons/cr16-action-adept_distupgrade.png | Bin 0 -> 987 bytes adept/icons/cr16-action-adept_install.png | Bin 0 -> 1088 bytes adept/icons/cr16-action-adept_keep.png | Bin 0 -> 912 bytes .../cr16-action-adept_main_indicator.png | Bin 0 -> 808 bytes adept/icons/cr16-action-adept_notifier_ok.png | Bin 0 -> 1160 bytes .../cr16-action-adept_notifier_warning.png | Bin 0 -> 905 bytes adept/icons/cr16-action-adept_preview.png | Bin 0 -> 1042 bytes adept/icons/cr16-action-adept_purge.png | Bin 0 -> 536 bytes adept/icons/cr16-action-adept_reinstall.png | Bin 0 -> 1013 bytes adept/icons/cr16-action-adept_remove.png | Bin 0 -> 625 bytes .../icons/cr16-action-adept_sourceseditor.png | Bin 0 -> 1054 bytes adept/icons/cr16-action-adept_update.png | Bin 0 -> 1135 bytes adept/icons/cr16-action-adept_upgrade.png | Bin 0 -> 906 bytes adept/icons/cr16-action-extender_closed.png | Bin 0 -> 781 bytes adept/icons/cr16-action-extender_opened.png | Bin 0 -> 808 bytes adept/icons/cr22-action-adept_commit.png | Bin 0 -> 1192 bytes adept/icons/cr22-action-adept_distupgrade.png | Bin 0 -> 1255 bytes adept/icons/cr22-action-adept_install.png | Bin 0 -> 1415 bytes adept/icons/cr22-action-adept_keep.png | Bin 0 -> 1229 bytes adept/icons/cr22-action-adept_notifier_ok.png | Bin 0 -> 1589 bytes .../cr22-action-adept_notifier_warning.png | Bin 0 -> 1367 bytes adept/icons/cr22-action-adept_preview.png | Bin 0 -> 1433 bytes adept/icons/cr22-action-adept_purge.png | Bin 0 -> 646 bytes adept/icons/cr22-action-adept_reinstall.png | Bin 0 -> 1482 bytes adept/icons/cr22-action-adept_remove.png | Bin 0 -> 743 bytes .../icons/cr22-action-adept_sourceseditor.png | Bin 0 -> 1578 bytes adept/icons/cr22-action-adept_update.png | Bin 0 -> 1684 bytes adept/icons/cr22-action-adept_upgrade.png | Bin 0 -> 1222 bytes adept/icons/cr22-action-extender_closed.png | Bin 0 -> 1003 bytes adept/icons/cr22-action-extender_opened.png | Bin 0 -> 1029 bytes adept/icons/cr32-action-adept_commit.png | Bin 0 -> 1732 bytes adept/icons/cr32-action-adept_distupgrade.png | Bin 0 -> 2037 bytes adept/icons/cr32-action-adept_install.png | Bin 0 -> 1790 bytes adept/icons/cr32-action-adept_keep.png | Bin 0 -> 1821 bytes adept/icons/cr32-action-adept_notifier_ok.png | Bin 0 -> 2473 bytes .../cr32-action-adept_notifier_warning.png | Bin 0 -> 2288 bytes adept/icons/cr32-action-adept_preview.png | Bin 0 -> 2474 bytes adept/icons/cr32-action-adept_purge.png | Bin 0 -> 784 bytes adept/icons/cr32-action-adept_reinstall.png | Bin 0 -> 2200 bytes adept/icons/cr32-action-adept_remove.png | Bin 0 -> 935 bytes .../icons/cr32-action-adept_sourceseditor.png | Bin 0 -> 2404 bytes adept/icons/cr32-action-adept_update.png | Bin 0 -> 2536 bytes adept/icons/cr32-action-adept_upgrade.png | Bin 0 -> 1849 bytes adept/icons/cr32-action-extender_closed.png | Bin 0 -> 1591 bytes adept/icons/cr32-action-extender_opened.png | Bin 0 -> 1628 bytes adept/icons/cr48-action-adept_commit.png | Bin 0 -> 2855 bytes adept/icons/cr48-action-adept_distupgrade.png | Bin 0 -> 2963 bytes adept/icons/cr48-action-adept_install.png | Bin 0 -> 2352 bytes adept/icons/cr48-action-adept_keep.png | Bin 0 -> 2687 bytes adept/icons/cr48-action-adept_notifier_ok.png | Bin 0 -> 4152 bytes .../cr48-action-adept_notifier_warning.png | Bin 0 -> 3965 bytes adept/icons/cr48-action-adept_preview.png | Bin 0 -> 4442 bytes adept/icons/cr48-action-adept_purge.png | Bin 0 -> 1094 bytes adept/icons/cr48-action-adept_reinstall.png | Bin 0 -> 3598 bytes adept/icons/cr48-action-adept_remove.png | Bin 0 -> 1164 bytes .../icons/cr48-action-adept_sourceseditor.png | Bin 0 -> 3645 bytes adept/icons/cr48-action-adept_update.png | Bin 0 -> 4229 bytes adept/icons/cr48-action-adept_upgrade.png | Bin 0 -> 2802 bytes adept/icons/cr48-action-extender_closed.png | Bin 0 -> 2535 bytes adept/icons/cr48-action-extender_opened.png | Bin 0 -> 2459 bytes .../cr64-action-adept_notifier_warning.png | Bin 0 -> 5963 bytes .../crsc-action-adept_notifier_warning.svgz | Bin 0 -> 5636 bytes adept/installer/Makefile.am | 22 + adept/installer/adept_installer.desktop | 45 + adept/installer/adept_installerui.rc | 20 + adept/installer/app.cpp | 416 + adept/installer/app.h | 128 + adept/installer/hi128-app-adept_installer.png | Bin 0 -> 14185 bytes adept/installer/hi16-app-adept_installer.png | Bin 0 -> 844 bytes adept/installer/hi22-app-adept_installer.png | Bin 0 -> 1258 bytes adept/installer/hi32-app-adept_installer.png | Bin 0 -> 2120 bytes adept/installer/hi48-app-adept_installer.png | Bin 0 -> 3713 bytes adept/installer/hi64-app-adept_installer.png | Bin 0 -> 5460 bytes adept/installer/hisc-app-adept_installer.svgz | Bin 0 -> 10539 bytes adept/installer/main.cpp | 51 + adept/kubuntu_upgrader/Makefile.am | 11 + adept/kubuntu_upgrader/errordialog.cpp | 48 + adept/kubuntu_upgrader/errordialog.h | 51 + adept/kubuntu_upgrader/errordialogbase.ui | 67 + adept/kubuntu_upgrader/upgradewizard.cpp | 545 + adept/kubuntu_upgrader/upgradewizard.h | 96 + adept/kubuntu_upgrader/upgradewizardbase.ui | 143 + adept/libadept/Makefile.am | 33 + adept/libadept/acqprogress.cpp | 295 + adept/libadept/acqprogress.h | 127 + adept/libadept/acqprogresswidget.cpp | 53 + adept/libadept/acqprogresswidget.h | 30 + adept/libadept/acqprogresswidgetui.ui | 79 + adept/libadept/actor.h | 43 + adept/libadept/application.cpp | 197 + adept/libadept/application.h | 75 + adept/libadept/commitprogress.cpp | 115 + adept/libadept/commitprogress.h | 41 + adept/libadept/commitprogressui.ui | 197 + adept/libadept/desktopentryui.ui | 116 + adept/libadept/desktoplist.cpp | 194 + adept/libadept/desktoplist.h | 117 + adept/libadept/dpkgpm-gui.cpp | 258 + adept/libadept/dpkgpm-gui.h | 68 + adept/libadept/dpkgpm.cpp | 451 + adept/libadept/dpkgpm.h | 49 + adept/libadept/easytagfilter.cpp | 82 + adept/libadept/easytagfilter.h | 93 + adept/libadept/easytagfilterui.ui | 201 + adept/libadept/extendablelist.cpp | 332 + adept/libadept/extendablelist.h | 165 + adept/libadept/filterlist.cpp | 231 + adept/libadept/filterlist.h | 149 + adept/libadept/filtersidebar.cpp | 71 + adept/libadept/filtersidebar.h | 26 + adept/libadept/filtersidebarui.ui | 119 + adept/libadept/filterwidget.cpp | 36 + adept/libadept/filterwidget.h | 39 + adept/libadept/groupeddesktopselector.cpp | 137 + adept/libadept/groupeddesktopselector.h | 39 + adept/libadept/installerview.cpp | 88 + adept/libadept/installerview.h | 33 + adept/libadept/installerviewui.ui | 194 + adept/libadept/lister.cpp | 707 + adept/libadept/lister.h | 220 + adept/libadept/listerextenderui.ui | 310 + adept/libadept/listerpredicate.h | 14 + adept/libadept/packagedetails.cpp | 253 + adept/libadept/packagedetails.h | 55 + adept/libadept/packagedetailsui.ui | 464 + adept/libadept/packageinfo.cpp | 181 + adept/libadept/packageinfo.h | 49 + adept/libadept/packageinfoui.ui | 180 + adept/libadept/progress.cpp | 58 + adept/libadept/progress.h | 30 + adept/libadept/quickfilter.cpp | 79 + adept/libadept/quickfilter.h | 119 + adept/libadept/quickfilterui.ui | 130 + adept/libadept/sourceseditor.cpp | 165 + adept/libadept/sourceseditor.h | 63 + adept/libadept/sourceseditorui.ui | 173 + adept/libadept/statefilter.cpp | 60 + adept/libadept/statefilter.h | 144 + adept/libadept/statefilterui.ui | 166 + adept/libadept/tagchooser.cpp | 144 + adept/libadept/tagchooser.h | 82 + adept/libadept/tagfilter.cpp | 67 + adept/libadept/tagfilter.h | 113 + adept/libadept/tagfilterui.ui | 95 + adept/libadept/taglist.cpp | 134 + adept/libadept/taglist.h | 75 + adept/libadept/threadutils.cpp | 44 + adept/libadept/utils.h | 71 + adept/libadept/view.cpp | 153 + adept/libadept/view.h | 66 + adept/manager/Makefile.am | 20 + adept/manager/adept_manager.desktop | 43 + adept/manager/adept_managerui.rc | 38 + adept/manager/app.cpp | 450 + adept/manager/app.h | 162 + adept/manager/hi128-app-adept_manager.png | Bin 0 -> 26416 bytes adept/manager/hi16-app-adept_manager.png | Bin 0 -> 1482 bytes adept/manager/hi22-app-adept_manager.png | Bin 0 -> 2346 bytes adept/manager/hi32-app-adept_manager.png | Bin 0 -> 3909 bytes adept/manager/hi48-app-adept_manager.png | Bin 0 -> 6820 bytes adept/manager/hi64-app-adept_manager.png | Bin 0 -> 10284 bytes adept/manager/hisc-app-adept_manager.svgz | Bin 0 -> 3643 bytes adept/manager/main.cpp | 71 + adept/notifier/15adept-periodic-update | 3 + adept/notifier/Makefile.am | 26 + adept/notifier/adept_notifier.desktop | 63 + adept/notifier/adept_notifier_auto.desktop | 23 + adept/notifier/app.cpp | 342 + adept/notifier/app.h | 93 + adept/tests/libcapture/celem-test.cpp | 34 + adept/tests/libcapture/grouper-test.cpp | 44 + adept/tests/libcapture/pkgcache-test.cpp | 71 + adept/tests/libcapture/stl_util-test.cpp | 56 + adept/tests/libcapture/tree-test.cpp | 86 + adept/tests/tut-main.cpp | 61 + adept/tests/tut.h | 872 + adept/tests/tut_reporter.h | 182 + adept/updater/Makefile.am | 21 + adept/updater/adept_updater.desktop | 69 + adept/updater/adept_updaterui.rc | 16 + adept/updater/app.cpp | 275 + adept/updater/app.h | 105 + adept/updater/hi128-app-adept_updater.png | Bin 0 -> 27523 bytes adept/updater/hi16-app-adept_updater.png | Bin 0 -> 1509 bytes adept/updater/hi22-app-adept_updater.png | Bin 0 -> 2357 bytes adept/updater/hi32-app-adept_updater.png | Bin 0 -> 4053 bytes adept/updater/hi48-app-adept_updater.png | Bin 0 -> 7011 bytes adept/updater/hi64-app-adept_updater.png | Bin 0 -> 10508 bytes adept/updater/hisc-app-adept_updater.svgz | Bin 0 -> 4601 bytes adept/updater/main.cpp | 56 + config.h.in | 394 + configure.files | 3 + configure.in | 160 + configure.in.in | 27 + subdirs | 1 + 284 files changed, 50847 insertions(+) create mode 100644 Makefile.am create mode 100644 Makefile.am.in create mode 100644 acinclude.m4 create mode 100644 aclocal.m4 create mode 100644 adept/COPYING create mode 100644 adept/Makefile.am create mode 100644 adept/NEWS create mode 100644 adept/TODO create mode 100644 adept/adept/Makefile.am create mode 100644 adept/adept/acqprogress.cpp create mode 100644 adept/adept/acqprogress.h create mode 100644 adept/adept/acqprogresswidget.cpp create mode 100644 adept/adept/acqprogresswidget.h create mode 100644 adept/adept/acqprogresswidgetui.ui create mode 100644 adept/adept/actor.h create mode 100644 adept/adept/application.cpp create mode 100644 adept/adept/application.h create mode 100644 adept/adept/changelog.cpp create mode 100644 adept/adept/changelog.h create mode 100644 adept/adept/commitprogress.cpp create mode 100644 adept/adept/commitprogress.h create mode 100644 adept/adept/commitprogressui.ui create mode 100644 adept/adept/desktopentryui.ui create mode 100644 adept/adept/desktoplist.cpp create mode 100644 adept/adept/desktoplist.h create mode 100644 adept/adept/dpkgpm-gui.cpp create mode 100644 adept/adept/dpkgpm-gui.h create mode 100644 adept/adept/dpkgpm.cpp create mode 100644 adept/adept/dpkgpm.h create mode 100644 adept/adept/easytagfilter.cpp create mode 100644 adept/adept/easytagfilter.h create mode 100644 adept/adept/easytagfilterui.ui create mode 100644 adept/adept/extendablelist.cpp create mode 100644 adept/adept/extendablelist.h create mode 100644 adept/adept/filterlist.cpp create mode 100644 adept/adept/filterlist.h create mode 100644 adept/adept/filtersidebar.cpp create mode 100644 adept/adept/filtersidebar.h create mode 100644 adept/adept/filtersidebarui.ui create mode 100644 adept/adept/filterwidget.cpp create mode 100644 adept/adept/filterwidget.h create mode 100644 adept/adept/groupeddesktopselector.cpp create mode 100644 adept/adept/groupeddesktopselector.h create mode 100644 adept/adept/installerview.cpp create mode 100644 adept/adept/installerview.h create mode 100644 adept/adept/installerviewui.ui create mode 100644 adept/adept/lister.cpp create mode 100644 adept/adept/lister.h create mode 100644 adept/adept/listerextenderui.ui create mode 100644 adept/adept/listerpredicate.h create mode 100644 adept/adept/packagedetails.cpp create mode 100644 adept/adept/packagedetails.h create mode 100644 adept/adept/packagedetailsui.ui create mode 100644 adept/adept/packageinfo.cpp create mode 100644 adept/adept/packageinfo.h create mode 100644 adept/adept/packageinfoui.ui create mode 100644 adept/adept/progress.cpp create mode 100644 adept/adept/progress.h create mode 100644 adept/adept/quickfilter.cpp create mode 100644 adept/adept/quickfilter.h create mode 100644 adept/adept/quickfilterui.ui create mode 100644 adept/adept/sourceseditor.cpp create mode 100644 adept/adept/sourceseditor.h create mode 100644 adept/adept/sourceseditorui.ui create mode 100644 adept/adept/statefilter.cpp create mode 100644 adept/adept/statefilter.h create mode 100644 adept/adept/statefilterui.ui create mode 100644 adept/adept/tagchooser.cpp create mode 100644 adept/adept/tagchooser.h create mode 100644 adept/adept/tagfilter.cpp create mode 100644 adept/adept/tagfilter.h create mode 100644 adept/adept/tagfilterui.ui create mode 100644 adept/adept/taglist.cpp create mode 100644 adept/adept/taglist.h create mode 100644 adept/adept/threadutils.cpp create mode 100644 adept/adept/utils.h create mode 100644 adept/adept/view.cpp create mode 100644 adept/adept/view.h create mode 100644 adept/batch/Makefile.am create mode 100644 adept/batch/adept_batchui.rc create mode 100644 adept/batch/adept_updater.desktop create mode 100644 adept/batch/app.cpp create mode 100644 adept/batch/app.h create mode 100644 adept/batch/main.cpp create mode 100644 adept/configure.in.in create mode 100755 adept/deb-build create mode 100644 adept/icons/Makefile.am create mode 100644 adept/icons/cr128-action-adept_notifier_warning.png create mode 100644 adept/icons/cr16-action-adept_commit.png create mode 100644 adept/icons/cr16-action-adept_distupgrade.png create mode 100644 adept/icons/cr16-action-adept_install.png create mode 100644 adept/icons/cr16-action-adept_keep.png create mode 100644 adept/icons/cr16-action-adept_main_indicator.png create mode 100644 adept/icons/cr16-action-adept_notifier_ok.png create mode 100644 adept/icons/cr16-action-adept_notifier_warning.png create mode 100644 adept/icons/cr16-action-adept_preview.png create mode 100644 adept/icons/cr16-action-adept_purge.png create mode 100644 adept/icons/cr16-action-adept_reinstall.png create mode 100644 adept/icons/cr16-action-adept_remove.png create mode 100644 adept/icons/cr16-action-adept_sourceseditor.png create mode 100644 adept/icons/cr16-action-adept_update.png create mode 100644 adept/icons/cr16-action-adept_upgrade.png create mode 100644 adept/icons/cr16-action-extender_closed.png create mode 100644 adept/icons/cr16-action-extender_opened.png create mode 100644 adept/icons/cr22-action-adept_commit.png create mode 100644 adept/icons/cr22-action-adept_distupgrade.png create mode 100644 adept/icons/cr22-action-adept_install.png create mode 100644 adept/icons/cr22-action-adept_keep.png create mode 100644 adept/icons/cr22-action-adept_notifier_ok.png create mode 100644 adept/icons/cr22-action-adept_notifier_warning.png create mode 100644 adept/icons/cr22-action-adept_preview.png create mode 100644 adept/icons/cr22-action-adept_purge.png create mode 100644 adept/icons/cr22-action-adept_reinstall.png create mode 100644 adept/icons/cr22-action-adept_remove.png create mode 100644 adept/icons/cr22-action-adept_sourceseditor.png create mode 100644 adept/icons/cr22-action-adept_update.png create mode 100644 adept/icons/cr22-action-adept_upgrade.png create mode 100644 adept/icons/cr22-action-extender_closed.png create mode 100644 adept/icons/cr22-action-extender_opened.png create mode 100644 adept/icons/cr32-action-adept_commit.png create mode 100644 adept/icons/cr32-action-adept_distupgrade.png create mode 100644 adept/icons/cr32-action-adept_install.png create mode 100644 adept/icons/cr32-action-adept_keep.png create mode 100644 adept/icons/cr32-action-adept_notifier_ok.png create mode 100644 adept/icons/cr32-action-adept_notifier_warning.png create mode 100644 adept/icons/cr32-action-adept_preview.png create mode 100644 adept/icons/cr32-action-adept_purge.png create mode 100644 adept/icons/cr32-action-adept_reinstall.png create mode 100644 adept/icons/cr32-action-adept_remove.png create mode 100644 adept/icons/cr32-action-adept_sourceseditor.png create mode 100644 adept/icons/cr32-action-adept_update.png create mode 100644 adept/icons/cr32-action-adept_upgrade.png create mode 100644 adept/icons/cr32-action-extender_closed.png create mode 100644 adept/icons/cr32-action-extender_opened.png create mode 100644 adept/icons/cr48-action-adept_commit.png create mode 100644 adept/icons/cr48-action-adept_distupgrade.png create mode 100644 adept/icons/cr48-action-adept_install.png create mode 100644 adept/icons/cr48-action-adept_keep.png create mode 100644 adept/icons/cr48-action-adept_notifier_ok.png create mode 100644 adept/icons/cr48-action-adept_notifier_warning.png create mode 100644 adept/icons/cr48-action-adept_preview.png create mode 100644 adept/icons/cr48-action-adept_purge.png create mode 100644 adept/icons/cr48-action-adept_reinstall.png create mode 100644 adept/icons/cr48-action-adept_remove.png create mode 100644 adept/icons/cr48-action-adept_sourceseditor.png create mode 100644 adept/icons/cr48-action-adept_update.png create mode 100644 adept/icons/cr48-action-adept_upgrade.png create mode 100644 adept/icons/cr48-action-extender_closed.png create mode 100644 adept/icons/cr48-action-extender_opened.png create mode 100644 adept/icons/cr64-action-adept_notifier_warning.png create mode 100644 adept/icons/crsc-action-adept_notifier_warning.svgz create mode 100644 adept/installer/Makefile.am create mode 100644 adept/installer/adept_installer.desktop create mode 100644 adept/installer/adept_installerui.rc create mode 100644 adept/installer/app.cpp create mode 100644 adept/installer/app.h create mode 100644 adept/installer/hi128-app-adept_installer.png create mode 100644 adept/installer/hi16-app-adept_installer.png create mode 100644 adept/installer/hi22-app-adept_installer.png create mode 100644 adept/installer/hi32-app-adept_installer.png create mode 100644 adept/installer/hi48-app-adept_installer.png create mode 100644 adept/installer/hi64-app-adept_installer.png create mode 100644 adept/installer/hisc-app-adept_installer.svgz create mode 100644 adept/installer/main.cpp create mode 100644 adept/kubuntu_upgrader/Makefile.am create mode 100644 adept/kubuntu_upgrader/errordialog.cpp create mode 100644 adept/kubuntu_upgrader/errordialog.h create mode 100644 adept/kubuntu_upgrader/errordialogbase.ui create mode 100644 adept/kubuntu_upgrader/upgradewizard.cpp create mode 100644 adept/kubuntu_upgrader/upgradewizard.h create mode 100644 adept/kubuntu_upgrader/upgradewizardbase.ui create mode 100644 adept/libadept/Makefile.am create mode 100644 adept/libadept/acqprogress.cpp create mode 100644 adept/libadept/acqprogress.h create mode 100644 adept/libadept/acqprogresswidget.cpp create mode 100644 adept/libadept/acqprogresswidget.h create mode 100644 adept/libadept/acqprogresswidgetui.ui create mode 100644 adept/libadept/actor.h create mode 100644 adept/libadept/application.cpp create mode 100644 adept/libadept/application.h create mode 100644 adept/libadept/commitprogress.cpp create mode 100644 adept/libadept/commitprogress.h create mode 100644 adept/libadept/commitprogressui.ui create mode 100644 adept/libadept/desktopentryui.ui create mode 100644 adept/libadept/desktoplist.cpp create mode 100644 adept/libadept/desktoplist.h create mode 100644 adept/libadept/dpkgpm-gui.cpp create mode 100644 adept/libadept/dpkgpm-gui.h create mode 100644 adept/libadept/dpkgpm.cpp create mode 100644 adept/libadept/dpkgpm.h create mode 100644 adept/libadept/easytagfilter.cpp create mode 100644 adept/libadept/easytagfilter.h create mode 100644 adept/libadept/easytagfilterui.ui create mode 100644 adept/libadept/extendablelist.cpp create mode 100644 adept/libadept/extendablelist.h create mode 100644 adept/libadept/filterlist.cpp create mode 100644 adept/libadept/filterlist.h create mode 100644 adept/libadept/filtersidebar.cpp create mode 100644 adept/libadept/filtersidebar.h create mode 100644 adept/libadept/filtersidebarui.ui create mode 100644 adept/libadept/filterwidget.cpp create mode 100644 adept/libadept/filterwidget.h create mode 100644 adept/libadept/groupeddesktopselector.cpp create mode 100644 adept/libadept/groupeddesktopselector.h create mode 100644 adept/libadept/installerview.cpp create mode 100644 adept/libadept/installerview.h create mode 100644 adept/libadept/installerviewui.ui create mode 100644 adept/libadept/lister.cpp create mode 100644 adept/libadept/lister.h create mode 100644 adept/libadept/listerextenderui.ui create mode 100644 adept/libadept/listerpredicate.h create mode 100644 adept/libadept/packagedetails.cpp create mode 100644 adept/libadept/packagedetails.h create mode 100644 adept/libadept/packagedetailsui.ui create mode 100644 adept/libadept/packageinfo.cpp create mode 100644 adept/libadept/packageinfo.h create mode 100644 adept/libadept/packageinfoui.ui create mode 100644 adept/libadept/progress.cpp create mode 100644 adept/libadept/progress.h create mode 100644 adept/libadept/quickfilter.cpp create mode 100644 adept/libadept/quickfilter.h create mode 100644 adept/libadept/quickfilterui.ui create mode 100644 adept/libadept/sourceseditor.cpp create mode 100644 adept/libadept/sourceseditor.h create mode 100644 adept/libadept/sourceseditorui.ui create mode 100644 adept/libadept/statefilter.cpp create mode 100644 adept/libadept/statefilter.h create mode 100644 adept/libadept/statefilterui.ui create mode 100644 adept/libadept/tagchooser.cpp create mode 100644 adept/libadept/tagchooser.h create mode 100644 adept/libadept/tagfilter.cpp create mode 100644 adept/libadept/tagfilter.h create mode 100644 adept/libadept/tagfilterui.ui create mode 100644 adept/libadept/taglist.cpp create mode 100644 adept/libadept/taglist.h create mode 100644 adept/libadept/threadutils.cpp create mode 100644 adept/libadept/utils.h create mode 100644 adept/libadept/view.cpp create mode 100644 adept/libadept/view.h create mode 100644 adept/manager/Makefile.am create mode 100644 adept/manager/adept_manager.desktop create mode 100644 adept/manager/adept_managerui.rc create mode 100644 adept/manager/app.cpp create mode 100644 adept/manager/app.h create mode 100644 adept/manager/hi128-app-adept_manager.png create mode 100644 adept/manager/hi16-app-adept_manager.png create mode 100644 adept/manager/hi22-app-adept_manager.png create mode 100644 adept/manager/hi32-app-adept_manager.png create mode 100644 adept/manager/hi48-app-adept_manager.png create mode 100644 adept/manager/hi64-app-adept_manager.png create mode 100644 adept/manager/hisc-app-adept_manager.svgz create mode 100644 adept/manager/main.cpp create mode 100644 adept/notifier/15adept-periodic-update create mode 100644 adept/notifier/Makefile.am create mode 100644 adept/notifier/adept_notifier.desktop create mode 100644 adept/notifier/adept_notifier_auto.desktop create mode 100644 adept/notifier/app.cpp create mode 100644 adept/notifier/app.h create mode 100644 adept/tests/libcapture/celem-test.cpp create mode 100644 adept/tests/libcapture/grouper-test.cpp create mode 100644 adept/tests/libcapture/pkgcache-test.cpp create mode 100644 adept/tests/libcapture/stl_util-test.cpp create mode 100644 adept/tests/libcapture/tree-test.cpp create mode 100644 adept/tests/tut-main.cpp create mode 100644 adept/tests/tut.h create mode 100644 adept/tests/tut_reporter.h create mode 100644 adept/updater/Makefile.am create mode 100644 adept/updater/adept_updater.desktop create mode 100644 adept/updater/adept_updaterui.rc create mode 100644 adept/updater/app.cpp create mode 100644 adept/updater/app.h create mode 100644 adept/updater/hi128-app-adept_updater.png create mode 100644 adept/updater/hi16-app-adept_updater.png create mode 100644 adept/updater/hi22-app-adept_updater.png create mode 100644 adept/updater/hi32-app-adept_updater.png create mode 100644 adept/updater/hi48-app-adept_updater.png create mode 100644 adept/updater/hi64-app-adept_updater.png create mode 100644 adept/updater/hisc-app-adept_updater.svgz create mode 100644 adept/updater/main.cpp create mode 100644 config.h.in create mode 100644 configure.files create mode 100644 configure.in create mode 100644 configure.in.in create mode 100644 subdirs diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..d7d453a --- /dev/null +++ b/Makefile.am @@ -0,0 +1,12 @@ +## kdebase/Makefile.am +## (C) 1997 Stephan Kulow + +AUTOMAKE_OPTIONS = foreign 1.5 + +dist-hook: + cd $(top_distdir) && perl $(top_srcdir)/admin/am_edit -padmin + +include admin/Doxyfile.am +include admin/deps.am + +SUBDIRS=$(TOPSUBDIRS) diff --git a/Makefile.am.in b/Makefile.am.in new file mode 100644 index 0000000..2e81927 --- /dev/null +++ b/Makefile.am.in @@ -0,0 +1,11 @@ +## kdebase/Makefile.am +## (C) 1997 Stephan Kulow + +AUTOMAKE_OPTIONS = foreign 1.5 + +dist-hook: + cd $(top_distdir) && perl $(top_srcdir)/admin/am_edit -padmin + +include admin/Doxyfile.am +include admin/deps.am + diff --git a/acinclude.m4 b/acinclude.m4 new file mode 100644 index 0000000..9173caa --- /dev/null +++ b/acinclude.m4 @@ -0,0 +1,12420 @@ +## -*- autoconf -*- + +dnl This file is part of the KDE libraries/packages +dnl Copyright (C) 1997 Janos Farkas (chexum@shadow.banki.hu) +dnl (C) 1997,98,99 Stephan Kulow (coolo@kde.org) + +dnl This file is free software; you can redistribute it and/or +dnl modify it under the terms of the GNU Library General Public +dnl License as published by the Free Software Foundation; either +dnl version 2 of the License, or (at your option) any later version. + +dnl This library is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl Library General Public License for more details. + +dnl You should have received a copy of the GNU Library General Public License +dnl along with this library; see the file COPYING.LIB. If not, write to +dnl the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +dnl Boston, MA 02110-1301, USA. + +dnl IMPORTANT NOTE: +dnl Please do not modify this file unless you expect your modifications to be +dnl carried into every other module in the repository. +dnl +dnl Single-module modifications are best placed in configure.in for kdelibs +dnl and kdebase or configure.in.in if present. + +# KDE_PATH_X_DIRECT +dnl Internal subroutine of AC_PATH_X. +dnl Set ac_x_includes and/or ac_x_libraries. +AC_DEFUN([KDE_PATH_X_DIRECT], +[ +AC_REQUIRE([KDE_CHECK_LIB64]) + +if test "$ac_x_includes" = NO; then + # Guess where to find include files, by looking for this one X11 .h file. + test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h + + # First, try using that file with no special directory specified. +AC_TRY_CPP([#include <$x_direct_test_include>], +[# We can compile using X headers with no special include directory. +ac_x_includes=], +[# Look for the header file in a standard set of common directories. +# Check X11 before X11Rn because it is often a symlink to the current release. + for ac_dir in \ + /usr/X11/include \ + /usr/X11R6/include \ + /usr/X11R5/include \ + /usr/X11R4/include \ + \ + /usr/include/X11 \ + /usr/include/X11R6 \ + /usr/include/X11R5 \ + /usr/include/X11R4 \ + \ + /usr/local/X11/include \ + /usr/local/X11R6/include \ + /usr/local/X11R5/include \ + /usr/local/X11R4/include \ + \ + /usr/local/include/X11 \ + /usr/local/include/X11R6 \ + /usr/local/include/X11R5 \ + /usr/local/include/X11R4 \ + \ + /usr/X386/include \ + /usr/x386/include \ + /usr/XFree86/include/X11 \ + \ + /usr/include \ + /usr/local/include \ + /usr/unsupported/include \ + /usr/athena/include \ + /usr/local/x11r5/include \ + /usr/lpp/Xamples/include \ + \ + /usr/openwin/include \ + /usr/openwin/share/include \ + ; \ + do + if test -r "$ac_dir/$x_direct_test_include"; then + ac_x_includes=$ac_dir + break + fi + done]) +fi # $ac_x_includes = NO + +if test "$ac_x_libraries" = NO; then + # Check for the libraries. + + test -z "$x_direct_test_library" && x_direct_test_library=Xt + test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc + + # See if we find them without any special options. + # Don't add to $LIBS permanently. + ac_save_LIBS="$LIBS" + LIBS="-l$x_direct_test_library $LIBS" +AC_TRY_LINK([#include ], [${x_direct_test_function}(1)], +[LIBS="$ac_save_LIBS" +# We can link X programs with no special library path. +ac_x_libraries=], +[LIBS="$ac_save_LIBS" +# First see if replacing the include by lib works. +# Check X11 before X11Rn because it is often a symlink to the current release. +for ac_dir in `echo "$ac_x_includes" | sed s/include/lib${kdelibsuff}/` \ + /usr/X11/lib${kdelibsuff} \ + /usr/X11R6/lib${kdelibsuff} \ + /usr/X11R5/lib${kdelibsuff} \ + /usr/X11R4/lib${kdelibsuff} \ + \ + /usr/lib${kdelibsuff}/X11 \ + /usr/lib${kdelibsuff}/X11R6 \ + /usr/lib${kdelibsuff}/X11R5 \ + /usr/lib${kdelibsuff}/X11R4 \ + \ + /usr/local/X11/lib${kdelibsuff} \ + /usr/local/X11R6/lib${kdelibsuff} \ + /usr/local/X11R5/lib${kdelibsuff} \ + /usr/local/X11R4/lib${kdelibsuff} \ + \ + /usr/local/lib${kdelibsuff}/X11 \ + /usr/local/lib${kdelibsuff}/X11R6 \ + /usr/local/lib${kdelibsuff}/X11R5 \ + /usr/local/lib${kdelibsuff}/X11R4 \ + \ + /usr/X386/lib${kdelibsuff} \ + /usr/x386/lib${kdelibsuff} \ + /usr/XFree86/lib${kdelibsuff}/X11 \ + \ + /usr/lib${kdelibsuff} \ + /usr/local/lib${kdelibsuff} \ + /usr/unsupported/lib${kdelibsuff} \ + /usr/athena/lib${kdelibsuff} \ + /usr/local/x11r5/lib${kdelibsuff} \ + /usr/lpp/Xamples/lib${kdelibsuff} \ + /lib/usr/lib${kdelibsuff}/X11 \ + \ + /usr/openwin/lib${kdelibsuff} \ + /usr/openwin/share/lib${kdelibsuff} \ + ; \ +do +dnl Don't even attempt the hair of trying to link an X program! + for ac_extension in a so sl; do + if test -r $ac_dir/lib${x_direct_test_library}.$ac_extension; then + ac_x_libraries=$ac_dir + break 2 + fi + done +done]) +fi # $ac_x_libraries = NO +]) + + +dnl ------------------------------------------------------------------------ +dnl Find a file (or one of more files in a list of dirs) +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([AC_FIND_FILE], +[ +$3=NO +for i in $2; +do + for j in $1; + do + echo "configure: __oline__: $i/$j" >&AC_FD_CC + if test -r "$i/$j"; then + echo "taking that" >&AC_FD_CC + $3=$i + break 2 + fi + done +done +]) + +dnl KDE_FIND_PATH(program-name, variable-name, list-of-dirs, +dnl if-not-found, test-parameter, prepend-path) +dnl +dnl Look for program-name in list-of-dirs+$PATH. +dnl If prepend-path is set, look in $PATH+list-of-dirs instead. +dnl If found, $variable-name is set. If not, if-not-found is evaluated. +dnl test-parameter: if set, the program is executed with this arg, +dnl and only a successful exit code is required. +AC_DEFUN([KDE_FIND_PATH], +[ + AC_MSG_CHECKING([for $1]) + if test -n "$$2"; then + kde_cv_path="$$2"; + else + kde_cache=`echo $1 | sed 'y%./+-%__p_%'` + + AC_CACHE_VAL(kde_cv_path_$kde_cache, + [ + kde_cv_path="NONE" + kde_save_IFS=$IFS + IFS=':' + dirs="" + for dir in $PATH; do + dirs="$dirs $dir" + done + if test -z "$6"; then dnl Append dirs in PATH (default) + dirs="$3 $dirs" + else dnl Prepend dirs in PATH (if 6th arg is set) + dirs="$dirs $3" + fi + IFS=$kde_save_IFS + + for dir in $dirs; do + if test -x "$dir/$1"; then + if test -n "$5" + then + evalstr="$dir/$1 $5 2>&1 " + if eval $evalstr; then + kde_cv_path="$dir/$1" + break + fi + else + kde_cv_path="$dir/$1" + break + fi + fi + done + + eval "kde_cv_path_$kde_cache=$kde_cv_path" + + ]) + + eval "kde_cv_path=\"`echo '$kde_cv_path_'$kde_cache`\"" + + fi + + if test -z "$kde_cv_path" || test "$kde_cv_path" = NONE; then + AC_MSG_RESULT(not found) + $4 + else + AC_MSG_RESULT($kde_cv_path) + $2=$kde_cv_path + + fi +]) + +AC_DEFUN([KDE_MOC_ERROR_MESSAGE], +[ + AC_MSG_ERROR([No Qt meta object compiler (moc) found! +Please check whether you installed Qt correctly. +You need to have a running moc binary. +configure tried to run $ac_cv_path_moc and the test didn't +succeed. If configure shouldn't have tried this one, set +the environment variable MOC to the right one before running +configure. +]) +]) + +AC_DEFUN([KDE_UIC_ERROR_MESSAGE], +[ + AC_MSG_WARN([No Qt ui compiler (uic) found! +Please check whether you installed Qt correctly. +You need to have a running uic binary. +configure tried to run $ac_cv_path_uic and the test didn't +succeed. If configure shouldn't have tried this one, set +the environment variable UIC to the right one before running +configure. +]) +]) + + +AC_DEFUN([KDE_CHECK_UIC_FLAG], +[ + AC_MSG_CHECKING([whether uic supports -$1 ]) + kde_cache=`echo $1 | sed 'y% .=/+-%____p_%'` + AC_CACHE_VAL(kde_cv_prog_uic_$kde_cache, + [ + cat >conftest.ui < +EOT + ac_uic_testrun="$UIC_PATH -$1 $2 conftest.ui >/dev/null" + if AC_TRY_EVAL(ac_uic_testrun); then + eval "kde_cv_prog_uic_$kde_cache=yes" + else + eval "kde_cv_prog_uic_$kde_cache=no" + fi + rm -f conftest* + ]) + + if eval "test \"`echo '$kde_cv_prog_uic_'$kde_cache`\" = yes"; then + AC_MSG_RESULT([yes]) + : + $3 + else + AC_MSG_RESULT([no]) + : + $4 + fi +]) + + +dnl ------------------------------------------------------------------------ +dnl Find the meta object compiler and the ui compiler in the PATH, +dnl in $QTDIR/bin, and some more usual places +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([AC_PATH_QT_MOC_UIC], +[ + AC_REQUIRE([KDE_CHECK_PERL]) + qt_bindirs="" + for dir in $kde_qt_dirs; do + qt_bindirs="$qt_bindirs $dir/bin $dir/src/moc" + done + qt_bindirs="$qt_bindirs /usr/bin /usr/X11R6/bin /usr/local/qt/bin" + if test ! "$ac_qt_bindir" = "NO"; then + qt_bindirs="$ac_qt_bindir $qt_bindirs" + fi + + KDE_FIND_PATH(moc, MOC, [$qt_bindirs], [KDE_MOC_ERROR_MESSAGE]) + if test -z "$UIC_NOT_NEEDED"; then + KDE_FIND_PATH(uic, UIC_PATH, [$qt_bindirs], [UIC_PATH=""]) + if test -z "$UIC_PATH" ; then + KDE_UIC_ERROR_MESSAGE + exit 1 + else + UIC=$UIC_PATH + + if test $kde_qtver = 3; then + KDE_CHECK_UIC_FLAG(L,[/nonexistent],ac_uic_supports_libpath=yes,ac_uic_supports_libpath=no) + KDE_CHECK_UIC_FLAG(nounload,,ac_uic_supports_nounload=yes,ac_uic_supports_nounload=no) + + if test x$ac_uic_supports_libpath = xyes; then + UIC="$UIC -L \$(kde_widgetdir)" + fi + if test x$ac_uic_supports_nounload = xyes; then + UIC="$UIC -nounload" + fi + fi + fi + else + UIC="echo uic not available: " + fi + + AC_SUBST(MOC) + AC_SUBST(UIC) + + UIC_TR="i18n" + if test $kde_qtver = 3; then + UIC_TR="tr2i18n" + fi + + AC_SUBST(UIC_TR) +]) + +AC_DEFUN([KDE_1_CHECK_PATHS], +[ + KDE_1_CHECK_PATH_HEADERS + + KDE_TEST_RPATH= + + if test -n "$USE_RPATH"; then + + if test -n "$kde_libraries"; then + KDE_TEST_RPATH="-R $kde_libraries" + fi + + if test -n "$qt_libraries"; then + KDE_TEST_RPATH="$KDE_TEST_RPATH -R $qt_libraries" + fi + + if test -n "$x_libraries"; then + KDE_TEST_RPATH="$KDE_TEST_RPATH -R $x_libraries" + fi + + KDE_TEST_RPATH="$KDE_TEST_RPATH $KDE_EXTRA_RPATH" + fi + +AC_MSG_CHECKING([for KDE libraries installed]) +ac_link='$LIBTOOL_SHELL --silent --mode=link ${CXX-g++} -o conftest $CXXFLAGS $all_includes $CPPFLAGS $LDFLAGS $all_libraries conftest.$ac_ext $LIBS -lkdecore $LIBQT $KDE_TEST_RPATH 1>&5' + +if AC_TRY_EVAL(ac_link) && test -s conftest; then + AC_MSG_RESULT(yes) +else + AC_MSG_ERROR([your system fails at linking a small KDE application! +Check, if your compiler is installed correctly and if you have used the +same compiler to compile Qt and kdelibs as you did use now. +For more details about this problem, look at the end of config.log.]) +fi + +if eval `KDEDIR= ./conftest 2>&5`; then + kde_result=done +else + kde_result=problems +fi + +KDEDIR= ./conftest 2> /dev/null >&5 # make an echo for config.log +kde_have_all_paths=yes + +KDE_SET_PATHS($kde_result) + +]) + +AC_DEFUN([KDE_SET_PATHS], +[ + kde_cv_all_paths="kde_have_all_paths=\"yes\" \ + kde_htmldir=\"$kde_htmldir\" \ + kde_appsdir=\"$kde_appsdir\" \ + kde_icondir=\"$kde_icondir\" \ + kde_sounddir=\"$kde_sounddir\" \ + kde_datadir=\"$kde_datadir\" \ + kde_locale=\"$kde_locale\" \ + kde_cgidir=\"$kde_cgidir\" \ + kde_confdir=\"$kde_confdir\" \ + kde_kcfgdir=\"$kde_kcfgdir\" \ + kde_mimedir=\"$kde_mimedir\" \ + kde_toolbardir=\"$kde_toolbardir\" \ + kde_wallpaperdir=\"$kde_wallpaperdir\" \ + kde_templatesdir=\"$kde_templatesdir\" \ + kde_bindir=\"$kde_bindir\" \ + kde_servicesdir=\"$kde_servicesdir\" \ + kde_servicetypesdir=\"$kde_servicetypesdir\" \ + kde_moduledir=\"$kde_moduledir\" \ + kde_styledir=\"$kde_styledir\" \ + kde_widgetdir=\"$kde_widgetdir\" \ + xdg_appsdir=\"$xdg_appsdir\" \ + xdg_menudir=\"$xdg_menudir\" \ + xdg_directorydir=\"$xdg_directorydir\" \ + kde_result=$1" +]) + +AC_DEFUN([KDE_SET_DEFAULT_PATHS], +[ +if test "$1" = "default"; then + + if test -z "$kde_htmldir"; then + kde_htmldir='\${datadir}/doc/HTML' + fi + if test -z "$kde_appsdir"; then + kde_appsdir='\${datadir}/applnk' + fi + if test -z "$kde_icondir"; then + kde_icondir='\${datadir}/icons' + fi + if test -z "$kde_sounddir"; then + kde_sounddir='\${datadir}/sounds' + fi + if test -z "$kde_datadir"; then + kde_datadir='\${datadir}/apps' + fi + if test -z "$kde_locale"; then + kde_locale='\${datadir}/locale' + fi + if test -z "$kde_cgidir"; then + kde_cgidir='\${exec_prefix}/cgi-bin' + fi + if test -z "$kde_confdir"; then + kde_confdir='\${datadir}/config' + fi + if test -z "$kde_kcfgdir"; then + kde_kcfgdir='\${datadir}/config.kcfg' + fi + if test -z "$kde_mimedir"; then + kde_mimedir='\${datadir}/mimelnk' + fi + if test -z "$kde_toolbardir"; then + kde_toolbardir='\${datadir}/toolbar' + fi + if test -z "$kde_wallpaperdir"; then + kde_wallpaperdir='\${datadir}/wallpapers' + fi + if test -z "$kde_templatesdir"; then + kde_templatesdir='\${datadir}/templates' + fi + if test -z "$kde_bindir"; then + kde_bindir='\${exec_prefix}/bin' + fi + if test -z "$kde_servicesdir"; then + kde_servicesdir='\${datadir}/services' + fi + if test -z "$kde_servicetypesdir"; then + kde_servicetypesdir='\${datadir}/servicetypes' + fi + if test -z "$kde_moduledir"; then + if test "$kde_qtver" = "2"; then + kde_moduledir='\${libdir}/kde2' + else + kde_moduledir='\${libdir}/kde3' + fi + fi + if test -z "$kde_styledir"; then + kde_styledir='\${libdir}/kde3/plugins/styles' + fi + if test -z "$kde_widgetdir"; then + kde_widgetdir='\${libdir}/kde3/plugins/designer' + fi + if test -z "$xdg_appsdir"; then + xdg_appsdir='\${datadir}/applications/kde' + fi + if test -z "$xdg_menudir"; then + xdg_menudir='\${sysconfdir}/xdg/menus' + fi + if test -z "$xdg_directorydir"; then + xdg_directorydir='\${datadir}/desktop-directories' + fi + + KDE_SET_PATHS(defaults) + +else + + if test $kde_qtver = 1; then + AC_MSG_RESULT([compiling]) + KDE_1_CHECK_PATHS + else + AC_MSG_ERROR([path checking not yet supported for KDE 2]) + fi + +fi +]) + +AC_DEFUN([KDE_CHECK_PATHS_FOR_COMPLETENESS], +[ if test -z "$kde_htmldir" || test -z "$kde_appsdir" || + test -z "$kde_icondir" || test -z "$kde_sounddir" || + test -z "$kde_datadir" || test -z "$kde_locale" || + test -z "$kde_cgidir" || test -z "$kde_confdir" || + test -z "$kde_kcfgdir" || + test -z "$kde_mimedir" || test -z "$kde_toolbardir" || + test -z "$kde_wallpaperdir" || test -z "$kde_templatesdir" || + test -z "$kde_bindir" || test -z "$kde_servicesdir" || + test -z "$kde_servicetypesdir" || test -z "$kde_moduledir" || + test -z "$kde_styledir" || test -z "kde_widgetdir" || + test -z "$xdg_appsdir" || test -z "$xdg_menudir" || test -z "$xdg_directorydir" || + test "x$kde_have_all_paths" != "xyes"; then + kde_have_all_paths=no + fi +]) + +AC_DEFUN([KDE_MISSING_PROG_ERROR], +[ + AC_MSG_ERROR([The important program $1 was not found! +Please check whether you installed KDE correctly. +]) +]) + +AC_DEFUN([KDE_MISSING_ARTS_ERROR], +[ + AC_MSG_ERROR([The important program $1 was not found! +Please check whether you installed aRts correctly or use +--without-arts to compile without aRts support (this will remove functionality). +]) +]) + +AC_DEFUN([KDE_SET_DEFAULT_BINDIRS], +[ + kde_default_bindirs="/usr/bin /usr/local/bin /opt/local/bin /usr/X11R6/bin /opt/kde/bin /opt/kde3/bin /usr/kde/bin /usr/local/kde/bin" + test -n "$KDEDIR" && kde_default_bindirs="$KDEDIR/bin $kde_default_bindirs" + if test -n "$KDEDIRS"; then + kde_save_IFS=$IFS + IFS=: + for dir in $KDEDIRS; do + kde_default_bindirs="$dir/bin $kde_default_bindirs " + done + IFS=$kde_save_IFS + fi +]) + +AC_DEFUN([KDE_SUBST_PROGRAMS], +[ + AC_ARG_WITH(arts, + AC_HELP_STRING([--without-arts],[build without aRts [default=no]]), + [build_arts=$withval], + [build_arts=yes] + ) + AM_CONDITIONAL(include_ARTS, test "$build_arts" '!=' "no") + if test "$build_arts" = "no"; then + AC_DEFINE(WITHOUT_ARTS, 1, [Defined if compiling without arts]) + fi + + KDE_SET_DEFAULT_BINDIRS + kde_default_bindirs="$exec_prefix/bin $prefix/bin $kde_libs_prefix/bin $kde_default_bindirs" + KDE_FIND_PATH(dcopidl, DCOPIDL, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(dcopidl)]) + KDE_FIND_PATH(dcopidl2cpp, DCOPIDL2CPP, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(dcopidl2cpp)]) + if test "$build_arts" '!=' "no"; then + KDE_FIND_PATH(mcopidl, MCOPIDL, [$kde_default_bindirs], [KDE_MISSING_ARTS_ERROR(mcopidl)]) + KDE_FIND_PATH(artsc-config, ARTSCCONFIG, [$kde_default_bindirs], [KDE_MISSING_ARTS_ERROR(artsc-config)]) + fi + KDE_FIND_PATH(meinproc, MEINPROC, [$kde_default_bindirs]) + + kde32ornewer=1 + kde33ornewer=1 + if test -n "$kde_qtver" && test "$kde_qtver" -lt 3; then + kde32ornewer= + kde33ornewer= + else + if test "$kde_qtver" = "3"; then + if test "$kde_qtsubver" -le 1; then + kde32ornewer= + fi + if test "$kde_qtsubver" -le 2; then + kde33ornewer= + fi + if test "$KDECONFIG" != "compiled"; then + if test `$KDECONFIG --version | grep KDE | sed 's/KDE: \(...\).*/\1/'` = 3.2; then + kde33ornewer= + fi + fi + fi + fi + + if test -n "$kde32ornewer"; then + KDE_FIND_PATH(kconfig_compiler, KCONFIG_COMPILER, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(kconfig_compiler)]) + KDE_FIND_PATH(dcopidlng, DCOPIDLNG, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(dcopidlng)]) + fi + if test -n "$kde33ornewer"; then + KDE_FIND_PATH(makekdewidgets, MAKEKDEWIDGETS, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(makekdewidgets)]) + AC_SUBST(MAKEKDEWIDGETS) + fi + KDE_FIND_PATH(xmllint, XMLLINT, [${prefix}/bin ${exec_prefix}/bin], [XMLLINT=""]) + + if test -n "$MEINPROC" -a "$MEINPROC" != "compiled"; then + kde_sharedirs="/usr/share/kde /usr/local/share /usr/share /opt/kde3/share /opt/kde/share $prefix/share" + test -n "$KDEDIR" && kde_sharedirs="$KDEDIR/share $kde_sharedirs" + AC_FIND_FILE(apps/ksgmltools2/customization/kde-chunk.xsl, $kde_sharedirs, KDE_XSL_STYLESHEET) + if test "$KDE_XSL_STYLESHEET" = "NO"; then + KDE_XSL_STYLESHEET="" + else + KDE_XSL_STYLESHEET="$KDE_XSL_STYLESHEET/apps/ksgmltools2/customization/kde-chunk.xsl" + fi + fi + + DCOP_DEPENDENCIES='$(DCOPIDL)' + if test -n "$kde32ornewer"; then + KCFG_DEPENDENCIES='$(KCONFIG_COMPILER)' + DCOP_DEPENDENCIES='$(DCOPIDL) $(DCOPIDLNG)' + AC_SUBST(KCONFIG_COMPILER) + AC_SUBST(KCFG_DEPENDENCIES) + AC_SUBST(DCOPIDLNG) + fi + AC_SUBST(DCOPIDL) + AC_SUBST(DCOPIDL2CPP) + AC_SUBST(DCOP_DEPENDENCIES) + AC_SUBST(MCOPIDL) + AC_SUBST(ARTSCCONFIG) + AC_SUBST(MEINPROC) + AC_SUBST(KDE_XSL_STYLESHEET) + AC_SUBST(XMLLINT) +])dnl + +AC_DEFUN([AC_CREATE_KFSSTND], +[ +AC_REQUIRE([AC_CHECK_RPATH]) + +AC_MSG_CHECKING([for KDE paths]) +kde_result="" +kde_cached_paths=yes +AC_CACHE_VAL(kde_cv_all_paths, +[ + KDE_SET_DEFAULT_PATHS($1) + kde_cached_paths=no +]) +eval "$kde_cv_all_paths" +KDE_CHECK_PATHS_FOR_COMPLETENESS +if test "$kde_have_all_paths" = "no" && test "$kde_cached_paths" = "yes"; then + # wrong values were cached, may be, we can set better ones + kde_result= + kde_htmldir= kde_appsdir= kde_icondir= kde_sounddir= + kde_datadir= kde_locale= kde_cgidir= kde_confdir= kde_kcfgdir= + kde_mimedir= kde_toolbardir= kde_wallpaperdir= kde_templatesdir= + kde_bindir= kde_servicesdir= kde_servicetypesdir= kde_moduledir= + kde_have_all_paths= + kde_styledir= + kde_widgetdir= + xdg_appsdir = xdg_menudir= xdg_directorydir= + KDE_SET_DEFAULT_PATHS($1) + eval "$kde_cv_all_paths" + KDE_CHECK_PATHS_FOR_COMPLETENESS + kde_result="$kde_result (cache overridden)" +fi +if test "$kde_have_all_paths" = "no"; then + AC_MSG_ERROR([configure could not run a little KDE program to test the environment. +Since it had compiled and linked before, it must be a strange problem on your system. +Look at config.log for details. If you are not able to fix this, look at +http://www.kde.org/faq/installation.html or any www.kde.org mirror. +(If you're using an egcs version on Linux, you may update binutils!) +]) +else + rm -f conftest* + AC_MSG_RESULT($kde_result) +fi + +bindir=$kde_bindir + +KDE_SUBST_PROGRAMS + +]) + +AC_DEFUN([AC_SUBST_KFSSTND], +[ +AC_SUBST(kde_htmldir) +AC_SUBST(kde_appsdir) +AC_SUBST(kde_icondir) +AC_SUBST(kde_sounddir) +AC_SUBST(kde_datadir) +AC_SUBST(kde_locale) +AC_SUBST(kde_confdir) +AC_SUBST(kde_kcfgdir) +AC_SUBST(kde_mimedir) +AC_SUBST(kde_wallpaperdir) +AC_SUBST(kde_bindir) +dnl X Desktop Group standards +AC_SUBST(xdg_appsdir) +AC_SUBST(xdg_menudir) +AC_SUBST(xdg_directorydir) +dnl for KDE 2 +AC_SUBST(kde_templatesdir) +AC_SUBST(kde_servicesdir) +AC_SUBST(kde_servicetypesdir) +AC_SUBST(kde_moduledir) +AC_SUBST(kdeinitdir, '$(kde_moduledir)') +AC_SUBST(kde_styledir) +AC_SUBST(kde_widgetdir) +if test "$kde_qtver" = 1; then + kde_minidir="$kde_icondir/mini" +else +# for KDE 1 - this breaks KDE2 apps using minidir, but +# that's the plan ;-/ + kde_minidir="/dev/null" +fi +dnl AC_SUBST(kde_minidir) +dnl AC_SUBST(kde_cgidir) +dnl AC_SUBST(kde_toolbardir) +]) + +AC_DEFUN([KDE_MISC_TESTS], +[ + dnl Checks for libraries. + AC_CHECK_LIB(util, main, [LIBUTIL="-lutil"]) dnl for *BSD + AC_SUBST(LIBUTIL) + AC_CHECK_LIB(compat, main, [LIBCOMPAT="-lcompat"]) dnl for *BSD + AC_SUBST(LIBCOMPAT) + kde_have_crypt= + AC_CHECK_LIB(crypt, crypt, [LIBCRYPT="-lcrypt"; kde_have_crypt=yes], + AC_CHECK_LIB(c, crypt, [kde_have_crypt=yes], [ + AC_MSG_WARN([you have no crypt in either libcrypt or libc. +You should install libcrypt from another source or configure with PAM +support]) + kde_have_crypt=no + ])) + AC_SUBST(LIBCRYPT) + if test $kde_have_crypt = yes; then + AC_DEFINE_UNQUOTED(HAVE_CRYPT, 1, [Defines if your system has the crypt function]) + fi + AC_CHECK_SOCKLEN_T + AC_CHECK_LIB(dnet, dnet_ntoa, [X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet"]) + if test $ac_cv_lib_dnet_dnet_ntoa = no; then + AC_CHECK_LIB(dnet_stub, dnet_ntoa, + [X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub"]) + fi + AC_CHECK_FUNC(inet_ntoa) + if test $ac_cv_func_inet_ntoa = no; then + AC_CHECK_LIB(nsl, inet_ntoa, X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl") + fi + AC_CHECK_FUNC(connect) + if test $ac_cv_func_connect = no; then + AC_CHECK_LIB(socket, connect, X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS", , + $X_EXTRA_LIBS) + fi + + AC_CHECK_FUNC(remove) + if test $ac_cv_func_remove = no; then + AC_CHECK_LIB(posix, remove, X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix") + fi + + # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. + AC_CHECK_FUNC(shmat, , + AC_CHECK_LIB(ipc, shmat, X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc")) + + # more headers that need to be explicitly included on darwin + AC_CHECK_HEADERS(sys/types.h stdint.h) + + # sys/bitypes.h is needed for uint32_t and friends on Tru64 + AC_CHECK_HEADERS(sys/bitypes.h) + + # darwin requires a poll emulation library + AC_CHECK_LIB(poll, poll, LIB_POLL="-lpoll") + + # for some image handling on Mac OS X + AC_CHECK_HEADERS(Carbon/Carbon.h) + + # CoreAudio framework + AC_CHECK_HEADER(CoreAudio/CoreAudio.h, [ + AC_DEFINE(HAVE_COREAUDIO, 1, [Define if you have the CoreAudio API]) + FRAMEWORK_COREAUDIO="-Wl,-framework,CoreAudio" + ]) + + AC_CHECK_RES_INIT + AC_SUBST(LIB_POLL) + AC_SUBST(FRAMEWORK_COREAUDIO) + LIBSOCKET="$X_EXTRA_LIBS" + AC_SUBST(LIBSOCKET) + AC_SUBST(X_EXTRA_LIBS) + AC_CHECK_LIB(ucb, killpg, [LIBUCB="-lucb"]) dnl for Solaris2.4 + AC_SUBST(LIBUCB) + + case $host in dnl this *is* LynxOS specific + *-*-lynxos* ) + AC_MSG_CHECKING([LynxOS header file wrappers]) + [CFLAGS="$CFLAGS -D__NO_INCLUDE_WARN__"] + AC_MSG_RESULT(disabled) + AC_CHECK_LIB(bsd, gethostbyname, [LIBSOCKET="-lbsd"]) dnl for LynxOS + ;; + esac + + KDE_CHECK_TYPES + KDE_CHECK_LIBDL + KDE_CHECK_STRLCPY + KDE_CHECK_PIE_SUPPORT + +# darwin needs this to initialize the environment +AC_CHECK_HEADERS(crt_externs.h) +AC_CHECK_FUNC(_NSGetEnviron, [AC_DEFINE(HAVE_NSGETENVIRON, 1, [Define if your system needs _NSGetEnviron to set up the environment])]) + +AH_VERBATIM(_DARWIN_ENVIRON, +[ +#if defined(HAVE_NSGETENVIRON) && defined(HAVE_CRT_EXTERNS_H) +# include +# include +# define environ (*_NSGetEnviron()) +#endif +]) + +AH_VERBATIM(_AIX_STRINGS_H_BZERO, +[ +/* + * AIX defines FD_SET in terms of bzero, but fails to include + * that defines bzero. + */ + +#if defined(_AIX) +#include +#endif +]) + +AC_CHECK_FUNCS([vsnprintf snprintf]) + +AH_VERBATIM(_TRU64,[ +/* + * On HP-UX, the declaration of vsnprintf() is needed every time ! + */ + +#if !defined(HAVE_VSNPRINTF) || defined(hpux) +#if __STDC__ +#include +#include +#else +#include +#endif +#ifdef __cplusplus +extern "C" +#endif +int vsnprintf(char *str, size_t n, char const *fmt, va_list ap); +#ifdef __cplusplus +extern "C" +#endif +int snprintf(char *str, size_t n, char const *fmt, ...); +#endif +]) + +]) + +dnl ------------------------------------------------------------------------ +dnl Find the header files and libraries for X-Windows. Extended the +dnl macro AC_PATH_X +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([K_PATH_X], +[ +AC_REQUIRE([KDE_MISC_TESTS])dnl +AC_REQUIRE([KDE_CHECK_LIB64]) + +AC_ARG_ENABLE( + embedded, + AC_HELP_STRING([--enable-embedded],[link to Qt-embedded, don't use X]), + kde_use_qt_emb=$enableval, + kde_use_qt_emb=no +) + +AC_ARG_ENABLE( + qtopia, + AC_HELP_STRING([--enable-qtopia],[link to Qt-embedded, link to the Qtopia Environment]), + kde_use_qt_emb_palm=$enableval, + kde_use_qt_emb_palm=no +) + +AC_ARG_ENABLE( + mac, + AC_HELP_STRING([--enable-mac],[link to Qt/Mac (don't use X)]), + kde_use_qt_mac=$enableval, + kde_use_qt_mac=no +) + +# used to disable x11-specific stuff on special platforms +AM_CONDITIONAL(include_x11, test "$kde_use_qt_emb" = "no" && test "$kde_use_qt_mac" = "no") + +if test "$kde_use_qt_emb" = "no" && test "$kde_use_qt_mac" = "no"; then + +AC_MSG_CHECKING(for X) + +AC_CACHE_VAL(kde_cv_have_x, +[# One or both of the vars are not set, and there is no cached value. +if test "{$x_includes+set}" = set || test "$x_includes" = NONE; then + kde_x_includes=NO +else + kde_x_includes=$x_includes +fi +if test "{$x_libraries+set}" = set || test "$x_libraries" = NONE; then + kde_x_libraries=NO +else + kde_x_libraries=$x_libraries +fi + +# below we use the standard autoconf calls +ac_x_libraries=$kde_x_libraries +ac_x_includes=$kde_x_includes + +KDE_PATH_X_DIRECT +dnl AC_PATH_X_XMKMF picks /usr/lib as the path for the X libraries. +dnl Unfortunately, if compiling with the N32 ABI, this is not the correct +dnl location. The correct location is /usr/lib32 or an undefined value +dnl (the linker is smart enough to pick the correct default library). +dnl Things work just fine if you use just AC_PATH_X_DIRECT. +dnl Solaris has a similar problem. AC_PATH_X_XMKMF forces x_includes to +dnl /usr/openwin/include, which doesn't work. /usr/include does work, so +dnl x_includes should be left alone. +case "$host" in +mips-sgi-irix6*) + ;; +*-*-solaris*) + ;; +*) + _AC_PATH_X_XMKMF + if test -z "$ac_x_includes"; then + ac_x_includes="." + fi + if test -z "$ac_x_libraries"; then + ac_x_libraries="/usr/lib${kdelibsuff}" + fi +esac +#from now on we use our own again + +# when the user already gave --x-includes, we ignore +# what the standard autoconf macros told us. +if test "$kde_x_includes" = NO; then + kde_x_includes=$ac_x_includes +fi + +# for --x-libraries too +if test "$kde_x_libraries" = NO; then + kde_x_libraries=$ac_x_libraries +fi + +if test "$kde_x_includes" = NO; then + AC_MSG_ERROR([Can't find X includes. Please check your installation and add the correct paths!]) +fi + +if test "$kde_x_libraries" = NO; then + AC_MSG_ERROR([Can't find X libraries. Please check your installation and add the correct paths!]) +fi + +# Record where we found X for the cache. +kde_cv_have_x="have_x=yes \ + kde_x_includes=$kde_x_includes kde_x_libraries=$kde_x_libraries" +])dnl + +eval "$kde_cv_have_x" + +if test "$have_x" != yes; then + AC_MSG_RESULT($have_x) + no_x=yes +else + AC_MSG_RESULT([libraries $kde_x_libraries, headers $kde_x_includes]) +fi + +if test -z "$kde_x_includes" || test "x$kde_x_includes" = xNONE; then + X_INCLUDES="" + x_includes="."; dnl better than nothing :- + else + x_includes=$kde_x_includes + X_INCLUDES="-I$x_includes" +fi + +if test -z "$kde_x_libraries" || test "x$kde_x_libraries" = xNONE; then + X_LDFLAGS="" + x_libraries="/usr/lib"; dnl better than nothing :- + else + x_libraries=$kde_x_libraries + X_LDFLAGS="-L$x_libraries" +fi +all_includes="$X_INCLUDES" +all_libraries="$X_LDFLAGS $LDFLAGS_AS_NEEDED $LDFLAGS_NEW_DTAGS" + +# Check for libraries that X11R6 Xt/Xaw programs need. +ac_save_LDFLAGS="$LDFLAGS" +LDFLAGS="$LDFLAGS $X_LDFLAGS" +# SM needs ICE to (dynamically) link under SunOS 4.x (so we have to +# check for ICE first), but we must link in the order -lSM -lICE or +# we get undefined symbols. So assume we have SM if we have ICE. +# These have to be linked with before -lX11, unlike the other +# libraries we check for below, so use a different variable. +# --interran@uluru.Stanford.EDU, kb@cs.umb.edu. +AC_CHECK_LIB(ICE, IceConnectionNumber, + [LIBSM="-lSM -lICE"], , $X_EXTRA_LIBS) +LDFLAGS="$ac_save_LDFLAGS" + +LIB_X11='-lX11 $(LIBSOCKET)' + +AC_MSG_CHECKING(for libXext) +AC_CACHE_VAL(kde_cv_have_libXext, +[ +kde_ldflags_safe="$LDFLAGS" +kde_libs_safe="$LIBS" + +LDFLAGS="$LDFLAGS $X_LDFLAGS $USER_LDFLAGS" +LIBS="-lXext -lX11 $LIBSOCKET" + +AC_TRY_LINK([ +#include +#ifdef STDC_HEADERS +# include +#endif +], +[ +printf("hello Xext\n"); +], +kde_cv_have_libXext=yes, +kde_cv_have_libXext=no +) + +LDFLAGS=$kde_ldflags_safe +LIBS=$kde_libs_safe +]) + +AC_MSG_RESULT($kde_cv_have_libXext) + +if test "$kde_cv_have_libXext" = "no"; then + AC_MSG_ERROR([We need a working libXext to proceed. Since configure +can't find it itself, we stop here assuming that make wouldn't find +them either.]) +fi + +LIB_XEXT="-lXext" +QTE_NORTTI="" + +elif test "$kde_use_qt_emb" = "yes"; then + dnl We're using QT Embedded + CPPFLAGS=-DQWS + CXXFLAGS="$CXXFLAGS -fno-rtti" + QTE_NORTTI="-fno-rtti -DQWS" + X_PRE_LIBS="" + LIB_X11="" + LIB_XEXT="" + LIB_XRENDER="" + LIBSM="" + X_INCLUDES="" + X_LDFLAGS="" + x_includes="" + x_libraries="" +elif test "$kde_use_qt_mac" = "yes"; then + dnl We're using QT/Mac (I use QT_MAC so that qglobal.h doesn't *have* to + dnl be included to get the information) --Sam + CXXFLAGS="$CXXFLAGS -DQT_MAC -no-cpp-precomp" + CFLAGS="$CFLAGS -DQT_MAC -no-cpp-precomp" + X_PRE_LIBS="" + LIB_X11="" + LIB_XEXT="" + LIB_XRENDER="" + LIBSM="" + X_INCLUDES="" + X_LDFLAGS="" + x_includes="" + x_libraries="" +fi +AC_SUBST(X_PRE_LIBS) +AC_SUBST(LIB_X11) +AC_SUBST(LIB_XRENDER) +AC_SUBST(LIBSM) +AC_SUBST(X_INCLUDES) +AC_SUBST(X_LDFLAGS) +AC_SUBST(x_includes) +AC_SUBST(x_libraries) +AC_SUBST(QTE_NORTTI) +AC_SUBST(LIB_XEXT) + +]) + +AC_DEFUN([KDE_PRINT_QT_PROGRAM], +[ +AC_REQUIRE([KDE_USE_QT]) +cat > conftest.$ac_ext < +#include +EOF +if test "$kde_qtver" = "2"; then +cat >> conftest.$ac_ext < +#include +#include +EOF + +if test $kde_qtsubver -gt 0; then +cat >> conftest.$ac_ext <> conftest.$ac_ext < +#include +#include +EOF +fi + +echo "#if ! ($kde_qt_verstring)" >> conftest.$ac_ext +cat >> conftest.$ac_ext <> conftest.$ac_ext <> conftest.$ac_ext <> conftest.$ac_ext <> conftest.$ac_ext <&AC_FD_CC + cat conftest.$ac_ext >&AC_FD_CC +fi + +rm -f conftest* +CXXFLAGS="$ac_cxxflags_safe" +LDFLAGS="$ac_ldflags_safe" +LIBS="$ac_libs_safe" + +LD_LIBRARY_PATH="$ac_LD_LIBRARY_PATH_safe" +export LD_LIBRARY_PATH +LIBRARY_PATH="$ac_LIBRARY_PATH" +export LIBRARY_PATH +AC_LANG_RESTORE +]) + +if test "$kde_cv_qt_direct" = "yes"; then + AC_MSG_RESULT(yes) + $1 +else + AC_MSG_RESULT(no) + $2 +fi +]) + +dnl ------------------------------------------------------------------------ +dnl Try to find the Qt headers and libraries. +dnl $(QT_LDFLAGS) will be -Lqtliblocation (if needed) +dnl and $(QT_INCLUDES) will be -Iqthdrlocation (if needed) +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([AC_PATH_QT_1_3], +[ +AC_REQUIRE([K_PATH_X]) +AC_REQUIRE([KDE_USE_QT]) +AC_REQUIRE([KDE_CHECK_LIB64]) + +dnl ------------------------------------------------------------------------ +dnl Add configure flag to enable linking to MT version of Qt library. +dnl ------------------------------------------------------------------------ + +AC_ARG_ENABLE( + mt, + AC_HELP_STRING([--disable-mt],[link to non-threaded Qt (deprecated)]), + kde_use_qt_mt=$enableval, + [ + if test $kde_qtver = 3; then + kde_use_qt_mt=yes + else + kde_use_qt_mt=no + fi + ] +) + +USING_QT_MT="" + +dnl ------------------------------------------------------------------------ +dnl If we not get --disable-qt-mt then adjust some vars for the host. +dnl ------------------------------------------------------------------------ + +KDE_MT_LDFLAGS= +KDE_MT_LIBS= +if test "x$kde_use_qt_mt" = "xyes"; then + KDE_CHECK_THREADING + if test "x$kde_use_threading" = "xyes"; then + CPPFLAGS="$USE_THREADS -DQT_THREAD_SUPPORT $CPPFLAGS" + KDE_MT_LDFLAGS="$USE_THREADS" + KDE_MT_LIBS="$LIBPTHREAD" + else + kde_use_qt_mt=no + fi +fi +AC_SUBST(KDE_MT_LDFLAGS) +AC_SUBST(KDE_MT_LIBS) + +kde_qt_was_given=yes + +dnl ------------------------------------------------------------------------ +dnl If we haven't been told how to link to Qt, we work it out for ourselves. +dnl ------------------------------------------------------------------------ +if test -z "$LIBQT_GLOB"; then + if test "x$kde_use_qt_emb" = "xyes"; then + LIBQT_GLOB="libqte.*" + else + LIBQT_GLOB="libqt.*" + fi +fi + +dnl ------------------------------------------------------------ +dnl If we got --enable-embedded then adjust the Qt library name. +dnl ------------------------------------------------------------ +if test "x$kde_use_qt_emb" = "xyes"; then + qtlib="qte" +else + qtlib="qt" +fi + +kde_int_qt="-l$qtlib" + +if test -z "$LIBQPE"; then +dnl ------------------------------------------------------------ +dnl If we got --enable-palmtop then add -lqpe to the link line +dnl ------------------------------------------------------------ + if test "x$kde_use_qt_emb" = "xyes"; then + if test "x$kde_use_qt_emb_palm" = "xyes"; then + LIB_QPE="-lqpe" + else + LIB_QPE="" + fi + else + LIB_QPE="" + fi +fi + +dnl ------------------------------------------------------------------------ +dnl If we got --enable-qt-mt then adjust the Qt library name for the host. +dnl ------------------------------------------------------------------------ + +if test "x$kde_use_qt_mt" = "xyes"; then + LIBQT="-l$qtlib-mt" + kde_int_qt="-l$qtlib-mt" + LIBQT_GLOB="lib$qtlib-mt.*" + USING_QT_MT="using -mt" +else + LIBQT="-l$qtlib" +fi + +if test $kde_qtver != 1; then + + AC_REQUIRE([AC_FIND_PNG]) + AC_REQUIRE([AC_FIND_JPEG]) + LIBQT="$LIBQT $LIBPNG $LIBJPEG" +fi + +if test $kde_qtver = 3; then + AC_REQUIRE([KDE_CHECK_LIBDL]) + LIBQT="$LIBQT $LIBDL" +fi + +AC_MSG_CHECKING([for Qt]) + +if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then +LIBQT="$LIBQT $X_PRE_LIBS -lXext -lX11 $LIBSM $LIBSOCKET" +fi +ac_qt_includes=NO ac_qt_libraries=NO ac_qt_bindir=NO +qt_libraries="" +qt_includes="" +AC_ARG_WITH(qt-dir, + AC_HELP_STRING([--with-qt-dir=DIR],[where the root of Qt is installed ]), + [ ac_qt_includes="$withval"/include + ac_qt_libraries="$withval"/lib${kdelibsuff} + ac_qt_bindir="$withval"/bin + ]) + +AC_ARG_WITH(qt-includes, + AC_HELP_STRING([--with-qt-includes=DIR],[where the Qt includes are. ]), + [ + ac_qt_includes="$withval" + ]) + +kde_qt_libs_given=no + +AC_ARG_WITH(qt-libraries, + AC_HELP_STRING([--with-qt-libraries=DIR],[where the Qt library is installed.]), + [ ac_qt_libraries="$withval" + kde_qt_libs_given=yes + ]) + +AC_CACHE_VAL(ac_cv_have_qt, +[#try to guess Qt locations + +qt_incdirs="" +for dir in $kde_qt_dirs; do + qt_incdirs="$qt_incdirs $dir/include $dir" +done +qt_incdirs="$QTINC $qt_incdirs /usr/local/qt/include /usr/include/qt /usr/include /usr/X11R6/include/X11/qt /usr/X11R6/include/qt /usr/X11R6/include/qt2 /usr/include/qt3 $x_includes" +if test ! "$ac_qt_includes" = "NO"; then + qt_incdirs="$ac_qt_includes $qt_incdirs" +fi + +if test "$kde_qtver" != "1"; then + kde_qt_header=qstyle.h +else + kde_qt_header=qglobal.h +fi + +AC_FIND_FILE($kde_qt_header, $qt_incdirs, qt_incdir) +ac_qt_includes="$qt_incdir" + +qt_libdirs="" +for dir in $kde_qt_dirs; do + qt_libdirs="$qt_libdirs $dir/lib${kdelibsuff} $dir" +done +qt_libdirs="$QTLIB $qt_libdirs /usr/X11R6/lib /usr/lib /usr/local/qt/lib $x_libraries" +if test ! "$ac_qt_libraries" = "NO"; then + qt_libdir=$ac_qt_libraries +else + qt_libdirs="$ac_qt_libraries $qt_libdirs" + # if the Qt was given, the chance is too big that libqt.* doesn't exist + qt_libdir=NONE + for dir in $qt_libdirs; do + try="ls -1 $dir/${LIBQT_GLOB}" + if test -n "`$try 2> /dev/null`"; then qt_libdir=$dir; break; else echo "tried $dir" >&AC_FD_CC ; fi + done +fi +for a in $qt_libdir/lib`echo ${kde_int_qt} | sed 's,^-l,,'`_incremental.*; do + if test -e "$a"; then + LIBQT="$LIBQT ${kde_int_qt}_incremental" + break + fi +done + +ac_qt_libraries="$qt_libdir" + +AC_LANG_SAVE +AC_LANG_CPLUSPLUS + +ac_cxxflags_safe="$CXXFLAGS" +ac_ldflags_safe="$LDFLAGS" +ac_libs_safe="$LIBS" + +CXXFLAGS="$CXXFLAGS -I$qt_incdir $all_includes" +LDFLAGS="$LDFLAGS -L$qt_libdir $all_libraries $USER_LDFLAGS $KDE_MT_LDFLAGS" +LIBS="$LIBS $LIBQT $KDE_MT_LIBS" + +KDE_PRINT_QT_PROGRAM + +if AC_TRY_EVAL(ac_link) && test -s conftest; then + rm -f conftest* +else + echo "configure: failed program was:" >&AC_FD_CC + cat conftest.$ac_ext >&AC_FD_CC + ac_qt_libraries="NO" +fi +rm -f conftest* +CXXFLAGS="$ac_cxxflags_safe" +LDFLAGS="$ac_ldflags_safe" +LIBS="$ac_libs_safe" + +AC_LANG_RESTORE +if test "$ac_qt_includes" = NO || test "$ac_qt_libraries" = NO; then + ac_cv_have_qt="have_qt=no" + ac_qt_notfound="" + missing_qt_mt="" + if test "$ac_qt_includes" = NO; then + if test "$ac_qt_libraries" = NO; then + ac_qt_notfound="(headers and libraries)"; + else + ac_qt_notfound="(headers)"; + fi + else + if test "x$kde_use_qt_mt" = "xyes"; then + missing_qt_mt=" +Make sure that you have compiled Qt with thread support!" + ac_qt_notfound="(library $qtlib-mt)"; + else + ac_qt_notfound="(library $qtlib)"; + fi + fi + + AC_MSG_ERROR([Qt ($kde_qt_minversion) $ac_qt_notfound not found. Please check your installation! +For more details about this problem, look at the end of config.log.$missing_qt_mt]) +else + have_qt="yes" +fi +]) + +eval "$ac_cv_have_qt" + +if test "$have_qt" != yes; then + AC_MSG_RESULT([$have_qt]); +else + ac_cv_have_qt="have_qt=yes \ + ac_qt_includes=$ac_qt_includes ac_qt_libraries=$ac_qt_libraries" + AC_MSG_RESULT([libraries $ac_qt_libraries, headers $ac_qt_includes $USING_QT_MT]) + + qt_libraries="$ac_qt_libraries" + qt_includes="$ac_qt_includes" +fi + +if test ! "$kde_qt_libs_given" = "yes" && test ! "$kde_qtver" = 3; then + KDE_CHECK_QT_DIRECT(qt_libraries= ,[]) +fi + +AC_SUBST(qt_libraries) +AC_SUBST(qt_includes) + +if test "$qt_includes" = "$x_includes" || test -z "$qt_includes"; then + QT_INCLUDES="" +else + QT_INCLUDES="-I$qt_includes" + all_includes="$QT_INCLUDES $all_includes" +fi + +if test "$qt_libraries" = "$x_libraries" || test -z "$qt_libraries"; then + QT_LDFLAGS="" +else + QT_LDFLAGS="-L$qt_libraries" + all_libraries="$QT_LDFLAGS $all_libraries" +fi +test -z "$KDE_MT_LDFLAGS" || all_libraries="$all_libraries $KDE_MT_LDFLAGS" + +AC_SUBST(QT_INCLUDES) +AC_SUBST(QT_LDFLAGS) +AC_PATH_QT_MOC_UIC + +KDE_CHECK_QT_JPEG + +if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then +LIB_QT="$kde_int_qt $LIBJPEG_QT "'$(LIBZ) $(LIBPNG) -lXext $(LIB_X11) $(LIBSM)' +else +LIB_QT="$kde_int_qt $LIBJPEG_QT "'$(LIBZ) $(LIBPNG)' +fi +test -z "$KDE_MT_LIBS" || LIB_QT="$LIB_QT $KDE_MT_LIBS" +for a in $qt_libdir/lib`echo ${kde_int_qt} | sed 's,^-l,,'`_incremental.*; do + if test -e "$a"; then + LIB_QT="$LIB_QT ${kde_int_qt}_incremental" + break + fi +done + +AC_SUBST(LIB_QT) +AC_SUBST(LIB_QPE) + +AC_SUBST(kde_qtver) +]) + +AC_DEFUN([AC_PATH_QT], +[ +AC_PATH_QT_1_3 +]) + +AC_DEFUN([KDE_CHECK_UIC_PLUGINS], +[ +AC_REQUIRE([AC_PATH_QT_MOC_UIC]) + +if test x$ac_uic_supports_libpath = xyes; then + +AC_MSG_CHECKING([if UIC has KDE plugins available]) +AC_CACHE_VAL(kde_cv_uic_plugins, +[ +cat > actest.ui << EOF + +NewConnectionDialog + + + + testInput + + + + +EOF + + + +kde_cv_uic_plugins=no +kde_line="$UIC_PATH -L $kde_widgetdir" +if test x$ac_uic_supports_nounload = xyes; then + kde_line="$kde_line -nounload" +fi +kde_line="$kde_line -impl actest.h actest.ui > actest.cpp" +if AC_TRY_EVAL(kde_line); then + # if you're trying to debug this check and think it's incorrect, + # better check your installation. The check _is_ correct - your + # installation is not. + if test -f actest.cpp && grep klineedit actest.cpp > /dev/null; then + kde_cv_uic_plugins=yes + fi +fi +rm -f actest.ui actest.cpp +]) + +AC_MSG_RESULT([$kde_cv_uic_plugins]) +if test "$kde_cv_uic_plugins" != yes; then + AC_MSG_ERROR([ +you need to install kdelibs first. + +If you did install kdelibs, then the Qt version that is picked up by +this configure is not the same version you used to compile kdelibs. +The Qt Plugin installed by kdelibs is *ONLY* loadable if it is the +_same Qt version_, compiled with the _same compiler_ and the same Qt +configuration settings. +]) +fi +fi +]) + +AC_DEFUN([KDE_CHECK_FINAL], +[ + AC_ARG_ENABLE(final, + AC_HELP_STRING([--enable-final], + [build size optimized apps (experimental - needs lots of memory)]), + kde_use_final=$enableval, kde_use_final=no) + + if test "x$kde_use_final" = "xyes"; then + KDE_USE_FINAL_TRUE="" + KDE_USE_FINAL_FALSE="#" + else + KDE_USE_FINAL_TRUE="#" + KDE_USE_FINAL_FALSE="" + fi + AC_SUBST(KDE_USE_FINAL_TRUE) + AC_SUBST(KDE_USE_FINAL_FALSE) +]) + +AC_DEFUN([KDE_CHECK_CLOSURE], +[ + AC_ARG_ENABLE(closure, + AC_HELP_STRING([--enable-closure],[delay template instantiation]), + kde_use_closure=$enableval, kde_use_closure=no) + + KDE_NO_UNDEFINED="" + if test "x$kde_use_closure" = "xyes"; then + KDE_USE_CLOSURE_TRUE="" + KDE_USE_CLOSURE_FALSE="#" +# CXXFLAGS="$CXXFLAGS $REPO" + else + KDE_USE_CLOSURE_TRUE="#" + KDE_USE_CLOSURE_FALSE="" + KDE_NO_UNDEFINED="" + case $host in + *-*-linux-gnu) + KDE_CHECK_COMPILER_FLAG([Wl,--no-undefined], + [KDE_CHECK_COMPILER_FLAG([Wl,--allow-shlib-undefined], + [KDE_NO_UNDEFINED="-Wl,--no-undefined -Wl,--allow-shlib-undefined"], + [KDE_NO_UNDEFINED=""])], + [KDE_NO_UNDEFINED=""]) + ;; + esac + fi + AC_SUBST(KDE_USE_CLOSURE_TRUE) + AC_SUBST(KDE_USE_CLOSURE_FALSE) + AC_SUBST(KDE_NO_UNDEFINED) +]) + +dnl Check if the linker supports --enable-new-dtags and --as-needed +AC_DEFUN([KDE_CHECK_NEW_LDFLAGS], +[ + AC_ARG_ENABLE(new_ldflags, + AC_HELP_STRING([--enable-new-ldflags], + [enable the new linker flags]), + kde_use_new_ldflags=$enableval, + kde_use_new_ldflags=no) + + LDFLAGS_AS_NEEDED="" + LDFLAGS_NEW_DTAGS="" + if test "x$kde_use_new_ldflags" = "xyes"; then + LDFLAGS_NEW_DTAGS="" + KDE_CHECK_COMPILER_FLAG([Wl,--enable-new-dtags], + [LDFLAGS_NEW_DTAGS="-Wl,--enable-new-dtags"],) + + KDE_CHECK_COMPILER_FLAG([Wl,--as-needed], + [LDFLAGS_AS_NEEDED="-Wl,--as-needed"],) + fi + AC_SUBST(LDFLAGS_AS_NEEDED) + AC_SUBST(LDFLAGS_NEW_DTAGS) +]) + +AC_DEFUN([KDE_CHECK_NMCHECK], +[ + AC_ARG_ENABLE(nmcheck,AC_HELP_STRING([--enable-nmcheck],[enable automatic namespace cleanness check]), + kde_use_nmcheck=$enableval, kde_use_nmcheck=no) + + if test "$kde_use_nmcheck" = "yes"; then + KDE_USE_NMCHECK_TRUE="" + KDE_USE_NMCHECK_FALSE="#" + else + KDE_USE_NMCHECK_TRUE="#" + KDE_USE_NMCHECK_FALSE="" + fi + AC_SUBST(KDE_USE_NMCHECK_TRUE) + AC_SUBST(KDE_USE_NMCHECK_FALSE) +]) + +AC_DEFUN([KDE_EXPAND_MAKEVAR], [ +savex=$exec_prefix +test "x$exec_prefix" = xNONE && exec_prefix=$prefix +tmp=$$2 +while $1=`eval echo "$tmp"`; test "x$$1" != "x$tmp"; do tmp=$$1; done +exec_prefix=$savex +]) + +dnl ------------------------------------------------------------------------ +dnl Now, the same with KDE +dnl $(KDE_LDFLAGS) will be the kdeliblocation (if needed) +dnl and $(kde_includes) will be the kdehdrlocation (if needed) +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([AC_BASE_PATH_KDE], +[ +AC_REQUIRE([KDE_CHECK_STL]) +AC_REQUIRE([AC_PATH_QT])dnl +AC_REQUIRE([KDE_CHECK_LIB64]) + +AC_CHECK_RPATH +AC_MSG_CHECKING([for KDE]) + +if test "${prefix}" != NONE; then + kde_includes=${includedir} + KDE_EXPAND_MAKEVAR(ac_kde_includes, includedir) + + kde_libraries=${libdir} + KDE_EXPAND_MAKEVAR(ac_kde_libraries, libdir) + +else + ac_kde_includes= + ac_kde_libraries= + kde_libraries="" + kde_includes="" +fi + +AC_CACHE_VAL(ac_cv_have_kde, +[#try to guess kde locations + +if test "$kde_qtver" = 1; then + kde_check_header="ksock.h" + kde_check_lib="libkdecore.la" +else + kde_check_header="ksharedptr.h" + kde_check_lib="libkio.la" +fi + +if test -z "$1"; then + +kde_incdirs="$kde_libs_prefix/include /usr/lib/kde/include /usr/local/kde/include /usr/local/include /usr/kde/include /usr/include/kde /usr/include /opt/kde3/include /opt/kde/include $x_includes $qt_includes" +test -n "$KDEDIR" && kde_incdirs="$KDEDIR/include $KDEDIR/include/kde $KDEDIR $kde_incdirs" +kde_incdirs="$ac_kde_includes $kde_incdirs" +AC_FIND_FILE($kde_check_header, $kde_incdirs, kde_incdir) +ac_kde_includes="$kde_incdir" + +if test -n "$ac_kde_includes" && test ! -r "$ac_kde_includes/$kde_check_header"; then + AC_MSG_ERROR([ +in the prefix, you've chosen, are no KDE headers installed. This will fail. +So, check this please and use another prefix!]) +fi + +kde_libdirs="$kde_libs_prefix/lib${kdelibsuff} /usr/lib/kde/lib${kdelibsuff} /usr/local/kde/lib${kdelibsuff} /usr/kde/lib${kdelibsuff} /usr/lib${kdelibsuff}/kde /usr/lib${kdelibsuff}/kde3 /usr/lib${kdelibsuff} /usr/X11R6/lib${kdelibsuff} /usr/local/lib${kdelibsuff} /opt/kde3/lib${kdelibsuff} /opt/kde/lib${kdelibsuff} /usr/X11R6/kde/lib${kdelibsuff}" +test -n "$KDEDIR" && kde_libdirs="$KDEDIR/lib${kdelibsuff} $KDEDIR $kde_libdirs" +kde_libdirs="$ac_kde_libraries $libdir $kde_libdirs" +AC_FIND_FILE($kde_check_lib, $kde_libdirs, kde_libdir) +ac_kde_libraries="$kde_libdir" + +kde_widgetdir=NO +dnl this might be somewhere else +AC_FIND_FILE("kde3/plugins/designer/kdewidgets.la", $kde_libdirs, kde_widgetdir) + +if test -n "$ac_kde_libraries" && test ! -r "$ac_kde_libraries/$kde_check_lib"; then +AC_MSG_ERROR([ +in the prefix, you've chosen, are no KDE libraries installed. This will fail. +So, check this please and use another prefix!]) +fi + +if test -n "$kde_widgetdir" && test ! -r "$kde_widgetdir/kde3/plugins/designer/kdewidgets.la"; then +AC_MSG_ERROR([ +I can't find the designer plugins. These are required and should have been installed +by kdelibs]) +fi + +if test -n "$kde_widgetdir"; then + kde_widgetdir="$kde_widgetdir/kde3/plugins/designer" +fi + + +if test "$ac_kde_includes" = NO || test "$ac_kde_libraries" = NO || test "$kde_widgetdir" = NO; then + ac_cv_have_kde="have_kde=no" +else + ac_cv_have_kde="have_kde=yes \ + ac_kde_includes=$ac_kde_includes ac_kde_libraries=$ac_kde_libraries" +fi + +else dnl test -z $1, e.g. from kdelibs + + ac_cv_have_kde="have_kde=no" + +fi +])dnl + +eval "$ac_cv_have_kde" + +if test "$have_kde" != "yes"; then + if test "${prefix}" = NONE; then + ac_kde_prefix="$ac_default_prefix" + else + ac_kde_prefix="$prefix" + fi + if test "$exec_prefix" = NONE; then + ac_kde_exec_prefix="$ac_kde_prefix" + AC_MSG_RESULT([will be installed in $ac_kde_prefix]) + else + ac_kde_exec_prefix="$exec_prefix" + AC_MSG_RESULT([will be installed in $ac_kde_prefix and $ac_kde_exec_prefix]) + fi + + kde_libraries="${libdir}" + kde_includes="${includedir}" + +else + ac_cv_have_kde="have_kde=yes \ + ac_kde_includes=$ac_kde_includes ac_kde_libraries=$ac_kde_libraries" + AC_MSG_RESULT([libraries $ac_kde_libraries, headers $ac_kde_includes]) + + kde_libraries="$ac_kde_libraries" + kde_includes="$ac_kde_includes" +fi +AC_SUBST(kde_libraries) +AC_SUBST(kde_includes) + +if test "$kde_includes" = "$x_includes" || test "$kde_includes" = "$qt_includes" || test "$kde_includes" = "/usr/include"; then + KDE_INCLUDES="" +else + KDE_INCLUDES="-I$kde_includes" + all_includes="$KDE_INCLUDES $all_includes" +fi + +KDE_DEFAULT_CXXFLAGS="-DQT_CLEAN_NAMESPACE -DQT_NO_ASCII_CAST -DQT_NO_STL -DQT_NO_COMPAT -DQT_NO_TRANSLATION" + +KDE_LDFLAGS="-L$kde_libraries" +if test ! "$kde_libraries" = "$x_libraries" && test ! "$kde_libraries" = "$qt_libraries" ; then + all_libraries="$KDE_LDFLAGS $all_libraries" +fi + +AC_SUBST(KDE_LDFLAGS) +AC_SUBST(KDE_INCLUDES) + +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + +all_libraries="$all_libraries $USER_LDFLAGS" +all_includes="$all_includes $USER_INCLUDES" +AC_SUBST(all_includes) +AC_SUBST(all_libraries) + +if test -z "$1"; then +KDE_CHECK_UIC_PLUGINS +fi + +ac_kde_libraries="$kde_libdir" + +AC_SUBST(AUTODIRS) + + +]) + +AC_DEFUN([KDE_CHECK_EXTRA_LIBS], +[ +AC_MSG_CHECKING(for extra includes) +AC_ARG_WITH(extra-includes,AC_HELP_STRING([--with-extra-includes=DIR],[adds non standard include paths]), + kde_use_extra_includes="$withval", + kde_use_extra_includes=NONE +) +kde_extra_includes= +if test -n "$kde_use_extra_includes" && \ + test "$kde_use_extra_includes" != "NONE"; then + + ac_save_ifs=$IFS + IFS=':' + for dir in $kde_use_extra_includes; do + kde_extra_includes="$kde_extra_includes $dir" + USER_INCLUDES="$USER_INCLUDES -I$dir" + done + IFS=$ac_save_ifs + kde_use_extra_includes="added" +else + kde_use_extra_includes="no" +fi +AC_SUBST(USER_INCLUDES) + +AC_MSG_RESULT($kde_use_extra_includes) + +kde_extra_libs= +AC_MSG_CHECKING(for extra libs) +AC_ARG_WITH(extra-libs,AC_HELP_STRING([--with-extra-libs=DIR],[adds non standard library paths]), + kde_use_extra_libs=$withval, + kde_use_extra_libs=NONE +) +if test -n "$kde_use_extra_libs" && \ + test "$kde_use_extra_libs" != "NONE"; then + + ac_save_ifs=$IFS + IFS=':' + for dir in $kde_use_extra_libs; do + kde_extra_libs="$kde_extra_libs $dir" + KDE_EXTRA_RPATH="$KDE_EXTRA_RPATH -R $dir" + USER_LDFLAGS="$USER_LDFLAGS -L$dir" + done + IFS=$ac_save_ifs + kde_use_extra_libs="added" +else + kde_use_extra_libs="no" +fi + +AC_SUBST(USER_LDFLAGS) + +AC_MSG_RESULT($kde_use_extra_libs) + +]) + +AC_DEFUN([KDE_1_CHECK_PATH_HEADERS], +[ + AC_MSG_CHECKING([for KDE headers installed]) + AC_LANG_SAVE + AC_LANG_CPLUSPLUS +cat > conftest.$ac_ext < +#endif +#include +#include "confdefs.h" +#include + +int main() { + printf("kde_htmldir=\\"%s\\"\n", KApplication::kde_htmldir().data()); + printf("kde_appsdir=\\"%s\\"\n", KApplication::kde_appsdir().data()); + printf("kde_icondir=\\"%s\\"\n", KApplication::kde_icondir().data()); + printf("kde_sounddir=\\"%s\\"\n", KApplication::kde_sounddir().data()); + printf("kde_datadir=\\"%s\\"\n", KApplication::kde_datadir().data()); + printf("kde_locale=\\"%s\\"\n", KApplication::kde_localedir().data()); + printf("kde_cgidir=\\"%s\\"\n", KApplication::kde_cgidir().data()); + printf("kde_confdir=\\"%s\\"\n", KApplication::kde_configdir().data()); + printf("kde_mimedir=\\"%s\\"\n", KApplication::kde_mimedir().data()); + printf("kde_toolbardir=\\"%s\\"\n", KApplication::kde_toolbardir().data()); + printf("kde_wallpaperdir=\\"%s\\"\n", + KApplication::kde_wallpaperdir().data()); + printf("kde_bindir=\\"%s\\"\n", KApplication::kde_bindir().data()); + printf("kde_partsdir=\\"%s\\"\n", KApplication::kde_partsdir().data()); + printf("kde_servicesdir=\\"/tmp/dummy\\"\n"); + printf("kde_servicetypesdir=\\"/tmp/dummy\\"\n"); + printf("kde_moduledir=\\"/tmp/dummy\\"\n"); + printf("kde_styledir=\\"/tmp/dummy\\"\n"); + printf("kde_widgetdir=\\"/tmp/dummy\\"\n"); + printf("xdg_appsdir=\\"/tmp/dummy\\"\n"); + printf("xdg_menudir=\\"/tmp/dummy\\"\n"); + printf("xdg_directorydir=\\"/tmp/dummy\\"\n"); + printf("kde_kcfgdir=\\"/tmp/dummy\\"\n"); + return 0; + } +EOF + + ac_save_CPPFLAGS=$CPPFLAGS + CPPFLAGS="$all_includes $CPPFLAGS" + if AC_TRY_EVAL(ac_compile); then + AC_MSG_RESULT(yes) + else + AC_MSG_ERROR([your system is not able to compile a small KDE application! +Check, if you installed the KDE header files correctly. +For more details about this problem, look at the end of config.log.]) + fi + CPPFLAGS=$ac_save_CPPFLAGS + + AC_LANG_RESTORE +]) + +AC_DEFUN([KDE_CHECK_KDEQTADDON], +[ +AC_MSG_CHECKING(for kde-qt-addon) +AC_CACHE_VAL(kde_cv_have_kdeqtaddon, +[ + kde_ldflags_safe="$LDFLAGS" + kde_libs_safe="$LIBS" + kde_cxxflags_safe="$CXXFLAGS" + + LIBS="-lkde-qt-addon $LIBQT $LIBS" + CXXFLAGS="$CXXFLAGS -I$prefix/include -I$prefix/include/kde $all_includes" + LDFLAGS="$LDFLAGS $all_libraries $USER_LDFLAGS" + + AC_TRY_LINK([ + #include + ], + [ + QDomDocument doc; + ], + kde_cv_have_kdeqtaddon=yes, + kde_cv_have_kdeqtaddon=no + ) + + LDFLAGS=$kde_ldflags_safe + LIBS=$kde_libs_safe + CXXFLAGS=$kde_cxxflags_safe +]) + +AC_MSG_RESULT($kde_cv_have_kdeqtaddon) + +if test "$kde_cv_have_kdeqtaddon" = "no"; then + AC_MSG_ERROR([Can't find libkde-qt-addon. You need to install it first. +It is a separate package (and CVS module) named kde-qt-addon.]) +fi +]) + +AC_DEFUN([KDE_CREATE_LIBS_ALIASES], +[ + AC_REQUIRE([KDE_MISC_TESTS]) + AC_REQUIRE([KDE_CHECK_LIBDL]) + AC_REQUIRE([K_PATH_X]) + +if test $kde_qtver = 3; then + case $host in + *cygwin*) lib_kded="-lkdeinit_kded" ;; + *) lib_kded="" ;; + esac + AC_SUBST(LIB_KDED, $lib_kded) + AC_SUBST(LIB_KDECORE, "-lkdecore") + AC_SUBST(LIB_KDEUI, "-lkdeui") + AC_SUBST(LIB_KIO, "-lkio") + AC_SUBST(LIB_KJS, "-lkjs") + AC_SUBST(LIB_SMB, "-lsmb") + AC_SUBST(LIB_KAB, "-lkab") + AC_SUBST(LIB_KABC, "-lkabc") + AC_SUBST(LIB_KHTML, "-lkhtml") + AC_SUBST(LIB_KSPELL, "-lkspell") + AC_SUBST(LIB_KPARTS, "-lkparts") + AC_SUBST(LIB_KDEPRINT, "-lkdeprint") + AC_SUBST(LIB_KUTILS, "-lkutils") + AC_SUBST(LIB_KDEPIM, "-lkdepim") + AC_SUBST(LIB_KIMPROXY, "-lkimproxy") + AC_SUBST(LIB_KNEWSTUFF, "-lknewstuff") + AC_SUBST(LIB_KDNSSD, "-lkdnssd") + AC_SUBST(LIB_KUNITTEST, "-lkunittest") +# these are for backward compatibility + AC_SUBST(LIB_KSYCOCA, "-lkio") + AC_SUBST(LIB_KFILE, "-lkio") +elif test $kde_qtver = 2; then + AC_SUBST(LIB_KDECORE, "-lkdecore") + AC_SUBST(LIB_KDEUI, "-lkdeui") + AC_SUBST(LIB_KIO, "-lkio") + AC_SUBST(LIB_KSYCOCA, "-lksycoca") + AC_SUBST(LIB_SMB, "-lsmb") + AC_SUBST(LIB_KFILE, "-lkfile") + AC_SUBST(LIB_KAB, "-lkab") + AC_SUBST(LIB_KHTML, "-lkhtml") + AC_SUBST(LIB_KSPELL, "-lkspell") + AC_SUBST(LIB_KPARTS, "-lkparts") + AC_SUBST(LIB_KDEPRINT, "-lkdeprint") +else + AC_SUBST(LIB_KDECORE, "-lkdecore -lXext $(LIB_QT)") + AC_SUBST(LIB_KDEUI, "-lkdeui $(LIB_KDECORE)") + AC_SUBST(LIB_KFM, "-lkfm $(LIB_KDECORE)") + AC_SUBST(LIB_KFILE, "-lkfile $(LIB_KFM) $(LIB_KDEUI)") + AC_SUBST(LIB_KAB, "-lkab $(LIB_KIMGIO) $(LIB_KDECORE)") +fi +]) + +AC_DEFUN([AC_PATH_KDE], +[ + AC_BASE_PATH_KDE + AC_ARG_ENABLE(path-check,AC_HELP_STRING([--disable-path-check],[don't try to find out, where to install]), + [ + if test "$enableval" = "no"; + then ac_use_path_checking="default" + else ac_use_path_checking="" + fi + ], + [ + if test "$kde_qtver" = 1; + then ac_use_path_checking="" + else ac_use_path_checking="default" + fi + ] + ) + + AC_CREATE_KFSSTND($ac_use_path_checking) + + AC_SUBST_KFSSTND + KDE_CREATE_LIBS_ALIASES +]) + +dnl KDE_CHECK_FUNC_EXT(, [headers], [sample-use], [C prototype], [autoheader define], [call if found]) +AC_DEFUN([KDE_CHECK_FUNC_EXT], +[ +AC_MSG_CHECKING(for $1) +AC_CACHE_VAL(kde_cv_func_$1, +[ +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +save_CXXFLAGS="$CXXFLAGS" +kde_safe_LIBS="$LIBS" +LIBS="$LIBS $X_EXTRA_LIBS" +if test "$GXX" = "yes"; then +CXXFLAGS="$CXXFLAGS -pedantic-errors" +fi +AC_TRY_COMPILE([ +$2 +], +[ +$3 +], +kde_cv_func_$1=yes, +kde_cv_func_$1=no) +CXXFLAGS="$save_CXXFLAGS" +LIBS="$kde_safe_LIBS" +AC_LANG_RESTORE +]) + +AC_MSG_RESULT($kde_cv_func_$1) + +AC_MSG_CHECKING([if $1 needs custom prototype]) +AC_CACHE_VAL(kde_cv_proto_$1, +[ +if test "x$kde_cv_func_$1" = xyes; then + kde_cv_proto_$1=no +else + case "$1" in + setenv|unsetenv|usleep|random|srandom|seteuid|mkstemps|mkstemp|revoke|vsnprintf|strlcpy|strlcat) + kde_cv_proto_$1="yes - in libkdefakes" + ;; + *) + kde_cv_proto_$1=unknown + ;; + esac +fi + +if test "x$kde_cv_proto_$1" = xunknown; then + +AC_LANG_SAVE +AC_LANG_CPLUSPLUS + kde_safe_libs=$LIBS + LIBS="$LIBS $X_EXTRA_LIBS" + AC_TRY_LINK([ +$2 + +extern "C" $4; +], +[ +$3 +], +[ kde_cv_func_$1=yes + kde_cv_proto_$1=yes ], + [kde_cv_proto_$1="$1 unavailable"] +) +LIBS=$kde_safe_libs +AC_LANG_RESTORE +fi +]) +AC_MSG_RESULT($kde_cv_proto_$1) + +if test "x$kde_cv_func_$1" = xyes; then + AC_DEFINE(HAVE_$5, 1, [Define if you have $1]) + $6 +fi +if test "x$kde_cv_proto_$1" = xno; then + AC_DEFINE(HAVE_$5_PROTO, 1, + [Define if you have the $1 prototype]) +fi + +AH_VERBATIM([_HAVE_$5_PROTO], +[ +#if !defined(HAVE_$5_PROTO) +#ifdef __cplusplus +extern "C" { +#endif +$4; +#ifdef __cplusplus +} +#endif +#endif +]) +]) + +AC_DEFUN([AC_CHECK_SETENV], +[ + KDE_CHECK_FUNC_EXT(setenv, [ +#include +], + [setenv("VAR", "VALUE", 1);], + [int setenv (const char *, const char *, int)], + [SETENV]) +]) + +AC_DEFUN([AC_CHECK_UNSETENV], +[ + KDE_CHECK_FUNC_EXT(unsetenv, [ +#include +], + [unsetenv("VAR");], + [void unsetenv (const char *)], + [UNSETENV]) +]) + +AC_DEFUN([AC_CHECK_GETDOMAINNAME], +[ + KDE_CHECK_FUNC_EXT(getdomainname, [ +#include +#include +#include +], + [ +char buffer[200]; +getdomainname(buffer, 200); +], + [#include + int getdomainname (char *, size_t)], + [GETDOMAINNAME]) +]) + +AC_DEFUN([AC_CHECK_GETHOSTNAME], +[ + KDE_CHECK_FUNC_EXT(gethostname, [ +#include +#include +], + [ +char buffer[200]; +gethostname(buffer, 200); +], + [int gethostname (char *, unsigned int)], + [GETHOSTNAME]) +]) + +AC_DEFUN([AC_CHECK_USLEEP], +[ + KDE_CHECK_FUNC_EXT(usleep, [ +#include +], + [ +usleep(200); +], + [int usleep (unsigned int)], + [USLEEP]) +]) + + +AC_DEFUN([AC_CHECK_RANDOM], +[ + KDE_CHECK_FUNC_EXT(random, [ +#include +], + [ +random(); +], + [long int random(void)], + [RANDOM]) + + KDE_CHECK_FUNC_EXT(srandom, [ +#include +], + [ +srandom(27); +], + [void srandom(unsigned int)], + [SRANDOM]) + +]) + +AC_DEFUN([AC_CHECK_INITGROUPS], +[ + KDE_CHECK_FUNC_EXT(initgroups, [ +#include +#include +#include +], + [ +char buffer[200]; +initgroups(buffer, 27); +], + [int initgroups(const char *, gid_t)], + [INITGROUPS]) +]) + +AC_DEFUN([AC_CHECK_MKSTEMPS], +[ + KDE_CHECK_FUNC_EXT(mkstemps, [ +#include +#include +], + [ +mkstemps("/tmp/aaaXXXXXX", 6); +], + [int mkstemps(char *, int)], + [MKSTEMPS]) +]) + +AC_DEFUN([AC_CHECK_MKSTEMP], +[ + KDE_CHECK_FUNC_EXT(mkstemp, [ +#include +#include +], + [ +mkstemp("/tmp/aaaXXXXXX"); +], + [int mkstemp(char *)], + [MKSTEMP]) +]) + +AC_DEFUN([AC_CHECK_MKDTEMP], +[ + KDE_CHECK_FUNC_EXT(mkdtemp, [ +#include +#include +], + [ +mkdtemp("/tmp/aaaXXXXXX"); +], + [char *mkdtemp(char *)], + [MKDTEMP]) +]) + + +AC_DEFUN([AC_CHECK_RES_INIT], +[ + AC_MSG_CHECKING([if res_init needs -lresolv]) + kde_libs_safe="$LIBS" + LIBS="$LIBS $X_EXTRA_LIBS -lresolv" + AC_TRY_LINK( + [ +#include +#include +#include +#include + ], + [ + res_init(); + ], + [ + LIBRESOLV="-lresolv" + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_RES_INIT, 1, [Define if you have the res_init function]) + ], + [ AC_MSG_RESULT(no) ] + ) + LIBS=$kde_libs_safe + AC_SUBST(LIBRESOLV) + + KDE_CHECK_FUNC_EXT(res_init, + [ +#include +#include +#include +#include + ], + [res_init()], + [int res_init(void)], + [RES_INIT]) +]) + +AC_DEFUN([AC_CHECK_STRLCPY], +[ + KDE_CHECK_FUNC_EXT(strlcpy, [ +#include +], +[ char buf[20]; + strlcpy(buf, "KDE function test", sizeof(buf)); +], + [unsigned long strlcpy(char*, const char*, unsigned long)], + [STRLCPY]) +]) + +AC_DEFUN([AC_CHECK_STRLCAT], +[ + KDE_CHECK_FUNC_EXT(strlcat, [ +#include +], +[ char buf[20]; + buf[0]='\0'; + strlcat(buf, "KDE function test", sizeof(buf)); +], + [unsigned long strlcat(char*, const char*, unsigned long)], + [STRLCAT]) +]) + +AC_DEFUN([AC_CHECK_RES_QUERY], +[ + KDE_CHECK_FUNC_EXT(res_query, [ +#include +#include +#include +#include +#include +], +[ +res_query(NULL, 0, 0, NULL, 0); +], + [int res_query(const char *, int, int, unsigned char *, int)], + [RES_QUERY]) +]) + +AC_DEFUN([AC_CHECK_DN_SKIPNAME], +[ + KDE_CHECK_FUNC_EXT(dn_skipname, [ +#include +#include +#include +#include +], +[ +dn_skipname (NULL, NULL); +], + [int dn_skipname (unsigned char *, unsigned char *)], + [DN_SKIPNAME]) +]) + + +AC_DEFUN([AC_FIND_GIF], + [AC_MSG_CHECKING([for giflib]) +AC_CACHE_VAL(ac_cv_lib_gif, +[ac_save_LIBS="$LIBS" +if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then +LIBS="$all_libraries -lgif -lX11 $LIBSOCKET" +else +LIBS="$all_libraries -lgif" +fi +AC_TRY_LINK(dnl +[ +#ifdef __cplusplus +extern "C" { +#endif +int GifLastError(void); +#ifdef __cplusplus +} +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +], + [return GifLastError();], + eval "ac_cv_lib_gif=yes", + eval "ac_cv_lib_gif=no") +LIBS="$ac_save_LIBS" +])dnl +if eval "test \"`echo $ac_cv_lib_gif`\" = yes"; then + AC_MSG_RESULT(yes) + AC_DEFINE_UNQUOTED(HAVE_LIBGIF, 1, [Define if you have libgif]) +else + AC_MSG_ERROR(You need giflib30. Please install the kdesupport package) +fi +]) + +AC_DEFUN([KDE_FIND_JPEG_HELPER], +[ +AC_MSG_CHECKING([for libjpeg$2]) +AC_CACHE_VAL(ac_cv_lib_jpeg_$1, +[ +ac_save_LIBS="$LIBS" +LIBS="$all_libraries $USER_LDFLAGS -ljpeg$2 -lm" +ac_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" +AC_TRY_LINK( +[ +#ifdef __cplusplus +extern "C" { +#endif +void jpeg_CreateDecompress(); +#ifdef __cplusplus +} +#endif +], +[jpeg_CreateDecompress();], + eval "ac_cv_lib_jpeg_$1=-ljpeg$2", + eval "ac_cv_lib_jpeg_$1=no") +LIBS="$ac_save_LIBS" +CFLAGS="$ac_save_CFLAGS" +]) + +if eval "test ! \"`echo $ac_cv_lib_jpeg_$1`\" = no"; then + LIBJPEG="$ac_cv_lib_jpeg_$1" + AC_MSG_RESULT($ac_cv_lib_jpeg_$1) +else + AC_MSG_RESULT(no) + $3 +fi + +]) + +AC_DEFUN([AC_FIND_JPEG], +[ +dnl first look for libraries +KDE_FIND_JPEG_HELPER(6b, 6b, + KDE_FIND_JPEG_HELPER(normal, [], + [ + LIBJPEG= + ] + ) +) + +dnl then search the headers (can't use simply AC_TRY_xxx, as jpeglib.h +dnl requires system dependent includes loaded before it) +jpeg_incdirs="$includedir /usr/include /usr/local/include $kde_extra_includes" +AC_FIND_FILE(jpeglib.h, $jpeg_incdirs, jpeg_incdir) +test "x$jpeg_incdir" = xNO && jpeg_incdir= + +dnl if headers _and_ libraries are missing, this is no error, and we +dnl continue with a warning (the user will get no jpeg support in khtml) +dnl if only one is missing, it means a configuration error, but we still +dnl only warn +if test -n "$jpeg_incdir" && test -n "$LIBJPEG" ; then + AC_DEFINE_UNQUOTED(HAVE_LIBJPEG, 1, [Define if you have libjpeg]) +else + if test -n "$jpeg_incdir" || test -n "$LIBJPEG" ; then + AC_MSG_WARN([ +There is an installation error in jpeg support. You seem to have only one +of either the headers _or_ the libraries installed. You may need to either +provide correct --with-extra-... options, or the development package of +libjpeg6b. You can get a source package of libjpeg from http://www.ijg.org/ +Disabling JPEG support. +]) + else + AC_MSG_WARN([libjpeg not found. disable JPEG support.]) + fi + jpeg_incdir= + LIBJPEG= +fi + +AC_SUBST(LIBJPEG) +AH_VERBATIM(_AC_CHECK_JPEG, +[/* + * jpeg.h needs HAVE_BOOLEAN, when the system uses boolean in system + * headers and I'm too lazy to write a configure test as long as only + * unixware is related + */ +#ifdef _UNIXWARE +#define HAVE_BOOLEAN +#endif +]) +]) + +AC_DEFUN([KDE_CHECK_QT_JPEG], +[ +if test -n "$LIBJPEG"; then +AC_MSG_CHECKING([if Qt needs $LIBJPEG]) +AC_CACHE_VAL(kde_cv_qt_jpeg, +[ +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +ac_save_LIBS="$LIBS" +LIBS="$all_libraries $USER_LDFLAGS $LIBQT" +LIBS=`echo $LIBS | sed "s/$LIBJPEG//"` +ac_save_CXXFLAGS="$CXXFLAGS" +CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES" +AC_TRY_LINK( +[#include ], + [ + int argc; + char** argv; + QApplication app(argc, argv);], + eval "kde_cv_qt_jpeg=no", + eval "kde_cv_qt_jpeg=yes") +LIBS="$ac_save_LIBS" +CXXFLAGS="$ac_save_CXXFLAGS" +AC_LANG_RESTORE +fi +]) + +if eval "test ! \"`echo $kde_cv_qt_jpeg`\" = no"; then + AC_MSG_RESULT(yes) + LIBJPEG_QT='$(LIBJPEG)' +else + AC_MSG_RESULT(no) + LIBJPEG_QT= +fi + +]) + +AC_DEFUN([AC_FIND_ZLIB], +[ +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) +AC_MSG_CHECKING([for libz]) +AC_CACHE_VAL(ac_cv_lib_z, +[ +kde_save_LIBS="$LIBS" +LIBS="$all_libraries $USER_LDFLAGS -lz $LIBSOCKET" +kde_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" +AC_TRY_LINK(dnl +[ +#include +], +[ + char buf[42]; + gzFile f = (gzFile) 0; + /* this would segfault.. but we only link, don't run */ + (void) gzgets(f, buf, sizeof(buf)); + + return (zlibVersion() == ZLIB_VERSION); +], + eval "ac_cv_lib_z='-lz'", + eval "ac_cv_lib_z=no") +LIBS="$kde_save_LIBS" +CFLAGS="$kde_save_CFLAGS" +])dnl +if test ! "$ac_cv_lib_z" = no; then + AC_DEFINE_UNQUOTED(HAVE_LIBZ, 1, [Define if you have libz]) + LIBZ="$ac_cv_lib_z" + AC_MSG_RESULT($ac_cv_lib_z) +else + AC_MSG_ERROR(not found. + Possibly configure picks up an outdated version + installed by XFree86. Remove it from your system. + + Check your installation and look into config.log) + LIBZ="" +fi +AC_SUBST(LIBZ) +]) + +AC_DEFUN([KDE_TRY_TIFFLIB], +[ +AC_MSG_CHECKING([for libtiff $1]) + +AC_CACHE_VAL(kde_cv_libtiff_$1, +[ +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +kde_save_LIBS="$LIBS" +if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then +LIBS="$all_libraries $USER_LDFLAGS -l$1 $LIBJPEG $LIBZ -lX11 $LIBSOCKET -lm" +else +LIBS="$all_libraries $USER_LDFLAGS -l$1 $LIBJPEG $LIBZ -lm" +fi +kde_save_CXXFLAGS="$CXXFLAGS" +CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES" + +AC_TRY_LINK(dnl +[ +#include +], + [return (TIFFOpen( "", "r") == 0); ], +[ + kde_cv_libtiff_$1="-l$1 $LIBJPEG $LIBZ" +], [ + kde_cv_libtiff_$1=no +]) + +LIBS="$kde_save_LIBS" +CXXFLAGS="$kde_save_CXXFLAGS" +AC_LANG_RESTORE +]) + +if test "$kde_cv_libtiff_$1" = "no"; then + AC_MSG_RESULT(no) + LIBTIFF="" + $3 +else + LIBTIFF="$kde_cv_libtiff_$1" + AC_MSG_RESULT(yes) + AC_DEFINE_UNQUOTED(HAVE_LIBTIFF, 1, [Define if you have libtiff]) + $2 +fi + +]) + +AC_DEFUN([AC_FIND_TIFF], +[ +AC_REQUIRE([K_PATH_X]) +AC_REQUIRE([AC_FIND_ZLIB]) +AC_REQUIRE([AC_FIND_JPEG]) +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + +KDE_TRY_TIFFLIB(tiff, [], + KDE_TRY_TIFFLIB(tiff34)) + +AC_SUBST(LIBTIFF) +]) + +AC_DEFUN([KDE_FIND_LIBEXR], +[ +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) +AC_REQUIRE([AC_FIND_ZLIB]) +AC_CACHE_VAL(ac_cv_libexr, +[ + if test -z "$PKG_CONFIG"; then + AC_PATH_PROG(PKG_CONFIG, pkg-config, no) + fi + + AC_MSG_CHECKING([for OpenEXR libraries]) + + if test "$PKG_CONFIG" = "no" ; then + AC_MSG_RESULT(no) + echo "*** The pkg-config script could not be found. Make sure it is" + echo "*** in your path, or set the PKG_CONFIG environment variable" + echo "*** to the full path to pkg-config." + echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config." + else + if !(`$PKG_CONFIG --exists OpenEXR`) ; then + AC_MSG_RESULT(no) + EXRSTATUS=no + else + if !(`$PKG_CONFIG --atleast-version="1.1.1" OpenEXR`) ; then + AC_MSG_RESULT(no) + EXRSTATUS=old + else + kde_save_LIBS="$LIBS" + LIBS="$LIBS $all_libraries $USER_LDFLAGS $LIBZ `pkg-config --libs OpenEXR`" + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + kde_save_CXXFLAGS="$CXXFLAGS" + EXR_FLAGS=`$PKG_CONFIG --cflags OpenEXR` + CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES $EXR_FLAGS" + + AC_TRY_LINK(dnl + [ + #include + ], + [ + using namespace Imf; + RgbaInputFile file ("dummy"); + return 0; + ], + eval "ac_cv_libexr='`pkg-config --libs OpenEXR`'", + eval "ac_cv_libexr=no" + ) + LIBS="$kde_save_LIBS" + CXXFLAGS="$kde_save_CXXFLAGS" + AC_LANG_RESTORE + ])dnl + if eval "test ! \"`echo $ac_cv_libexr`\" = no"; then + AC_DEFINE_UNQUOTED(HAVE_EXR, 1, [Define if you have OpenEXR]) + LIB_EXR="$ac_cv_libexr" + AC_MSG_RESULT($ac_cv_libexr) + else + AC_MSG_RESULT(no) + LIB_EXR="" + fi + fi + fi + fi + AC_SUBST(LIB_EXR) + AC_SUBST(EXR_FLAGS) +]) + + + +AC_DEFUN([AC_FIND_PNG], +[ +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) +AC_REQUIRE([AC_FIND_ZLIB]) +AC_MSG_CHECKING([for libpng]) +AC_CACHE_VAL(ac_cv_lib_png, +[ +kde_save_LIBS="$LIBS" +if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then +LIBS="$LIBS $all_libraries $USER_LDFLAGS -lpng $LIBZ -lm -lX11 $LIBSOCKET" +else +LIBS="$LIBS $all_libraries $USER_LDFLAGS -lpng $LIBZ -lm" +fi +kde_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" + +AC_TRY_LINK(dnl + [ + #include + ], + [ + png_structp png_ptr = png_create_read_struct( /* image ptr */ + PNG_LIBPNG_VER_STRING, 0, 0, 0 ); + return( png_ptr != 0 ); + ], + eval "ac_cv_lib_png='-lpng $LIBZ -lm'", + eval "ac_cv_lib_png=no" +) +LIBS="$kde_save_LIBS" +CFLAGS="$kde_save_CFLAGS" +])dnl +if eval "test ! \"`echo $ac_cv_lib_png`\" = no"; then + AC_DEFINE_UNQUOTED(HAVE_LIBPNG, 1, [Define if you have libpng]) + LIBPNG="$ac_cv_lib_png" + AC_SUBST(LIBPNG) + AC_MSG_RESULT($ac_cv_lib_png) +else + AC_MSG_RESULT(no) + LIBPNG="" + AC_SUBST(LIBPNG) +fi +]) + + +AC_DEFUN([AC_FIND_JASPER], +[ +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) +AC_REQUIRE([AC_FIND_JPEG]) +AC_MSG_CHECKING([for jasper]) +AC_CACHE_VAL(ac_cv_jasper, +[ +kde_save_LIBS="$LIBS" +LIBS="$LIBS $all_libraries $USER_LDFLAGS -ljasper $LIBJPEG -lm" +kde_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" + +AC_TRY_LINK(dnl + [ + #include + ], + [ + return( jas_init() ); + ], + eval "ac_cv_jasper='-ljasper $LIBJPEG -lm'", + eval "ac_cv_jasper=no" +) +LIBS="$kde_save_LIBS" +CFLAGS="$kde_save_CFLAGS" +])dnl +if eval "test ! \"`echo $ac_cv_jasper`\" = no"; then + AC_DEFINE_UNQUOTED(HAVE_JASPER, 1, [Define if you have jasper]) + LIB_JASPER="$ac_cv_jasper" + AC_MSG_RESULT($ac_cv_jasper) +else + AC_MSG_RESULT(no) + LIB_JASPER="" +fi +AC_SUBST(LIB_JASPER) +]) + +AC_DEFUN([AC_CHECK_BOOL], +[ + AC_DEFINE_UNQUOTED(HAVE_BOOL, 1, [You _must_ have bool]) +]) + +AC_DEFUN([AC_CHECK_GNU_EXTENSIONS], +[ +AC_MSG_CHECKING(if you need GNU extensions) +AC_CACHE_VAL(ac_cv_gnu_extensions, +[ +cat > conftest.c << EOF +#include + +#ifdef __GNU_LIBRARY__ +yes +#endif +EOF + +if (eval "$ac_cpp conftest.c") 2>&5 | + egrep "yes" >/dev/null 2>&1; then + rm -rf conftest* + ac_cv_gnu_extensions=yes +else + ac_cv_gnu_extensions=no +fi +]) + +AC_MSG_RESULT($ac_cv_gnu_extensions) +if test "$ac_cv_gnu_extensions" = "yes"; then + AC_DEFINE_UNQUOTED(_GNU_SOURCE, 1, [Define if you need to use the GNU extensions]) +fi +]) + +AC_DEFUN([KDE_CHECK_COMPILER_FLAG], +[ +AC_MSG_CHECKING([whether $CXX supports -$1]) +kde_cache=`echo $1 | sed 'y% .=/+-,%____p__%'` +AC_CACHE_VAL(kde_cv_prog_cxx_$kde_cache, +[ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + save_CXXFLAGS="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS -$1" + AC_TRY_LINK([],[ return 0; ], [eval "kde_cv_prog_cxx_$kde_cache=yes"], []) + CXXFLAGS="$save_CXXFLAGS" + AC_LANG_RESTORE +]) +if eval "test \"`echo '$kde_cv_prog_cxx_'$kde_cache`\" = yes"; then + AC_MSG_RESULT(yes) + : + $2 +else + AC_MSG_RESULT(no) + : + $3 +fi +]) + +AC_DEFUN([KDE_CHECK_C_COMPILER_FLAG], +[ +AC_MSG_CHECKING([whether $CC supports -$1]) +kde_cache=`echo $1 | sed 'y% .=/+-,%____p__%'` +AC_CACHE_VAL(kde_cv_prog_cc_$kde_cache, +[ + AC_LANG_SAVE + AC_LANG_C + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -$1" + AC_TRY_LINK([],[ return 0; ], [eval "kde_cv_prog_cc_$kde_cache=yes"], []) + CFLAGS="$save_CFLAGS" + AC_LANG_RESTORE +]) +if eval "test \"`echo '$kde_cv_prog_cc_'$kde_cache`\" = yes"; then + AC_MSG_RESULT(yes) + : + $2 +else + AC_MSG_RESULT(no) + : + $3 +fi +]) + + +dnl AC_REMOVE_FORBIDDEN removes forbidden arguments from variables +dnl use: AC_REMOVE_FORBIDDEN(CC, [-forbid -bad-option whatever]) +dnl it's all white-space separated +AC_DEFUN([AC_REMOVE_FORBIDDEN], +[ __val=$$1 + __forbid=" $2 " + if test -n "$__val"; then + __new="" + ac_save_IFS=$IFS + IFS=" " + for i in $__val; do + case "$__forbid" in + *" $i "*) AC_MSG_WARN([found forbidden $i in $1, removing it]) ;; + *) # Careful to not add spaces, where there were none, because otherwise + # libtool gets confused, if we change e.g. CXX + if test -z "$__new" ; then __new=$i ; else __new="$__new $i" ; fi ;; + esac + done + IFS=$ac_save_IFS + $1=$__new + fi +]) + + +AC_DEFUN([KDE_CHECK_FOR_BAD_COMPILER], +[ + AC_MSG_CHECKING([whether $CC is blacklisted]) + + dnl In theory we have tu run this test against $CC and $CXX + dnl in C and in C++ mode, because its perfectly legal for + dnl the user to mix compiler versions, since C has a defined + dnl ABI. + dnl + dnl For now, we assume the user is not on crack. + + AC_TRY_COMPILE([ +#ifdef __GNUC__ +#if __GNUC__ == 4 && __GNUC_MINOR__ == 0 && __GNUC_PATCHLEVEL__ == 0 +choke me +#endif +#endif +], , + kde_bad_compiler=no, + kde_bad_compiler=yes +) + + AC_MSG_RESULT($kde_bad_compiler) + +if test "$kde_bad_compiler" = "yes"; then + AC_MSG_ERROR([ + +This particular compiler version is blacklisted because it +is known to miscompile KDE. Please use a newer version, or +if that is not yet available, choose an older version. + +Please do not report a bug or bother us reporting this +configure error. We know about it, and we introduced +it by intention to avoid untraceable bugs or crashes in KDE. + +]) +fi + +]) + + +AC_DEFUN([KDE_CHECK_FOR_OPT_NOINLINE_MATCH], +[ + AC_CACHE_CHECK([whether system headers can cope with -O2 -fno-inline], + kde_cv_opt_noinline_match, + [ + kde_cv_opt_noinline_match=irrelevant + dnl if we don't use both -O2 and -fno-inline, this check is moot + if echo "$CFLAGS" | grep -e -O2 >/dev/null 2>/dev/null \ + && echo "$CFLAGS" | grep -e -fno-inline >/dev/null 2>/dev/null ; then + + ac_cflags_save="$CFLAGS" + CFLAGS="$CFLAGS -D_USE_GNU" + + AC_TRY_LINK([ + #include +], [ const char *pt, *et; + et = __extension__ ({ char __a0, __a1, __a2; (__builtin_constant_p ( ";," ) && ((size_t)(const void *)(( ";," )+ 1) - (size_t)(const void *)( ";," ) == 1) ? ((__a0 =((__const char *) ( ";," ))[0], __a0 == '\0') ? ((void) ( pt ),((void *)0) ) : ((__a1 = ((__const char *) ( ";," ))[1], __a1== '\0') ? (__extension__ (__builtin_constant_p ( __a0 ) && ( __a0 ) == '\0' ? (char *) __rawmemchr ( pt , __a0) : strchr( pt , __a0 ))) : ((__a2 = ((__const char *) ( ";," ))[2], __a2 == '\0') ? __strpbrk_c2 ( pt , __a0, __a1) :(((__const char *) ( ";," ))[3] == '\0' ? __strpbrk_c3 ( pt ,__a0, __a1, __a2): strpbrk ( pt , ";," ))))) : strpbrk ( pt , ";," )); }) ; +], + kde_cv_opt_noinline_match=yes, + kde_cv_opt_noinline_match=no + ) + + CFLAGS="$ac_cflags_save" + fi + ]) +]) + + +dnl AC_VALIDIFY_CXXFLAGS checks for forbidden flags the user may have given +AC_DEFUN([AC_VALIDIFY_CXXFLAGS], +[dnl +if test "x$kde_use_qt_emb" != "xyes"; then + AC_REMOVE_FORBIDDEN(CXX, [-fno-rtti -rpath]) + AC_REMOVE_FORBIDDEN(CXXFLAGS, [-fno-rtti -rpath]) +else + AC_REMOVE_FORBIDDEN(CXX, [-rpath]) + AC_REMOVE_FORBIDDEN(CXXFLAGS, [-rpath]) +fi +]) + +AC_DEFUN([AC_CHECK_COMPILERS], +[ + AC_ARG_ENABLE(debug, + AC_HELP_STRING([--enable-debug=ARG],[enables debug symbols (yes|no|full) [default=no]]), + [ + case $enableval in + yes) + kde_use_debug_code="yes" + kde_use_debug_define=no + ;; + full) + kde_use_debug_code="full" + kde_use_debug_define=no + ;; + *) + kde_use_debug_code="no" + kde_use_debug_define=yes + ;; + esac + ], + [kde_use_debug_code="no" + kde_use_debug_define=no + ]) + + dnl Just for configure --help + AC_ARG_ENABLE(dummyoption, + AC_HELP_STRING([--disable-debug], + [disables debug output and debug symbols [default=no]]), + [],[]) + + AC_ARG_ENABLE(strict, + AC_HELP_STRING([--enable-strict], + [compiles with strict compiler options (may not work!)]), + [ + if test $enableval = "no"; then + kde_use_strict_options="no" + else + kde_use_strict_options="yes" + fi + ], [kde_use_strict_options="no"]) + + AC_ARG_ENABLE(warnings,AC_HELP_STRING([--disable-warnings],[disables compilation with -Wall and similar]), + [ + if test $enableval = "no"; then + kde_use_warnings="no" + else + kde_use_warnings="yes" + fi + ], [kde_use_warnings="yes"]) + + dnl enable warnings for debug build + if test "$kde_use_debug_code" != "no"; then + kde_use_warnings=yes + fi + + AC_ARG_ENABLE(profile,AC_HELP_STRING([--enable-profile],[creates profiling infos [default=no]]), + [kde_use_profiling=$enableval], + [kde_use_profiling="no"] + ) + + dnl this prevents stupid AC_PROG_CC to add "-g" to the default CFLAGS + CFLAGS=" $CFLAGS" + + AC_PROG_CC + + AC_PROG_CPP + + if test "$GCC" = "yes"; then + if test "$kde_use_debug_code" != "no"; then + if test $kde_use_debug_code = "full"; then + CFLAGS="-g3 -fno-inline $CFLAGS" + else + CFLAGS="-g -O2 -fno-schedule-insns -fno-inline $CFLAGS" + fi + else + CFLAGS="-O2 $CFLAGS" + fi + fi + + if test "$kde_use_debug_define" = "yes"; then + CFLAGS="-DNDEBUG $CFLAGS" + fi + + + case "$host" in + *-*-sysv4.2uw*) CFLAGS="-D_UNIXWARE $CFLAGS";; + *-*-sysv5uw7*) CFLAGS="-D_UNIXWARE7 $CFLAGS";; + esac + + if test -z "$LDFLAGS" && test "$kde_use_debug_code" = "no" && test "$GCC" = "yes"; then + LDFLAGS="" + fi + + CXXFLAGS=" $CXXFLAGS" + + AC_PROG_CXX + + KDE_CHECK_FOR_BAD_COMPILER + + if test "$GXX" = "yes" || test "$CXX" = "KCC"; then + if test "$kde_use_debug_code" != "no"; then + if test "$CXX" = "KCC"; then + CXXFLAGS="+K0 -Wall -pedantic -W -Wpointer-arith -Wwrite-strings $CXXFLAGS" + else + if test "$kde_use_debug_code" = "full"; then + CXXFLAGS="-g3 -fno-inline $CXXFLAGS" + else + CXXFLAGS="-g -O2 -fno-schedule-insns -fno-inline $CXXFLAGS" + fi + fi + KDE_CHECK_COMPILER_FLAG(fno-builtin,[CXXFLAGS="-fno-builtin $CXXFLAGS"]) + + dnl convenience compiler flags + KDE_CHECK_COMPILER_FLAG(Woverloaded-virtual, [WOVERLOADED_VIRTUAL="-Woverloaded-virtual"], [WOVERLOADED_VRITUAL=""]) + AC_SUBST(WOVERLOADED_VIRTUAL) + else + if test "$CXX" = "KCC"; then + CXXFLAGS="+K3 $CXXFLAGS" + else + CXXFLAGS="-O2 $CXXFLAGS" + fi + fi + fi + + if test "$kde_use_debug_define" = "yes"; then + CXXFLAGS="-DNDEBUG -DNO_DEBUG $CXXFLAGS" + fi + + if test "$kde_use_profiling" = "yes"; then + KDE_CHECK_COMPILER_FLAG(pg, + [ + CFLAGS="-pg $CFLAGS" + CXXFLAGS="-pg $CXXFLAGS" + ]) + fi + + if test "$kde_use_warnings" = "yes"; then + if test "$GCC" = "yes"; then + CXXFLAGS="-Wall -W -Wpointer-arith $CXXFLAGS" + case $host in + *-*-linux-gnu) + CFLAGS="-std=iso9899:1990 -W -Wall -Wchar-subscripts -Wshadow -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -D_XOPEN_SOURCE=500 -D_BSD_SOURCE $CFLAGS" + CXXFLAGS="-ansi -D_XOPEN_SOURCE=500 -D_BSD_SOURCE -Wcast-align -Wconversion -Wchar-subscripts $CXXFLAGS" + KDE_CHECK_COMPILER_FLAG(Wmissing-format-attribute, [CXXFLAGS="$CXXFLAGS -Wformat-security -Wmissing-format-attribute"]) + KDE_CHECK_C_COMPILER_FLAG(Wmissing-format-attribute, [CFLAGS="$CFLAGS -Wformat-security -Wmissing-format-attribute"]) + ;; + esac + KDE_CHECK_COMPILER_FLAG(Wundef,[CXXFLAGS="-Wundef $CXXFLAGS"]) + KDE_CHECK_COMPILER_FLAG(Wno-long-long,[CXXFLAGS="-Wno-long-long $CXXFLAGS"]) + dnl ### FIXME: revert for KDE 4 + KDE_CHECK_COMPILER_FLAG(Wno-non-virtual-dtor,[CXXFLAGS="$CXXFLAGS -Wno-non-virtual-dtor"]) + fi + fi + + if test "$GXX" = "yes" && test "$kde_use_strict_options" = "yes"; then + CXXFLAGS="-Wcast-qual -Wshadow -Wcast-align $CXXFLAGS" + fi + + AC_ARG_ENABLE(pch, + AC_HELP_STRING([--enable-pch], + [enables precompiled header support (currently only KCC or gcc >=3.4+unsermake) [default=no]]), + [ kde_use_pch=$enableval ],[ kde_use_pch=no ]) + + HAVE_GCC_VISIBILITY=0 + AC_SUBST([HAVE_GCC_VISIBILITY]) + + if test "$GXX" = "yes"; then + gcc_no_reorder_blocks=NO + KDE_CHECK_COMPILER_FLAG(fno-reorder-blocks,[gcc_no_reorder_blocks=YES]) + if test $kde_use_debug_code != "no" && \ + test $kde_use_debug_code != "full" && \ + test "YES" = "$gcc_no_reorder_blocks" ; then + CXXFLAGS="$CXXFLAGS -fno-reorder-blocks" + CFLAGS="$CFLAGS -fno-reorder-blocks" + fi + KDE_CHECK_COMPILER_FLAG(fno-exceptions,[CXXFLAGS="$CXXFLAGS -fno-exceptions"]) + KDE_CHECK_COMPILER_FLAG(fno-check-new, [CXXFLAGS="$CXXFLAGS -fno-check-new"]) + KDE_CHECK_COMPILER_FLAG(fno-common, [CXXFLAGS="$CXXFLAGS -fno-common"]) + KDE_CHECK_COMPILER_FLAG(fexceptions, [USE_EXCEPTIONS="-fexceptions"], USE_EXCEPTIONS= ) + ENABLE_PERMISSIVE_FLAG="-fpermissive" + + if test "$kde_use_pch" = "yes"; then + AC_MSG_CHECKING(whether gcc supports precompiling c header files) + echo >conftest.h + if $CC -x c-header conftest.h >/dev/null 2>/dev/null; then + kde_gcc_supports_pch=yes + AC_MSG_RESULT(yes) + else + kde_gcc_supports_pch=no + AC_MSG_RESULT(no) + fi + if test "$kde_gcc_supports_pch" = "yes"; then + AC_MSG_CHECKING(whether gcc supports precompiling c++ header files) + if $CXX -x c++-header conftest.h >/dev/null 2>/dev/null; then + kde_gcc_supports_pch=yes + AC_MSG_RESULT(yes) + else + kde_gcc_supports_pch=no + AC_MSG_RESULT(no) + fi + fi + rm -f conftest.h conftest.h.gch + fi + + KDE_CHECK_FOR_OPT_NOINLINE_MATCH + if test "x$kde_cv_opt_noinline_match" = "xno" ; then + CFLAGS="`echo "$CFLAGS" | sed "s/ -fno-inline//"`" + fi + fi + AM_CONDITIONAL(unsermake_enable_pch, test "$kde_use_pch" = "yes" && test "$kde_gcc_supports_pch" = "yes") + if test "$CXX" = "KCC"; then + dnl unfortunately we currently cannot disable exception support in KCC + dnl because doing so is binary incompatible and Qt by default links with exceptions :-( + dnl KDE_CHECK_COMPILER_FLAG(-no_exceptions,[CXXFLAGS="$CXXFLAGS --no_exceptions"]) + dnl KDE_CHECK_COMPILER_FLAG(-exceptions, [USE_EXCEPTIONS="--exceptions"], USE_EXCEPTIONS= ) + + if test "$kde_use_pch" = "yes"; then + dnl TODO: support --pch-dir! + KDE_CHECK_COMPILER_FLAG(-pch,[CXXFLAGS="$CXXFLAGS --pch"]) + dnl the below works (but the dir must exist), but it's + dnl useless for a whole package. + dnl The are precompiled headers for each source file, so when compiling + dnl from scratch, it doesn't make a difference, and they take up + dnl around ~5Mb _per_ sourcefile. + dnl KDE_CHECK_COMPILER_FLAG(-pch_dir /tmp, + dnl [CXXFLAGS="$CXXFLAGS --pch_dir `pwd`/pcheaders"]) + fi + dnl this flag controls inlining. by default KCC inlines in optimisation mode + dnl all implementations that are defined inside the class {} declaration. + dnl because of templates-compatibility with broken gcc compilers, this + dnl can cause excessive inlining. This flag limits it to a sane level + KDE_CHECK_COMPILER_FLAG(-inline_keyword_space_time=6,[CXXFLAGS="$CXXFLAGS --inline_keyword_space_time=6"]) + KDE_CHECK_COMPILER_FLAG(-inline_auto_space_time=2,[CXXFLAGS="$CXXFLAGS --inline_auto_space_time=2"]) + KDE_CHECK_COMPILER_FLAG(-inline_implicit_space_time=2.0,[CXXFLAGS="$CXXFLAGS --inline_implicit_space_time=2.0"]) + KDE_CHECK_COMPILER_FLAG(-inline_generated_space_time=2.0,[CXXFLAGS="$CXXFLAGS --inline_generated_space_time=2.0"]) + dnl Some source files are shared between multiple executables + dnl (or libraries) and some of those need template instantiations. + dnl In that case KCC needs to compile those sources with + dnl --one_instantiation_per_object. To make it easy for us we compile + dnl _all_ objects with that flag (--one_per is a shorthand). + KDE_CHECK_COMPILER_FLAG(-one_per, [CXXFLAGS="$CXXFLAGS --one_per"]) + fi + AC_SUBST(USE_EXCEPTIONS) + dnl obsolete macro - provided to keep things going + USE_RTTI= + AC_SUBST(USE_RTTI) + + case "$host" in + *-*-irix*) test "$GXX" = yes && CXXFLAGS="-D_LANGUAGE_C_PLUS_PLUS -D__LANGUAGE_C_PLUS_PLUS $CXXFLAGS" ;; + *-*-sysv4.2uw*) CXXFLAGS="-D_UNIXWARE $CXXFLAGS";; + *-*-sysv5uw7*) CXXFLAGS="-D_UNIXWARE7 $CXXFLAGS";; + *-*-solaris*) + if test "$GXX" = yes; then + libstdcpp=`$CXX -print-file-name=libstdc++.so` + if test ! -f $libstdcpp; then + AC_MSG_ERROR([You've compiled gcc without --enable-shared. This doesn't work with KDE. Please recompile gcc with --enable-shared to receive a libstdc++.so]) + fi + fi + ;; + esac + + AC_VALIDIFY_CXXFLAGS + + AC_PROG_CXXCPP + + if test "$GCC" = yes; then + NOOPT_CFLAGS=-O0 + fi + KDE_CHECK_COMPILER_FLAG(O0,[NOOPT_CXXFLAGS=-O0]) + + AC_ARG_ENABLE(coverage, + AC_HELP_STRING([--enable-coverage],[use gcc coverage testing]), [ + if test "$am_cv_CC_dependencies_compiler_type" = "gcc3"; then + ac_coverage_compiler="-fprofile-arcs -ftest-coverage" + ac_coverage_linker="-lgcc" + elif test "$am_cv_CC_dependencies_compiler_type" = "gcc"; then + ac_coverage_compiler="-fprofile-arcs -ftest-coverage" + ac_coverage_linker="" + else + AC_MSG_ERROR([coverage with your compiler is not supported]) + fi + CFLAGS="$CFLAGS $ac_coverage_compiler" + CXXFLAGS="$CXXFLAGS $ac_coverage_compiler" + LDFLAGS="$LDFLAGS $ac_coverage_linker" + ]) + + AC_SUBST(NOOPT_CXXFLAGS) + AC_SUBST(NOOPT_CFLAGS) + AC_SUBST(ENABLE_PERMISSIVE_FLAG) + + KDE_CHECK_NEW_LDFLAGS + KDE_CHECK_FINAL + KDE_CHECK_CLOSURE + KDE_CHECK_NMCHECK + + ifdef([AM_DEPENDENCIES], AC_REQUIRE([KDE_ADD_DEPENDENCIES]), []) +]) + +AC_DEFUN([KDE_CHECK_VISIBILITY_GCC_BUG], + [ + AC_CACHE_CHECK([for gcc -fvisibility-inlines-hidden bug], kde_cv_val_gcc_visibility_bug, + [ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + + safe_CXXFLAGS=$CXXFLAGS + safe_LDFLAGS=$LDFLAGS + CXXFLAGS="$CXXFLAGS -fPIC -fvisibility-inlines-hidden -O0" + LDFLAGS="$LDFLAGS -shared -fPIC" + + AC_TRY_LINK( + [ + /* http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19664 */ + #include + int some_function( void ) __attribute__ ((visibility("default"))); + int some_function( void ) + { + std::string s("blafasel"); + return 0; + } + ], [/* elvis is alive */], + kde_cv_val_gcc_visibility_bug=no, kde_cv_val_gcc_visibility_bug=yes) + + CXXFLAGS=$safe_CXXFLAGS + LDFLAGS=$safe_LDFLAGS + AC_LANG_RESTORE + ] + ) + + if test x$kde_cv_val_gcc_visibility_bug = xno; then + CXXFLAGS="$CXXFLAGS -fvisibility-inlines-hidden" + fi + ] +) + +AC_DEFUN([KDE_ENABLE_HIDDEN_VISIBILITY], +[ + AC_BEFORE([AC_PATH_QT_1_3], [KDE_ENABLE_HIDDEN_VISIBILITY]) + + AC_MSG_CHECKING([grepping for visibility push/pop in headers]) + + if test "x$GXX" = "xyes"; then + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_EGREP_CPP( + [GCC visibility push], + [ #include + ], + [ + AC_MSG_RESULT(yes) + kde_stdc_visibility_patched=yes ], + [ + AC_MSG_RESULT(no) + AC_MSG_WARN([Your libstdc++ doesn't appear to be patched for + visibility support. Disabling -fvisibility=hidden]) + + kde_stdc_visibility_patched=no ]) + + AC_LANG_RESTORE + + kde_have_gcc_visibility=no + KDE_CHECK_COMPILER_FLAG(fvisibility=hidden, + [ + kde_have_gcc_visibility=yes + dnl the whole toolchain is just a mess, gcc is just too buggy + dnl to handle STL with visibility enabled. Lets reconsider + dnl when gcc 4.2 is out or when things get fixed in the compiler. + dnl Contact mueller@kde.org for details. + AC_ARG_ENABLE(gcc-hidden-visibility, + AC_HELP_STRING([--enable-gcc-hidden-visibility],[toolchain hidden visibility [default=no]]), + [kde_have_gcc_visibility=$enableval], + [kde_have_gcc_visibility=no]) + + AC_CACHE_CHECK([if Qt is patched for -fvisibility], kde_cv_val_qt_gcc_visibility_patched, + [ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + + safe_CXXFLAGS=$CXXFLAGS + CXXFLAGS="$CXXFLAGS $all_includes" + + AC_TRY_COMPILE( + [ +#include +#if Q_EXPORT - 0 != 0 +/* if this compiles, then Q_EXPORT is undefined */ +/* if Q_EXPORT is nonempty, this will break compilation */ +#endif + ], [/* elvis is alive */], + kde_cv_val_qt_gcc_visibility_patched=no, kde_cv_val_qt_gcc_visibility_patched=yes) + + CXXFLAGS=$safe_CXXFLAGS + AC_LANG_RESTORE + ] + ) + + if test x$kde_have_gcc_visibility = "xyes" && test x$kde_stdc_visibility_patched = "xyes" && test x$kde_cv_val_qt_gcc_visibility_patched = "xyes"; then + CXXFLAGS="$CXXFLAGS -fvisibility=hidden" + KDE_CHECK_VISIBILITY_GCC_BUG + HAVE_GCC_VISIBILITY=1 + AC_DEFINE_UNQUOTED(__KDE_HAVE_GCC_VISIBILITY, "$HAVE_GCC_VISIBILITY", [define to 1 if -fvisibility is supported]) + fi + ]) + fi +]) + +AC_DEFUN([KDE_ADD_DEPENDENCIES], +[ + [A]M_DEPENDENCIES(CC) + [A]M_DEPENDENCIES(CXX) +]) + +dnl just a wrapper to clean up configure.in +AC_DEFUN([KDE_PROG_LIBTOOL], +[ +AC_REQUIRE([AC_CHECK_COMPILERS]) +AC_REQUIRE([AC_ENABLE_SHARED]) +AC_REQUIRE([AC_ENABLE_STATIC]) + +AC_REQUIRE([AC_LIBTOOL_DLOPEN]) +AC_REQUIRE([KDE_CHECK_LIB64]) + +AC_OBJEXT +AC_EXEEXT + +AM_PROG_LIBTOOL +AC_LIBTOOL_CXX + +LIBTOOL_SHELL="/bin/sh ./libtool" +# LIBTOOL="$LIBTOOL --silent" +KDE_PLUGIN="-avoid-version -module -no-undefined \$(KDE_NO_UNDEFINED) \$(KDE_RPATH) \$(KDE_MT_LDFLAGS)" +AC_SUBST(KDE_PLUGIN) + +# This hack ensures that libtool creates shared libs for kunittest plugins. By default check_LTLIBRARIES makes static libs. +KDE_CHECK_PLUGIN="\$(KDE_PLUGIN) -rpath \$(libdir)" +AC_SUBST(KDE_CHECK_PLUGIN) + +# we patch configure quite some so we better keep that consistent for incremental runs +AC_SUBST(AUTOCONF,'$(SHELL) $(top_srcdir)/admin/cvs.sh configure || touch configure') +]) + +AC_DEFUN([KDE_CHECK_LIB64], +[ + kdelibsuff="$kde_libs_suffix" + if test -z "$kdelibsuff"; then + kdelibsuff="no" + fi + AC_ARG_ENABLE(libsuffix, + AC_HELP_STRING([--enable-libsuffix], + [/lib directory suffix (64,32,none,auto[=default])]), + kdelibsuff=$enableval) + + if test "$kdelibsuff" = "auto"; then + +cat > conftest.c << EOF +#include +int main() { + return 0; +} +EOF + kdelibsuff=`$CC conftest.c -o conftest.out; ldd conftest.out |sed -ne '/libc.so/{ + s,.*/lib\([[^\/]]*\)/.*,\1, + p +}'` + rm -rf conftest.* + fi + + if test "$kdelibsuff" = "no" || "$kdelibsuff" = "none"; then + kdelibsuff= + fi + if test -z "$kdelibsuff"; then + AC_MSG_RESULT([not using lib directory suffix]) + AC_DEFINE(KDELIBSUFF, [""], Suffix for lib directories) + else + if test "$libdir" = '${exec_prefix}/lib'; then + libdir="$libdir${kdelibsuff}" + AC_SUBST([libdir], ["$libdir"]) dnl ugly hack for lib64 platforms + fi + AC_DEFINE_UNQUOTED(KDELIBSUFF, ["${kdelibsuff}"], Suffix for lib directories) + AC_MSG_RESULT([using lib directory suffix $kdelibsuff]) + fi +]) + +AC_DEFUN([KDE_CHECK_TYPES], +[ AC_CHECK_SIZEOF(int, 4)dnl + AC_CHECK_SIZEOF(short)dnl + AC_CHECK_SIZEOF(long, 4)dnl + AC_CHECK_SIZEOF(char *, 4)dnl +])dnl + +dnl Not used - kept for compat only? +AC_DEFUN([KDE_DO_IT_ALL], +[ +AC_CANONICAL_SYSTEM +AC_ARG_PROGRAM +AM_INIT_AUTOMAKE($1, $2) +AM_DISABLE_LIBRARIES +AC_PREFIX_DEFAULT(${KDEDIR:-/usr/local/kde}) +AC_CHECK_COMPILERS +KDE_PROG_LIBTOOL +AM_KDE_WITH_NLS +AC_PATH_KDE +]) + +AC_DEFUN([AC_CHECK_RPATH], +[ +AC_MSG_CHECKING(for rpath) +AC_ARG_ENABLE(rpath, + AC_HELP_STRING([--disable-rpath],[do not use the rpath feature of ld]), + USE_RPATH=$enableval, USE_RPATH=yes) + +if test -z "$KDE_RPATH" && test "$USE_RPATH" = "yes"; then + + KDE_RPATH="-R \$(libdir)" + + if test "$kde_libraries" != "$libdir"; then + KDE_RPATH="$KDE_RPATH -R \$(kde_libraries)" + fi + + if test -n "$qt_libraries"; then + KDE_RPATH="$KDE_RPATH -R \$(qt_libraries)" + fi + dnl $x_libraries is set to /usr/lib in case + if test -n "$X_LDFLAGS"; then + X_RPATH="-R \$(x_libraries)" + KDE_RPATH="$KDE_RPATH $X_RPATH" + fi + if test -n "$KDE_EXTRA_RPATH"; then + KDE_RPATH="$KDE_RPATH \$(KDE_EXTRA_RPATH)" + fi +fi +AC_SUBST(KDE_EXTRA_RPATH) +AC_SUBST(KDE_RPATH) +AC_SUBST(X_RPATH) +AC_MSG_RESULT($USE_RPATH) +]) + +dnl Check for the type of the third argument of getsockname +AC_DEFUN([AC_CHECK_SOCKLEN_T], +[ + AC_MSG_CHECKING(for socklen_t) + AC_CACHE_VAL(kde_cv_socklen_t, + [ + AC_LANG_PUSH(C++) + kde_cv_socklen_t=no + AC_TRY_COMPILE([ + #include + #include + ], + [ + socklen_t len; + getpeername(0,0,&len); + ], + [ + kde_cv_socklen_t=yes + kde_cv_socklen_t_equiv=socklen_t + ]) + AC_LANG_POP(C++) + ]) + AC_MSG_RESULT($kde_cv_socklen_t) + if test $kde_cv_socklen_t = no; then + AC_MSG_CHECKING([for socklen_t equivalent for socket functions]) + AC_CACHE_VAL(kde_cv_socklen_t_equiv, + [ + kde_cv_socklen_t_equiv=int + AC_LANG_PUSH(C++) + for t in int size_t unsigned long "unsigned long"; do + AC_TRY_COMPILE([ + #include + #include + ], + [ + $t len; + getpeername(0,0,&len); + ], + [ + kde_cv_socklen_t_equiv="$t" + break + ]) + done + AC_LANG_POP(C++) + ]) + AC_MSG_RESULT($kde_cv_socklen_t_equiv) + fi + AC_DEFINE_UNQUOTED(kde_socklen_t, $kde_cv_socklen_t_equiv, + [type to use in place of socklen_t if not defined]) + AC_DEFINE_UNQUOTED(ksize_t, $kde_cv_socklen_t_equiv, + [type to use in place of socklen_t if not defined (deprecated, use kde_socklen_t)]) +]) + +dnl This is a merge of some macros out of the gettext aclocal.m4 +dnl since we don't need anything, I took the things we need +dnl the copyright for them is: +dnl > +dnl Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc. +dnl This Makefile.in is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl This program is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without +dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A +dnl PARTICULAR PURPOSE. +dnl > +dnl for this file it is relicensed under LGPL + +AC_DEFUN([AM_KDE_WITH_NLS], + [ + dnl If we use NLS figure out what method + + AM_PATH_PROG_WITH_TEST_KDE(MSGFMT, msgfmt, + [test -n "`$ac_dir/$ac_word --version 2>&1 | grep 'GNU gettext'`"], msgfmt) + AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) + + if test -z "`$GMSGFMT --version 2>&1 | grep 'GNU gettext'`"; then + AC_MSG_RESULT([found msgfmt program is not GNU msgfmt; ignore it]) + GMSGFMT=":" + fi + MSGFMT=$GMSGFMT + AC_SUBST(GMSGFMT) + AC_SUBST(MSGFMT) + + AM_PATH_PROG_WITH_TEST_KDE(XGETTEXT, xgettext, + [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) + + dnl Test whether we really found GNU xgettext. + if test "$XGETTEXT" != ":"; then + dnl If it is no GNU xgettext we define it as : so that the + dnl Makefiles still can work. + if $XGETTEXT --omit-header /dev/null 2> /dev/null; then + : ; + else + AC_MSG_RESULT( + [found xgettext programs is not GNU xgettext; ignore it]) + XGETTEXT=":" + fi + fi + AC_SUBST(XGETTEXT) + + ]) + +# Search path for a program which passes the given test. +# Ulrich Drepper , 1996. + +# serial 1 +# Stephan Kulow: I appended a _KDE against name conflicts + +dnl AM_PATH_PROG_WITH_TEST_KDE(VARIABLE, PROG-TO-CHECK-FOR, +dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) +AC_DEFUN([AM_PATH_PROG_WITH_TEST_KDE], +[# Extract the first word of "$2", so it can be a program name with args. +set dummy $2; ac_word=[$]2 +AC_MSG_CHECKING([for $ac_word]) +AC_CACHE_VAL(ac_cv_path_$1, +[case "[$]$1" in + /*) + ac_cv_path_$1="[$]$1" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in ifelse([$5], , $PATH, [$5]); do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if [$3]; then + ac_cv_path_$1="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" +dnl If no 4th arg is given, leave the cache variable unset, +dnl so AC_PATH_PROGS will keep looking. +ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" +])dnl + ;; +esac])dnl +$1="$ac_cv_path_$1" +if test -n "[$]$1"; then + AC_MSG_RESULT([$]$1) +else + AC_MSG_RESULT(no) +fi +AC_SUBST($1)dnl +]) + + +# Check whether LC_MESSAGES is available in . +# Ulrich Drepper , 1995. + +# serial 1 + +AC_DEFUN([AM_LC_MESSAGES], + [if test $ac_cv_header_locale_h = yes; then + AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, + [AC_TRY_LINK([#include ], [return LC_MESSAGES], + am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) + if test $am_cv_val_LC_MESSAGES = yes; then + AC_DEFINE(HAVE_LC_MESSAGES, 1, [Define if your locale.h file contains LC_MESSAGES]) + fi + fi]) + +dnl From Jim Meyering. +dnl FIXME: migrate into libit. + +AC_DEFUN([AM_FUNC_OBSTACK], +[AC_CACHE_CHECK([for obstacks], am_cv_func_obstack, + [AC_TRY_LINK([#include "obstack.h"], + [struct obstack *mem;obstack_free(mem,(char *) 0)], + am_cv_func_obstack=yes, + am_cv_func_obstack=no)]) + if test $am_cv_func_obstack = yes; then + AC_DEFINE(HAVE_OBSTACK) + else + LIBOBJS="$LIBOBJS obstack.o" + fi +]) + +dnl From Jim Meyering. Use this if you use the GNU error.[ch]. +dnl FIXME: Migrate into libit + +AC_DEFUN([AM_FUNC_ERROR_AT_LINE], +[AC_CACHE_CHECK([for error_at_line], am_cv_lib_error_at_line, + [AC_TRY_LINK([],[error_at_line(0, 0, "", 0, "");], + am_cv_lib_error_at_line=yes, + am_cv_lib_error_at_line=no)]) + if test $am_cv_lib_error_at_line = no; then + LIBOBJS="$LIBOBJS error.o" + fi + AC_SUBST(LIBOBJS)dnl +]) + +# Macro to add for using GNU gettext. +# Ulrich Drepper , 1995. + +# serial 1 +# Stephan Kulow: I put a KDE in it to avoid name conflicts + +AC_DEFUN([AM_KDE_GNU_GETTEXT], + [AC_REQUIRE([AC_PROG_MAKE_SET])dnl + AC_REQUIRE([AC_PROG_RANLIB])dnl + AC_REQUIRE([AC_HEADER_STDC])dnl + AC_REQUIRE([AC_TYPE_OFF_T])dnl + AC_REQUIRE([AC_TYPE_SIZE_T])dnl + AC_REQUIRE([AC_FUNC_ALLOCA])dnl + AC_REQUIRE([AC_FUNC_MMAP])dnl + AC_REQUIRE([AM_KDE_WITH_NLS])dnl + AC_CHECK_HEADERS([limits.h locale.h nl_types.h string.h values.h alloca.h]) + AC_CHECK_FUNCS([getcwd munmap putenv setlocale strchr strcasecmp \ +__argz_count __argz_stringify __argz_next]) + + AC_MSG_CHECKING(for stpcpy) + AC_CACHE_VAL(kde_cv_func_stpcpy, + [ + kde_safe_cxxflags=$CXXFLAGS + CXXFLAGS="-Werror" + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE([ + #include + ], + [ + char buffer[200]; + stpcpy(buffer, buffer); + ], + kde_cv_func_stpcpy=yes, + kde_cv_func_stpcpy=no) + AC_LANG_RESTORE + CXXFLAGS=$kde_safe_cxxflags + ]) + AC_MSG_RESULT($kde_cv_func_stpcpy) + if eval "test \"`echo $kde_cv_func_stpcpy`\" = yes"; then + AC_DEFINE(HAVE_STPCPY, 1, [Define if you have stpcpy]) + fi + + AM_LC_MESSAGES + + if test "x$CATOBJEXT" != "x"; then + if test "x$ALL_LINGUAS" = "x"; then + LINGUAS= + else + AC_MSG_CHECKING(for catalogs to be installed) + NEW_LINGUAS= + for lang in ${LINGUAS=$ALL_LINGUAS}; do + case "$ALL_LINGUAS" in + *$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;; + esac + done + LINGUAS=$NEW_LINGUAS + AC_MSG_RESULT($LINGUAS) + fi + + dnl Construct list of names of catalog files to be constructed. + if test -n "$LINGUAS"; then + for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done + fi + fi + + ]) + +AC_DEFUN([AC_HAVE_XPM], + [AC_REQUIRE_CPP()dnl + AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + + test -z "$XPM_LDFLAGS" && XPM_LDFLAGS= + test -z "$XPM_INCLUDE" && XPM_INCLUDE= + + AC_ARG_WITH(xpm,AC_HELP_STRING([--without-xpm],[disable color pixmap XPM tests]), + xpm_test=$withval, xpm_test="yes") + if test "x$xpm_test" = xno; then + ac_cv_have_xpm=no + else + AC_MSG_CHECKING(for XPM) + AC_CACHE_VAL(ac_cv_have_xpm, + [ + ac_save_ldflags="$LDFLAGS" + ac_save_cflags="$CFLAGS" + if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then + LDFLAGS="$LDFLAGS $X_LDFLAGS $USER_LDFLAGS $LDFLAGS $XPM_LDFLAGS $all_libraries -lXpm -lX11 -lXext $LIBZ $LIBSOCKET" + else + LDFLAGS="$LDFLAGS $X_LDFLAGS $USER_LDFLAGS $LDFLAGS $XPM_LDFLAGS $all_libraries -lXpm $LIBZ $LIBSOCKET" + fi + CFLAGS="$CFLAGS $X_INCLUDES $USER_INCLUDES" + test -n "$XPM_INCLUDE" && CFLAGS="-I$XPM_INCLUDE $CFLAGS" + AC_TRY_LINK([#include ],[], + ac_cv_have_xpm="yes",ac_cv_have_xpm="no") + LDFLAGS="$ac_save_ldflags" + CFLAGS="$ac_save_cflags" + ])dnl + + if test "$ac_cv_have_xpm" = no; then + AC_MSG_RESULT(no) + XPM_LDFLAGS="" + XPMINC="" + $2 + else + AC_DEFINE(HAVE_XPM, 1, [Define if you have XPM support]) + if test "$XPM_LDFLAGS" = ""; then + XPMLIB='-lXpm $(LIB_X11)' + else + XPMLIB="-L$XPM_LDFLAGS -lXpm "'$(LIB_X11)' + fi + if test "$XPM_INCLUDE" = ""; then + XPMINC="" + else + XPMINC="-I$XPM_INCLUDE" + fi + AC_MSG_RESULT(yes) + $1 + fi + fi + AC_SUBST(XPMINC) + AC_SUBST(XPMLIB) +]) + +AC_DEFUN([AC_HAVE_DPMS], + [AC_REQUIRE_CPP()dnl + AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + + test -z "$DPMS_LDFLAGS" && DPMS_LDFLAGS= + test -z "$DPMS_INCLUDE" && DPMS_INCLUDE= + DPMS_LIB= + + AC_ARG_WITH(dpms,AC_HELP_STRING([--without-dpms],[disable DPMS power saving]), + dpms_test=$withval, dpms_test="yes") + if test "x$dpms_test" = xno; then + ac_cv_have_dpms=no + else + AC_MSG_CHECKING(for DPMS) + dnl Note: ac_cv_have_dpms can be no, yes, or -lXdpms. + dnl 'yes' means DPMS_LIB="", '-lXdpms' means DPMS_LIB="-lXdpms". + AC_CACHE_VAL(ac_cv_have_dpms, + [ + if test "x$kde_use_qt_emb" = "xyes" || test "x$kde_use_qt_mac" = "xyes"; then + AC_MSG_RESULT(no) + ac_cv_have_dpms="no" + else + ac_save_ldflags="$LDFLAGS" + ac_save_cflags="$CFLAGS" + ac_save_libs="$LIBS" + LDFLAGS="$LDFLAGS $DPMS_LDFLAGS $all_libraries" + LIBS="-lX11 -lXext $LIBSOCKET" + CFLAGS="$CFLAGS $X_INCLUDES" + test -n "$DPMS_INCLUDE" && CFLAGS="-I$DPMS_INCLUDE $CFLAGS" + AC_TRY_LINK([ + #include + #include + #include + #include + int foo_test_dpms() + { return DPMSSetTimeouts( 0, 0, 0, 0 ); }],[], + ac_cv_have_dpms="yes", [ + LIBS="-lXdpms $LIBS" + AC_TRY_LINK([ + #include + #include + #include + #include + int foo_test_dpms() + { return DPMSSetTimeouts( 0, 0, 0, 0 ); }],[], + [ + ac_cv_have_dpms="-lXdpms" + ],ac_cv_have_dpms="no") + ]) + LDFLAGS="$ac_save_ldflags" + CFLAGS="$ac_save_cflags" + LIBS="$ac_save_libs" + fi + ])dnl + + if test "$ac_cv_have_dpms" = no; then + AC_MSG_RESULT(no) + DPMS_LDFLAGS="" + DPMSINC="" + $2 + else + AC_DEFINE(HAVE_DPMS, 1, [Define if you have DPMS support]) + if test "$ac_cv_have_dpms" = "-lXdpms"; then + DPMS_LIB="-lXdpms" + fi + if test "$DPMS_LDFLAGS" = ""; then + DPMSLIB="$DPMS_LIB "'$(LIB_X11)' + else + DPMSLIB="$DPMS_LDFLAGS $DPMS_LIB "'$(LIB_X11)' + fi + if test "$DPMS_INCLUDE" = ""; then + DPMSINC="" + else + DPMSINC="-I$DPMS_INCLUDE" + fi + AC_MSG_RESULT(yes) + $1 + fi + fi + ac_save_cflags="$CFLAGS" + CFLAGS="$CFLAGS $X_INCLUDES" + test -n "$DPMS_INCLUDE" && CFLAGS="-I$DPMS_INCLUDE $CFLAGS" + AH_TEMPLATE(HAVE_DPMSCAPABLE_PROTO, + [Define if you have the DPMSCapable prototype in ]) + AC_CHECK_DECL(DPMSCapable, + AC_DEFINE(HAVE_DPMSCAPABLE_PROTO),, + [#include + #include ]) + AH_TEMPLATE(HAVE_DPMSINFO_PROTO, + [Define if you have the DPMSInfo prototype in ]) + AC_CHECK_DECL(DPMSInfo, + AC_DEFINE(HAVE_DPMSINFO_PROTO),, + [#include + #include ]) + CFLAGS="$ac_save_cflags" + AC_SUBST(DPMSINC) + AC_SUBST(DPMSLIB) +]) + +AC_DEFUN([AC_HAVE_GL], + [AC_REQUIRE_CPP()dnl + AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + + test -z "$GL_LDFLAGS" && GL_LDFLAGS= + test -z "$GL_INCLUDE" && GL_INCLUDE= + + AC_ARG_WITH(gl,AC_HELP_STRING([--without-gl],[disable 3D GL modes]), + gl_test=$withval, gl_test="yes") + if test "x$kde_use_qt_emb" = "xyes"; then + # GL and Qt Embedded is a no-go for now. + ac_cv_have_gl=no + elif test "x$gl_test" = xno; then + ac_cv_have_gl=no + else + AC_MSG_CHECKING(for GL) + AC_CACHE_VAL(ac_cv_have_gl, + [ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + ac_save_ldflags=$LDFLAGS + ac_save_cxxflags=$CXXFLAGS + ac_save_libs=$LIBS + LDFLAGS="$LDFLAGS $GL_LDFLAGS $X_LDFLAGS $all_libraries" + LIBS="$LIBS -lGL -lGLU" + test "x$kde_use_qt_mac" != xyes && test "x$kde_use_qt_emb" != xyes && LIBS="$LIBS -lX11" + LIBS="$LIBS $LIB_XEXT -lm $LIBSOCKET" + CXXFLAGS="$CFLAGS $X_INCLUDES" + test -n "$GL_INCLUDE" && CFLAGS="-I$GL_INCLUDE $CFLAGS" + AC_TRY_LINK([#include +#include +], [], + ac_cv_have_gl="yes", ac_cv_have_gl="no") + AC_LANG_RESTORE + LDFLAGS=$ac_save_ldflags + CXXFLAGS=$ac_save_cxxflags + LIBS=$ac_save_libs + ])dnl + + if test "$ac_cv_have_gl" = "no"; then + AC_MSG_RESULT(no) + GL_LDFLAGS="" + GLINC="" + $2 + else + AC_DEFINE(HAVE_GL, 1, [Defines if you have GL (Mesa, OpenGL, ...)]) + if test "$GL_LDFLAGS" = ""; then + GLLIB='-lGLU -lGL $(LIB_X11)' + else + GLLIB="$GL_LDFLAGS -lGLU -lGL "'$(LIB_X11)' + fi + if test "$GL_INCLUDE" = ""; then + GLINC="" + else + GLINC="-I$GL_INCLUDE" + fi + AC_MSG_RESULT($ac_cv_have_gl) + $1 + fi + fi + AC_SUBST(GLINC) + AC_SUBST(GLLIB) +]) + + + dnl shadow password and PAM magic - maintained by ossi@kde.org + +AC_DEFUN([KDE_PAM], [ + AC_REQUIRE([KDE_CHECK_LIBDL]) + + want_pam= + AC_ARG_WITH(pam, + AC_HELP_STRING([--with-pam[=ARG]],[enable support for PAM: ARG=[yes|no|service name]]), + [ if test "x$withval" = "xyes"; then + want_pam=yes + pam_service=kde + elif test "x$withval" = "xno"; then + want_pam=no + else + want_pam=yes + pam_service=$withval + fi + ], [ pam_service=kde ]) + + use_pam= + PAMLIBS= + if test "x$want_pam" != xno; then + AC_CHECK_LIB(pam, pam_start, [ + AC_CHECK_HEADER(security/pam_appl.h, + [ pam_header=security/pam_appl.h ], + [ AC_CHECK_HEADER(pam/pam_appl.h, + [ pam_header=pam/pam_appl.h ], + [ + AC_MSG_WARN([PAM detected, but no headers found! +Make sure you have the necessary development packages installed.]) + ] + ) + ] + ) + ], , $LIBDL) + if test -z "$pam_header"; then + if test "x$want_pam" = xyes; then + AC_MSG_ERROR([--with-pam was specified, but cannot compile with PAM!]) + fi + else + AC_DEFINE(HAVE_PAM, 1, [Defines if you have PAM (Pluggable Authentication Modules)]) + PAMLIBS="$PAM_MISC_LIB -lpam $LIBDL" + use_pam=yes + + dnl darwin claims to be something special + if test "$pam_header" = "pam/pam_appl.h"; then + AC_DEFINE(HAVE_PAM_PAM_APPL_H, 1, [Define if your PAM headers are in pam/ instead of security/]) + fi + + dnl test whether struct pam_message is const (Linux) or not (Sun) + AC_MSG_CHECKING(for const pam_message) + AC_EGREP_HEADER([struct pam_message], $pam_header, + [ AC_EGREP_HEADER([const struct pam_message], $pam_header, + [AC_MSG_RESULT([const: Linux-type PAM])], + [AC_MSG_RESULT([nonconst: Sun-type PAM]) + AC_DEFINE(PAM_MESSAGE_NONCONST, 1, [Define if your PAM support takes non-const arguments (Solaris)])] + )], + [AC_MSG_RESULT([not found - assume const, Linux-type PAM])]) + fi + fi + + AC_SUBST(PAMLIBS) +]) + +dnl DEF_PAM_SERVICE(arg name, full name, define name) +AC_DEFUN([DEF_PAM_SERVICE], [ + AC_ARG_WITH($1-pam, + AC_HELP_STRING([--with-$1-pam=[val]],[override PAM service from --with-pam for $2]), + [ if test "x$use_pam" = xyes; then + $3_PAM_SERVICE=$withval + else + AC_MSG_ERROR([Cannot use use --with-$1-pam, as no PAM was detected. +You may want to enforce it by using --with-pam.]) + fi + ], + [ if test "x$use_pam" = xyes; then + $3_PAM_SERVICE="$pam_service" + fi + ]) + if test -n "$$3_PAM_SERVICE"; then + AC_MSG_RESULT([The PAM service used by $2 will be $$3_PAM_SERVICE]) + AC_DEFINE_UNQUOTED($3_PAM_SERVICE, "$$3_PAM_SERVICE", [The PAM service to be used by $2]) + fi + AC_SUBST($3_PAM_SERVICE) +]) + +AC_DEFUN([KDE_SHADOWPASSWD], [ + AC_REQUIRE([KDE_PAM]) + + AC_CHECK_LIB(shadow, getspent, + [ LIBSHADOW="-lshadow" + ac_use_shadow=yes + ], + [ dnl for UnixWare + AC_CHECK_LIB(gen, getspent, + [ LIBGEN="-lgen" + ac_use_shadow=yes + ], + [ AC_CHECK_FUNC(getspent, + [ ac_use_shadow=yes ], + [ ac_use_shadow=no ]) + ]) + ]) + AC_SUBST(LIBSHADOW) + AC_SUBST(LIBGEN) + + AC_MSG_CHECKING([for shadow passwords]) + + AC_ARG_WITH(shadow, + AC_HELP_STRING([--with-shadow],[If you want shadow password support]), + [ if test "x$withval" != "xno"; then + use_shadow=yes + else + use_shadow=no + fi + ], [ + use_shadow="$ac_use_shadow" + ]) + + if test "x$use_shadow" = xyes; then + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_SHADOW, 1, [Define if you use shadow passwords]) + else + AC_MSG_RESULT(no) + LIBSHADOW= + LIBGEN= + fi + + dnl finally make the relevant binaries setuid root, if we have shadow passwds. + dnl this still applies, if we could use it indirectly through pam. + if test "x$use_shadow" = xyes || + ( test "x$use_pam" = xyes && test "x$ac_use_shadow" = xyes ); then + case $host in + *-*-freebsd* | *-*-netbsd* | *-*-openbsd*) + SETUIDFLAGS="-m 4755 -o root";; + *) + SETUIDFLAGS="-m 4755";; + esac + fi + AC_SUBST(SETUIDFLAGS) + +]) + +AC_DEFUN([KDE_PASSWDLIBS], [ + AC_REQUIRE([KDE_MISC_TESTS]) dnl for LIBCRYPT + AC_REQUIRE([KDE_PAM]) + AC_REQUIRE([KDE_SHADOWPASSWD]) + + if test "x$use_pam" = "xyes"; then + PASSWDLIBS="$PAMLIBS" + else + PASSWDLIBS="$LIBCRYPT $LIBSHADOW $LIBGEN" + fi + + dnl FreeBSD uses a shadow-like setup, where /etc/passwd holds the users, but + dnl /etc/master.passwd holds the actual passwords. /etc/master.passwd requires + dnl root to read, so kcheckpass needs to be root (even when using pam, since pam + dnl may need to read /etc/master.passwd). + case $host in + *-*-freebsd*) + SETUIDFLAGS="-m 4755 -o root" + ;; + *) + ;; + esac + + AC_SUBST(PASSWDLIBS) +]) + +AC_DEFUN([KDE_CHECK_LIBDL], +[ +AC_CHECK_LIB(dl, dlopen, [ +LIBDL="-ldl" +ac_cv_have_dlfcn=yes +]) + +AC_CHECK_LIB(dld, shl_unload, [ +LIBDL="-ldld" +ac_cv_have_shload=yes +]) + +AC_SUBST(LIBDL) +]) + +AC_DEFUN([KDE_CHECK_DLOPEN], +[ +KDE_CHECK_LIBDL +AC_CHECK_HEADERS(dlfcn.h dl.h) +if test "$ac_cv_header_dlfcn_h" = "no"; then + ac_cv_have_dlfcn=no +fi + +if test "$ac_cv_header_dl_h" = "no"; then + ac_cv_have_shload=no +fi + +dnl XXX why change enable_dlopen? its already set by autoconf's AC_ARG_ENABLE +dnl (MM) +AC_ARG_ENABLE(dlopen, +AC_HELP_STRING([--disable-dlopen],[link statically [default=no]]), +enable_dlopen=$enableval, +enable_dlopen=yes) + +# override the user's opinion, if we know it better ;) +if test "$ac_cv_have_dlfcn" = "no" && test "$ac_cv_have_shload" = "no"; then + enable_dlopen=no +fi + +if test "$ac_cv_have_dlfcn" = "yes"; then + AC_DEFINE_UNQUOTED(HAVE_DLFCN, 1, [Define if you have dlfcn]) +fi + +if test "$ac_cv_have_shload" = "yes"; then + AC_DEFINE_UNQUOTED(HAVE_SHLOAD, 1, [Define if you have shload]) +fi + +if test "$enable_dlopen" = no ; then + test -n "$1" && eval $1 +else + test -n "$2" && eval $2 +fi + +]) + +AC_DEFUN([KDE_CHECK_DYNAMIC_LOADING], +[ +KDE_CHECK_DLOPEN(libtool_enable_shared=yes, libtool_enable_static=no) +KDE_PROG_LIBTOOL +AC_MSG_CHECKING([dynamic loading]) +eval "`egrep '^build_libtool_libs=' libtool`" +if test "$build_libtool_libs" = "yes" && test "$enable_dlopen" = "yes"; then + dynamic_loading=yes + AC_DEFINE_UNQUOTED(HAVE_DYNAMIC_LOADING) +else + dynamic_loading=no +fi +AC_MSG_RESULT($dynamic_loading) +if test "$dynamic_loading" = "yes"; then + $1 +else + $2 +fi +]) + +AC_DEFUN([KDE_ADD_INCLUDES], +[ +if test -z "$1"; then + test_include="Pix.h" +else + test_include="$1" +fi + +AC_MSG_CHECKING([for libg++ ($test_include)]) + +AC_CACHE_VAL(kde_cv_libgpp_includes, +[ +kde_cv_libgpp_includes=no + + for ac_dir in \ + \ + /usr/include/g++ \ + /usr/include \ + /usr/unsupported/include \ + /opt/include \ + $extra_include \ + ; \ + do + if test -r "$ac_dir/$test_include"; then + kde_cv_libgpp_includes=$ac_dir + break + fi + done +]) + +AC_MSG_RESULT($kde_cv_libgpp_includes) +if test "$kde_cv_libgpp_includes" != "no"; then + all_includes="-I$kde_cv_libgpp_includes $all_includes $USER_INCLUDES" +fi +]) +]) + +AC_DEFUN([KDE_CHECK_LIBPTHREAD], +[ + dnl This code is here specifically to handle the + dnl various flavors of threading library on FreeBSD + dnl 4-, 5-, and 6-, and the (weird) rules around it. + dnl There may be an environment PTHREAD_LIBS that + dnl specifies what to use; otherwise, search for it. + dnl -pthread is special cased and unsets LIBPTHREAD + dnl below if found. + LIBPTHREAD="" + + if test -n "$PTHREAD_LIBS"; then + if test "x$PTHREAD_LIBS" = "x-pthread" ; then + LIBPTHREAD="PTHREAD" + else + PTHREAD_LIBS_save="$PTHREAD_LIBS" + PTHREAD_LIBS=`echo "$PTHREAD_LIBS_save" | sed -e 's,^-l,,g'` + AC_MSG_CHECKING([for pthread_create in $PTHREAD_LIBS]) + KDE_CHECK_LIB($PTHREAD_LIBS, pthread_create, [ + LIBPTHREAD="$PTHREAD_LIBS_save"]) + PTHREAD_LIBS="$PTHREAD_LIBS_save" + fi + fi + + dnl Is this test really needed, in the face of the Tru64 test below? + if test -z "$LIBPTHREAD"; then + AC_CHECK_LIB(pthread, pthread_create, [LIBPTHREAD="-lpthread"]) + fi + + dnl This is a special Tru64 check, see BR 76171 issue #18. + if test -z "$LIBPTHREAD" ; then + AC_MSG_CHECKING([for pthread_create in -lpthread]) + kde_safe_libs=$LIBS + LIBS="$LIBS -lpthread" + AC_TRY_LINK([#include ],[(void)pthread_create(0,0,0,0);],[ + AC_MSG_RESULT(yes) + LIBPTHREAD="-lpthread"],[ + AC_MSG_RESULT(no)]) + LIBS=$kde_safe_libs + fi + + dnl Un-special-case for FreeBSD. + if test "x$LIBPTHREAD" = "xPTHREAD" ; then + LIBPTHREAD="" + fi + + AC_SUBST(LIBPTHREAD) +]) + +AC_DEFUN([KDE_CHECK_PTHREAD_OPTION], +[ + USE_THREADS="" + if test -z "$LIBPTHREAD"; then + KDE_CHECK_COMPILER_FLAG(pthread, [USE_THREADS="-D_THREAD_SAFE -pthread"]) + fi + + AH_VERBATIM(__svr_define, [ +#if defined(__SVR4) && !defined(__svr4__) +#define __svr4__ 1 +#endif +]) + case $host_os in + solaris*) + KDE_CHECK_COMPILER_FLAG(mt, [USE_THREADS="-mt"]) + CPPFLAGS="$CPPFLAGS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -DUSE_SOLARIS -DSVR4" + ;; + freebsd*) + CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE $PTHREAD_CFLAGS" + ;; + aix*) + CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE" + LIBPTHREAD="$LIBPTHREAD -lc_r" + ;; + linux*) CPPFLAGS="$CPPFLAGS -D_REENTRANT" + if test "$CXX" = "KCC"; then + CXXFLAGS="$CXXFLAGS --thread_safe" + NOOPT_CXXFLAGS="$NOOPT_CXXFLAGS --thread_safe" + fi + ;; + *) + ;; + esac + AC_SUBST(USE_THREADS) + AC_SUBST(LIBPTHREAD) +]) + +AC_DEFUN([KDE_CHECK_THREADING], +[ + AC_REQUIRE([KDE_CHECK_LIBPTHREAD]) + AC_REQUIRE([KDE_CHECK_PTHREAD_OPTION]) + dnl default is yes if libpthread is found and no if no libpthread is available + if test -z "$LIBPTHREAD"; then + if test -z "$USE_THREADS"; then + kde_check_threading_default=no + else + kde_check_threading_default=yes + fi + else + kde_check_threading_default=yes + fi + AC_ARG_ENABLE(threading,AC_HELP_STRING([--disable-threading],[disables threading even if libpthread found]), + kde_use_threading=$enableval, kde_use_threading=$kde_check_threading_default) + if test "x$kde_use_threading" = "xyes"; then + AC_DEFINE(HAVE_LIBPTHREAD, 1, [Define if you have a working libpthread (will enable threaded code)]) + fi +]) + +AC_DEFUN([KDE_TRY_LINK_PYTHON], +[ +if test "$kde_python_link_found" = no; then + +if test "$1" = normal; then + AC_MSG_CHECKING(if a Python application links) +else + AC_MSG_CHECKING(if Python depends on $2) +fi + +AC_CACHE_VAL(kde_cv_try_link_python_$1, +[ +kde_save_cflags="$CFLAGS" +CFLAGS="$CFLAGS $PYTHONINC" +kde_save_libs="$LIBS" +LIBS="$LIBS $LIBPYTHON $2 $LIBDL $LIBSOCKET" +kde_save_ldflags="$LDFLAGS" +LDFLAGS="$LDFLAGS $PYTHONLIB" + +AC_TRY_LINK( +[ +#include +],[ + PySys_SetArgv(1, 0); +], + [kde_cv_try_link_python_$1=yes], + [kde_cv_try_link_python_$1=no] +) +CFLAGS="$kde_save_cflags" +LIBS="$kde_save_libs" +LDFLAGS="$kde_save_ldflags" +]) + +if test "$kde_cv_try_link_python_$1" = "yes"; then + AC_MSG_RESULT(yes) + kde_python_link_found=yes + if test ! "$1" = normal; then + LIBPYTHON="$LIBPYTHON $2" + fi + $3 +else + AC_MSG_RESULT(no) + $4 +fi + +fi + +]) + +AC_DEFUN([KDE_CHECK_PYTHON_DIR], +[ +AC_MSG_CHECKING([for Python directory]) + +AC_CACHE_VAL(kde_cv_pythondir, +[ + if test -z "$PYTHONDIR"; then + kde_cv_pythondir=/usr/local + else + kde_cv_pythondir="$PYTHONDIR" + fi +]) + +AC_ARG_WITH(pythondir, +AC_HELP_STRING([--with-pythondir=pythondir],[use python installed in pythondir]), +[ + ac_python_dir=$withval +], ac_python_dir=$kde_cv_pythondir +) + +AC_MSG_RESULT($ac_python_dir) +]) + +AC_DEFUN([KDE_CHECK_PYTHON_INTERN], +[ +AC_REQUIRE([KDE_CHECK_LIBDL]) +AC_REQUIRE([KDE_CHECK_LIBPTHREAD]) +AC_REQUIRE([KDE_CHECK_PYTHON_DIR]) + +if test -z "$1"; then + version="1.5" +else + version="$1" +fi + +AC_MSG_CHECKING([for Python$version]) + +python_incdirs="$ac_python_dir/include /usr/include /usr/local/include/ $kde_extra_includes" +AC_FIND_FILE(Python.h, $python_incdirs, python_incdir) +if test ! -r $python_incdir/Python.h; then + AC_FIND_FILE(python$version/Python.h, $python_incdirs, python_incdir) + python_incdir=$python_incdir/python$version + if test ! -r $python_incdir/Python.h; then + python_incdir=no + fi +fi + +PYTHONINC=-I$python_incdir + +python_libdirs="$ac_python_dir/lib$kdelibsuff /usr/lib$kdelibsuff /usr/local /usr/lib$kdelibsuff $kde_extra_libs" +AC_FIND_FILE(libpython$version.so, $python_libdirs, python_libdir) +if test ! -r $python_libdir/libpython$version.so; then + AC_FIND_FILE(libpython$version.a, $python_libdirs, python_libdir) + if test ! -r $python_libdir/libpython$version.a; then + AC_FIND_FILE(python$version/config/libpython$version.a, $python_libdirs, python_libdir) + python_libdir=$python_libdir/python$version/config + if test ! -r $python_libdir/libpython$version.a; then + python_libdir=no + fi + fi +fi + +PYTHONLIB=-L$python_libdir +kde_orig_LIBPYTHON=$LIBPYTHON +if test -z "$LIBPYTHON"; then + LIBPYTHON=-lpython$version +fi + +AC_FIND_FILE(python$version/copy.py, $python_libdirs, python_moddir) +python_moddir=$python_moddir/python$version +if test ! -r $python_moddir/copy.py; then + python_moddir=no +fi + +PYTHONMODDIR=$python_moddir + +AC_MSG_RESULT(header $python_incdir library $python_libdir modules $python_moddir) + +if test x$python_incdir = xno || test x$python_libdir = xno || test x$python_moddir = xno; then + LIBPYTHON=$kde_orig_LIBPYTHON + test "x$PYTHONLIB" = "x-Lno" && PYTHONLIB="" + test "x$PYTHONINC" = "x-Ino" && PYTHONINC="" + $2 +else + dnl Note: this test is very weak + kde_python_link_found=no + KDE_TRY_LINK_PYTHON(normal) + KDE_TRY_LINK_PYTHON(m, -lm) + KDE_TRY_LINK_PYTHON(pthread, $LIBPTHREAD) + KDE_TRY_LINK_PYTHON(tcl, -ltcl) + KDE_TRY_LINK_PYTHON(db2, -ldb2) + KDE_TRY_LINK_PYTHON(m_and_thread, [$LIBPTHREAD -lm]) + KDE_TRY_LINK_PYTHON(m_and_thread_and_util, [$LIBPTHREAD -lm -lutil]) + KDE_TRY_LINK_PYTHON(m_and_thread_and_db3, [$LIBPTHREAD -lm -ldb-3 -lutil]) + KDE_TRY_LINK_PYTHON(pthread_and_db3, [$LIBPTHREAD -ldb-3]) + KDE_TRY_LINK_PYTHON(m_and_thread_and_db, [$LIBPTHREAD -lm -ldb -ltermcap -lutil]) + KDE_TRY_LINK_PYTHON(pthread_and_dl, [$LIBPTHREAD $LIBDL -lutil -lreadline -lncurses -lm]) + KDE_TRY_LINK_PYTHON(pthread_and_panel_curses, [$LIBPTHREAD $LIBDL -lm -lpanel -lcurses]) + KDE_TRY_LINK_PYTHON(m_and_thread_and_db_special, [$LIBPTHREAD -lm -ldb -lutil], [], + [AC_MSG_WARN([it seems, Python depends on another library. + Please set LIBPYTHON to '-lpython$version -lotherlib' before calling configure to fix this + and contact the authors to let them know about this problem]) + ]) + + LIBPYTHON="$LIBPYTHON $LIBDL $LIBSOCKET" + AC_SUBST(PYTHONINC) + AC_SUBST(PYTHONLIB) + AC_SUBST(LIBPYTHON) + AC_SUBST(PYTHONMODDIR) + AC_DEFINE(HAVE_PYTHON, 1, [Define if you have the development files for python]) +fi + +]) + + +AC_DEFUN([KDE_CHECK_PYTHON], +[ + KDE_CHECK_PYTHON_INTERN("2.4", + [KDE_CHECK_PYTHON_INTERN("2.3", + [KDE_CHECK_PYTHON_INTERN("2.2", + [KDE_CHECK_PYTHON_INTERN("2.1", + [KDE_CHECK_PYTHON_INTERN("2.0", + [KDE_CHECK_PYTHON_INTERN($1, $2) ]) + ]) + ]) + ]) + ]) +]) + +AC_DEFUN([KDE_CHECK_STL], +[ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + ac_save_CXXFLAGS="$CXXFLAGS" + CXXFLAGS="`echo $CXXFLAGS | sed s/-fno-exceptions//`" + + AC_MSG_CHECKING([if C++ programs can be compiled]) + AC_CACHE_VAL(kde_cv_stl_works, + [ + AC_TRY_COMPILE([ +#include +using namespace std; +],[ + string astring="Hallo Welt."; + astring.erase(0, 6); // now astring is "Welt" + return 0; +], kde_cv_stl_works=yes, + kde_cv_stl_works=no) +]) + + AC_MSG_RESULT($kde_cv_stl_works) + + if test "$kde_cv_stl_works" = "yes"; then + # back compatible + AC_DEFINE_UNQUOTED(HAVE_SGI_STL, 1, [Define if you have a STL implementation by SGI]) + else + AC_MSG_ERROR([Your Installation isn't able to compile simple C++ programs. +Check config.log for details - if you're using a Linux distribution you might miss +a package named similar to libstdc++-dev.]) + fi + + CXXFLAGS="$ac_save_CXXFLAGS" + AC_LANG_RESTORE +]) + +AC_DEFUN([AC_FIND_QIMGIO], + [AC_REQUIRE([AC_FIND_JPEG]) +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) +AC_MSG_CHECKING([for qimgio]) +AC_CACHE_VAL(ac_cv_lib_qimgio, +[ +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +ac_save_LIBS="$LIBS" +ac_save_CXXFLAGS="$CXXFLAGS" +LIBS="$all_libraries -lqimgio -lpng -lz $LIBJPEG $LIBQT" +CXXFLAGS="$CXXFLAGS -I$qt_incdir $all_includes" +AC_TRY_RUN(dnl +[ +#include +#include +int main() { + QString t = "hallo"; + t.fill('t'); + qInitImageIO(); +} +], + ac_cv_lib_qimgio=yes, + ac_cv_lib_qimgio=no, + ac_cv_lib_qimgio=no) +LIBS="$ac_save_LIBS" +CXXFLAGS="$ac_save_CXXFLAGS" +AC_LANG_RESTORE +])dnl +if eval "test \"`echo $ac_cv_lib_qimgio`\" = yes"; then + LIBQIMGIO="-lqimgio -lpng -lz $LIBJPEG" + AC_MSG_RESULT(yes) + AC_DEFINE_UNQUOTED(HAVE_QIMGIO, 1, [Define if you have the Qt extension qimgio available]) + AC_SUBST(LIBQIMGIO) +else + AC_MSG_RESULT(not found) +fi +]) + +AC_DEFUN([AM_DISABLE_LIBRARIES], +[ + AC_PROVIDE([AM_ENABLE_STATIC]) + AC_PROVIDE([AM_ENABLE_SHARED]) + enable_static=no + enable_shared=yes +]) + + +AC_DEFUN([AC_CHECK_UTMP_FILE], +[ + AC_MSG_CHECKING([for utmp file]) + + AC_CACHE_VAL(kde_cv_utmp_file, + [ + kde_cv_utmp_file=no + + for ac_file in \ + \ + /var/run/utmp \ + /var/adm/utmp \ + /etc/utmp \ + ; \ + do + if test -r "$ac_file"; then + kde_cv_utmp_file=$ac_file + break + fi + done + ]) + + if test "$kde_cv_utmp_file" != "no"; then + AC_DEFINE_UNQUOTED(UTMP, "$kde_cv_utmp_file", [Define the file for utmp entries]) + $1 + AC_MSG_RESULT($kde_cv_utmp_file) + else + $2 + AC_MSG_RESULT([non found]) + fi +]) + + +AC_DEFUN([KDE_CREATE_SUBDIRSLIST], +[ + +DO_NOT_COMPILE="$DO_NOT_COMPILE CVS debian bsd-port admin" +TOPSUBDIRS="" + +if test ! -s $srcdir/subdirs; then + dnl Note: Makefile.common creates subdirs, so this is just a fallback + files=`cd $srcdir && ls -1` + dirs=`for i in $files; do if test -d $i; then echo $i; fi; done` + for i in $dirs; do + echo $i >> $srcdir/subdirs + done +fi + +ac_topsubdirs= +if test -s $srcdir/inst-apps; then + ac_topsubdirs="`cat $srcdir/inst-apps`" +elif test -s $srcdir/subdirs; then + ac_topsubdirs="`cat $srcdir/subdirs`" +fi + +for i in $ac_topsubdirs; do + AC_MSG_CHECKING([if $i should be compiled]) + if test -d $srcdir/$i; then + install_it="yes" + for j in $DO_NOT_COMPILE; do + if test $i = $j; then + install_it="no" + fi + done + else + install_it="no" + fi + AC_MSG_RESULT($install_it) + vari=`echo $i | sed -e 's,[[-+.@]],_,g'` + if test $install_it = "yes"; then + TOPSUBDIRS="$TOPSUBDIRS $i" + eval "$vari""_SUBDIR_included=yes" + else + eval "$vari""_SUBDIR_included=no" + fi +done + +AC_SUBST(TOPSUBDIRS) +]) + +AC_DEFUN([KDE_CHECK_NAMESPACES], +[ +AC_MSG_CHECKING(whether C++ compiler supports namespaces) +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +AC_TRY_COMPILE([ +], +[ +namespace Foo { + extern int i; + namespace Bar { + extern int i; + } +} + +int Foo::i = 0; +int Foo::Bar::i = 1; +],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_NAMESPACES) +], [ +AC_MSG_RESULT(no) +]) +AC_LANG_RESTORE +]) + +dnl ------------------------------------------------------------------------ +dnl Check for S_ISSOCK macro. Doesn't exist on Unix SCO. faure@kde.org +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([AC_CHECK_S_ISSOCK], +[ +AC_MSG_CHECKING(for S_ISSOCK) +AC_CACHE_VAL(ac_cv_have_s_issock, +[ +AC_TRY_LINK( +[ +#include +], +[ +struct stat buff; +int b = S_ISSOCK( buff.st_mode ); +], +ac_cv_have_s_issock=yes, +ac_cv_have_s_issock=no) +]) +AC_MSG_RESULT($ac_cv_have_s_issock) +if test "$ac_cv_have_s_issock" = "yes"; then + AC_DEFINE_UNQUOTED(HAVE_S_ISSOCK, 1, [Define if sys/stat.h declares S_ISSOCK.]) +fi + +AH_VERBATIM(_ISSOCK, +[ +#ifndef HAVE_S_ISSOCK +#define HAVE_S_ISSOCK +#define S_ISSOCK(mode) (1==0) +#endif +]) + +]) + +dnl ------------------------------------------------------------------------ +dnl Check for MAXPATHLEN macro, defines KDEMAXPATHLEN. faure@kde.org +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([AC_CHECK_KDEMAXPATHLEN], +[ +AC_MSG_CHECKING(for MAXPATHLEN) +AC_CACHE_VAL(ac_cv_maxpathlen, +[ +cat > conftest.$ac_ext < +#endif +#include +#include +#ifndef MAXPATHLEN +#define MAXPATHLEN 1024 +#endif + +KDE_HELLO MAXPATHLEN + +EOF + +ac_try="$ac_cpp conftest.$ac_ext 2>/dev/null | grep '^KDE_HELLO' >conftest.out" + +if AC_TRY_EVAL(ac_try) && test -s conftest.out; then + ac_cv_maxpathlen=`sed 's#KDE_HELLO ##' conftest.out` +else + ac_cv_maxpathlen=1024 +fi + +rm conftest.* + +]) +AC_MSG_RESULT($ac_cv_maxpathlen) +AC_DEFINE_UNQUOTED(KDEMAXPATHLEN,$ac_cv_maxpathlen, [Define a safe value for MAXPATHLEN] ) +]) + +AC_DEFUN([KDE_CHECK_HEADER], +[ + kde_safe_cppflags=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $all_includes" + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_CHECK_HEADER([$1], [$2], [$3], [$4]) + AC_LANG_RESTORE + CPPFLAGS=$kde_safe_cppflags +]) + +AC_DEFUN([KDE_CHECK_HEADERS], +[ + AH_CHECK_HEADERS([$1]) + AC_LANG_SAVE + kde_safe_cppflags=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $all_includes" + AC_LANG_CPLUSPLUS + AC_CHECK_HEADERS([$1], [$2], [$3], [$4]) + CPPFLAGS=$kde_safe_cppflags + AC_LANG_RESTORE +]) + +AC_DEFUN([KDE_FAST_CONFIGURE], +[ + dnl makes configure fast (needs perl) + AC_ARG_ENABLE(fast-perl, AC_HELP_STRING([--disable-fast-perl],[disable fast Makefile generation (needs perl)]), + with_fast_perl=$enableval, with_fast_perl=yes) +]) + +AC_DEFUN([KDE_CONF_FILES], +[ + val= + if test -f $srcdir/configure.files ; then + val=`sed -e 's%^%\$(top_srcdir)/%' $srcdir/configure.files` + fi + CONF_FILES= + if test -n "$val" ; then + for i in $val ; do + CONF_FILES="$CONF_FILES $i" + done + fi + AC_SUBST(CONF_FILES) +])dnl + +dnl This sets the prefix, for arts and kdelibs +dnl Do NOT use in any other module. +dnl It only looks at --prefix, KDEDIR and falls back to /usr/local/kde +AC_DEFUN([KDE_SET_PREFIX_CORE], +[ + unset CDPATH + dnl make $KDEDIR the default for the installation + AC_PREFIX_DEFAULT(${KDEDIR:-/usr/local/kde}) + + if test "x$prefix" = "xNONE"; then + prefix=$ac_default_prefix + ac_configure_args="$ac_configure_args --prefix=$prefix" + fi + # And delete superfluous '/' to make compares easier + prefix=`echo "$prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` + exec_prefix=`echo "$exec_prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` + + kde_libs_prefix='$(prefix)' + kde_libs_htmldir='$(kde_htmldir)' + AC_SUBST(kde_libs_prefix) + AC_SUBST(kde_libs_htmldir) + KDE_FAST_CONFIGURE + KDE_CONF_FILES +]) + + +AC_DEFUN([KDE_SET_PREFIX], +[ + unset CDPATH + dnl We can't give real code to that macro, only a value. + dnl It only matters for --help, since we set the prefix in this function anyway. + AC_PREFIX_DEFAULT(${KDEDIR:-the kde prefix}) + + KDE_SET_DEFAULT_BINDIRS + if test "x$prefix" = "xNONE"; then + dnl no prefix given: look for kde-config in the PATH and deduce the prefix from it + KDE_FIND_PATH(kde-config, KDECONFIG, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(kde-config)], [], prepend) + else + dnl prefix given: look for kde-config, preferrably in prefix, otherwise in PATH + kde_save_PATH="$PATH" + PATH="$exec_prefix/bin:$prefix/bin:$PATH" + KDE_FIND_PATH(kde-config, KDECONFIG, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(kde-config)], [], prepend) + PATH="$kde_save_PATH" + fi + + kde_libs_prefix=`$KDECONFIG --prefix` + if test -z "$kde_libs_prefix" || test ! -x "$kde_libs_prefix"; then + AC_MSG_ERROR([$KDECONFIG --prefix outputed the non existant prefix '$kde_libs_prefix' for kdelibs. + This means it has been moved since you installed it. + This won't work. Please recompile kdelibs for the new prefix. + ]) + fi + kde_libs_htmldir=`$KDECONFIG --install html --expandvars` + kde_libs_suffix=`$KDECONFIG --libsuffix` || kde_libs_suffix=auto + + AC_MSG_CHECKING([where to install]) + if test "x$prefix" = "xNONE"; then + prefix=$kde_libs_prefix + AC_MSG_RESULT([$prefix (as returned by kde-config)]) + else + dnl --prefix was given. Compare prefixes and warn (in configure.in.bot.end) if different + given_prefix=$prefix + AC_MSG_RESULT([$prefix (as requested)]) + fi + + # And delete superfluous '/' to make compares easier + prefix=`echo "$prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` + exec_prefix=`echo "$exec_prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` + given_prefix=`echo "$given_prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` + + AC_SUBST(KDECONFIG) + AC_SUBST(kde_libs_prefix) + AC_SUBST(kde_libs_htmldir) + + KDE_FAST_CONFIGURE + KDE_CONF_FILES +]) + +pushdef([AC_PROG_INSTALL], +[ + dnl our own version, testing for a -p flag + popdef([AC_PROG_INSTALL]) + dnl as AC_PROG_INSTALL works as it works we first have + dnl to save if the user didn't specify INSTALL, as the + dnl autoconf one overwrites INSTALL and we have no chance to find + dnl out afterwards + test -n "$INSTALL" && kde_save_INSTALL_given=$INSTALL + test -n "$INSTALL_PROGRAM" && kde_save_INSTALL_PROGRAM_given=$INSTALL_PROGRAM + test -n "$INSTALL_SCRIPT" && kde_save_INSTALL_SCRIPT_given=$INSTALL_SCRIPT + AC_PROG_INSTALL + + if test -z "$kde_save_INSTALL_given" ; then + # OK, user hasn't given any INSTALL, autoconf found one for us + # now we test, if it supports the -p flag + AC_MSG_CHECKING(for -p flag to install) + rm -f confinst.$$.* > /dev/null 2>&1 + echo "Testtest" > confinst.$$.orig + ac_res=no + if ${INSTALL} -p confinst.$$.orig confinst.$$.new > /dev/null 2>&1 ; then + if test -f confinst.$$.new ; then + # OK, -p seems to do no harm to install + INSTALL="${INSTALL} -p" + ac_res=yes + fi + fi + rm -f confinst.$$.* + AC_MSG_RESULT($ac_res) + fi + dnl the following tries to resolve some signs and wonders coming up + dnl with different autoconf/automake versions + dnl e.g.: + dnl *automake 1.4 install-strip sets A_M_INSTALL_PROGRAM_FLAGS to -s + dnl and has INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(A_M_INSTALL_PROGRAM_FLAGS) + dnl it header-vars.am, so there the actual INSTALL_PROGRAM gets the -s + dnl *automake 1.4a (and above) use INSTALL_STRIP_FLAG and only has + dnl INSTALL_PROGRAM = @INSTALL_PROGRAM@ there, but changes the + dnl install-@DIR@PROGRAMS targets to explicitly use that flag + dnl *autoconf 2.13 is dumb, and thinks it can use INSTALL_PROGRAM as + dnl INSTALL_SCRIPT, which breaks with automake <= 1.4 + dnl *autoconf >2.13 (since 10.Apr 1999) has not that failure + dnl *sometimes KDE does not use the install-@DIR@PROGRAM targets from + dnl automake (due to broken Makefile.am or whatever) to install programs, + dnl and so does not see the -s flag in automake > 1.4 + dnl to clean up that mess we: + dnl +set INSTALL_PROGRAM to use INSTALL_STRIP_FLAG + dnl which cleans KDE's program with automake > 1.4; + dnl +set INSTALL_SCRIPT to only use INSTALL, to clean up autoconf's problems + dnl with automake<=1.4 + dnl note that dues to this sometimes two '-s' flags are used (if KDE + dnl properly uses install-@DIR@PROGRAMS, but I don't care + dnl + dnl And to all this comes, that I even can't write in comments variable + dnl names used by automake, because it is so stupid to think I wanted to + dnl _use_ them, therefor I have written A_M_... instead of AM_ + dnl hmm, I wanted to say something ... ahh yes: Arghhh. + + if test -z "$kde_save_INSTALL_PROGRAM_given" ; then + INSTALL_PROGRAM='${INSTALL} $(INSTALL_STRIP_FLAG)' + fi + if test -z "$kde_save_INSTALL_SCRIPT_given" ; then + INSTALL_SCRIPT='${INSTALL}' + fi +])dnl + +AC_DEFUN([KDE_LANG_CPLUSPLUS], +[AC_LANG_CPLUSPLUS +ac_link='rm -rf SunWS_cache; ${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&AC_FD_CC' +pushdef([AC_LANG_CPLUSPLUS], [popdef([AC_LANG_CPLUSPLUS]) KDE_LANG_CPLUSPLUS]) +]) + +pushdef([AC_LANG_CPLUSPLUS], +[popdef([AC_LANG_CPLUSPLUS]) +KDE_LANG_CPLUSPLUS +]) + +AC_DEFUN([KDE_CHECK_LONG_LONG], +[ +AC_MSG_CHECKING(for long long) +AC_CACHE_VAL(kde_cv_c_long_long, +[ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_LINK([], [ + long long foo = 0; + foo = foo+1; + ], + kde_cv_c_long_long=yes, kde_cv_c_long_long=no) + AC_LANG_RESTORE +]) +AC_MSG_RESULT($kde_cv_c_long_long) +if test "$kde_cv_c_long_long" = yes; then + AC_DEFINE(HAVE_LONG_LONG, 1, [Define if you have long long as datatype]) +fi +]) + +AC_DEFUN([KDE_CHECK_LIB], +[ + kde_save_LDFLAGS="$LDFLAGS" + dnl AC_CHECK_LIB modifies LIBS, so save it here + kde_save_LIBS="$LIBS" + LDFLAGS="$LDFLAGS $all_libraries" + case $host_os in + aix*) LDFLAGS="-brtl $LDFLAGS" + test "$GCC" = yes && LDFLAGS="-Wl,$LDFLAGS" + ;; + esac + AC_CHECK_LIB($1, $2, $3, $4, $5) + LDFLAGS="$kde_save_LDFLAGS" + LIBS="$kde_save_LIBS" +]) + +AC_DEFUN([KDE_JAVA_PREFIX], +[ + dir=`dirname "$1"` + base=`basename "$1"` + list=`ls -1 $dir 2> /dev/null` + for entry in $list; do + if test -d $dir/$entry/bin; then + case $entry in + $base) + javadirs="$javadirs $dir/$entry/bin" + ;; + esac + elif test -d $dir/$entry/jre/bin; then + case $entry in + $base) + javadirs="$javadirs $dir/$entry/jre/bin" + ;; + esac + fi + done +]) + +dnl KDE_CHEC_JAVA_DIR(onlyjre) +AC_DEFUN([KDE_CHECK_JAVA_DIR], +[ + +AC_ARG_WITH(java, +AC_HELP_STRING([--with-java=javadir],[use java installed in javadir, --without-java disables]), +[ ac_java_dir=$withval +], ac_java_dir="" +) + +AC_MSG_CHECKING([for Java]) + +dnl at this point ac_java_dir is either a dir, 'no' to disable, or '' to say look in $PATH +if test "x$ac_java_dir" = "xno"; then + kde_java_bindir=no + kde_java_includedir=no + kde_java_libjvmdir=no + kde_java_libgcjdir=no + kde_java_libhpidir=no +else + if test "x$ac_java_dir" = "x"; then + + + dnl No option set -> collect list of candidate paths + if test -n "$JAVA_HOME"; then + KDE_JAVA_PREFIX($JAVA_HOME) + fi + KDE_JAVA_PREFIX(/usr/j2se) + KDE_JAVA_PREFIX(/usr/lib/j2se) + KDE_JAVA_PREFIX(/usr/j*dk*) + KDE_JAVA_PREFIX(/usr/lib/j*dk*) + KDE_JAVA_PREFIX(/opt/j*sdk*) + KDE_JAVA_PREFIX(/usr/lib/java*) + KDE_JAVA_PREFIX(/usr/java*) + KDE_JAVA_PREFIX(/usr/java/j*dk*) + KDE_JAVA_PREFIX(/usr/java/j*re*) + KDE_JAVA_PREFIX(/usr/lib/SunJava2*) + KDE_JAVA_PREFIX(/usr/lib/SunJava*) + KDE_JAVA_PREFIX(/usr/lib/IBMJava2*) + KDE_JAVA_PREFIX(/usr/lib/IBMJava*) + KDE_JAVA_PREFIX(/opt/java*) + + kde_cv_path="NONE" + kde_save_IFS=$IFS + IFS=':' + for dir in $PATH; do + if test -d "$dir"; then + javadirs="$javadirs $dir" + fi + done + IFS=$kde_save_IFS + jredirs= + + dnl Now javadirs contains a list of paths that exist, all ending with bin/ + for dir in $javadirs; do + dnl Check for the java executable + if test -x "$dir/java"; then + dnl And also check for a libjvm.so somewhere under there + dnl Since we have to go to the parent dir, /usr/bin is excluded, /usr is too big. + if test "$dir" != "/usr/bin"; then + libjvmdir=`find $dir/.. -name libjvm.so | sed 's,libjvm.so,,'|head -n 1` + if test ! -f $libjvmdir/libjvm.so; then continue; fi + jredirs="$jredirs $dir" + fi + fi + done + + dnl Now jredirs contains a reduced list, of paths where both java and ../**/libjvm.so was found + JAVAC= + JAVA= + kde_java_bindir=no + for dir in $jredirs; do + JAVA="$dir/java" + kde_java_bindir=$dir + if test -x "$dir/javac"; then + JAVAC="$dir/javac" + break + fi + done + + if test -n "$JAVAC"; then + dnl this substitution might not work - well, we test for jni.h below + kde_java_includedir=`echo $JAVAC | sed -e 's,bin/javac$,include/,'` + else + kde_java_includedir=no + fi + else + dnl config option set + kde_java_bindir=$ac_java_dir/bin + if test -x $ac_java_dir/bin/java && test ! -x $ac_java_dir/bin/javac; then + kde_java_includedir=no + else + kde_java_includedir=$ac_java_dir/include + fi + fi +fi + +dnl At this point kde_java_bindir and kde_java_includedir are either set or "no" +if test "x$kde_java_bindir" != "xno"; then + + dnl Look for libjvm.so + kde_java_libjvmdir=`find $kde_java_bindir/.. -name libjvm.so | sed 's,libjvm.so,,'|head -n 1` + dnl Look for libgcj.so + kde_java_libgcjdir=`find $kde_java_bindir/.. -name libgcj.so | sed 's,libgcj.so,,'|head -n 1` + dnl Look for libhpi.so and avoid green threads + kde_java_libhpidir=`find $kde_java_bindir/.. -name libhpi.so | grep -v green | sed 's,libhpi.so,,' | head -n 1` + + dnl Now check everything's fine under there + dnl the include dir is our flag for having the JDK + if test -d "$kde_java_includedir"; then + if test ! -x "$kde_java_bindir/javac"; then + AC_MSG_ERROR([javac not found under $kde_java_bindir - it seems you passed a wrong --with-java.]) + fi + if test ! -x "$kde_java_bindir/javah"; then + AC_MSG_ERROR([javah not found under $kde_java_bindir. javac was found though! Use --with-java or --without-java.]) + fi + if test ! -x "$kde_java_bindir/jar"; then + AC_MSG_ERROR([jar not found under $kde_java_bindir. javac was found though! Use --with-java or --without-java.]) + fi + if test ! -r "$kde_java_includedir/jni.h"; then + AC_MSG_ERROR([jni.h not found under $kde_java_includedir. Use --with-java or --without-java.]) + fi + + jni_includes="-I$kde_java_includedir" + dnl Strange thing, jni.h requires jni_md.h which is under genunix here.. + dnl and under linux here.. + + dnl not needed for gcj + + if test "x$kde_java_libgcjdir" = "x"; then + test -d "$kde_java_includedir/linux" && jni_includes="$jni_includes -I$kde_java_includedir/linux" + test -d "$kde_java_includedir/solaris" && jni_includes="$jni_includes -I$kde_java_includedir/solaris" + test -d "$kde_java_includedir/genunix" && jni_includes="$jni_includes -I$kde_java_includedir/genunix" + fi + + else + JAVAC= + jni_includes= + fi + + if test "x$kde_java_libgcjdir" = "x"; then + if test ! -r "$kde_java_libjvmdir/libjvm.so"; then + AC_MSG_ERROR([libjvm.so not found under $kde_java_libjvmdir. Use --without-java.]) + fi + else + if test ! -r "$kde_java_libgcjdir/libgcj.so"; then + AC_MSG_ERROR([libgcj.so not found under $kde_java_libgcjdir. Use --without-java.]) + fi + fi + + if test ! -x "$kde_java_bindir/java"; then + AC_MSG_ERROR([java not found under $kde_java_bindir. javac was found though! Use --with-java or --without-java.]) + fi + + dnl not needed for gcj compile + + if test "x$kde_java_libgcjdir" = "x"; then + if test ! -r "$kde_java_libhpidir/libhpi.so"; then + AC_MSG_ERROR([libhpi.so not found under $kde_java_libhpidir. Use --without-java.]) + fi + fi + + if test -n "$jni_includes"; then + dnl Check for JNI version + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + ac_cxxflags_safe="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS $all_includes $jni_includes" + + AC_TRY_COMPILE([ + #include + ], + [ + #ifndef JNI_VERSION_1_2 + Syntax Error + #endif + ],[ kde_jni_works=yes ], + [ kde_jni_works=no ]) + + if test $kde_jni_works = no; then + AC_MSG_ERROR([Incorrect version of $kde_java_includedir/jni.h. + You need to have Java Development Kit (JDK) version 1.2. + + Use --with-java to specify another location. + Use --without-java to configure without java support. + Or download a newer JDK and try again. + See e.g. http://java.sun.com/products/jdk/1.2 ]) + fi + + CXXFLAGS="$ac_cxxflags_safe" + AC_LANG_RESTORE + + dnl All tests ok, inform and subst the variables + + JAVAC=$kde_java_bindir/javac + JAVAH=$kde_java_bindir/javah + JAR=$kde_java_bindir/jar + AC_DEFINE_UNQUOTED(PATH_JAVA, "$kde_java_bindir/java", [Define where your java executable is]) + if test "x$kde_java_libgcjdir" = "x"; then + JVMLIBS="-L$kde_java_libjvmdir -ljvm -L$kde_java_libhpidir -lhpi" + else + JVMLIBS="-L$kde_java_libgcjdir -lgcj" + fi + AC_MSG_RESULT([java JDK in $kde_java_bindir]) + + else + AC_DEFINE_UNQUOTED(PATH_JAVA, "$kde_java_bindir/java", [Define where your java executable is]) + AC_MSG_RESULT([java JRE in $kde_java_bindir]) + fi +elif test -d "/Library/Java/Home"; then + kde_java_bindir="/Library/Java/Home/bin" + jni_includes="-I/Library/Java/Home/include" + + JAVAC=$kde_java_bindir/javac + JAVAH=$kde_java_bindir/javah + JAR=$kde_java_bindir/jar + JVMLIBS="-Wl,-framework,JavaVM" + + AC_DEFINE_UNQUOTED(PATH_JAVA, "$kde_java_bindir/java", [Define where your java executable is]) + AC_MSG_RESULT([Apple Java Framework]) +else + AC_MSG_RESULT([none found]) +fi + +AC_SUBST(JAVAC) +AC_SUBST(JAVAH) +AC_SUBST(JAR) +AC_SUBST(JVMLIBS) +AC_SUBST(jni_includes) + +# for backward compat +kde_cv_java_includedir=$kde_java_includedir +kde_cv_java_bindir=$kde_java_bindir +]) + +dnl this is a redefinition of autoconf 2.5x's AC_FOREACH. +dnl When the argument list becomes big, as in KDE for AC_OUTPUT in +dnl big packages, m4_foreach is dog-slow. So use our own version of +dnl it. (matz@kde.org) +m4_define([mm_foreach], +[m4_pushdef([$1])_mm_foreach($@)m4_popdef([$1])]) +m4_define([mm_car], [[$1]]) +m4_define([mm_car2], [[$@]]) +m4_define([_mm_foreach], +[m4_if(m4_quote($2), [], [], + [m4_define([$1], mm_car($2))$3[]_mm_foreach([$1], + mm_car2(m4_shift($2)), + [$3])])]) +m4_define([AC_FOREACH], +[mm_foreach([$1], m4_split(m4_normalize([$2])), [$3])]) + +AC_DEFUN([KDE_NEED_FLEX], +[ +kde_libs_safe=$LIBS +LIBS="$LIBS $USER_LDFLAGS" +AM_PROG_LEX +LIBS=$kde_libs_safe +if test -z "$LEXLIB"; then + AC_MSG_ERROR([You need to have flex installed.]) +fi +AC_SUBST(LEXLIB) +]) + +AC_DEFUN([AC_PATH_QTOPIA], +[ + dnl TODO: use AC_CACHE_VAL + + if test -z "$1"; then + qtopia_minver_maj=1 + qtopia_minver_min=5 + qtopia_minver_pat=0 + else + qtopia_minver_maj=`echo "$1" | sed -e "s/^\(.*\)\..*\..*$/\1/"` + qtopia_minver_min=`echo "$1" | sed -e "s/^.*\.\(.*\)\..*$/\1/"` + qtopia_minver_pat=`echo "$1" | sed -e "s/^.*\..*\.\(.*\)$/\1/"` + fi + + qtopia_minver="$qtopia_minver_maj$qtopia_minver_min$qtopia_minver_pat" + qtopia_minverstr="$qtopia_minver_maj.$qtopia_minver_min.$qtopia_minver_pat" + + AC_REQUIRE([AC_PATH_QT]) + + AC_MSG_CHECKING([for Qtopia]) + + LIB_QTOPIA="-lqpe" + AC_SUBST(LIB_QTOPIA) + + kde_qtopia_dirs="$QPEDIR /opt/Qtopia" + + ac_qtopia_incdir=NO + + AC_ARG_WITH(qtopia-dir, + AC_HELP_STRING([--with-qtopia-dir=DIR],[where the root of Qtopia is installed]), + [ ac_qtopia_incdir="$withval"/include] ) + + qtopia_incdirs="" + for dir in $kde_qtopia_dirs; do + qtopia_incdirs="$qtopia_incdirs $dir/include" + done + + if test ! "$ac_qtopia_incdir" = "NO"; then + qtopia_incdirs="$ac_qtopia_incdir $qtopia_incdirs" + fi + + qtopia_incdir="" + AC_FIND_FILE(qpe/qpeapplication.h, $qtopia_incdirs, qtopia_incdir) + ac_qtopia_incdir="$qtopia_incdir" + + if test -z "$qtopia_incdir"; then + AC_MSG_ERROR([Cannot find Qtopia headers. Please check your installation.]) + fi + + qtopia_ver_maj=`cat $qtopia_incdir/qpe/version.h | sed -n -e 's,.*QPE_VERSION "\(.*\)\..*\..*".*,\1,p'`; + qtopia_ver_min=`cat $qtopia_incdir/qpe/version.h | sed -n -e 's,.*QPE_VERSION ".*\.\(.*\)\..*".*,\1,p'`; + qtopia_ver_pat=`cat $qtopia_incdir/qpe/version.h | sed -n -e 's,.*QPE_VERSION ".*\..*\.\(.*\)".*,\1,p'`; + + qtopia_ver="$qtopia_ver_maj$qtopia_ver_min$qtopia_ver_pat" + qtopia_verstr="$qtopia_ver_maj.$qtopia_ver_min.$qtopia_ver_pat" + if test "$qtopia_ver" -lt "$qtopia_minver"; then + AC_MSG_ERROR([found Qtopia version $qtopia_verstr but version $qtopia_minverstr +is required.]) + fi + + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + + ac_cxxflags_safe="$CXXFLAGS" + ac_ldflags_safe="$LDFLAGS" + ac_libs_safe="$LIBS" + + CXXFLAGS="$CXXFLAGS -I$qtopia_incdir $all_includes" + LDFLAGS="$LDFLAGS $QT_LDFLAGS $all_libraries $USER_LDFLAGS $KDE_MT_LDFLAGS" + LIBS="$LIBS $LIB_QTOPIA $LIBQT" + + cat > conftest.$ac_ext < +#include + +int main( int argc, char **argv ) +{ + QPEApplication app( argc, argv ); + return 0; +} +EOF + + if AC_TRY_EVAL(ac_link) && test -s conftest; then + rm -f conftest* + else + rm -f conftest* + AC_MSG_ERROR([Cannot link small Qtopia Application. For more details look at +the end of config.log]) + fi + + CXXFLAGS="$ac_cxxflags_safe" + LDFLAGS="$ac_ldflags_safe" + LIBS="$ac_libs_safe" + + AC_LANG_RESTORE + + QTOPIA_INCLUDES="-I$qtopia_incdir" + AC_SUBST(QTOPIA_INCLUDES) + + AC_MSG_RESULT([found version $qtopia_verstr with headers at $qtopia_incdir]) +]) + + +AC_DEFUN([KDE_INIT_DOXYGEN], +[ +AC_MSG_CHECKING([for Qt docs]) +kde_qtdir= +if test "${with_qt_dir+set}" = set; then + kde_qtdir="$with_qt_dir" +fi + +AC_FIND_FILE(qsql.html, [ $kde_qtdir/doc/html $QTDIR/doc/html /usr/share/doc/packages/qt3/html /usr/lib/qt/doc /usr/lib/qt3/doc /usr/lib/qt3/doc/html /usr/doc/qt3/html /usr/doc/qt3 /usr/share/doc/qt3-doc /usr/share/qt3/doc/html /usr/X11R6/share/doc/qt/html ], QTDOCDIR) +AC_MSG_RESULT($QTDOCDIR) + +AC_SUBST(QTDOCDIR) + +KDE_FIND_PATH(dot, DOT, [], []) +if test -n "$DOT"; then + KDE_HAVE_DOT="YES" +else + KDE_HAVE_DOT="NO" +fi +AC_SUBST(KDE_HAVE_DOT) +KDE_FIND_PATH(doxygen, DOXYGEN, [], []) +AC_SUBST(DOXYGEN) + +DOXYGEN_PROJECT_NAME="$1" +DOXYGEN_PROJECT_NUMBER="$2" +AC_SUBST(DOXYGEN_PROJECT_NAME) +AC_SUBST(DOXYGEN_PROJECT_NUMBER) + +KDE_HAS_DOXYGEN=no +if test -n "$DOXYGEN" && test -x "$DOXYGEN" && test -f $QTDOCDIR/qsql.html; then + KDE_HAS_DOXYGEN=yes +fi +AC_SUBST(KDE_HAS_DOXYGEN) + +]) + + +AC_DEFUN([AC_FIND_BZIP2], +[ +AC_MSG_CHECKING([for bzDecompress in libbz2]) +AC_CACHE_VAL(ac_cv_lib_bzip2, +[ +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +kde_save_LIBS="$LIBS" +LIBS="$all_libraries $USER_LDFLAGS -lbz2 $LIBSOCKET" +kde_save_CXXFLAGS="$CXXFLAGS" +CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES" +AC_TRY_LINK(dnl +[ +#define BZ_NO_STDIO +#include +], + [ bz_stream s; (void) bzDecompress(&s); ], + eval "ac_cv_lib_bzip2='-lbz2'", + eval "ac_cv_lib_bzip2=no") +LIBS="$kde_save_LIBS" +CXXFLAGS="$kde_save_CXXFLAGS" +AC_LANG_RESTORE +])dnl +AC_MSG_RESULT($ac_cv_lib_bzip2) + +if test ! "$ac_cv_lib_bzip2" = no; then + BZIP2DIR=bzip2 + + LIBBZ2="$ac_cv_lib_bzip2" + AC_SUBST(LIBBZ2) + +else + + cxx_shared_flag= + ld_shared_flag= + KDE_CHECK_COMPILER_FLAG(shared, [ + ld_shared_flag="-shared" + ]) + KDE_CHECK_COMPILER_FLAG(fPIC, [ + cxx_shared_flag="-fPIC" + ]) + + AC_MSG_CHECKING([for BZ2_bzDecompress in (shared) libbz2]) + AC_CACHE_VAL(ac_cv_lib_bzip2_prefix, + [ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + kde_save_LIBS="$LIBS" + LIBS="$all_libraries $USER_LDFLAGS $ld_shared_flag -lbz2 $LIBSOCKET" + kde_save_CXXFLAGS="$CXXFLAGS" + CXXFLAGS="$CFLAGS $cxx_shared_flag $all_includes $USER_INCLUDES" + + AC_TRY_LINK(dnl + [ + #define BZ_NO_STDIO + #include + ], + [ bz_stream s; (void) BZ2_bzDecompress(&s); ], + eval "ac_cv_lib_bzip2_prefix='-lbz2'", + eval "ac_cv_lib_bzip2_prefix=no") + LIBS="$kde_save_LIBS" + CXXFLAGS="$kde_save_CXXFLAGS" + AC_LANG_RESTORE + ])dnl + + AC_MSG_RESULT($ac_cv_lib_bzip2_prefix) + + if test ! "$ac_cv_lib_bzip2_prefix" = no; then + BZIP2DIR=bzip2 + + LIBBZ2="$ac_cv_lib_bzip2_prefix" + AC_SUBST(LIBBZ2) + + AC_DEFINE(NEED_BZ2_PREFIX, 1, [Define if the libbz2 functions need the BZ2_ prefix]) + dnl else, we just ignore this + fi + +fi +AM_CONDITIONAL(include_BZIP2, test -n "$BZIP2DIR") +]) + +dnl ------------------------------------------------------------------------ +dnl Try to find the SSL headers and libraries. +dnl $(SSL_LDFLAGS) will be -Lsslliblocation (if needed) +dnl and $(SSL_INCLUDES) will be -Isslhdrlocation (if needed) +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([KDE_CHECK_SSL], +[ +LIBSSL="-lssl -lcrypto" +AC_REQUIRE([KDE_CHECK_LIB64]) + +ac_ssl_includes=NO ac_ssl_libraries=NO +ssl_libraries="" +ssl_includes="" +AC_ARG_WITH(ssl-dir, + AC_HELP_STRING([--with-ssl-dir=DIR],[where the root of OpenSSL is installed]), + [ ac_ssl_includes="$withval"/include + ac_ssl_libraries="$withval"/lib$kdelibsuff + ]) + +want_ssl=yes +AC_ARG_WITH(ssl, + AC_HELP_STRING([--without-ssl],[disable SSL checks]), + [want_ssl=$withval]) + +if test $want_ssl = yes; then + +AC_MSG_CHECKING(for OpenSSL) + +AC_CACHE_VAL(ac_cv_have_ssl, +[#try to guess OpenSSL locations + + ssl_incdirs="/usr/include /usr/local/include /usr/ssl/include /usr/local/ssl/include $prefix/include $kde_extra_includes" + ssl_incdirs="$ac_ssl_includes $ssl_incdirs" + AC_FIND_FILE(openssl/ssl.h, $ssl_incdirs, ssl_incdir) + ac_ssl_includes="$ssl_incdir" + + ssl_libdirs="/usr/lib$kdelibsuff /usr/local/lib$kdelibsuff /usr/ssl/lib$kdelibsuff /usr/local/ssl/lib$kdelibsuff $libdir $prefix/lib$kdelibsuff $exec_prefix/lib$kdelibsuff $kde_extra_libs" + if test ! "$ac_ssl_libraries" = "NO"; then + ssl_libdirs="$ac_ssl_libraries $ssl_libdirs" + fi + + test=NONE + ssl_libdir=NONE + for dir in $ssl_libdirs; do + try="ls -1 $dir/libssl*" + if test=`eval $try 2> /dev/null`; then ssl_libdir=$dir; break; else echo "tried $dir" >&AC_FD_CC ; fi + done + + ac_ssl_libraries="$ssl_libdir" + + ac_ldflags_safe="$LDFLAGS" + ac_libs_safe="$LIBS" + + LDFLAGS="$LDFLAGS -L$ssl_libdir $all_libraries" + LIBS="$LIBS $LIBSSL -lRSAglue -lrsaref" + + AC_TRY_LINK(,void RSAPrivateEncrypt(void);RSAPrivateEncrypt();, + ac_ssl_rsaref="yes" + , + ac_ssl_rsaref="no" + ) + + LDFLAGS="$ac_ldflags_safe" + LIBS="$ac_libs_safe" + + if test "$ac_ssl_includes" = NO || test "$ac_ssl_libraries" = NO; then + have_ssl=no + else + have_ssl=yes; + fi + + ]) + + eval "$ac_cv_have_ssl" + + AC_MSG_RESULT([libraries $ac_ssl_libraries, headers $ac_ssl_includes]) + + AC_MSG_CHECKING([whether OpenSSL uses rsaref]) + AC_MSG_RESULT($ac_ssl_rsaref) + + AC_MSG_CHECKING([for easter eggs]) + AC_MSG_RESULT([none found]) + +else + have_ssl=no +fi + +if test "$have_ssl" = yes; then + AC_MSG_CHECKING(for OpenSSL version) + dnl Check for SSL version + AC_CACHE_VAL(ac_cv_ssl_version, + [ + + cat >conftest.$ac_ext < +#include + int main() { + +#ifndef OPENSSL_VERSION_NUMBER + printf("ssl_version=\\"error\\"\n"); +#else + if (OPENSSL_VERSION_NUMBER < 0x00906000) + printf("ssl_version=\\"old\\"\n"); + else + printf("ssl_version=\\"ok\\"\n"); +#endif + return (0); + } +EOF + + ac_save_CPPFLAGS=$CPPFLAGS + if test "$ac_ssl_includes" != "/usr/include"; then + CPPFLAGS="$CPPFLAGS -I$ac_ssl_includes" + fi + + if AC_TRY_EVAL(ac_link); then + + if eval `./conftest 2>&5`; then + if test $ssl_version = error; then + AC_MSG_ERROR([$ssl_incdir/openssl/opensslv.h doesn't define OPENSSL_VERSION_NUMBER !]) + else + if test $ssl_version = old; then + AC_MSG_WARN([OpenSSL version too old. Upgrade to 0.9.6 at least, see http://www.openssl.org. SSL support disabled.]) + have_ssl=no + fi + fi + ac_cv_ssl_version="ssl_version=$ssl_version" + else + AC_MSG_ERROR([Your system couldn't run a small SSL test program. + Check config.log, and if you can't figure it out, send a mail to + David Faure , attaching your config.log]) + fi + + else + AC_MSG_ERROR([Your system couldn't link a small SSL test program. + Check config.log, and if you can't figure it out, send a mail to + David Faure , attaching your config.log]) + fi + CPPFLAGS=$ac_save_CPPFLAGS + + ]) + + eval "$ac_cv_ssl_version" + AC_MSG_RESULT($ssl_version) +fi + +if test "$have_ssl" != yes; then + LIBSSL=""; +else + AC_DEFINE(HAVE_SSL, 1, [If we are going to use OpenSSL]) + ac_cv_have_ssl="have_ssl=yes \ + ac_ssl_includes=$ac_ssl_includes ac_ssl_libraries=$ac_ssl_libraries ac_ssl_rsaref=$ac_ssl_rsaref" + + + ssl_libraries="$ac_ssl_libraries" + ssl_includes="$ac_ssl_includes" + + if test "$ac_ssl_rsaref" = yes; then + LIBSSL="-lssl -lcrypto -lRSAglue -lrsaref" + fi + + if test $ssl_version = "old"; then + AC_DEFINE(HAVE_OLD_SSL_API, 1, [Define if you have OpenSSL < 0.9.6]) + fi +fi + +SSL_INCLUDES= + +if test "$ssl_includes" = "/usr/include"; then + if test -f /usr/kerberos/include/krb5.h; then + SSL_INCLUDES="-I/usr/kerberos/include" + fi +elif test "$ssl_includes" != "/usr/local/include" && test -n "$ssl_includes"; then + SSL_INCLUDES="-I$ssl_includes" +fi + +if test "$ssl_libraries" = "/usr/lib" || test "$ssl_libraries" = "/usr/local/lib" || test -z "$ssl_libraries" || test "$ssl_libraries" = "NONE"; then + SSL_LDFLAGS="" +else + SSL_LDFLAGS="-L$ssl_libraries -R$ssl_libraries" +fi + +AC_SUBST(SSL_INCLUDES) +AC_SUBST(SSL_LDFLAGS) +AC_SUBST(LIBSSL) +]) + +AC_DEFUN([KDE_CHECK_STRLCPY], +[ + AC_REQUIRE([AC_CHECK_STRLCAT]) + AC_REQUIRE([AC_CHECK_STRLCPY]) + AC_CHECK_SIZEOF(size_t) + AC_CHECK_SIZEOF(unsigned long) + + AC_MSG_CHECKING([sizeof size_t == sizeof unsigned long]) + AC_TRY_COMPILE(,[ + #if SIZEOF_SIZE_T != SIZEOF_UNSIGNED_LONG + choke me + #endif + ],AC_MSG_RESULT([yes]),[ + AC_MSG_RESULT(no) + AC_MSG_ERROR([ + Apparently on your system our assumption sizeof size_t == sizeof unsigned long + does not apply. Please mail kde-devel@kde.org with a description of your system! + ]) + ]) +]) + +AC_DEFUN([KDE_CHECK_BINUTILS], +[ + AC_MSG_CHECKING([if ld supports unversioned version maps]) + + kde_save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -Wl,--version-script=conftest.map" + echo "{ local: extern \"C++\" { foo }; };" > conftest.map + AC_TRY_LINK([int foo;], +[ +#ifdef __INTEL_COMPILER +icc apparently does not support libtools version-info and version-script +at the same time. Dunno where the bug is, but until somebody figured out, +better disable the optional version scripts. +#endif + + foo = 42; +], kde_supports_versionmaps=yes, kde_supports_versionmaps=no) + LDFLAGS="$kde_save_LDFLAGS" + rm -f conftest.map + AM_CONDITIONAL(include_VERSION_SCRIPT, + [test "$kde_supports_versionmaps" = "yes" && test "$kde_use_debug_code" = "no"]) + + AC_MSG_RESULT($kde_supports_versionmaps) +]) + +AC_DEFUN([AM_PROG_OBJC],[ +AC_CHECK_PROGS(OBJC, gcc, gcc) +test -z "$OBJC" && AC_MSG_ERROR([no acceptable objective-c gcc found in \$PATH]) +if test "x${OBJCFLAGS-unset}" = xunset; then + OBJCFLAGS="-g -O2" +fi +AC_SUBST(OBJCFLAGS) +_AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES(OBJC)]) +]) + +AC_DEFUN([KDE_CHECK_PERL], +[ + KDE_FIND_PATH(perl, PERL, [$bindir $exec_prefix/bin $prefix/bin], [ + AC_MSG_ERROR([No Perl found in your $PATH. +We need perl to generate some code.]) + ]) + AC_SUBST(PERL) +]) + +AC_DEFUN([KDE_CHECK_LARGEFILE], +[ +AC_SYS_LARGEFILE +if test "$ac_cv_sys_file_offset_bits" != no; then + CPPFLAGS="$CPPFLAGS -D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits" +fi + +if test "x$ac_cv_sys_large_files" != "xno"; then + CPPFLAGS="$CPPFLAGS -D_LARGE_FILES=1" +fi + +]) + +dnl A small extension to PKG_CHECK_MODULES (defined in pkg.m4.in) +dnl which allows to search for libs that get installed into the KDE prefix. +dnl +dnl Syntax: KDE_PKG_CHECK_MODULES(KSTUFF, libkexif >= 0.2 glib = 1.3.4, action-if, action-not) +dnl defines KSTUFF_LIBS, KSTUFF_CFLAGS, see pkg-config man page +dnl also defines KSTUFF_PKG_ERRORS on error +AC_DEFUN([KDE_PKG_CHECK_MODULES], [ + + PKG_CONFIG_PATH="$prefix/lib${kdelibsuff}/pkgconfig:$PKG_CONFIG_PATH" + if test "$prefix" != "$kde_libs_prefix"; then + PKG_CONFIG_PATH="$kde_libs_prefix/lib${kdelibsuff}/pkgconfig:$PKG_CONFIG_PATH" + fi + export PKG_CONFIG_PATH + PKG_CHECK_MODULES([$1],[$2],[$3],[$4]) +]) + + +dnl Check for PIE support in the compiler and linker +AC_DEFUN([KDE_CHECK_PIE_SUPPORT], +[ + AC_CACHE_CHECK([for PIE support], kde_cv_val_pie_support, + [ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + safe_CXXFLAGS=$CXXFLAGS + safe_LDFLAGS=$LDFLAGS + CXXFLAGS="$CXXFLAGS -fPIE" + LDFLAGS="$LDFLAGS -pie" + + AC_TRY_LINK([int foo;], [], [kde_cv_val_pie_support=yes], [kde_cv_val_pie_support=no]) + + CXXFLAGS=$safe_CXXFLAGS + LDFLAGS=$safe_LDFLAGS + AC_LANG_RESTORE + ]) + + AC_MSG_CHECKING(if enabling -pie/fPIE support) + + AC_ARG_ENABLE(pie, + AC_HELP_STRING([--enable-pie],[platform supports PIE linking [default=detect]]), + [kde_has_pie_support=$enableval], + [kde_has_pie_support=detect]) + + if test "$kde_has_pie_support" = "detect"; then + kde_has_pie_support=$kde_cv_val_pie_support + fi + + AC_MSG_RESULT([$kde_has_pie_support]) + + KDE_USE_FPIE="" + KDE_USE_PIE="" + + AC_SUBST([KDE_USE_FPIE]) + AC_SUBST([KDE_USE_PIE]) + + if test "$kde_has_pie_support" = "yes"; then + KDE_USE_FPIE="-fPIE" + KDE_USE_PIE="-pie" + fi +]) +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +## Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005 +## Free Software Foundation, Inc. +## Originally by Gordon Matzigkeit , 1996 +## +## This file is free software; the Free Software Foundation gives +## unlimited permission to copy and/or distribute it, with or without +## modifications, as long as this notice is preserved. + +# serial 48 Debian 1.5.22-4 AC_PROG_LIBTOOL + + +# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) +# ----------------------------------------------------------- +# If this macro is not defined by Autoconf, define it here. +m4_ifdef([AC_PROVIDE_IFELSE], + [], + [m4_define([AC_PROVIDE_IFELSE], + [m4_ifdef([AC_PROVIDE_$1], + [$2], [$3])])]) + + +# AC_PROG_LIBTOOL +# --------------- +AC_DEFUN([AC_PROG_LIBTOOL], +[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl +dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX +dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. + AC_PROVIDE_IFELSE([AC_PROG_CXX], + [AC_LIBTOOL_CXX], + [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX + ])]) +dnl And a similar setup for Fortran 77 support + AC_PROVIDE_IFELSE([AC_PROG_F77], + [AC_LIBTOOL_F77], + [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77 +])]) + +dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. +dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run +dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. + AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [ifdef([AC_PROG_GCJ], + [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([A][M_PROG_GCJ], + [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([LT_AC_PROG_GCJ], + [define([LT_AC_PROG_GCJ], + defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) +])])# AC_PROG_LIBTOOL + + +# _AC_PROG_LIBTOOL +# ---------------- +AC_DEFUN([_AC_PROG_LIBTOOL], +[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl +AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl +AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl +AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +# Prevent multiple expansion +define([AC_PROG_LIBTOOL], []) +])# _AC_PROG_LIBTOOL + + +# AC_LIBTOOL_SETUP +# ---------------- +AC_DEFUN([AC_LIBTOOL_SETUP], +[AC_PREREQ(2.50)dnl +AC_REQUIRE([AC_ENABLE_SHARED])dnl +AC_REQUIRE([AC_ENABLE_STATIC])dnl +AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_LD])dnl +AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl +AC_REQUIRE([AC_PROG_NM])dnl + +AC_REQUIRE([AC_PROG_LN_S])dnl +AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl +# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! +AC_REQUIRE([AC_OBJEXT])dnl +AC_REQUIRE([AC_EXEEXT])dnl +dnl + +AC_LIBTOOL_SYS_MAX_CMD_LEN +AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +AC_LIBTOOL_OBJDIR + +AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +_LT_AC_PROG_ECHO_BACKSLASH + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e 1s/^X//' +[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] + +# Same as above, but do not quote variable references. +[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'] + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" + +AC_CHECK_TOOL(AR, ar, false) +AC_CHECK_TOOL(RANLIB, ranlib, :) +AC_CHECK_TOOL(STRIP, strip, :) + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$SED" && SED=sed +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + AC_PATH_MAGIC + fi + ;; +esac + +AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +enable_win32_dll=yes, enable_win32_dll=no) + +AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +AC_ARG_WITH([pic], + [AC_HELP_STRING([--with-pic], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [pic_mode="$withval"], + [pic_mode=default]) +test -z "$pic_mode" && pic_mode=default + +# Use C for the default configuration in the libtool script +tagname= +AC_LIBTOOL_LANG_C_CONFIG +_LT_AC_TAGCONFIG +])# AC_LIBTOOL_SETUP + + +# _LT_AC_SYS_COMPILER +# ------------------- +AC_DEFUN([_LT_AC_SYS_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_AC_SYS_COMPILER + + +# _LT_CC_BASENAME(CC) +# ------------------- +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +AC_DEFUN([_LT_CC_BASENAME], +[for cc_temp in $1""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` +]) + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +AC_DEFUN([_LT_COMPILER_BOILERPLATE], +[ac_outfile=conftest.$ac_objext +printf "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$rm conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +AC_DEFUN([_LT_LINKER_BOILERPLATE], +[ac_outfile=conftest.$ac_objext +printf "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$rm conftest* +])# _LT_LINKER_BOILERPLATE + + +# _LT_AC_SYS_LIBPATH_AIX +# ---------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], +[AC_LINK_IFELSE(AC_LANG_PROGRAM,[ +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi],[]) +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi +])# _LT_AC_SYS_LIBPATH_AIX + + +# _LT_AC_SHELL_INIT(ARG) +# ---------------------- +AC_DEFUN([_LT_AC_SHELL_INIT], +[ifdef([AC_DIVERSION_NOTICE], + [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) +$1 +AC_DIVERT_POP +])# _LT_AC_SHELL_INIT + + +# _LT_AC_PROG_ECHO_BACKSLASH +# -------------------------- +# Add some code to the start of the generated configure script which +# will find an echo command which doesn't interpret backslashes. +AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], +[_LT_AC_SHELL_INIT([ +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` + ;; +esac + +echo=${ECHO-echo} +if test "X[$]1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X[$]1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then + # Yippee, $echo works! + : +else + # Restart under the correct shell. + exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} +fi + +if test "X[$]1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null 2>&1 && unset CDPATH + +if test -z "$ECHO"; then +if test "X${echo_test_string+set}" != Xset; then +# find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if (echo_test_string=`eval $cmd`) 2>/dev/null && + echo_test_string=`eval $cmd` && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : +else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} + else + # Try using printf. + echo='printf %s\n' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL [$]0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$CONFIG_SHELL [$]0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "[$]0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +ECHO=$echo +if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then + ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" +fi + +AC_SUBST(ECHO) +])])# _LT_AC_PROG_ECHO_BACKSLASH + + +# _LT_AC_LOCK +# ----------- +AC_DEFUN([_LT_AC_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +sparc*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) LD="${LD-ld} -64" ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +[*-*-cygwin* | *-*-mingw* | *-*-pw32*) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; + ]) +esac + +need_locks="$enable_libtool_lock" + +])# _LT_AC_LOCK + + +# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], +[AC_REQUIRE([LT_AC_PROG_SED]) +AC_CACHE_CHECK([$1], [$2], + [$2=no + ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $rm conftest* +]) + +if test x"[$]$2" = xyes; then + ifelse([$5], , :, [$5]) +else + ifelse([$6], , :, [$6]) +fi +])# AC_LIBTOOL_COMPILER_OPTION + + +# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ------------------------------------------------------------ +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], +[AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + printf "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $rm conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + ifelse([$4], , :, [$4]) +else + ifelse([$5], , :, [$5]) +fi +])# AC_LIBTOOL_LINKER_OPTION + + +# AC_LIBTOOL_SYS_MAX_CMD_LEN +# -------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], +[# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \ + = "XX$teststring") >/dev/null 2>&1 && + new_result=`expr "X$teststring" : ".*" 2>&1` && + lt_cv_sys_max_cmd_len=$new_result && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + teststring= + # Add a significant safety factor because C++ compilers can tack on massive + # amounts of additional arguments before passing them to the linker. + # It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +])# AC_LIBTOOL_SYS_MAX_CMD_LEN + + +# _LT_AC_CHECK_DLFCN +# ------------------ +AC_DEFUN([_LT_AC_CHECK_DLFCN], +[AC_CHECK_HEADERS(dlfcn.h)dnl +])# _LT_AC_CHECK_DLFCN + + +# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# --------------------------------------------------------------------- +AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + else + puts (dlerror ()); + + exit (status); +}] +EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_AC_TRY_DLOPEN_SELF + + +# AC_LIBTOOL_DLOPEN_SELF +# ---------------------- +AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +])# AC_LIBTOOL_DLOPEN_SELF + + +# AC_LIBTOOL_PROG_CC_C_O([TAGNAME]) +# --------------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler +AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O], +[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* +]) +])# AC_LIBTOOL_PROG_CC_C_O + + +# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) +# ----------------------------------------- +# Check to see if we can do hard links to lock some files if needed +AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], +[AC_REQUIRE([_LT_AC_LOCK])dnl + +hard_links="nottested" +if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS + + +# AC_LIBTOOL_OBJDIR +# ----------------- +AC_DEFUN([AC_LIBTOOL_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +])# AC_LIBTOOL_OBJDIR + + +# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) +# ---------------------------------------------- +# Check hardcoding attributes. +AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_AC_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ + test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \ + test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_AC_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_AC_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_AC_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH + + +# AC_LIBTOOL_SYS_LIB_STRIP +# ------------------------ +AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP], +[striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) +fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +])# AC_LIBTOOL_SYS_LIB_STRIP + + +# AC_LIBTOOL_SYS_DYNAMIC_LINKER +# ----------------------------- +# PORTME Fill in your ld.so characteristics +AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], +[AC_MSG_CHECKING([dynamic linker characteristics]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[123]]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + freebsd*) # from 4.6 on + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix3*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi +])# AC_LIBTOOL_SYS_DYNAMIC_LINKER + + +# _LT_AC_TAGCONFIG +# ---------------- +AC_DEFUN([_LT_AC_TAGCONFIG], +[AC_ARG_WITH([tags], + [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@], + [include additional configurations @<:@automatic@:>@])], + [tagnames="$withval"]) + +if test -f "$ltmain" && test -n "$tagnames"; then + if test ! -f "${ofile}"; then + AC_MSG_WARN([output file `$ofile' does not exist]) + fi + + if test -z "$LTCC"; then + eval "`$SHELL ${ofile} --config | grep '^LTCC='`" + if test -z "$LTCC"; then + AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) + else + AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) + fi + fi + if test -z "$LTCFLAGS"; then + eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`" + fi + + # Extract list of available tagged configurations in $ofile. + # Note that this assumes the entire list is on one line. + available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` + + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for tagname in $tagnames; do + IFS="$lt_save_ifs" + # Check whether tagname contains only valid characters + case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in + "") ;; + *) AC_MSG_ERROR([invalid tag name: $tagname]) + ;; + esac + + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null + then + AC_MSG_ERROR([tag name \"$tagname\" already exists]) + fi + + # Update the list of available tags. + if test -n "$tagname"; then + echo appending configuration tag \"$tagname\" to $ofile + + case $tagname in + CXX) + if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_LIBTOOL_LANG_CXX_CONFIG + else + tagname="" + fi + ;; + + F77) + if test -n "$F77" && test "X$F77" != "Xno"; then + AC_LIBTOOL_LANG_F77_CONFIG + else + tagname="" + fi + ;; + + GCJ) + if test -n "$GCJ" && test "X$GCJ" != "Xno"; then + AC_LIBTOOL_LANG_GCJ_CONFIG + else + tagname="" + fi + ;; + + RC) + AC_LIBTOOL_LANG_RC_CONFIG + ;; + + *) + AC_MSG_ERROR([Unsupported tag name: $tagname]) + ;; + esac + + # Append the new tag name to the list of available tags. + if test -n "$tagname" ; then + available_tags="$available_tags $tagname" + fi + fi + done + IFS="$lt_save_ifs" + + # Now substitute the updated list of available tags. + if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then + mv "${ofile}T" "$ofile" + chmod +x "$ofile" + else + rm -f "${ofile}T" + AC_MSG_ERROR([unable to update list of available tagged configurations.]) + fi +fi +])# _LT_AC_TAGCONFIG + + +# AC_LIBTOOL_DLOPEN +# ----------------- +# enable checks for dlopen support +AC_DEFUN([AC_LIBTOOL_DLOPEN], + [AC_BEFORE([$0],[AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_DLOPEN + + +# AC_LIBTOOL_WIN32_DLL +# -------------------- +# declare package support for building win32 DLLs +AC_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_WIN32_DLL + + +# AC_ENABLE_SHARED([DEFAULT]) +# --------------------------- +# implement the --enable-shared flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_SHARED], +[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([shared], + [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]AC_ENABLE_SHARED_DEFAULT) +])# AC_ENABLE_SHARED + + +# AC_DISABLE_SHARED +# ----------------- +# set the default shared flag to --disable-shared +AC_DEFUN([AC_DISABLE_SHARED], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_SHARED(no) +])# AC_DISABLE_SHARED + + +# AC_ENABLE_STATIC([DEFAULT]) +# --------------------------- +# implement the --enable-static flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_STATIC], +[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([static], + [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]AC_ENABLE_STATIC_DEFAULT) +])# AC_ENABLE_STATIC + + +# AC_DISABLE_STATIC +# ----------------- +# set the default static flag to --disable-static +AC_DEFUN([AC_DISABLE_STATIC], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_STATIC(no) +])# AC_DISABLE_STATIC + + +# AC_ENABLE_FAST_INSTALL([DEFAULT]) +# --------------------------------- +# implement the --enable-fast-install flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_FAST_INSTALL], +[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([fast-install], + [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT) +])# AC_ENABLE_FAST_INSTALL + + +# AC_DISABLE_FAST_INSTALL +# ----------------------- +# set the default to --disable-fast-install +AC_DEFUN([AC_DISABLE_FAST_INSTALL], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_FAST_INSTALL(no) +])# AC_DISABLE_FAST_INSTALL + + +# AC_LIBTOOL_PICMODE([MODE]) +# -------------------------- +# implement the --with-pic flag +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +AC_DEFUN([AC_LIBTOOL_PICMODE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +pic_mode=ifelse($#,1,$1,default) +])# AC_LIBTOOL_PICMODE + + +# AC_PROG_EGREP +# ------------- +# This is predefined starting with Autoconf 2.54, so this conditional +# definition can be removed once we require Autoconf 2.54 or later. +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP], +[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], + [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi]) + EGREP=$ac_cv_prog_egrep + AC_SUBST([EGREP]) +])]) + + +# AC_PATH_TOOL_PREFIX +# ------------------- +# find a file program which can recognise shared library +AC_DEFUN([AC_PATH_TOOL_PREFIX], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="ifelse([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +])# AC_PATH_TOOL_PREFIX + + +# AC_PATH_MAGIC +# ------------- +# find a file program which can recognise a shared library +AC_DEFUN([AC_PATH_MAGIC], +[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# AC_PATH_MAGIC + + +# AC_PROG_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([AC_PROG_LD], +[AC_ARG_WITH([gnu-ld], + [AC_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no]) +AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix3*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +nto-qnx*) + lt_cv_deplibs_check_method=unknown + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown +])# AC_DEPLIBS_CHECK_METHOD + + +# AC_PROG_NM +# ---------- +# find the pathname to a BSD-compatible name lister +AC_DEFUN([AC_PROG_NM], +[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi]) +NM="$lt_cv_path_NM" +])# AC_PROG_NM + + +# AC_CHECK_LIBM +# ------------- +# check for math library +AC_DEFUN([AC_CHECK_LIBM], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +])# AC_CHECK_LIBM + + +# AC_LIBLTDL_CONVENIENCE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl convenience library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-convenience to the configure arguments. Note that +# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided, +# it is assumed to be `libltdl'. LIBLTDL will be prefixed with +# '${top_builddir}/' and LTDLINCL will be prefixed with '${top_srcdir}/' +# (note the single quotes!). If your package is not flat and you're not +# using automake, define top_builddir and top_srcdir appropriately in +# the Makefiles. +AC_DEFUN([AC_LIBLTDL_CONVENIENCE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + case $enable_ltdl_convenience in + no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; + "") enable_ltdl_convenience=yes + ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; + esac + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_CONVENIENCE + + +# AC_LIBLTDL_INSTALLABLE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl installable library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-install to the configure arguments. Note that +# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided, +# and an installed libltdl is not found, it is assumed to be `libltdl'. +# LIBLTDL will be prefixed with '${top_builddir}/'# and LTDLINCL with +# '${top_srcdir}/' (note the single quotes!). If your package is not +# flat and you're not using automake, define top_builddir and top_srcdir +# appropriately in the Makefiles. +# In the future, this macro may have to be called after AC_PROG_LIBTOOL. +AC_DEFUN([AC_LIBLTDL_INSTALLABLE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_CHECK_LIB(ltdl, lt_dlinit, + [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], + [if test x"$enable_ltdl_install" = xno; then + AC_MSG_WARN([libltdl not installed, but installation disabled]) + else + enable_ltdl_install=yes + fi + ]) + if test x"$enable_ltdl_install" = x"yes"; then + ac_configure_args="$ac_configure_args --enable-ltdl-install" + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + else + ac_configure_args="$ac_configure_args --enable-ltdl-install=no" + LIBLTDL="-lltdl" + LTDLINCL= + fi + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_INSTALLABLE + + +# AC_LIBTOOL_CXX +# -------------- +# enable support for C++ libraries +AC_DEFUN([AC_LIBTOOL_CXX], +[AC_REQUIRE([_LT_AC_LANG_CXX]) +])# AC_LIBTOOL_CXX + + +# _LT_AC_LANG_CXX +# --------------- +AC_DEFUN([_LT_AC_LANG_CXX], +[AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([_LT_AC_PROG_CXXCPP]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) +])# _LT_AC_LANG_CXX + +# _LT_AC_PROG_CXXCPP +# ------------------ +AC_DEFUN([_LT_AC_PROG_CXXCPP], +[ +AC_REQUIRE([AC_PROG_CXX]) +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_PROG_CXXCPP +fi +])# _LT_AC_PROG_CXXCPP + +# AC_LIBTOOL_F77 +# -------------- +# enable support for Fortran 77 libraries +AC_DEFUN([AC_LIBTOOL_F77], +[AC_REQUIRE([_LT_AC_LANG_F77]) +])# AC_LIBTOOL_F77 + + +# _LT_AC_LANG_F77 +# --------------- +AC_DEFUN([_LT_AC_LANG_F77], +[AC_REQUIRE([AC_PROG_F77]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77]) +])# _LT_AC_LANG_F77 + + +# AC_LIBTOOL_GCJ +# -------------- +# enable support for GCJ libraries +AC_DEFUN([AC_LIBTOOL_GCJ], +[AC_REQUIRE([_LT_AC_LANG_GCJ]) +])# AC_LIBTOOL_GCJ + + +# _LT_AC_LANG_GCJ +# --------------- +AC_DEFUN([_LT_AC_LANG_GCJ], +[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[], + [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])], + [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])], + [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ]) +])# _LT_AC_LANG_GCJ + + +# AC_LIBTOOL_RC +# ------------- +# enable support for Windows resource files +AC_DEFUN([AC_LIBTOOL_RC], +[AC_REQUIRE([LT_AC_PROG_RC]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC]) +])# AC_LIBTOOL_RC + + +# AC_LIBTOOL_LANG_C_CONFIG +# ------------------------ +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG]) +AC_DEFUN([_LT_AC_LANG_C_CONFIG], +[lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}\n' + +_LT_AC_SYS_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +AC_LIBTOOL_SYS_LIB_STRIP +AC_LIBTOOL_DLOPEN_SELF + +# Report which library types will actually be built +AC_MSG_CHECKING([if libtool supports shared libraries]) +AC_MSG_RESULT([$can_build_shared]) + +AC_MSG_CHECKING([whether to build shared libraries]) +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case $host_os in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix4* | aix5*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; +esac +AC_MSG_RESULT([$enable_shared]) + +AC_MSG_CHECKING([whether to build static libraries]) +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +AC_MSG_RESULT([$enable_static]) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_C_CONFIG + + +# AC_LIBTOOL_LANG_CXX_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) +AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], +[AC_LANG_PUSH(C++) +AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([_LT_AC_PROG_CXXCPP]) + +_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_AC_TAGVAR(allow_undefined_flag, $1)= +_LT_AC_TAGVAR(always_export_symbols, $1)=no +_LT_AC_TAGVAR(archive_expsym_cmds, $1)= +_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_direct, $1)=no +_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_AC_TAGVAR(hardcode_libdir_separator, $1)= +_LT_AC_TAGVAR(hardcode_minus_L, $1)=no +_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_AC_TAGVAR(hardcode_automatic, $1)=no +_LT_AC_TAGVAR(module_cmds, $1)= +_LT_AC_TAGVAR(module_expsym_cmds, $1)= +_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown +_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_AC_TAGVAR(no_undefined_flag, $1)= +_LT_AC_TAGVAR(whole_archive_flag_spec, $1)= +_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Dependencies to place before and after the object being linked: +_LT_AC_TAGVAR(predep_objects, $1)= +_LT_AC_TAGVAR(postdep_objects, $1)= +_LT_AC_TAGVAR(predeps, $1)= +_LT_AC_TAGVAR(postdeps, $1)= +_LT_AC_TAGVAR(compiler_lib_search_path, $1)= + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }\n' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_AC_SYS_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_LD=$LD +lt_save_GCC=$GCC +GCC=$GXX +lt_save_with_gnu_ld=$with_gnu_ld +lt_save_path_LD=$lt_cv_path_LD +if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx +else + $as_unset lt_cv_prog_gnu_ld +fi +if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX +else + $as_unset lt_cv_path_LD +fi +test -z "${LDCXX+set}" || LD=$LDCXX +CC=${CXX-"c++"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) + +# We don't want -fno-exception wen compiling C++ code, so set the +# no_builtin_flag separately +if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' +else + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= +fi + +if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + AC_PROG_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ + grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + +else + GXX=no + with_gnu_ld=no + wlarc= +fi + +# PORTME: fill in a description of your system's C++ link characteristics +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +_LT_AC_TAGVAR(ld_shlibs, $1)=yes +case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GXX" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + darwin* | rhapsody*) + case $host_os in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GXX" = yes ; then + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + freebsd[[12]]*) + # C++ shared libraries reported to be fairly broken before switch to ELF + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + freebsd-elf*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + ;; + gnu*) + ;; + hpux9*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[[-]]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + ;; + *) + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + interix3*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' + fi + fi + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + linux* | k*bsd*-gnu) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc*) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC*) + # Portland Group C++ compiler + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + esac + ;; + lynxos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + m88k*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + openbsd2*) + # C++ shared libraries are fairly broken + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + openbsd*) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd='echo' + ;; + osf3*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~ + $rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + psos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The C++ compiler is used as linker so we must use $wl + # flag to pass the commands to the underlying system + # linker. We must also pass each convience library through + # to the system linker between allextract/defaultextract. + # The C++ compiler will combine linker options so we + # cannot just pass the convience library names through + # without $wl. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' + ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | grep -v '^2\.7' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + fi + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + fi + ;; + esac + ;; + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + # So that behaviour is only enabled if SCOABSPATH is set to a + # non-empty value in the environment. Most likely only useful for + # creating official distributions of packages. + # This is a hack until libtool officially supports absolute path + # names for shared libraries. + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + vxworks*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; +esac +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_AC_TAGVAR(GCC, $1)="$GXX" +_LT_AC_TAGVAR(LD, $1)="$LD" + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +AC_LIBTOOL_POSTDEP_PREDEP($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC=$lt_save_CC +LDCXX=$LD +LD=$lt_save_LD +GCC=$lt_save_GCC +with_gnu_ldcxx=$with_gnu_ld +with_gnu_ld=$lt_save_with_gnu_ld +lt_cv_path_LDCXX=$lt_cv_path_LD +lt_cv_path_LD=$lt_save_path_LD +lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld +lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +])# AC_LIBTOOL_LANG_CXX_CONFIG + +# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) +# ------------------------------------ +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[ +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +ifelse([$1],[],[cat > conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext <> "$cfgfile" +ifelse([$1], [], +[#! $SHELL + +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# +# This file is part of GNU Libtool: +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="$SED -e 1s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# The names of the tagged configurations supported by this script. +available_tags= + +# ### BEGIN LIBTOOL CONFIG], +[# ### BEGIN LIBTOOL TAG CONFIG: $tagname]) + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1) + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + +# A language-specific compiler. +CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) + +# Is the compiler the GNU C compiler? +with_gcc=$_LT_AC_TAGVAR(GCC, $1) + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_[]_LT_AC_TAGVAR(LD, $1) + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1) + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1) + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1) + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1) + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1) +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1) + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) + +# Commands used to build and install a shared archive. +archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1) +archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1) +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1) +module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1) + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1) + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1) + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1) + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1) + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1) + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1) + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1) + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1) + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1) + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)" + +# Set to yes if exported symbols are required. +always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) + +# The commands to list exported symbols. +export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1) + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1) + +# Symbols that must always be exported. +include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1) + +ifelse([$1],[], +[# ### END LIBTOOL CONFIG], +[# ### END LIBTOOL TAG CONFIG: $tagname]) + +__EOF__ + +ifelse([$1],[], [ + case $host_os in + aix3*) + cat <<\EOF >> "$cfgfile" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || \ + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +]) +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi +])# AC_LIBTOOL_CONFIG + + +# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], +[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl + +_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + + AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI + + +# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +# --------------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], +[AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([AC_PROG_NM]) +AC_REQUIRE([AC_OBJEXT]) +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) # Its linker distinguishes data from code symbols + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +linux* | k*bsd*-gnu) + if test "$host_cpu" = ia64; then + symcode='[[ABCDGIRSTW]]' + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if grep ' nm_test_var$' "$nlist" >/dev/null; then + if grep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' + + cat <> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[[]] = +{ +EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr_t) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -f conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi +]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE + + +# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) +# --------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC], +[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_static, $1)= + +AC_MSG_CHECKING([for $compiler option to produce PIC]) + ifelse([$1],[CXX],[ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | os2* | pw32*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + interix3*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix4* | aix5*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + icpc* | ecpc*) + # Intel C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC*) + # Portland Group C++ compiler. + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + interix3*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + esac + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + newsos6) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + linux* | k*bsd*-gnu) + case $cc_basename in + icc* | ecc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then + AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works], + _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1), + [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" + ;; +esac + +# +# Check to make sure the static flag actually works. +# +wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_AC_TAGVAR(lt_prog_compiler_static, $1)\" +AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) +]) + + +# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) +# ------------------------------------ +# See if the linker supports building shared libraries. +AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS], +[AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +ifelse([$1],[CXX],[ + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix4* | aix5*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([[^ ]]*\) [[^ ]]*/\1 DATA/;/^I /d;/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + ;; + linux* | k*bsd*-gnu) + _LT_AC_TAGVAR(link_all_deplibs, $1)=no + ;; + *) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +],[ + runpath_var= + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)= + _LT_AC_TAGVAR(archive_expsym_cmds, $1)= + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)= + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + _LT_AC_TAGVAR(thread_safe_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown + _LT_AC_TAGVAR(hardcode_automatic, $1)=no + _LT_AC_TAGVAR(module_cmds, $1)= + _LT_AC_TAGVAR(module_expsym_cmds, $1)= + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_AC_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + # Just being paranoid about ensuring that cc_basename is set. + _LT_CC_BASENAME([$compiler]) + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + interix3*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + linux* | k*bsd*-gnu) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_addflag= + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + esac + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test $supports_anon_versioning = yes; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + $echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + _LT_AC_TAGVAR(link_all_deplibs, $1)=no + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no; then + runpath_var= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GCC" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + # see comment about different semantics on the GNU ld section + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + bsdi[[45]]*) + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs' + _LT_AC_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + darwin* | rhapsody*) + case $host_os in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi + ;; + + dgux*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + freebsd1*) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + openbsd*) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' + if test "$GCC" = yes; then + wlarc='${wl}' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + wlarc='' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine linker options so we + # cannot just pass the convience library names through + # without $wl, iff we do not link with $LD. + # Luckily, gcc supports the same syntax we need for Sun Studio. + # Supported since Solaris 2.6 (maybe 2.5.1?) + case $wlarc in + '') + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; + *) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; + esac ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7*) + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +# +# Do we need to explicitly link libc? +# +case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_AC_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_MSG_CHECKING([whether -lc should be explicitly linked in]) + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1) + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) + then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + else + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)]) + ;; + esac + fi + ;; +esac +])# AC_LIBTOOL_PROG_LD_SHLIBS + + +# _LT_AC_FILE_LTDLL_C +# ------------------- +# Be careful that the start marker always follows a newline. +AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ +# /* ltdll.c starts here */ +# #define WIN32_LEAN_AND_MEAN +# #include +# #undef WIN32_LEAN_AND_MEAN +# #include +# +# #ifndef __CYGWIN__ +# # ifdef __CYGWIN32__ +# # define __CYGWIN__ __CYGWIN32__ +# # endif +# #endif +# +# #ifdef __cplusplus +# extern "C" { +# #endif +# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); +# #ifdef __cplusplus +# } +# #endif +# +# #ifdef __CYGWIN__ +# #include +# DECLARE_CYGWIN_DLL( DllMain ); +# #endif +# HINSTANCE __hDllInstance_base; +# +# BOOL APIENTRY +# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) +# { +# __hDllInstance_base = hInst; +# return TRUE; +# } +# /* ltdll.c ends here */ +])# _LT_AC_FILE_LTDLL_C + + +# _LT_AC_TAGVAR(VARNAME, [TAGNAME]) +# --------------------------------- +AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])]) + + +# old names +AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) +AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) +AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) +AC_DEFUN([AM_PROG_LD], [AC_PROG_LD]) +AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) + +# This is just to silence aclocal about the macro not being used +ifelse([AC_DISABLE_FAST_INSTALL]) + +AC_DEFUN([LT_AC_PROG_GCJ], +[AC_CHECK_TOOL(GCJ, gcj, no) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS) +]) + +AC_DEFUN([LT_AC_PROG_RC], +[AC_CHECK_TOOL(RC, windres, no) +]) + +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ +# LT_AC_PROG_SED +# -------------- +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +AC_DEFUN([LT_AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_MSG_RESULT([$SED]) +]) + +dnl PKG_CHECK_MODULES(GSTUFF, gtk+-2.0 >= 1.3 glib = 1.3.4, action-if, action-not) +dnl defines GSTUFF_LIBS, GSTUFF_CFLAGS, see pkg-config man page +dnl also defines GSTUFF_PKG_ERRORS on error +AC_DEFUN([PKG_CHECK_MODULES], [ + succeeded=no + + if test -z "$PKG_CONFIG"; then + AC_PATH_PROG(PKG_CONFIG, pkg-config, no) + fi + + if test "$PKG_CONFIG" = "no" ; then + echo "*** The pkg-config script could not be found. Make sure it is" + echo "*** in your path, or set the PKG_CONFIG environment variable" + echo "*** to the full path to pkg-config." + echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config." + else + PKG_CONFIG_MIN_VERSION=0.9.0 + if $PKG_CONFIG --atleast-pkgconfig-version $PKG_CONFIG_MIN_VERSION; then + AC_MSG_CHECKING(for $2) + + if $PKG_CONFIG --exists "$2" ; then + AC_MSG_RESULT(yes) + succeeded=yes + + AC_MSG_CHECKING($1_CFLAGS) + $1_CFLAGS=`$PKG_CONFIG --cflags "$2"` + AC_MSG_RESULT($$1_CFLAGS) + + AC_MSG_CHECKING($1_LIBS) + $1_LIBS=`$PKG_CONFIG --libs "$2"` + AC_MSG_RESULT($$1_LIBS) + else + $1_CFLAGS="" + $1_LIBS="" + ## If we have a custom action on failure, don't print errors, but + ## do set a variable so people can do so. + $1_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` + ifelse([$4], ,echo $$1_PKG_ERRORS,) + fi + + AC_SUBST($1_CFLAGS) + AC_SUBST($1_LIBS) + else + echo "*** Your version of pkg-config is too old. You need version $PKG_CONFIG_MIN_VERSION or newer." + echo "*** See http://www.freedesktop.org/software/pkgconfig" + fi + fi + + if test $succeeded = yes; then + ifelse([$3], , :, [$3]) + else + ifelse([$4], , AC_MSG_ERROR([Library requirements ($2) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.]), [$4]) + fi +]) + + diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 0000000..c65deb3 --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,13333 @@ +# generated automatically by aclocal 1.7.9 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002 +# Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +dnl This file is part of the KDE libraries/packages +dnl Copyright (C) 1997 Janos Farkas (chexum@shadow.banki.hu) +dnl (C) 1997,98,99 Stephan Kulow (coolo@kde.org) + +dnl This file is free software; you can redistribute it and/or +dnl modify it under the terms of the GNU Library General Public +dnl License as published by the Free Software Foundation; either +dnl version 2 of the License, or (at your option) any later version. + +dnl This library is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl Library General Public License for more details. + +dnl You should have received a copy of the GNU Library General Public License +dnl along with this library; see the file COPYING.LIB. If not, write to +dnl the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +dnl Boston, MA 02110-1301, USA. + +dnl IMPORTANT NOTE: +dnl Please do not modify this file unless you expect your modifications to be +dnl carried into every other module in the repository. +dnl +dnl Single-module modifications are best placed in configure.in for kdelibs +dnl and kdebase or configure.in.in if present. + +# KDE_PATH_X_DIRECT +dnl Internal subroutine of AC_PATH_X. +dnl Set ac_x_includes and/or ac_x_libraries. +AC_DEFUN([KDE_PATH_X_DIRECT], +[ +AC_REQUIRE([KDE_CHECK_LIB64]) + +if test "$ac_x_includes" = NO; then + # Guess where to find include files, by looking for this one X11 .h file. + test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h + + # First, try using that file with no special directory specified. +AC_TRY_CPP([#include <$x_direct_test_include>], +[# We can compile using X headers with no special include directory. +ac_x_includes=], +[# Look for the header file in a standard set of common directories. +# Check X11 before X11Rn because it is often a symlink to the current release. + for ac_dir in \ + /usr/X11/include \ + /usr/X11R6/include \ + /usr/X11R5/include \ + /usr/X11R4/include \ + \ + /usr/include/X11 \ + /usr/include/X11R6 \ + /usr/include/X11R5 \ + /usr/include/X11R4 \ + \ + /usr/local/X11/include \ + /usr/local/X11R6/include \ + /usr/local/X11R5/include \ + /usr/local/X11R4/include \ + \ + /usr/local/include/X11 \ + /usr/local/include/X11R6 \ + /usr/local/include/X11R5 \ + /usr/local/include/X11R4 \ + \ + /usr/X386/include \ + /usr/x386/include \ + /usr/XFree86/include/X11 \ + \ + /usr/include \ + /usr/local/include \ + /usr/unsupported/include \ + /usr/athena/include \ + /usr/local/x11r5/include \ + /usr/lpp/Xamples/include \ + \ + /usr/openwin/include \ + /usr/openwin/share/include \ + ; \ + do + if test -r "$ac_dir/$x_direct_test_include"; then + ac_x_includes=$ac_dir + break + fi + done]) +fi # $ac_x_includes = NO + +if test "$ac_x_libraries" = NO; then + # Check for the libraries. + + test -z "$x_direct_test_library" && x_direct_test_library=Xt + test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc + + # See if we find them without any special options. + # Don't add to $LIBS permanently. + ac_save_LIBS="$LIBS" + LIBS="-l$x_direct_test_library $LIBS" +AC_TRY_LINK([#include ], [${x_direct_test_function}(1)], +[LIBS="$ac_save_LIBS" +# We can link X programs with no special library path. +ac_x_libraries=], +[LIBS="$ac_save_LIBS" +# First see if replacing the include by lib works. +# Check X11 before X11Rn because it is often a symlink to the current release. +for ac_dir in `echo "$ac_x_includes" | sed s/include/lib${kdelibsuff}/` \ + /usr/X11/lib${kdelibsuff} \ + /usr/X11R6/lib${kdelibsuff} \ + /usr/X11R5/lib${kdelibsuff} \ + /usr/X11R4/lib${kdelibsuff} \ + \ + /usr/lib${kdelibsuff}/X11 \ + /usr/lib${kdelibsuff}/X11R6 \ + /usr/lib${kdelibsuff}/X11R5 \ + /usr/lib${kdelibsuff}/X11R4 \ + \ + /usr/local/X11/lib${kdelibsuff} \ + /usr/local/X11R6/lib${kdelibsuff} \ + /usr/local/X11R5/lib${kdelibsuff} \ + /usr/local/X11R4/lib${kdelibsuff} \ + \ + /usr/local/lib${kdelibsuff}/X11 \ + /usr/local/lib${kdelibsuff}/X11R6 \ + /usr/local/lib${kdelibsuff}/X11R5 \ + /usr/local/lib${kdelibsuff}/X11R4 \ + \ + /usr/X386/lib${kdelibsuff} \ + /usr/x386/lib${kdelibsuff} \ + /usr/XFree86/lib${kdelibsuff}/X11 \ + \ + /usr/lib${kdelibsuff} \ + /usr/local/lib${kdelibsuff} \ + /usr/unsupported/lib${kdelibsuff} \ + /usr/athena/lib${kdelibsuff} \ + /usr/local/x11r5/lib${kdelibsuff} \ + /usr/lpp/Xamples/lib${kdelibsuff} \ + /lib/usr/lib${kdelibsuff}/X11 \ + \ + /usr/openwin/lib${kdelibsuff} \ + /usr/openwin/share/lib${kdelibsuff} \ + ; \ +do +dnl Don't even attempt the hair of trying to link an X program! + for ac_extension in a so sl; do + if test -r $ac_dir/lib${x_direct_test_library}.$ac_extension; then + ac_x_libraries=$ac_dir + break 2 + fi + done +done]) +fi # $ac_x_libraries = NO +]) + + +dnl ------------------------------------------------------------------------ +dnl Find a file (or one of more files in a list of dirs) +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([AC_FIND_FILE], +[ +$3=NO +for i in $2; +do + for j in $1; + do + echo "configure: __oline__: $i/$j" >&AC_FD_CC + if test -r "$i/$j"; then + echo "taking that" >&AC_FD_CC + $3=$i + break 2 + fi + done +done +]) + +dnl KDE_FIND_PATH(program-name, variable-name, list-of-dirs, +dnl if-not-found, test-parameter, prepend-path) +dnl +dnl Look for program-name in list-of-dirs+$PATH. +dnl If prepend-path is set, look in $PATH+list-of-dirs instead. +dnl If found, $variable-name is set. If not, if-not-found is evaluated. +dnl test-parameter: if set, the program is executed with this arg, +dnl and only a successful exit code is required. +AC_DEFUN([KDE_FIND_PATH], +[ + AC_MSG_CHECKING([for $1]) + if test -n "$$2"; then + kde_cv_path="$$2"; + else + kde_cache=`echo $1 | sed 'y%./+-%__p_%'` + + AC_CACHE_VAL(kde_cv_path_$kde_cache, + [ + kde_cv_path="NONE" + kde_save_IFS=$IFS + IFS=':' + dirs="" + for dir in $PATH; do + dirs="$dirs $dir" + done + if test -z "$6"; then dnl Append dirs in PATH (default) + dirs="$3 $dirs" + else dnl Prepend dirs in PATH (if 6th arg is set) + dirs="$dirs $3" + fi + IFS=$kde_save_IFS + + for dir in $dirs; do + if test -x "$dir/$1"; then + if test -n "$5" + then + evalstr="$dir/$1 $5 2>&1 " + if eval $evalstr; then + kde_cv_path="$dir/$1" + break + fi + else + kde_cv_path="$dir/$1" + break + fi + fi + done + + eval "kde_cv_path_$kde_cache=$kde_cv_path" + + ]) + + eval "kde_cv_path=\"`echo '$kde_cv_path_'$kde_cache`\"" + + fi + + if test -z "$kde_cv_path" || test "$kde_cv_path" = NONE; then + AC_MSG_RESULT(not found) + $4 + else + AC_MSG_RESULT($kde_cv_path) + $2=$kde_cv_path + + fi +]) + +AC_DEFUN([KDE_MOC_ERROR_MESSAGE], +[ + AC_MSG_ERROR([No Qt meta object compiler (moc) found! +Please check whether you installed Qt correctly. +You need to have a running moc binary. +configure tried to run $ac_cv_path_moc and the test didn't +succeed. If configure shouldn't have tried this one, set +the environment variable MOC to the right one before running +configure. +]) +]) + +AC_DEFUN([KDE_UIC_ERROR_MESSAGE], +[ + AC_MSG_WARN([No Qt ui compiler (uic) found! +Please check whether you installed Qt correctly. +You need to have a running uic binary. +configure tried to run $ac_cv_path_uic and the test didn't +succeed. If configure shouldn't have tried this one, set +the environment variable UIC to the right one before running +configure. +]) +]) + + +AC_DEFUN([KDE_CHECK_UIC_FLAG], +[ + AC_MSG_CHECKING([whether uic supports -$1 ]) + kde_cache=`echo $1 | sed 'y% .=/+-%____p_%'` + AC_CACHE_VAL(kde_cv_prog_uic_$kde_cache, + [ + cat >conftest.ui < +EOT + ac_uic_testrun="$UIC_PATH -$1 $2 conftest.ui >/dev/null" + if AC_TRY_EVAL(ac_uic_testrun); then + eval "kde_cv_prog_uic_$kde_cache=yes" + else + eval "kde_cv_prog_uic_$kde_cache=no" + fi + rm -f conftest* + ]) + + if eval "test \"`echo '$kde_cv_prog_uic_'$kde_cache`\" = yes"; then + AC_MSG_RESULT([yes]) + : + $3 + else + AC_MSG_RESULT([no]) + : + $4 + fi +]) + + +dnl ------------------------------------------------------------------------ +dnl Find the meta object compiler and the ui compiler in the PATH, +dnl in $QTDIR/bin, and some more usual places +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([AC_PATH_QT_MOC_UIC], +[ + AC_REQUIRE([KDE_CHECK_PERL]) + qt_bindirs="" + for dir in $kde_qt_dirs; do + qt_bindirs="$qt_bindirs $dir/bin $dir/src/moc" + done + qt_bindirs="$qt_bindirs /usr/bin /usr/X11R6/bin /usr/local/qt/bin" + if test ! "$ac_qt_bindir" = "NO"; then + qt_bindirs="$ac_qt_bindir $qt_bindirs" + fi + + KDE_FIND_PATH(moc, MOC, [$qt_bindirs], [KDE_MOC_ERROR_MESSAGE]) + if test -z "$UIC_NOT_NEEDED"; then + KDE_FIND_PATH(uic, UIC_PATH, [$qt_bindirs], [UIC_PATH=""]) + if test -z "$UIC_PATH" ; then + KDE_UIC_ERROR_MESSAGE + exit 1 + else + UIC=$UIC_PATH + + if test $kde_qtver = 3; then + KDE_CHECK_UIC_FLAG(L,[/nonexistent],ac_uic_supports_libpath=yes,ac_uic_supports_libpath=no) + KDE_CHECK_UIC_FLAG(nounload,,ac_uic_supports_nounload=yes,ac_uic_supports_nounload=no) + + if test x$ac_uic_supports_libpath = xyes; then + UIC="$UIC -L \$(kde_widgetdir)" + fi + if test x$ac_uic_supports_nounload = xyes; then + UIC="$UIC -nounload" + fi + fi + fi + else + UIC="echo uic not available: " + fi + + AC_SUBST(MOC) + AC_SUBST(UIC) + + UIC_TR="i18n" + if test $kde_qtver = 3; then + UIC_TR="tr2i18n" + fi + + AC_SUBST(UIC_TR) +]) + +AC_DEFUN([KDE_1_CHECK_PATHS], +[ + KDE_1_CHECK_PATH_HEADERS + + KDE_TEST_RPATH= + + if test -n "$USE_RPATH"; then + + if test -n "$kde_libraries"; then + KDE_TEST_RPATH="-R $kde_libraries" + fi + + if test -n "$qt_libraries"; then + KDE_TEST_RPATH="$KDE_TEST_RPATH -R $qt_libraries" + fi + + if test -n "$x_libraries"; then + KDE_TEST_RPATH="$KDE_TEST_RPATH -R $x_libraries" + fi + + KDE_TEST_RPATH="$KDE_TEST_RPATH $KDE_EXTRA_RPATH" + fi + +AC_MSG_CHECKING([for KDE libraries installed]) +ac_link='$LIBTOOL_SHELL --silent --mode=link ${CXX-g++} -o conftest $CXXFLAGS $all_includes $CPPFLAGS $LDFLAGS $all_libraries conftest.$ac_ext $LIBS -lkdecore $LIBQT $KDE_TEST_RPATH 1>&5' + +if AC_TRY_EVAL(ac_link) && test -s conftest; then + AC_MSG_RESULT(yes) +else + AC_MSG_ERROR([your system fails at linking a small KDE application! +Check, if your compiler is installed correctly and if you have used the +same compiler to compile Qt and kdelibs as you did use now. +For more details about this problem, look at the end of config.log.]) +fi + +if eval `KDEDIR= ./conftest 2>&5`; then + kde_result=done +else + kde_result=problems +fi + +KDEDIR= ./conftest 2> /dev/null >&5 # make an echo for config.log +kde_have_all_paths=yes + +KDE_SET_PATHS($kde_result) + +]) + +AC_DEFUN([KDE_SET_PATHS], +[ + kde_cv_all_paths="kde_have_all_paths=\"yes\" \ + kde_htmldir=\"$kde_htmldir\" \ + kde_appsdir=\"$kde_appsdir\" \ + kde_icondir=\"$kde_icondir\" \ + kde_sounddir=\"$kde_sounddir\" \ + kde_datadir=\"$kde_datadir\" \ + kde_locale=\"$kde_locale\" \ + kde_cgidir=\"$kde_cgidir\" \ + kde_confdir=\"$kde_confdir\" \ + kde_kcfgdir=\"$kde_kcfgdir\" \ + kde_mimedir=\"$kde_mimedir\" \ + kde_toolbardir=\"$kde_toolbardir\" \ + kde_wallpaperdir=\"$kde_wallpaperdir\" \ + kde_templatesdir=\"$kde_templatesdir\" \ + kde_bindir=\"$kde_bindir\" \ + kde_servicesdir=\"$kde_servicesdir\" \ + kde_servicetypesdir=\"$kde_servicetypesdir\" \ + kde_moduledir=\"$kde_moduledir\" \ + kde_styledir=\"$kde_styledir\" \ + kde_widgetdir=\"$kde_widgetdir\" \ + xdg_appsdir=\"$xdg_appsdir\" \ + xdg_menudir=\"$xdg_menudir\" \ + xdg_directorydir=\"$xdg_directorydir\" \ + kde_result=$1" +]) + +AC_DEFUN([KDE_SET_DEFAULT_PATHS], +[ +if test "$1" = "default"; then + + if test -z "$kde_htmldir"; then + kde_htmldir='\${datadir}/doc/HTML' + fi + if test -z "$kde_appsdir"; then + kde_appsdir='\${datadir}/applnk' + fi + if test -z "$kde_icondir"; then + kde_icondir='\${datadir}/icons' + fi + if test -z "$kde_sounddir"; then + kde_sounddir='\${datadir}/sounds' + fi + if test -z "$kde_datadir"; then + kde_datadir='\${datadir}/apps' + fi + if test -z "$kde_locale"; then + kde_locale='\${datadir}/locale' + fi + if test -z "$kde_cgidir"; then + kde_cgidir='\${exec_prefix}/cgi-bin' + fi + if test -z "$kde_confdir"; then + kde_confdir='\${datadir}/config' + fi + if test -z "$kde_kcfgdir"; then + kde_kcfgdir='\${datadir}/config.kcfg' + fi + if test -z "$kde_mimedir"; then + kde_mimedir='\${datadir}/mimelnk' + fi + if test -z "$kde_toolbardir"; then + kde_toolbardir='\${datadir}/toolbar' + fi + if test -z "$kde_wallpaperdir"; then + kde_wallpaperdir='\${datadir}/wallpapers' + fi + if test -z "$kde_templatesdir"; then + kde_templatesdir='\${datadir}/templates' + fi + if test -z "$kde_bindir"; then + kde_bindir='\${exec_prefix}/bin' + fi + if test -z "$kde_servicesdir"; then + kde_servicesdir='\${datadir}/services' + fi + if test -z "$kde_servicetypesdir"; then + kde_servicetypesdir='\${datadir}/servicetypes' + fi + if test -z "$kde_moduledir"; then + if test "$kde_qtver" = "2"; then + kde_moduledir='\${libdir}/kde2' + else + kde_moduledir='\${libdir}/kde3' + fi + fi + if test -z "$kde_styledir"; then + kde_styledir='\${libdir}/kde3/plugins/styles' + fi + if test -z "$kde_widgetdir"; then + kde_widgetdir='\${libdir}/kde3/plugins/designer' + fi + if test -z "$xdg_appsdir"; then + xdg_appsdir='\${datadir}/applications/kde' + fi + if test -z "$xdg_menudir"; then + xdg_menudir='\${sysconfdir}/xdg/menus' + fi + if test -z "$xdg_directorydir"; then + xdg_directorydir='\${datadir}/desktop-directories' + fi + + KDE_SET_PATHS(defaults) + +else + + if test $kde_qtver = 1; then + AC_MSG_RESULT([compiling]) + KDE_1_CHECK_PATHS + else + AC_MSG_ERROR([path checking not yet supported for KDE 2]) + fi + +fi +]) + +AC_DEFUN([KDE_CHECK_PATHS_FOR_COMPLETENESS], +[ if test -z "$kde_htmldir" || test -z "$kde_appsdir" || + test -z "$kde_icondir" || test -z "$kde_sounddir" || + test -z "$kde_datadir" || test -z "$kde_locale" || + test -z "$kde_cgidir" || test -z "$kde_confdir" || + test -z "$kde_kcfgdir" || + test -z "$kde_mimedir" || test -z "$kde_toolbardir" || + test -z "$kde_wallpaperdir" || test -z "$kde_templatesdir" || + test -z "$kde_bindir" || test -z "$kde_servicesdir" || + test -z "$kde_servicetypesdir" || test -z "$kde_moduledir" || + test -z "$kde_styledir" || test -z "kde_widgetdir" || + test -z "$xdg_appsdir" || test -z "$xdg_menudir" || test -z "$xdg_directorydir" || + test "x$kde_have_all_paths" != "xyes"; then + kde_have_all_paths=no + fi +]) + +AC_DEFUN([KDE_MISSING_PROG_ERROR], +[ + AC_MSG_ERROR([The important program $1 was not found! +Please check whether you installed KDE correctly. +]) +]) + +AC_DEFUN([KDE_MISSING_ARTS_ERROR], +[ + AC_MSG_ERROR([The important program $1 was not found! +Please check whether you installed aRts correctly or use +--without-arts to compile without aRts support (this will remove functionality). +]) +]) + +AC_DEFUN([KDE_SET_DEFAULT_BINDIRS], +[ + kde_default_bindirs="/usr/bin /usr/local/bin /opt/local/bin /usr/X11R6/bin /opt/kde/bin /opt/kde3/bin /usr/kde/bin /usr/local/kde/bin" + test -n "$KDEDIR" && kde_default_bindirs="$KDEDIR/bin $kde_default_bindirs" + if test -n "$KDEDIRS"; then + kde_save_IFS=$IFS + IFS=: + for dir in $KDEDIRS; do + kde_default_bindirs="$dir/bin $kde_default_bindirs " + done + IFS=$kde_save_IFS + fi +]) + +AC_DEFUN([KDE_SUBST_PROGRAMS], +[ + AC_ARG_WITH(arts, + AC_HELP_STRING([--without-arts],[build without aRts [default=no]]), + [build_arts=$withval], + [build_arts=yes] + ) + AM_CONDITIONAL(include_ARTS, test "$build_arts" '!=' "no") + if test "$build_arts" = "no"; then + AC_DEFINE(WITHOUT_ARTS, 1, [Defined if compiling without arts]) + fi + + KDE_SET_DEFAULT_BINDIRS + kde_default_bindirs="$exec_prefix/bin $prefix/bin $kde_libs_prefix/bin $kde_default_bindirs" + KDE_FIND_PATH(dcopidl, DCOPIDL, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(dcopidl)]) + KDE_FIND_PATH(dcopidl2cpp, DCOPIDL2CPP, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(dcopidl2cpp)]) + if test "$build_arts" '!=' "no"; then + KDE_FIND_PATH(mcopidl, MCOPIDL, [$kde_default_bindirs], [KDE_MISSING_ARTS_ERROR(mcopidl)]) + KDE_FIND_PATH(artsc-config, ARTSCCONFIG, [$kde_default_bindirs], [KDE_MISSING_ARTS_ERROR(artsc-config)]) + fi + KDE_FIND_PATH(meinproc, MEINPROC, [$kde_default_bindirs]) + + kde32ornewer=1 + kde33ornewer=1 + if test -n "$kde_qtver" && test "$kde_qtver" -lt 3; then + kde32ornewer= + kde33ornewer= + else + if test "$kde_qtver" = "3"; then + if test "$kde_qtsubver" -le 1; then + kde32ornewer= + fi + if test "$kde_qtsubver" -le 2; then + kde33ornewer= + fi + if test "$KDECONFIG" != "compiled"; then + if test `$KDECONFIG --version | grep KDE | sed 's/KDE: \(...\).*/\1/'` = 3.2; then + kde33ornewer= + fi + fi + fi + fi + + if test -n "$kde32ornewer"; then + KDE_FIND_PATH(kconfig_compiler, KCONFIG_COMPILER, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(kconfig_compiler)]) + KDE_FIND_PATH(dcopidlng, DCOPIDLNG, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(dcopidlng)]) + fi + if test -n "$kde33ornewer"; then + KDE_FIND_PATH(makekdewidgets, MAKEKDEWIDGETS, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(makekdewidgets)]) + AC_SUBST(MAKEKDEWIDGETS) + fi + KDE_FIND_PATH(xmllint, XMLLINT, [${prefix}/bin ${exec_prefix}/bin], [XMLLINT=""]) + + if test -n "$MEINPROC" -a "$MEINPROC" != "compiled"; then + kde_sharedirs="/usr/share/kde /usr/local/share /usr/share /opt/kde3/share /opt/kde/share $prefix/share" + test -n "$KDEDIR" && kde_sharedirs="$KDEDIR/share $kde_sharedirs" + AC_FIND_FILE(apps/ksgmltools2/customization/kde-chunk.xsl, $kde_sharedirs, KDE_XSL_STYLESHEET) + if test "$KDE_XSL_STYLESHEET" = "NO"; then + KDE_XSL_STYLESHEET="" + else + KDE_XSL_STYLESHEET="$KDE_XSL_STYLESHEET/apps/ksgmltools2/customization/kde-chunk.xsl" + fi + fi + + DCOP_DEPENDENCIES='$(DCOPIDL)' + if test -n "$kde32ornewer"; then + KCFG_DEPENDENCIES='$(KCONFIG_COMPILER)' + DCOP_DEPENDENCIES='$(DCOPIDL) $(DCOPIDLNG)' + AC_SUBST(KCONFIG_COMPILER) + AC_SUBST(KCFG_DEPENDENCIES) + AC_SUBST(DCOPIDLNG) + fi + AC_SUBST(DCOPIDL) + AC_SUBST(DCOPIDL2CPP) + AC_SUBST(DCOP_DEPENDENCIES) + AC_SUBST(MCOPIDL) + AC_SUBST(ARTSCCONFIG) + AC_SUBST(MEINPROC) + AC_SUBST(KDE_XSL_STYLESHEET) + AC_SUBST(XMLLINT) +])dnl + +AC_DEFUN([AC_CREATE_KFSSTND], +[ +AC_REQUIRE([AC_CHECK_RPATH]) + +AC_MSG_CHECKING([for KDE paths]) +kde_result="" +kde_cached_paths=yes +AC_CACHE_VAL(kde_cv_all_paths, +[ + KDE_SET_DEFAULT_PATHS($1) + kde_cached_paths=no +]) +eval "$kde_cv_all_paths" +KDE_CHECK_PATHS_FOR_COMPLETENESS +if test "$kde_have_all_paths" = "no" && test "$kde_cached_paths" = "yes"; then + # wrong values were cached, may be, we can set better ones + kde_result= + kde_htmldir= kde_appsdir= kde_icondir= kde_sounddir= + kde_datadir= kde_locale= kde_cgidir= kde_confdir= kde_kcfgdir= + kde_mimedir= kde_toolbardir= kde_wallpaperdir= kde_templatesdir= + kde_bindir= kde_servicesdir= kde_servicetypesdir= kde_moduledir= + kde_have_all_paths= + kde_styledir= + kde_widgetdir= + xdg_appsdir = xdg_menudir= xdg_directorydir= + KDE_SET_DEFAULT_PATHS($1) + eval "$kde_cv_all_paths" + KDE_CHECK_PATHS_FOR_COMPLETENESS + kde_result="$kde_result (cache overridden)" +fi +if test "$kde_have_all_paths" = "no"; then + AC_MSG_ERROR([configure could not run a little KDE program to test the environment. +Since it had compiled and linked before, it must be a strange problem on your system. +Look at config.log for details. If you are not able to fix this, look at +http://www.kde.org/faq/installation.html or any www.kde.org mirror. +(If you're using an egcs version on Linux, you may update binutils!) +]) +else + rm -f conftest* + AC_MSG_RESULT($kde_result) +fi + +bindir=$kde_bindir + +KDE_SUBST_PROGRAMS + +]) + +AC_DEFUN([AC_SUBST_KFSSTND], +[ +AC_SUBST(kde_htmldir) +AC_SUBST(kde_appsdir) +AC_SUBST(kde_icondir) +AC_SUBST(kde_sounddir) +AC_SUBST(kde_datadir) +AC_SUBST(kde_locale) +AC_SUBST(kde_confdir) +AC_SUBST(kde_kcfgdir) +AC_SUBST(kde_mimedir) +AC_SUBST(kde_wallpaperdir) +AC_SUBST(kde_bindir) +dnl X Desktop Group standards +AC_SUBST(xdg_appsdir) +AC_SUBST(xdg_menudir) +AC_SUBST(xdg_directorydir) +dnl for KDE 2 +AC_SUBST(kde_templatesdir) +AC_SUBST(kde_servicesdir) +AC_SUBST(kde_servicetypesdir) +AC_SUBST(kde_moduledir) +AC_SUBST(kdeinitdir, '$(kde_moduledir)') +AC_SUBST(kde_styledir) +AC_SUBST(kde_widgetdir) +if test "$kde_qtver" = 1; then + kde_minidir="$kde_icondir/mini" +else +# for KDE 1 - this breaks KDE2 apps using minidir, but +# that's the plan ;-/ + kde_minidir="/dev/null" +fi +dnl AC_SUBST(kde_minidir) +dnl AC_SUBST(kde_cgidir) +dnl AC_SUBST(kde_toolbardir) +]) + +AC_DEFUN([KDE_MISC_TESTS], +[ + dnl Checks for libraries. + AC_CHECK_LIB(util, main, [LIBUTIL="-lutil"]) dnl for *BSD + AC_SUBST(LIBUTIL) + AC_CHECK_LIB(compat, main, [LIBCOMPAT="-lcompat"]) dnl for *BSD + AC_SUBST(LIBCOMPAT) + kde_have_crypt= + AC_CHECK_LIB(crypt, crypt, [LIBCRYPT="-lcrypt"; kde_have_crypt=yes], + AC_CHECK_LIB(c, crypt, [kde_have_crypt=yes], [ + AC_MSG_WARN([you have no crypt in either libcrypt or libc. +You should install libcrypt from another source or configure with PAM +support]) + kde_have_crypt=no + ])) + AC_SUBST(LIBCRYPT) + if test $kde_have_crypt = yes; then + AC_DEFINE_UNQUOTED(HAVE_CRYPT, 1, [Defines if your system has the crypt function]) + fi + AC_CHECK_SOCKLEN_T + AC_CHECK_LIB(dnet, dnet_ntoa, [X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet"]) + if test $ac_cv_lib_dnet_dnet_ntoa = no; then + AC_CHECK_LIB(dnet_stub, dnet_ntoa, + [X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub"]) + fi + AC_CHECK_FUNC(inet_ntoa) + if test $ac_cv_func_inet_ntoa = no; then + AC_CHECK_LIB(nsl, inet_ntoa, X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl") + fi + AC_CHECK_FUNC(connect) + if test $ac_cv_func_connect = no; then + AC_CHECK_LIB(socket, connect, X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS", , + $X_EXTRA_LIBS) + fi + + AC_CHECK_FUNC(remove) + if test $ac_cv_func_remove = no; then + AC_CHECK_LIB(posix, remove, X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix") + fi + + # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. + AC_CHECK_FUNC(shmat, , + AC_CHECK_LIB(ipc, shmat, X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc")) + + # more headers that need to be explicitly included on darwin + AC_CHECK_HEADERS(sys/types.h stdint.h) + + # sys/bitypes.h is needed for uint32_t and friends on Tru64 + AC_CHECK_HEADERS(sys/bitypes.h) + + # darwin requires a poll emulation library + AC_CHECK_LIB(poll, poll, LIB_POLL="-lpoll") + + # for some image handling on Mac OS X + AC_CHECK_HEADERS(Carbon/Carbon.h) + + # CoreAudio framework + AC_CHECK_HEADER(CoreAudio/CoreAudio.h, [ + AC_DEFINE(HAVE_COREAUDIO, 1, [Define if you have the CoreAudio API]) + FRAMEWORK_COREAUDIO="-Wl,-framework,CoreAudio" + ]) + + AC_CHECK_RES_INIT + AC_SUBST(LIB_POLL) + AC_SUBST(FRAMEWORK_COREAUDIO) + LIBSOCKET="$X_EXTRA_LIBS" + AC_SUBST(LIBSOCKET) + AC_SUBST(X_EXTRA_LIBS) + AC_CHECK_LIB(ucb, killpg, [LIBUCB="-lucb"]) dnl for Solaris2.4 + AC_SUBST(LIBUCB) + + case $host in dnl this *is* LynxOS specific + *-*-lynxos* ) + AC_MSG_CHECKING([LynxOS header file wrappers]) + [CFLAGS="$CFLAGS -D__NO_INCLUDE_WARN__"] + AC_MSG_RESULT(disabled) + AC_CHECK_LIB(bsd, gethostbyname, [LIBSOCKET="-lbsd"]) dnl for LynxOS + ;; + esac + + KDE_CHECK_TYPES + KDE_CHECK_LIBDL + KDE_CHECK_STRLCPY + KDE_CHECK_PIE_SUPPORT + +# darwin needs this to initialize the environment +AC_CHECK_HEADERS(crt_externs.h) +AC_CHECK_FUNC(_NSGetEnviron, [AC_DEFINE(HAVE_NSGETENVIRON, 1, [Define if your system needs _NSGetEnviron to set up the environment])]) + +AH_VERBATIM(_DARWIN_ENVIRON, +[ +#if defined(HAVE_NSGETENVIRON) && defined(HAVE_CRT_EXTERNS_H) +# include +# include +# define environ (*_NSGetEnviron()) +#endif +]) + +AH_VERBATIM(_AIX_STRINGS_H_BZERO, +[ +/* + * AIX defines FD_SET in terms of bzero, but fails to include + * that defines bzero. + */ + +#if defined(_AIX) +#include +#endif +]) + +AC_CHECK_FUNCS([vsnprintf snprintf]) + +AH_VERBATIM(_TRU64,[ +/* + * On HP-UX, the declaration of vsnprintf() is needed every time ! + */ + +#if !defined(HAVE_VSNPRINTF) || defined(hpux) +#if __STDC__ +#include +#include +#else +#include +#endif +#ifdef __cplusplus +extern "C" +#endif +int vsnprintf(char *str, size_t n, char const *fmt, va_list ap); +#ifdef __cplusplus +extern "C" +#endif +int snprintf(char *str, size_t n, char const *fmt, ...); +#endif +]) + +]) + +dnl ------------------------------------------------------------------------ +dnl Find the header files and libraries for X-Windows. Extended the +dnl macro AC_PATH_X +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([K_PATH_X], +[ +AC_REQUIRE([KDE_MISC_TESTS])dnl +AC_REQUIRE([KDE_CHECK_LIB64]) + +AC_ARG_ENABLE( + embedded, + AC_HELP_STRING([--enable-embedded],[link to Qt-embedded, don't use X]), + kde_use_qt_emb=$enableval, + kde_use_qt_emb=no +) + +AC_ARG_ENABLE( + qtopia, + AC_HELP_STRING([--enable-qtopia],[link to Qt-embedded, link to the Qtopia Environment]), + kde_use_qt_emb_palm=$enableval, + kde_use_qt_emb_palm=no +) + +AC_ARG_ENABLE( + mac, + AC_HELP_STRING([--enable-mac],[link to Qt/Mac (don't use X)]), + kde_use_qt_mac=$enableval, + kde_use_qt_mac=no +) + +# used to disable x11-specific stuff on special platforms +AM_CONDITIONAL(include_x11, test "$kde_use_qt_emb" = "no" && test "$kde_use_qt_mac" = "no") + +if test "$kde_use_qt_emb" = "no" && test "$kde_use_qt_mac" = "no"; then + +AC_MSG_CHECKING(for X) + +AC_CACHE_VAL(kde_cv_have_x, +[# One or both of the vars are not set, and there is no cached value. +if test "{$x_includes+set}" = set || test "$x_includes" = NONE; then + kde_x_includes=NO +else + kde_x_includes=$x_includes +fi +if test "{$x_libraries+set}" = set || test "$x_libraries" = NONE; then + kde_x_libraries=NO +else + kde_x_libraries=$x_libraries +fi + +# below we use the standard autoconf calls +ac_x_libraries=$kde_x_libraries +ac_x_includes=$kde_x_includes + +KDE_PATH_X_DIRECT +dnl AC_PATH_X_XMKMF picks /usr/lib as the path for the X libraries. +dnl Unfortunately, if compiling with the N32 ABI, this is not the correct +dnl location. The correct location is /usr/lib32 or an undefined value +dnl (the linker is smart enough to pick the correct default library). +dnl Things work just fine if you use just AC_PATH_X_DIRECT. +dnl Solaris has a similar problem. AC_PATH_X_XMKMF forces x_includes to +dnl /usr/openwin/include, which doesn't work. /usr/include does work, so +dnl x_includes should be left alone. +case "$host" in +mips-sgi-irix6*) + ;; +*-*-solaris*) + ;; +*) + _AC_PATH_X_XMKMF + if test -z "$ac_x_includes"; then + ac_x_includes="." + fi + if test -z "$ac_x_libraries"; then + ac_x_libraries="/usr/lib${kdelibsuff}" + fi +esac +#from now on we use our own again + +# when the user already gave --x-includes, we ignore +# what the standard autoconf macros told us. +if test "$kde_x_includes" = NO; then + kde_x_includes=$ac_x_includes +fi + +# for --x-libraries too +if test "$kde_x_libraries" = NO; then + kde_x_libraries=$ac_x_libraries +fi + +if test "$kde_x_includes" = NO; then + AC_MSG_ERROR([Can't find X includes. Please check your installation and add the correct paths!]) +fi + +if test "$kde_x_libraries" = NO; then + AC_MSG_ERROR([Can't find X libraries. Please check your installation and add the correct paths!]) +fi + +# Record where we found X for the cache. +kde_cv_have_x="have_x=yes \ + kde_x_includes=$kde_x_includes kde_x_libraries=$kde_x_libraries" +])dnl + +eval "$kde_cv_have_x" + +if test "$have_x" != yes; then + AC_MSG_RESULT($have_x) + no_x=yes +else + AC_MSG_RESULT([libraries $kde_x_libraries, headers $kde_x_includes]) +fi + +if test -z "$kde_x_includes" || test "x$kde_x_includes" = xNONE; then + X_INCLUDES="" + x_includes="."; dnl better than nothing :- + else + x_includes=$kde_x_includes + X_INCLUDES="-I$x_includes" +fi + +if test -z "$kde_x_libraries" || test "x$kde_x_libraries" = xNONE; then + X_LDFLAGS="" + x_libraries="/usr/lib"; dnl better than nothing :- + else + x_libraries=$kde_x_libraries + X_LDFLAGS="-L$x_libraries" +fi +all_includes="$X_INCLUDES" +all_libraries="$X_LDFLAGS $LDFLAGS_AS_NEEDED $LDFLAGS_NEW_DTAGS" + +# Check for libraries that X11R6 Xt/Xaw programs need. +ac_save_LDFLAGS="$LDFLAGS" +LDFLAGS="$LDFLAGS $X_LDFLAGS" +# SM needs ICE to (dynamically) link under SunOS 4.x (so we have to +# check for ICE first), but we must link in the order -lSM -lICE or +# we get undefined symbols. So assume we have SM if we have ICE. +# These have to be linked with before -lX11, unlike the other +# libraries we check for below, so use a different variable. +# --interran@uluru.Stanford.EDU, kb@cs.umb.edu. +AC_CHECK_LIB(ICE, IceConnectionNumber, + [LIBSM="-lSM -lICE"], , $X_EXTRA_LIBS) +LDFLAGS="$ac_save_LDFLAGS" + +LIB_X11='-lX11 $(LIBSOCKET)' + +AC_MSG_CHECKING(for libXext) +AC_CACHE_VAL(kde_cv_have_libXext, +[ +kde_ldflags_safe="$LDFLAGS" +kde_libs_safe="$LIBS" + +LDFLAGS="$LDFLAGS $X_LDFLAGS $USER_LDFLAGS" +LIBS="-lXext -lX11 $LIBSOCKET" + +AC_TRY_LINK([ +#include +#ifdef STDC_HEADERS +# include +#endif +], +[ +printf("hello Xext\n"); +], +kde_cv_have_libXext=yes, +kde_cv_have_libXext=no +) + +LDFLAGS=$kde_ldflags_safe +LIBS=$kde_libs_safe +]) + +AC_MSG_RESULT($kde_cv_have_libXext) + +if test "$kde_cv_have_libXext" = "no"; then + AC_MSG_ERROR([We need a working libXext to proceed. Since configure +can't find it itself, we stop here assuming that make wouldn't find +them either.]) +fi + +LIB_XEXT="-lXext" +QTE_NORTTI="" + +elif test "$kde_use_qt_emb" = "yes"; then + dnl We're using QT Embedded + CPPFLAGS=-DQWS + CXXFLAGS="$CXXFLAGS -fno-rtti" + QTE_NORTTI="-fno-rtti -DQWS" + X_PRE_LIBS="" + LIB_X11="" + LIB_XEXT="" + LIB_XRENDER="" + LIBSM="" + X_INCLUDES="" + X_LDFLAGS="" + x_includes="" + x_libraries="" +elif test "$kde_use_qt_mac" = "yes"; then + dnl We're using QT/Mac (I use QT_MAC so that qglobal.h doesn't *have* to + dnl be included to get the information) --Sam + CXXFLAGS="$CXXFLAGS -DQT_MAC -no-cpp-precomp" + CFLAGS="$CFLAGS -DQT_MAC -no-cpp-precomp" + X_PRE_LIBS="" + LIB_X11="" + LIB_XEXT="" + LIB_XRENDER="" + LIBSM="" + X_INCLUDES="" + X_LDFLAGS="" + x_includes="" + x_libraries="" +fi +AC_SUBST(X_PRE_LIBS) +AC_SUBST(LIB_X11) +AC_SUBST(LIB_XRENDER) +AC_SUBST(LIBSM) +AC_SUBST(X_INCLUDES) +AC_SUBST(X_LDFLAGS) +AC_SUBST(x_includes) +AC_SUBST(x_libraries) +AC_SUBST(QTE_NORTTI) +AC_SUBST(LIB_XEXT) + +]) + +AC_DEFUN([KDE_PRINT_QT_PROGRAM], +[ +AC_REQUIRE([KDE_USE_QT]) +cat > conftest.$ac_ext < +#include +EOF +if test "$kde_qtver" = "2"; then +cat >> conftest.$ac_ext < +#include +#include +EOF + +if test $kde_qtsubver -gt 0; then +cat >> conftest.$ac_ext <> conftest.$ac_ext < +#include +#include +EOF +fi + +echo "#if ! ($kde_qt_verstring)" >> conftest.$ac_ext +cat >> conftest.$ac_ext <> conftest.$ac_ext <> conftest.$ac_ext <> conftest.$ac_ext <> conftest.$ac_ext <&AC_FD_CC + cat conftest.$ac_ext >&AC_FD_CC +fi + +rm -f conftest* +CXXFLAGS="$ac_cxxflags_safe" +LDFLAGS="$ac_ldflags_safe" +LIBS="$ac_libs_safe" + +LD_LIBRARY_PATH="$ac_LD_LIBRARY_PATH_safe" +export LD_LIBRARY_PATH +LIBRARY_PATH="$ac_LIBRARY_PATH" +export LIBRARY_PATH +AC_LANG_RESTORE +]) + +if test "$kde_cv_qt_direct" = "yes"; then + AC_MSG_RESULT(yes) + $1 +else + AC_MSG_RESULT(no) + $2 +fi +]) + +dnl ------------------------------------------------------------------------ +dnl Try to find the Qt headers and libraries. +dnl $(QT_LDFLAGS) will be -Lqtliblocation (if needed) +dnl and $(QT_INCLUDES) will be -Iqthdrlocation (if needed) +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([AC_PATH_QT_1_3], +[ +AC_REQUIRE([K_PATH_X]) +AC_REQUIRE([KDE_USE_QT]) +AC_REQUIRE([KDE_CHECK_LIB64]) + +dnl ------------------------------------------------------------------------ +dnl Add configure flag to enable linking to MT version of Qt library. +dnl ------------------------------------------------------------------------ + +AC_ARG_ENABLE( + mt, + AC_HELP_STRING([--disable-mt],[link to non-threaded Qt (deprecated)]), + kde_use_qt_mt=$enableval, + [ + if test $kde_qtver = 3; then + kde_use_qt_mt=yes + else + kde_use_qt_mt=no + fi + ] +) + +USING_QT_MT="" + +dnl ------------------------------------------------------------------------ +dnl If we not get --disable-qt-mt then adjust some vars for the host. +dnl ------------------------------------------------------------------------ + +KDE_MT_LDFLAGS= +KDE_MT_LIBS= +if test "x$kde_use_qt_mt" = "xyes"; then + KDE_CHECK_THREADING + if test "x$kde_use_threading" = "xyes"; then + CPPFLAGS="$USE_THREADS -DQT_THREAD_SUPPORT $CPPFLAGS" + KDE_MT_LDFLAGS="$USE_THREADS" + KDE_MT_LIBS="$LIBPTHREAD" + else + kde_use_qt_mt=no + fi +fi +AC_SUBST(KDE_MT_LDFLAGS) +AC_SUBST(KDE_MT_LIBS) + +kde_qt_was_given=yes + +dnl ------------------------------------------------------------------------ +dnl If we haven't been told how to link to Qt, we work it out for ourselves. +dnl ------------------------------------------------------------------------ +if test -z "$LIBQT_GLOB"; then + if test "x$kde_use_qt_emb" = "xyes"; then + LIBQT_GLOB="libqte.*" + else + LIBQT_GLOB="libqt.*" + fi +fi + +dnl ------------------------------------------------------------ +dnl If we got --enable-embedded then adjust the Qt library name. +dnl ------------------------------------------------------------ +if test "x$kde_use_qt_emb" = "xyes"; then + qtlib="qte" +else + qtlib="qt" +fi + +kde_int_qt="-l$qtlib" + +if test -z "$LIBQPE"; then +dnl ------------------------------------------------------------ +dnl If we got --enable-palmtop then add -lqpe to the link line +dnl ------------------------------------------------------------ + if test "x$kde_use_qt_emb" = "xyes"; then + if test "x$kde_use_qt_emb_palm" = "xyes"; then + LIB_QPE="-lqpe" + else + LIB_QPE="" + fi + else + LIB_QPE="" + fi +fi + +dnl ------------------------------------------------------------------------ +dnl If we got --enable-qt-mt then adjust the Qt library name for the host. +dnl ------------------------------------------------------------------------ + +if test "x$kde_use_qt_mt" = "xyes"; then + LIBQT="-l$qtlib-mt" + kde_int_qt="-l$qtlib-mt" + LIBQT_GLOB="lib$qtlib-mt.*" + USING_QT_MT="using -mt" +else + LIBQT="-l$qtlib" +fi + +if test $kde_qtver != 1; then + + AC_REQUIRE([AC_FIND_PNG]) + AC_REQUIRE([AC_FIND_JPEG]) + LIBQT="$LIBQT $LIBPNG $LIBJPEG" +fi + +if test $kde_qtver = 3; then + AC_REQUIRE([KDE_CHECK_LIBDL]) + LIBQT="$LIBQT $LIBDL" +fi + +AC_MSG_CHECKING([for Qt]) + +if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then +LIBQT="$LIBQT $X_PRE_LIBS -lXext -lX11 $LIBSM $LIBSOCKET" +fi +ac_qt_includes=NO ac_qt_libraries=NO ac_qt_bindir=NO +qt_libraries="" +qt_includes="" +AC_ARG_WITH(qt-dir, + AC_HELP_STRING([--with-qt-dir=DIR],[where the root of Qt is installed ]), + [ ac_qt_includes="$withval"/include + ac_qt_libraries="$withval"/lib${kdelibsuff} + ac_qt_bindir="$withval"/bin + ]) + +AC_ARG_WITH(qt-includes, + AC_HELP_STRING([--with-qt-includes=DIR],[where the Qt includes are. ]), + [ + ac_qt_includes="$withval" + ]) + +kde_qt_libs_given=no + +AC_ARG_WITH(qt-libraries, + AC_HELP_STRING([--with-qt-libraries=DIR],[where the Qt library is installed.]), + [ ac_qt_libraries="$withval" + kde_qt_libs_given=yes + ]) + +AC_CACHE_VAL(ac_cv_have_qt, +[#try to guess Qt locations + +qt_incdirs="" +for dir in $kde_qt_dirs; do + qt_incdirs="$qt_incdirs $dir/include $dir" +done +qt_incdirs="$QTINC $qt_incdirs /usr/local/qt/include /usr/include/qt /usr/include /usr/X11R6/include/X11/qt /usr/X11R6/include/qt /usr/X11R6/include/qt2 /usr/include/qt3 $x_includes" +if test ! "$ac_qt_includes" = "NO"; then + qt_incdirs="$ac_qt_includes $qt_incdirs" +fi + +if test "$kde_qtver" != "1"; then + kde_qt_header=qstyle.h +else + kde_qt_header=qglobal.h +fi + +AC_FIND_FILE($kde_qt_header, $qt_incdirs, qt_incdir) +ac_qt_includes="$qt_incdir" + +qt_libdirs="" +for dir in $kde_qt_dirs; do + qt_libdirs="$qt_libdirs $dir/lib${kdelibsuff} $dir" +done +qt_libdirs="$QTLIB $qt_libdirs /usr/X11R6/lib /usr/lib /usr/local/qt/lib $x_libraries" +if test ! "$ac_qt_libraries" = "NO"; then + qt_libdir=$ac_qt_libraries +else + qt_libdirs="$ac_qt_libraries $qt_libdirs" + # if the Qt was given, the chance is too big that libqt.* doesn't exist + qt_libdir=NONE + for dir in $qt_libdirs; do + try="ls -1 $dir/${LIBQT_GLOB}" + if test -n "`$try 2> /dev/null`"; then qt_libdir=$dir; break; else echo "tried $dir" >&AC_FD_CC ; fi + done +fi +for a in $qt_libdir/lib`echo ${kde_int_qt} | sed 's,^-l,,'`_incremental.*; do + if test -e "$a"; then + LIBQT="$LIBQT ${kde_int_qt}_incremental" + break + fi +done + +ac_qt_libraries="$qt_libdir" + +AC_LANG_SAVE +AC_LANG_CPLUSPLUS + +ac_cxxflags_safe="$CXXFLAGS" +ac_ldflags_safe="$LDFLAGS" +ac_libs_safe="$LIBS" + +CXXFLAGS="$CXXFLAGS -I$qt_incdir $all_includes" +LDFLAGS="$LDFLAGS -L$qt_libdir $all_libraries $USER_LDFLAGS $KDE_MT_LDFLAGS" +LIBS="$LIBS $LIBQT $KDE_MT_LIBS" + +KDE_PRINT_QT_PROGRAM + +if AC_TRY_EVAL(ac_link) && test -s conftest; then + rm -f conftest* +else + echo "configure: failed program was:" >&AC_FD_CC + cat conftest.$ac_ext >&AC_FD_CC + ac_qt_libraries="NO" +fi +rm -f conftest* +CXXFLAGS="$ac_cxxflags_safe" +LDFLAGS="$ac_ldflags_safe" +LIBS="$ac_libs_safe" + +AC_LANG_RESTORE +if test "$ac_qt_includes" = NO || test "$ac_qt_libraries" = NO; then + ac_cv_have_qt="have_qt=no" + ac_qt_notfound="" + missing_qt_mt="" + if test "$ac_qt_includes" = NO; then + if test "$ac_qt_libraries" = NO; then + ac_qt_notfound="(headers and libraries)"; + else + ac_qt_notfound="(headers)"; + fi + else + if test "x$kde_use_qt_mt" = "xyes"; then + missing_qt_mt=" +Make sure that you have compiled Qt with thread support!" + ac_qt_notfound="(library $qtlib-mt)"; + else + ac_qt_notfound="(library $qtlib)"; + fi + fi + + AC_MSG_ERROR([Qt ($kde_qt_minversion) $ac_qt_notfound not found. Please check your installation! +For more details about this problem, look at the end of config.log.$missing_qt_mt]) +else + have_qt="yes" +fi +]) + +eval "$ac_cv_have_qt" + +if test "$have_qt" != yes; then + AC_MSG_RESULT([$have_qt]); +else + ac_cv_have_qt="have_qt=yes \ + ac_qt_includes=$ac_qt_includes ac_qt_libraries=$ac_qt_libraries" + AC_MSG_RESULT([libraries $ac_qt_libraries, headers $ac_qt_includes $USING_QT_MT]) + + qt_libraries="$ac_qt_libraries" + qt_includes="$ac_qt_includes" +fi + +if test ! "$kde_qt_libs_given" = "yes" && test ! "$kde_qtver" = 3; then + KDE_CHECK_QT_DIRECT(qt_libraries= ,[]) +fi + +AC_SUBST(qt_libraries) +AC_SUBST(qt_includes) + +if test "$qt_includes" = "$x_includes" || test -z "$qt_includes"; then + QT_INCLUDES="" +else + QT_INCLUDES="-I$qt_includes" + all_includes="$QT_INCLUDES $all_includes" +fi + +if test "$qt_libraries" = "$x_libraries" || test -z "$qt_libraries"; then + QT_LDFLAGS="" +else + QT_LDFLAGS="-L$qt_libraries" + all_libraries="$QT_LDFLAGS $all_libraries" +fi +test -z "$KDE_MT_LDFLAGS" || all_libraries="$all_libraries $KDE_MT_LDFLAGS" + +AC_SUBST(QT_INCLUDES) +AC_SUBST(QT_LDFLAGS) +AC_PATH_QT_MOC_UIC + +KDE_CHECK_QT_JPEG + +if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then +LIB_QT="$kde_int_qt $LIBJPEG_QT "'$(LIBZ) $(LIBPNG) -lXext $(LIB_X11) $(LIBSM)' +else +LIB_QT="$kde_int_qt $LIBJPEG_QT "'$(LIBZ) $(LIBPNG)' +fi +test -z "$KDE_MT_LIBS" || LIB_QT="$LIB_QT $KDE_MT_LIBS" +for a in $qt_libdir/lib`echo ${kde_int_qt} | sed 's,^-l,,'`_incremental.*; do + if test -e "$a"; then + LIB_QT="$LIB_QT ${kde_int_qt}_incremental" + break + fi +done + +AC_SUBST(LIB_QT) +AC_SUBST(LIB_QPE) + +AC_SUBST(kde_qtver) +]) + +AC_DEFUN([AC_PATH_QT], +[ +AC_PATH_QT_1_3 +]) + +AC_DEFUN([KDE_CHECK_UIC_PLUGINS], +[ +AC_REQUIRE([AC_PATH_QT_MOC_UIC]) + +if test x$ac_uic_supports_libpath = xyes; then + +AC_MSG_CHECKING([if UIC has KDE plugins available]) +AC_CACHE_VAL(kde_cv_uic_plugins, +[ +cat > actest.ui << EOF + +NewConnectionDialog + + + + testInput + + + + +EOF + + + +kde_cv_uic_plugins=no +kde_line="$UIC_PATH -L $kde_widgetdir" +if test x$ac_uic_supports_nounload = xyes; then + kde_line="$kde_line -nounload" +fi +kde_line="$kde_line -impl actest.h actest.ui > actest.cpp" +if AC_TRY_EVAL(kde_line); then + # if you're trying to debug this check and think it's incorrect, + # better check your installation. The check _is_ correct - your + # installation is not. + if test -f actest.cpp && grep klineedit actest.cpp > /dev/null; then + kde_cv_uic_plugins=yes + fi +fi +rm -f actest.ui actest.cpp +]) + +AC_MSG_RESULT([$kde_cv_uic_plugins]) +if test "$kde_cv_uic_plugins" != yes; then + AC_MSG_ERROR([ +you need to install kdelibs first. + +If you did install kdelibs, then the Qt version that is picked up by +this configure is not the same version you used to compile kdelibs. +The Qt Plugin installed by kdelibs is *ONLY* loadable if it is the +_same Qt version_, compiled with the _same compiler_ and the same Qt +configuration settings. +]) +fi +fi +]) + +AC_DEFUN([KDE_CHECK_FINAL], +[ + AC_ARG_ENABLE(final, + AC_HELP_STRING([--enable-final], + [build size optimized apps (experimental - needs lots of memory)]), + kde_use_final=$enableval, kde_use_final=no) + + if test "x$kde_use_final" = "xyes"; then + KDE_USE_FINAL_TRUE="" + KDE_USE_FINAL_FALSE="#" + else + KDE_USE_FINAL_TRUE="#" + KDE_USE_FINAL_FALSE="" + fi + AC_SUBST(KDE_USE_FINAL_TRUE) + AC_SUBST(KDE_USE_FINAL_FALSE) +]) + +AC_DEFUN([KDE_CHECK_CLOSURE], +[ + AC_ARG_ENABLE(closure, + AC_HELP_STRING([--enable-closure],[delay template instantiation]), + kde_use_closure=$enableval, kde_use_closure=no) + + KDE_NO_UNDEFINED="" + if test "x$kde_use_closure" = "xyes"; then + KDE_USE_CLOSURE_TRUE="" + KDE_USE_CLOSURE_FALSE="#" +# CXXFLAGS="$CXXFLAGS $REPO" + else + KDE_USE_CLOSURE_TRUE="#" + KDE_USE_CLOSURE_FALSE="" + KDE_NO_UNDEFINED="" + case $host in + *-*-linux-gnu) + KDE_CHECK_COMPILER_FLAG([Wl,--no-undefined], + [KDE_CHECK_COMPILER_FLAG([Wl,--allow-shlib-undefined], + [KDE_NO_UNDEFINED="-Wl,--no-undefined -Wl,--allow-shlib-undefined"], + [KDE_NO_UNDEFINED=""])], + [KDE_NO_UNDEFINED=""]) + ;; + esac + fi + AC_SUBST(KDE_USE_CLOSURE_TRUE) + AC_SUBST(KDE_USE_CLOSURE_FALSE) + AC_SUBST(KDE_NO_UNDEFINED) +]) + +dnl Check if the linker supports --enable-new-dtags and --as-needed +AC_DEFUN([KDE_CHECK_NEW_LDFLAGS], +[ + AC_ARG_ENABLE(new_ldflags, + AC_HELP_STRING([--enable-new-ldflags], + [enable the new linker flags]), + kde_use_new_ldflags=$enableval, + kde_use_new_ldflags=no) + + LDFLAGS_AS_NEEDED="" + LDFLAGS_NEW_DTAGS="" + if test "x$kde_use_new_ldflags" = "xyes"; then + LDFLAGS_NEW_DTAGS="" + KDE_CHECK_COMPILER_FLAG([Wl,--enable-new-dtags], + [LDFLAGS_NEW_DTAGS="-Wl,--enable-new-dtags"],) + + KDE_CHECK_COMPILER_FLAG([Wl,--as-needed], + [LDFLAGS_AS_NEEDED="-Wl,--as-needed"],) + fi + AC_SUBST(LDFLAGS_AS_NEEDED) + AC_SUBST(LDFLAGS_NEW_DTAGS) +]) + +AC_DEFUN([KDE_CHECK_NMCHECK], +[ + AC_ARG_ENABLE(nmcheck,AC_HELP_STRING([--enable-nmcheck],[enable automatic namespace cleanness check]), + kde_use_nmcheck=$enableval, kde_use_nmcheck=no) + + if test "$kde_use_nmcheck" = "yes"; then + KDE_USE_NMCHECK_TRUE="" + KDE_USE_NMCHECK_FALSE="#" + else + KDE_USE_NMCHECK_TRUE="#" + KDE_USE_NMCHECK_FALSE="" + fi + AC_SUBST(KDE_USE_NMCHECK_TRUE) + AC_SUBST(KDE_USE_NMCHECK_FALSE) +]) + +AC_DEFUN([KDE_EXPAND_MAKEVAR], [ +savex=$exec_prefix +test "x$exec_prefix" = xNONE && exec_prefix=$prefix +tmp=$$2 +while $1=`eval echo "$tmp"`; test "x$$1" != "x$tmp"; do tmp=$$1; done +exec_prefix=$savex +]) + +dnl ------------------------------------------------------------------------ +dnl Now, the same with KDE +dnl $(KDE_LDFLAGS) will be the kdeliblocation (if needed) +dnl and $(kde_includes) will be the kdehdrlocation (if needed) +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([AC_BASE_PATH_KDE], +[ +AC_REQUIRE([KDE_CHECK_STL]) +AC_REQUIRE([AC_PATH_QT])dnl +AC_REQUIRE([KDE_CHECK_LIB64]) + +AC_CHECK_RPATH +AC_MSG_CHECKING([for KDE]) + +if test "${prefix}" != NONE; then + kde_includes=${includedir} + KDE_EXPAND_MAKEVAR(ac_kde_includes, includedir) + + kde_libraries=${libdir} + KDE_EXPAND_MAKEVAR(ac_kde_libraries, libdir) + +else + ac_kde_includes= + ac_kde_libraries= + kde_libraries="" + kde_includes="" +fi + +AC_CACHE_VAL(ac_cv_have_kde, +[#try to guess kde locations + +if test "$kde_qtver" = 1; then + kde_check_header="ksock.h" + kde_check_lib="libkdecore.la" +else + kde_check_header="ksharedptr.h" + kde_check_lib="libkio.la" +fi + +if test -z "$1"; then + +kde_incdirs="$kde_libs_prefix/include /usr/lib/kde/include /usr/local/kde/include /usr/local/include /usr/kde/include /usr/include/kde /usr/include /opt/kde3/include /opt/kde/include $x_includes $qt_includes" +test -n "$KDEDIR" && kde_incdirs="$KDEDIR/include $KDEDIR/include/kde $KDEDIR $kde_incdirs" +kde_incdirs="$ac_kde_includes $kde_incdirs" +AC_FIND_FILE($kde_check_header, $kde_incdirs, kde_incdir) +ac_kde_includes="$kde_incdir" + +if test -n "$ac_kde_includes" && test ! -r "$ac_kde_includes/$kde_check_header"; then + AC_MSG_ERROR([ +in the prefix, you've chosen, are no KDE headers installed. This will fail. +So, check this please and use another prefix!]) +fi + +kde_libdirs="$kde_libs_prefix/lib${kdelibsuff} /usr/lib/kde/lib${kdelibsuff} /usr/local/kde/lib${kdelibsuff} /usr/kde/lib${kdelibsuff} /usr/lib${kdelibsuff}/kde /usr/lib${kdelibsuff}/kde3 /usr/lib${kdelibsuff} /usr/X11R6/lib${kdelibsuff} /usr/local/lib${kdelibsuff} /opt/kde3/lib${kdelibsuff} /opt/kde/lib${kdelibsuff} /usr/X11R6/kde/lib${kdelibsuff}" +test -n "$KDEDIR" && kde_libdirs="$KDEDIR/lib${kdelibsuff} $KDEDIR $kde_libdirs" +kde_libdirs="$ac_kde_libraries $libdir $kde_libdirs" +AC_FIND_FILE($kde_check_lib, $kde_libdirs, kde_libdir) +ac_kde_libraries="$kde_libdir" + +kde_widgetdir=NO +dnl this might be somewhere else +AC_FIND_FILE("kde3/plugins/designer/kdewidgets.la", $kde_libdirs, kde_widgetdir) + +if test -n "$ac_kde_libraries" && test ! -r "$ac_kde_libraries/$kde_check_lib"; then +AC_MSG_ERROR([ +in the prefix, you've chosen, are no KDE libraries installed. This will fail. +So, check this please and use another prefix!]) +fi + +if test -n "$kde_widgetdir" && test ! -r "$kde_widgetdir/kde3/plugins/designer/kdewidgets.la"; then +AC_MSG_ERROR([ +I can't find the designer plugins. These are required and should have been installed +by kdelibs]) +fi + +if test -n "$kde_widgetdir"; then + kde_widgetdir="$kde_widgetdir/kde3/plugins/designer" +fi + + +if test "$ac_kde_includes" = NO || test "$ac_kde_libraries" = NO || test "$kde_widgetdir" = NO; then + ac_cv_have_kde="have_kde=no" +else + ac_cv_have_kde="have_kde=yes \ + ac_kde_includes=$ac_kde_includes ac_kde_libraries=$ac_kde_libraries" +fi + +else dnl test -z $1, e.g. from kdelibs + + ac_cv_have_kde="have_kde=no" + +fi +])dnl + +eval "$ac_cv_have_kde" + +if test "$have_kde" != "yes"; then + if test "${prefix}" = NONE; then + ac_kde_prefix="$ac_default_prefix" + else + ac_kde_prefix="$prefix" + fi + if test "$exec_prefix" = NONE; then + ac_kde_exec_prefix="$ac_kde_prefix" + AC_MSG_RESULT([will be installed in $ac_kde_prefix]) + else + ac_kde_exec_prefix="$exec_prefix" + AC_MSG_RESULT([will be installed in $ac_kde_prefix and $ac_kde_exec_prefix]) + fi + + kde_libraries="${libdir}" + kde_includes="${includedir}" + +else + ac_cv_have_kde="have_kde=yes \ + ac_kde_includes=$ac_kde_includes ac_kde_libraries=$ac_kde_libraries" + AC_MSG_RESULT([libraries $ac_kde_libraries, headers $ac_kde_includes]) + + kde_libraries="$ac_kde_libraries" + kde_includes="$ac_kde_includes" +fi +AC_SUBST(kde_libraries) +AC_SUBST(kde_includes) + +if test "$kde_includes" = "$x_includes" || test "$kde_includes" = "$qt_includes" || test "$kde_includes" = "/usr/include"; then + KDE_INCLUDES="" +else + KDE_INCLUDES="-I$kde_includes" + all_includes="$KDE_INCLUDES $all_includes" +fi + +KDE_DEFAULT_CXXFLAGS="-DQT_CLEAN_NAMESPACE -DQT_NO_ASCII_CAST -DQT_NO_STL -DQT_NO_COMPAT -DQT_NO_TRANSLATION" + +KDE_LDFLAGS="-L$kde_libraries" +if test ! "$kde_libraries" = "$x_libraries" && test ! "$kde_libraries" = "$qt_libraries" ; then + all_libraries="$KDE_LDFLAGS $all_libraries" +fi + +AC_SUBST(KDE_LDFLAGS) +AC_SUBST(KDE_INCLUDES) + +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + +all_libraries="$all_libraries $USER_LDFLAGS" +all_includes="$all_includes $USER_INCLUDES" +AC_SUBST(all_includes) +AC_SUBST(all_libraries) + +if test -z "$1"; then +KDE_CHECK_UIC_PLUGINS +fi + +ac_kde_libraries="$kde_libdir" + +AC_SUBST(AUTODIRS) + + +]) + +AC_DEFUN([KDE_CHECK_EXTRA_LIBS], +[ +AC_MSG_CHECKING(for extra includes) +AC_ARG_WITH(extra-includes,AC_HELP_STRING([--with-extra-includes=DIR],[adds non standard include paths]), + kde_use_extra_includes="$withval", + kde_use_extra_includes=NONE +) +kde_extra_includes= +if test -n "$kde_use_extra_includes" && \ + test "$kde_use_extra_includes" != "NONE"; then + + ac_save_ifs=$IFS + IFS=':' + for dir in $kde_use_extra_includes; do + kde_extra_includes="$kde_extra_includes $dir" + USER_INCLUDES="$USER_INCLUDES -I$dir" + done + IFS=$ac_save_ifs + kde_use_extra_includes="added" +else + kde_use_extra_includes="no" +fi +AC_SUBST(USER_INCLUDES) + +AC_MSG_RESULT($kde_use_extra_includes) + +kde_extra_libs= +AC_MSG_CHECKING(for extra libs) +AC_ARG_WITH(extra-libs,AC_HELP_STRING([--with-extra-libs=DIR],[adds non standard library paths]), + kde_use_extra_libs=$withval, + kde_use_extra_libs=NONE +) +if test -n "$kde_use_extra_libs" && \ + test "$kde_use_extra_libs" != "NONE"; then + + ac_save_ifs=$IFS + IFS=':' + for dir in $kde_use_extra_libs; do + kde_extra_libs="$kde_extra_libs $dir" + KDE_EXTRA_RPATH="$KDE_EXTRA_RPATH -R $dir" + USER_LDFLAGS="$USER_LDFLAGS -L$dir" + done + IFS=$ac_save_ifs + kde_use_extra_libs="added" +else + kde_use_extra_libs="no" +fi + +AC_SUBST(USER_LDFLAGS) + +AC_MSG_RESULT($kde_use_extra_libs) + +]) + +AC_DEFUN([KDE_1_CHECK_PATH_HEADERS], +[ + AC_MSG_CHECKING([for KDE headers installed]) + AC_LANG_SAVE + AC_LANG_CPLUSPLUS +cat > conftest.$ac_ext < +#endif +#include +#include "confdefs.h" +#include + +int main() { + printf("kde_htmldir=\\"%s\\"\n", KApplication::kde_htmldir().data()); + printf("kde_appsdir=\\"%s\\"\n", KApplication::kde_appsdir().data()); + printf("kde_icondir=\\"%s\\"\n", KApplication::kde_icondir().data()); + printf("kde_sounddir=\\"%s\\"\n", KApplication::kde_sounddir().data()); + printf("kde_datadir=\\"%s\\"\n", KApplication::kde_datadir().data()); + printf("kde_locale=\\"%s\\"\n", KApplication::kde_localedir().data()); + printf("kde_cgidir=\\"%s\\"\n", KApplication::kde_cgidir().data()); + printf("kde_confdir=\\"%s\\"\n", KApplication::kde_configdir().data()); + printf("kde_mimedir=\\"%s\\"\n", KApplication::kde_mimedir().data()); + printf("kde_toolbardir=\\"%s\\"\n", KApplication::kde_toolbardir().data()); + printf("kde_wallpaperdir=\\"%s\\"\n", + KApplication::kde_wallpaperdir().data()); + printf("kde_bindir=\\"%s\\"\n", KApplication::kde_bindir().data()); + printf("kde_partsdir=\\"%s\\"\n", KApplication::kde_partsdir().data()); + printf("kde_servicesdir=\\"/tmp/dummy\\"\n"); + printf("kde_servicetypesdir=\\"/tmp/dummy\\"\n"); + printf("kde_moduledir=\\"/tmp/dummy\\"\n"); + printf("kde_styledir=\\"/tmp/dummy\\"\n"); + printf("kde_widgetdir=\\"/tmp/dummy\\"\n"); + printf("xdg_appsdir=\\"/tmp/dummy\\"\n"); + printf("xdg_menudir=\\"/tmp/dummy\\"\n"); + printf("xdg_directorydir=\\"/tmp/dummy\\"\n"); + printf("kde_kcfgdir=\\"/tmp/dummy\\"\n"); + return 0; + } +EOF + + ac_save_CPPFLAGS=$CPPFLAGS + CPPFLAGS="$all_includes $CPPFLAGS" + if AC_TRY_EVAL(ac_compile); then + AC_MSG_RESULT(yes) + else + AC_MSG_ERROR([your system is not able to compile a small KDE application! +Check, if you installed the KDE header files correctly. +For more details about this problem, look at the end of config.log.]) + fi + CPPFLAGS=$ac_save_CPPFLAGS + + AC_LANG_RESTORE +]) + +AC_DEFUN([KDE_CHECK_KDEQTADDON], +[ +AC_MSG_CHECKING(for kde-qt-addon) +AC_CACHE_VAL(kde_cv_have_kdeqtaddon, +[ + kde_ldflags_safe="$LDFLAGS" + kde_libs_safe="$LIBS" + kde_cxxflags_safe="$CXXFLAGS" + + LIBS="-lkde-qt-addon $LIBQT $LIBS" + CXXFLAGS="$CXXFLAGS -I$prefix/include -I$prefix/include/kde $all_includes" + LDFLAGS="$LDFLAGS $all_libraries $USER_LDFLAGS" + + AC_TRY_LINK([ + #include + ], + [ + QDomDocument doc; + ], + kde_cv_have_kdeqtaddon=yes, + kde_cv_have_kdeqtaddon=no + ) + + LDFLAGS=$kde_ldflags_safe + LIBS=$kde_libs_safe + CXXFLAGS=$kde_cxxflags_safe +]) + +AC_MSG_RESULT($kde_cv_have_kdeqtaddon) + +if test "$kde_cv_have_kdeqtaddon" = "no"; then + AC_MSG_ERROR([Can't find libkde-qt-addon. You need to install it first. +It is a separate package (and CVS module) named kde-qt-addon.]) +fi +]) + +AC_DEFUN([KDE_CREATE_LIBS_ALIASES], +[ + AC_REQUIRE([KDE_MISC_TESTS]) + AC_REQUIRE([KDE_CHECK_LIBDL]) + AC_REQUIRE([K_PATH_X]) + +if test $kde_qtver = 3; then + case $host in + *cygwin*) lib_kded="-lkdeinit_kded" ;; + *) lib_kded="" ;; + esac + AC_SUBST(LIB_KDED, $lib_kded) + AC_SUBST(LIB_KDECORE, "-lkdecore") + AC_SUBST(LIB_KDEUI, "-lkdeui") + AC_SUBST(LIB_KIO, "-lkio") + AC_SUBST(LIB_KJS, "-lkjs") + AC_SUBST(LIB_SMB, "-lsmb") + AC_SUBST(LIB_KAB, "-lkab") + AC_SUBST(LIB_KABC, "-lkabc") + AC_SUBST(LIB_KHTML, "-lkhtml") + AC_SUBST(LIB_KSPELL, "-lkspell") + AC_SUBST(LIB_KPARTS, "-lkparts") + AC_SUBST(LIB_KDEPRINT, "-lkdeprint") + AC_SUBST(LIB_KUTILS, "-lkutils") + AC_SUBST(LIB_KDEPIM, "-lkdepim") + AC_SUBST(LIB_KIMPROXY, "-lkimproxy") + AC_SUBST(LIB_KNEWSTUFF, "-lknewstuff") + AC_SUBST(LIB_KDNSSD, "-lkdnssd") + AC_SUBST(LIB_KUNITTEST, "-lkunittest") +# these are for backward compatibility + AC_SUBST(LIB_KSYCOCA, "-lkio") + AC_SUBST(LIB_KFILE, "-lkio") +elif test $kde_qtver = 2; then + AC_SUBST(LIB_KDECORE, "-lkdecore") + AC_SUBST(LIB_KDEUI, "-lkdeui") + AC_SUBST(LIB_KIO, "-lkio") + AC_SUBST(LIB_KSYCOCA, "-lksycoca") + AC_SUBST(LIB_SMB, "-lsmb") + AC_SUBST(LIB_KFILE, "-lkfile") + AC_SUBST(LIB_KAB, "-lkab") + AC_SUBST(LIB_KHTML, "-lkhtml") + AC_SUBST(LIB_KSPELL, "-lkspell") + AC_SUBST(LIB_KPARTS, "-lkparts") + AC_SUBST(LIB_KDEPRINT, "-lkdeprint") +else + AC_SUBST(LIB_KDECORE, "-lkdecore -lXext $(LIB_QT)") + AC_SUBST(LIB_KDEUI, "-lkdeui $(LIB_KDECORE)") + AC_SUBST(LIB_KFM, "-lkfm $(LIB_KDECORE)") + AC_SUBST(LIB_KFILE, "-lkfile $(LIB_KFM) $(LIB_KDEUI)") + AC_SUBST(LIB_KAB, "-lkab $(LIB_KIMGIO) $(LIB_KDECORE)") +fi +]) + +AC_DEFUN([AC_PATH_KDE], +[ + AC_BASE_PATH_KDE + AC_ARG_ENABLE(path-check,AC_HELP_STRING([--disable-path-check],[don't try to find out, where to install]), + [ + if test "$enableval" = "no"; + then ac_use_path_checking="default" + else ac_use_path_checking="" + fi + ], + [ + if test "$kde_qtver" = 1; + then ac_use_path_checking="" + else ac_use_path_checking="default" + fi + ] + ) + + AC_CREATE_KFSSTND($ac_use_path_checking) + + AC_SUBST_KFSSTND + KDE_CREATE_LIBS_ALIASES +]) + +dnl KDE_CHECK_FUNC_EXT(, [headers], [sample-use], [C prototype], [autoheader define], [call if found]) +AC_DEFUN([KDE_CHECK_FUNC_EXT], +[ +AC_MSG_CHECKING(for $1) +AC_CACHE_VAL(kde_cv_func_$1, +[ +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +save_CXXFLAGS="$CXXFLAGS" +kde_safe_LIBS="$LIBS" +LIBS="$LIBS $X_EXTRA_LIBS" +if test "$GXX" = "yes"; then +CXXFLAGS="$CXXFLAGS -pedantic-errors" +fi +AC_TRY_COMPILE([ +$2 +], +[ +$3 +], +kde_cv_func_$1=yes, +kde_cv_func_$1=no) +CXXFLAGS="$save_CXXFLAGS" +LIBS="$kde_safe_LIBS" +AC_LANG_RESTORE +]) + +AC_MSG_RESULT($kde_cv_func_$1) + +AC_MSG_CHECKING([if $1 needs custom prototype]) +AC_CACHE_VAL(kde_cv_proto_$1, +[ +if test "x$kde_cv_func_$1" = xyes; then + kde_cv_proto_$1=no +else + case "$1" in + setenv|unsetenv|usleep|random|srandom|seteuid|mkstemps|mkstemp|revoke|vsnprintf|strlcpy|strlcat) + kde_cv_proto_$1="yes - in libkdefakes" + ;; + *) + kde_cv_proto_$1=unknown + ;; + esac +fi + +if test "x$kde_cv_proto_$1" = xunknown; then + +AC_LANG_SAVE +AC_LANG_CPLUSPLUS + kde_safe_libs=$LIBS + LIBS="$LIBS $X_EXTRA_LIBS" + AC_TRY_LINK([ +$2 + +extern "C" $4; +], +[ +$3 +], +[ kde_cv_func_$1=yes + kde_cv_proto_$1=yes ], + [kde_cv_proto_$1="$1 unavailable"] +) +LIBS=$kde_safe_libs +AC_LANG_RESTORE +fi +]) +AC_MSG_RESULT($kde_cv_proto_$1) + +if test "x$kde_cv_func_$1" = xyes; then + AC_DEFINE(HAVE_$5, 1, [Define if you have $1]) + $6 +fi +if test "x$kde_cv_proto_$1" = xno; then + AC_DEFINE(HAVE_$5_PROTO, 1, + [Define if you have the $1 prototype]) +fi + +AH_VERBATIM([_HAVE_$5_PROTO], +[ +#if !defined(HAVE_$5_PROTO) +#ifdef __cplusplus +extern "C" { +#endif +$4; +#ifdef __cplusplus +} +#endif +#endif +]) +]) + +AC_DEFUN([AC_CHECK_SETENV], +[ + KDE_CHECK_FUNC_EXT(setenv, [ +#include +], + [setenv("VAR", "VALUE", 1);], + [int setenv (const char *, const char *, int)], + [SETENV]) +]) + +AC_DEFUN([AC_CHECK_UNSETENV], +[ + KDE_CHECK_FUNC_EXT(unsetenv, [ +#include +], + [unsetenv("VAR");], + [void unsetenv (const char *)], + [UNSETENV]) +]) + +AC_DEFUN([AC_CHECK_GETDOMAINNAME], +[ + KDE_CHECK_FUNC_EXT(getdomainname, [ +#include +#include +#include +], + [ +char buffer[200]; +getdomainname(buffer, 200); +], + [#include + int getdomainname (char *, size_t)], + [GETDOMAINNAME]) +]) + +AC_DEFUN([AC_CHECK_GETHOSTNAME], +[ + KDE_CHECK_FUNC_EXT(gethostname, [ +#include +#include +], + [ +char buffer[200]; +gethostname(buffer, 200); +], + [int gethostname (char *, unsigned int)], + [GETHOSTNAME]) +]) + +AC_DEFUN([AC_CHECK_USLEEP], +[ + KDE_CHECK_FUNC_EXT(usleep, [ +#include +], + [ +usleep(200); +], + [int usleep (unsigned int)], + [USLEEP]) +]) + + +AC_DEFUN([AC_CHECK_RANDOM], +[ + KDE_CHECK_FUNC_EXT(random, [ +#include +], + [ +random(); +], + [long int random(void)], + [RANDOM]) + + KDE_CHECK_FUNC_EXT(srandom, [ +#include +], + [ +srandom(27); +], + [void srandom(unsigned int)], + [SRANDOM]) + +]) + +AC_DEFUN([AC_CHECK_INITGROUPS], +[ + KDE_CHECK_FUNC_EXT(initgroups, [ +#include +#include +#include +], + [ +char buffer[200]; +initgroups(buffer, 27); +], + [int initgroups(const char *, gid_t)], + [INITGROUPS]) +]) + +AC_DEFUN([AC_CHECK_MKSTEMPS], +[ + KDE_CHECK_FUNC_EXT(mkstemps, [ +#include +#include +], + [ +mkstemps("/tmp/aaaXXXXXX", 6); +], + [int mkstemps(char *, int)], + [MKSTEMPS]) +]) + +AC_DEFUN([AC_CHECK_MKSTEMP], +[ + KDE_CHECK_FUNC_EXT(mkstemp, [ +#include +#include +], + [ +mkstemp("/tmp/aaaXXXXXX"); +], + [int mkstemp(char *)], + [MKSTEMP]) +]) + +AC_DEFUN([AC_CHECK_MKDTEMP], +[ + KDE_CHECK_FUNC_EXT(mkdtemp, [ +#include +#include +], + [ +mkdtemp("/tmp/aaaXXXXXX"); +], + [char *mkdtemp(char *)], + [MKDTEMP]) +]) + + +AC_DEFUN([AC_CHECK_RES_INIT], +[ + AC_MSG_CHECKING([if res_init needs -lresolv]) + kde_libs_safe="$LIBS" + LIBS="$LIBS $X_EXTRA_LIBS -lresolv" + AC_TRY_LINK( + [ +#include +#include +#include +#include + ], + [ + res_init(); + ], + [ + LIBRESOLV="-lresolv" + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_RES_INIT, 1, [Define if you have the res_init function]) + ], + [ AC_MSG_RESULT(no) ] + ) + LIBS=$kde_libs_safe + AC_SUBST(LIBRESOLV) + + KDE_CHECK_FUNC_EXT(res_init, + [ +#include +#include +#include +#include + ], + [res_init()], + [int res_init(void)], + [RES_INIT]) +]) + +AC_DEFUN([AC_CHECK_STRLCPY], +[ + KDE_CHECK_FUNC_EXT(strlcpy, [ +#include +], +[ char buf[20]; + strlcpy(buf, "KDE function test", sizeof(buf)); +], + [unsigned long strlcpy(char*, const char*, unsigned long)], + [STRLCPY]) +]) + +AC_DEFUN([AC_CHECK_STRLCAT], +[ + KDE_CHECK_FUNC_EXT(strlcat, [ +#include +], +[ char buf[20]; + buf[0]='\0'; + strlcat(buf, "KDE function test", sizeof(buf)); +], + [unsigned long strlcat(char*, const char*, unsigned long)], + [STRLCAT]) +]) + +AC_DEFUN([AC_CHECK_RES_QUERY], +[ + KDE_CHECK_FUNC_EXT(res_query, [ +#include +#include +#include +#include +#include +], +[ +res_query(NULL, 0, 0, NULL, 0); +], + [int res_query(const char *, int, int, unsigned char *, int)], + [RES_QUERY]) +]) + +AC_DEFUN([AC_CHECK_DN_SKIPNAME], +[ + KDE_CHECK_FUNC_EXT(dn_skipname, [ +#include +#include +#include +#include +], +[ +dn_skipname (NULL, NULL); +], + [int dn_skipname (unsigned char *, unsigned char *)], + [DN_SKIPNAME]) +]) + + +AC_DEFUN([AC_FIND_GIF], + [AC_MSG_CHECKING([for giflib]) +AC_CACHE_VAL(ac_cv_lib_gif, +[ac_save_LIBS="$LIBS" +if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then +LIBS="$all_libraries -lgif -lX11 $LIBSOCKET" +else +LIBS="$all_libraries -lgif" +fi +AC_TRY_LINK(dnl +[ +#ifdef __cplusplus +extern "C" { +#endif +int GifLastError(void); +#ifdef __cplusplus +} +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +], + [return GifLastError();], + eval "ac_cv_lib_gif=yes", + eval "ac_cv_lib_gif=no") +LIBS="$ac_save_LIBS" +])dnl +if eval "test \"`echo $ac_cv_lib_gif`\" = yes"; then + AC_MSG_RESULT(yes) + AC_DEFINE_UNQUOTED(HAVE_LIBGIF, 1, [Define if you have libgif]) +else + AC_MSG_ERROR(You need giflib30. Please install the kdesupport package) +fi +]) + +AC_DEFUN([KDE_FIND_JPEG_HELPER], +[ +AC_MSG_CHECKING([for libjpeg$2]) +AC_CACHE_VAL(ac_cv_lib_jpeg_$1, +[ +ac_save_LIBS="$LIBS" +LIBS="$all_libraries $USER_LDFLAGS -ljpeg$2 -lm" +ac_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" +AC_TRY_LINK( +[ +#ifdef __cplusplus +extern "C" { +#endif +void jpeg_CreateDecompress(); +#ifdef __cplusplus +} +#endif +], +[jpeg_CreateDecompress();], + eval "ac_cv_lib_jpeg_$1=-ljpeg$2", + eval "ac_cv_lib_jpeg_$1=no") +LIBS="$ac_save_LIBS" +CFLAGS="$ac_save_CFLAGS" +]) + +if eval "test ! \"`echo $ac_cv_lib_jpeg_$1`\" = no"; then + LIBJPEG="$ac_cv_lib_jpeg_$1" + AC_MSG_RESULT($ac_cv_lib_jpeg_$1) +else + AC_MSG_RESULT(no) + $3 +fi + +]) + +AC_DEFUN([AC_FIND_JPEG], +[ +dnl first look for libraries +KDE_FIND_JPEG_HELPER(6b, 6b, + KDE_FIND_JPEG_HELPER(normal, [], + [ + LIBJPEG= + ] + ) +) + +dnl then search the headers (can't use simply AC_TRY_xxx, as jpeglib.h +dnl requires system dependent includes loaded before it) +jpeg_incdirs="$includedir /usr/include /usr/local/include $kde_extra_includes" +AC_FIND_FILE(jpeglib.h, $jpeg_incdirs, jpeg_incdir) +test "x$jpeg_incdir" = xNO && jpeg_incdir= + +dnl if headers _and_ libraries are missing, this is no error, and we +dnl continue with a warning (the user will get no jpeg support in khtml) +dnl if only one is missing, it means a configuration error, but we still +dnl only warn +if test -n "$jpeg_incdir" && test -n "$LIBJPEG" ; then + AC_DEFINE_UNQUOTED(HAVE_LIBJPEG, 1, [Define if you have libjpeg]) +else + if test -n "$jpeg_incdir" || test -n "$LIBJPEG" ; then + AC_MSG_WARN([ +There is an installation error in jpeg support. You seem to have only one +of either the headers _or_ the libraries installed. You may need to either +provide correct --with-extra-... options, or the development package of +libjpeg6b. You can get a source package of libjpeg from http://www.ijg.org/ +Disabling JPEG support. +]) + else + AC_MSG_WARN([libjpeg not found. disable JPEG support.]) + fi + jpeg_incdir= + LIBJPEG= +fi + +AC_SUBST(LIBJPEG) +AH_VERBATIM(_AC_CHECK_JPEG, +[/* + * jpeg.h needs HAVE_BOOLEAN, when the system uses boolean in system + * headers and I'm too lazy to write a configure test as long as only + * unixware is related + */ +#ifdef _UNIXWARE +#define HAVE_BOOLEAN +#endif +]) +]) + +AC_DEFUN([KDE_CHECK_QT_JPEG], +[ +if test -n "$LIBJPEG"; then +AC_MSG_CHECKING([if Qt needs $LIBJPEG]) +AC_CACHE_VAL(kde_cv_qt_jpeg, +[ +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +ac_save_LIBS="$LIBS" +LIBS="$all_libraries $USER_LDFLAGS $LIBQT" +LIBS=`echo $LIBS | sed "s/$LIBJPEG//"` +ac_save_CXXFLAGS="$CXXFLAGS" +CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES" +AC_TRY_LINK( +[#include ], + [ + int argc; + char** argv; + QApplication app(argc, argv);], + eval "kde_cv_qt_jpeg=no", + eval "kde_cv_qt_jpeg=yes") +LIBS="$ac_save_LIBS" +CXXFLAGS="$ac_save_CXXFLAGS" +AC_LANG_RESTORE +fi +]) + +if eval "test ! \"`echo $kde_cv_qt_jpeg`\" = no"; then + AC_MSG_RESULT(yes) + LIBJPEG_QT='$(LIBJPEG)' +else + AC_MSG_RESULT(no) + LIBJPEG_QT= +fi + +]) + +AC_DEFUN([AC_FIND_ZLIB], +[ +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) +AC_MSG_CHECKING([for libz]) +AC_CACHE_VAL(ac_cv_lib_z, +[ +kde_save_LIBS="$LIBS" +LIBS="$all_libraries $USER_LDFLAGS -lz $LIBSOCKET" +kde_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" +AC_TRY_LINK(dnl +[ +#include +], +[ + char buf[42]; + gzFile f = (gzFile) 0; + /* this would segfault.. but we only link, don't run */ + (void) gzgets(f, buf, sizeof(buf)); + + return (zlibVersion() == ZLIB_VERSION); +], + eval "ac_cv_lib_z='-lz'", + eval "ac_cv_lib_z=no") +LIBS="$kde_save_LIBS" +CFLAGS="$kde_save_CFLAGS" +])dnl +if test ! "$ac_cv_lib_z" = no; then + AC_DEFINE_UNQUOTED(HAVE_LIBZ, 1, [Define if you have libz]) + LIBZ="$ac_cv_lib_z" + AC_MSG_RESULT($ac_cv_lib_z) +else + AC_MSG_ERROR(not found. + Possibly configure picks up an outdated version + installed by XFree86. Remove it from your system. + + Check your installation and look into config.log) + LIBZ="" +fi +AC_SUBST(LIBZ) +]) + +AC_DEFUN([KDE_TRY_TIFFLIB], +[ +AC_MSG_CHECKING([for libtiff $1]) + +AC_CACHE_VAL(kde_cv_libtiff_$1, +[ +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +kde_save_LIBS="$LIBS" +if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then +LIBS="$all_libraries $USER_LDFLAGS -l$1 $LIBJPEG $LIBZ -lX11 $LIBSOCKET -lm" +else +LIBS="$all_libraries $USER_LDFLAGS -l$1 $LIBJPEG $LIBZ -lm" +fi +kde_save_CXXFLAGS="$CXXFLAGS" +CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES" + +AC_TRY_LINK(dnl +[ +#include +], + [return (TIFFOpen( "", "r") == 0); ], +[ + kde_cv_libtiff_$1="-l$1 $LIBJPEG $LIBZ" +], [ + kde_cv_libtiff_$1=no +]) + +LIBS="$kde_save_LIBS" +CXXFLAGS="$kde_save_CXXFLAGS" +AC_LANG_RESTORE +]) + +if test "$kde_cv_libtiff_$1" = "no"; then + AC_MSG_RESULT(no) + LIBTIFF="" + $3 +else + LIBTIFF="$kde_cv_libtiff_$1" + AC_MSG_RESULT(yes) + AC_DEFINE_UNQUOTED(HAVE_LIBTIFF, 1, [Define if you have libtiff]) + $2 +fi + +]) + +AC_DEFUN([AC_FIND_TIFF], +[ +AC_REQUIRE([K_PATH_X]) +AC_REQUIRE([AC_FIND_ZLIB]) +AC_REQUIRE([AC_FIND_JPEG]) +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + +KDE_TRY_TIFFLIB(tiff, [], + KDE_TRY_TIFFLIB(tiff34)) + +AC_SUBST(LIBTIFF) +]) + +AC_DEFUN([KDE_FIND_LIBEXR], +[ +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) +AC_REQUIRE([AC_FIND_ZLIB]) +AC_CACHE_VAL(ac_cv_libexr, +[ + if test -z "$PKG_CONFIG"; then + AC_PATH_PROG(PKG_CONFIG, pkg-config, no) + fi + + AC_MSG_CHECKING([for OpenEXR libraries]) + + if test "$PKG_CONFIG" = "no" ; then + AC_MSG_RESULT(no) + echo "*** The pkg-config script could not be found. Make sure it is" + echo "*** in your path, or set the PKG_CONFIG environment variable" + echo "*** to the full path to pkg-config." + echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config." + else + if !(`$PKG_CONFIG --exists OpenEXR`) ; then + AC_MSG_RESULT(no) + EXRSTATUS=no + else + if !(`$PKG_CONFIG --atleast-version="1.1.1" OpenEXR`) ; then + AC_MSG_RESULT(no) + EXRSTATUS=old + else + kde_save_LIBS="$LIBS" + LIBS="$LIBS $all_libraries $USER_LDFLAGS $LIBZ `pkg-config --libs OpenEXR`" + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + kde_save_CXXFLAGS="$CXXFLAGS" + EXR_FLAGS=`$PKG_CONFIG --cflags OpenEXR` + CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES $EXR_FLAGS" + + AC_TRY_LINK(dnl + [ + #include + ], + [ + using namespace Imf; + RgbaInputFile file ("dummy"); + return 0; + ], + eval "ac_cv_libexr='`pkg-config --libs OpenEXR`'", + eval "ac_cv_libexr=no" + ) + LIBS="$kde_save_LIBS" + CXXFLAGS="$kde_save_CXXFLAGS" + AC_LANG_RESTORE + ])dnl + if eval "test ! \"`echo $ac_cv_libexr`\" = no"; then + AC_DEFINE_UNQUOTED(HAVE_EXR, 1, [Define if you have OpenEXR]) + LIB_EXR="$ac_cv_libexr" + AC_MSG_RESULT($ac_cv_libexr) + else + AC_MSG_RESULT(no) + LIB_EXR="" + fi + fi + fi + fi + AC_SUBST(LIB_EXR) + AC_SUBST(EXR_FLAGS) +]) + + + +AC_DEFUN([AC_FIND_PNG], +[ +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) +AC_REQUIRE([AC_FIND_ZLIB]) +AC_MSG_CHECKING([for libpng]) +AC_CACHE_VAL(ac_cv_lib_png, +[ +kde_save_LIBS="$LIBS" +if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then +LIBS="$LIBS $all_libraries $USER_LDFLAGS -lpng $LIBZ -lm -lX11 $LIBSOCKET" +else +LIBS="$LIBS $all_libraries $USER_LDFLAGS -lpng $LIBZ -lm" +fi +kde_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" + +AC_TRY_LINK(dnl + [ + #include + ], + [ + png_structp png_ptr = png_create_read_struct( /* image ptr */ + PNG_LIBPNG_VER_STRING, 0, 0, 0 ); + return( png_ptr != 0 ); + ], + eval "ac_cv_lib_png='-lpng $LIBZ -lm'", + eval "ac_cv_lib_png=no" +) +LIBS="$kde_save_LIBS" +CFLAGS="$kde_save_CFLAGS" +])dnl +if eval "test ! \"`echo $ac_cv_lib_png`\" = no"; then + AC_DEFINE_UNQUOTED(HAVE_LIBPNG, 1, [Define if you have libpng]) + LIBPNG="$ac_cv_lib_png" + AC_SUBST(LIBPNG) + AC_MSG_RESULT($ac_cv_lib_png) +else + AC_MSG_RESULT(no) + LIBPNG="" + AC_SUBST(LIBPNG) +fi +]) + + +AC_DEFUN([AC_FIND_JASPER], +[ +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) +AC_REQUIRE([AC_FIND_JPEG]) +AC_MSG_CHECKING([for jasper]) +AC_CACHE_VAL(ac_cv_jasper, +[ +kde_save_LIBS="$LIBS" +LIBS="$LIBS $all_libraries $USER_LDFLAGS -ljasper $LIBJPEG -lm" +kde_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" + +AC_TRY_LINK(dnl + [ + #include + ], + [ + return( jas_init() ); + ], + eval "ac_cv_jasper='-ljasper $LIBJPEG -lm'", + eval "ac_cv_jasper=no" +) +LIBS="$kde_save_LIBS" +CFLAGS="$kde_save_CFLAGS" +])dnl +if eval "test ! \"`echo $ac_cv_jasper`\" = no"; then + AC_DEFINE_UNQUOTED(HAVE_JASPER, 1, [Define if you have jasper]) + LIB_JASPER="$ac_cv_jasper" + AC_MSG_RESULT($ac_cv_jasper) +else + AC_MSG_RESULT(no) + LIB_JASPER="" +fi +AC_SUBST(LIB_JASPER) +]) + +AC_DEFUN([AC_CHECK_BOOL], +[ + AC_DEFINE_UNQUOTED(HAVE_BOOL, 1, [You _must_ have bool]) +]) + +AC_DEFUN([AC_CHECK_GNU_EXTENSIONS], +[ +AC_MSG_CHECKING(if you need GNU extensions) +AC_CACHE_VAL(ac_cv_gnu_extensions, +[ +cat > conftest.c << EOF +#include + +#ifdef __GNU_LIBRARY__ +yes +#endif +EOF + +if (eval "$ac_cpp conftest.c") 2>&5 | + egrep "yes" >/dev/null 2>&1; then + rm -rf conftest* + ac_cv_gnu_extensions=yes +else + ac_cv_gnu_extensions=no +fi +]) + +AC_MSG_RESULT($ac_cv_gnu_extensions) +if test "$ac_cv_gnu_extensions" = "yes"; then + AC_DEFINE_UNQUOTED(_GNU_SOURCE, 1, [Define if you need to use the GNU extensions]) +fi +]) + +AC_DEFUN([KDE_CHECK_COMPILER_FLAG], +[ +AC_MSG_CHECKING([whether $CXX supports -$1]) +kde_cache=`echo $1 | sed 'y% .=/+-,%____p__%'` +AC_CACHE_VAL(kde_cv_prog_cxx_$kde_cache, +[ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + save_CXXFLAGS="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS -$1" + AC_TRY_LINK([],[ return 0; ], [eval "kde_cv_prog_cxx_$kde_cache=yes"], []) + CXXFLAGS="$save_CXXFLAGS" + AC_LANG_RESTORE +]) +if eval "test \"`echo '$kde_cv_prog_cxx_'$kde_cache`\" = yes"; then + AC_MSG_RESULT(yes) + : + $2 +else + AC_MSG_RESULT(no) + : + $3 +fi +]) + +AC_DEFUN([KDE_CHECK_C_COMPILER_FLAG], +[ +AC_MSG_CHECKING([whether $CC supports -$1]) +kde_cache=`echo $1 | sed 'y% .=/+-,%____p__%'` +AC_CACHE_VAL(kde_cv_prog_cc_$kde_cache, +[ + AC_LANG_SAVE + AC_LANG_C + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -$1" + AC_TRY_LINK([],[ return 0; ], [eval "kde_cv_prog_cc_$kde_cache=yes"], []) + CFLAGS="$save_CFLAGS" + AC_LANG_RESTORE +]) +if eval "test \"`echo '$kde_cv_prog_cc_'$kde_cache`\" = yes"; then + AC_MSG_RESULT(yes) + : + $2 +else + AC_MSG_RESULT(no) + : + $3 +fi +]) + + +dnl AC_REMOVE_FORBIDDEN removes forbidden arguments from variables +dnl use: AC_REMOVE_FORBIDDEN(CC, [-forbid -bad-option whatever]) +dnl it's all white-space separated +AC_DEFUN([AC_REMOVE_FORBIDDEN], +[ __val=$$1 + __forbid=" $2 " + if test -n "$__val"; then + __new="" + ac_save_IFS=$IFS + IFS=" " + for i in $__val; do + case "$__forbid" in + *" $i "*) AC_MSG_WARN([found forbidden $i in $1, removing it]) ;; + *) # Careful to not add spaces, where there were none, because otherwise + # libtool gets confused, if we change e.g. CXX + if test -z "$__new" ; then __new=$i ; else __new="$__new $i" ; fi ;; + esac + done + IFS=$ac_save_IFS + $1=$__new + fi +]) + + +AC_DEFUN([KDE_CHECK_FOR_BAD_COMPILER], +[ + AC_MSG_CHECKING([whether $CC is blacklisted]) + + dnl In theory we have tu run this test against $CC and $CXX + dnl in C and in C++ mode, because its perfectly legal for + dnl the user to mix compiler versions, since C has a defined + dnl ABI. + dnl + dnl For now, we assume the user is not on crack. + + AC_TRY_COMPILE([ +#ifdef __GNUC__ +#if __GNUC__ == 4 && __GNUC_MINOR__ == 0 && __GNUC_PATCHLEVEL__ == 0 +choke me +#endif +#endif +], , + kde_bad_compiler=no, + kde_bad_compiler=yes +) + + AC_MSG_RESULT($kde_bad_compiler) + +if test "$kde_bad_compiler" = "yes"; then + AC_MSG_ERROR([ + +This particular compiler version is blacklisted because it +is known to miscompile KDE. Please use a newer version, or +if that is not yet available, choose an older version. + +Please do not report a bug or bother us reporting this +configure error. We know about it, and we introduced +it by intention to avoid untraceable bugs or crashes in KDE. + +]) +fi + +]) + + +AC_DEFUN([KDE_CHECK_FOR_OPT_NOINLINE_MATCH], +[ + AC_CACHE_CHECK([whether system headers can cope with -O2 -fno-inline], + kde_cv_opt_noinline_match, + [ + kde_cv_opt_noinline_match=irrelevant + dnl if we don't use both -O2 and -fno-inline, this check is moot + if echo "$CFLAGS" | grep -e -O2 >/dev/null 2>/dev/null \ + && echo "$CFLAGS" | grep -e -fno-inline >/dev/null 2>/dev/null ; then + + ac_cflags_save="$CFLAGS" + CFLAGS="$CFLAGS -D_USE_GNU" + + AC_TRY_LINK([ + #include +], [ const char *pt, *et; + et = __extension__ ({ char __a0, __a1, __a2; (__builtin_constant_p ( ";," ) && ((size_t)(const void *)(( ";," )+ 1) - (size_t)(const void *)( ";," ) == 1) ? ((__a0 =((__const char *) ( ";," ))[0], __a0 == '\0') ? ((void) ( pt ),((void *)0) ) : ((__a1 = ((__const char *) ( ";," ))[1], __a1== '\0') ? (__extension__ (__builtin_constant_p ( __a0 ) && ( __a0 ) == '\0' ? (char *) __rawmemchr ( pt , __a0) : strchr( pt , __a0 ))) : ((__a2 = ((__const char *) ( ";," ))[2], __a2 == '\0') ? __strpbrk_c2 ( pt , __a0, __a1) :(((__const char *) ( ";," ))[3] == '\0' ? __strpbrk_c3 ( pt ,__a0, __a1, __a2): strpbrk ( pt , ";," ))))) : strpbrk ( pt , ";," )); }) ; +], + kde_cv_opt_noinline_match=yes, + kde_cv_opt_noinline_match=no + ) + + CFLAGS="$ac_cflags_save" + fi + ]) +]) + + +dnl AC_VALIDIFY_CXXFLAGS checks for forbidden flags the user may have given +AC_DEFUN([AC_VALIDIFY_CXXFLAGS], +[dnl +if test "x$kde_use_qt_emb" != "xyes"; then + AC_REMOVE_FORBIDDEN(CXX, [-fno-rtti -rpath]) + AC_REMOVE_FORBIDDEN(CXXFLAGS, [-fno-rtti -rpath]) +else + AC_REMOVE_FORBIDDEN(CXX, [-rpath]) + AC_REMOVE_FORBIDDEN(CXXFLAGS, [-rpath]) +fi +]) + +AC_DEFUN([AC_CHECK_COMPILERS], +[ + AC_ARG_ENABLE(debug, + AC_HELP_STRING([--enable-debug=ARG],[enables debug symbols (yes|no|full) [default=no]]), + [ + case $enableval in + yes) + kde_use_debug_code="yes" + kde_use_debug_define=no + ;; + full) + kde_use_debug_code="full" + kde_use_debug_define=no + ;; + *) + kde_use_debug_code="no" + kde_use_debug_define=yes + ;; + esac + ], + [kde_use_debug_code="no" + kde_use_debug_define=no + ]) + + dnl Just for configure --help + AC_ARG_ENABLE(dummyoption, + AC_HELP_STRING([--disable-debug], + [disables debug output and debug symbols [default=no]]), + [],[]) + + AC_ARG_ENABLE(strict, + AC_HELP_STRING([--enable-strict], + [compiles with strict compiler options (may not work!)]), + [ + if test $enableval = "no"; then + kde_use_strict_options="no" + else + kde_use_strict_options="yes" + fi + ], [kde_use_strict_options="no"]) + + AC_ARG_ENABLE(warnings,AC_HELP_STRING([--disable-warnings],[disables compilation with -Wall and similar]), + [ + if test $enableval = "no"; then + kde_use_warnings="no" + else + kde_use_warnings="yes" + fi + ], [kde_use_warnings="yes"]) + + dnl enable warnings for debug build + if test "$kde_use_debug_code" != "no"; then + kde_use_warnings=yes + fi + + AC_ARG_ENABLE(profile,AC_HELP_STRING([--enable-profile],[creates profiling infos [default=no]]), + [kde_use_profiling=$enableval], + [kde_use_profiling="no"] + ) + + dnl this prevents stupid AC_PROG_CC to add "-g" to the default CFLAGS + CFLAGS=" $CFLAGS" + + AC_PROG_CC + + AC_PROG_CPP + + if test "$GCC" = "yes"; then + if test "$kde_use_debug_code" != "no"; then + if test $kde_use_debug_code = "full"; then + CFLAGS="-g3 -fno-inline $CFLAGS" + else + CFLAGS="-g -O2 -fno-schedule-insns -fno-inline $CFLAGS" + fi + else + CFLAGS="-O2 $CFLAGS" + fi + fi + + if test "$kde_use_debug_define" = "yes"; then + CFLAGS="-DNDEBUG $CFLAGS" + fi + + + case "$host" in + *-*-sysv4.2uw*) CFLAGS="-D_UNIXWARE $CFLAGS";; + *-*-sysv5uw7*) CFLAGS="-D_UNIXWARE7 $CFLAGS";; + esac + + if test -z "$LDFLAGS" && test "$kde_use_debug_code" = "no" && test "$GCC" = "yes"; then + LDFLAGS="" + fi + + CXXFLAGS=" $CXXFLAGS" + + AC_PROG_CXX + + KDE_CHECK_FOR_BAD_COMPILER + + if test "$GXX" = "yes" || test "$CXX" = "KCC"; then + if test "$kde_use_debug_code" != "no"; then + if test "$CXX" = "KCC"; then + CXXFLAGS="+K0 -Wall -pedantic -W -Wpointer-arith -Wwrite-strings $CXXFLAGS" + else + if test "$kde_use_debug_code" = "full"; then + CXXFLAGS="-g3 -fno-inline $CXXFLAGS" + else + CXXFLAGS="-g -O2 -fno-schedule-insns -fno-inline $CXXFLAGS" + fi + fi + KDE_CHECK_COMPILER_FLAG(fno-builtin,[CXXFLAGS="-fno-builtin $CXXFLAGS"]) + + dnl convenience compiler flags + KDE_CHECK_COMPILER_FLAG(Woverloaded-virtual, [WOVERLOADED_VIRTUAL="-Woverloaded-virtual"], [WOVERLOADED_VRITUAL=""]) + AC_SUBST(WOVERLOADED_VIRTUAL) + else + if test "$CXX" = "KCC"; then + CXXFLAGS="+K3 $CXXFLAGS" + else + CXXFLAGS="-O2 $CXXFLAGS" + fi + fi + fi + + if test "$kde_use_debug_define" = "yes"; then + CXXFLAGS="-DNDEBUG -DNO_DEBUG $CXXFLAGS" + fi + + if test "$kde_use_profiling" = "yes"; then + KDE_CHECK_COMPILER_FLAG(pg, + [ + CFLAGS="-pg $CFLAGS" + CXXFLAGS="-pg $CXXFLAGS" + ]) + fi + + if test "$kde_use_warnings" = "yes"; then + if test "$GCC" = "yes"; then + CXXFLAGS="-Wall -W -Wpointer-arith $CXXFLAGS" + case $host in + *-*-linux-gnu) + CFLAGS="-std=iso9899:1990 -W -Wall -Wchar-subscripts -Wshadow -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -D_XOPEN_SOURCE=500 -D_BSD_SOURCE $CFLAGS" + CXXFLAGS="-ansi -D_XOPEN_SOURCE=500 -D_BSD_SOURCE -Wcast-align -Wconversion -Wchar-subscripts $CXXFLAGS" + KDE_CHECK_COMPILER_FLAG(Wmissing-format-attribute, [CXXFLAGS="$CXXFLAGS -Wformat-security -Wmissing-format-attribute"]) + KDE_CHECK_C_COMPILER_FLAG(Wmissing-format-attribute, [CFLAGS="$CFLAGS -Wformat-security -Wmissing-format-attribute"]) + ;; + esac + KDE_CHECK_COMPILER_FLAG(Wundef,[CXXFLAGS="-Wundef $CXXFLAGS"]) + KDE_CHECK_COMPILER_FLAG(Wno-long-long,[CXXFLAGS="-Wno-long-long $CXXFLAGS"]) + dnl ### FIXME: revert for KDE 4 + KDE_CHECK_COMPILER_FLAG(Wno-non-virtual-dtor,[CXXFLAGS="$CXXFLAGS -Wno-non-virtual-dtor"]) + fi + fi + + if test "$GXX" = "yes" && test "$kde_use_strict_options" = "yes"; then + CXXFLAGS="-Wcast-qual -Wshadow -Wcast-align $CXXFLAGS" + fi + + AC_ARG_ENABLE(pch, + AC_HELP_STRING([--enable-pch], + [enables precompiled header support (currently only KCC or gcc >=3.4+unsermake) [default=no]]), + [ kde_use_pch=$enableval ],[ kde_use_pch=no ]) + + HAVE_GCC_VISIBILITY=0 + AC_SUBST([HAVE_GCC_VISIBILITY]) + + if test "$GXX" = "yes"; then + gcc_no_reorder_blocks=NO + KDE_CHECK_COMPILER_FLAG(fno-reorder-blocks,[gcc_no_reorder_blocks=YES]) + if test $kde_use_debug_code != "no" && \ + test $kde_use_debug_code != "full" && \ + test "YES" = "$gcc_no_reorder_blocks" ; then + CXXFLAGS="$CXXFLAGS -fno-reorder-blocks" + CFLAGS="$CFLAGS -fno-reorder-blocks" + fi + KDE_CHECK_COMPILER_FLAG(fno-exceptions,[CXXFLAGS="$CXXFLAGS -fno-exceptions"]) + KDE_CHECK_COMPILER_FLAG(fno-check-new, [CXXFLAGS="$CXXFLAGS -fno-check-new"]) + KDE_CHECK_COMPILER_FLAG(fno-common, [CXXFLAGS="$CXXFLAGS -fno-common"]) + KDE_CHECK_COMPILER_FLAG(fexceptions, [USE_EXCEPTIONS="-fexceptions"], USE_EXCEPTIONS= ) + ENABLE_PERMISSIVE_FLAG="-fpermissive" + + if test "$kde_use_pch" = "yes"; then + AC_MSG_CHECKING(whether gcc supports precompiling c header files) + echo >conftest.h + if $CC -x c-header conftest.h >/dev/null 2>/dev/null; then + kde_gcc_supports_pch=yes + AC_MSG_RESULT(yes) + else + kde_gcc_supports_pch=no + AC_MSG_RESULT(no) + fi + if test "$kde_gcc_supports_pch" = "yes"; then + AC_MSG_CHECKING(whether gcc supports precompiling c++ header files) + if $CXX -x c++-header conftest.h >/dev/null 2>/dev/null; then + kde_gcc_supports_pch=yes + AC_MSG_RESULT(yes) + else + kde_gcc_supports_pch=no + AC_MSG_RESULT(no) + fi + fi + rm -f conftest.h conftest.h.gch + fi + + KDE_CHECK_FOR_OPT_NOINLINE_MATCH + if test "x$kde_cv_opt_noinline_match" = "xno" ; then + CFLAGS="`echo "$CFLAGS" | sed "s/ -fno-inline//"`" + fi + fi + AM_CONDITIONAL(unsermake_enable_pch, test "$kde_use_pch" = "yes" && test "$kde_gcc_supports_pch" = "yes") + if test "$CXX" = "KCC"; then + dnl unfortunately we currently cannot disable exception support in KCC + dnl because doing so is binary incompatible and Qt by default links with exceptions :-( + dnl KDE_CHECK_COMPILER_FLAG(-no_exceptions,[CXXFLAGS="$CXXFLAGS --no_exceptions"]) + dnl KDE_CHECK_COMPILER_FLAG(-exceptions, [USE_EXCEPTIONS="--exceptions"], USE_EXCEPTIONS= ) + + if test "$kde_use_pch" = "yes"; then + dnl TODO: support --pch-dir! + KDE_CHECK_COMPILER_FLAG(-pch,[CXXFLAGS="$CXXFLAGS --pch"]) + dnl the below works (but the dir must exist), but it's + dnl useless for a whole package. + dnl The are precompiled headers for each source file, so when compiling + dnl from scratch, it doesn't make a difference, and they take up + dnl around ~5Mb _per_ sourcefile. + dnl KDE_CHECK_COMPILER_FLAG(-pch_dir /tmp, + dnl [CXXFLAGS="$CXXFLAGS --pch_dir `pwd`/pcheaders"]) + fi + dnl this flag controls inlining. by default KCC inlines in optimisation mode + dnl all implementations that are defined inside the class {} declaration. + dnl because of templates-compatibility with broken gcc compilers, this + dnl can cause excessive inlining. This flag limits it to a sane level + KDE_CHECK_COMPILER_FLAG(-inline_keyword_space_time=6,[CXXFLAGS="$CXXFLAGS --inline_keyword_space_time=6"]) + KDE_CHECK_COMPILER_FLAG(-inline_auto_space_time=2,[CXXFLAGS="$CXXFLAGS --inline_auto_space_time=2"]) + KDE_CHECK_COMPILER_FLAG(-inline_implicit_space_time=2.0,[CXXFLAGS="$CXXFLAGS --inline_implicit_space_time=2.0"]) + KDE_CHECK_COMPILER_FLAG(-inline_generated_space_time=2.0,[CXXFLAGS="$CXXFLAGS --inline_generated_space_time=2.0"]) + dnl Some source files are shared between multiple executables + dnl (or libraries) and some of those need template instantiations. + dnl In that case KCC needs to compile those sources with + dnl --one_instantiation_per_object. To make it easy for us we compile + dnl _all_ objects with that flag (--one_per is a shorthand). + KDE_CHECK_COMPILER_FLAG(-one_per, [CXXFLAGS="$CXXFLAGS --one_per"]) + fi + AC_SUBST(USE_EXCEPTIONS) + dnl obsolete macro - provided to keep things going + USE_RTTI= + AC_SUBST(USE_RTTI) + + case "$host" in + *-*-irix*) test "$GXX" = yes && CXXFLAGS="-D_LANGUAGE_C_PLUS_PLUS -D__LANGUAGE_C_PLUS_PLUS $CXXFLAGS" ;; + *-*-sysv4.2uw*) CXXFLAGS="-D_UNIXWARE $CXXFLAGS";; + *-*-sysv5uw7*) CXXFLAGS="-D_UNIXWARE7 $CXXFLAGS";; + *-*-solaris*) + if test "$GXX" = yes; then + libstdcpp=`$CXX -print-file-name=libstdc++.so` + if test ! -f $libstdcpp; then + AC_MSG_ERROR([You've compiled gcc without --enable-shared. This doesn't work with KDE. Please recompile gcc with --enable-shared to receive a libstdc++.so]) + fi + fi + ;; + esac + + AC_VALIDIFY_CXXFLAGS + + AC_PROG_CXXCPP + + if test "$GCC" = yes; then + NOOPT_CFLAGS=-O0 + fi + KDE_CHECK_COMPILER_FLAG(O0,[NOOPT_CXXFLAGS=-O0]) + + AC_ARG_ENABLE(coverage, + AC_HELP_STRING([--enable-coverage],[use gcc coverage testing]), [ + if test "$am_cv_CC_dependencies_compiler_type" = "gcc3"; then + ac_coverage_compiler="-fprofile-arcs -ftest-coverage" + ac_coverage_linker="-lgcc" + elif test "$am_cv_CC_dependencies_compiler_type" = "gcc"; then + ac_coverage_compiler="-fprofile-arcs -ftest-coverage" + ac_coverage_linker="" + else + AC_MSG_ERROR([coverage with your compiler is not supported]) + fi + CFLAGS="$CFLAGS $ac_coverage_compiler" + CXXFLAGS="$CXXFLAGS $ac_coverage_compiler" + LDFLAGS="$LDFLAGS $ac_coverage_linker" + ]) + + AC_SUBST(NOOPT_CXXFLAGS) + AC_SUBST(NOOPT_CFLAGS) + AC_SUBST(ENABLE_PERMISSIVE_FLAG) + + KDE_CHECK_NEW_LDFLAGS + KDE_CHECK_FINAL + KDE_CHECK_CLOSURE + KDE_CHECK_NMCHECK + + ifdef([AM_DEPENDENCIES], AC_REQUIRE([KDE_ADD_DEPENDENCIES]), []) +]) + +AC_DEFUN([KDE_CHECK_VISIBILITY_GCC_BUG], + [ + AC_CACHE_CHECK([for gcc -fvisibility-inlines-hidden bug], kde_cv_val_gcc_visibility_bug, + [ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + + safe_CXXFLAGS=$CXXFLAGS + safe_LDFLAGS=$LDFLAGS + CXXFLAGS="$CXXFLAGS -fPIC -fvisibility-inlines-hidden -O0" + LDFLAGS="$LDFLAGS -shared -fPIC" + + AC_TRY_LINK( + [ + /* http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19664 */ + #include + int some_function( void ) __attribute__ ((visibility("default"))); + int some_function( void ) + { + std::string s("blafasel"); + return 0; + } + ], [/* elvis is alive */], + kde_cv_val_gcc_visibility_bug=no, kde_cv_val_gcc_visibility_bug=yes) + + CXXFLAGS=$safe_CXXFLAGS + LDFLAGS=$safe_LDFLAGS + AC_LANG_RESTORE + ] + ) + + if test x$kde_cv_val_gcc_visibility_bug = xno; then + CXXFLAGS="$CXXFLAGS -fvisibility-inlines-hidden" + fi + ] +) + +AC_DEFUN([KDE_ENABLE_HIDDEN_VISIBILITY], +[ + AC_BEFORE([AC_PATH_QT_1_3], [KDE_ENABLE_HIDDEN_VISIBILITY]) + + AC_MSG_CHECKING([grepping for visibility push/pop in headers]) + + if test "x$GXX" = "xyes"; then + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_EGREP_CPP( + [GCC visibility push], + [ #include + ], + [ + AC_MSG_RESULT(yes) + kde_stdc_visibility_patched=yes ], + [ + AC_MSG_RESULT(no) + AC_MSG_WARN([Your libstdc++ doesn't appear to be patched for + visibility support. Disabling -fvisibility=hidden]) + + kde_stdc_visibility_patched=no ]) + + AC_LANG_RESTORE + + kde_have_gcc_visibility=no + KDE_CHECK_COMPILER_FLAG(fvisibility=hidden, + [ + kde_have_gcc_visibility=yes + dnl the whole toolchain is just a mess, gcc is just too buggy + dnl to handle STL with visibility enabled. Lets reconsider + dnl when gcc 4.2 is out or when things get fixed in the compiler. + dnl Contact mueller@kde.org for details. + AC_ARG_ENABLE(gcc-hidden-visibility, + AC_HELP_STRING([--enable-gcc-hidden-visibility],[toolchain hidden visibility [default=no]]), + [kde_have_gcc_visibility=$enableval], + [kde_have_gcc_visibility=no]) + + AC_CACHE_CHECK([if Qt is patched for -fvisibility], kde_cv_val_qt_gcc_visibility_patched, + [ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + + safe_CXXFLAGS=$CXXFLAGS + CXXFLAGS="$CXXFLAGS $all_includes" + + AC_TRY_COMPILE( + [ +#include +#if Q_EXPORT - 0 != 0 +/* if this compiles, then Q_EXPORT is undefined */ +/* if Q_EXPORT is nonempty, this will break compilation */ +#endif + ], [/* elvis is alive */], + kde_cv_val_qt_gcc_visibility_patched=no, kde_cv_val_qt_gcc_visibility_patched=yes) + + CXXFLAGS=$safe_CXXFLAGS + AC_LANG_RESTORE + ] + ) + + if test x$kde_have_gcc_visibility = "xyes" && test x$kde_stdc_visibility_patched = "xyes" && test x$kde_cv_val_qt_gcc_visibility_patched = "xyes"; then + CXXFLAGS="$CXXFLAGS -fvisibility=hidden" + KDE_CHECK_VISIBILITY_GCC_BUG + HAVE_GCC_VISIBILITY=1 + AC_DEFINE_UNQUOTED(__KDE_HAVE_GCC_VISIBILITY, "$HAVE_GCC_VISIBILITY", [define to 1 if -fvisibility is supported]) + fi + ]) + fi +]) + +AC_DEFUN([KDE_ADD_DEPENDENCIES], +[ + [A]M_DEPENDENCIES(CC) + [A]M_DEPENDENCIES(CXX) +]) + +dnl just a wrapper to clean up configure.in +AC_DEFUN([KDE_PROG_LIBTOOL], +[ +AC_REQUIRE([AC_CHECK_COMPILERS]) +AC_REQUIRE([AC_ENABLE_SHARED]) +AC_REQUIRE([AC_ENABLE_STATIC]) + +AC_REQUIRE([AC_LIBTOOL_DLOPEN]) +AC_REQUIRE([KDE_CHECK_LIB64]) + +AC_OBJEXT +AC_EXEEXT + +AM_PROG_LIBTOOL +AC_LIBTOOL_CXX + +LIBTOOL_SHELL="/bin/sh ./libtool" +# LIBTOOL="$LIBTOOL --silent" +KDE_PLUGIN="-avoid-version -module -no-undefined \$(KDE_NO_UNDEFINED) \$(KDE_RPATH) \$(KDE_MT_LDFLAGS)" +AC_SUBST(KDE_PLUGIN) + +# This hack ensures that libtool creates shared libs for kunittest plugins. By default check_LTLIBRARIES makes static libs. +KDE_CHECK_PLUGIN="\$(KDE_PLUGIN) -rpath \$(libdir)" +AC_SUBST(KDE_CHECK_PLUGIN) + +# we patch configure quite some so we better keep that consistent for incremental runs +AC_SUBST(AUTOCONF,'$(SHELL) $(top_srcdir)/admin/cvs.sh configure || touch configure') +]) + +AC_DEFUN([KDE_CHECK_LIB64], +[ + kdelibsuff="$kde_libs_suffix" + if test -z "$kdelibsuff"; then + kdelibsuff="no" + fi + AC_ARG_ENABLE(libsuffix, + AC_HELP_STRING([--enable-libsuffix], + [/lib directory suffix (64,32,none,auto[=default])]), + kdelibsuff=$enableval) + + if test "$kdelibsuff" = "auto"; then + +cat > conftest.c << EOF +#include +int main() { + return 0; +} +EOF + kdelibsuff=`$CC conftest.c -o conftest.out; ldd conftest.out |sed -ne '/libc.so/{ + s,.*/lib\([[^\/]]*\)/.*,\1, + p +}'` + rm -rf conftest.* + fi + + if test "$kdelibsuff" = "no" || "$kdelibsuff" = "none"; then + kdelibsuff= + fi + if test -z "$kdelibsuff"; then + AC_MSG_RESULT([not using lib directory suffix]) + AC_DEFINE(KDELIBSUFF, [""], Suffix for lib directories) + else + if test "$libdir" = '${exec_prefix}/lib'; then + libdir="$libdir${kdelibsuff}" + AC_SUBST([libdir], ["$libdir"]) dnl ugly hack for lib64 platforms + fi + AC_DEFINE_UNQUOTED(KDELIBSUFF, ["${kdelibsuff}"], Suffix for lib directories) + AC_MSG_RESULT([using lib directory suffix $kdelibsuff]) + fi +]) + +AC_DEFUN([KDE_CHECK_TYPES], +[ AC_CHECK_SIZEOF(int, 4)dnl + AC_CHECK_SIZEOF(short)dnl + AC_CHECK_SIZEOF(long, 4)dnl + AC_CHECK_SIZEOF(char *, 4)dnl +])dnl + +dnl Not used - kept for compat only? +AC_DEFUN([KDE_DO_IT_ALL], +[ +AC_CANONICAL_SYSTEM +AC_ARG_PROGRAM +AM_INIT_AUTOMAKE($1, $2) +AM_DISABLE_LIBRARIES +AC_PREFIX_DEFAULT(${KDEDIR:-/usr/local/kde}) +AC_CHECK_COMPILERS +KDE_PROG_LIBTOOL +AM_KDE_WITH_NLS +AC_PATH_KDE +]) + +AC_DEFUN([AC_CHECK_RPATH], +[ +AC_MSG_CHECKING(for rpath) +AC_ARG_ENABLE(rpath, + AC_HELP_STRING([--disable-rpath],[do not use the rpath feature of ld]), + USE_RPATH=$enableval, USE_RPATH=yes) + +if test -z "$KDE_RPATH" && test "$USE_RPATH" = "yes"; then + + KDE_RPATH="-R \$(libdir)" + + if test "$kde_libraries" != "$libdir"; then + KDE_RPATH="$KDE_RPATH -R \$(kde_libraries)" + fi + + if test -n "$qt_libraries"; then + KDE_RPATH="$KDE_RPATH -R \$(qt_libraries)" + fi + dnl $x_libraries is set to /usr/lib in case + if test -n "$X_LDFLAGS"; then + X_RPATH="-R \$(x_libraries)" + KDE_RPATH="$KDE_RPATH $X_RPATH" + fi + if test -n "$KDE_EXTRA_RPATH"; then + KDE_RPATH="$KDE_RPATH \$(KDE_EXTRA_RPATH)" + fi +fi +AC_SUBST(KDE_EXTRA_RPATH) +AC_SUBST(KDE_RPATH) +AC_SUBST(X_RPATH) +AC_MSG_RESULT($USE_RPATH) +]) + +dnl Check for the type of the third argument of getsockname +AC_DEFUN([AC_CHECK_SOCKLEN_T], +[ + AC_MSG_CHECKING(for socklen_t) + AC_CACHE_VAL(kde_cv_socklen_t, + [ + AC_LANG_PUSH(C++) + kde_cv_socklen_t=no + AC_TRY_COMPILE([ + #include + #include + ], + [ + socklen_t len; + getpeername(0,0,&len); + ], + [ + kde_cv_socklen_t=yes + kde_cv_socklen_t_equiv=socklen_t + ]) + AC_LANG_POP(C++) + ]) + AC_MSG_RESULT($kde_cv_socklen_t) + if test $kde_cv_socklen_t = no; then + AC_MSG_CHECKING([for socklen_t equivalent for socket functions]) + AC_CACHE_VAL(kde_cv_socklen_t_equiv, + [ + kde_cv_socklen_t_equiv=int + AC_LANG_PUSH(C++) + for t in int size_t unsigned long "unsigned long"; do + AC_TRY_COMPILE([ + #include + #include + ], + [ + $t len; + getpeername(0,0,&len); + ], + [ + kde_cv_socklen_t_equiv="$t" + break + ]) + done + AC_LANG_POP(C++) + ]) + AC_MSG_RESULT($kde_cv_socklen_t_equiv) + fi + AC_DEFINE_UNQUOTED(kde_socklen_t, $kde_cv_socklen_t_equiv, + [type to use in place of socklen_t if not defined]) + AC_DEFINE_UNQUOTED(ksize_t, $kde_cv_socklen_t_equiv, + [type to use in place of socklen_t if not defined (deprecated, use kde_socklen_t)]) +]) + +dnl This is a merge of some macros out of the gettext aclocal.m4 +dnl since we don't need anything, I took the things we need +dnl the copyright for them is: +dnl > +dnl Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc. +dnl This Makefile.in is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl This program is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without +dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A +dnl PARTICULAR PURPOSE. +dnl > +dnl for this file it is relicensed under LGPL + +AC_DEFUN([AM_KDE_WITH_NLS], + [ + dnl If we use NLS figure out what method + + AM_PATH_PROG_WITH_TEST_KDE(MSGFMT, msgfmt, + [test -n "`$ac_dir/$ac_word --version 2>&1 | grep 'GNU gettext'`"], msgfmt) + AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) + + if test -z "`$GMSGFMT --version 2>&1 | grep 'GNU gettext'`"; then + AC_MSG_RESULT([found msgfmt program is not GNU msgfmt; ignore it]) + GMSGFMT=":" + fi + MSGFMT=$GMSGFMT + AC_SUBST(GMSGFMT) + AC_SUBST(MSGFMT) + + AM_PATH_PROG_WITH_TEST_KDE(XGETTEXT, xgettext, + [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) + + dnl Test whether we really found GNU xgettext. + if test "$XGETTEXT" != ":"; then + dnl If it is no GNU xgettext we define it as : so that the + dnl Makefiles still can work. + if $XGETTEXT --omit-header /dev/null 2> /dev/null; then + : ; + else + AC_MSG_RESULT( + [found xgettext programs is not GNU xgettext; ignore it]) + XGETTEXT=":" + fi + fi + AC_SUBST(XGETTEXT) + + ]) + +# Search path for a program which passes the given test. +# Ulrich Drepper , 1996. + +# serial 1 +# Stephan Kulow: I appended a _KDE against name conflicts + +dnl AM_PATH_PROG_WITH_TEST_KDE(VARIABLE, PROG-TO-CHECK-FOR, +dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) +AC_DEFUN([AM_PATH_PROG_WITH_TEST_KDE], +[# Extract the first word of "$2", so it can be a program name with args. +set dummy $2; ac_word=[$]2 +AC_MSG_CHECKING([for $ac_word]) +AC_CACHE_VAL(ac_cv_path_$1, +[case "[$]$1" in + /*) + ac_cv_path_$1="[$]$1" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in ifelse([$5], , $PATH, [$5]); do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if [$3]; then + ac_cv_path_$1="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" +dnl If no 4th arg is given, leave the cache variable unset, +dnl so AC_PATH_PROGS will keep looking. +ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" +])dnl + ;; +esac])dnl +$1="$ac_cv_path_$1" +if test -n "[$]$1"; then + AC_MSG_RESULT([$]$1) +else + AC_MSG_RESULT(no) +fi +AC_SUBST($1)dnl +]) + + +# Check whether LC_MESSAGES is available in . +# Ulrich Drepper , 1995. + +# serial 1 + +AC_DEFUN([AM_LC_MESSAGES], + [if test $ac_cv_header_locale_h = yes; then + AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, + [AC_TRY_LINK([#include ], [return LC_MESSAGES], + am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) + if test $am_cv_val_LC_MESSAGES = yes; then + AC_DEFINE(HAVE_LC_MESSAGES, 1, [Define if your locale.h file contains LC_MESSAGES]) + fi + fi]) + +dnl From Jim Meyering. +dnl FIXME: migrate into libit. + +AC_DEFUN([AM_FUNC_OBSTACK], +[AC_CACHE_CHECK([for obstacks], am_cv_func_obstack, + [AC_TRY_LINK([#include "obstack.h"], + [struct obstack *mem;obstack_free(mem,(char *) 0)], + am_cv_func_obstack=yes, + am_cv_func_obstack=no)]) + if test $am_cv_func_obstack = yes; then + AC_DEFINE(HAVE_OBSTACK) + else + LIBOBJS="$LIBOBJS obstack.o" + fi +]) + +dnl From Jim Meyering. Use this if you use the GNU error.[ch]. +dnl FIXME: Migrate into libit + +AC_DEFUN([AM_FUNC_ERROR_AT_LINE], +[AC_CACHE_CHECK([for error_at_line], am_cv_lib_error_at_line, + [AC_TRY_LINK([],[error_at_line(0, 0, "", 0, "");], + am_cv_lib_error_at_line=yes, + am_cv_lib_error_at_line=no)]) + if test $am_cv_lib_error_at_line = no; then + LIBOBJS="$LIBOBJS error.o" + fi + AC_SUBST(LIBOBJS)dnl +]) + +# Macro to add for using GNU gettext. +# Ulrich Drepper , 1995. + +# serial 1 +# Stephan Kulow: I put a KDE in it to avoid name conflicts + +AC_DEFUN([AM_KDE_GNU_GETTEXT], + [AC_REQUIRE([AC_PROG_MAKE_SET])dnl + AC_REQUIRE([AC_PROG_RANLIB])dnl + AC_REQUIRE([AC_HEADER_STDC])dnl + AC_REQUIRE([AC_TYPE_OFF_T])dnl + AC_REQUIRE([AC_TYPE_SIZE_T])dnl + AC_REQUIRE([AC_FUNC_ALLOCA])dnl + AC_REQUIRE([AC_FUNC_MMAP])dnl + AC_REQUIRE([AM_KDE_WITH_NLS])dnl + AC_CHECK_HEADERS([limits.h locale.h nl_types.h string.h values.h alloca.h]) + AC_CHECK_FUNCS([getcwd munmap putenv setlocale strchr strcasecmp \ +__argz_count __argz_stringify __argz_next]) + + AC_MSG_CHECKING(for stpcpy) + AC_CACHE_VAL(kde_cv_func_stpcpy, + [ + kde_safe_cxxflags=$CXXFLAGS + CXXFLAGS="-Werror" + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE([ + #include + ], + [ + char buffer[200]; + stpcpy(buffer, buffer); + ], + kde_cv_func_stpcpy=yes, + kde_cv_func_stpcpy=no) + AC_LANG_RESTORE + CXXFLAGS=$kde_safe_cxxflags + ]) + AC_MSG_RESULT($kde_cv_func_stpcpy) + if eval "test \"`echo $kde_cv_func_stpcpy`\" = yes"; then + AC_DEFINE(HAVE_STPCPY, 1, [Define if you have stpcpy]) + fi + + AM_LC_MESSAGES + + if test "x$CATOBJEXT" != "x"; then + if test "x$ALL_LINGUAS" = "x"; then + LINGUAS= + else + AC_MSG_CHECKING(for catalogs to be installed) + NEW_LINGUAS= + for lang in ${LINGUAS=$ALL_LINGUAS}; do + case "$ALL_LINGUAS" in + *$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;; + esac + done + LINGUAS=$NEW_LINGUAS + AC_MSG_RESULT($LINGUAS) + fi + + dnl Construct list of names of catalog files to be constructed. + if test -n "$LINGUAS"; then + for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done + fi + fi + + ]) + +AC_DEFUN([AC_HAVE_XPM], + [AC_REQUIRE_CPP()dnl + AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + + test -z "$XPM_LDFLAGS" && XPM_LDFLAGS= + test -z "$XPM_INCLUDE" && XPM_INCLUDE= + + AC_ARG_WITH(xpm,AC_HELP_STRING([--without-xpm],[disable color pixmap XPM tests]), + xpm_test=$withval, xpm_test="yes") + if test "x$xpm_test" = xno; then + ac_cv_have_xpm=no + else + AC_MSG_CHECKING(for XPM) + AC_CACHE_VAL(ac_cv_have_xpm, + [ + ac_save_ldflags="$LDFLAGS" + ac_save_cflags="$CFLAGS" + if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then + LDFLAGS="$LDFLAGS $X_LDFLAGS $USER_LDFLAGS $LDFLAGS $XPM_LDFLAGS $all_libraries -lXpm -lX11 -lXext $LIBZ $LIBSOCKET" + else + LDFLAGS="$LDFLAGS $X_LDFLAGS $USER_LDFLAGS $LDFLAGS $XPM_LDFLAGS $all_libraries -lXpm $LIBZ $LIBSOCKET" + fi + CFLAGS="$CFLAGS $X_INCLUDES $USER_INCLUDES" + test -n "$XPM_INCLUDE" && CFLAGS="-I$XPM_INCLUDE $CFLAGS" + AC_TRY_LINK([#include ],[], + ac_cv_have_xpm="yes",ac_cv_have_xpm="no") + LDFLAGS="$ac_save_ldflags" + CFLAGS="$ac_save_cflags" + ])dnl + + if test "$ac_cv_have_xpm" = no; then + AC_MSG_RESULT(no) + XPM_LDFLAGS="" + XPMINC="" + $2 + else + AC_DEFINE(HAVE_XPM, 1, [Define if you have XPM support]) + if test "$XPM_LDFLAGS" = ""; then + XPMLIB='-lXpm $(LIB_X11)' + else + XPMLIB="-L$XPM_LDFLAGS -lXpm "'$(LIB_X11)' + fi + if test "$XPM_INCLUDE" = ""; then + XPMINC="" + else + XPMINC="-I$XPM_INCLUDE" + fi + AC_MSG_RESULT(yes) + $1 + fi + fi + AC_SUBST(XPMINC) + AC_SUBST(XPMLIB) +]) + +AC_DEFUN([AC_HAVE_DPMS], + [AC_REQUIRE_CPP()dnl + AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + + test -z "$DPMS_LDFLAGS" && DPMS_LDFLAGS= + test -z "$DPMS_INCLUDE" && DPMS_INCLUDE= + DPMS_LIB= + + AC_ARG_WITH(dpms,AC_HELP_STRING([--without-dpms],[disable DPMS power saving]), + dpms_test=$withval, dpms_test="yes") + if test "x$dpms_test" = xno; then + ac_cv_have_dpms=no + else + AC_MSG_CHECKING(for DPMS) + dnl Note: ac_cv_have_dpms can be no, yes, or -lXdpms. + dnl 'yes' means DPMS_LIB="", '-lXdpms' means DPMS_LIB="-lXdpms". + AC_CACHE_VAL(ac_cv_have_dpms, + [ + if test "x$kde_use_qt_emb" = "xyes" || test "x$kde_use_qt_mac" = "xyes"; then + AC_MSG_RESULT(no) + ac_cv_have_dpms="no" + else + ac_save_ldflags="$LDFLAGS" + ac_save_cflags="$CFLAGS" + ac_save_libs="$LIBS" + LDFLAGS="$LDFLAGS $DPMS_LDFLAGS $all_libraries" + LIBS="-lX11 -lXext $LIBSOCKET" + CFLAGS="$CFLAGS $X_INCLUDES" + test -n "$DPMS_INCLUDE" && CFLAGS="-I$DPMS_INCLUDE $CFLAGS" + AC_TRY_LINK([ + #include + #include + #include + #include + int foo_test_dpms() + { return DPMSSetTimeouts( 0, 0, 0, 0 ); }],[], + ac_cv_have_dpms="yes", [ + LIBS="-lXdpms $LIBS" + AC_TRY_LINK([ + #include + #include + #include + #include + int foo_test_dpms() + { return DPMSSetTimeouts( 0, 0, 0, 0 ); }],[], + [ + ac_cv_have_dpms="-lXdpms" + ],ac_cv_have_dpms="no") + ]) + LDFLAGS="$ac_save_ldflags" + CFLAGS="$ac_save_cflags" + LIBS="$ac_save_libs" + fi + ])dnl + + if test "$ac_cv_have_dpms" = no; then + AC_MSG_RESULT(no) + DPMS_LDFLAGS="" + DPMSINC="" + $2 + else + AC_DEFINE(HAVE_DPMS, 1, [Define if you have DPMS support]) + if test "$ac_cv_have_dpms" = "-lXdpms"; then + DPMS_LIB="-lXdpms" + fi + if test "$DPMS_LDFLAGS" = ""; then + DPMSLIB="$DPMS_LIB "'$(LIB_X11)' + else + DPMSLIB="$DPMS_LDFLAGS $DPMS_LIB "'$(LIB_X11)' + fi + if test "$DPMS_INCLUDE" = ""; then + DPMSINC="" + else + DPMSINC="-I$DPMS_INCLUDE" + fi + AC_MSG_RESULT(yes) + $1 + fi + fi + ac_save_cflags="$CFLAGS" + CFLAGS="$CFLAGS $X_INCLUDES" + test -n "$DPMS_INCLUDE" && CFLAGS="-I$DPMS_INCLUDE $CFLAGS" + AH_TEMPLATE(HAVE_DPMSCAPABLE_PROTO, + [Define if you have the DPMSCapable prototype in ]) + AC_CHECK_DECL(DPMSCapable, + AC_DEFINE(HAVE_DPMSCAPABLE_PROTO),, + [#include + #include ]) + AH_TEMPLATE(HAVE_DPMSINFO_PROTO, + [Define if you have the DPMSInfo prototype in ]) + AC_CHECK_DECL(DPMSInfo, + AC_DEFINE(HAVE_DPMSINFO_PROTO),, + [#include + #include ]) + CFLAGS="$ac_save_cflags" + AC_SUBST(DPMSINC) + AC_SUBST(DPMSLIB) +]) + +AC_DEFUN([AC_HAVE_GL], + [AC_REQUIRE_CPP()dnl + AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + + test -z "$GL_LDFLAGS" && GL_LDFLAGS= + test -z "$GL_INCLUDE" && GL_INCLUDE= + + AC_ARG_WITH(gl,AC_HELP_STRING([--without-gl],[disable 3D GL modes]), + gl_test=$withval, gl_test="yes") + if test "x$kde_use_qt_emb" = "xyes"; then + # GL and Qt Embedded is a no-go for now. + ac_cv_have_gl=no + elif test "x$gl_test" = xno; then + ac_cv_have_gl=no + else + AC_MSG_CHECKING(for GL) + AC_CACHE_VAL(ac_cv_have_gl, + [ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + ac_save_ldflags=$LDFLAGS + ac_save_cxxflags=$CXXFLAGS + ac_save_libs=$LIBS + LDFLAGS="$LDFLAGS $GL_LDFLAGS $X_LDFLAGS $all_libraries" + LIBS="$LIBS -lGL -lGLU" + test "x$kde_use_qt_mac" != xyes && test "x$kde_use_qt_emb" != xyes && LIBS="$LIBS -lX11" + LIBS="$LIBS $LIB_XEXT -lm $LIBSOCKET" + CXXFLAGS="$CFLAGS $X_INCLUDES" + test -n "$GL_INCLUDE" && CFLAGS="-I$GL_INCLUDE $CFLAGS" + AC_TRY_LINK([#include +#include +], [], + ac_cv_have_gl="yes", ac_cv_have_gl="no") + AC_LANG_RESTORE + LDFLAGS=$ac_save_ldflags + CXXFLAGS=$ac_save_cxxflags + LIBS=$ac_save_libs + ])dnl + + if test "$ac_cv_have_gl" = "no"; then + AC_MSG_RESULT(no) + GL_LDFLAGS="" + GLINC="" + $2 + else + AC_DEFINE(HAVE_GL, 1, [Defines if you have GL (Mesa, OpenGL, ...)]) + if test "$GL_LDFLAGS" = ""; then + GLLIB='-lGLU -lGL $(LIB_X11)' + else + GLLIB="$GL_LDFLAGS -lGLU -lGL "'$(LIB_X11)' + fi + if test "$GL_INCLUDE" = ""; then + GLINC="" + else + GLINC="-I$GL_INCLUDE" + fi + AC_MSG_RESULT($ac_cv_have_gl) + $1 + fi + fi + AC_SUBST(GLINC) + AC_SUBST(GLLIB) +]) + + + dnl shadow password and PAM magic - maintained by ossi@kde.org + +AC_DEFUN([KDE_PAM], [ + AC_REQUIRE([KDE_CHECK_LIBDL]) + + want_pam= + AC_ARG_WITH(pam, + AC_HELP_STRING([--with-pam[=ARG]],[enable support for PAM: ARG=[yes|no|service name]]), + [ if test "x$withval" = "xyes"; then + want_pam=yes + pam_service=kde + elif test "x$withval" = "xno"; then + want_pam=no + else + want_pam=yes + pam_service=$withval + fi + ], [ pam_service=kde ]) + + use_pam= + PAMLIBS= + if test "x$want_pam" != xno; then + AC_CHECK_LIB(pam, pam_start, [ + AC_CHECK_HEADER(security/pam_appl.h, + [ pam_header=security/pam_appl.h ], + [ AC_CHECK_HEADER(pam/pam_appl.h, + [ pam_header=pam/pam_appl.h ], + [ + AC_MSG_WARN([PAM detected, but no headers found! +Make sure you have the necessary development packages installed.]) + ] + ) + ] + ) + ], , $LIBDL) + if test -z "$pam_header"; then + if test "x$want_pam" = xyes; then + AC_MSG_ERROR([--with-pam was specified, but cannot compile with PAM!]) + fi + else + AC_DEFINE(HAVE_PAM, 1, [Defines if you have PAM (Pluggable Authentication Modules)]) + PAMLIBS="$PAM_MISC_LIB -lpam $LIBDL" + use_pam=yes + + dnl darwin claims to be something special + if test "$pam_header" = "pam/pam_appl.h"; then + AC_DEFINE(HAVE_PAM_PAM_APPL_H, 1, [Define if your PAM headers are in pam/ instead of security/]) + fi + + dnl test whether struct pam_message is const (Linux) or not (Sun) + AC_MSG_CHECKING(for const pam_message) + AC_EGREP_HEADER([struct pam_message], $pam_header, + [ AC_EGREP_HEADER([const struct pam_message], $pam_header, + [AC_MSG_RESULT([const: Linux-type PAM])], + [AC_MSG_RESULT([nonconst: Sun-type PAM]) + AC_DEFINE(PAM_MESSAGE_NONCONST, 1, [Define if your PAM support takes non-const arguments (Solaris)])] + )], + [AC_MSG_RESULT([not found - assume const, Linux-type PAM])]) + fi + fi + + AC_SUBST(PAMLIBS) +]) + +dnl DEF_PAM_SERVICE(arg name, full name, define name) +AC_DEFUN([DEF_PAM_SERVICE], [ + AC_ARG_WITH($1-pam, + AC_HELP_STRING([--with-$1-pam=[val]],[override PAM service from --with-pam for $2]), + [ if test "x$use_pam" = xyes; then + $3_PAM_SERVICE=$withval + else + AC_MSG_ERROR([Cannot use use --with-$1-pam, as no PAM was detected. +You may want to enforce it by using --with-pam.]) + fi + ], + [ if test "x$use_pam" = xyes; then + $3_PAM_SERVICE="$pam_service" + fi + ]) + if test -n "$$3_PAM_SERVICE"; then + AC_MSG_RESULT([The PAM service used by $2 will be $$3_PAM_SERVICE]) + AC_DEFINE_UNQUOTED($3_PAM_SERVICE, "$$3_PAM_SERVICE", [The PAM service to be used by $2]) + fi + AC_SUBST($3_PAM_SERVICE) +]) + +AC_DEFUN([KDE_SHADOWPASSWD], [ + AC_REQUIRE([KDE_PAM]) + + AC_CHECK_LIB(shadow, getspent, + [ LIBSHADOW="-lshadow" + ac_use_shadow=yes + ], + [ dnl for UnixWare + AC_CHECK_LIB(gen, getspent, + [ LIBGEN="-lgen" + ac_use_shadow=yes + ], + [ AC_CHECK_FUNC(getspent, + [ ac_use_shadow=yes ], + [ ac_use_shadow=no ]) + ]) + ]) + AC_SUBST(LIBSHADOW) + AC_SUBST(LIBGEN) + + AC_MSG_CHECKING([for shadow passwords]) + + AC_ARG_WITH(shadow, + AC_HELP_STRING([--with-shadow],[If you want shadow password support]), + [ if test "x$withval" != "xno"; then + use_shadow=yes + else + use_shadow=no + fi + ], [ + use_shadow="$ac_use_shadow" + ]) + + if test "x$use_shadow" = xyes; then + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_SHADOW, 1, [Define if you use shadow passwords]) + else + AC_MSG_RESULT(no) + LIBSHADOW= + LIBGEN= + fi + + dnl finally make the relevant binaries setuid root, if we have shadow passwds. + dnl this still applies, if we could use it indirectly through pam. + if test "x$use_shadow" = xyes || + ( test "x$use_pam" = xyes && test "x$ac_use_shadow" = xyes ); then + case $host in + *-*-freebsd* | *-*-netbsd* | *-*-openbsd*) + SETUIDFLAGS="-m 4755 -o root";; + *) + SETUIDFLAGS="-m 4755";; + esac + fi + AC_SUBST(SETUIDFLAGS) + +]) + +AC_DEFUN([KDE_PASSWDLIBS], [ + AC_REQUIRE([KDE_MISC_TESTS]) dnl for LIBCRYPT + AC_REQUIRE([KDE_PAM]) + AC_REQUIRE([KDE_SHADOWPASSWD]) + + if test "x$use_pam" = "xyes"; then + PASSWDLIBS="$PAMLIBS" + else + PASSWDLIBS="$LIBCRYPT $LIBSHADOW $LIBGEN" + fi + + dnl FreeBSD uses a shadow-like setup, where /etc/passwd holds the users, but + dnl /etc/master.passwd holds the actual passwords. /etc/master.passwd requires + dnl root to read, so kcheckpass needs to be root (even when using pam, since pam + dnl may need to read /etc/master.passwd). + case $host in + *-*-freebsd*) + SETUIDFLAGS="-m 4755 -o root" + ;; + *) + ;; + esac + + AC_SUBST(PASSWDLIBS) +]) + +AC_DEFUN([KDE_CHECK_LIBDL], +[ +AC_CHECK_LIB(dl, dlopen, [ +LIBDL="-ldl" +ac_cv_have_dlfcn=yes +]) + +AC_CHECK_LIB(dld, shl_unload, [ +LIBDL="-ldld" +ac_cv_have_shload=yes +]) + +AC_SUBST(LIBDL) +]) + +AC_DEFUN([KDE_CHECK_DLOPEN], +[ +KDE_CHECK_LIBDL +AC_CHECK_HEADERS(dlfcn.h dl.h) +if test "$ac_cv_header_dlfcn_h" = "no"; then + ac_cv_have_dlfcn=no +fi + +if test "$ac_cv_header_dl_h" = "no"; then + ac_cv_have_shload=no +fi + +dnl XXX why change enable_dlopen? its already set by autoconf's AC_ARG_ENABLE +dnl (MM) +AC_ARG_ENABLE(dlopen, +AC_HELP_STRING([--disable-dlopen],[link statically [default=no]]), +enable_dlopen=$enableval, +enable_dlopen=yes) + +# override the user's opinion, if we know it better ;) +if test "$ac_cv_have_dlfcn" = "no" && test "$ac_cv_have_shload" = "no"; then + enable_dlopen=no +fi + +if test "$ac_cv_have_dlfcn" = "yes"; then + AC_DEFINE_UNQUOTED(HAVE_DLFCN, 1, [Define if you have dlfcn]) +fi + +if test "$ac_cv_have_shload" = "yes"; then + AC_DEFINE_UNQUOTED(HAVE_SHLOAD, 1, [Define if you have shload]) +fi + +if test "$enable_dlopen" = no ; then + test -n "$1" && eval $1 +else + test -n "$2" && eval $2 +fi + +]) + +AC_DEFUN([KDE_CHECK_DYNAMIC_LOADING], +[ +KDE_CHECK_DLOPEN(libtool_enable_shared=yes, libtool_enable_static=no) +KDE_PROG_LIBTOOL +AC_MSG_CHECKING([dynamic loading]) +eval "`egrep '^build_libtool_libs=' libtool`" +if test "$build_libtool_libs" = "yes" && test "$enable_dlopen" = "yes"; then + dynamic_loading=yes + AC_DEFINE_UNQUOTED(HAVE_DYNAMIC_LOADING) +else + dynamic_loading=no +fi +AC_MSG_RESULT($dynamic_loading) +if test "$dynamic_loading" = "yes"; then + $1 +else + $2 +fi +]) + +AC_DEFUN([KDE_ADD_INCLUDES], +[ +if test -z "$1"; then + test_include="Pix.h" +else + test_include="$1" +fi + +AC_MSG_CHECKING([for libg++ ($test_include)]) + +AC_CACHE_VAL(kde_cv_libgpp_includes, +[ +kde_cv_libgpp_includes=no + + for ac_dir in \ + \ + /usr/include/g++ \ + /usr/include \ + /usr/unsupported/include \ + /opt/include \ + $extra_include \ + ; \ + do + if test -r "$ac_dir/$test_include"; then + kde_cv_libgpp_includes=$ac_dir + break + fi + done +]) + +AC_MSG_RESULT($kde_cv_libgpp_includes) +if test "$kde_cv_libgpp_includes" != "no"; then + all_includes="-I$kde_cv_libgpp_includes $all_includes $USER_INCLUDES" +fi +]) +]) + +AC_DEFUN([KDE_CHECK_LIBPTHREAD], +[ + dnl This code is here specifically to handle the + dnl various flavors of threading library on FreeBSD + dnl 4-, 5-, and 6-, and the (weird) rules around it. + dnl There may be an environment PTHREAD_LIBS that + dnl specifies what to use; otherwise, search for it. + dnl -pthread is special cased and unsets LIBPTHREAD + dnl below if found. + LIBPTHREAD="" + + if test -n "$PTHREAD_LIBS"; then + if test "x$PTHREAD_LIBS" = "x-pthread" ; then + LIBPTHREAD="PTHREAD" + else + PTHREAD_LIBS_save="$PTHREAD_LIBS" + PTHREAD_LIBS=`echo "$PTHREAD_LIBS_save" | sed -e 's,^-l,,g'` + AC_MSG_CHECKING([for pthread_create in $PTHREAD_LIBS]) + KDE_CHECK_LIB($PTHREAD_LIBS, pthread_create, [ + LIBPTHREAD="$PTHREAD_LIBS_save"]) + PTHREAD_LIBS="$PTHREAD_LIBS_save" + fi + fi + + dnl Is this test really needed, in the face of the Tru64 test below? + if test -z "$LIBPTHREAD"; then + AC_CHECK_LIB(pthread, pthread_create, [LIBPTHREAD="-lpthread"]) + fi + + dnl This is a special Tru64 check, see BR 76171 issue #18. + if test -z "$LIBPTHREAD" ; then + AC_MSG_CHECKING([for pthread_create in -lpthread]) + kde_safe_libs=$LIBS + LIBS="$LIBS -lpthread" + AC_TRY_LINK([#include ],[(void)pthread_create(0,0,0,0);],[ + AC_MSG_RESULT(yes) + LIBPTHREAD="-lpthread"],[ + AC_MSG_RESULT(no)]) + LIBS=$kde_safe_libs + fi + + dnl Un-special-case for FreeBSD. + if test "x$LIBPTHREAD" = "xPTHREAD" ; then + LIBPTHREAD="" + fi + + AC_SUBST(LIBPTHREAD) +]) + +AC_DEFUN([KDE_CHECK_PTHREAD_OPTION], +[ + USE_THREADS="" + if test -z "$LIBPTHREAD"; then + KDE_CHECK_COMPILER_FLAG(pthread, [USE_THREADS="-D_THREAD_SAFE -pthread"]) + fi + + AH_VERBATIM(__svr_define, [ +#if defined(__SVR4) && !defined(__svr4__) +#define __svr4__ 1 +#endif +]) + case $host_os in + solaris*) + KDE_CHECK_COMPILER_FLAG(mt, [USE_THREADS="-mt"]) + CPPFLAGS="$CPPFLAGS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -DUSE_SOLARIS -DSVR4" + ;; + freebsd*) + CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE $PTHREAD_CFLAGS" + ;; + aix*) + CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE" + LIBPTHREAD="$LIBPTHREAD -lc_r" + ;; + linux*) CPPFLAGS="$CPPFLAGS -D_REENTRANT" + if test "$CXX" = "KCC"; then + CXXFLAGS="$CXXFLAGS --thread_safe" + NOOPT_CXXFLAGS="$NOOPT_CXXFLAGS --thread_safe" + fi + ;; + *) + ;; + esac + AC_SUBST(USE_THREADS) + AC_SUBST(LIBPTHREAD) +]) + +AC_DEFUN([KDE_CHECK_THREADING], +[ + AC_REQUIRE([KDE_CHECK_LIBPTHREAD]) + AC_REQUIRE([KDE_CHECK_PTHREAD_OPTION]) + dnl default is yes if libpthread is found and no if no libpthread is available + if test -z "$LIBPTHREAD"; then + if test -z "$USE_THREADS"; then + kde_check_threading_default=no + else + kde_check_threading_default=yes + fi + else + kde_check_threading_default=yes + fi + AC_ARG_ENABLE(threading,AC_HELP_STRING([--disable-threading],[disables threading even if libpthread found]), + kde_use_threading=$enableval, kde_use_threading=$kde_check_threading_default) + if test "x$kde_use_threading" = "xyes"; then + AC_DEFINE(HAVE_LIBPTHREAD, 1, [Define if you have a working libpthread (will enable threaded code)]) + fi +]) + +AC_DEFUN([KDE_TRY_LINK_PYTHON], +[ +if test "$kde_python_link_found" = no; then + +if test "$1" = normal; then + AC_MSG_CHECKING(if a Python application links) +else + AC_MSG_CHECKING(if Python depends on $2) +fi + +AC_CACHE_VAL(kde_cv_try_link_python_$1, +[ +kde_save_cflags="$CFLAGS" +CFLAGS="$CFLAGS $PYTHONINC" +kde_save_libs="$LIBS" +LIBS="$LIBS $LIBPYTHON $2 $LIBDL $LIBSOCKET" +kde_save_ldflags="$LDFLAGS" +LDFLAGS="$LDFLAGS $PYTHONLIB" + +AC_TRY_LINK( +[ +#include +],[ + PySys_SetArgv(1, 0); +], + [kde_cv_try_link_python_$1=yes], + [kde_cv_try_link_python_$1=no] +) +CFLAGS="$kde_save_cflags" +LIBS="$kde_save_libs" +LDFLAGS="$kde_save_ldflags" +]) + +if test "$kde_cv_try_link_python_$1" = "yes"; then + AC_MSG_RESULT(yes) + kde_python_link_found=yes + if test ! "$1" = normal; then + LIBPYTHON="$LIBPYTHON $2" + fi + $3 +else + AC_MSG_RESULT(no) + $4 +fi + +fi + +]) + +AC_DEFUN([KDE_CHECK_PYTHON_DIR], +[ +AC_MSG_CHECKING([for Python directory]) + +AC_CACHE_VAL(kde_cv_pythondir, +[ + if test -z "$PYTHONDIR"; then + kde_cv_pythondir=/usr/local + else + kde_cv_pythondir="$PYTHONDIR" + fi +]) + +AC_ARG_WITH(pythondir, +AC_HELP_STRING([--with-pythondir=pythondir],[use python installed in pythondir]), +[ + ac_python_dir=$withval +], ac_python_dir=$kde_cv_pythondir +) + +AC_MSG_RESULT($ac_python_dir) +]) + +AC_DEFUN([KDE_CHECK_PYTHON_INTERN], +[ +AC_REQUIRE([KDE_CHECK_LIBDL]) +AC_REQUIRE([KDE_CHECK_LIBPTHREAD]) +AC_REQUIRE([KDE_CHECK_PYTHON_DIR]) + +if test -z "$1"; then + version="1.5" +else + version="$1" +fi + +AC_MSG_CHECKING([for Python$version]) + +python_incdirs="$ac_python_dir/include /usr/include /usr/local/include/ $kde_extra_includes" +AC_FIND_FILE(Python.h, $python_incdirs, python_incdir) +if test ! -r $python_incdir/Python.h; then + AC_FIND_FILE(python$version/Python.h, $python_incdirs, python_incdir) + python_incdir=$python_incdir/python$version + if test ! -r $python_incdir/Python.h; then + python_incdir=no + fi +fi + +PYTHONINC=-I$python_incdir + +python_libdirs="$ac_python_dir/lib$kdelibsuff /usr/lib$kdelibsuff /usr/local /usr/lib$kdelibsuff $kde_extra_libs" +AC_FIND_FILE(libpython$version.so, $python_libdirs, python_libdir) +if test ! -r $python_libdir/libpython$version.so; then + AC_FIND_FILE(libpython$version.a, $python_libdirs, python_libdir) + if test ! -r $python_libdir/libpython$version.a; then + AC_FIND_FILE(python$version/config/libpython$version.a, $python_libdirs, python_libdir) + python_libdir=$python_libdir/python$version/config + if test ! -r $python_libdir/libpython$version.a; then + python_libdir=no + fi + fi +fi + +PYTHONLIB=-L$python_libdir +kde_orig_LIBPYTHON=$LIBPYTHON +if test -z "$LIBPYTHON"; then + LIBPYTHON=-lpython$version +fi + +AC_FIND_FILE(python$version/copy.py, $python_libdirs, python_moddir) +python_moddir=$python_moddir/python$version +if test ! -r $python_moddir/copy.py; then + python_moddir=no +fi + +PYTHONMODDIR=$python_moddir + +AC_MSG_RESULT(header $python_incdir library $python_libdir modules $python_moddir) + +if test x$python_incdir = xno || test x$python_libdir = xno || test x$python_moddir = xno; then + LIBPYTHON=$kde_orig_LIBPYTHON + test "x$PYTHONLIB" = "x-Lno" && PYTHONLIB="" + test "x$PYTHONINC" = "x-Ino" && PYTHONINC="" + $2 +else + dnl Note: this test is very weak + kde_python_link_found=no + KDE_TRY_LINK_PYTHON(normal) + KDE_TRY_LINK_PYTHON(m, -lm) + KDE_TRY_LINK_PYTHON(pthread, $LIBPTHREAD) + KDE_TRY_LINK_PYTHON(tcl, -ltcl) + KDE_TRY_LINK_PYTHON(db2, -ldb2) + KDE_TRY_LINK_PYTHON(m_and_thread, [$LIBPTHREAD -lm]) + KDE_TRY_LINK_PYTHON(m_and_thread_and_util, [$LIBPTHREAD -lm -lutil]) + KDE_TRY_LINK_PYTHON(m_and_thread_and_db3, [$LIBPTHREAD -lm -ldb-3 -lutil]) + KDE_TRY_LINK_PYTHON(pthread_and_db3, [$LIBPTHREAD -ldb-3]) + KDE_TRY_LINK_PYTHON(m_and_thread_and_db, [$LIBPTHREAD -lm -ldb -ltermcap -lutil]) + KDE_TRY_LINK_PYTHON(pthread_and_dl, [$LIBPTHREAD $LIBDL -lutil -lreadline -lncurses -lm]) + KDE_TRY_LINK_PYTHON(pthread_and_panel_curses, [$LIBPTHREAD $LIBDL -lm -lpanel -lcurses]) + KDE_TRY_LINK_PYTHON(m_and_thread_and_db_special, [$LIBPTHREAD -lm -ldb -lutil], [], + [AC_MSG_WARN([it seems, Python depends on another library. + Please set LIBPYTHON to '-lpython$version -lotherlib' before calling configure to fix this + and contact the authors to let them know about this problem]) + ]) + + LIBPYTHON="$LIBPYTHON $LIBDL $LIBSOCKET" + AC_SUBST(PYTHONINC) + AC_SUBST(PYTHONLIB) + AC_SUBST(LIBPYTHON) + AC_SUBST(PYTHONMODDIR) + AC_DEFINE(HAVE_PYTHON, 1, [Define if you have the development files for python]) +fi + +]) + + +AC_DEFUN([KDE_CHECK_PYTHON], +[ + KDE_CHECK_PYTHON_INTERN("2.4", + [KDE_CHECK_PYTHON_INTERN("2.3", + [KDE_CHECK_PYTHON_INTERN("2.2", + [KDE_CHECK_PYTHON_INTERN("2.1", + [KDE_CHECK_PYTHON_INTERN("2.0", + [KDE_CHECK_PYTHON_INTERN($1, $2) ]) + ]) + ]) + ]) + ]) +]) + +AC_DEFUN([KDE_CHECK_STL], +[ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + ac_save_CXXFLAGS="$CXXFLAGS" + CXXFLAGS="`echo $CXXFLAGS | sed s/-fno-exceptions//`" + + AC_MSG_CHECKING([if C++ programs can be compiled]) + AC_CACHE_VAL(kde_cv_stl_works, + [ + AC_TRY_COMPILE([ +#include +using namespace std; +],[ + string astring="Hallo Welt."; + astring.erase(0, 6); // now astring is "Welt" + return 0; +], kde_cv_stl_works=yes, + kde_cv_stl_works=no) +]) + + AC_MSG_RESULT($kde_cv_stl_works) + + if test "$kde_cv_stl_works" = "yes"; then + # back compatible + AC_DEFINE_UNQUOTED(HAVE_SGI_STL, 1, [Define if you have a STL implementation by SGI]) + else + AC_MSG_ERROR([Your Installation isn't able to compile simple C++ programs. +Check config.log for details - if you're using a Linux distribution you might miss +a package named similar to libstdc++-dev.]) + fi + + CXXFLAGS="$ac_save_CXXFLAGS" + AC_LANG_RESTORE +]) + +AC_DEFUN([AC_FIND_QIMGIO], + [AC_REQUIRE([AC_FIND_JPEG]) +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) +AC_MSG_CHECKING([for qimgio]) +AC_CACHE_VAL(ac_cv_lib_qimgio, +[ +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +ac_save_LIBS="$LIBS" +ac_save_CXXFLAGS="$CXXFLAGS" +LIBS="$all_libraries -lqimgio -lpng -lz $LIBJPEG $LIBQT" +CXXFLAGS="$CXXFLAGS -I$qt_incdir $all_includes" +AC_TRY_RUN(dnl +[ +#include +#include +int main() { + QString t = "hallo"; + t.fill('t'); + qInitImageIO(); +} +], + ac_cv_lib_qimgio=yes, + ac_cv_lib_qimgio=no, + ac_cv_lib_qimgio=no) +LIBS="$ac_save_LIBS" +CXXFLAGS="$ac_save_CXXFLAGS" +AC_LANG_RESTORE +])dnl +if eval "test \"`echo $ac_cv_lib_qimgio`\" = yes"; then + LIBQIMGIO="-lqimgio -lpng -lz $LIBJPEG" + AC_MSG_RESULT(yes) + AC_DEFINE_UNQUOTED(HAVE_QIMGIO, 1, [Define if you have the Qt extension qimgio available]) + AC_SUBST(LIBQIMGIO) +else + AC_MSG_RESULT(not found) +fi +]) + +AC_DEFUN([AM_DISABLE_LIBRARIES], +[ + AC_PROVIDE([AM_ENABLE_STATIC]) + AC_PROVIDE([AM_ENABLE_SHARED]) + enable_static=no + enable_shared=yes +]) + + +AC_DEFUN([AC_CHECK_UTMP_FILE], +[ + AC_MSG_CHECKING([for utmp file]) + + AC_CACHE_VAL(kde_cv_utmp_file, + [ + kde_cv_utmp_file=no + + for ac_file in \ + \ + /var/run/utmp \ + /var/adm/utmp \ + /etc/utmp \ + ; \ + do + if test -r "$ac_file"; then + kde_cv_utmp_file=$ac_file + break + fi + done + ]) + + if test "$kde_cv_utmp_file" != "no"; then + AC_DEFINE_UNQUOTED(UTMP, "$kde_cv_utmp_file", [Define the file for utmp entries]) + $1 + AC_MSG_RESULT($kde_cv_utmp_file) + else + $2 + AC_MSG_RESULT([non found]) + fi +]) + + +AC_DEFUN([KDE_CREATE_SUBDIRSLIST], +[ + +DO_NOT_COMPILE="$DO_NOT_COMPILE CVS debian bsd-port admin" +TOPSUBDIRS="" + +if test ! -s $srcdir/subdirs; then + dnl Note: Makefile.common creates subdirs, so this is just a fallback + files=`cd $srcdir && ls -1` + dirs=`for i in $files; do if test -d $i; then echo $i; fi; done` + for i in $dirs; do + echo $i >> $srcdir/subdirs + done +fi + +ac_topsubdirs= +if test -s $srcdir/inst-apps; then + ac_topsubdirs="`cat $srcdir/inst-apps`" +elif test -s $srcdir/subdirs; then + ac_topsubdirs="`cat $srcdir/subdirs`" +fi + +for i in $ac_topsubdirs; do + AC_MSG_CHECKING([if $i should be compiled]) + if test -d $srcdir/$i; then + install_it="yes" + for j in $DO_NOT_COMPILE; do + if test $i = $j; then + install_it="no" + fi + done + else + install_it="no" + fi + AC_MSG_RESULT($install_it) + vari=`echo $i | sed -e 's,[[-+.@]],_,g'` + if test $install_it = "yes"; then + TOPSUBDIRS="$TOPSUBDIRS $i" + eval "$vari""_SUBDIR_included=yes" + else + eval "$vari""_SUBDIR_included=no" + fi +done + +AC_SUBST(TOPSUBDIRS) +]) + +AC_DEFUN([KDE_CHECK_NAMESPACES], +[ +AC_MSG_CHECKING(whether C++ compiler supports namespaces) +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +AC_TRY_COMPILE([ +], +[ +namespace Foo { + extern int i; + namespace Bar { + extern int i; + } +} + +int Foo::i = 0; +int Foo::Bar::i = 1; +],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_NAMESPACES) +], [ +AC_MSG_RESULT(no) +]) +AC_LANG_RESTORE +]) + +dnl ------------------------------------------------------------------------ +dnl Check for S_ISSOCK macro. Doesn't exist on Unix SCO. faure@kde.org +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([AC_CHECK_S_ISSOCK], +[ +AC_MSG_CHECKING(for S_ISSOCK) +AC_CACHE_VAL(ac_cv_have_s_issock, +[ +AC_TRY_LINK( +[ +#include +], +[ +struct stat buff; +int b = S_ISSOCK( buff.st_mode ); +], +ac_cv_have_s_issock=yes, +ac_cv_have_s_issock=no) +]) +AC_MSG_RESULT($ac_cv_have_s_issock) +if test "$ac_cv_have_s_issock" = "yes"; then + AC_DEFINE_UNQUOTED(HAVE_S_ISSOCK, 1, [Define if sys/stat.h declares S_ISSOCK.]) +fi + +AH_VERBATIM(_ISSOCK, +[ +#ifndef HAVE_S_ISSOCK +#define HAVE_S_ISSOCK +#define S_ISSOCK(mode) (1==0) +#endif +]) + +]) + +dnl ------------------------------------------------------------------------ +dnl Check for MAXPATHLEN macro, defines KDEMAXPATHLEN. faure@kde.org +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([AC_CHECK_KDEMAXPATHLEN], +[ +AC_MSG_CHECKING(for MAXPATHLEN) +AC_CACHE_VAL(ac_cv_maxpathlen, +[ +cat > conftest.$ac_ext < +#endif +#include +#include +#ifndef MAXPATHLEN +#define MAXPATHLEN 1024 +#endif + +KDE_HELLO MAXPATHLEN + +EOF + +ac_try="$ac_cpp conftest.$ac_ext 2>/dev/null | grep '^KDE_HELLO' >conftest.out" + +if AC_TRY_EVAL(ac_try) && test -s conftest.out; then + ac_cv_maxpathlen=`sed 's#KDE_HELLO ##' conftest.out` +else + ac_cv_maxpathlen=1024 +fi + +rm conftest.* + +]) +AC_MSG_RESULT($ac_cv_maxpathlen) +AC_DEFINE_UNQUOTED(KDEMAXPATHLEN,$ac_cv_maxpathlen, [Define a safe value for MAXPATHLEN] ) +]) + +AC_DEFUN([KDE_CHECK_HEADER], +[ + kde_safe_cppflags=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $all_includes" + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_CHECK_HEADER([$1], [$2], [$3], [$4]) + AC_LANG_RESTORE + CPPFLAGS=$kde_safe_cppflags +]) + +AC_DEFUN([KDE_CHECK_HEADERS], +[ + AH_CHECK_HEADERS([$1]) + AC_LANG_SAVE + kde_safe_cppflags=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $all_includes" + AC_LANG_CPLUSPLUS + AC_CHECK_HEADERS([$1], [$2], [$3], [$4]) + CPPFLAGS=$kde_safe_cppflags + AC_LANG_RESTORE +]) + +AC_DEFUN([KDE_FAST_CONFIGURE], +[ + dnl makes configure fast (needs perl) + AC_ARG_ENABLE(fast-perl, AC_HELP_STRING([--disable-fast-perl],[disable fast Makefile generation (needs perl)]), + with_fast_perl=$enableval, with_fast_perl=yes) +]) + +AC_DEFUN([KDE_CONF_FILES], +[ + val= + if test -f $srcdir/configure.files ; then + val=`sed -e 's%^%\$(top_srcdir)/%' $srcdir/configure.files` + fi + CONF_FILES= + if test -n "$val" ; then + for i in $val ; do + CONF_FILES="$CONF_FILES $i" + done + fi + AC_SUBST(CONF_FILES) +])dnl + +dnl This sets the prefix, for arts and kdelibs +dnl Do NOT use in any other module. +dnl It only looks at --prefix, KDEDIR and falls back to /usr/local/kde +AC_DEFUN([KDE_SET_PREFIX_CORE], +[ + unset CDPATH + dnl make $KDEDIR the default for the installation + AC_PREFIX_DEFAULT(${KDEDIR:-/usr/local/kde}) + + if test "x$prefix" = "xNONE"; then + prefix=$ac_default_prefix + ac_configure_args="$ac_configure_args --prefix=$prefix" + fi + # And delete superfluous '/' to make compares easier + prefix=`echo "$prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` + exec_prefix=`echo "$exec_prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` + + kde_libs_prefix='$(prefix)' + kde_libs_htmldir='$(kde_htmldir)' + AC_SUBST(kde_libs_prefix) + AC_SUBST(kde_libs_htmldir) + KDE_FAST_CONFIGURE + KDE_CONF_FILES +]) + + +AC_DEFUN([KDE_SET_PREFIX], +[ + unset CDPATH + dnl We can't give real code to that macro, only a value. + dnl It only matters for --help, since we set the prefix in this function anyway. + AC_PREFIX_DEFAULT(${KDEDIR:-the kde prefix}) + + KDE_SET_DEFAULT_BINDIRS + if test "x$prefix" = "xNONE"; then + dnl no prefix given: look for kde-config in the PATH and deduce the prefix from it + KDE_FIND_PATH(kde-config, KDECONFIG, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(kde-config)], [], prepend) + else + dnl prefix given: look for kde-config, preferrably in prefix, otherwise in PATH + kde_save_PATH="$PATH" + PATH="$exec_prefix/bin:$prefix/bin:$PATH" + KDE_FIND_PATH(kde-config, KDECONFIG, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(kde-config)], [], prepend) + PATH="$kde_save_PATH" + fi + + kde_libs_prefix=`$KDECONFIG --prefix` + if test -z "$kde_libs_prefix" || test ! -x "$kde_libs_prefix"; then + AC_MSG_ERROR([$KDECONFIG --prefix outputed the non existant prefix '$kde_libs_prefix' for kdelibs. + This means it has been moved since you installed it. + This won't work. Please recompile kdelibs for the new prefix. + ]) + fi + kde_libs_htmldir=`$KDECONFIG --install html --expandvars` + kde_libs_suffix=`$KDECONFIG --libsuffix` || kde_libs_suffix=auto + + AC_MSG_CHECKING([where to install]) + if test "x$prefix" = "xNONE"; then + prefix=$kde_libs_prefix + AC_MSG_RESULT([$prefix (as returned by kde-config)]) + else + dnl --prefix was given. Compare prefixes and warn (in configure.in.bot.end) if different + given_prefix=$prefix + AC_MSG_RESULT([$prefix (as requested)]) + fi + + # And delete superfluous '/' to make compares easier + prefix=`echo "$prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` + exec_prefix=`echo "$exec_prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` + given_prefix=`echo "$given_prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` + + AC_SUBST(KDECONFIG) + AC_SUBST(kde_libs_prefix) + AC_SUBST(kde_libs_htmldir) + + KDE_FAST_CONFIGURE + KDE_CONF_FILES +]) + +pushdef([AC_PROG_INSTALL], +[ + dnl our own version, testing for a -p flag + popdef([AC_PROG_INSTALL]) + dnl as AC_PROG_INSTALL works as it works we first have + dnl to save if the user didn't specify INSTALL, as the + dnl autoconf one overwrites INSTALL and we have no chance to find + dnl out afterwards + test -n "$INSTALL" && kde_save_INSTALL_given=$INSTALL + test -n "$INSTALL_PROGRAM" && kde_save_INSTALL_PROGRAM_given=$INSTALL_PROGRAM + test -n "$INSTALL_SCRIPT" && kde_save_INSTALL_SCRIPT_given=$INSTALL_SCRIPT + AC_PROG_INSTALL + + if test -z "$kde_save_INSTALL_given" ; then + # OK, user hasn't given any INSTALL, autoconf found one for us + # now we test, if it supports the -p flag + AC_MSG_CHECKING(for -p flag to install) + rm -f confinst.$$.* > /dev/null 2>&1 + echo "Testtest" > confinst.$$.orig + ac_res=no + if ${INSTALL} -p confinst.$$.orig confinst.$$.new > /dev/null 2>&1 ; then + if test -f confinst.$$.new ; then + # OK, -p seems to do no harm to install + INSTALL="${INSTALL} -p" + ac_res=yes + fi + fi + rm -f confinst.$$.* + AC_MSG_RESULT($ac_res) + fi + dnl the following tries to resolve some signs and wonders coming up + dnl with different autoconf/automake versions + dnl e.g.: + dnl *automake 1.4 install-strip sets A_M_INSTALL_PROGRAM_FLAGS to -s + dnl and has INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(A_M_INSTALL_PROGRAM_FLAGS) + dnl it header-vars.am, so there the actual INSTALL_PROGRAM gets the -s + dnl *automake 1.4a (and above) use INSTALL_STRIP_FLAG and only has + dnl INSTALL_PROGRAM = @INSTALL_PROGRAM@ there, but changes the + dnl install-@DIR@PROGRAMS targets to explicitly use that flag + dnl *autoconf 2.13 is dumb, and thinks it can use INSTALL_PROGRAM as + dnl INSTALL_SCRIPT, which breaks with automake <= 1.4 + dnl *autoconf >2.13 (since 10.Apr 1999) has not that failure + dnl *sometimes KDE does not use the install-@DIR@PROGRAM targets from + dnl automake (due to broken Makefile.am or whatever) to install programs, + dnl and so does not see the -s flag in automake > 1.4 + dnl to clean up that mess we: + dnl +set INSTALL_PROGRAM to use INSTALL_STRIP_FLAG + dnl which cleans KDE's program with automake > 1.4; + dnl +set INSTALL_SCRIPT to only use INSTALL, to clean up autoconf's problems + dnl with automake<=1.4 + dnl note that dues to this sometimes two '-s' flags are used (if KDE + dnl properly uses install-@DIR@PROGRAMS, but I don't care + dnl + dnl And to all this comes, that I even can't write in comments variable + dnl names used by automake, because it is so stupid to think I wanted to + dnl _use_ them, therefor I have written A_M_... instead of AM_ + dnl hmm, I wanted to say something ... ahh yes: Arghhh. + + if test -z "$kde_save_INSTALL_PROGRAM_given" ; then + INSTALL_PROGRAM='${INSTALL} $(INSTALL_STRIP_FLAG)' + fi + if test -z "$kde_save_INSTALL_SCRIPT_given" ; then + INSTALL_SCRIPT='${INSTALL}' + fi +])dnl + +AC_DEFUN([KDE_LANG_CPLUSPLUS], +[AC_LANG_CPLUSPLUS +ac_link='rm -rf SunWS_cache; ${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&AC_FD_CC' +pushdef([AC_LANG_CPLUSPLUS], [popdef([AC_LANG_CPLUSPLUS]) KDE_LANG_CPLUSPLUS]) +]) + +pushdef([AC_LANG_CPLUSPLUS], +[popdef([AC_LANG_CPLUSPLUS]) +KDE_LANG_CPLUSPLUS +]) + +AC_DEFUN([KDE_CHECK_LONG_LONG], +[ +AC_MSG_CHECKING(for long long) +AC_CACHE_VAL(kde_cv_c_long_long, +[ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_LINK([], [ + long long foo = 0; + foo = foo+1; + ], + kde_cv_c_long_long=yes, kde_cv_c_long_long=no) + AC_LANG_RESTORE +]) +AC_MSG_RESULT($kde_cv_c_long_long) +if test "$kde_cv_c_long_long" = yes; then + AC_DEFINE(HAVE_LONG_LONG, 1, [Define if you have long long as datatype]) +fi +]) + +AC_DEFUN([KDE_CHECK_LIB], +[ + kde_save_LDFLAGS="$LDFLAGS" + dnl AC_CHECK_LIB modifies LIBS, so save it here + kde_save_LIBS="$LIBS" + LDFLAGS="$LDFLAGS $all_libraries" + case $host_os in + aix*) LDFLAGS="-brtl $LDFLAGS" + test "$GCC" = yes && LDFLAGS="-Wl,$LDFLAGS" + ;; + esac + AC_CHECK_LIB($1, $2, $3, $4, $5) + LDFLAGS="$kde_save_LDFLAGS" + LIBS="$kde_save_LIBS" +]) + +AC_DEFUN([KDE_JAVA_PREFIX], +[ + dir=`dirname "$1"` + base=`basename "$1"` + list=`ls -1 $dir 2> /dev/null` + for entry in $list; do + if test -d $dir/$entry/bin; then + case $entry in + $base) + javadirs="$javadirs $dir/$entry/bin" + ;; + esac + elif test -d $dir/$entry/jre/bin; then + case $entry in + $base) + javadirs="$javadirs $dir/$entry/jre/bin" + ;; + esac + fi + done +]) + +dnl KDE_CHEC_JAVA_DIR(onlyjre) +AC_DEFUN([KDE_CHECK_JAVA_DIR], +[ + +AC_ARG_WITH(java, +AC_HELP_STRING([--with-java=javadir],[use java installed in javadir, --without-java disables]), +[ ac_java_dir=$withval +], ac_java_dir="" +) + +AC_MSG_CHECKING([for Java]) + +dnl at this point ac_java_dir is either a dir, 'no' to disable, or '' to say look in $PATH +if test "x$ac_java_dir" = "xno"; then + kde_java_bindir=no + kde_java_includedir=no + kde_java_libjvmdir=no + kde_java_libgcjdir=no + kde_java_libhpidir=no +else + if test "x$ac_java_dir" = "x"; then + + + dnl No option set -> collect list of candidate paths + if test -n "$JAVA_HOME"; then + KDE_JAVA_PREFIX($JAVA_HOME) + fi + KDE_JAVA_PREFIX(/usr/j2se) + KDE_JAVA_PREFIX(/usr/lib/j2se) + KDE_JAVA_PREFIX(/usr/j*dk*) + KDE_JAVA_PREFIX(/usr/lib/j*dk*) + KDE_JAVA_PREFIX(/opt/j*sdk*) + KDE_JAVA_PREFIX(/usr/lib/java*) + KDE_JAVA_PREFIX(/usr/java*) + KDE_JAVA_PREFIX(/usr/java/j*dk*) + KDE_JAVA_PREFIX(/usr/java/j*re*) + KDE_JAVA_PREFIX(/usr/lib/SunJava2*) + KDE_JAVA_PREFIX(/usr/lib/SunJava*) + KDE_JAVA_PREFIX(/usr/lib/IBMJava2*) + KDE_JAVA_PREFIX(/usr/lib/IBMJava*) + KDE_JAVA_PREFIX(/opt/java*) + + kde_cv_path="NONE" + kde_save_IFS=$IFS + IFS=':' + for dir in $PATH; do + if test -d "$dir"; then + javadirs="$javadirs $dir" + fi + done + IFS=$kde_save_IFS + jredirs= + + dnl Now javadirs contains a list of paths that exist, all ending with bin/ + for dir in $javadirs; do + dnl Check for the java executable + if test -x "$dir/java"; then + dnl And also check for a libjvm.so somewhere under there + dnl Since we have to go to the parent dir, /usr/bin is excluded, /usr is too big. + if test "$dir" != "/usr/bin"; then + libjvmdir=`find $dir/.. -name libjvm.so | sed 's,libjvm.so,,'|head -n 1` + if test ! -f $libjvmdir/libjvm.so; then continue; fi + jredirs="$jredirs $dir" + fi + fi + done + + dnl Now jredirs contains a reduced list, of paths where both java and ../**/libjvm.so was found + JAVAC= + JAVA= + kde_java_bindir=no + for dir in $jredirs; do + JAVA="$dir/java" + kde_java_bindir=$dir + if test -x "$dir/javac"; then + JAVAC="$dir/javac" + break + fi + done + + if test -n "$JAVAC"; then + dnl this substitution might not work - well, we test for jni.h below + kde_java_includedir=`echo $JAVAC | sed -e 's,bin/javac$,include/,'` + else + kde_java_includedir=no + fi + else + dnl config option set + kde_java_bindir=$ac_java_dir/bin + if test -x $ac_java_dir/bin/java && test ! -x $ac_java_dir/bin/javac; then + kde_java_includedir=no + else + kde_java_includedir=$ac_java_dir/include + fi + fi +fi + +dnl At this point kde_java_bindir and kde_java_includedir are either set or "no" +if test "x$kde_java_bindir" != "xno"; then + + dnl Look for libjvm.so + kde_java_libjvmdir=`find $kde_java_bindir/.. -name libjvm.so | sed 's,libjvm.so,,'|head -n 1` + dnl Look for libgcj.so + kde_java_libgcjdir=`find $kde_java_bindir/.. -name libgcj.so | sed 's,libgcj.so,,'|head -n 1` + dnl Look for libhpi.so and avoid green threads + kde_java_libhpidir=`find $kde_java_bindir/.. -name libhpi.so | grep -v green | sed 's,libhpi.so,,' | head -n 1` + + dnl Now check everything's fine under there + dnl the include dir is our flag for having the JDK + if test -d "$kde_java_includedir"; then + if test ! -x "$kde_java_bindir/javac"; then + AC_MSG_ERROR([javac not found under $kde_java_bindir - it seems you passed a wrong --with-java.]) + fi + if test ! -x "$kde_java_bindir/javah"; then + AC_MSG_ERROR([javah not found under $kde_java_bindir. javac was found though! Use --with-java or --without-java.]) + fi + if test ! -x "$kde_java_bindir/jar"; then + AC_MSG_ERROR([jar not found under $kde_java_bindir. javac was found though! Use --with-java or --without-java.]) + fi + if test ! -r "$kde_java_includedir/jni.h"; then + AC_MSG_ERROR([jni.h not found under $kde_java_includedir. Use --with-java or --without-java.]) + fi + + jni_includes="-I$kde_java_includedir" + dnl Strange thing, jni.h requires jni_md.h which is under genunix here.. + dnl and under linux here.. + + dnl not needed for gcj + + if test "x$kde_java_libgcjdir" = "x"; then + test -d "$kde_java_includedir/linux" && jni_includes="$jni_includes -I$kde_java_includedir/linux" + test -d "$kde_java_includedir/solaris" && jni_includes="$jni_includes -I$kde_java_includedir/solaris" + test -d "$kde_java_includedir/genunix" && jni_includes="$jni_includes -I$kde_java_includedir/genunix" + fi + + else + JAVAC= + jni_includes= + fi + + if test "x$kde_java_libgcjdir" = "x"; then + if test ! -r "$kde_java_libjvmdir/libjvm.so"; then + AC_MSG_ERROR([libjvm.so not found under $kde_java_libjvmdir. Use --without-java.]) + fi + else + if test ! -r "$kde_java_libgcjdir/libgcj.so"; then + AC_MSG_ERROR([libgcj.so not found under $kde_java_libgcjdir. Use --without-java.]) + fi + fi + + if test ! -x "$kde_java_bindir/java"; then + AC_MSG_ERROR([java not found under $kde_java_bindir. javac was found though! Use --with-java or --without-java.]) + fi + + dnl not needed for gcj compile + + if test "x$kde_java_libgcjdir" = "x"; then + if test ! -r "$kde_java_libhpidir/libhpi.so"; then + AC_MSG_ERROR([libhpi.so not found under $kde_java_libhpidir. Use --without-java.]) + fi + fi + + if test -n "$jni_includes"; then + dnl Check for JNI version + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + ac_cxxflags_safe="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS $all_includes $jni_includes" + + AC_TRY_COMPILE([ + #include + ], + [ + #ifndef JNI_VERSION_1_2 + Syntax Error + #endif + ],[ kde_jni_works=yes ], + [ kde_jni_works=no ]) + + if test $kde_jni_works = no; then + AC_MSG_ERROR([Incorrect version of $kde_java_includedir/jni.h. + You need to have Java Development Kit (JDK) version 1.2. + + Use --with-java to specify another location. + Use --without-java to configure without java support. + Or download a newer JDK and try again. + See e.g. http://java.sun.com/products/jdk/1.2 ]) + fi + + CXXFLAGS="$ac_cxxflags_safe" + AC_LANG_RESTORE + + dnl All tests ok, inform and subst the variables + + JAVAC=$kde_java_bindir/javac + JAVAH=$kde_java_bindir/javah + JAR=$kde_java_bindir/jar + AC_DEFINE_UNQUOTED(PATH_JAVA, "$kde_java_bindir/java", [Define where your java executable is]) + if test "x$kde_java_libgcjdir" = "x"; then + JVMLIBS="-L$kde_java_libjvmdir -ljvm -L$kde_java_libhpidir -lhpi" + else + JVMLIBS="-L$kde_java_libgcjdir -lgcj" + fi + AC_MSG_RESULT([java JDK in $kde_java_bindir]) + + else + AC_DEFINE_UNQUOTED(PATH_JAVA, "$kde_java_bindir/java", [Define where your java executable is]) + AC_MSG_RESULT([java JRE in $kde_java_bindir]) + fi +elif test -d "/Library/Java/Home"; then + kde_java_bindir="/Library/Java/Home/bin" + jni_includes="-I/Library/Java/Home/include" + + JAVAC=$kde_java_bindir/javac + JAVAH=$kde_java_bindir/javah + JAR=$kde_java_bindir/jar + JVMLIBS="-Wl,-framework,JavaVM" + + AC_DEFINE_UNQUOTED(PATH_JAVA, "$kde_java_bindir/java", [Define where your java executable is]) + AC_MSG_RESULT([Apple Java Framework]) +else + AC_MSG_RESULT([none found]) +fi + +AC_SUBST(JAVAC) +AC_SUBST(JAVAH) +AC_SUBST(JAR) +AC_SUBST(JVMLIBS) +AC_SUBST(jni_includes) + +# for backward compat +kde_cv_java_includedir=$kde_java_includedir +kde_cv_java_bindir=$kde_java_bindir +]) + +dnl this is a redefinition of autoconf 2.5x's AC_FOREACH. +dnl When the argument list becomes big, as in KDE for AC_OUTPUT in +dnl big packages, m4_foreach is dog-slow. So use our own version of +dnl it. (matz@kde.org) +m4_define([mm_foreach], +[m4_pushdef([$1])_mm_foreach($@)m4_popdef([$1])]) +m4_define([mm_car], [[$1]]) +m4_define([mm_car2], [[$@]]) +m4_define([_mm_foreach], +[m4_if(m4_quote($2), [], [], + [m4_define([$1], mm_car($2))$3[]_mm_foreach([$1], + mm_car2(m4_shift($2)), + [$3])])]) +m4_define([AC_FOREACH], +[mm_foreach([$1], m4_split(m4_normalize([$2])), [$3])]) + +AC_DEFUN([KDE_NEED_FLEX], +[ +kde_libs_safe=$LIBS +LIBS="$LIBS $USER_LDFLAGS" +AM_PROG_LEX +LIBS=$kde_libs_safe +if test -z "$LEXLIB"; then + AC_MSG_ERROR([You need to have flex installed.]) +fi +AC_SUBST(LEXLIB) +]) + +AC_DEFUN([AC_PATH_QTOPIA], +[ + dnl TODO: use AC_CACHE_VAL + + if test -z "$1"; then + qtopia_minver_maj=1 + qtopia_minver_min=5 + qtopia_minver_pat=0 + else + qtopia_minver_maj=`echo "$1" | sed -e "s/^\(.*\)\..*\..*$/\1/"` + qtopia_minver_min=`echo "$1" | sed -e "s/^.*\.\(.*\)\..*$/\1/"` + qtopia_minver_pat=`echo "$1" | sed -e "s/^.*\..*\.\(.*\)$/\1/"` + fi + + qtopia_minver="$qtopia_minver_maj$qtopia_minver_min$qtopia_minver_pat" + qtopia_minverstr="$qtopia_minver_maj.$qtopia_minver_min.$qtopia_minver_pat" + + AC_REQUIRE([AC_PATH_QT]) + + AC_MSG_CHECKING([for Qtopia]) + + LIB_QTOPIA="-lqpe" + AC_SUBST(LIB_QTOPIA) + + kde_qtopia_dirs="$QPEDIR /opt/Qtopia" + + ac_qtopia_incdir=NO + + AC_ARG_WITH(qtopia-dir, + AC_HELP_STRING([--with-qtopia-dir=DIR],[where the root of Qtopia is installed]), + [ ac_qtopia_incdir="$withval"/include] ) + + qtopia_incdirs="" + for dir in $kde_qtopia_dirs; do + qtopia_incdirs="$qtopia_incdirs $dir/include" + done + + if test ! "$ac_qtopia_incdir" = "NO"; then + qtopia_incdirs="$ac_qtopia_incdir $qtopia_incdirs" + fi + + qtopia_incdir="" + AC_FIND_FILE(qpe/qpeapplication.h, $qtopia_incdirs, qtopia_incdir) + ac_qtopia_incdir="$qtopia_incdir" + + if test -z "$qtopia_incdir"; then + AC_MSG_ERROR([Cannot find Qtopia headers. Please check your installation.]) + fi + + qtopia_ver_maj=`cat $qtopia_incdir/qpe/version.h | sed -n -e 's,.*QPE_VERSION "\(.*\)\..*\..*".*,\1,p'`; + qtopia_ver_min=`cat $qtopia_incdir/qpe/version.h | sed -n -e 's,.*QPE_VERSION ".*\.\(.*\)\..*".*,\1,p'`; + qtopia_ver_pat=`cat $qtopia_incdir/qpe/version.h | sed -n -e 's,.*QPE_VERSION ".*\..*\.\(.*\)".*,\1,p'`; + + qtopia_ver="$qtopia_ver_maj$qtopia_ver_min$qtopia_ver_pat" + qtopia_verstr="$qtopia_ver_maj.$qtopia_ver_min.$qtopia_ver_pat" + if test "$qtopia_ver" -lt "$qtopia_minver"; then + AC_MSG_ERROR([found Qtopia version $qtopia_verstr but version $qtopia_minverstr +is required.]) + fi + + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + + ac_cxxflags_safe="$CXXFLAGS" + ac_ldflags_safe="$LDFLAGS" + ac_libs_safe="$LIBS" + + CXXFLAGS="$CXXFLAGS -I$qtopia_incdir $all_includes" + LDFLAGS="$LDFLAGS $QT_LDFLAGS $all_libraries $USER_LDFLAGS $KDE_MT_LDFLAGS" + LIBS="$LIBS $LIB_QTOPIA $LIBQT" + + cat > conftest.$ac_ext < +#include + +int main( int argc, char **argv ) +{ + QPEApplication app( argc, argv ); + return 0; +} +EOF + + if AC_TRY_EVAL(ac_link) && test -s conftest; then + rm -f conftest* + else + rm -f conftest* + AC_MSG_ERROR([Cannot link small Qtopia Application. For more details look at +the end of config.log]) + fi + + CXXFLAGS="$ac_cxxflags_safe" + LDFLAGS="$ac_ldflags_safe" + LIBS="$ac_libs_safe" + + AC_LANG_RESTORE + + QTOPIA_INCLUDES="-I$qtopia_incdir" + AC_SUBST(QTOPIA_INCLUDES) + + AC_MSG_RESULT([found version $qtopia_verstr with headers at $qtopia_incdir]) +]) + + +AC_DEFUN([KDE_INIT_DOXYGEN], +[ +AC_MSG_CHECKING([for Qt docs]) +kde_qtdir= +if test "${with_qt_dir+set}" = set; then + kde_qtdir="$with_qt_dir" +fi + +AC_FIND_FILE(qsql.html, [ $kde_qtdir/doc/html $QTDIR/doc/html /usr/share/doc/packages/qt3/html /usr/lib/qt/doc /usr/lib/qt3/doc /usr/lib/qt3/doc/html /usr/doc/qt3/html /usr/doc/qt3 /usr/share/doc/qt3-doc /usr/share/qt3/doc/html /usr/X11R6/share/doc/qt/html ], QTDOCDIR) +AC_MSG_RESULT($QTDOCDIR) + +AC_SUBST(QTDOCDIR) + +KDE_FIND_PATH(dot, DOT, [], []) +if test -n "$DOT"; then + KDE_HAVE_DOT="YES" +else + KDE_HAVE_DOT="NO" +fi +AC_SUBST(KDE_HAVE_DOT) +KDE_FIND_PATH(doxygen, DOXYGEN, [], []) +AC_SUBST(DOXYGEN) + +DOXYGEN_PROJECT_NAME="$1" +DOXYGEN_PROJECT_NUMBER="$2" +AC_SUBST(DOXYGEN_PROJECT_NAME) +AC_SUBST(DOXYGEN_PROJECT_NUMBER) + +KDE_HAS_DOXYGEN=no +if test -n "$DOXYGEN" && test -x "$DOXYGEN" && test -f $QTDOCDIR/qsql.html; then + KDE_HAS_DOXYGEN=yes +fi +AC_SUBST(KDE_HAS_DOXYGEN) + +]) + + +AC_DEFUN([AC_FIND_BZIP2], +[ +AC_MSG_CHECKING([for bzDecompress in libbz2]) +AC_CACHE_VAL(ac_cv_lib_bzip2, +[ +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +kde_save_LIBS="$LIBS" +LIBS="$all_libraries $USER_LDFLAGS -lbz2 $LIBSOCKET" +kde_save_CXXFLAGS="$CXXFLAGS" +CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES" +AC_TRY_LINK(dnl +[ +#define BZ_NO_STDIO +#include +], + [ bz_stream s; (void) bzDecompress(&s); ], + eval "ac_cv_lib_bzip2='-lbz2'", + eval "ac_cv_lib_bzip2=no") +LIBS="$kde_save_LIBS" +CXXFLAGS="$kde_save_CXXFLAGS" +AC_LANG_RESTORE +])dnl +AC_MSG_RESULT($ac_cv_lib_bzip2) + +if test ! "$ac_cv_lib_bzip2" = no; then + BZIP2DIR=bzip2 + + LIBBZ2="$ac_cv_lib_bzip2" + AC_SUBST(LIBBZ2) + +else + + cxx_shared_flag= + ld_shared_flag= + KDE_CHECK_COMPILER_FLAG(shared, [ + ld_shared_flag="-shared" + ]) + KDE_CHECK_COMPILER_FLAG(fPIC, [ + cxx_shared_flag="-fPIC" + ]) + + AC_MSG_CHECKING([for BZ2_bzDecompress in (shared) libbz2]) + AC_CACHE_VAL(ac_cv_lib_bzip2_prefix, + [ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + kde_save_LIBS="$LIBS" + LIBS="$all_libraries $USER_LDFLAGS $ld_shared_flag -lbz2 $LIBSOCKET" + kde_save_CXXFLAGS="$CXXFLAGS" + CXXFLAGS="$CFLAGS $cxx_shared_flag $all_includes $USER_INCLUDES" + + AC_TRY_LINK(dnl + [ + #define BZ_NO_STDIO + #include + ], + [ bz_stream s; (void) BZ2_bzDecompress(&s); ], + eval "ac_cv_lib_bzip2_prefix='-lbz2'", + eval "ac_cv_lib_bzip2_prefix=no") + LIBS="$kde_save_LIBS" + CXXFLAGS="$kde_save_CXXFLAGS" + AC_LANG_RESTORE + ])dnl + + AC_MSG_RESULT($ac_cv_lib_bzip2_prefix) + + if test ! "$ac_cv_lib_bzip2_prefix" = no; then + BZIP2DIR=bzip2 + + LIBBZ2="$ac_cv_lib_bzip2_prefix" + AC_SUBST(LIBBZ2) + + AC_DEFINE(NEED_BZ2_PREFIX, 1, [Define if the libbz2 functions need the BZ2_ prefix]) + dnl else, we just ignore this + fi + +fi +AM_CONDITIONAL(include_BZIP2, test -n "$BZIP2DIR") +]) + +dnl ------------------------------------------------------------------------ +dnl Try to find the SSL headers and libraries. +dnl $(SSL_LDFLAGS) will be -Lsslliblocation (if needed) +dnl and $(SSL_INCLUDES) will be -Isslhdrlocation (if needed) +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([KDE_CHECK_SSL], +[ +LIBSSL="-lssl -lcrypto" +AC_REQUIRE([KDE_CHECK_LIB64]) + +ac_ssl_includes=NO ac_ssl_libraries=NO +ssl_libraries="" +ssl_includes="" +AC_ARG_WITH(ssl-dir, + AC_HELP_STRING([--with-ssl-dir=DIR],[where the root of OpenSSL is installed]), + [ ac_ssl_includes="$withval"/include + ac_ssl_libraries="$withval"/lib$kdelibsuff + ]) + +want_ssl=yes +AC_ARG_WITH(ssl, + AC_HELP_STRING([--without-ssl],[disable SSL checks]), + [want_ssl=$withval]) + +if test $want_ssl = yes; then + +AC_MSG_CHECKING(for OpenSSL) + +AC_CACHE_VAL(ac_cv_have_ssl, +[#try to guess OpenSSL locations + + ssl_incdirs="/usr/include /usr/local/include /usr/ssl/include /usr/local/ssl/include $prefix/include $kde_extra_includes" + ssl_incdirs="$ac_ssl_includes $ssl_incdirs" + AC_FIND_FILE(openssl/ssl.h, $ssl_incdirs, ssl_incdir) + ac_ssl_includes="$ssl_incdir" + + ssl_libdirs="/usr/lib$kdelibsuff /usr/local/lib$kdelibsuff /usr/ssl/lib$kdelibsuff /usr/local/ssl/lib$kdelibsuff $libdir $prefix/lib$kdelibsuff $exec_prefix/lib$kdelibsuff $kde_extra_libs" + if test ! "$ac_ssl_libraries" = "NO"; then + ssl_libdirs="$ac_ssl_libraries $ssl_libdirs" + fi + + test=NONE + ssl_libdir=NONE + for dir in $ssl_libdirs; do + try="ls -1 $dir/libssl*" + if test=`eval $try 2> /dev/null`; then ssl_libdir=$dir; break; else echo "tried $dir" >&AC_FD_CC ; fi + done + + ac_ssl_libraries="$ssl_libdir" + + ac_ldflags_safe="$LDFLAGS" + ac_libs_safe="$LIBS" + + LDFLAGS="$LDFLAGS -L$ssl_libdir $all_libraries" + LIBS="$LIBS $LIBSSL -lRSAglue -lrsaref" + + AC_TRY_LINK(,void RSAPrivateEncrypt(void);RSAPrivateEncrypt();, + ac_ssl_rsaref="yes" + , + ac_ssl_rsaref="no" + ) + + LDFLAGS="$ac_ldflags_safe" + LIBS="$ac_libs_safe" + + if test "$ac_ssl_includes" = NO || test "$ac_ssl_libraries" = NO; then + have_ssl=no + else + have_ssl=yes; + fi + + ]) + + eval "$ac_cv_have_ssl" + + AC_MSG_RESULT([libraries $ac_ssl_libraries, headers $ac_ssl_includes]) + + AC_MSG_CHECKING([whether OpenSSL uses rsaref]) + AC_MSG_RESULT($ac_ssl_rsaref) + + AC_MSG_CHECKING([for easter eggs]) + AC_MSG_RESULT([none found]) + +else + have_ssl=no +fi + +if test "$have_ssl" = yes; then + AC_MSG_CHECKING(for OpenSSL version) + dnl Check for SSL version + AC_CACHE_VAL(ac_cv_ssl_version, + [ + + cat >conftest.$ac_ext < +#include + int main() { + +#ifndef OPENSSL_VERSION_NUMBER + printf("ssl_version=\\"error\\"\n"); +#else + if (OPENSSL_VERSION_NUMBER < 0x00906000) + printf("ssl_version=\\"old\\"\n"); + else + printf("ssl_version=\\"ok\\"\n"); +#endif + return (0); + } +EOF + + ac_save_CPPFLAGS=$CPPFLAGS + if test "$ac_ssl_includes" != "/usr/include"; then + CPPFLAGS="$CPPFLAGS -I$ac_ssl_includes" + fi + + if AC_TRY_EVAL(ac_link); then + + if eval `./conftest 2>&5`; then + if test $ssl_version = error; then + AC_MSG_ERROR([$ssl_incdir/openssl/opensslv.h doesn't define OPENSSL_VERSION_NUMBER !]) + else + if test $ssl_version = old; then + AC_MSG_WARN([OpenSSL version too old. Upgrade to 0.9.6 at least, see http://www.openssl.org. SSL support disabled.]) + have_ssl=no + fi + fi + ac_cv_ssl_version="ssl_version=$ssl_version" + else + AC_MSG_ERROR([Your system couldn't run a small SSL test program. + Check config.log, and if you can't figure it out, send a mail to + David Faure , attaching your config.log]) + fi + + else + AC_MSG_ERROR([Your system couldn't link a small SSL test program. + Check config.log, and if you can't figure it out, send a mail to + David Faure , attaching your config.log]) + fi + CPPFLAGS=$ac_save_CPPFLAGS + + ]) + + eval "$ac_cv_ssl_version" + AC_MSG_RESULT($ssl_version) +fi + +if test "$have_ssl" != yes; then + LIBSSL=""; +else + AC_DEFINE(HAVE_SSL, 1, [If we are going to use OpenSSL]) + ac_cv_have_ssl="have_ssl=yes \ + ac_ssl_includes=$ac_ssl_includes ac_ssl_libraries=$ac_ssl_libraries ac_ssl_rsaref=$ac_ssl_rsaref" + + + ssl_libraries="$ac_ssl_libraries" + ssl_includes="$ac_ssl_includes" + + if test "$ac_ssl_rsaref" = yes; then + LIBSSL="-lssl -lcrypto -lRSAglue -lrsaref" + fi + + if test $ssl_version = "old"; then + AC_DEFINE(HAVE_OLD_SSL_API, 1, [Define if you have OpenSSL < 0.9.6]) + fi +fi + +SSL_INCLUDES= + +if test "$ssl_includes" = "/usr/include"; then + if test -f /usr/kerberos/include/krb5.h; then + SSL_INCLUDES="-I/usr/kerberos/include" + fi +elif test "$ssl_includes" != "/usr/local/include" && test -n "$ssl_includes"; then + SSL_INCLUDES="-I$ssl_includes" +fi + +if test "$ssl_libraries" = "/usr/lib" || test "$ssl_libraries" = "/usr/local/lib" || test -z "$ssl_libraries" || test "$ssl_libraries" = "NONE"; then + SSL_LDFLAGS="" +else + SSL_LDFLAGS="-L$ssl_libraries -R$ssl_libraries" +fi + +AC_SUBST(SSL_INCLUDES) +AC_SUBST(SSL_LDFLAGS) +AC_SUBST(LIBSSL) +]) + +AC_DEFUN([KDE_CHECK_STRLCPY], +[ + AC_REQUIRE([AC_CHECK_STRLCAT]) + AC_REQUIRE([AC_CHECK_STRLCPY]) + AC_CHECK_SIZEOF(size_t) + AC_CHECK_SIZEOF(unsigned long) + + AC_MSG_CHECKING([sizeof size_t == sizeof unsigned long]) + AC_TRY_COMPILE(,[ + #if SIZEOF_SIZE_T != SIZEOF_UNSIGNED_LONG + choke me + #endif + ],AC_MSG_RESULT([yes]),[ + AC_MSG_RESULT(no) + AC_MSG_ERROR([ + Apparently on your system our assumption sizeof size_t == sizeof unsigned long + does not apply. Please mail kde-devel@kde.org with a description of your system! + ]) + ]) +]) + +AC_DEFUN([KDE_CHECK_BINUTILS], +[ + AC_MSG_CHECKING([if ld supports unversioned version maps]) + + kde_save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -Wl,--version-script=conftest.map" + echo "{ local: extern \"C++\" { foo }; };" > conftest.map + AC_TRY_LINK([int foo;], +[ +#ifdef __INTEL_COMPILER +icc apparently does not support libtools version-info and version-script +at the same time. Dunno where the bug is, but until somebody figured out, +better disable the optional version scripts. +#endif + + foo = 42; +], kde_supports_versionmaps=yes, kde_supports_versionmaps=no) + LDFLAGS="$kde_save_LDFLAGS" + rm -f conftest.map + AM_CONDITIONAL(include_VERSION_SCRIPT, + [test "$kde_supports_versionmaps" = "yes" && test "$kde_use_debug_code" = "no"]) + + AC_MSG_RESULT($kde_supports_versionmaps) +]) + +AC_DEFUN([AM_PROG_OBJC],[ +AC_CHECK_PROGS(OBJC, gcc, gcc) +test -z "$OBJC" && AC_MSG_ERROR([no acceptable objective-c gcc found in \$PATH]) +if test "x${OBJCFLAGS-unset}" = xunset; then + OBJCFLAGS="-g -O2" +fi +AC_SUBST(OBJCFLAGS) +_AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES(OBJC)]) +]) + +AC_DEFUN([KDE_CHECK_PERL], +[ + KDE_FIND_PATH(perl, PERL, [$bindir $exec_prefix/bin $prefix/bin], [ + AC_MSG_ERROR([No Perl found in your $PATH. +We need perl to generate some code.]) + ]) + AC_SUBST(PERL) +]) + +AC_DEFUN([KDE_CHECK_LARGEFILE], +[ +AC_SYS_LARGEFILE +if test "$ac_cv_sys_file_offset_bits" != no; then + CPPFLAGS="$CPPFLAGS -D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits" +fi + +if test "x$ac_cv_sys_large_files" != "xno"; then + CPPFLAGS="$CPPFLAGS -D_LARGE_FILES=1" +fi + +]) + +dnl A small extension to PKG_CHECK_MODULES (defined in pkg.m4.in) +dnl which allows to search for libs that get installed into the KDE prefix. +dnl +dnl Syntax: KDE_PKG_CHECK_MODULES(KSTUFF, libkexif >= 0.2 glib = 1.3.4, action-if, action-not) +dnl defines KSTUFF_LIBS, KSTUFF_CFLAGS, see pkg-config man page +dnl also defines KSTUFF_PKG_ERRORS on error +AC_DEFUN([KDE_PKG_CHECK_MODULES], [ + + PKG_CONFIG_PATH="$prefix/lib${kdelibsuff}/pkgconfig:$PKG_CONFIG_PATH" + if test "$prefix" != "$kde_libs_prefix"; then + PKG_CONFIG_PATH="$kde_libs_prefix/lib${kdelibsuff}/pkgconfig:$PKG_CONFIG_PATH" + fi + export PKG_CONFIG_PATH + PKG_CHECK_MODULES([$1],[$2],[$3],[$4]) +]) + + +dnl Check for PIE support in the compiler and linker +AC_DEFUN([KDE_CHECK_PIE_SUPPORT], +[ + AC_CACHE_CHECK([for PIE support], kde_cv_val_pie_support, + [ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + safe_CXXFLAGS=$CXXFLAGS + safe_LDFLAGS=$LDFLAGS + CXXFLAGS="$CXXFLAGS -fPIE" + LDFLAGS="$LDFLAGS -pie" + + AC_TRY_LINK([int foo;], [], [kde_cv_val_pie_support=yes], [kde_cv_val_pie_support=no]) + + CXXFLAGS=$safe_CXXFLAGS + LDFLAGS=$safe_LDFLAGS + AC_LANG_RESTORE + ]) + + AC_MSG_CHECKING(if enabling -pie/fPIE support) + + AC_ARG_ENABLE(pie, + AC_HELP_STRING([--enable-pie],[platform supports PIE linking [default=detect]]), + [kde_has_pie_support=$enableval], + [kde_has_pie_support=detect]) + + if test "$kde_has_pie_support" = "detect"; then + kde_has_pie_support=$kde_cv_val_pie_support + fi + + AC_MSG_RESULT([$kde_has_pie_support]) + + KDE_USE_FPIE="" + KDE_USE_PIE="" + + AC_SUBST([KDE_USE_FPIE]) + AC_SUBST([KDE_USE_PIE]) + + if test "$kde_has_pie_support" = "yes"; then + KDE_USE_FPIE="-fPIE" + KDE_USE_PIE="-pie" + fi +]) +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- + +# serial 48 Debian 1.5.22-4 AC_PROG_LIBTOOL + + +# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) +# ----------------------------------------------------------- +# If this macro is not defined by Autoconf, define it here. +m4_ifdef([AC_PROVIDE_IFELSE], + [], + [m4_define([AC_PROVIDE_IFELSE], + [m4_ifdef([AC_PROVIDE_$1], + [$2], [$3])])]) + + +# AC_PROG_LIBTOOL +# --------------- +AC_DEFUN([AC_PROG_LIBTOOL], +[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl +dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX +dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. + AC_PROVIDE_IFELSE([AC_PROG_CXX], + [AC_LIBTOOL_CXX], + [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX + ])]) +dnl And a similar setup for Fortran 77 support + AC_PROVIDE_IFELSE([AC_PROG_F77], + [AC_LIBTOOL_F77], + [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77 +])]) + +dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. +dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run +dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. + AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [ifdef([AC_PROG_GCJ], + [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([A][M_PROG_GCJ], + [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([LT_AC_PROG_GCJ], + [define([LT_AC_PROG_GCJ], + defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) +])])# AC_PROG_LIBTOOL + + +# _AC_PROG_LIBTOOL +# ---------------- +AC_DEFUN([_AC_PROG_LIBTOOL], +[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl +AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl +AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl +AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +# Prevent multiple expansion +define([AC_PROG_LIBTOOL], []) +])# _AC_PROG_LIBTOOL + + +# AC_LIBTOOL_SETUP +# ---------------- +AC_DEFUN([AC_LIBTOOL_SETUP], +[AC_PREREQ(2.50)dnl +AC_REQUIRE([AC_ENABLE_SHARED])dnl +AC_REQUIRE([AC_ENABLE_STATIC])dnl +AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_LD])dnl +AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl +AC_REQUIRE([AC_PROG_NM])dnl + +AC_REQUIRE([AC_PROG_LN_S])dnl +AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl +# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! +AC_REQUIRE([AC_OBJEXT])dnl +AC_REQUIRE([AC_EXEEXT])dnl +dnl + +AC_LIBTOOL_SYS_MAX_CMD_LEN +AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +AC_LIBTOOL_OBJDIR + +AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +_LT_AC_PROG_ECHO_BACKSLASH + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e 1s/^X//' +[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] + +# Same as above, but do not quote variable references. +[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'] + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" + +AC_CHECK_TOOL(AR, ar, false) +AC_CHECK_TOOL(RANLIB, ranlib, :) +AC_CHECK_TOOL(STRIP, strip, :) + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$SED" && SED=sed +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + AC_PATH_MAGIC + fi + ;; +esac + +AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +enable_win32_dll=yes, enable_win32_dll=no) + +AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +AC_ARG_WITH([pic], + [AC_HELP_STRING([--with-pic], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [pic_mode="$withval"], + [pic_mode=default]) +test -z "$pic_mode" && pic_mode=default + +# Use C for the default configuration in the libtool script +tagname= +AC_LIBTOOL_LANG_C_CONFIG +_LT_AC_TAGCONFIG +])# AC_LIBTOOL_SETUP + + +# _LT_AC_SYS_COMPILER +# ------------------- +AC_DEFUN([_LT_AC_SYS_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_AC_SYS_COMPILER + + +# _LT_CC_BASENAME(CC) +# ------------------- +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +AC_DEFUN([_LT_CC_BASENAME], +[for cc_temp in $1""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` +]) + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +AC_DEFUN([_LT_COMPILER_BOILERPLATE], +[ac_outfile=conftest.$ac_objext +printf "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$rm conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +AC_DEFUN([_LT_LINKER_BOILERPLATE], +[ac_outfile=conftest.$ac_objext +printf "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$rm conftest* +])# _LT_LINKER_BOILERPLATE + + +# _LT_AC_SYS_LIBPATH_AIX +# ---------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], +[AC_LINK_IFELSE(AC_LANG_PROGRAM,[ +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi],[]) +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi +])# _LT_AC_SYS_LIBPATH_AIX + + +# _LT_AC_SHELL_INIT(ARG) +# ---------------------- +AC_DEFUN([_LT_AC_SHELL_INIT], +[ifdef([AC_DIVERSION_NOTICE], + [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) +$1 +AC_DIVERT_POP +])# _LT_AC_SHELL_INIT + + +# _LT_AC_PROG_ECHO_BACKSLASH +# -------------------------- +# Add some code to the start of the generated configure script which +# will find an echo command which doesn't interpret backslashes. +AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], +[_LT_AC_SHELL_INIT([ +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` + ;; +esac + +echo=${ECHO-echo} +if test "X[$]1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X[$]1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then + # Yippee, $echo works! + : +else + # Restart under the correct shell. + exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} +fi + +if test "X[$]1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null 2>&1 && unset CDPATH + +if test -z "$ECHO"; then +if test "X${echo_test_string+set}" != Xset; then +# find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if (echo_test_string=`eval $cmd`) 2>/dev/null && + echo_test_string=`eval $cmd` && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : +else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} + else + # Try using printf. + echo='printf %s\n' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL [$]0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$CONFIG_SHELL [$]0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "[$]0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +ECHO=$echo +if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then + ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" +fi + +AC_SUBST(ECHO) +])])# _LT_AC_PROG_ECHO_BACKSLASH + + +# _LT_AC_LOCK +# ----------- +AC_DEFUN([_LT_AC_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +sparc*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) LD="${LD-ld} -64" ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +[*-*-cygwin* | *-*-mingw* | *-*-pw32*) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; + ]) +esac + +need_locks="$enable_libtool_lock" + +])# _LT_AC_LOCK + + +# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], +[AC_REQUIRE([LT_AC_PROG_SED]) +AC_CACHE_CHECK([$1], [$2], + [$2=no + ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $rm conftest* +]) + +if test x"[$]$2" = xyes; then + ifelse([$5], , :, [$5]) +else + ifelse([$6], , :, [$6]) +fi +])# AC_LIBTOOL_COMPILER_OPTION + + +# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ------------------------------------------------------------ +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], +[AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + printf "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $rm conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + ifelse([$4], , :, [$4]) +else + ifelse([$5], , :, [$5]) +fi +])# AC_LIBTOOL_LINKER_OPTION + + +# AC_LIBTOOL_SYS_MAX_CMD_LEN +# -------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], +[# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \ + = "XX$teststring") >/dev/null 2>&1 && + new_result=`expr "X$teststring" : ".*" 2>&1` && + lt_cv_sys_max_cmd_len=$new_result && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + teststring= + # Add a significant safety factor because C++ compilers can tack on massive + # amounts of additional arguments before passing them to the linker. + # It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +])# AC_LIBTOOL_SYS_MAX_CMD_LEN + + +# _LT_AC_CHECK_DLFCN +# ------------------ +AC_DEFUN([_LT_AC_CHECK_DLFCN], +[AC_CHECK_HEADERS(dlfcn.h)dnl +])# _LT_AC_CHECK_DLFCN + + +# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# --------------------------------------------------------------------- +AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + else + puts (dlerror ()); + + exit (status); +}] +EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_AC_TRY_DLOPEN_SELF + + +# AC_LIBTOOL_DLOPEN_SELF +# ---------------------- +AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +])# AC_LIBTOOL_DLOPEN_SELF + + +# AC_LIBTOOL_PROG_CC_C_O([TAGNAME]) +# --------------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler +AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O], +[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* +]) +])# AC_LIBTOOL_PROG_CC_C_O + + +# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) +# ----------------------------------------- +# Check to see if we can do hard links to lock some files if needed +AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], +[AC_REQUIRE([_LT_AC_LOCK])dnl + +hard_links="nottested" +if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS + + +# AC_LIBTOOL_OBJDIR +# ----------------- +AC_DEFUN([AC_LIBTOOL_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +])# AC_LIBTOOL_OBJDIR + + +# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) +# ---------------------------------------------- +# Check hardcoding attributes. +AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_AC_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ + test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \ + test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_AC_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_AC_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_AC_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH + + +# AC_LIBTOOL_SYS_LIB_STRIP +# ------------------------ +AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP], +[striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) +fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +])# AC_LIBTOOL_SYS_LIB_STRIP + + +# AC_LIBTOOL_SYS_DYNAMIC_LINKER +# ----------------------------- +# PORTME Fill in your ld.so characteristics +AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], +[AC_MSG_CHECKING([dynamic linker characteristics]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[123]]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + freebsd*) # from 4.6 on + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix3*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi +])# AC_LIBTOOL_SYS_DYNAMIC_LINKER + + +# _LT_AC_TAGCONFIG +# ---------------- +AC_DEFUN([_LT_AC_TAGCONFIG], +[AC_ARG_WITH([tags], + [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@], + [include additional configurations @<:@automatic@:>@])], + [tagnames="$withval"]) + +if test -f "$ltmain" && test -n "$tagnames"; then + if test ! -f "${ofile}"; then + AC_MSG_WARN([output file `$ofile' does not exist]) + fi + + if test -z "$LTCC"; then + eval "`$SHELL ${ofile} --config | grep '^LTCC='`" + if test -z "$LTCC"; then + AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) + else + AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) + fi + fi + if test -z "$LTCFLAGS"; then + eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`" + fi + + # Extract list of available tagged configurations in $ofile. + # Note that this assumes the entire list is on one line. + available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` + + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for tagname in $tagnames; do + IFS="$lt_save_ifs" + # Check whether tagname contains only valid characters + case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in + "") ;; + *) AC_MSG_ERROR([invalid tag name: $tagname]) + ;; + esac + + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null + then + AC_MSG_ERROR([tag name \"$tagname\" already exists]) + fi + + # Update the list of available tags. + if test -n "$tagname"; then + echo appending configuration tag \"$tagname\" to $ofile + + case $tagname in + CXX) + if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_LIBTOOL_LANG_CXX_CONFIG + else + tagname="" + fi + ;; + + F77) + if test -n "$F77" && test "X$F77" != "Xno"; then + AC_LIBTOOL_LANG_F77_CONFIG + else + tagname="" + fi + ;; + + GCJ) + if test -n "$GCJ" && test "X$GCJ" != "Xno"; then + AC_LIBTOOL_LANG_GCJ_CONFIG + else + tagname="" + fi + ;; + + RC) + AC_LIBTOOL_LANG_RC_CONFIG + ;; + + *) + AC_MSG_ERROR([Unsupported tag name: $tagname]) + ;; + esac + + # Append the new tag name to the list of available tags. + if test -n "$tagname" ; then + available_tags="$available_tags $tagname" + fi + fi + done + IFS="$lt_save_ifs" + + # Now substitute the updated list of available tags. + if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then + mv "${ofile}T" "$ofile" + chmod +x "$ofile" + else + rm -f "${ofile}T" + AC_MSG_ERROR([unable to update list of available tagged configurations.]) + fi +fi +])# _LT_AC_TAGCONFIG + + +# AC_LIBTOOL_DLOPEN +# ----------------- +# enable checks for dlopen support +AC_DEFUN([AC_LIBTOOL_DLOPEN], + [AC_BEFORE([$0],[AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_DLOPEN + + +# AC_LIBTOOL_WIN32_DLL +# -------------------- +# declare package support for building win32 DLLs +AC_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_WIN32_DLL + + +# AC_ENABLE_SHARED([DEFAULT]) +# --------------------------- +# implement the --enable-shared flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_SHARED], +[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([shared], + [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]AC_ENABLE_SHARED_DEFAULT) +])# AC_ENABLE_SHARED + + +# AC_DISABLE_SHARED +# ----------------- +# set the default shared flag to --disable-shared +AC_DEFUN([AC_DISABLE_SHARED], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_SHARED(no) +])# AC_DISABLE_SHARED + + +# AC_ENABLE_STATIC([DEFAULT]) +# --------------------------- +# implement the --enable-static flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_STATIC], +[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([static], + [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]AC_ENABLE_STATIC_DEFAULT) +])# AC_ENABLE_STATIC + + +# AC_DISABLE_STATIC +# ----------------- +# set the default static flag to --disable-static +AC_DEFUN([AC_DISABLE_STATIC], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_STATIC(no) +])# AC_DISABLE_STATIC + + +# AC_ENABLE_FAST_INSTALL([DEFAULT]) +# --------------------------------- +# implement the --enable-fast-install flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_FAST_INSTALL], +[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([fast-install], + [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT) +])# AC_ENABLE_FAST_INSTALL + + +# AC_DISABLE_FAST_INSTALL +# ----------------------- +# set the default to --disable-fast-install +AC_DEFUN([AC_DISABLE_FAST_INSTALL], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_FAST_INSTALL(no) +])# AC_DISABLE_FAST_INSTALL + + +# AC_LIBTOOL_PICMODE([MODE]) +# -------------------------- +# implement the --with-pic flag +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +AC_DEFUN([AC_LIBTOOL_PICMODE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +pic_mode=ifelse($#,1,$1,default) +])# AC_LIBTOOL_PICMODE + + +# AC_PROG_EGREP +# ------------- +# This is predefined starting with Autoconf 2.54, so this conditional +# definition can be removed once we require Autoconf 2.54 or later. +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP], +[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], + [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi]) + EGREP=$ac_cv_prog_egrep + AC_SUBST([EGREP]) +])]) + + +# AC_PATH_TOOL_PREFIX +# ------------------- +# find a file program which can recognise shared library +AC_DEFUN([AC_PATH_TOOL_PREFIX], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="ifelse([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +])# AC_PATH_TOOL_PREFIX + + +# AC_PATH_MAGIC +# ------------- +# find a file program which can recognise a shared library +AC_DEFUN([AC_PATH_MAGIC], +[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# AC_PATH_MAGIC + + +# AC_PROG_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([AC_PROG_LD], +[AC_ARG_WITH([gnu-ld], + [AC_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no]) +AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix3*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +nto-qnx*) + lt_cv_deplibs_check_method=unknown + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown +])# AC_DEPLIBS_CHECK_METHOD + + +# AC_PROG_NM +# ---------- +# find the pathname to a BSD-compatible name lister +AC_DEFUN([AC_PROG_NM], +[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi]) +NM="$lt_cv_path_NM" +])# AC_PROG_NM + + +# AC_CHECK_LIBM +# ------------- +# check for math library +AC_DEFUN([AC_CHECK_LIBM], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +])# AC_CHECK_LIBM + + +# AC_LIBLTDL_CONVENIENCE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl convenience library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-convenience to the configure arguments. Note that +# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided, +# it is assumed to be `libltdl'. LIBLTDL will be prefixed with +# '${top_builddir}/' and LTDLINCL will be prefixed with '${top_srcdir}/' +# (note the single quotes!). If your package is not flat and you're not +# using automake, define top_builddir and top_srcdir appropriately in +# the Makefiles. +AC_DEFUN([AC_LIBLTDL_CONVENIENCE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + case $enable_ltdl_convenience in + no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; + "") enable_ltdl_convenience=yes + ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; + esac + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_CONVENIENCE + + +# AC_LIBLTDL_INSTALLABLE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl installable library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-install to the configure arguments. Note that +# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided, +# and an installed libltdl is not found, it is assumed to be `libltdl'. +# LIBLTDL will be prefixed with '${top_builddir}/'# and LTDLINCL with +# '${top_srcdir}/' (note the single quotes!). If your package is not +# flat and you're not using automake, define top_builddir and top_srcdir +# appropriately in the Makefiles. +# In the future, this macro may have to be called after AC_PROG_LIBTOOL. +AC_DEFUN([AC_LIBLTDL_INSTALLABLE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_CHECK_LIB(ltdl, lt_dlinit, + [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], + [if test x"$enable_ltdl_install" = xno; then + AC_MSG_WARN([libltdl not installed, but installation disabled]) + else + enable_ltdl_install=yes + fi + ]) + if test x"$enable_ltdl_install" = x"yes"; then + ac_configure_args="$ac_configure_args --enable-ltdl-install" + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + else + ac_configure_args="$ac_configure_args --enable-ltdl-install=no" + LIBLTDL="-lltdl" + LTDLINCL= + fi + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_INSTALLABLE + + +# AC_LIBTOOL_CXX +# -------------- +# enable support for C++ libraries +AC_DEFUN([AC_LIBTOOL_CXX], +[AC_REQUIRE([_LT_AC_LANG_CXX]) +])# AC_LIBTOOL_CXX + + +# _LT_AC_LANG_CXX +# --------------- +AC_DEFUN([_LT_AC_LANG_CXX], +[AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([_LT_AC_PROG_CXXCPP]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) +])# _LT_AC_LANG_CXX + +# _LT_AC_PROG_CXXCPP +# ------------------ +AC_DEFUN([_LT_AC_PROG_CXXCPP], +[ +AC_REQUIRE([AC_PROG_CXX]) +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_PROG_CXXCPP +fi +])# _LT_AC_PROG_CXXCPP + +# AC_LIBTOOL_F77 +# -------------- +# enable support for Fortran 77 libraries +AC_DEFUN([AC_LIBTOOL_F77], +[AC_REQUIRE([_LT_AC_LANG_F77]) +])# AC_LIBTOOL_F77 + + +# _LT_AC_LANG_F77 +# --------------- +AC_DEFUN([_LT_AC_LANG_F77], +[AC_REQUIRE([AC_PROG_F77]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77]) +])# _LT_AC_LANG_F77 + + +# AC_LIBTOOL_GCJ +# -------------- +# enable support for GCJ libraries +AC_DEFUN([AC_LIBTOOL_GCJ], +[AC_REQUIRE([_LT_AC_LANG_GCJ]) +])# AC_LIBTOOL_GCJ + + +# _LT_AC_LANG_GCJ +# --------------- +AC_DEFUN([_LT_AC_LANG_GCJ], +[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[], + [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])], + [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])], + [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ]) +])# _LT_AC_LANG_GCJ + + +# AC_LIBTOOL_RC +# ------------- +# enable support for Windows resource files +AC_DEFUN([AC_LIBTOOL_RC], +[AC_REQUIRE([LT_AC_PROG_RC]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC]) +])# AC_LIBTOOL_RC + + +# AC_LIBTOOL_LANG_C_CONFIG +# ------------------------ +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG]) +AC_DEFUN([_LT_AC_LANG_C_CONFIG], +[lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}\n' + +_LT_AC_SYS_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +AC_LIBTOOL_SYS_LIB_STRIP +AC_LIBTOOL_DLOPEN_SELF + +# Report which library types will actually be built +AC_MSG_CHECKING([if libtool supports shared libraries]) +AC_MSG_RESULT([$can_build_shared]) + +AC_MSG_CHECKING([whether to build shared libraries]) +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case $host_os in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix4* | aix5*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; +esac +AC_MSG_RESULT([$enable_shared]) + +AC_MSG_CHECKING([whether to build static libraries]) +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +AC_MSG_RESULT([$enable_static]) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_C_CONFIG + + +# AC_LIBTOOL_LANG_CXX_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) +AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], +[AC_LANG_PUSH(C++) +AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([_LT_AC_PROG_CXXCPP]) + +_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_AC_TAGVAR(allow_undefined_flag, $1)= +_LT_AC_TAGVAR(always_export_symbols, $1)=no +_LT_AC_TAGVAR(archive_expsym_cmds, $1)= +_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_direct, $1)=no +_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_AC_TAGVAR(hardcode_libdir_separator, $1)= +_LT_AC_TAGVAR(hardcode_minus_L, $1)=no +_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_AC_TAGVAR(hardcode_automatic, $1)=no +_LT_AC_TAGVAR(module_cmds, $1)= +_LT_AC_TAGVAR(module_expsym_cmds, $1)= +_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown +_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_AC_TAGVAR(no_undefined_flag, $1)= +_LT_AC_TAGVAR(whole_archive_flag_spec, $1)= +_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Dependencies to place before and after the object being linked: +_LT_AC_TAGVAR(predep_objects, $1)= +_LT_AC_TAGVAR(postdep_objects, $1)= +_LT_AC_TAGVAR(predeps, $1)= +_LT_AC_TAGVAR(postdeps, $1)= +_LT_AC_TAGVAR(compiler_lib_search_path, $1)= + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }\n' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_AC_SYS_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_LD=$LD +lt_save_GCC=$GCC +GCC=$GXX +lt_save_with_gnu_ld=$with_gnu_ld +lt_save_path_LD=$lt_cv_path_LD +if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx +else + $as_unset lt_cv_prog_gnu_ld +fi +if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX +else + $as_unset lt_cv_path_LD +fi +test -z "${LDCXX+set}" || LD=$LDCXX +CC=${CXX-"c++"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) + +# We don't want -fno-exception wen compiling C++ code, so set the +# no_builtin_flag separately +if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' +else + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= +fi + +if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + AC_PROG_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ + grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + +else + GXX=no + with_gnu_ld=no + wlarc= +fi + +# PORTME: fill in a description of your system's C++ link characteristics +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +_LT_AC_TAGVAR(ld_shlibs, $1)=yes +case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GXX" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + darwin* | rhapsody*) + case $host_os in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GXX" = yes ; then + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + freebsd[[12]]*) + # C++ shared libraries reported to be fairly broken before switch to ELF + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + freebsd-elf*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + ;; + gnu*) + ;; + hpux9*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[[-]]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + ;; + *) + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + interix3*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' + fi + fi + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + linux* | k*bsd*-gnu) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc*) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC*) + # Portland Group C++ compiler + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + esac + ;; + lynxos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + m88k*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + openbsd2*) + # C++ shared libraries are fairly broken + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + openbsd*) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd='echo' + ;; + osf3*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~ + $rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + psos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The C++ compiler is used as linker so we must use $wl + # flag to pass the commands to the underlying system + # linker. We must also pass each convience library through + # to the system linker between allextract/defaultextract. + # The C++ compiler will combine linker options so we + # cannot just pass the convience library names through + # without $wl. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' + ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | grep -v '^2\.7' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + fi + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + fi + ;; + esac + ;; + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + # So that behaviour is only enabled if SCOABSPATH is set to a + # non-empty value in the environment. Most likely only useful for + # creating official distributions of packages. + # This is a hack until libtool officially supports absolute path + # names for shared libraries. + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + vxworks*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; +esac +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_AC_TAGVAR(GCC, $1)="$GXX" +_LT_AC_TAGVAR(LD, $1)="$LD" + +AC_LIBTOOL_POSTDEP_PREDEP($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC=$lt_save_CC +LDCXX=$LD +LD=$lt_save_LD +GCC=$lt_save_GCC +with_gnu_ldcxx=$with_gnu_ld +with_gnu_ld=$lt_save_with_gnu_ld +lt_cv_path_LDCXX=$lt_cv_path_LD +lt_cv_path_LD=$lt_save_path_LD +lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld +lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +])# AC_LIBTOOL_LANG_CXX_CONFIG + +# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) +# ------------------------------------ +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[ +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +ifelse([$1],[],[cat > conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext <> "$cfgfile" +ifelse([$1], [], +[#! $SHELL + +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# +# This file is part of GNU Libtool: +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="$SED -e 1s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# The names of the tagged configurations supported by this script. +available_tags= + +# ### BEGIN LIBTOOL CONFIG], +[# ### BEGIN LIBTOOL TAG CONFIG: $tagname]) + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1) + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + +# A language-specific compiler. +CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) + +# Is the compiler the GNU C compiler? +with_gcc=$_LT_AC_TAGVAR(GCC, $1) + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_[]_LT_AC_TAGVAR(LD, $1) + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1) + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1) + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1) + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1) + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1) +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1) + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) + +# Commands used to build and install a shared archive. +archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1) +archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1) +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1) +module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1) + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1) + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1) + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1) + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1) + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1) + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1) + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1) + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1) + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1) + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)" + +# Set to yes if exported symbols are required. +always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) + +# The commands to list exported symbols. +export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1) + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1) + +# Symbols that must always be exported. +include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1) + +ifelse([$1],[], +[# ### END LIBTOOL CONFIG], +[# ### END LIBTOOL TAG CONFIG: $tagname]) + +__EOF__ + +ifelse([$1],[], [ + case $host_os in + aix3*) + cat <<\EOF >> "$cfgfile" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || \ + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +]) +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi +])# AC_LIBTOOL_CONFIG + + +# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], +[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl + +_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + + AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI + + +# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +# --------------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], +[AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([AC_PROG_NM]) +AC_REQUIRE([AC_OBJEXT]) +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) # Its linker distinguishes data from code symbols + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +linux* | k*bsd*-gnu) + if test "$host_cpu" = ia64; then + symcode='[[ABCDGIRSTW]]' + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if grep ' nm_test_var$' "$nlist" >/dev/null; then + if grep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' + + cat <> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[[]] = +{ +EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr_t) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -f conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi +]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE + + +# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) +# --------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC], +[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_static, $1)= + +AC_MSG_CHECKING([for $compiler option to produce PIC]) + ifelse([$1],[CXX],[ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | os2* | pw32*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + interix3*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix4* | aix5*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + icpc* | ecpc*) + # Intel C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC*) + # Portland Group C++ compiler. + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + interix3*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + esac + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + newsos6) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + linux* | k*bsd*-gnu) + case $cc_basename in + icc* | ecc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then + AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works], + _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1), + [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" + ;; +esac + +# +# Check to make sure the static flag actually works. +# +wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_AC_TAGVAR(lt_prog_compiler_static, $1)\" +AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) +]) + + +# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) +# ------------------------------------ +# See if the linker supports building shared libraries. +AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS], +[AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +ifelse([$1],[CXX],[ + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix4* | aix5*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([[^ ]]*\) [[^ ]]*/\1 DATA/;/^I /d;/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + ;; + linux* | k*bsd*-gnu) + _LT_AC_TAGVAR(link_all_deplibs, $1)=no + ;; + *) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +],[ + runpath_var= + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)= + _LT_AC_TAGVAR(archive_expsym_cmds, $1)= + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)= + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + _LT_AC_TAGVAR(thread_safe_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown + _LT_AC_TAGVAR(hardcode_automatic, $1)=no + _LT_AC_TAGVAR(module_cmds, $1)= + _LT_AC_TAGVAR(module_expsym_cmds, $1)= + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_AC_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + # Just being paranoid about ensuring that cc_basename is set. + _LT_CC_BASENAME([$compiler]) + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + interix3*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + linux* | k*bsd*-gnu) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_addflag= + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + esac + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test $supports_anon_versioning = yes; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + $echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + _LT_AC_TAGVAR(link_all_deplibs, $1)=no + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no; then + runpath_var= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GCC" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + # see comment about different semantics on the GNU ld section + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + bsdi[[45]]*) + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs' + _LT_AC_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + darwin* | rhapsody*) + case $host_os in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi + ;; + + dgux*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + freebsd1*) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + openbsd*) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' + if test "$GCC" = yes; then + wlarc='${wl}' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + wlarc='' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine linker options so we + # cannot just pass the convience library names through + # without $wl, iff we do not link with $LD. + # Luckily, gcc supports the same syntax we need for Sun Studio. + # Supported since Solaris 2.6 (maybe 2.5.1?) + case $wlarc in + '') + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; + *) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; + esac ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7*) + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +# +# Do we need to explicitly link libc? +# +case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_AC_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_MSG_CHECKING([whether -lc should be explicitly linked in]) + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1) + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) + then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + else + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)]) + ;; + esac + fi + ;; +esac +])# AC_LIBTOOL_PROG_LD_SHLIBS + + +# _LT_AC_FILE_LTDLL_C +# ------------------- +# Be careful that the start marker always follows a newline. +AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ +# /* ltdll.c starts here */ +# #define WIN32_LEAN_AND_MEAN +# #include +# #undef WIN32_LEAN_AND_MEAN +# #include +# +# #ifndef __CYGWIN__ +# # ifdef __CYGWIN32__ +# # define __CYGWIN__ __CYGWIN32__ +# # endif +# #endif +# +# #ifdef __cplusplus +# extern "C" { +# #endif +# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); +# #ifdef __cplusplus +# } +# #endif +# +# #ifdef __CYGWIN__ +# #include +# DECLARE_CYGWIN_DLL( DllMain ); +# #endif +# HINSTANCE __hDllInstance_base; +# +# BOOL APIENTRY +# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) +# { +# __hDllInstance_base = hInst; +# return TRUE; +# } +# /* ltdll.c ends here */ +])# _LT_AC_FILE_LTDLL_C + + +# _LT_AC_TAGVAR(VARNAME, [TAGNAME]) +# --------------------------------- +AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])]) + + +# old names +AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) +AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) +AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) +AC_DEFUN([AM_PROG_LD], [AC_PROG_LD]) +AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) + +# This is just to silence aclocal about the macro not being used +ifelse([AC_DISABLE_FAST_INSTALL]) + +AC_DEFUN([LT_AC_PROG_GCJ], +[AC_CHECK_TOOL(GCJ, gcj, no) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS) +]) + +AC_DEFUN([LT_AC_PROG_RC], +[AC_CHECK_TOOL(RC, windres, no) +]) + +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +# LT_AC_PROG_SED +# -------------- +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +AC_DEFUN([LT_AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_MSG_RESULT([$SED]) +]) + +dnl PKG_CHECK_MODULES(GSTUFF, gtk+-2.0 >= 1.3 glib = 1.3.4, action-if, action-not) +dnl defines GSTUFF_LIBS, GSTUFF_CFLAGS, see pkg-config man page +dnl also defines GSTUFF_PKG_ERRORS on error +AC_DEFUN([PKG_CHECK_MODULES], [ + succeeded=no + + if test -z "$PKG_CONFIG"; then + AC_PATH_PROG(PKG_CONFIG, pkg-config, no) + fi + + if test "$PKG_CONFIG" = "no" ; then + echo "*** The pkg-config script could not be found. Make sure it is" + echo "*** in your path, or set the PKG_CONFIG environment variable" + echo "*** to the full path to pkg-config." + echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config." + else + PKG_CONFIG_MIN_VERSION=0.9.0 + if $PKG_CONFIG --atleast-pkgconfig-version $PKG_CONFIG_MIN_VERSION; then + AC_MSG_CHECKING(for $2) + + if $PKG_CONFIG --exists "$2" ; then + AC_MSG_RESULT(yes) + succeeded=yes + + AC_MSG_CHECKING($1_CFLAGS) + $1_CFLAGS=`$PKG_CONFIG --cflags "$2"` + AC_MSG_RESULT($$1_CFLAGS) + + AC_MSG_CHECKING($1_LIBS) + $1_LIBS=`$PKG_CONFIG --libs "$2"` + AC_MSG_RESULT($$1_LIBS) + else + $1_CFLAGS="" + $1_LIBS="" + ## If we have a custom action on failure, don't print errors, but + ## do set a variable so people can do so. + $1_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` + ifelse([$4], ,echo $$1_PKG_ERRORS,) + fi + + AC_SUBST($1_CFLAGS) + AC_SUBST($1_LIBS) + else + echo "*** Your version of pkg-config is too old. You need version $PKG_CONFIG_MIN_VERSION or newer." + echo "*** See http://www.freedesktop.org/software/pkgconfig" + fi + fi + + if test $succeeded = yes; then + ifelse([$3], , :, [$3]) + else + ifelse([$4], , AC_MSG_ERROR([Library requirements ($2) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.]), [$4]) + fi +]) + + + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright 1997, 2000, 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +# serial 5 + +AC_PREREQ(2.52) + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE]) +AC_SUBST([$1_FALSE]) +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]) +fi])]) + +# Do all the work for Automake. -*- Autoconf -*- + +# This macro actually does too much some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 +# Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +# serial 10 + +AC_PREREQ([2.54]) + +# Autoconf 2.50 wants to disallow AM_ names. We explicitly allow +# the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl + AC_REQUIRE([AC_PROG_INSTALL])dnl +# test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && + test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) +AM_MISSING_PROG(AMTAR, tar) +AM_PROG_INSTALL_SH +AM_PROG_INSTALL_STRIP +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl + +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +]) +]) + + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $1 | $1:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) + +# Copyright 2002 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +AC_DEFUN([AM_AUTOMAKE_VERSION],[am__api_version="1.7"]) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION so it can be traced. +# This function is AC_REQUIREd by AC_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], + [AM_AUTOMAKE_VERSION([1.7.9])]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright 2001, 2002 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +# serial 2 + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# ------------------------------ +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) + +# _AM_SET_OPTIONS(OPTIONS) +# ---------------------------------- +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# +# Check to make sure that the build environment is sane. +# + +# Copyright 1996, 1997, 2000, 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +# serial 3 + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) + +# -*- Autoconf -*- + + +# Copyright 1997, 1999, 2000, 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +# serial 3 + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN([`missing' script is too old or missing]) +fi +]) + +# AM_AUX_DIR_EXPAND + +# Copyright 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is `.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +# Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50]) + +AC_DEFUN([AM_AUX_DIR_EXPAND], [ +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. + +# Copyright 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +install_sh=${install_sh-"$am_aux_dir/install-sh"} +AC_SUBST(install_sh)]) + +# AM_PROG_INSTALL_STRIP + +# Copyright 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +# One issue with vendor `install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in `make install-strip', and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# -*- Autoconf -*- +# Copyright (C) 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +# serial 1 + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# serial 5 -*- Autoconf -*- + +# Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "GCJ", or "OBJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + : > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # (even with -Werror). So we grep stderr for any message + # that says an option was ignored. + if grep 'ignoring option' conftest.err >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking Speeds up one-time builds + --enable-dependency-tracking Do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH]) +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright 1999, 2000, 2001, 2002 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +#serial 2 + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[for mf in $CONFIG_FILES; do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # So let's grep whole file. + if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + grep '^DEP_FILES *= *[[^ @%:@]]' < "$mf" > /dev/null || continue + # Extract the definition of DEP_FILES from the Makefile without + # running `make'. + DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"` + test -z "$DEPDIR" && continue + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n -e '/^U = / s///p' < "$mf"` + test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR" + # We invoke sed twice because it is the simplest approach to + # changing $(DEPDIR) to its actual value in the expansion. + for file in `sed -n -e ' + /^DEP_FILES = .*\\\\$/ { + s/^DEP_FILES = // + :loop + s/\\\\$// + p + n + /\\\\$/ b loop + p + } + /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done +done +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each `.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +# serial 2 + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo done +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + + +# Copyright 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +# serial 3 + +AC_PREREQ(2.50) + +# AM_PROG_LEX +# ----------- +# Autoconf leaves LEX=: if lex or flex can't be found. Change that to a +# "missing" invocation, for better error output. +AC_DEFUN([AM_PROG_LEX], +[AC_REQUIRE([AM_MISSING_HAS_RUN])dnl +AC_REQUIRE([AC_PROG_LEX])dnl +if test "$LEX" = :; then + LEX=${am_missing_run}flex +fi]) + +# Like AC_CONFIG_HEADER, but automatically create stamp file. -*- Autoconf -*- + +# Copyright 1996, 1997, 2000, 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +AC_PREREQ([2.52]) + +# serial 6 + +# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS. +AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) + +# LIBTAGCOLL2_DEFS([LIBTAGCOLL2_REQS=libtagcoll2]) +# --------------------------------------- +AC_DEFUN([LIBTAGCOLL2_DEFS], +[ + dnl Import libtagcoll data + PKG_CHECK_MODULES(LIBTAGCOLL2,m4_default([$1], libtagcoll2)) + AC_SUBST(LIBTAGCOLL2_CFLAGS) + AC_SUBST(LIBTAGCOLL2_LIBS) +]) + +# LIBAPT_FRONT_DEFS([LIBAPT_FRONT_REQS=libapt-front]) +# --------------------------------------- +AC_DEFUN([LIBAPT_FRONT_DEFS], +[ + dnl Import libapt-front data + PKG_CHECK_MODULES(LIBAPT_FRONT,m4_default([$1], libapt-front)) + AC_SUBST(LIBAPT_FRONT_CFLAGS) + AC_SUBST(LIBAPT_FRONT_LIBS) +]) + +# LIBEPT_DEFS([LIBEPT_REQS=libtagcoll2]) +# --------------------------------------- +AC_DEFUN([LIBEPT_DEFS], +[ + dnl Import libtagcoll data + PKG_CHECK_MODULES(LIBEPT,m4_default([$1], libept)) + AC_SUBST(LIBEPT_CFLAGS) + AC_SUBST(LIBEPT_LIBS) +]) + +# LIBWIBBLE_DEFS([LIBWIBBLE_REQS=libwibble]) +# --------------------------------------- +AC_DEFUN([LIBWIBBLE_DEFS], +[ + dnl Import libtagcoll data + PKG_CHECK_MODULES(LIBWIBBLE,m4_default([$1], libwibble)) + AC_SUBST(LIBWIBBLE_CFLAGS) + AC_SUBST(LIBWIBBLE_LIBS) +]) + diff --git a/adept/COPYING b/adept/COPYING new file mode 100644 index 0000000..5ce2405 --- /dev/null +++ b/adept/COPYING @@ -0,0 +1,29 @@ +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of [original copyright holder] nor the names of + its contributors may be used to endorse or promote products + derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/adept/Makefile.am b/adept/Makefile.am new file mode 100644 index 0000000..d0531ef --- /dev/null +++ b/adept/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = kubuntu_upgrader adept installer manager updater notifier icons batch diff --git a/adept/NEWS b/adept/NEWS new file mode 100644 index 0000000..a3dc72a --- /dev/null +++ b/adept/NEWS @@ -0,0 +1,2 @@ +good bye kapture, hello ept +ept - kde apt frontend based on libapt-front diff --git a/adept/TODO b/adept/TODO new file mode 100644 index 0000000..504a439 --- /dev/null +++ b/adept/TODO @@ -0,0 +1,33 @@ +the 1.88 milestone: +* the most "intrusive" changes to ui should be done at this point: the detailed + package view and package browsing interface, improvements to the filtering ui +- make the filter area resize itself to fit the contained filters [done] +- clean up individual filters (their extended state that is) [done] +- implement a sidebar for listing available filtering options +- implement "buckets" for wanted and unwanted tags (these are basically a + want/unwant anded tag filters) +- implement drag&drop from sidebar to buckets and to filter list +- implement shuffling of items in the filter list by d&d (needs fixes in + extendablelist) +- implement detailed package view +- implement package browsing (needs thinking) + +* basic pinning support in the libraries should be done (the ui will possibly + have to wait till beta) + +* the ui should be fully i18n'd +- libapt-front needs to be i18n'd +- strings in libept and apps need to be wrapped in i18n + +* skeleton of the update notifier should be done + +* purge and reinstall options in the UI +- need respective options in libapt-front +- add actions to context menu +- think about semantics... + +* support for individual deb handling in the libraries (possibly without + ui) + +* at least basic support for konsole hiding (eventually without "waiting + for input" detection) diff --git a/adept/adept/Makefile.am b/adept/adept/Makefile.am new file mode 100644 index 0000000..ffec465 --- /dev/null +++ b/adept/adept/Makefile.am @@ -0,0 +1,35 @@ +noinst_LTLIBRARIES = libadept.la +libadept_la_SOURCES = changelog.cpp\ + acqprogresswidgetui.ui acqprogress.cpp \ + tagchooser.cpp filtersidebarui.ui filtersidebar.cpp \ + application.cpp \ + tagfilterui.ui tagfilter.cpp taglist.cpp \ + packageinfoui.ui packageinfo.cpp \ + commitprogressui.ui commitprogress.cpp \ + progress.cpp \ + sourceseditorui.ui sourceseditor.cpp \ + acqprogresswidget.cpp dpkgpm.cpp \ + dpkgpm-gui.cpp \ + extendablelist.cpp \ + desktopentryui.ui desktoplist.cpp \ + groupeddesktopselector.cpp \ + packagedetailsui.ui packagedetails.cpp view.cpp \ + listerextenderui.ui lister.cpp filterlist.cpp \ + filterwidget.cpp \ + quickfilterui.ui quickfilter.cpp \ + statefilterui.ui statefilter.cpp \ + easytagfilterui.ui easytagfilter.cpp \ + actor.h threadutils.cpp \ + installerviewui.ui installerview.cpp +libadept_la_LDFLAGS = -L/usr/lib/debug $(all_libraries) +libadept_la_LIBADD = -lapt-front $(LIBTAGCOLL2_LIBS) + +acqprogress.cpp: acqprogress.moc + +INCLUDES = -I$(srcdir)/.. -I.. $(all_includes) $(LIBEPT_CFLAGS) $(LIBTAGCOLL2_CFLAGS) $(LIBAPT_FRONT_CFLAGS) $(LIBWIBBLE_CFLAGS) +KDE_CXXFLAGS = $(USE_EXCEPTIONS) -DQT_NO_ASCII_CAST -DQT_NO_CAST_ASCII -DDEFAULT_KONSOLE_HIDDEN=true +METASOURCES = AUTO + +messages: rc.cpp + $(EXTRACTRC) `find . -name \*.ui -o -name \*.rc` > rc.cpp + $(XGETTEXT) *.cpp -o $(podir)/libept.pot diff --git a/adept/adept/acqprogress.cpp b/adept/adept/acqprogress.cpp new file mode 100644 index 0000000..4b0643f --- /dev/null +++ b/adept/adept/acqprogress.cpp @@ -0,0 +1,295 @@ +// -*- C++ -*- + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "acqprogress.h" +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +#define _(a...) (a) // XXX + +using namespace std; + +namespace adept { + +AcqStatus::Item::Item (KListView *parent, pkgAcquire::ItemDesc &item, bool hit) +: KListViewItem( parent ) +{ + m_pbcol = 0; + m_prog = new ItemProgress( 0, 0 ); + m_prog->setStatus( "waiting" ); + m_prog->setTotalSteps( 100 ); + m_item = item; + m_id = m_item.Owner->ID; + /* if (item.Owner->FileSize > 0) + setText( 1, SizeToStr( item.Owner->FileSize ).c_str() + QString( "B" ) ); */ + setText( 1, u8( item.Description ) ); + // cerr << "create: id = " << item . Owner -> ID << ", myId = " << m_item . Owner -> ID << endl; + if (hit) { + m_prog->setStatus( "hit" ); + } else + m_prog->setStatus( "waiting" ); + // QString (SizeToStr (Itm.Owner -> FileSize) . c_str ()) + QString ("B"), + // /* QString (Itm . Owner -> ID) + */ QString (Itm.Description . c_str ())); +} + +AcqStatus::Item::~Item () +{ + delete m_prog; +} + +int AcqStatus::Item::compare (QListViewItem *i, int /*col*/, bool /*ascend*/) const +{ + int id1 = m_id; + int id2 = ((Item *) i) -> m_id; + return (id2 >= id1) - (id2 <= id1); +} + +void AcqStatus::Item::pulse (pkgAcquire::Worker *w) +{ + if (w) { + if (w->TotalSize) + setStatus( "progress", long( double( + w -> CurrentSize * 100.0) + / double( w->TotalSize ) ) ); + else + setStatus( "downloading", 0 ); + } +} + +void AcqStatus::Item::setStatus( const std::string &s, int i ) +{ + m_prog->setStatus( s, i ); +} + +void AcqStatus::Item::paintCell (QPainter *p, const QColorGroup &cg, + int column, int width, int alignment ) +{ + QColorGroup _cg( cg ); + QColor c = _cg.text(); + + if ( column == m_pbcol ) { + const QRect bar = QRect( 0, 0, width, height() ); + m_prog->resize( width, height() ); + QPixmap pm = QPixmap::grabWidget( m_prog ); + // p->fillRect( bar, listView()->paletteBackgroundColor() ); + p->drawPixmap( bar.x(), bar.y(), pm ); + } else { + QPixmap pm( width, height() ); + QPainter _p( &pm ); + _cg.setColor( QColorGroup::Text, c ); + KListViewItem::paintCell( &_p, _cg, column, width, alignment ); + p->drawPixmap( 0, 0, pm ); + } +} + +AcqStatus::Item *AcqStatus::findItem (pkgAcquire::ItemDesc &Itm) +{ + if ( Itm.Owner->ID < m_idOffset ) + return 0; + if ( Itm.Owner->ID - m_idOffset >= m_items.size() ) + return 0; + return m_items[ Itm.Owner->ID - m_idOffset ]; +} + +AcqStatus::AcqStatus(QWidget *parent, const char *name) + : KListView (parent, name), m_idOffset( 0 ), m_continue( true ) +{ + // m_lastItem = 0; + addColumn( i18n( "Progress" ) ); + addColumn( i18n( "Description" ) ); + setSorting (1); + setColumnWidth (0, 220); + setColumnWidth (1, 300); + setResizeMode (LastColumn); + ID = 0; +} + +void AcqStatus::Done (pkgAcquire::ItemDesc &Itm) +{ + Item *i = findItem (Itm); + if (i) { + i->setStatus( "done" ); + } + emit statusChanged( StWaiting ); + triggerUpdate(); + KApplication::kApplication()->processEvents(); +} + +void AcqStatus::clear() +{ + KListView::clear(); + m_idOffset += m_items.size(); + m_items.clear(); // got deleted by klistview already +} + +void AcqStatus::Start() +{ + clear(); + pkgAcquireStatus::Start(); + kdDebug() << "AcqStatus::Start ()" << endl; + _config -> Set ("APT::Fetcher::Select-Timeout-Usec", 100000); + emit statusChanged( StWaiting ); + triggerUpdate(); + KApplication::kApplication()->processEvents(); +} + +void AcqStatus::IMSHit(pkgAcquire::ItemDesc &Itm) +{ + Itm.Owner->ID = ID++; + Item *i = new Item( this, Itm, true ); + // ensureItemVisible( i ); + i->setStatus( "hit" ); + m_items.push_back( i ); + + kdDebug() << "imshit called on ID = " << ID - 1 << " i = " << (void *)i << endl; + triggerUpdate(); + KApplication::kApplication()->processEvents(); +}; + +void AcqStatus::Fetch(pkgAcquire::ItemDesc &Itm) + // an item started to download +{ + Update = true; + if (Itm.Owner->Complete == true) // XXX? + return; + + Itm.Owner->ID = ID++; + + Item *i = new Item( this, Itm ); + // ensureItemVisible( i ); + m_items.push_back( i ); + + kdDebug() << "fetch called on ID = " << ID - 1 << " i = " << (void *)i << endl; + emit statusChanged( StDownloading ); + triggerUpdate(); + KApplication::kApplication()->processEvents(); +}; + +void AcqStatus::Fail(pkgAcquire::ItemDesc &Itm) + // item failed to download +{ + kdDebug() << "fail, status = " << Itm.Owner->Status + << " ID = " << Itm.Owner->ID << endl; + // Ignore certain kinds of transient failures (bad code) + if (Itm.Owner->Status == pkgAcquire::Item::StatIdle) { + kdDebug() << "fail with StatIdle, ignoring" << endl; + return; + } + + Item *i = findItem (Itm); + kdDebug() << "fail, i = " << i << endl; + if (! i) + return; + if (Itm.Owner->Status == pkgAcquire::Item::StatDone) { + i->setStatus( "ignored" ); + } else { + i->setStatus( "error" ); + } + + triggerUpdate(); + KApplication::kApplication()->processEvents(); +}; + +void AcqStatus::Stop() +{ + pkgAcquireStatus::Stop(); + emit statusChanged( StDone ); + triggerUpdate (); + KApplication::kApplication()->processEvents(); +} + +bool AcqStatus::Pulse(pkgAcquire *Owner) +{ + pkgAcquireStatus::Pulse(Owner); + + for (pkgAcquire::Worker *I = Owner->WorkersBegin(); I != 0; + I = Owner->WorkerStep(I)) { + if (I -> CurrentItem) { + Item *i = findItem (* (I -> CurrentItem)); + if (i) + i -> pulse (I); + } + } + + triggerUpdate (); + // repaint (); + + if (TotalBytes > 0) + emit totalProgress( + long( double( + (CurrentBytes + + CurrentItems)*100.0)/double(TotalBytes+TotalItems) ) ); + else + emit totalProgress (-1); + KApplication::kApplication () -> processEvents (); + + if ( m_continue ) + return true; + + m_continue = true; + return false; +} + +bool AcqStatus::MediaChange(string Media,string Drive) +{ + int res = KMessageBox::warningContinueCancel( + this, i18n( "Please insert the disc " + "labeled '%1' in the drive " + "'%2' and press enter" ).arg( + u8( Media ) ).arg( u8( Drive ) ), + i18n( "Media Change" ) ); + if ( res == KMessageBox::Cancel ) + cancel(); + return true; +} + +void AcqStatus::cancel() +{ + m_continue = false; +} + +AcqStatusDialog::AcqStatusDialog (QWidget *parent, const char *name, bool modal) + : KDialogBase( parent, name, modal, + u8( "progress dialog (FIXME: waiting for headers, done)" ), + Ok|Cancel, Cancel, true ) +{ + m_status = new AcqStatus (this, ""); + setMainWidget( m_status.data() ); + enableButton (Ok, false); + connect (m_status.data(), SIGNAL (statusChanged (AcqStatus::Status)), + this, SLOT (statusChange (AcqStatus::Status))); +} + +void AcqStatusDialog::statusChange (AcqStatus::Status st) +{ + if (st == AcqStatus::StDownloading || st == AcqStatus::StWaiting) { + enableButton (Ok, false); + // XXX: cancel should be true; but needs implementation first + enableButton (Cancel, false); + } else if (st == AcqStatus::StDone) { + enableButton (Ok, true); + enableButton (Cancel, false); + } +} + +} + +#include "acqprogress.moc" diff --git a/adept/adept/acqprogress.h b/adept/adept/acqprogress.h new file mode 100644 index 0000000..9510825 --- /dev/null +++ b/adept/adept/acqprogress.h @@ -0,0 +1,127 @@ +/** -*- C++ -*- + @file adept/acqprogress.h + @author Peter Rockai +*/ + +#ifndef ACQPROGRESS_H +#define ACQPROGRESS_H + +#include +#include +#include +#include + +#include +#include +#include + +class AcqStatus; +class QLabel; +class QProgressBar; +class QSpacer; +class QGridLayout; + +namespace adept { + +class AcqStatus : public KListView, public aptFront::ProgressCallback +{ + Q_OBJECT +protected: + class ItemProgress: public KProgress { + public: + ItemProgress( QWidget *parent, const char *name = 0 ) + : KProgress( parent, name ), m_spin( 0 ) {} + void setStatus( const std::string &s, + int prog = 0 ) { + m_status = s; + if (m_status == "hit" + || m_status == "ignored" + || m_status == "done") + prog = 100; + if (m_status == "waiting") { + prog = 0; + } + if (m_status == "progress" && prog != 100) + setFormat( i18n( "downloading (%p%)" ) ); + else if (prog == 100) // who cares about hit/ignore anyway? + setFormat( i18n( "done (%p%)" ) ); + else + setFormat( m_status ); + setProgress( prog ); + } + protected: + std::string m_status; + int m_spin; + }; + class Item : public KListViewItem { + protected: + ItemProgress *m_prog; + int m_pbcol; + unsigned long m_id; + pkgAcquire::ItemDesc m_item; + + public: + Item (KListView *parent, pkgAcquire::ItemDesc &item, + bool hit = false); + virtual ~Item (); + + virtual void paintCell (QPainter *p, const QColorGroup &cg, + int column, int width, int alignment); + + void setProgress (int); + virtual int compare (QListViewItem *i, int col, bool ascend) const; + virtual void pulse (pkgAcquire::Worker *); + void setStatus( const std::string &, int = 0 ); + + void setup() { + KListViewItem::setup(); + setHeight( height() + 6 ); + } + }; + unsigned long ID; + unsigned long m_idOffset; + std::vector m_items; + bool m_continue; + +public: + + enum Status { StWaiting, StDownloading, StDone }; + + AcqStatus (QWidget *parent, const char *name); + Item *findItem (pkgAcquire::ItemDesc &Itm); + + virtual bool MediaChange (string Media,string Drive); + virtual void IMSHit (pkgAcquire::ItemDesc &Itm); + virtual void Fetch (pkgAcquire::ItemDesc &Itm); + virtual void Done (pkgAcquire::ItemDesc &Itm); + virtual void Fail (pkgAcquire::ItemDesc &Itm); + virtual void Start (); + virtual void Stop (); + void addLine (QWidget *l, QWidget *s, QWidget *prog); + void clear(); + + bool Pulse (pkgAcquire *Owner); + +public slots: + void cancel(); + +signals: + void statusChanged (AcqStatus::Status st); + void totalProgress (int percent); + + //AcqTextStatus(unsigned int &ScreenWidth,unsigned int Quiet); +}; + +class AcqStatusDialog : public KDialogBase +{ + Q_OBJECT +protected: + aptFront::SharedPtr m_status; +public: + aptFront::SharedPtr callback() { return m_status.data(); }; + AcqStatusDialog (QWidget *parent, const char *name, bool modal); +public slots: + void statusChange (AcqStatus::Status st); +}; +} +#endif diff --git a/adept/adept/acqprogresswidget.cpp b/adept/adept/acqprogresswidget.cpp new file mode 100644 index 0000000..dd02f03 --- /dev/null +++ b/adept/adept/acqprogresswidget.cpp @@ -0,0 +1,53 @@ +#include +#include +#include +#include +#include "acqprogresswidget.h" +#include "acqprogress.h" + +using namespace adept; + +AcqProgressWidget::AcqProgressWidget( QWidget *parent, const char *name ) + : AcqProgressWidgetUi( parent, name ) +{ + m_statusRef = m_status; + m_progress->setTotalSteps( 100 ); + m_progress->setProgress( 0 ); + connect(m_status, SIGNAL( totalProgress( int ) ), + this, SLOT( setProgress( int ) ) ); + connect(m_status, SIGNAL( statusChanged( AcqStatus::Status ) ), + this, SLOT( statusChange( AcqStatus::Status ) ) ); + connect( m_cancel, SIGNAL( clicked() ), + m_status, SLOT( cancel() ) ); +} + +void AcqProgressWidget::statusChange( AcqStatus::Status s ) +{ + QString t; + switch (s) { + case AcqStatus::StWaiting: + t = i18n( "Waiting for headers (%p%)" ); + break; + case AcqStatus::StDownloading: + t = i18n( "Downloading (%p%)" ); + break; + case AcqStatus::StDone: + t = i18n( "Done (%p%)" ); + m_progress->setProgress( 100 ); + break; + } + m_progress->setFormat( t ); +} + +void AcqProgressWidget::setProgress( int p ) +{ + if (p < 0) { + m_progress->setTotalSteps( 0 ); + m_progress->setProgress( m_progress->progress() + 1 ); + } else { + m_progress->setTotalSteps( 100 ); + m_progress->setProgress( p ); + } +} + +#include "acqprogresswidget.moc" diff --git a/adept/adept/acqprogresswidget.h b/adept/adept/acqprogresswidget.h new file mode 100644 index 0000000..54359c7 --- /dev/null +++ b/adept/adept/acqprogresswidget.h @@ -0,0 +1,30 @@ +/** -*- C++ -*- + @file adept/acqprogresswidget.h + @author Peter Rockai + @todo Close button! +*/ + +#ifndef PROGRESSWIDGET_H +# define PROGRESSWIDGET_H + +#include +#include + +namespace adept { + +class AcqProgressWidget : public AcqProgressWidgetUi { + Q_OBJECT +public: + AcqProgressWidget (QWidget *parent = 0, const char *name = 0); + aptFront::SharedPtr callback() { return m_statusRef.data(); }; +public slots: + void statusChange( AcqStatus::Status ); + void setProgress( int ); +protected: + aptFront::SharedPtr m_statusRef; +}; + +} + +#endif /* ifndef PROGRESSWIDGET_H */ + diff --git a/adept/adept/acqprogresswidgetui.ui b/adept/adept/acqprogresswidgetui.ui new file mode 100644 index 0000000..26baa21 --- /dev/null +++ b/adept/adept/acqprogresswidgetui.ui @@ -0,0 +1,79 @@ + +adept::AcqProgressWidgetUi + + + adept::AcqProgressWidgetUi + + + + 0 + 0 + 705 + 289 + + + + Download Progress + + + + unnamed + + + 0 + + + + m_status + + + + 300 + 150 + + + + + + m_progress + + + + + m_cancel + + + Cancel Download + + + + + + + adept::AcqStatus +
acqprogress.h
+ + -1 + -1 + + 0 + + 5 + 5 + 0 + 0 + + image0 +
+
+ + + 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b149444154388dad945f4c5b551cc73fe7dc4b7b4bcba0762d45c43114323599ee6192609c51d883892ce083f1718b3ebb185f8dc91e972cf39d2d2a2f1af664b6f1e0fe3863a0718969700eb0c52142da0242a1bd6d696f7bcff101585203ceb8fd9ece39f99dcff9fe7edf939f88c562ec465f5f9fe609442c161362173c3e3eae7b7a7ac8e7f36432196cdbfe4f907c3e4f2291201e8fe338cec3737357e9e8e828aded1e229d650e1f2d51754b082110124c13a4dc5ea341eb9dc284c0558a853f3ce8cb0677ef500fde7d39d2596679e326597b8e9abb85d7a770ab16ab6983ec5a05b487a70e36f0f4e10afe408d6a558310980108478dba4a1e8233990c5d474b64ed39aa3a8fe5f3317fbf81dbd70bccfeb205947632fd74f6589c1c6ea2f70d03a58ba0c1f2c9bdc1b66de3b8256a6e11cbe7e3ee1d181b590124fe2693aeee08d223c82c3a2c24b7b874bec8f26288774f7bd054504aef0dde6e99c0eb83f9fb266323cb80a27fb0958141836044605a2ee5523393371cc646fee2da37195aa35d0c0c5b4859ac03d7e91712dcaac5adab3650a3ff9d08ef7dd8404bb48869e5d958b5b87dadc4c9a1464e9f0d0326df7ebd86bd2e310cb1bf62d384d59441f2d70a070e1c60e09489929b988681bdd9cc97170bcc4c65595f71f8e0e3301337fc24a7732467831875a47f289652b0be5e4151e6d07316c1b0c0340d8ab92023e76d66a6b2840e36d2fb7a13fee632475e6edc367ea98a90fb98b7dd6310ca0328a44761582e1bab41befabcc0ec940d28bc5e93b68e064cab84e1d9beaeb48934eac1f53b01c1b000fca496aa54b61a99fcde61662a4b4b4b23d1680be9d426173e4df3602a48ea411989a4fd590f52a8fd156b05ed9d350e3defe3cfdf4b4c7ce770ea7d3fb9f520afbe1620daeee5c26735d20b9b9cfb6811a754a439e4e5c5639a4caa1e5caf586bfc0197b78702005cb9b4cae4cd3267ce8638fe964bd72b393e39d74928d242617303a756a37f284447770dcdbffc6384a05a85de1306e9a52057c7527c7131c3c42d3f475eb2303c82d4fc3276d6811db37efeb148723082d9b08f79f97c1e5729109a9a28307cc622d2d6cdf52b2b24efe548dedb00142009862cfa879ee1a71f6cec928353511472fbf4389148b0b0e0c108081412458dfe21c9f11351e67e7358595468246d1d1e5e38a6e9e851bc39d84ab502a669331dafec0d8ec7e3e8cb06e1a881d727d1ae40180a434a8c9db129a54126ad48a7358c2b4c5352c8c374bcccdab2bb37d8719cba79fab8211f9df218e0582c261e95f8bfc04f1a1e8bc5c4dfe0a190172af6a9690000000049454e44ae426082 + + + + + adept/acqprogress.h + kprogress.h + +
diff --git a/adept/adept/actor.h b/adept/adept/actor.h new file mode 100644 index 0000000..115b202 --- /dev/null +++ b/adept/adept/actor.h @@ -0,0 +1,43 @@ +/** -*- C++ -*- + @file adept/actor.h + @author Peter Rockai +*/ + +#include +#include +#include + +#ifndef EPT_ACTOR_H +#define EPT_ACTOR_H + +namespace adept { + +using namespace aptFront; + +class EntityActor : public QObject +{ + Q_OBJECT +public: + EntityActor( actor::Bound< cache::entity::Entity > a ) + : m_actor( a ), m_dead( false ) + {} + actor::Bound< cache::entity::Entity > actor() const { + return m_actor; + } +public slots: + void act() { m_actor(); } + void destructiveAct() { + // in case we don't get deleted soon enough + if ( m_dead ) return; + m_dead = true; + act(); + deleteLater(); + } +protected: + actor::Bound< cache::entity::Entity > m_actor; + bool m_dead; +}; + +} + +#endif diff --git a/adept/adept/application.cpp b/adept/adept/application.cpp new file mode 100644 index 0000000..5f2eb2a --- /dev/null +++ b/adept/adept/application.cpp @@ -0,0 +1,350 @@ +/** -*- C++ -*- + @file adept/application.cpp + @author Peter Rockai +*/ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace adept { +using namespace cache; + +#ifdef KUBUNTU +#include +#define DPKG_FIXER_ARGS QStringList::split(QString(" "), QString("dpkg --configure -a"), false) + +DpkgFixer::DpkgFixer(struct Application* parent) + : m_parent(parent) +{ + m_fixer = 0; + m_waiter = 0; + m_output = ""; + m_done = false; +} + +DpkgFixer::~DpkgFixer() +{ + if (m_fixer != 0) { + delete m_fixer; + } + if (m_waiter != 0) { + delete m_waiter; + } + + std::cout << "Got output " << m_output.latin1() << std::endl; +} + +void DpkgFixer::fixDpkgLock() +{ + kdDebug() << "Asking user if they would like to fix dpkg lock..." << endl; + int decision = KMessageBox::warningYesNoCancel(m_parent->mainWindow(), + i18n("Another process is using the packaging system database " + "(probably some other Adept application or apt-get or " + "aptitude).\nWould you like to attempt to resolve this problem? " + "No will enter read-only mode and Cancel to quit and resolve " + "this issue yourself."), + i18n( "Database Locked" ) ); + switch (decision) { + case KMessageBox::Yes: + kdDebug() << "User opted to fix the dpkg database. Trying to run the process..." << endl; + cache::Global::get().close(); + // Call the dpkg fixer. + m_fixer = new QProcess(dynamic_cast(this)); + m_fixer->setArguments(DPKG_FIXER_ARGS); + + // Handle when the process exits + connect(dynamic_cast(m_fixer), SIGNAL( processExited() ), + dynamic_cast(this), SLOT( retryOpen() )); + + // Handle when the process has stdout output + connect(dynamic_cast(m_fixer), SIGNAL( readyReadStdout() ), + dynamic_cast(this), SLOT( handleStdout() )); + + // Handle when the process has stderr output + connect(dynamic_cast(m_fixer), SIGNAL( readyReadStderr() ), + dynamic_cast(this), SLOT( handleStderr() )); + + // Fire off the waiter... + m_waiter = new KProgressDialog(m_parent->mainWindow(), "waiter", + i18n("Unlocking; Please Wait..."), i18n("Unlocking dpkg database; Please wait...")); + m_waiter->setAllowCancel(false); + m_waiter->show(); + + m_fixer->start(); + kdDebug() << "dpkg fixer fired off." << endl; + + break; + + case KMessageBox::Cancel: + kdDebug() << "User opted to cancel and repair manually." << endl; + exit(1); + break; + + default: + kdDebug() << "User opted to continue in read-only mode." << endl; + m_parent->updateStatusbar(); + m_parent->cacheOpenedNowFinishInit(); + break; + } + + return; +} + +void DpkgFixer::retryOpen() +{ + kdDebug() << "Retrying the open..." << endl; + m_waiter->setLabel(i18n("Reopening the dpkg database...")); + m_waiter->progressBar()->setValue(50); + try { + if (!m_fixer->normalExit()) { + kdDebug() << "The fixer command did not exit normally. Throwing exception." << endl; + throw 0; + } + + kdDebug() << "The fixer command exited normally, trying to reopen the database." << endl; + cache::Global::get().open( m_parent->openFlags() ); + } catch (...) { + KMessageBox::information(m_parent->mainWindow(), + i18n( "Failed to unlock the database. " + "Please try to resolve this issue. " + "`sudo dpkg --configure -a` may help." ), + i18n( "Unlock Failed." ) ); + exit( 1 ); + } + + m_waiter->progressBar()->setValue(100); + m_waiter->close(); + m_parent->updateStatusbar(); + m_parent->cacheOpenedNowFinishInit(); +} + +void DpkgFixer::outputUpdated() +{ +} + +void DpkgFixer::handleStdout() +{ +// m_output += m_fixer->readStdout(); +// outputUpdated(); +} + +void DpkgFixer::handleStderr() +{ +// m_output += m_fixer->readStderr(); +// outputUpdated(); +} +#endif // KUBUNTU + +Application::Application() + : m_acceptReadOnly( false ), m_main( 0 ), m_history( 0 ), m_statusBar( 0 ) +{ +#ifdef KUBUNTU + m_dpkgfixer = 0; +#endif // KUBUNTU +} + +Application::~Application() +{ +#ifdef KUBUNTU + if (m_dpkgfixer != 0) { + delete m_dpkgfixer; + } +#endif // KUBUNTU +} + +void Application::openCache( unsigned flags ) +{ + m_flags = flags; + bool ro = m_acceptReadOnly; + bool root = ::getuid() == 0 || ::geteuid() == 0; + + try { + cache::Global::get().open( m_flags ); + } catch (...) { + try { + cache::Global::get().open( m_flags | Cache::OpenReadOnly ); + if ( ro && root ) { +#ifndef KUBUNTU + kdDebug() << "ro && root -- Database locked." << endl; + KMessageBox::information( + m_main, i18n( + "You will not be able to change your system settings " + "in any way (install, remove or upgrade software), " + "because another process is using the packaging system database " + "(probably some other Adept application or apt-get or " + "aptitude). Please close the other application before " + "using this one." ), + i18n( "Read Only mode: Database Locked" ) ); +#else + kdDebug() << "Firing off the Kubuntu dpkg database lock fixer..." << endl; + m_dpkgfixer = new DpkgFixer(this); + m_dpkgfixer->fixDpkgLock(); + return; +#endif // KUBUNTU + } else if ( !root && ro ) { + kdDebug() << "!root && ro -- Need root privileges." << endl; + KMessageBox::information( + m_main, i18n( + "You will not be able to change your system settings " + "in any way (install, remove or upgrade software), " + "because this application needs special administrator " + "(root) privileges. Please run it as root or " + "through kdesu or sudo programs to be able to perform " + "these actions" ), + i18n( "Read Only mode: Need root privileges" ) ); + } else if ( root && !ro ) { +#ifndef KUBUNTU + kdDebug() << "root && !ro -- Database locked." << endl; + KMessageBox::information(m_main, + i18n("Another process is using the packaging system database " + "(probably some other Adept application or apt-get or " + "aptitude). Please close the other application before " + "using this one." ), + i18n( "Read Only mode: Database Locked" ) ); +#else + kdDebug() << "Firing off the Kubuntu dpkg database lock fixer..." << endl; + m_dpkgfixer = new DpkgFixer(this); + m_dpkgfixer->fixDpkgLock(); + return; +#endif // KUBUNTU + } else if ( !root && !ro ) { + kdDebug() << "!root && !ro -- Needs root privileges." << endl; + KMessageBox::information( + m_main, i18n( "This application needs special administrator " + "(root) privileges. Please run it as root or " + "through kdesu or sudo programs" ), + i18n( "Need root privileges" ) ); + } + if ( !ro ) { + kdDebug() << "cannot continue, exiting" << endl; + exit( 1 ); + } + } catch (...) { + KMessageBox::sorry( + m_main, i18n( + "The APT Database could not be opened!" + " This may be caused by incorrect APT configuration" + " or some similar problem. Try running apt-setup and" + " apt-get update in terminal and see if it helps" + " to resolve the problem." ), i18n( "Could not open cache" )); + exit( 1 ); + } + } + + updateStatusbar(); + cacheOpenedNowFinishInit(); +} + +void Application::initHistory() { + cache::Global::get().addComponent( + m_history = new History() ); +} + +void Application::initKDEDebconf() +{ + // xxx unhardcode the package name somehow? + if (cache::Global::get().packages() + .packageByName( "libqt-perl" ).isInstalled()) + putenv( "DEBIAN_FRONTEND=kde" ); +} + +void Application::initialize() +{ + CommitProgress::initSystem(); + aptFront::init(); + openCache(); +} + +void Application::cacheOpenedNowFinishInit() { + initKDEDebconf(); + initHistory(); + observeComponent< component::State >(); + + initFinished(); +} + +void Application::checkpoint() { + if ( !history() ) return; + setHistoryEnabled( false ); + history()->checkpoint(); + setHistoryEnabled( true ); +} + +void Application::undo() { + if ( !history() ) return; + setHistoryEnabled( false ); + history()->undo(); + setHistoryEnabled( true ); +} + +void Application::redo() { + if ( !history() ) return; + setHistoryEnabled( false ); + history()->redo(); + setHistoryEnabled( true ); +} + +QString Application::changeString() { + component::State &s = cache().state(); + return i18n( " Install %1, upgrade %2, remove %3 " ) + .arg( s.newInstallCount() ).arg( s.upgradeCount() ) + .arg( s.removeCount() ); +} + +QString Application::statusString() { + component::State &s = cache().state(); + return i18n( " %1 installed, %2 upgradable, %3 available " ) + .arg( s.installedCount() ).arg( s.upgradableCount() ) + .arg( s.availableCount() ); +} + +QString Application::sizesString() { + QString dl = cache().state().downloadSizeString(); + QString inst = cache().state().installSizeString(); + return i18n( " download: %1, installation: %2 " ).arg( dl ).arg( inst ); +} + +void Application::setStatusBar( KStatusBar *s ) { + m_statusBar = s; + if ( s ) { + s->message( i18n( "Initializing..." ) ); + s->insertItem( u8( "" ), 0 ); + s->insertItem( u8( "" ), 1 ); + s->insertItem( u8( "" ), 2 ); + adjustFontSize( s, -1 ); + + adept::Progress *pr = new adept::Progress(); + pr->setStatusBar( s ); + cache::Global::get().setProgress( pr ); + } +} + +void Application::notifyPostChange( component::Base * ) +{ + updateStatusbar(); +} + +void Application::updateStatusbar() +{ + if ( m_statusBar ) { + m_statusBar->changeItem( changeString(), 0 ); + m_statusBar->changeItem( statusString(), 1 ); + m_statusBar->changeItem( sizesString(), 2 ); + } +} + +} diff --git a/adept/adept/application.h b/adept/adept/application.h new file mode 100644 index 0000000..0416b70 --- /dev/null +++ b/adept/adept/application.h @@ -0,0 +1,102 @@ +/** -*- C++ -*- + @file adept/application.h + @author Peter Rockai +*/ + +#include + +#include +#include +#include + +#include +#include +#include + +#ifndef EPT_APPLICATION_H +#define EPT_APPLICATION_H + +#define KUBUNTU + +class KStatusBar; + +namespace adept { +using namespace aptFront; +using cache::Cache; + +class Lister; + +#ifdef KUBUNTU +class DpkgFixer : public QObject { + Q_OBJECT; +public: + DpkgFixer(struct Application* app); + ~DpkgFixer(); + + bool done() { return m_done; }; +public slots: + void fixDpkgLock(); + + +protected slots: + void retryOpen(); + void outputUpdated(); + void handleStdout(); + void handleStderr(); + +protected: + QProcess* m_fixer; + Application* m_parent; + QString m_output; + KProgressDialog* m_waiter; + bool m_done; +}; +#endif // KUBUNTU + +struct Application : cache::Observer { + Application(); + ~Application(); + void setAcceptReadOnly( bool ro ) { m_acceptReadOnly = ro; } + bool writeable() { return cache::Global::get().writeable(); } + Cache &cache() { return cache::Global::get(); } + void openCache( unsigned flags = Cache::OpenDefault | Cache::OpenDebtags ); + void initialize(); + void cacheOpenedNowFinishInit(); + void initKDEDebconf(); + void initHistory(); + void setMainWidget( QWidget *w ) { m_main = w; } + void setStatusBar( KStatusBar *s ); + void updateStatusbar(); + virtual void initFinished() { return; }; + virtual void checkpoint(); + virtual void undo(); + virtual void redo(); + + int test_this_shit; + + virtual void notifyPostChange( cache::component::Base * ); + + QString changeString(); + QString statusString(); + QString sizesString(); + QWidget* mainWindow() { return m_main; }; + unsigned openFlags() { return m_flags; }; + +protected: + virtual void setHistoryEnabled( bool ) {} + typedef cache::component::History< cache::component::State > History; + virtual History *history() { return m_history; } + bool m_acceptReadOnly; + unsigned m_flags; + QWidget *m_main; + KStatusBar *m_statusBar; + History *m_history; + +#ifdef KUBUNTU + DpkgFixer* m_dpkgfixer; +#endif // KUBUNTU +}; + +} + +#endif diff --git a/adept/adept/changelog.cpp b/adept/adept/changelog.cpp new file mode 100644 index 0000000..5dd47ed --- /dev/null +++ b/adept/adept/changelog.cpp @@ -0,0 +1,145 @@ +/* -*- C++ -*- */ +#include +#include +#include +#include + +#include + +#include +#include + +#include + +#include "changelog.h" + +using namespace adept; + +#ifdef KUBUNTU +ItemChangelog::ItemChangelog() { + connect(this, SIGNAL( changelogNeeded() ), + this, SLOT( requestChangelog() )); + m_http = 0; + m_content_catcher = 0; +} + +ItemChangelog::~ItemChangelog() { + if (m_http != 0) { + delete m_http; + } + if (m_content_catcher != 0) { + delete m_content_catcher; + } +} + +/* + * So this method is *very* specific to the ubuntu package + * changelog repository. If you want to modify this to meet the needs + * of another distro, you may want to implement your own method here. + */ +QString ItemChangelog::changelogUrl() { + // The list of known sections... + QStringList knownSections(QString("main")); + knownSections += QString("multiverse"); + knownSections += QString("restricted"); + knownSections += QString("universe"); + + // The parts of the package that form the URL... + QStringList pkgParts( QString(BASE_CHANGELOG_URL) ); + QStringList sectionParts; + QString section; + QString urlBase; + QString pkgName; + bool found = false; + + try { + if (&m_pkg == 0x0) { + throw 0; + } + std::string theSection(m_pkg.section(std::string("/"))); + if (!theSection.length()) { + throw 0; + } + //// Get the section + section = QString( theSection ); + /* now convert the section into something + usable for the changelog URL. */ + sectionParts = QStringList::split(QString("/"), section); + + /* If we have more than one piece, that means we've got a + non-main repo. Let's make sure it's one we can use. */ + if (sectionParts.size() > 1) { + // Walk through known sections + for (QStringList::Iterator it = knownSections.begin(); + it != knownSections.end(); ++it) { + // If we found it, let's say we found it. + if (sectionParts[0] == *it) { + pkgParts += sectionParts[0]; + found = true; + break; + } + } + if (!found) { + return QString::null; // didn't find the repo! + } + } else { + pkgParts += QString("main"); + } + + //// Get the package name and prefix + pkgName += QString( m_pkg.source() ); + pkgParts += QString(pkgName[0]); + pkgParts += pkgName; + + //// Get the version string. + QString version = QString( m_pkg.candidateVersion().versionString() ); + int epoch = version.find(':'); + if (epoch > -1) { + version = version.mid(epoch + 1); + } + pkgName += "_" + version; + pkgParts += pkgName; + pkgParts += QString("changelog"); + + return pkgParts.join(QString("/")); + } catch (...) { + kdDebug() << "GOT ME AN EXCEPTION!!!! THIS IS NOT GOOD!!!!"; + } + + return QString::null; +} + +void ItemChangelog::requestChangelog() { +// emit changelogReady(changelogUrl()); + +// return; + + /* Removing temporarilly */ + m_http = new QHttp(QString(BASE_CHANGELOG_HOST), + BASE_CHANGELOG_PORT, + this, "changelog_loader"); + connect(dynamic_cast(m_http), SIGNAL( requestFinished(int,bool) ), + dynamic_cast(this), SLOT( contentReady(int,bool) )); + m_content_catcher = new QBuffer(); + QString theUrl( changelogUrl() ); + + if ( theUrl == QString::null ) { + emit changelogReady(QString("No change log found.")); + } else { + m_http->get( changelogUrl(), dynamic_cast(m_content_catcher) ); + } +} + +void ItemChangelog::contentReady( int id, bool error ) { + QString msg("Unable to fetch the Developer Changelog."); + + if (!error) { + msg = QString( m_content_catcher->buffer() ); + } else { + msg += ": " + m_http->errorString(); + } + + emit changelogReady( msg ); +} + +#endif /*KUBUNTU*/ diff --git a/adept/adept/changelog.h b/adept/adept/changelog.h new file mode 100644 index 0000000..8db861b --- /dev/null +++ b/adept/adept/changelog.h @@ -0,0 +1,45 @@ +/* -*- C++ -*- */ +#ifndef CHANGELOG_H +#define CHANGELOG_H + +#include +#include +#include +#include + +#include + +#ifdef KUBUNTU +#define BASE_CHANGELOG_HOST "changelogs.ubuntu.com" +#define BASE_CHANGELOG_PORT 80 +#define BASE_CHANGELOG_URL "/changelogs/pool" + +namespace adept { + + class ItemChangelog : public QObject { + Q_OBJECT + public: + ItemChangelog(); + ~ItemChangelog(); + + // Give me the changelog's URL + QString changelogUrl(); + void setParent(entity::Package parent) { m_pkg = parent; } + signals: + void changelogNeeded(); + void changelogReady(QString content); + + protected slots: + // Give me the changelog's text + void requestChangelog(); + void contentReady(int id, bool error); + + protected: + entity::Package m_pkg; + QHttp* m_http; + QBuffer* m_content_catcher; + }; +} + +#endif /* KUBUNTU */ +#endif /*CHANGELOG_H*/ diff --git a/adept/adept/commitprogress.cpp b/adept/adept/commitprogress.cpp new file mode 100644 index 0000000..9322e27 --- /dev/null +++ b/adept/adept/commitprogress.cpp @@ -0,0 +1,117 @@ +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +using namespace adept; +using namespace aptFront; + +PkgSystem *CommitProgress::s_system = 0; + +void CommitProgress::initSystem() { + CommitProgress::s_system = new PkgSystem(); +} + +CommitProgress::CommitProgress( QWidget *p, const char *n ) + : CommitProgressUi( p, n ) +{ + assert( s_system ); + m_konsoleFrame->installEventFilter( this ); + loadKonsole(); + connect( s_system, SIGNAL( statusChanged( int, QString ) ), + this, SLOT( updateProgress( int, QString ) ) ); + connect( m_details, SIGNAL( clicked() ), + this, SLOT( toggleDetails() ) ); + m_progress->setTotalSteps( 100 ); +} + +bool CommitProgress::eventFilter( QObject *o, QEvent *e ) { + // o == m_konsoleFrame + if ( e->type() == QEvent::Resize ) { + QResizeEvent *re = dynamic_cast< QResizeEvent * >( e ); + if ( !re ) return false; + m_konsole->widget()->setGeometry( 0, 0, re->size().width(), re->size().height() ); + m_occlude->setGeometry( 0, 0, re->size().width(), re->size().height() ); + } + return false; +}; + +void CommitProgress::toggleDetails() +{ + if ( !m_occlude->isVisible() ) { + // if ( m_stack->visibleWidget() == m_konsole->widget() ) { // hide + // m_stack->raiseWidget( m_emptyPage ); + m_occlude->show(); + m_occlude->setFocus(); + m_bottomSpace->changeSize( 10, 10, QSizePolicy::Fixed, QSizePolicy::Expanding ); + m_details->setText( i18n( "Show Details" ) ); + } else { // show + m_occlude->hide(); + m_konsole->widget()->setFocus(); + // m_stack->raiseWidget( m_konsole->widget() ); + m_bottomSpace->changeSize( 10, 10, QSizePolicy::Fixed, QSizePolicy::Fixed ); + m_details->setText( i18n( "Hide Details" ) ); + } +} + +void CommitProgress::updateProgress( int p, QString msg ) +{ + m_operation->setText( msg ); + m_progress->setProgress( p ); +} + +void CommitProgress::loadKonsole() +{ + if ( s_system->terminal() ) + kdDebug() << "WARNING: Hijacking PkgSystem terminal" << endl; + + KLibFactory* factory = KLibLoader::self()->factory( "libsanekonsolepart" ); + if (!factory) + factory = KLibLoader::self()->factory( "libkonsolepart" ); + + assert( factory ); + + delete m_occlude; + m_konsole = static_cast( + factory->create( m_konsoleFrame, "konsolepart", "QObject", + u8( "KParts::ReadOnlyPart" ) ) ); + // m_konsole->widget()->setGeometry( QRect( 0, 0, 40, 40 ) ); + + m_occlude = new QFrame( m_konsoleFrame, "m_occlude" ); + // m_occlude->setGeometry( QRect( 0, 0, 10, 10 ) ); + m_occlude->setFrameShape( QFrame::NoFrame ); + + assert( terminal() ); + + terminal()->setAutoDestroy( false ); + terminal()->setAutoStartShell( false ); + // m_stack->addWidget( m_konsole->widget() ); + + QStrList l; l.append( "echo" ); l.append( "-n" ); + terminal()->startProgram( u8( "/bin/echo" ), l ); + + s_system->setTerminal( m_konsole ); + + // m_stack->raiseWidget( m_konsole->widget() ); + // m_konsole->widget()->show(); + // m_stack->raiseWidget( m_emptyPage ); + m_operation->setText( i18n( "Idle" ) ); + QTimer::singleShot( 0, this, SLOT( toggleDetails() ) ); + if ( DEFAULT_KONSOLE_HIDDEN ) + QTimer::singleShot( 0, this, SLOT( toggleDetails() ) ); + QTimer::singleShot( 0, this, SLOT( hide() ) ); +} + diff --git a/adept/adept/commitprogress.h b/adept/adept/commitprogress.h new file mode 100644 index 0000000..ed557d7 --- /dev/null +++ b/adept/adept/commitprogress.h @@ -0,0 +1,41 @@ +/* -*- C++ -*- file adept/commitprogress.h + written by Peter Rockai */ + +#include +#include +#include +#include + +#ifndef EPT_COMMITPROGRESS_H +#define EPT_COMMITPROGRESS_H + +namespace adept { + +class CommitProgress : public CommitProgressUi +{ + Q_OBJECT +public: + CommitProgress( QWidget *p = 0, const char *n = 0 ); + + ExtTerminalInterface *terminal() { + return static_cast( + m_konsole->qt_cast( "ExtTerminalInterface" ) ); + } + + // needs to be called before aptFront::init() :'(( + static void initSystem(); + virtual bool eventFilter( QObject *o, QEvent *e ); + +public slots: + void updateProgress( int p, QString msg ); + void toggleDetails(); +protected: + void loadKonsole(); + KParts::Part *m_konsole; + static adept::PkgSystem *s_system; // bla... +}; + +} + + +#endif diff --git a/adept/adept/commitprogressui.ui b/adept/adept/commitprogressui.ui new file mode 100644 index 0000000..5ccecbf --- /dev/null +++ b/adept/adept/commitprogressui.ui @@ -0,0 +1,197 @@ + +adept::CommitProgressUi + + + CommitProgressUi + + + + 0 + 0 + 542 + 303 + + + + Form1 + + + + unnamed + + + 1 + + + + m_konsoleFrame + + + + 5 + 7 + 0 + 0 + + + + NoFrame + + + Raised + + + + m_occlude + + + + 40 + 10 + 460 + 60 + + + + StyledPanel + + + Raised + + + + + + spacer6 + + + Vertical + + + Fixed + + + + 20 + 16 + + + + + + layout6 + + + + unnamed + + + + spacer5 + + + Horizontal + + + Fixed + + + + 20 + 20 + + + + + + layout5 + + + + unnamed + + + + m_details + + + (details) + + + + + m_progress + + + + + m_operation + + + Preparing... + + + + + + + spacer4 + + + Horizontal + + + Fixed + + + + 20 + 20 + + + + + + + + m_bottomSpace + + + Vertical + + + Expanding + + + + 20 + 80 + + + + + + spacer6_2 + + + Vertical + + + Fixed + + + + 20 + 32 + + + + + + + + + + kprogress.h + + diff --git a/adept/adept/desktopentryui.ui b/adept/adept/desktopentryui.ui new file mode 100644 index 0000000..a40c766 --- /dev/null +++ b/adept/adept/desktopentryui.ui @@ -0,0 +1,116 @@ + +adept::DesktopEntryUi + + + DesktopEntryUi + + + + 0 + 0 + 509 + 52 + + + + Form1 + + + + unnamed + + + 6 + + + 5 + + + + m_icon + + + + 0 + 0 + 0 + 0 + + + + + 32 + 32 + + + + + + + + + m_check + + + + 0 + 0 + 0 + 0 + + + + + + + + + m_name + + + (name) + + + + 7 + 0 + 0 + 0 + + + + + + m_description + + + (description) + + + WordBreak|AlignVCenter + + + + + spacer2 + + + Horizontal + + + Fixed + + + + 6 + 20 + + + + + + + adept/extendablelist.h + + + diff --git a/adept/adept/desktoplist.cpp b/adept/adept/desktoplist.cpp new file mode 100644 index 0000000..de64f11 --- /dev/null +++ b/adept/adept/desktoplist.cpp @@ -0,0 +1,194 @@ +/** -*- C++ -*- + @file adept/desktoplist.cpp + @author Peter Rockai +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace adept { + +DesktopEntry::DesktopEntry( QWidget *p, const char *n ) + : DesktopEntryUi( p, n ) +{ + adjustFontSize( m_description, -1 ); +} + +void DesktopEntry::resize( int w, int h ) +{ + // kdDebug() << "DesktopEntry::resize( " << w << ", " << h << " )" << endl; + int margin = layout()->margin() + layout()->spacing() * 2 + + 6 /* spacer */ + m_icon->width() + m_check->width(); + if ( m_check->isVisible() ) margin += m_check->width() + layout()->spacing(); + int hFW1 = m_name->heightForWidth( w - margin ); + int hFW2 = m_description->heightForWidth( w - margin ); + /* kdDebug() << "margin = " << margin << ", hFW1 = " << hFW1 << ", hFW2 = " + << hFW2 << endl; */ + int height = 2 * layout()->margin() + layout()->spacing() + hFW1 + hFW2; + if ( height < 32 + 2*layout()->margin() /* icon size + margin */ ) + height = 32 + 2*layout()->margin(); + // m_description->resize( w - margin, m_description->heightForWidth( w - margin ) ); + QWidget::resize( w, height ); +} + +void DesktopEntry::setItem( ExtendableItem *i ) { + m_polished = false; + ItemExtender::setItem( i ); + m_name->setText( u8( "" ) + u8( entity().name() ) + u8( "" ) ); + m_description->setText( u8( entity().description() ) ); + if ( !item()->list()->displayCheckboxes() ) { + m_check->hide(); + } + if ( !package().valid() || !package().hasVersion() ) { + setEnabled( false ); + } else { + connect( m_check, SIGNAL( toggled( bool ) ), + this, SLOT( toggled() ) ); + notifyPostChange(); + } +} + +void DesktopEntry::mousePressEvent( QMouseEvent *e ) { + kdDebug() << "DesktopEntry::mousePressEvent" << endl; + e->ignore(); +} + +void DesktopEntry::mouseReleaseEvent( QMouseEvent *e ) { + kdDebug() << "DesktopEntry::mouseReleaseEvent" << endl; + e->ignore(); +} + +void DesktopEntry::showEvent( QShowEvent *e ) { + DesktopEntryUi::showEvent( e ); + // DesktopEntryUi::polish(); + if ( m_polished ) return; + item()->list()->polishing(); + kdDebug() << "polish for " << entity().name() << endl; + QImage icon( KGlobal::iconLoader()->iconPath( entity().icon(), -32, true ) ); + if ( icon.isNull() ) { + icon = QImage( KGlobal::dirs()->findResource( "desktopicon", entity().icon() ) ); + } + m_icon->setPixmap( icon.isNull() ? item()->list()->emptyIcon() : + QPixmap( icon.smoothScale( 32, 32, QImage::ScaleMin ) ) ); + item()->list()->polished(); + m_polished = true; +} + +void DesktopEntry::toggled() { + /* if ( package().isInstalled() ) { + if ( package().markedRemove() ) + package().markKeep(); + else + package().markRemove(); + } else if ( package().markedInstall() ) + package().markKeep(); + else + package().markInstall(); */ + + if ( package().isInstalled() ) { + if ( package().markedRemove() ) + item()->list()->fireRequest( package(), component::State::AKeep ); + else + item()->list()->fireRequest( package(), component::State::ARemove ); + } else if ( package().markedInstall() ) + item()->list()->fireRequest( package(), component::State::AKeep ); + else + item()->list()->fireRequest( package(), component::State::AInstall ); + notifyPostChange(); +} + +void DesktopList::polishing() { + if ( m_polishing == 0 ) + QApplication::setOverrideCursor( QCursor( Qt::BusyCursor ) ); + m_polishing++; + if ( m_polishing % 10 == 0 ) + kapp->processEvents(); +} + +void DesktopList::polished() { + if ( m_polishing == childCount() ) + QApplication::restoreOverrideCursor(); +} + +void DesktopList::notifyPostChange( component::Base * ) { + utils::Range< ExtendableItem * > r = extenders(); + for ( ; r != r.end(); ++r ) { + dynamic_cast< DesktopEntry * >( (*r)->extender() )->notifyPostChange(); + } +} + +void DesktopEntry::notifyPostChange() { + if ( !package().valid() || !package().hasVersion() ) + return; + + m_check->blockSignals( true ); + m_check->setChecked( ( package().isInstalled() + || entity().package().markedInstall() ) + && !entity().package().markedRemove() ); + m_check->blockSignals( false ); +} + +DesktopList::DesktopList( QWidget *parent, const char *name ) + : ExtendableList( parent, name ), m_polishing( 0 ), m_displayCheckboxes( true ) +{ + observeComponent< component::State >(); + addColumn( i18n( "Application" ) ); + setResizeMode( LastColumn ); + setToggleColumn( -1 ); // no toggling, thanks + setExtenderHighlight( true ); + m_emptyIcon = QPixmap( + QImage( + KGlobal::iconLoader()->iconPath( u8( "exec" ), -32, false ) + ).smoothScale( 32, 32, QImage::ScaleMin ) ); + connect( this, SIGNAL( clicked( QListViewItem *, const QPoint &, int ) ), + this, SLOT( processClick( QListViewItem *, const QPoint &, int ) ) ); +} + +void DesktopList::processClick( QListViewItem *it, const QPoint &, int ) { + kdDebug() << "DesktopList::processClick..." << endl; + DesktopItem *i = dynamic_cast< DesktopItem * >( it ); + if ( !i ) return; + emit showDescription( i->entity() ); +} + +void DesktopList::insertRange( Range r ) { + m_range = r; + DesktopItem *last = 0; + int i = 0; + QApplication::setOverrideCursor( QCursor( Qt::BusyCursor ) ); + for( ; r != r.end(); r.advance() ) { + if ( i % 20 == 0 ) + kapp->processEvents(); + if ( !r->package( entity::Package() ).valid() ) + continue; + DesktopItem *i = last ? new DesktopItem( this, last ) : new DesktopItem( this ); + last = i; + i->setEntity( *r ); + ++ i; + } + QApplication::restoreOverrideCursor(); +} + +ItemExtender *DesktopItem::createExtender() { + return new DesktopEntry(); +} + +DesktopItem *DesktopEntry::item() const { + return dynamic_cast< DesktopItem * >( m_item ); +} + +entity::Desktop DesktopEntry::entity() const { + return item()->entity(); +} + +} diff --git a/adept/adept/desktoplist.h b/adept/adept/desktoplist.h new file mode 100644 index 0000000..207b9a7 --- /dev/null +++ b/adept/adept/desktoplist.h @@ -0,0 +1,117 @@ +/** -*- C++ -*- + @file adept/desktoplist.h + @author Peter Rockai +*/ + +#include +#include + +#include +#include +#include + +#ifndef EPT_DESKTOPLIST_H +#define EPT_DESKTOPLIST_H + +class QPopupMenu; + +namespace adept { +using namespace aptFront; +using namespace aptFront::cache; + +class DesktopItem; + +class DesktopList : public ExtendableList, public cache::Observer +{ + Q_OBJECT +public: + typedef utils::Range< entity::Desktop > Range; + DesktopList( QWidget *parent = 0, const char *name = 0 ); + void insertRange( Range ); + QPixmap emptyIcon() { return m_emptyIcon; } + void polishing(); + void polished(); + + void setTitle( QString s ) { + setColumnText( 0, i18n( "Application (" ) + s + i18n( ")" ) ); + } + + void setDisplayCheckboxes( bool d ) { m_displayCheckboxes = d; } + bool displayCheckboxes() { return m_displayCheckboxes; } + virtual void notifyPostChange( cache::component::Base * ); + void fireRequest( entity::Package p, component::State::Action a ) { + emit request( p, a ); + } +protected slots: + void processClick( QListViewItem *, const QPoint &, int ); +signals: + void request( cache::entity::Package, cache::component::State::Action ); + void showDescription( cache::entity::Desktop ); +protected: + Range m_range; + QPixmap m_emptyIcon; + int m_polishing; + bool m_displayCheckboxes; +}; + +class DesktopEntry : public DesktopEntryUi +{ + Q_OBJECT +public: + DesktopEntry( QWidget * = 0, const char * = 0 ); + DesktopItem *item() const; + entity::Desktop entity() const; + void setItem( ExtendableItem * ); + entity::Package package() { return entity().package(); } + virtual void notifyPostChange(); + virtual void resize( int, int ); + // virtual void polish(); +public slots: + void toggled(); +protected: + virtual void mousePressEvent( QMouseEvent *e ); + virtual void mouseReleaseEvent( QMouseEvent *e ); + virtual void showEvent( QShowEvent * ); + bool m_polished; +}; + +class DesktopItem : public ExtendableItem +{ +public: + ItemExtender *createExtender(); + DesktopItem( DesktopList *l ) + : ExtendableItem( l ), m_delayedDone( false ) + { + } + DesktopItem( DesktopList *v, DesktopItem *i ) + : ExtendableItem( v, i ), m_delayedDone( false ) + { + } + + void setup() { + ExtendableItem::setup(); + if (m_delayedDone) + return; + m_delayedDone = true; + showExtender(); + } + + DesktopList *list() { return dynamic_cast< DesktopList * >( listView() ); } + + QString text( int ) const { return QString( "you shouldn't see this" ); } + entity::Desktop entity() const { return m_entity; } + void setEntity( entity::Desktop e ) { m_entity = e; } + + virtual bool less( const ExtendableItem *other ) const { + const DesktopItem *o = dynamic_cast< const DesktopItem * >( other ); + return entity() < o->entity(); + } + +protected: + entity::Desktop m_entity; + bool m_delayedDone:1; +}; + +} + +#endif diff --git a/adept/adept/dpkgpm-gui.cpp b/adept/adept/dpkgpm-gui.cpp new file mode 100644 index 0000000..828d18f --- /dev/null +++ b/adept/adept/dpkgpm-gui.cpp @@ -0,0 +1,258 @@ +/** -*- C++ -*- + @file adept/dpkgpm-gui.cpp + @author Peter Rockai +*/ + +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +#include +#include + +using namespace aptFront; +using namespace cache; + +namespace adept { + +PkgSystem::PkgSystem() + : m_terminalPart( 0 ) +{ + std::cerr << "kapture::PkgSystem::PkgSystem()" << std::endl; + Label = "adeptDPkgSystem"; +} + +void PkgSystem::setTerminal( KParts::Part *t ) +{ + m_terminalPart = t; +} + +pkgPackageManager *PkgSystem::CreatePM( pkgDepCache *c ) const +{ + std::cerr << "kapture::PkgSystem::CreatePM()" << std::endl; + adept::DPkgPM *pm = new adept::DPkgPM( c, m_terminalPart ); + connect( pm, SIGNAL( statusChanged( int, QString ) ), + this, SIGNAL( statusChanged( int, QString ) ) ); + return pm; +} + +DPkgPM::DPkgPM( pkgDepCache *cache, KParts::Part *t ) + : aptFront::DPkgPM (cache), m_terminalPart (t) +{ +} + +bool DPkgPM::forkDpkg( char *const argv[] ) +{ + bool ok = true; + std::cerr << "adept::DPkgPM::forkDpkg ()" << std::endl; + QStrList l; + for (int i = 0; argv[i]; i ++) + l.append( argv[i] ); + + m_processRunning = true; + connect( m_terminalPart, SIGNAL( processExited( KProcess * ) ), + this, SLOT( processExit( KProcess * ) ) ); + connect( m_terminalPart, SIGNAL( processExited( const KProcess * ) ), + this, SLOT( processExitC( const KProcess * ) ) ); + connect( m_terminalPart, SIGNAL( forkedChild() ), + this, SLOT( setupDpkgChild() ) ); + + terminal()->startProgram( u8( argv[0] ), l ); + + ::close( m_dpkgPipe[1] ); + ::fcntl( m_dpkgPipe[0], F_SETFL, O_NONBLOCK ); + + while (m_processRunning) { + dpkgMonitor(); + usleep( 50000 ); + } + + if (m_exitedProcess->normalExit()) { + if (m_exitedProcess->exitStatus() != 0) { + ok = _error->Error( "Child for %s exited with error %d", + argv [0], m_exitedProcess->exitStatus()); + } + } else { + ok = _error->Error( "Child for %s was killed by signal %d", + argv [0], m_exitedProcess->exitSignal()); + } + + if (ok) // do we run scripts in case dpkg died??? + ok = runScripts ("DPkg::Post-Invoke", false); + + return ok; +} + +ExtTerminalInterface *DPkgPM::terminal() { + return static_cast( + m_terminalPart->qt_cast( "ExtTerminalInterface" ) ); +} + +bool DPkgPM::forkScript (const char *cmd, bool fP) +{ + std::cerr << "adept::DPkgPM::forkScript(\"" << cmd << "\")" << std::endl; + if (fP) { + if (pipe( m_scriptPipe ) != 0) + return _error->Errno( + "pipe","Failed to create IPC pipe to subprocess"); + SetCloseExec (m_scriptPipe[0], true); + SetCloseExec (m_scriptPipe[1], true); + } + QStrList l; + l.append ("/bin/sh"); + l.append ("-c"); + l.append (cmd); + if (fP) { + connect( m_terminalPart, SIGNAL( forkedChild() ), + this, SLOT( setupScriptPipe() ) ); + } + + connect( m_terminalPart, SIGNAL( processExited( KProcess * ) ), + this, SLOT( processExit( KProcess * ) ) ); + connect( m_terminalPart, SIGNAL( processExited( const KProcess * ) ), + this, SLOT( processExitC( const KProcess * ) ) ); + + m_processRunning = true; + terminal()->startProgram( u8( "/bin/sh" ), l); + + if (fP) { + if (!feedPackages()) + return _error->Error("Failed feeding packages to script"); + } + + while (m_processRunning) { + kapp->processEvents(); + usleep(50000); + } + + std::cerr << "END: adept::DPkgPM::forkScript(\"" + << cmd << "\")" << std::endl; + + if (m_exitedProcess->normalExit()) { + if (m_exitedProcess->exitStatus() != 0) { + return _error -> Error("Child for %s exited with error %d", + cmd, m_exitedProcess->exitStatus()); + } else { + return true; + } + } else { + return _error->Error("Child for %s was killed by signal %d", + cmd, m_exitedProcess->exitSignal()); + } +} + +void DPkgPM::processExit(KProcess *p) { + processExitC( p ); +} + +void DPkgPM::processExitC(const KProcess *p) +{ + std::cerr << "a process exited!" << std::endl; + m_processRunning = false; + m_exitedProcess = p; +} + +void DPkgPM::setupScriptPipe() +{ + // setupScript(); + // std::cerr << "setupScriptPipe()" << std::endl; + dup2 (m_scriptPipe[0], STDIN_FILENO); +} + +void DPkgPM::setupDpkgChild() +{ + // setupScript(); + // std::cerr << "setupDpkgChild()" << std::endl; + setupChild(); +} + +bool DPkgPM::Go( int ) +{ + std::cerr << "kapture::DPkgPM::Go ()" << std::endl; + statusChanged( 0, i18n( "Preparing..." ) ); + bool ret = aptFront::DPkgPM::Go(-1); + QStrList l; + l.append("echo"); + l.append("dpkg run finished!"); + terminal()->startProgram( u8( "echo" ), l ); + statusChanged( 100, i18n( "Done" ) ); + return ret; +} + +void DPkgPM::dpkgMonitor () +{ + aptFront::DPkgPM::dpkgMonitor(); + kapp->processEvents(); +} + +void DPkgPM::updateStatus( std::string pkg, std::string ev, std::string r ) +{ + std::string op, msg; + aptFront::DPkgPM::updateStatus( pkg, ev, r ); + entity::Package p = cache::Global::get().packages().packageByName( pkg ); + + if ( m_currentOp == OInstall ) { + if ( p.markedNewInstall() ) { + if ( ev == "half-installed" ) + msg = u8( i18n( "Preparing installation of %1..." ) ); + else if ( ev == "unpacked" ) + msg = u8( i18n( "Unpacking %1..." ) ); + } else if ( p.markedUpgrade() ) { + if ( ev == "half-installed" ) + msg = u8( i18n( "Preparing upgrade of %1..." ) ); + else if ( ev == "unpacked" || ev == "half-configured" ) + msg = u8( i18n( "Replacing %1 with new version..." ) ); + } + } else if ( m_currentOp == OConfigure ) { + if ( p.markedNewInstall() ) { + if ( ev == "unpacked" ) + msg = u8( i18n( "Preparing to configure %1..." ) ); + else if ( ev == "half-configured" ) + msg = u8( i18n( "Configuring %1..." ) ); + else if ( ev == "installed" ) + msg = u8( i18n( "Installed %1" ) ); + } else if ( p.markedUpgrade() ) { + if ( ev == "unpacked" ) + msg = u8( i18n( "Preparing to configure new version of %1..." ) ); + else if ( ev == "half-configured" ) + msg = u8( i18n( "Configuring new version of %1..." ) ); + else if ( ev == "installed" ) + msg = u8( i18n( "Upgraded %1" ) ); + } + } else if ( m_currentOp == ORemove ) { + if ( ev == "installed" ) + msg = u8( i18n( "Preparing to remove %1..." ) ); + else if ( ev == "half-configured" || ev == "half-installed" ) + msg = u8( i18n( "Removing %1..." ) ); + else if ( ev == "config-files" || ev == "not-installed" ) + msg = u8( i18n( "Removed %1" ) ); + } else if ( m_currentOp == OPurge ) { + if ( ev == "config-files" ) + msg = u8( i18n( "Preparing to purge %1..." ) ); + else if ( ev == "not-installed" ) + msg = u8( i18n( "Purged %1" ) ); + } + + std::cerr << "updateStatus( " << pkg << ", " << ev << ", " << r << ")" << std::endl; + std::cerr << "updateStatus: msg = " << msg << std::endl; + std::cerr << "updateStatus: seen = " << m_seenOpCount + << ", total = " << m_totalOpCount << std::endl; + statusChanged( ( m_seenOpCount * 100 ) / m_totalOpCount, + u8( msg ).arg( pkg ) + ( ( r == "") ? "" : (" (" + r + ")") ) ); +} + +} + +#include "dpkgpm-gui.moc" diff --git a/adept/adept/dpkgpm-gui.h b/adept/adept/dpkgpm-gui.h new file mode 100644 index 0000000..435ee7f --- /dev/null +++ b/adept/adept/dpkgpm-gui.h @@ -0,0 +1,68 @@ +/** -*- C++ -*- + @file adept/dpkgpm-gui.h + @author Peter Rockai +*/ + +#ifndef EPT_DPKGPM_H +# define EPT_DPKGPM_H + +#include +#include +#include +#include +#include + +class KListBox; +namespace KParts { +class Part; +} + +namespace adept { + +class PkgSystem : public QObject, public debSystem +{ + Q_OBJECT +public: + PkgSystem (); + virtual pkgPackageManager *CreatePM( pkgDepCache *Cache ) const; + virtual void setTerminal( KParts::Part *t ); + KParts::Part *terminal() { return m_terminalPart; } + virtual int Score( Configuration const &Cnf ) { + return debSystem::Score (Cnf) + 2; }; +protected: + KParts::Part *m_terminalPart; +signals: + void statusChanged( int p, QString m ); +}; + +class DPkgPM : public QObject, public aptFront::DPkgPM +{ + Q_OBJECT +public: + DPkgPM (pkgDepCache *c, KParts::Part *t); + virtual bool forkDpkg (char *const argv[]); + virtual void dpkgMonitor (void); + virtual bool Go (int); + virtual bool forkScript (const char *, bool); + ExtTerminalInterface *terminal(); + virtual void updateStatus( std::string pkg, std::string ev, std::string r ); + +public slots: + void processExitC(const KProcess *p); + void processExit(KProcess *p); + void setupScriptPipe(); + void setupDpkgChild(); + +signals: + void statusChanged( int p, QString m ); + +protected: + KParts::Part *m_terminalPart; + // DPkgProgress *m_prog; + bool m_processRunning:1; + const KProcess *m_exitedProcess; +}; + +} + +#endif diff --git a/adept/adept/dpkgpm.cpp b/adept/adept/dpkgpm.cpp new file mode 100644 index 0000000..f4b4f0d --- /dev/null +++ b/adept/adept/dpkgpm.cpp @@ -0,0 +1,462 @@ +/** -*- C++ -*- + @file adept/dpkgpm.cpp + @author Peter Rockai +*/ + +#include +#include +#include "dpkgpm.h" +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +using namespace std; +using namespace aptFront; +using namespace cache; + +/* === PkgSystem === */ +DPkgPM::DPkgPM (pkgDepCache *C) + : pkgDPkgPM (C), m_seenOpCount( 0 ), m_totalOpCount( 0 ) +{ +} + +bool DPkgPM::Go( int ) +{ + cerr << "DPkgPM::Go()" << endl; + computeTotals(); + if (runScripts ("DPkg::Pre-Invoke", false) == false) + return false; + if (runScripts ("DPkg::Pre-Install-Pkgs", true) == false) + return false; + + for (vector::iterator I = List.begin(); I != List.end();) { + char *const *argv; + if (! setupArgs (&argv, I)) + return false; + + cerr << "running '"; + for (unsigned int k = 0; argv [k]; k++) + cerr << argv[k] << ' '; + cerr << "'" << endl; + if (_config->FindB("Debug::pkgDPkgPM",false) == true) + { + for (unsigned int k = 0; argv [k]; k++) + cerr << argv[k] << ' '; + cerr << endl; + continue; + } + + if (! forkDpkg (argv)) + return false; + delete[] argv; + if (! runScripts ("DPkg::Post-Invoke", false)) + return false; + } + return true; +} + +void DPkgPM::computeTotals() +{ + m_totalOpCount = 0; + for (vector::iterator I = List.begin(); I != List.end();I++) + { + entity::Package p = cache::Global::get().packages().packageByName( + I->Pkg.Name() ); + int x = 0; + switch ( I->Op ) { + case Item::Remove: x = 4; break; + case Item::Install: p.markedUpgrade() ? x = 3 : x = 2; break; + case Item::Purge: x = 2; break; + case Item::Configure: x = 3; break; + } + m_totalOpCount += x; + } +} + +bool DPkgPM::forkDpkg (char *const argv[]) +{ + cerr << "DPkgPM::forkDpkg ()" << endl; + cout << flush; + clog << flush; + cerr << flush; + + /* Mask off sig int/quit. We do this because dpkg also does when + it forks scripts. What happens is that when you hit ctrl-c it sends + it to all processes in the group. Since dpkg ignores the signal + it doesn't die but we do! So we must also ignore it */ + sighandler_t old_SIGQUIT = signal(SIGQUIT,SIG_IGN); + sighandler_t old_SIGINT = signal(SIGINT,SIG_IGN); + + // Fork dpkg + pid_t Child = ExecFork(); + if (Child == 0) { + if (! setupChild ()) { + cerr << "Error in dpkg post-fork setup!" << endl; + _exit (100); + } + execvp (argv [0], argv); + cerr << "Error executing dpkg!" << endl; + _exit (100); + } + + close( m_dpkgPipe[1] ); + fcntl( m_dpkgPipe[0], F_SETFL, O_NONBLOCK ); + + int Status = 0; + int ret = 0; + while ((ret = waitpid (Child, &Status, WNOHANG)) != Child) { + if (errno == EINTR || ret == 0) { + dpkgMonitor (); + usleep (200000); // 0.2 second hang + continue; + } + runScripts ("DPkg::Post-Invoke", false); + + signal(SIGQUIT,old_SIGQUIT); + signal(SIGINT,old_SIGINT); + return _error -> Errno ("waitpid","Couldn't wait for subprocess"); + } + + signal(SIGQUIT,old_SIGQUIT); + signal(SIGINT,old_SIGINT); + + // Check for an error code. + if (WIFEXITED(Status) == 0 || WEXITSTATUS(Status) != 0) + { + runScripts ("DPkg::Post-Invoke", false); + if (WIFSIGNALED(Status) != 0 && WTERMSIG(Status) == SIGSEGV) + return _error->Error("Sub-process %s received a segmentation fault.", argv [0]); + + if (WIFEXITED(Status) != 0) + return _error->Error("Sub-process %s returned an error code (%u)", argv[0], WEXITSTATUS(Status)); + + return _error->Error("Sub-process %s exited unexpectedly", argv[0]); + } + + return true; +} + +bool DPkgPM::setupArgs (char *const**a, std::vector::iterator &I) +{ + cerr << "DPkgPM::setupArgs ()" << endl; + unsigned int MaxArgs = _config->FindI("Dpkg::MaxArgs",350); + unsigned int MaxArgBytes = _config->FindI("Dpkg::MaxArgBytes",8192); + + vector::iterator J = I; + for (; J != List.end() && J->Op == I->Op; J++); + + // Generate the argument list + const char **Args = new const char *[MaxArgs + 50]; + if (J - I > (signed)MaxArgs) + J = I + MaxArgs; + + unsigned int n = 0; + unsigned long Size = 0; + string Tmp = _config->Find("Dir::Bin::dpkg","dpkg"); + Args[n++] = Tmp.c_str(); + Size += strlen(Args[n-1]); + + // Stick in any custom dpkg options + Configuration::Item const *Opts = _config->Tree("DPkg::Options"); + if (Opts != 0) + { + Opts = Opts->Child; + for (; Opts != 0; Opts = Opts->Next) + { + if (Opts->Value.empty() == true) + continue; + Args[n++] = Opts->Value.c_str(); + Size += Opts->Value.length(); + } + } + + pipe( m_dpkgPipe ); + stringstream fds; + fds << m_dpkgPipe[1]; + std::cerr << "reading end of the pipe: " << m_dpkgPipe[0] << std::endl; + + Args[n++] = "--status-fd"; + Size += strlen(Args[n-1]); + // bah, we leak a string every time we run dpkg... silly eh + Args[n++] = ( new string( fds.str() ) )->c_str(); + Size += strlen(Args[n-1]); + + switch (I->Op) + { + case Item::Remove: + Args[n++] = "--force-depends"; + Size += strlen(Args[n-1]); + Args[n++] = "--force-remove-essential"; + Size += strlen(Args[n-1]); + Args[n++] = "--remove"; + Size += strlen(Args[n-1]); + m_currentOp = ORemove; + break; + + case Item::Purge: + Args[n++] = "--force-depends"; + Size += strlen(Args[n-1]); + Args[n++] = "--force-remove-essential"; + Size += strlen(Args[n-1]); + Args[n++] = "--purge"; + Size += strlen(Args[n-1]); + m_currentOp = OPurge; + break; + + case Item::Configure: + Args[n++] = "--configure"; + Size += strlen(Args[n-1]); + m_currentOp = OConfigure; + break; + + case Item::Install: + Args[n++] = "--unpack"; + Size += strlen(Args[n-1]); + m_currentOp = OInstall; + break; + } + + // Write in the file or package names + if (I->Op == Item::Install) + { + for (;I != J && Size < MaxArgBytes; I++) + { + if (I->File[0] != '/') + return _error->Error("Internal Error, Pathname to install is not absolute '%s'",I->File.c_str()); + Args[n++] = I->File.c_str(); + Size += strlen(Args[n-1]); + } + } + else + { + for (;I != J && Size < MaxArgBytes; I++) + { + Args[n++] = I->Pkg.Name(); + Size += strlen(Args[n-1]); + } + } + Args[n] = 0; + J = I; + *a = (char *const *)Args; + return true; +} + +bool DPkgPM::setupChild () +{ + // cerr << "DPkgPM::setupChild ()" << endl; + if (chdir(_config->FindDir("DPkg::Run-Directory","/").c_str()) != 0) + return false; + + if (_config->FindB("DPkg::FlushSTDIN",true) == true && isatty(STDIN_FILENO)) + { + int Flags,dummy; + if ((Flags = fcntl(STDIN_FILENO,F_GETFL,dummy)) < 0) + return false; + + // Discard everything in stdin before forking dpkg + if (fcntl(STDIN_FILENO,F_SETFL,Flags | O_NONBLOCK) < 0) + return false; + + while (read(STDIN_FILENO,&dummy,1) == 1); + + if (fcntl(STDIN_FILENO,F_SETFL,Flags & (~(long)O_NONBLOCK)) < 0) + return false; + } + + /* No Job Control Stop Env is a magic dpkg var that prevents it + from using sigstop */ + putenv("DPKG_NO_TSTP=yes"); + close( m_dpkgPipe[0] ); + + return true; +} + +void DPkgPM::dpkgMonitor () +{ + char buf[1024]; + int r = read( m_dpkgPipe[0], buf, 1023 ); + + if ( r > 0 ) { + buf[r] = 0; + std::string b( buf ); + + // parse status updates from dpkg + while ( true ) { + std::string::size_type colon, nl = b.find( '\n' ); + m_statusBuffer.append( string( b, 0, nl ) ); + if ( nl == std::string::npos ) + break; + + // cerr << "dpkg status completed line: " << m_statusBuffer << endl; + colon = m_statusBuffer.find( ": " ); + string l( m_statusBuffer, 0, colon ); + string r( m_statusBuffer, colon + 2, string::npos ); + + if ( l == "status" ) { + colon = r.find( ": " ); + std::string p( r, 0, colon ); + r = string( r, colon + 2, string::npos ); + + colon = r.find( ": " ); + std::string e( r, 0, colon ); + if ( colon == string::npos ) + r = ""; + else + r = string( r, colon + 2, string::npos ); + updateStatus( p, e, r ); + } + + b = string( b, nl + 1, string::npos ); + m_statusBuffer = string(); + nl = b.find( '\n' ); + } + } +} + +void DPkgPM::updateStatus( std::string pkg, std::string ev, std::string r ) +{ + //std::cerr << "DPkgPM::updateStatus " << pkg << " " << ev << " " << r + // << std::endl; + if (ev.find("error") != string::npos) { + char* list[5]; + char *line = strdup(m_statusBuffer.c_str()); + TokSplitString(':', line, list, sizeof(list)/sizeof(list[0])); + WriteApportReport(list[1], list[3]); + free(line); + return; + } + + OpAndStatus os = std::make_pair( m_currentOp, ev ); + if ( m_seenOps[ std::make_pair( os, pkg ) ] == 0 ) { + m_seenOpCount++; + m_seenOps[ std::make_pair( os, pkg ) ] = 1; + } +} + +bool DPkgPM::runScripts (const char *Cnf, bool sP) +{ + cerr << "DPkgPM::runScripts ('" << Cnf << "', " << sP << ")" << endl; + Configuration::Item const *Opts = _config->Tree(Cnf); + if (Opts == 0 || Opts->Child == 0) + return true; + Opts = Opts->Child; + + unsigned int Count = 1; + for (; Opts != 0; Opts = Opts->Next, Count++) + { + if (Opts->Value.empty() == true) + continue; + + // Determine the protocol version + string OptSec = Opts->Value; + string::size_type Pos; + if ((Pos = OptSec.find(' ')) == string::npos || Pos == 0) + Pos = OptSec.length(); + OptSec = "DPkg::Tools::Options::" + string(Opts->Value.c_str(),Pos); + + m_version = _config->FindI (OptSec + "::Version", 1); + + // Purified Fork for running the script + // pid_t Process = ExecFork(); + forkScript (Opts->Value.c_str(), sP); + } + + return true; +} + +bool DPkgPM::SendV1Pkgs (FILE *F) +{ + bool Die = false; + for (vector::iterator I = List.begin(); I != List.end(); ++I) + { + // Only deal with packages to be installed from .deb + if (I->Op != Item::Install) + continue; + + // No errors here.. + if (I->File[0] != '/') + continue; + + /* Feed the filename of each package that is pending install + into the pipe. */ + fprintf(F,"%s\n",I->File.c_str()); + if (ferror(F) != 0) + { + Die = true; + break; + } + } + return ! Die; +} + +bool DPkgPM::forkScript (const char *cmd, bool fP) +{ + cerr << "DPkgPM::forkScript ()" << endl; + if (fP) { + if (pipe( m_scriptPipe ) != 0) + return _error -> Errno("pipe", "Failed to create IPC pipe to subprocess"); + SetCloseExec( m_scriptPipe[ 0 ], true ); + SetCloseExec( m_scriptPipe[ 1 ], true ); + } + pid_t Process = ExecFork (); + if (Process == 0) + { + setupScript (cmd, fP); + + const char *Args[4]; + Args[0] = "/bin/sh"; + Args[1] = "-c"; + Args[2] = cmd; + Args[3] = 0; + execv(Args[0],(char **)Args); + _exit(100); + } + + if (fP) { + if (! feedPackages ()) + return _error -> Error ("Failed feeding packages to script"); + } + + // Clean up the sub process + if (ExecWait (Process, cmd) == false) + return _error -> Error("Failure running script %s", cmd); +} + +void DPkgPM::setupScript (const char * /*cmd*/, bool fP) +{ + cerr << "DPkgPM::setupScript ()" << endl; + if (fP) { + dup2 (m_scriptPipe [0], STDIN_FILENO); + SetCloseExec(STDOUT_FILENO, false); + SetCloseExec(STDIN_FILENO, false); + SetCloseExec(STDERR_FILENO, false); + } +} + +bool DPkgPM::feedPackages () +{ + close(m_scriptPipe[ 0 ]); + + FILE *F = fdopen(m_scriptPipe[ 1 ], "w"); + if (F == 0) + return _error->Errno("fdopen","Faild to open new FD"); + + // Feed it the filenames. + bool Die = false; + if (m_version <= 1) + Die = !SendV1Pkgs (F); + else + Die = !SendV2Pkgs(F); + + fclose(F); + return ! Die; +} diff --git a/adept/adept/dpkgpm.h b/adept/adept/dpkgpm.h new file mode 100644 index 0000000..b899693 --- /dev/null +++ b/adept/adept/dpkgpm.h @@ -0,0 +1,49 @@ +/** -*- C++ -*- + @file adept/dpkgpm.h + @author Peter Rockai +*/ + +#include +#include +#include +#include + +#ifndef DPKGPM_H +# define DPKGPM_H + +namespace aptFront { + +class DPkgPM : public pkgDPkgPM { +protected: + enum Op { ORemove, OPurge, OConfigure, OInstall }; + Op m_currentOp; + int m_dpkgPipe[2]; + int m_scriptPipe[2]; + unsigned m_version; + std::string m_statusBuffer; + typedef std::pair< Op, std::string > OpAndStatus; + typedef std::map< std::pair< OpAndStatus, std::string >, int > SeenOps; + SeenOps m_seenOps; + int m_totalOpCount; + int m_seenOpCount; +public: + DPkgPM (pkgDepCache *C); + virtual bool Go ( int ); + virtual void computeTotals(); + virtual bool setupArgs (char *const **a, std::vector::iterator &I); + virtual bool forkDpkg (char *const argv[]); + virtual bool forkScript (const char *, bool); + virtual bool runScripts (const char *, bool); + virtual bool setupChild (); + virtual void setupScript (const char *, bool); + virtual void dpkgMonitor (void); + virtual bool SendV1Pkgs (FILE *); + virtual bool feedPackages (void); + virtual void updateStatus( std::string pkg, std::string ev, std::string r ); +}; + +} + + +#endif /* ifndef DPKGPM_H */ + diff --git a/adept/adept/easytagfilter.cpp b/adept/adept/easytagfilter.cpp new file mode 100644 index 0000000..3049d60 --- /dev/null +++ b/adept/adept/easytagfilter.cpp @@ -0,0 +1,81 @@ +#include +#include +#include +#include +#include +#include +#include "easytagfilter.h" + +using namespace aptFront; +using namespace adept; + +static void fillCombo( QComboBox *c, const std::string f ) { + Cache &cache = cache::Global::get(); // FIXME? + std::set< ept::debtags::Tag > t; + t = cache.tags().tags( f ); + for (std::set< ept::debtags::Tag >::iterator i = t.begin(); i != t.end(); ++ i) { + c->insertItem( i->name() ); + } +} + +EasyTagFilterWidget::EasyTagFilterWidget( QWidget *parent, const char *name ) + : EasyTagFilterUi( parent, name ) +{ + fillCombo( m_use, "use" ); + fillCombo( m_interface, "interface" ); + fillCombo( m_worksWith, "works-with" ); + fillCombo( m_role, "role" ); + connect( m_use, SIGNAL( activated( int ) ), + this, SLOT( widgetsChanged() ) ); + connect( m_interface, SIGNAL( activated( int ) ), + this, SLOT( widgetsChanged() ) ); + connect( m_worksWith, SIGNAL( activated( int ) ), + this, SLOT( widgetsChanged() ) ); + connect( m_role, SIGNAL( activated( int ) ), + this, SLOT( widgetsChanged() ) ); + connect( m_reset, SIGNAL( clicked() ), + this, SLOT( reset() ) ); +} + +static void setFacet( QComboBox *c, const std::string fac, + EasyTagFilter< entity::Package > &f ) +{ + if (c->currentItem()) + f.set( fac, c->currentText() ); +} + +EasyTagFilterWidget::Predicate EasyTagFilterWidget::predicate() +{ + EasyTagFilter< entity::Package > f; + setFacet( m_use, "use", f ); + setFacet( m_interface, "interface", f ); + setFacet( m_worksWith, "works-with", f ); + setFacet( m_role, "role", f ); + return predicate::adapt< entity::Entity >( f ); +} + +static void setCombo( QComboBox *c, const std::string &t ) { + c->blockSignals( true ); + if (t == "") + c->setCurrentItem( 0 ); + else + c->setCurrentText( t ); + c->blockSignals( false ); +} + +void EasyTagFilterWidget::predicateChanged() { + typedef EasyTagFilter< entity::Package > F; + F f = downcast< F >( m_pred ); + setCombo( m_use, f.get( "use" ) ); + setCombo( m_interface, f.get( "interface" ) ); + setCombo( m_role, f.get( "role" ) ); + setCombo( m_worksWith, f.get( "works-with" ) ); +} + +void EasyTagFilterWidget::reset() { + setCombo( m_use, "" ); + setCombo( m_interface, "" ); + setCombo( m_role, "" ); + setCombo( m_worksWith, "" ); + emit widgetsChanged(); +} diff --git a/adept/adept/easytagfilter.h b/adept/adept/easytagfilter.h new file mode 100644 index 0000000..66977d5 --- /dev/null +++ b/adept/adept/easytagfilter.h @@ -0,0 +1,93 @@ +/** -*- C++ -*- + @file adept/quickfilter.h + @author Peter Rockai +*/ + +#include +#include +#include + +#include +#include +//#include +#include + +#include +#include +#include + +#ifndef EPT_EASYTAGFILTER_H +#define EPT_EASYTAGFILTER_H + +namespace adept { + +template< typename T > +struct EasyTagFilter : predicate::Implementation< T, EasyTagFilter< T > >, + InterfacingPredicate +{ + typedef std::map< std::string, std::string > Tags; + + EasyTagFilter() { + setupPredicate(); + } + + void setupPredicate() { + Cache &cache = cache::Global::get(); // FIXME? + m_op = predicate::True< T >(); + for (Tags::iterator i = m_tags.begin(); i != m_tags.end(); ++i ) { + m_op = m_op and predicate::Factory< T >::tag( + cache.tags().tagByName( i->first + "::" + i->second ) ); + // kdDebug() << t.summary() << endl; + } + } + + std::string summary() const { + std::string r( i18n( "EasyTag filter: " ).local8Bit() ); + for (Tags::const_iterator j, i = m_tags.begin(); + i != m_tags.end(); ++i ) { + j = i; ++j; + r += i->first + ": " + i->second; + if (j != m_tags.end()) + r += ", "; + } + return r; + } + + void parseArguments( const predicate::ArgumentList & ) {} + + bool operator==( const EasyTagFilter &o ) const { + return o.m_tags == m_tags; + } + + bool operator()( const T &p ) { + return m_op( p ); + } + + void set( const std::string &f, const std::string &t ) { + m_tags[f] = t; + setupPredicate(); + } + + std::string get( const std::string &f ) { + return m_tags[ f ]; + } + +protected: + Tags m_tags; + predicate::Predicate< T > m_op; +}; + +class EasyTagFilterWidget : public EasyTagFilterUi +{ + Q_OBJECT +public: + EasyTagFilterWidget( QWidget *parent, const char *name = 0 ); + virtual Predicate predicate(); +public slots: + void predicateChanged(); + void reset(); +}; + +} + +#endif diff --git a/adept/adept/easytagfilterui.ui b/adept/adept/easytagfilterui.ui new file mode 100644 index 0000000..998bf2b --- /dev/null +++ b/adept/adept/easytagfilterui.ui @@ -0,0 +1,201 @@ + +adept::EasyTagFilterUi + + + EasyTagFilterUi + + + + 0 + 0 + 611 + 116 + + + + QuickFilterUi + + + + unnamed + + + 2 + + + 1 + + + + m_title + + + + 5 + 5 + 0 + 0 + + + + <b>Easy Tag Filter</b> + + + + + layout4 + + + + unnamed + + + + spacer5 + + + Horizontal + + + Fixed + + + + 20 + 20 + + + + + + layout3 + + + + unnamed + + + + textLabel4 + + + Works With: + + + + + textLabel3 + + + Role: + + + + + + Anything + + + + m_worksWith + + + + + m_reset + + + Reset Filter + + + + + + Any + + + + m_interface + + + + + textLabel1 + + + Use: + + + + + + Any + + + + m_use + + + + + + Any + + + + m_role + + + + + textLabel2 + + + Interface: + + + + + + + spacer6 + + + Horizontal + + + Expanding + + + + 130 + 20 + + + + + + + + spacer7 + + + Vertical + + + Fixed + + + + 20 + 16 + + + + + + + adept/filterlist.h + + + diff --git a/adept/adept/extendablelist.cpp b/adept/adept/extendablelist.cpp new file mode 100644 index 0000000..c3abf1d --- /dev/null +++ b/adept/adept/extendablelist.cpp @@ -0,0 +1,339 @@ +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +using namespace adept; + +ExtendableList::ExtendableList( QWidget *p, const char *n ) + : KListView( p, n ), + m_toggleColumn( 0 ), m_inDtor( false ), + m_extenderUpdateScheduled( false ), + m_needSort( false ), + m_extenderHighlight( false ) +{ + // kdDebug() << "connecting processClick har har" << endl; + connect( this, SIGNAL( clicked( QListViewItem *, + const QPoint &, int ) ), + this, SLOT( processClick( QListViewItem *, + const QPoint &, int ) ) ); + connect( this, SIGNAL( moved() ), + this, SLOT( delayedUpdateExtenders() ) ); + connect( this, SIGNAL( collapsed( QListViewItem * ) ), + this, SLOT( delayedUpdateExtenders() ) ); + connect( this, SIGNAL( expanded( QListViewItem * ) ), + this, SLOT( delayedUpdateExtenders() ) ); + setTreeStepSize( 15 ); + + m_baseIcon = SmallIcon( u8( "extender_closed" ) ); + m_extendedIcon = SmallIcon( u8( "extender_opened" ) ); + QImage img; + img = m_baseIcon; + KIconEffect::toGray( img, 1.0 ); + m_unextendableIcon = QPixmap( img ); +} + +void ExtendableList::keyPressEvent( QKeyEvent *e ) { + ExtendableItem *item = dynamic_cast< ExtendableItem* >( currentItem() ); + if ( item ) { + if ( item->extendable() ) { + if ( item->extender() && e->key() == Qt::Key_Left ) { + return item->hideExtender(); + } else if ( !item->extender() && e->key() == Qt::Key_Right ) { + return item->showExtender(); + } + } + KListView::keyPressEvent( e ); + if ( e->key() == Qt::Key_Left || e->key() == Qt::Key_Right ) + item->updateIcon(); + } else return KListView::keyPressEvent( e ); +} + +void ExtendableList::openToplevel() { + QListViewItem *i; + for ( i = firstChild(); i != 0; i = i->nextSibling() ) { + i->setOpen( true ); + } +} + +int ExtendableList::extenderOffset( ExtendableItem *i ) +{ + int c = 0, x = 0; + + while( c < m_toggleColumn ) { + x += columnWidth( c ); + c ++; + } + + if ( m_toggleColumn >= 0 ) { + // *sigh* + if ( i->pixmap( m_toggleColumn ) ) + x += i->pixmap( m_toggleColumn )->width(); + if ( rootIsDecorated() ) + x += treeStepSize(); + if ( i->parent() ) + x += treeStepSize(); + } + + return x + 2; // + 2 = icon margin, apparently... gnah +} + +void ExtendableList::updateExtender( ExtendableItem *i ) +{ + // setUpdatesEnabled( false ); + + // since updateGeometries is private, we use this dirty trick to + // get at it (since setContentsPos in QListView calls it + setContentsPos( contentsX(), contentsY() ); + + if ( !i->isVisible() || ( i->parent() && !i->parent()->isOpen() ) ) { + kdDebug() << "hiding invisible item's extender" << endl; + i->hideExtender(); + return; + } + + // QRect rect = itemRect( i ); + addChild( i->extender(), extenderOffset( i ), itemPos( i ) ); + // addChild( i->extender(), x, rect.y() ); + i->extender()->show(); + i->extender()->resize( visibleWidth() - extenderOffset( i ), + i->extender()->height() ); + if ( i->height() != i->extender()->frameSize().height() ) { + i->setHeight( i->extender()->frameSize().height() ); + delayedUpdateExtenders(); // re-update since we broke layout + } + + i->extender()->setupColors(); + + // setUpdatesEnabled( true ); + // addChild( i->extender(), x, itemPos( i ) ); + // QTimer::singleShot( 0, this, SLOT( triggerUpdate() ) ); + // QTimer::singleShot( 0, i->extender(), SLOT( setupColors() ) ); +} + +void ExtendableList::delayedUpdateExtenders() +{ + if ( m_extenderUpdateScheduled ) + return; + m_extenderUpdateScheduled = true; + // kdDebug() << "ExtendableList::delayedUpdateExtenders()" << endl; + QTimer::singleShot( 0, this, SLOT( updateExtenders() ) ); +} + +void ExtendableList::clear() +{ + kdDebug() << "ExtendableList::clear()" << endl; + KListView::clear(); + kdDebug() << "end of ExtendableList::clear()" << endl; +} + +void ExtendableList::show() +{ + KListView::show(); + updateExtenders(); +} + +void ExtendableList::showEvent( QShowEvent *e ) +{ + KListView::showEvent( e ); + updateExtenders(); +} + +void ExtendableList::resizeEvent( QResizeEvent *e ) +{ + KListView::resizeEvent( e ); + updateExtenders(); + // delayedUpdateExtenders(); +} + +void ExtendableList::updateExtenders() +{ + m_extenderUpdateScheduled = false; + setUpdatesEnabled( false ); + // updateGeometries(); + // since updateGeometries is private, we use this dirty trick to + // get at it (since setContentsPos in QListView calls it + setContentsPos( contentsX(), contentsY() ); + extendersChanged(); + kdDebug() << "ExtendableList::updateExtenders(); count = " + << m_extenders.size() << endl; + if ( m_needSort ) { + std::sort( m_extenders.begin(), m_extenders.end(), ExtendableItem::s_less ); + m_needSort = false; + } + + std::for_each( m_extenders.begin(), m_extenders.end(), + std::bind1st( std::mem_fun( &ExtendableList::updateExtender ), + this ) ); + + setUpdatesEnabled( true ); + // triggerUpdate(); + if ( !m_extenderUpdateScheduled ) + QTimer::singleShot( 0, this, SLOT( triggerUpdate() ) ); + /* if ( m_extenders.empty() ) + QTimer::singleShot( 0, this, SLOT( triggerUpdate() ) ); */ + // QTimer::singleShot( 0, this, SIGNAL( extendersChanged() ) ); +} + +void ExtendableList::addExtender( ExtendableItem *item ) +{ + m_extenders.push_back( item ); + m_needSort = true; + // std::sort( m_extenders.begin(), m_extenders.end(), ExtendableItem::s_less ); + // updateExtender( item ); + delayedUpdateExtenders(); +} + +void ExtendableList::removeExtender( ExtendableItem *i ) +{ + kdDebug() << "ExtendableList::removeExtender( " << i << " )" << endl; + m_extenders.erase( std::remove( m_extenders.begin(), + m_extenders.end(), i ), + m_extenders.end() ); + // the above retains ordering so no need to re-sort + if (!m_inDtor) + delayedUpdateExtenders(); +} + +void ExtendableList::processClick( QListViewItem *it, + const QPoint &pt, int c ) +{ + // if (! it) return; + ExtendableItem *item = dynamic_cast< ExtendableItem* >( it ); + if (!item) return; + kdDebug() << "ExtendableList::processClick (a real item)" << endl; + + if (c == m_toggleColumn) + item->toggleExtender(); + if ( item->extender() ) + item->extender()->setupColors(); + delayedUpdateExtenders(); + /* if (item->extender()) { + if (c == m_toggleColumn) + item->toggleExtender(); + } else + item->toggleExtender(); */ +} + +ExtendableList::~ExtendableList() { +} + +ExtendableList *ExtendableItem::list() +{ + return dynamic_cast< ExtendableList * >( listView() ); +} + +bool ExtendableItem::s_less( + const ExtendableItem *a, const ExtendableItem *b ) +{ + return a->less( b ); +} + +int ExtendableItem::compare( QListViewItem *i, int c, bool asc ) const +{ + ExtendableItem *o = dynamic_cast< ExtendableItem * >( i ); + return int( o->less( this ) ) - int( less( o ) ); +} + +void ExtendableItem::updateIcon() { + QPixmap p; + if ( !extender() ) { + p = list()->baseIcon(); + if ( !extendable() && !firstChild() ) { + p = list()->unextendableIcon(); + } else if ( isOpen() ) { + p = list()->extendedIcon(); + } + } else { + p = list()->extendedIcon(); + } + setPixmap( list()->toggleColumn(), p ); + setUpdatedIcon(p); + + // umm hack + if ( dynamic_cast< ExtendableItem * >( parent() ) ) + dynamic_cast< ExtendableItem * >( parent() )->updateIcon(); +} + + +void ExtendableItem::toggleExtender() +{ + if (m_extender) { + setup(); + if( list() ) // this could as well be 0... bah + list()->removeExtender( this ); + delete m_extender; + m_extender = 0; + } else { + m_extender = createExtender(); + if (m_extender) { + m_extender->setItem( this ); + list()->addExtender( this ); + } + if ( !m_extender && firstChild() ) { + setOpen( !isOpen() ); + } + } + updateIcon(); +} + +void ExtendableItem::paintBranches( QPainter *p, + const QColorGroup &cg, int w, int y, int h ) +{ + /* if (!isAlternate()) + p->setBackgroundColor( + KGlobalSettings::alternateBackgroundColor() ); + p->eraseRect( 0, y, w, h ); */ + p->eraseRect( 0, 0, w, h ); +} + +/* void ExtendableItem::paintCell( QPainter *p, const QColorGroup &cg, + int column, int width, int alignment ) +{ + QPixmap pm( width, height() ); + QPainter _p( &pm ); + KListViewItem::paintCell( &_p, cg, column, width, alignment ); + p->drawPixmap( 0, 0, pm ); + } */ + + +static void setcolor( QWidget *w, ExtendableItem *i ) { + if ( i->isSelected() && i->list()->extenderHighlight() ) + w->setPaletteBackgroundColor( w->colorGroup().highlight() ); + else if ( i->isAlternate() ) + w->setPaletteBackgroundColor( + KGlobalSettings::alternateBackgroundColor() ); + else + w->setPaletteBackgroundColor( w->colorGroup().base() ); + // w->setBackgroundMode( QWidget::PaletteBase ); +} +void ItemExtender::setupColors() +{ + if ( !item() ) return; + setcolor( this, item() ); + QObjectList *chld = queryList( "QWidget" ); + QObjectListIt it( *chld ); + QWidget *o; + while ((o = dynamic_cast< QWidget * >( it.current() )) != 0) { + setcolor( o, item() ); + ++it; + } +} + +ExtendableItem::~ExtendableItem() +{ + // kdDebug() << "~ExtendableList; list = " << list() << endl; + // kdDebug() << "extender() = " << extender() << endl; + while ( firstChild() ) + delete firstChild(); // har har + if( extender() && list() ) // list() could be 0... + list()->removeExtender( this ); + if (extender()) + extender()->deleteLater(); +} diff --git a/adept/adept/extendablelist.h b/adept/adept/extendablelist.h new file mode 100644 index 0000000..e95df03 --- /dev/null +++ b/adept/adept/extendablelist.h @@ -0,0 +1,166 @@ +// -*- C++ -*- +#include +#include +#include +#include +#include + +#include + +#ifndef EPT_EXTENDABLELIST_H +#define EPT_EXTENDABLELIST_H +namespace adept { + +using namespace aptFront; + +class ExtendableItem; +class ExtendableList; +class ItemExtender; + +class ExtendableList : public KListView { + Q_OBJECT +public: + typedef bool(*ItemCompare)( const ExtendableItem *, + const ExtendableItem * ); + ExtendableList( QWidget *p = 0, const char *n = 0 ); + virtual ~ExtendableList(); + QPixmap extendedIcon() { return m_extendedIcon; } + QPixmap baseIcon() { return m_baseIcon; } + QPixmap unextendableIcon() { return m_unextendableIcon; } + int extenderOffset( ExtendableItem *i ); + void setExtenderHighlight( bool e ) { m_extenderHighlight = e; } + bool extenderHighlight() { return m_extenderHighlight; } +public slots: + void addExtender( ExtendableItem *i ); + void removeExtender( ExtendableItem *i ); + void updateExtender( ExtendableItem *i ); + void delayedUpdateExtenders(); + void updateExtenders(); + void setToggleColumn( int c ) { + m_toggleColumn = c; + } + unsigned toggleColumn() { return m_toggleColumn; } + virtual void show(); + virtual void clear(); + utils::Range< ExtendableItem * > extenders() { + return utils::range( m_extenders.begin(), m_extenders.end() ); } + void openToplevel(); +protected slots: + void processClick( QListViewItem *, const QPoint &, int ); +signals: + void extendersChanged(); +protected: + virtual void resizeEvent( QResizeEvent * ); + virtual void showEvent( QShowEvent * ); + virtual void keyPressEvent( QKeyEvent * ); + std::vector< ExtendableItem * > m_extenders; + QPixmap m_extendedIcon; + QPixmap m_baseIcon; + QPixmap m_unextendableIcon; + int m_toggleColumn; + bool m_inDtor:1; + bool m_extenderUpdateScheduled:1; + bool m_needSort:1; + bool m_extenderHighlight:1; +}; + +class ExtendableItem : public KListViewItem { +public: + + ExtendableItem( ExtendableList *l ) + : KListViewItem( l ), m_extender( 0 ) { + } + + ExtendableItem( ExtendableList *l, ExtendableItem *prev ) + : KListViewItem( l, prev ), m_extender( 0 ) { + } + + ExtendableItem( ExtendableItem *p, ExtendableItem *prev ) + : KListViewItem( p, prev ), m_extender( 0 ) { + } + + ExtendableItem( ExtendableItem *p ) + : KListViewItem( p ), m_extender( 0 ) { + } + + virtual void setup() { + KListViewItem::setup(); + updateIcon(); + } + void toggleExtender(); + + void hideExtender() { + if (extender()) + toggleExtender(); + } + + void showExtender() { + if (!extender()) + toggleExtender(); + } + + ItemExtender *extender() { return m_extender; } + + static bool s_less( const ExtendableItem *a, const ExtendableItem *b ); + + ExtendableList *list(); + + virtual void updateIcon(); + virtual void setUpdatedIcon(QPixmap& pm) { return; }; + + virtual void paintBranches( QPainter *, const QColorGroup &, int, int, int ); + + virtual ItemExtender *createExtender() = 0; + virtual bool extendable() const { return false; } + virtual bool less( const ExtendableItem * ) const = 0; + virtual int compare( QListViewItem *other, int col, bool ascending ) const; + + virtual ~ExtendableItem(); + virtual void setHeight( int h ) { KListViewItem::setHeight( h ); } +protected: + ItemExtender *m_extender; +}; + +class ItemExtender : public QWidget { + Q_OBJECT +public: + // ItemExtender( ExtendableItem *item ); + ItemExtender( QWidget *parent, const char *n ) + : QWidget( parent, n ), m_item( 0 ) + {} + + virtual void setItem( ExtendableItem *i ) { + m_item = i; + } + + virtual void polish() { + setupColors(); + } + + ExtendableItem *item() { + return m_item; + } + + void resize( int w, int h ) { + setUpdatesEnabled( false ); + QWidget::resize( w, h ); + setUpdatesEnabled( true ); + QWidget::resize( w, layout()->minimumSize().height() ); + } + + void resize( const QSize &s ) { + resize( s.width(), s.height() ); + } + +public slots: + void setupColors(); +protected: + virtual void mouseReleaseEvent( QMouseEvent *e ) { + e->accept(); + } // throw away mouse clicks :-) + ExtendableItem *m_item; +}; + +} + +#endif diff --git a/adept/adept/filterlist.cpp b/adept/adept/filterlist.cpp new file mode 100644 index 0000000..bb798cd --- /dev/null +++ b/adept/adept/filterlist.cpp @@ -0,0 +1,232 @@ +#include +#include +#include +#include + +//#include + +//#include +#include + +#include +#include +#include +#include +#include +#include + + +using namespace adept; + +/* +// TODO: Beat enrico till this lands in some of our libs... +template< typename PKG, typename TAG > +class TagcollConsumerAdaptor : + public utils::ConsumerImpl< PKG,TagcollConsumerAdaptor > +{ +protected: + Consumer& m_out; + +public: + TagcollConsumerAdaptor( Consumer& out) : m_out( out ) {} + virtual void consume( const PKG& a ) { + if (a != PKG()) + m_out.consume(a, a.tags()); + } +}; +*/ + +PredicateInterface::PredicateInterface( QWidget *w, const char *n ) + : ItemExtender( w, n ) +{ +} + +void PredicateInterface::widgetsChanged() { + kdDebug() << "PredicateInterface::widgetsChanged()" << endl; + emit predicateDrop( m_pred ); + m_pred = predicate(); + emit predicateAdd( m_pred ); + downcast< FilterItem >( item() ).setPredicate( m_pred ); +} + +FilterList::FilterList( QWidget *parent, const char *name ) + : ExtendableList( parent, name ), + m_pred( predicate::True< entity::Entity >() ), + m_hidden( predicate::True< entity::Entity >() ) +{ + m_itemsSeen = 0; + // addColumn( " ", 20 ); + addColumn( i18n( "Active filters" ), 240 ); + // setSortColumn( -1 ); + /* setItemsMovable( true ); + setDragEnabled( true ); + setAcceptDrops( true ); */ + setResizeMode( LastColumn ); + setAllColumnsShowFocus (true); + + resize( 240, 180 ); + connect( this, SIGNAL( + contextMenuRequested( QListViewItem *, const QPoint + &, int ) ), + this, SLOT( contextMenu( QListViewItem *, const + QPoint &, int) ) ); + connect( this, SIGNAL( extendersChanged() ), + this, SLOT( updateHeight() ) ); +} + +void FilterList::emitPredicateChanged() { + predicateChanged( m_hidden and m_pred ); +} + +void FilterList::updateHeight() { + int h = header()->height() + 4; + for ( QListViewItem *i = firstChild(); i != 0; i = i->nextSibling() ) { + h += i->totalHeight(); + } + // int h = contentsHeight() + header()->height() + 4; // magic constant + setMinimumHeight( h ); + setMaximumHeight( h ); +} + +void FilterList::drawContents( QPainter *p, int a, int b, int c, int d ) { + if ( m_itemsSeen != childCount() ) { + m_itemsSeen = childCount(); + updateHeight(); + } // hmm, doesn't work... bah :p + KListView::drawContents( p, a, b, c, d ); +} + +void FilterList::plugLister( Lister *l ) { + m_lister = l; + connect( this, SIGNAL( predicateChanged( ListerPredicate ) ), + l, SLOT( baseSet( ListerPredicate ) ) ); +} + +void FilterList::setPredicate( Predicate p ) { + clear(); + m_pred = p; + appendPredicate( p ); + emitPredicateChanged(); +} + +void FilterList::setHiddenPredicate( Predicate p ) { + m_hidden = p; + emitPredicateChanged(); +} + +void FilterList::editorPredicateDrop( Predicate p ) { + m_pred = predicate::remove( m_pred, p ); + emitPredicateChanged(); +} + +void FilterList::editorPredicateAdd( Predicate p ) { + kdDebug() << "FilterList::editorPredicateAdd" << endl; + m_pred = m_pred and p; + emitPredicateChanged(); +} + +void FilterList::appendPredicate( Predicate p ) { + if (p.is< And >()) { + And a = p; + for (utils::Range< Predicate > r = a.parts(); + r != r.end(); ++r ) + appendPredicate( *r ); + } else if (p.is< predicate::True< entity::Entity > >() ) { + // we generally ignore truth + } else { + m_pred = m_pred and p; + // kdDebug() << p.serialize() << endl; + // kdDebug() << p.prettyPrint() << endl; + FilterItem *i; + i = new FilterItem( this ); + i->setPredicate( p ); + } +} + +void FilterList::contextMenu( QListViewItem *it, const QPoint &pt, int /*c*/ ) +{ + std::cerr << "FilterList::contextMenu(p);" << std::endl; + FilterItem *i = dynamic_cast< FilterItem * >( it ); + if (! i) + return; + QPopupMenu *m = new QPopupMenu( this ); + m->insertItem( i18n( "Reset Filter" ), 1 ); + m->insertItem( i18n( "Remove Filter" ), 0 ); + m->insertSeparator(); + m->insertItem( i18n( "Add Quick Filter" ), 8 ); + m->insertItem( i18n( "Add State Filter" ), 9 ); + m->insertItem( i18n( "Add Tag Filter" ), 10 ); + m->insertItem( i18n( "Add Easy Tag Filter" ), 11 ); + // m->insertItem( "Add Tag Filter", tagMenu() ); + m_context = i; + connect(m, SIGNAL(activated(int)), this, SLOT(contextActivated(int))); + m->exec(pt); + delete m; +} + + +void FilterList::contextActivated( int i ) +{ + predicate::Predicate< entity::Entity > p; + switch (i) { + case 0: + m_pred = predicate::remove( m_pred, m_context->predicate() ); + delete m_context; + emitPredicateChanged(); + return; + case 1: + m_context->reset(); + return; + case 8: + p = predicate::adapt< entity::Entity >( + QuickFilter< entity::Package >() ); + break; + case 9: + p = predicate::adapt< entity::Entity >( + StateFilter< entity::Package >() ); + break; + case 10: + p = predicate::adapt< entity::Entity >( + TagFilter< entity::Package >() ); + break; + case 11: + p = predicate::adapt< entity::Entity >( + EasyTagFilter< entity::Package >() ); + break; + } + if (p.impl()) { + kdDebug() << "summary: " << + downcast< InterfacingPredicate >( p ).summary() << endl; + appendPredicate( p ); + emitPredicateChanged(); + } +} + +ItemExtender *FilterItem::createExtender() +{ + PredicateInterface *o = 0; + if (m_pred.is< QuickFilter< entity::Package > >()) { + o = new QuickFilterWidget( list(), 0 ); + } else if (m_pred.is< StateFilter< entity::Package > >()) { + o = new StateFilterWidget( list(), 0 ); + } else if (m_pred.is< EasyTagFilter< entity::Package > >()) { + o = new EasyTagFilterWidget( list(), 0 ); + } else if (m_pred.is< TagFilter< entity::Package > >()) { + o = new TagFilterWidget( list(), 0 ); + } + if (o) { + o->setPredicate( m_pred ); + QObject::connect( o, SIGNAL( predicateAdd( Predicate ) ), + list(), SLOT( editorPredicateAdd( Predicate ) ) ); + QObject::connect( o, SIGNAL( predicateDrop( Predicate ) ), + list(), SLOT( editorPredicateDrop( Predicate ) ) ); + } + return o; +} + +QString FilterItem::text( int c ) const { + InterfacingPredicate &ip = downcast< InterfacingPredicate >( m_pred.impl() ); + if (c == 0) + return ip.summary(); + return u8( "" ); +} diff --git a/adept/adept/filterlist.h b/adept/adept/filterlist.h new file mode 100644 index 0000000..212ab5a --- /dev/null +++ b/adept/adept/filterlist.h @@ -0,0 +1,149 @@ +/** -*- C++ -*- + @file adept/filterlist.h + @author Peter Rockai +*/ + +#include +#include + +#include +#include +#include +#include +#include +//#include + +#include +#include + +#ifndef EPT_FILTERLIST_H +#define EPT_FILTERLIST_H + +class QPopupMenu; + +namespace adept { +using namespace aptFront; +using namespace aptFront::cache; +class Lister; + +struct InterfacingPredicate +{ +public: + virtual std::string summary() const = 0; + virtual void reset() {} +signals: + void changed(); +}; + + +class PredicateInterface: public ItemExtender +{ + Q_OBJECT +public: + typedef predicate::Predicate< entity::Entity > Predicate; + PredicateInterface( QWidget *w = 0, const char *n = 0 ); + virtual Predicate predicate() = 0; +signals: + void predicateAdd( Predicate ); + void predicateDrop( Predicate ); +public slots: + virtual void setPredicate( const Predicate &p ) { + m_pred = p; + predicateChanged(); + } + virtual void widgetsChanged(); + virtual void predicateChanged() = 0; +protected: + predicate::Predicate< entity::Entity > m_pred; +}; + +class FilterItem; + +class FilterList : public ExtendableList +{ + Q_OBJECT +public: + friend class FilterItem; + typedef predicate::Predicate< entity::Entity > Predicate; + // typedef std::map< KListViewItem *, Predicate > Map; + FilterList( QWidget *parent = 0, const char *name = 0 ); + typedef predicate::And< entity::Entity > And; + void appendPredicate( Predicate p ); + void plugLister( Lister *l ); + void emitPredicateChanged(); +signals: + void predicateChanged( ListerPredicate p ); +public slots: + void setPredicate( Predicate p ); + void setHiddenPredicate( Predicate p ); +protected slots: + void editorPredicateDrop( Predicate ); + void editorPredicateAdd( Predicate ); + void contextMenu( QListViewItem *, const QPoint &, int ); + // QPopupMenu *tagMenu(); + void contextActivated( int ); + // void tagMenuActivated( int ); + void updateHeight(); +protected: + void drawContents( QPainter *, int, int, int, int ); + Predicate m_pred; + Predicate m_hidden; + FilterItem *m_context; + bool m_changed; + Lister *m_lister; + int m_itemsSeen; + std::vector< ept::debtags::Tag > m_tagMenuMap; +}; + +class FilterItem : public ExtendableItem +{ +public: + ItemExtender *createExtender(); + FilterItem( FilterList *l ) + : ExtendableItem( l ), m_delayedDone( false ) + { + } + void setup() { + ExtendableItem::setup(); + if (m_delayedDone) + return; + m_delayedDone = true; + showExtender(); + } + + QString text( int ) const; + + virtual bool less( const ExtendableItem *other ) const { + const FilterItem *o = dynamic_cast< const FilterItem * >( other ); + return downcast< InterfacingPredicate >( m_pred ).summary() < + downcast< InterfacingPredicate >( o->m_pred ).summary(); + } + + void setPredicate( predicate::Predicate< entity::Entity > p ) { + m_pred = p; + } + + FilterList::Predicate predicate() const { + return m_pred; + } + + FilterList *filterList() { return dynamic_cast< FilterList * >( list() ); } + + void reset() { + filterList()->editorPredicateDrop( m_pred ); + downcast< InterfacingPredicate >( m_pred ).reset(); + if ( extender() ) { + downcast< PredicateInterface >( extender() ).setPredicate( m_pred ); + extender()->setFocus(); + } + filterList()->editorPredicateAdd( m_pred ); + } + +protected: + predicate::Predicate< entity::Entity > m_pred; + bool m_delayedDone:1; +}; + +} + +#endif diff --git a/adept/adept/filtersidebar.cpp b/adept/adept/filtersidebar.cpp new file mode 100644 index 0000000..777fa44 --- /dev/null +++ b/adept/adept/filtersidebar.cpp @@ -0,0 +1,72 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace adept; +using namespace aptFront; +using namespace std; +using namespace __gnu_cxx; + +template< typename H, typename G1, typename G2 > +struct _compose2_binary { + _compose2_binary( H _h, G1 _g1, G2 _g2 ) + : h( _h ), g1( _g1 ), g2( _g2 ) + {} + + typename H::result_type operator()( + typename G1::argument_type a, + typename G2::argument_type b ) + { + return h( g1( a ), g2( b ) ); + } + + H h; + G1 g1; + G2 g2; +}; + +template< typename H, typename G1, typename G2 > +_compose2_binary< H, G1, G2 > compose2_binary( H h, G1 g1, G2 g2 ) { + return _compose2_binary< H, G1, G2 >( h, g1, g2 ); +} + +void FilterSidebar::setCardinality( const Lister::Cardinality &c ) +{ + using namespace wibble::operators; + ept::debtags::Tag::Set all, smart; + + kdDebug() << "FilterSidebar::setCardinality" << endl; + Lister::Cardinality cprime; + remove_copy_if( c.begin(), c.end(), inserter( cprime, cprime.begin() ), + compose1( bind1st( equal_to< int >(), 0 ), + select2nd< + Lister::Cardinality::value_type >() ) ); + transform( cprime.begin(), cprime.end(), inserter( all, all.begin() ), + select1st< Lister::Cardinality::value_type >() ); + m_all->setTags( all ); + ept::debtags::Vocabulary &t = cache::Global().get().tags(); + m_easy->setTags( all & ( t.facetByName( "interface" ).tags() + | t.facetByName( "works-with" ).tags() + | t.facetByName( "use" ).tags() + | t.facetByName( "role" ).tags() ) ); + + typedef vector< pair< ept::debtags::Tag, int > > Vec; + Vec vec; + copy( cprime.begin(), cprime.end(), back_inserter( vec ) ); + sort( vec.begin(), vec.end(), + compose2_binary( less< int >(), + select2nd< Vec::value_type >(), + select2nd< Vec::value_type >() ) ); + Vec::reverse_iterator end = vec.rbegin(); + advance( end, vec.size() < 10 ? vec.size() : 10 ); + transform( vec.rbegin(), end, inserter( smart, smart.begin() ), + select1st< Vec::value_type >() ); + + m_smart->setTags( smart ); + m_smart->openToplevel(); +} diff --git a/adept/adept/filtersidebar.h b/adept/adept/filtersidebar.h new file mode 100644 index 0000000..0fac201 --- /dev/null +++ b/adept/adept/filtersidebar.h @@ -0,0 +1,26 @@ +/* -*- C++ -*- file adept/filtersidebar.h + written by Peter Rockai */ + +#include +#include + +#ifndef EPT_FILTERSIDEBAR_H +#define EPT_FILTERSIDEBAR_H + +namespace adept { + +// using namespace aptFront; + +class FilterSidebar : public FilterSidebarUi { + Q_OBJECT +public: + FilterSidebar( QWidget *p = 0, const char *n = 0 ) + : FilterSidebarUi( p, n ) + {} +public slots: + void setCardinality( const Lister::Cardinality & ); +}; + +} + +#endif diff --git a/adept/adept/filtersidebarui.ui b/adept/adept/filtersidebarui.ui new file mode 100644 index 0000000..0f2efb4 --- /dev/null +++ b/adept/adept/filtersidebarui.ui @@ -0,0 +1,119 @@ + +adept::FilterSidebarUi + + + adept::FilterSidebarUi + + + + 0 + 0 + 227 + 469 + + + + Form2 + + + + unnamed + + + 0 + + + 0 + + + + m_tabs + + + + tab0 + + + Smart + + + + unnamed + + + 0 + + + + m_smart + + + + + + + tab1 + + + Simple + + + + unnamed + + + 0 + + + + m_easy + + + + + + + tab2 + + + All + + + + unnamed + + + 0 + + + + m_all + + + + + + + + + + adept::TagChooser +
adept/tagchooser.h
+ + -1 + -1 + + 0 + + 5 + 5 + 0 + 0 + +
+
+ + + adept/tagchooser.h + +
diff --git a/adept/adept/filterwidget.cpp b/adept/adept/filterwidget.cpp new file mode 100644 index 0000000..f294327 --- /dev/null +++ b/adept/adept/filterwidget.cpp @@ -0,0 +1,36 @@ +#include +#include +#include +#include +#include "filterwidget.h" + +using namespace aptFront; +using namespace adept; + +void FilterWidget::connectLister( Lister *l ) { + connect( this, SIGNAL( drop( ListerPredicate ) ), + l, SLOT( interactiveDrop( ListerPredicate ) ) ); + connect( this, SIGNAL( changed( ListerPredicate ) ), + l, SLOT( interactiveAnd( ListerPredicate ) ) ); + connect( this, SIGNAL( apply( ListerPredicate ) ), + l, SLOT( baseAnd( ListerPredicate ) ) ); + +} + +void FilterWidget::changedInternal() { + setEnabled( false ); + emit drop( m_old ); + emit changed( m_old = predicate() ); + setEnabled( true ); + setFocus(); +} + +void FilterWidget::applyInternal() { + // check for emptiness? + setEnabled( false ); + emit drop( m_old ); + emit apply( m_old = predicate() ); + reset(); + setEnabled( true ); + setFocus(); +} diff --git a/adept/adept/filterwidget.h b/adept/adept/filterwidget.h new file mode 100644 index 0000000..78b0c38 --- /dev/null +++ b/adept/adept/filterwidget.h @@ -0,0 +1,39 @@ +/** -*- C++ -*- + @file adept/filterwidgets.h + @author Peter Rockai +*/ + +#include +#include +#include + +#ifndef EPT_FILTERWIDGET_H +#define EPT_FILTERWIDGET_H + +class KLineEdit; + +namespace adept { + +class FilterWidget : public QWidget +{ + Q_OBJECT +public: + FilterWidget( QWidget *parent = 0, const char *n = 0 ) + : QWidget( parent, n ) {} + virtual ListerPredicate predicate() = 0; + void connectLister( Lister *l ); +protected slots: + void changedInternal(); + void applyInternal(); + virtual void reset() = 0; +signals: + void changed( ListerPredicate op ); + void apply( ListerPredicate op ); + void drop( ListerPredicate op ); +protected: + ListerPredicate m_old; +}; + +} + +#endif diff --git a/adept/adept/groupeddesktopselector.cpp b/adept/adept/groupeddesktopselector.cpp new file mode 100644 index 0000000..68afa98 --- /dev/null +++ b/adept/adept/groupeddesktopselector.cpp @@ -0,0 +1,137 @@ +/** -*- C++ -*- + @file adept/groupeddestkopselector.cpp + @author Peter Rockai +*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +using namespace aptFront; +using namespace cache; + +namespace adept { + +GroupedDesktopSelector::GroupedDesktopSelector( QWidget *p, const char *n ) + : KJanusWidget( p, n, IconList ), m_policy( 0 ) +{ + observeComponent< cache::component::Packages >(); + m_pages.push_back( addPage( QString( "Initializing..." ) ) ); + QObjectList *chld = queryList( "QWidget" ); + QObjectListIt it( *chld ); QWidget *o; + while ((o = dynamic_cast< QWidget * >( it.current() )) != 0) { + if ( dynamic_cast< QLabel * >( o ) != 0 ) + o->hide(); + if ( dynamic_cast< KSeparator * >( o ) != 0 ) + o->hide(); + ++it; + } // *hack* + + // AAAA hack + QLayoutIterator li = layout()->iterator(); + QHBoxLayout *hbox = 0; + while ( li.current() != 0 ) { + hbox = dynamic_cast< QHBoxLayout * >( li.current() ); + if ( hbox ) break; + ++li; + } + kdDebug() << "hacking hbox = " << hbox << endl; + if ( hbox ) { + li = hbox->iterator(); + while ( li.current() != 0 ) { + QSpacerItem *spacer = dynamic_cast< QSpacerItem * >( li.current() ); + if ( spacer ) { + hbox->removeItem( spacer ); + delete spacer; + } + ++li; + } + } +} + +void GroupedDesktopSelector::notifyPreRebuild( component::Base * ) { + clear(); +} + +void GroupedDesktopSelector::notifyPostRebuild( component::Base * ) { + // QTimer::singleShot( 0, this, SLOT( fill() ) ); +} + +void GroupedDesktopSelector::clear() +{ + if ( !m_pages.empty() ) + showPage( m_pages.front() ); + while ( !m_pages.empty() ) { + removePage( m_pages.back() ); + delete m_pages.back(); + m_pages.pop_back(); + } +} + +void GroupedDesktopSelector::fill() +{ + component::Desktop &d = cache::Global::get().component< component::Desktop >(); + fill( d.entries() ); +} + +void GroupedDesktopSelector::fill( component::Desktop::EntityRange r ) +{ + component::Desktop &d = cache::Global::get().component< component::Desktop >(); + utils::Range< std::string > gr; + QString last = pageTitle( activePageIndex() ); + + clear(); + + bool shown = false; + + for ( gr = d.availableGroups( r ); gr != gr.end(); gr.advance() ) { + + component::Desktop::EntityRange cr = d.group( *gr ); + QString name = u8( *gr ); + std::cerr << "group for " << cr->name() << ": " << r->group() << std::endl; + name = ( name != u8( "" ) ? name : u8( "Legacy" ) ); + + QPixmap icon( KGlobal::iconLoader()->iconPath( + policy() ? policy()->iconForGroup( name ) : u8( "" ), -32 ) ); + + QVBox *b = addVBoxPage( name, name, icon ); + m_pages.push_back( b ); + std::cerr << "creating list for " << *gr << std::endl; + + DesktopList *l = new DesktopList( b ); + l->setTitle( name ); + connect( l, SIGNAL( request( cache::entity::Package, + cache::component::State::Action ) ), + this, SIGNAL( request( cache::entity::Package, + cache::component::State::Action ) ) ); + connect( l, SIGNAL( showDescription( cache::entity::Desktop ) ), + this, SIGNAL( showDescription( cache::entity::Desktop ) ) ); + + l->insertRange( intersectionRange( r, cr ) ); + // l->insertRange( cr ); + + std::cerr << "created list for " << *gr << std::endl; + if ( name == last ) { + showPage( b ); + shown = true; + } + kapp->processEvents(); + } + + if ( m_pages.empty() ) + m_pages.push_back( addPage( QString( "No Results" ) ) ); + if ( !shown ) + showPage( pageIndex( m_pages.front() ) ); +} + +} diff --git a/adept/adept/groupeddesktopselector.h b/adept/adept/groupeddesktopselector.h new file mode 100644 index 0000000..a54f7aa --- /dev/null +++ b/adept/adept/groupeddesktopselector.h @@ -0,0 +1,39 @@ +/** -*- C++ -*- + @file adept/groupeddestkopselector.h + @author Peter Rockai +*/ + +#include +#include + +namespace adept { +using namespace aptFront; +using namespace aptFront::cache; + +// XXX needs fixing +class GroupedDesktopSelector : public KJanusWidget, cache::Observer +{ + Q_OBJECT +public: + struct IconPolicy { + virtual QString iconForGroup( QString group ) { return group; } + }; + GroupedDesktopSelector( QWidget *p = 0, const char *n = 0 ); + void fill( component::Desktop::EntityRange r ); + void setPolicy( IconPolicy *p ) { m_policy = p; } + IconPolicy *policy() { return m_policy; } + virtual void notifyPreRebuild( cache::component::Base * ); + virtual void notifyPostRebuild( cache::component::Base * ); +public slots: + void clear(); + void fill(); +signals: + void request( cache::entity::Package, cache::component::State::Action ); + void showDescription( cache::entity::Desktop ); +protected: + IconPolicy *m_policy; + std::vector< QWidget * > m_pages; + // IconPolicy m_defaultPolicy; +}; + +} diff --git a/adept/adept/installerview.cpp b/adept/adept/installerview.cpp new file mode 100644 index 0000000..052fa41 --- /dev/null +++ b/adept/adept/installerview.cpp @@ -0,0 +1,112 @@ +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include + +using namespace adept; +using namespace aptFront; +using namespace cache; + +void InstallerView::rebuild() +{ + typedef predicate::Factory< entity::Desktop > Factory; + if ( m_inRebuild ) { + QTimer::singleShot( 500, this, SLOT( rebuild() ) ); + return; + } + m_inRebuild = true; + + component::Desktop &d = cache::Global::get().component< component::Desktop >(); + ept::debtags::Vocabulary &t = + cache::Global::get().tags(); + + Predicate p = predicate::True< entity::Desktop >(); + if ( m_search->text() != u8( "" ) ) { + Predicate tmp = Factory::name( u8( m_search->text() ) ) + or Factory::description( u8( m_search->text() ) ); + p = p and tmp; + } + + std::string st = ""; + int si = m_suite->currentItem(); + + if ( si == 0 ) st = "suite::kde"; + if ( si == 1 ) st = "suite::gnome"; + + if ( st != "" ) + p = p and Factory::tag( t.tagByName( st ) ); + + if ( !m_unsupported->isChecked() ) { + p = p and not Factory::sectionSubstring( "contrib" ) + and not Factory::sectionSubstring( "universe" ) + and not Factory::sectionSubstring( "multiverse" ); + } + + if ( !m_nonfree->isChecked() ) { + p = p and not Factory::sectionSubstring( "non-free" ) + and not Factory::sectionSubstring( "multiverse" ) + and not Factory::sectionSubstring( "restricted" ); + } + + selector()->fill( filteredRange( d.entries(), p ) ); + + m_inRebuild = false; +} + +InstallerView::InstallerView( QWidget *p , const char *n ) + : InstallerViewUi( p, n ), m_inRebuild( false ) +{ + connect( m_search, SIGNAL( textChanged( const QString & ) ), + this, SLOT( textChanged() ) ); + connect( &timer, SIGNAL( timeout() ), this, SLOT( rebuild() ) ); + connect( m_suite, SIGNAL( activated( int ) ), this, SLOT( rebuild() ) ); + connect( m_unsupported, SIGNAL( toggled( bool ) ), this, SLOT( rebuild() ) ); + connect( m_nonfree, SIGNAL( toggled( bool ) ), this, SLOT( rebuild() ) ); + connect( selector(), SIGNAL( showDescription( cache::entity::Desktop ) ), + this, SLOT( showDescription( cache::entity::Desktop ) ) ); +} + +void InstallerView::textChanged() { + timer.start( 1000, true ); +} + +void InstallerView::showDescription( entity::Desktop e ) +{ + kdDebug() << "InstallerView::showDescription..." << endl; + QString file("/usr/share/app-install/desktop/" + e.package().name() + ".desktop"); + KConfig desktopFile(QString("/usr/share/app-install/desktop/" + e.package().name() + ".desktop"), false, false); + QString name(desktopFile.name()); + + desktopFile.setGroup("Desktop Entry"); + int popularity = desktopFile.readNumEntry("X-AppInstall-Popcon"); + + int popcon_max = 64284; //FIXME should be read at startup, this will change + int rank = 0; + if (popularity > 0) { + rank = (int)(5.0* log(popularity) / log(popcon_max+1)); + } + + QString rankText(" "); + for (int i = 0; i < rank; i++) { + rankText = rankText + ""; + } + + QString l = u8(e.package().longDescription( + u8( i18n( "No long description available" ) ) ) ); + + m_description->setText( u8( "" ) + e.name() + u8( "" ) + + u8("
") + i18n("Rank: ") + u8("") + rankText.latin1() + + i18n( "
Package: " ) + e.package().name() + + formatLongDescription( l ) ); +} diff --git a/adept/adept/installerview.h b/adept/adept/installerview.h new file mode 100644 index 0000000..ed955dc --- /dev/null +++ b/adept/adept/installerview.h @@ -0,0 +1,33 @@ +/** -*- C++ -*- + @file adept/installerview.h + @author Peter Rockai +*/ + +#include +#include +#include + +#ifndef EPT_INSTALLERVIEW_H +#define EPT_INSTALLERVIEW_H + +namespace adept { +class InstallerView : public InstallerViewUi +{ + Q_OBJECT +public: + typedef predicate::Predicate< entity::Desktop > Predicate; + InstallerView( QWidget *p = 0, const char *n = 0 ); + GroupedDesktopSelector *selector() { return m_selector; } +protected slots: + void textChanged(); + void showDescription( cache::entity::Desktop ); +public slots: + void rebuild(); +protected: + bool m_inRebuild; + QTimer timer; +}; + +} + +#endif diff --git a/adept/adept/installerviewui.ui b/adept/adept/installerviewui.ui new file mode 100644 index 0000000..b289650 --- /dev/null +++ b/adept/adept/installerviewui.ui @@ -0,0 +1,203 @@ + +InstallerViewUi + + + InstallerViewUi + + + + 0 + 0 + 666 + 314 + + + + Form1 + + + + unnamed + + + 0 + + + 0 + + + + layout5 + + + + unnamed + + + 4 + + + + textLabel2 + + + + 0 + 5 + 0 + 0 + + + + Search: + + + + + m_search + + + + 7 + 0 + 0 + 0 + + + + + + + KDE + + + + + GNOME + + + + + Any Suite + + + + m_suite + + + + 5 + 0 + 0 + 0 + + + + 2 + + + + + spacer2 + + + Horizontal + + + Expanding + + + + 21 + 20 + + + + + + textLabel1 + + + Show: + + + + + m_unsupported + + + unsupported, + + + true + + + + + m_nonfree + + + proprietary software. + + + true + + + + + + + m_selector + + + + 5 + 5 + 6 + 1 + + + + + + m_description + + + + 7 + 7 + 4 + 0 + + + + + + + + adept::GroupedDesktopSelector +
adept/groupeddesktopselector.h
+ + -1 + -1 + + 0 + + 5 + 5 + 0 + 0 + + image0 +
+
+ + + 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000042949444154388db5954d6c545514c77ff7de37eff1a6a550da994e5ba798868f948fc847a2a2911816c436b0a02ed0083161a1981877ee10d90aa94656063491882c5cd4c4b8103f20cd806909a98604da8482341de80cb69de9bcd799799d79efba980f1da3a80b4f727273939bdff99f9b93f3175a6b6a21849080020c4002a29a8f0a5dcd002803bed63a1035f0d0d0504b6f6fef51d7758fa4d3e98d8ee3fc03af128ee3303939399548242eb8aefb09300f78464de9f0f0f0d148cc7caf3d5424de97a7ec17104220242805520a44557bbd4b21f083801d33e63a6d1bc7bf19c6064e0319a35a58b9ae7ba43d54e4d7c54b64dc097c7f09d30ef04b36736983cc7c11b4456b9b492c5e20dc54a6540e00896a8268a7017010f8bcae1830d2e9f4c69ebe3c197782b2ce60d94ddc9b30f9feeb45ae5d7181c5ead35636ef08d3ffe26a76ee3208b4031a56d80aa00768fda362e9380e25bf80ef3b587613d7afc099533380a4b5dda46fcb5aa42998b9eb7173dce5e6788e434763ec7fc942532008ea436003660d2caa7f8d69c3bd8910674e4d033e83877ad8d36fb0aa4d6058658ac5358c5df6383bf480f31fdda5a3632bbbfb6da4ccd5c00a10b2012cc12fd97cfb5516f0187c25cee0619396480ec3ca909d0f3372d1e5f9fe66de3ad605587c712ec55256a2540d5519d19ae24a29057329839f7ecc138944d833102290f3184ae1e6d6f0e98739c61229e6d21eafbed1c9c8c5558c8f3ee4ceed76946a1c43d97091828585223e2eebfbc295f60d45de89707628cb58224577bc85a79e5d4d786581cddb9b0148259711b20145836221400416e0232d1f6595c9ce4538773ac7b54406f0b15784e8e80aa1ac2594190220d021e49f2437960156b70ba095e95f96f18acd8c263cc6122962b1167a7ba34cdd7ec8c977a699bed546722a8fc2a02b6e2185fff78ab586ce78894ddb9ab9f5738ed14b1e030756929d8ff2e4ae5544632b38f96e89a99b298ebd6950cc2d12ed0eb3618b26f520788462ad09877df60db600f0f1fb49c646f21c7ebd836dcf94e9d9b4c0db27d6d3bd36c6426a96bce731703046d7da129a4670836284a054869d4f1b1c7e2dca67676ef3c1898091ef5ad8bc358c3205c93bf7c9a40ad4c660f4728edd7bbb3142ea2fc1da711cfc200011e08b45f6bd1c261adbce9717928c5f9d63fc6a19f0014567773303073790f8214bd6f5282dfbb8b9fa1f6b40d7c1939393533b92e63ad9240990484aec7e41b27d579cbb531e0f67023492d86316ebb768ba1e0f786e6f37e56550c62237aee7011e54abd7c1412291b8a06de378b4d3c0b215da9708e5a3a442192085404a83d4accfecac067c0c43e13a70e3fa12e96409e0325000966bbb354465339d04a6f9dd15fe6dde07ce030780278088d05ad72cc9a6b2f2daaaa74d75a1f0e8d0d5f60b40868a8364ead6248430000b0857a126ffcdf396abf03ce089ffcb4c7f033046c6b4a995e7a00000000049454e44ae426082 + + + + + adept/groupeddesktopselector.h + +
diff --git a/adept/adept/lister.cpp b/adept/adept/lister.cpp new file mode 100644 index 0000000..ddd70d8 --- /dev/null +++ b/adept/adept/lister.cpp @@ -0,0 +1,818 @@ +// -*- Mode: C++; c-basic-offset: 4; -*- +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +using namespace aptFront; +using namespace aptFront::predicate; +using namespace aptFront::cache; +using namespace aptFront::utils; +using namespace adept; + +#ifdef KUBUNTU +QPixmap* main_icon = 0; +QPixmap* non_main_icon = 0; +#endif + +Lister::Lister( QWidget *parent, const char *name ) + : ExtendableList( parent, name ), + m_rangeProvider( 0 ), + m_baseF( predicate::True< entity::Entity >() ), + m_interactiveF( True() ), m_itemCount( -1 ), + m_rebuildScheduled( false ), m_inRebuild( false ), m_cancelRebuild( false ), + m_openToplevel( false ), m_rebuildMutex( true ) +{ + observeComponent< component::State >(); + observeComponent< component::Packages >(); + observeComponent< component::PackageTags >(); + setRootIsDecorated( false ); + setSelectionModeExt( Extended ); + setAllColumnsShowFocus (true); + +#ifdef KUBUNTU + // The tip + // ListerItemTooltip* i_tip = new ListerItemTooltip(this); + setTooltipColumn(Lister::ColIcon); +#endif //KUBUNTU + + m_icons[ u8( "package-install" ) ] = u8( "adept_install" ); + m_icons[ u8( "package-remove" ) ] = u8( "adept_remove" ); + m_icons[ u8( "package-upgrade" ) ] = u8( "adept_upgrade" ); + m_icons[ u8( "package-keep" )] = u8( "adept_keep" ); + m_icons[ u8( "package-reinstall" )] = u8( "adept_reinstall" ); + m_icons[ u8( "package-purge" )] = u8( "adept_purge" ); + + setSorting( -1 ); + // addColumn(" ", 40); + // addColumn(" ", 18); + QFontMetrics met( font() ); + + // BE SURE TO UPDATE THE Column ENUM WHEN YOU UPDATE HERE! + addColumn( i18n( "Package" ), 180); +#ifdef KUBUNTU + addColumn( i18n( " " ), 18); // This column is for identifying + // main packages. (manchicken) +#endif + addColumn( i18n( "Status" ), met.width( i18n( "not installed" ) ) + 10 ); + addColumn( i18n( "Requested" ), met.width( i18n( "Requested" ) ) + 10 ); + addColumn( i18n( "Description" ), 300); + setToggleColumn( Lister::ColFirst ); + + for ( int col = ColFirst; col < ColLast; ++col ) + setColumnAlignment( col, Qt::AlignLeft | Qt::AlignVCenter ); + + setResizeMode( LastColumn ); + connect( this, SIGNAL( selectionChanged() ), SLOT( updateActions() ) ); + connect( this, + SIGNAL( contextMenuRequested( QListViewItem *, + const QPoint &, int ) ), + this, SLOT( + contextMenu( QListViewItem *, const QPoint &, int) ) ); + m_tip = 0; + // m_tip = new ListerTooltip( viewport(), this ); +} + +Lister::~Lister() +{ + delete m_tip; +} + +void Lister::scheduleRebuild() +{ + if (!m_rebuildScheduled) { + // kdDebug() << "Lister scheduling rebuild" << endl; + QTimer::singleShot( 0, this, SLOT( rebuild() ) ); + } + m_rebuildScheduled = true; +} + +void Lister::updateActions() +{ + emit actionsChanged( this ); +} + +void Lister::notifyPostChange( component::Base * ) +{ + kdDebug() << "notifyRefresh()" << endl; + updateActions(); + triggerUpdate(); +} + +void Lister::notifyPreRebuild( component::Base *b ) +{ + kdDebug() << "Lister::notifyPreRebuild( " << b << " )" << endl; + // Cache &c = cache::Global::get( m_cache ); + setEnabled( false ); + if ( dynamic_cast< component::PackageTags * >( b ) != 0 ) { + kdDebug() << "clearing cardinality" << endl; + m_cardinality.clear(); + } + if ( dynamic_cast< component::Packages * >( b ) != 0 ) { + kdDebug() << "clearing lister" << endl; + clear(); + m_items.clear(); + m_cardinality.clear(); + } +} + +void Lister::notifyPostRebuild( component::Base *b ) +{ + kdDebug() << "Lister::notifyPostRebuild( " << b << " )" << endl; + scheduleRebuild(); + if ( dynamic_cast< component::State * >( b ) != 0 ) { + setEnabled( true ); + } +} + +bool lessByName( const entity::Entity &e1, const entity::Entity &e2 ) +{ + if ( e1.is< entity::Named >() && e2.is< entity::Named >() ) { + entity::Named &n1 = downcast< entity::Named >( e1 ), + &n2 = downcast< entity::Named >( e2 ); + return n1.name() < n2.name(); + } + return e1 < e2; +} + +bool Lister::cancelRebuild() { + // kdDebug() << "cancel rebuild: " << m_inRebuild << ", " << m_cancelRebuild << endl; + if ( m_inRebuild ) { + m_rebuildScheduled = false; + m_cancelRebuild = true; + } + if ( !cache::Global::get( m_cache ).isOpen() ) { + m_rebuildScheduled = false; + return true; + } + return m_cancelRebuild; +} + +void Lister::cleanRebuild() +{ + scheduleRebuild(); +} + +Lister::CreateItem::CreateItem( Lister *_l, ListerItem *p ) + : l( _l ), time( 0 ), items( 0 ), last( 0 ), parent( p ) +{ +} + +Lister::CreateItem::~CreateItem() +{ + // delete timer; +} + +Lister::Map::value_type Lister::CreateItem::operator()( entity::Entity e ) +{ + items ++; + if ( l->m_cancelRebuild ) throw 0; // XXX proper exception please + // kdDebug() << "trying to acquire mutex" << endl; + l->m_rebuildMutex.lock(); + // kdDebug() << "mutex acquired" << endl; + + // count tags + if ( e.is< entity::Package >() ) { + const std::set &tags = downcast< entity::Package >( e ).tags(); + for (std::set::iterator i = tags.begin(); i != tags.end(); ++ i ) + l->m_cardinality[ *i ] ++; + } + + if ( last ) { + if ( parent ) + last = new ListerItem( parent, last, e ); + else + last = new ListerItem( l, last, e ); + } else { + if ( parent ) + last = new ListerItem( parent, e ); + else + last = new ListerItem( l, e ); + } + l->m_rebuildMutex.unlock(); + if ( e.is< entity::Relation >() ) + // this should be safe because the parent thread is waiting + // for us and ensures that universe (libapt-front) is kept + // unchanged while we run + l->insertRangeInternal( InsertRangePair( + last, downcast< entity::Relation >( e ).targetPackages() ) ); + // we may want to use recursive async call instead? why? + /* Threads::enqueue( + asyncCall( std::bind2nd( std::mem_fun( &Lister::insertRangeInternal ), + InsertRangePair( + last, + downcast< entity::Relation >( e ).targetPackages() ) ), + l ), &(l->m_rebuildMutex) ); + */ + return std::make_pair( e, last ); +} + +void Lister::reallyUpdate() +{ + bool en = isUpdatesEnabled(); + setUpdatesEnabled( true ); + triggerUpdate(); + setUpdatesEnabled( en ); +} + +void Lister::insertRange( Range r ) { + insertRangeInternal( InsertRangePair( 0, r ) ); +} +void Lister::insertRangeInternal( InsertRangePair a ) +{ + // kdDebug() << "insertRange running..." << endl; + try { + std::transform( a.second, a.second.end(), + inserter( m_items, m_items.begin() ), + CreateItem( this, a.first ) ); + } catch ( ... ) {} + m_itemCount = m_items.size(); +} + +/* void Lister::rebuildInsertRange( Range r ) { + insertRange( 0, r ); + } */ + +void Lister::rebuild() +{ + Cache &c = cache::Global::get( m_cache ); + if ( cancelRebuild() ) { + scheduleRebuild(); + return; + } + + m_inRebuild = true; + m_rebuildMutex.lock(); + + emit rebuildStarted(); + + c.progress().OverallProgress( 0, 0, 0, i18n( "Filtering" ) ); + kdDebug() << "rebuild running" << endl; + clock_t _c = clock(), C; + for ( Cardinality::iterator i = m_cardinality.begin(); + i != m_cardinality.end(); ++i ) + i->second = 0; + + kdDebug() << "querying m_rangeProvider " << m_rangeProvider << "..." << endl; + + Range r = filteredRange( m_rangeProvider ? + m_rangeProvider->listerRange() : range( VectorRange() ), + m_baseF ); + C = (clock() - _c) / 1000; _c = clock(); + + setUpdatesEnabled( false ); + kdDebug() << "clearing..." << endl; + clear(); + m_items.clear(); + + kdDebug() << "asyncCall to rebuildInsertRange..." << endl; + QThread *t = asyncCall( std::bind2nd( + std::mem_fun( &Lister::insertRangeInternal ), + InsertRangePair( 0, r ) ), + this ); + + kdDebug() << "starting the thread..." << endl; + + QTimer timer; + connect( &timer, SIGNAL( timeout() ), + this, SLOT( reallyUpdate() ) ); + timer.start( 0 ); + + m_rebuildMutex.unlock(); + Threads::enqueue( t, &m_rebuildMutex ); + Threads::wait(); + + timer.stop(); + + kdDebug() << "thread finished..." << endl; + C = (clock() - _c) / 1000; _c = clock(); + kdDebug() << m_items.size() << " entities synced, time = " << C << endl; + + setUpdatesEnabled( true ); + c.progress().Done(); + if ( m_openToplevel ) openToplevel(); + triggerUpdate(); + + if ( !m_cancelRebuild ) { + for ( Cardinality::iterator i = m_cardinality.begin(); + i != m_cardinality.end(); ++i ) + if ( i->second == m_itemCount ) + i->second = -1; + emit cardinalityChanged( m_cardinality ); + } + + m_inRebuild = false; + m_rebuildScheduled = false; + m_cancelRebuild = false; + emit rebuildFinished(); +} + +void Lister::baseAnd( Predicate o ) +{ + m_baseF = predicate::predicate( m_baseF and o ); + // emit filterChanged( m_baseF ); + cancelRebuild(); + scheduleRebuild(); +} + +void Lister::baseSet( Predicate o ) +{ + m_baseF = o; + // emit filterChanged( m_baseF ); + cancelRebuild(); + scheduleRebuild(); +} + +void Lister::interactiveAnd( Predicate o ) +{ + m_interactiveF = predicate::predicate( m_interactiveF and o ); + cancelRebuild(); + scheduleRebuild(); +} + +void Lister::interactiveDrop( Predicate o ) +{ + m_interactiveF = predicate::remove( m_interactiveF, o ); + cancelRebuild(); + scheduleRebuild(); +} + +bool Lister::itemSelected( Map::value_type i ) +{ + return not i.second->isSelected(); +} + +entity::Entity Lister::extractKey( Map::value_type i ) +{ + return i.first; +} + +Lister::VectorRange Lister::selection() +{ + VectorRange ret; + Map m; + std::remove_copy_if( m_items.begin(), m_items.end(), + inserter( m, m.begin() ), + itemSelected ); + std::transform( m.begin(), m.end(), + consumer( ret ), + extractKey ); + return ret; +} + +Lister::VectorRange Lister::content() +{ + VectorRange ret; + std::transform( m_items.begin(), m_items.end(), + consumer( ret ), + extractKey ); + return ret; +} + +QString ListerItem::text( int column ) const +{ + // if (column == 0) return ""; // until we redo paintcell for the col + if (entity().is()) { + entity::Package p = entity(); + switch (column) { + + case Lister::ColPackage: return u8( p.name( u8( i18n( "n/a" ) ) ) ); + case Lister::ColStatus: return u8( p.statusString( u8( i18n( "n/a" ) ) ) ); + case Lister::ColRequested: return u8( p.actionString( u8( i18n( "n/a" ) ) ) ); + case Lister::ColDescription: return u8( p.shortDescription( u8( i18n( "n/a" ) ) ) ); + // case 2: return p.candidateVersion().versionString(); + } + } + if ( entity().is< entity::Relation >() && column == 0 ) + return downcast< entity::Relation >( entity() ).format(); + return u8( "" ); +} + +#ifdef KUBUNTU +const QPixmap* ListerItem::pixmap( int column ) const +{ + if (entity().is()) { + entity::Package p = entity(); + + // Are we in a main repo? A slash indicates a non-main repo. + if (column == Lister::ColIcon && + p.section(string("/")).find("/") == string::npos) { + + // Load the icon if it hasn't been created. + if (main_icon == 0) { + main_icon = new QPixmap(SmallIcon(u8("adept_main_indicator"))); + } + + // Return the icon... + return main_icon; + } else if (column == Lister::ColFirst) { + return static_cast(&m_pixmap); + } + } + + if (non_main_icon == 0) { + non_main_icon = new QPixmap(); + } + + return non_main_icon; +} +#endif /* KUBUNTU */ + +ListerItem::~ListerItem() +{ +} + +void ListerItem::paintCell ( QPainter *p, const QColorGroup &cg, + int column, int width, int alignment ) +{ + if ( width <= 0 ) + return; + QColorGroup _cg( cg ); + QColor c = _cg.text(); + QPixmap pm( width, height() ); + QPainter _p( &pm ); + if ( entity().is() ) { + entity::Package p = entity(); + + // Paint the status column + if ( column == Lister::ColStatus ) { + c = statusColor( p ); + } + + // Paint the action column + if ( column == Lister::ColRequested ) { + c = actionColor( p ); + } + } + _cg.setColor( QColorGroup::Text, c ); + if ( extender() ) { // make the icon appear at top... this + // probably breaks big-text displays? + // --> somewhat, but not too badly + alignment &= ~AlignVertical_Mask; + alignment |= AlignTop; + } + KListViewItem::paintCell( &_p, _cg, column, width, alignment ); + p->drawPixmap( 0, 0, pm ); +} + +void Lister::contextMenu( QListViewItem *it, const QPoint &pt, int /*c*/ ) +{ + if (! it) // check for actor when we have one... + return; + m_context = dynamic_cast< ListerItem * >( it ); + VectorRange sel = selection(); + // entity::Package p = (dynamic_cast(it)->entity()); + KPopupMenu *m = new KPopupMenu (this); + utils::Range< Actor > r = actor::Global< entity::Package >::list(); + int id = 8; + try { + for (; r != r.end(); ++r) { + m->insertItem( SmallIconSet( m_icons[ u8( r->name() ) ] ), + i18n(QString(r->prettyName()).ascii()), id ); + m->setItemEnabled( + id, r->possible( utils::upcastRange< entity::Package >( sel ) ) ); + ++id; + } + } catch ( std::bad_cast ) {} // ignore (this is broken, but + // easiest fix) + bool open = m_context->extender(); + m->insertItem( open ? i18n( "Hide details" ) : + i18n( "Show details" ), open ? 1 : 0 ); + connect(m, SIGNAL(activated(int)), this, SLOT(contextActivated(int))); + m->exec(pt); + delete m; +} + +void Lister::contextActivated( int id ) +{ + VectorRange sel = selection(); + try { + if (id >= 8) { + utils::Range< Actor > r = actor::Global< entity::Package >::list(); + std::advance( r, id - 8 ); + (*r)( utils::upcastRange< entity::Package >( sel ) ); + updateActions(); + } + if (id < 8) { + VectorRange i = sel.begin(); + while (i != i.end()) { + if (id == 0) + m_items[*i]->showExtender(); + if (id == 1) + m_items[*i]->hideExtender(); + ++ i; + } + } + } catch ( std::bad_cast ) {} // ignore (this is broken, but +} + +ListerItemExtender::~ListerItemExtender() +{ +} + +ListerItemExtender::ListerItemExtender( QWidget *parent, const char * n) + : ListerItemExtenderUi( parent, n ) +{ + observeComponent< component::State >(); + adjustFontSize( m_description, -1 ); + connect( m_details, SIGNAL( clicked() ), + this, SLOT( detailsClicked() ) ); + + m_packageInfo->adjustFontSize( -1 ); + m_packageInfo->hideStatus(); +} + +void ListerItemExtender::detailsClicked() { + detailsRequested( m_entity ); +} + +ListerItem *ListerItemExtender::item() +{ + return dynamic_cast< ListerItem * >( m_item ); +} + +void ListerItemExtender::mouseReleaseEvent( QMouseEvent *e ) { + e->ignore(); + if ( childAt( e->pos() ) != static_cast< QWidget * >( m_name ) ) + e->accept(); +} +void ListerItemExtender::setItem( ExtendableItem *i ) +{ + ItemExtender::setItem( i ); + m_entity = item()->entity(); + // setupColors(); + m_indicator->setPixmap(*(item()->pixmap(Lister::ColIcon))); + m_indicator->setMinimumWidth(18); + + kdDebug() << "ListerItemExtender::setItem connecting" << endl; + connect( this, SIGNAL( detailsRequested( Lister::Entity ) ), + item()->list(), SIGNAL( detailsRequested( Lister::Entity ) ) ); + + entity::Version v; + entity::Package p; + + if ( m_entity.is< entity::Version >() ) { + v = m_entity; + p = v.package(); + } + + if ( m_entity.is< entity::Package >() ) { + p = m_entity; + v = p.anyVersion(); + } + + if ( !v.valid() ) { + m_logical->setText( i18n( "Immutable" ) ); + m_logical->setEnabled( false ); + m_details->setEnabled( false ); + return; + } + + m_name->setText( /* QString( "" ) + */ + v.package().name( std::string( "oops" ) ) /* + "" */ ); + QString l = u8( v.longDescription( + u8( i18n( "No long description available" ) ) ) ); + + m_description->setText( QString( "" ) + + formatLongDescription( l ) + "" ); + m_description->adjustSize(); + m_description->installEventFilter( this ); + + m_packageInfo->setVersion( v, m_entity.is< entity::Version >() ); + + notifyPostChange( 0 ); +} + +void ListerItemExtender::notifyPostRebuild( component::Base *b ) +{ // need to catch undo/redo effects + return notifyPostChange( b ); +} + +void ListerItemExtender::notifyPostChange( component::Base * ) +{ + // without the timer to break it, there could be a loop where + // we connect the clicked() signal to a slot which would be + // invoked right away when we return -> evil + QTimer::singleShot( 0, this, SLOT( updateLogical() ) ); +} + +void ListerItemExtender::updateLogical() { + entity::Package pkg = entity(); + EntityActor *a = 0; + + m_status->setText( colorify( + statusColor( pkg ), + u8( pkg.statusString( u8( i18n( "Unknown" ) ) ) ) ) ); + m_change->setText( colorify( + actionColor( pkg ), + u8( pkg.actionString( u8( i18n( "Unknown" ) ) ) ) ) ); + + + m_logical->setEnabled( true ); + if (pkg.canKeep()) { + a = new EntityActor( pkg.keep() ); + } else if (pkg.canUpgrade()) { + a = new EntityActor( pkg.upgrade() ); + } else if (pkg.canInstall()) { + a = new EntityActor( pkg.install() ); + } else if (pkg.canRemove()) { + a = new EntityActor( pkg.remove() ); + } + + if (a) { + m_logical->setText( u8( a->actor().prettyName() ) ); + connect( m_logical, SIGNAL( clicked() ), + a, SLOT( destructiveAct() ) ); + } else { + m_logical->setText( i18n( "Immutable" ) ); + m_logical->setEnabled( false ); + } + +} + +bool ListerItemExtender::eventFilter( QObject *o, QEvent *e ) +{ + if (o == m_description && e->type() == QEvent::Wheel) { + // kdDebug() << "discarding wheel event..." << endl; + QApplication::sendEvent( this, e ); + return true; + } + return false; +} + +void ListerItemExtender::resize( int w, int h ) +{ + // XXX the magic constants are probably style-dependent... AW + int namew = - item()->lister()->extenderOffset( item() ) + - layout()->margin() + - layout()->spacing() + + item()->lister()->columnWidth( 0 ); + int statw = item()->lister()->columnWidth( Lister::ColStatus ) + - layout()->spacing(); + int chw = item()->lister()->columnWidth( Lister::ColRequested ) + - layout()->spacing() - 3; // wth... + m_name->setMinimumWidth( namew ); + m_status->setMinimumWidth( statw ); + m_change->setMinimumWidth( chw ); + m_packageInfo->adjustSize(); + m_leftHeight = m_name->height() + m_packageInfo->height() + + m_logical->height() + 20; + QWidget::resize( w, 500 ); + QWidget::resize( + w, + QMAX( m_description->contentsHeight() + 16, + m_leftHeight ) ); +} + +bool entityLess::operator()( entity::Entity e1, entity::Entity e2 ) +{ + if ( e1.is< entity::Package >() ) { + if ( e2.is< entity::Package >() ) + return e1 < e2; + return true; + } + + if ( e1.is< entity::Version >() ) { + if ( e2.is< entity::Package >() ) + return false; + if ( e2.is< entity::Version >() ) + return e1 < e2; + return true; + } + + if ( e1.is< entity::Relation >() ) { + if ( e2.is< entity::Package >() ) + return false; + if ( e2.is< entity::Version >() ) + return false; + if ( e2.is< entity::Relation >() ) + return e1 < e2; + return true; + } + return true; +} + +bool ListerItem::less( const ExtendableItem *b ) const +{ + entity::Entity e1 = entity(), e2 = dynamic_cast< const ListerItem * >( b )->entity(); + return entityLess()( e1, e2 ); +} + +bool ListerItem::keepLess( const ListerItem *o ) const +{ + const ListerItem *b = o; + while ( b != 0 ) { + if ( b == this ) + return false; + b = b->m_previous; + } + while ( o != 0 ) { + o = dynamic_cast< const ListerItem * >( o->nextSibling() ); + if ( o == this ) + return true; + } + return false; +} + +QString ListerTooltip::format( const QString &what, + const QString &txt, bool nobr ) +{ + QString ret = "" + what + " " + (nobr ? "" : "") + + txt + (nobr ? "" : "") + "
"; + return ret; +} + +void ListerTooltip::maybeTip( const QPoint &pt ) +{ + if ( !m_parent ) + return; + kdDebug() << "ListTreeWidgetTooltip::maybeTip ()" << endl; + ListerItem *x = dynamic_cast( m_parent->itemAt( pt ) ); + if ( !x ) + return; + if ( x->extender() ) + return; // no tips for extended items, thank you + QString str = u8( "" ); + QString descr, cand, cur; + descr = cand = cur = i18n( "Not available" ); + entity::Package p( x->entity() ); + descr = p.shortDescription( std::string( + i18n( "Not available" ).local8Bit() ) ); + try { + cand = u8( p.candidateVersion().versionString() ); + } catch (...) {} + try { + cur = u8( p.installedVersion().versionString() ); + } catch (...) {} + + str += format( i18n( "Package:" ), u8( p.name() ) ); + str += format( i18n( "Description:" ), descr ); + str += format( i18n( "Current Version:" ), cur ); + str += format( i18n( "Candidate Version:" ), cand ); + + str.append( u8( "" ) ); + tip( m_parent->itemRect( x ), str ); +} + +void ListerItemTooltip::maybeTip(const QPoint& pt) { + if (!m_parent) { + return; + } + + // Grab the column + const int col = m_parent->header()->sectionAt(pt.x()); + if (col != Lister::ColIcon) { + return; + } + + // Grab the item + const QListViewItem* item = m_parent->itemAt(pt); + if (!item) { + return; + } else if (item->pixmap(col) != main_icon) { + // Ignore items without pixmaps, as they have no indicator. + return; + } + + // Grab the item rectangle + const QRect irect = m_parent->itemRect(item); + if (!irect.isValid()) { + return; + } + + // Grab the header rectangle + const QRect hrect = m_parent->header()->sectionRect(col); + if (!hrect.isValid()) { + return; + } + + // Grab the cell rectangle + const QRect cell(hrect.left(), irect.top(), + hrect.width(), irect.height()); + tip(cell, i18n("This logo indicates that this package is officially supported by the Kubuntu development and support teams.")); +} diff --git a/adept/adept/lister.h b/adept/adept/lister.h new file mode 100644 index 0000000..6270c42 --- /dev/null +++ b/adept/adept/lister.h @@ -0,0 +1,261 @@ +/** -*- C++ -*- + @file adept/lister.h + @author Peter Rockai +*/ + +#define KUBUNTU + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#ifndef EPT_LISTER_H +#define EPT_LISTER_H + +class KLineEdit; + +namespace adept { + +using namespace aptFront; +using namespace aptFront::cache; +class ListerTooltip; +class ListerItemTooltip; +class ListerItemExtender; +class ListerItem; +class Lister; + +struct entityLess { + bool operator()( entity::Entity e1, entity::Entity e2 ); +}; + +class Lister: public ExtendableList, public Observer +{ + Q_OBJECT; +public: + static const int ColPackage = 0; +#ifdef KUBUNTU + static const int ColIcon = 1; + static const int ColStatus = 2; + static const int ColRequested = 3; + static const int ColDescription = 4; + static const int ColLast = 4; +#else + static const int ColStatus = 1; + static const int ColRequested = 2; + static const int ColDescription = 3; + static const int ColLast = 3; +#endif + static const int ColFirst = 0; + typedef entity::Entity Entity; + typedef std::vector< Entity > Vector; + typedef utils::Range< Entity > Range; + typedef utils::VectorRange< Entity > VectorRange; + typedef std::set< Entity > Set; + typedef std::map< Entity, ListerItem *, entityLess > Map; + typedef actor::Actor< entity::Package > Actor; + typedef predicate::Predicate< Entity > Predicate; + typedef std::map< ept::debtags::Tag, int > Cardinality; + struct RangeProvider { + virtual Range listerRange() = 0; + }; + + Lister (QWidget *parent = 0, const char *name = 0); + ~Lister(); + void setSource(); + virtual void notifyPostChange( component::Base * ); + virtual void notifyPreRebuild( component::Base * ); + virtual void notifyPostRebuild( component::Base * ); + VectorRange selection(); + VectorRange content(); + int itemCount() { return m_itemCount; } + // void setRange( const Range &r ) { m_range = r; } + void setRangeProvider( RangeProvider *r ) { m_rangeProvider = r; } + void insertRange( Range ); + void setOpenToplevel( bool o ) { m_openToplevel = o; } + + bool busy() { return m_rebuildScheduled || m_inRebuild; } + +signals: + // this is adept::Lister because of braindead moc + void actionsChanged( adept::Lister * ); + void cardinalityChanged( const Lister::Cardinality & ); + void detailsRequested( Lister::Entity ); + void rebuildStarted(); + void rebuildFinished(); + // void filterChanged( Lister::Predicate ); + +public slots: + virtual void cleanRebuild(); + virtual void rebuild(); + virtual void baseAnd( ListerPredicate ); + virtual void interactiveDrop( ListerPredicate ); + virtual void interactiveAnd( ListerPredicate ); + virtual void baseSet( ListerPredicate ); + virtual void updateActions(); + virtual void scheduleRebuild(); + virtual void reallyUpdate(); +protected slots: + void contextMenu( QListViewItem *, const QPoint &, int ); + void contextActivated( int ); +protected: + typedef std::pair< ListerItem *, Range > InsertRangePair; + void insertRangeInternal( InsertRangePair ); + ListerTooltip *m_tip; + + static Entity extractKey( Map::value_type ); + static bool itemSelected( Map::value_type ); + + struct CreateItem { + CreateItem( Lister *, ListerItem * ); + ~CreateItem(); + Map::value_type operator()( Entity ); + Lister *l; + int time; + int items; + ListerItem *last; + ListerItem *parent; + }; + + bool cancelRebuild(); + void rebuildInsertRange( Range ); + + ListerItem *m_context; + QMap< QString, QString > m_icons; + Map m_items; + Vector m_all; + RangeProvider *m_rangeProvider; + Predicate m_baseF, m_interactiveF; + int m_itemCount; + bool m_rebuildScheduled:1; + bool m_inRebuild:1; + bool m_cancelRebuild:1; + bool m_openToplevel:1; + Cardinality m_cardinality; + QMutex m_rebuildMutex; +}; + +class ListerTooltip : public QToolTip +{ +public: + ListerTooltip (QWidget *v, Lister *p) : QToolTip (v, 0), m_parent (p) {}; + ListerTooltip(Lister*p) : QToolTip(p,0), m_parent(p) {}; +protected: + QString format( const QString &, const QString &, bool = true ); + virtual void maybeTip (const QPoint &p); + Lister *m_parent; +}; + +class ListerItemTooltip : public QToolTip { +public: + ListerItemTooltip(const Lister* parent) : + QToolTip(parent->viewport(),0), + m_parent(parent) {}; + +protected: + const Lister* m_parent; + virtual void maybeTip (const QPoint& p); +}; + +class ListerItemExtender : public ListerItemExtenderUi, + public cache::Observer { + Q_OBJECT +public: + ListerItemExtender( QWidget *parent = 0, const char * n = 0 ); + ~ListerItemExtender(); + virtual void resize( int w, int h ); + void setItem( ExtendableItem *i ); + ListerItem *item(); + entity::Entity entity() const { return m_entity; } + void notifyPostChange( component::Base * ); + void notifyPostRebuild( component::Base * ); +protected slots: + void detailsClicked(); + void updateLogical(); +signals: + void detailsRequested( Lister::Entity ); +protected: + bool eventFilter( QObject *o, QEvent *e ); + void mouseReleaseEvent( QMouseEvent *e ); + entity::Entity m_entity; + unsigned m_leftHeight; +}; + +class ListerItem: public ExtendableItem +{ +public: + ListerItem(Lister *v, entity::Entity e) + : ExtendableItem (v), m_previous( 0 ), m_entity( e ) + {}; + + ListerItem(Lister *v, ListerItem *i, entity::Entity e) + : ExtendableItem( v, i ), m_previous( i ), m_entity( e ) + {}; + + ListerItem(ListerItem *p, ListerItem *i, entity::Entity e) + : ExtendableItem( p, i ), m_previous( i ), m_entity( e ) + {}; + + ListerItem(ListerItem *p, entity::Entity e) + : ExtendableItem( p ), m_previous( 0 ), m_entity( e ) + {}; + + ~ListerItem(); + + virtual ItemExtender *createExtender() { + if ( extendable() ) + return new ListerItemExtender(); + return 0; + } + + /* virtual void updateIcon( const QPixmap &p ) { + if ( m_entity.is< entity::Package >() + || m_entity.is< entity::Version >() ) + return ExtendableItem::updateIcon( p ); + setPixmap( list()->toggleColumn(), QPixmap() ); + } */ + + virtual QString text( int column ) const; +#ifdef KUBUNTU + virtual void setUpdatedIcon(QPixmap& pm) { m_pixmap=pm; }; + virtual const QPixmap* pixmap( int column ) const; +#endif + entity::Entity entity() { return m_entity; } + const entity::Entity entity() const { return m_entity; } + virtual void paintCell (QPainter *p, const QColorGroup &cg, + int column, int width, int alignment); + virtual bool less( const ExtendableItem * ) const; + Lister *lister() { + return dynamic_cast< Lister* >( listView() ); + } + + // beware, makes sort O(n^2lg(n^2)) + bool keepLess( const ListerItem *o ) const; + virtual bool extendable() const { + return ( entity().is< entity::Package >() + || m_entity.is< entity::Version >() ); + } + +protected: + ListerItem *m_previous; + entity::Entity m_entity; + QPixmap m_pixmap; + // ListerItemTooltip* m_tip; +}; + +} + +#endif /* ifndef PKGLIST_H */ diff --git a/adept/adept/listerextenderui.ui b/adept/adept/listerextenderui.ui new file mode 100644 index 0000000..3f89eaf --- /dev/null +++ b/adept/adept/listerextenderui.ui @@ -0,0 +1,309 @@ + +adept::ListerItemExtenderUi + + + ListerItemExtenderrUi + + + + 0 + 0 + 587 + 230 + + + + ListerItemExtenderrUi + + + + unnamed + + + 0 + + + 0 + + + + spacer6 + + + Vertical + + + Fixed + + + + 4 + 4 + + + + + + spacer2 + + + Horizontal + + + Fixed + + + + 4 + 4 + + + + + + layout7 + + + + unnamed + + + + m_name + + + + 5 + 4 + 0 + 0 + + + + 0 + + + name + + + AlignTop + + + + + m_indicator + + + + 5 + 4 + 0 + 0 + + + + 0 + + + + + m_status + + + + 5 + 4 + 0 + 0 + + + + 0 + + + status + + + AlignTop + + + + + m_change + + + + 5 + 4 + 0 + 0 + + + + 0 + + + 0 + + + change + + + AlignTop + + + + + + + m_description + + + NoFocus + + + NoFrame + + + Plain + + + AutoOneFit + + + AlwaysOff + + + AlwaysOff + + + description... + + + + + layout3 + + + + unnamed + + + 0 + + + 4 + + + + spacer5 + + + Horizontal + + + Preferred + + + + 10 + 20 + + + + + + m_logical + + + logical + + + + + m_details + + + Details + + + + + spacer5_2 + + + Horizontal + + + Preferred + + + + 10 + 20 + + + + + + + + m_packageInfo + + + + 0 + 80 + + + + + + spacer13 + + + Horizontal + + + Fixed + + + + 1 + 20 + + + + + + + + adept::PackageInfo +
adept/packageinfo.h
+ + -1 + -1 + + 0 + + 5 + 5 + 0 + 0 + + image0 +
+
+ + + 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b249444154388db5944d4c5c5518869f73ce9db9cc40f929cc30300e18129a50685268a28291982e1a2175212eaab1c49d3f8971e7aec6aedb54a32b435dd8685cb8c0c4b8b0feb421b7bd8186a069d23209144b18cb0c02f3732ff3c3ccbdd705a571941213f1dd9d93739ef37e6fbeef08d334d9d5d0d090c701c8344d2176c1a6697a5d5d5dd8b64d2a95c2b2ac7f05b12c8b783c8e6118d8b6fd685fdb753a39394928e2a7c55724d693a7e214104220242805520a84d8b9e4790f0b1302c7751958f1e30534be9fa41a0c60db362dbe227f64af91b6e7719c2dfc0117a71c603da591de2882a7d3d4ec27122b10acad50aeb88044d542b84de3af7ab44aa55274f4e449dbf354bc347aa096fbf37e7efa2ecbad1b36907d78b289de8120232f37726250c3f52cf0a026a0f6065b9645d929e038167aa096d91b307171059034b5f8e9e9eb44fa052b4b25eeccd9dc99cb71f6ad082fbea2e351c075bdbdc13b9109fc01b83fef63e2e232e03076b68393231a0dcd024daf502c1e66e67a89cb971ef0e5a74bb4b61e6378248094b92ab0ac024b70ca017ef8360394187b2dc6d8b89ffa500e4d4f93d9083275d5e6f9913ade3dd70ee87c7d25c95646a25415aadab152b09ed4f8c5cc130a853839eac3951b684a61e70ef3f9c739668c24eba912afbfddc6d4d506e6a6d7b8b7d082aa8eb8dab19482cdcd220e36dd3dc19df23545de0a71f952861923493456cfd3cf36123c54a0b7bf0e8064621b21f7712c040857071ca4eea0f40a99f510573ec971cb48030e811a1faded3e94be85f2fb00703d1ff26f96ab9f011a5b04d0c4f26fdb948a754c1b25668c2491483d5d5d611617d6b8f0fe32cb779b492ce65168b4c774a4701eefd8f3a02d56e6e8f13aeefe9a63fa5a89d1970e91d908f3d46003e1480d173e28b37827c9b977348ab92ce16890237d1ec907ee3e8e3d8f60d0e1f4583d009f7d9860662acff89bad1c1faad0717493f7ce7713ed8cb0995c255f2a317a26427b67198f6a70f51c0a41b902279ed1187f23cc17130b7c74de65eac77a7a8f05517e41e2deefa4930576db60fa7a8ee1535134df3e93e7b82e0817476439fd6a9070a49f6fbe4a3077739db99b15c001146dd13a46cf1cc1f83943c62e51de76b0738fc9381e8f3390f0236b252e124999e11724fd833196164bacadb87848224fe874f779b43fe9f2dca928956d505a96dbb3f9bdc18661e00534c26d1a7a40e13912a11c9454280da41048a9915c75585df500074d53d816dc9edd229528ef0db66dbbea3ffdaffa471f1f28d8344df1bf800f1a6e9aa6f813c39885bc050f269c0000000049454e44ae426082 + + + + adept/extendablelist.h + + + + adept/packageinfo.h + +
diff --git a/adept/adept/listerpredicate.h b/adept/adept/listerpredicate.h new file mode 100644 index 0000000..98f1b41 --- /dev/null +++ b/adept/adept/listerpredicate.h @@ -0,0 +1,14 @@ +// -*- C++ -*- +#include +#include + +#ifndef EPT_LISTERPREDICATE_H +#define EPT_LISTERPREDICATE_H + +namespace adept { +using namespace aptFront; +using namespace cache; +typedef predicate::Predicate< entity::Entity > ListerPredicate; +} + +#endif diff --git a/adept/adept/packagedetails.cpp b/adept/adept/packagedetails.cpp new file mode 100644 index 0000000..56dd80b --- /dev/null +++ b/adept/adept/packagedetails.cpp @@ -0,0 +1,273 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +using namespace adept; + +ItemChangelog* global_changelog = new ItemChangelog(); + +PackageDetails::PackageDetails( QWidget *w, const char *n ) + : PackageDetailsUi( w, n ), + m_thread( 0 ), + m_qtMutex( true ), + m_logicalAct( 0 ), m_removeAct( 0 ), + m_fileListRunning( false ) +{ + m_toolbar->setIconSize( 22 ); + m_toolbar->setIconText( KToolBar::IconTextRight ); + + m_toolbar->insertButton( u8( "back" ), BBack, false, i18n( "Back" ) ); + m_toolbar->insertButton( u8( "forward" ), BForward, false, i18n( "Forward" ) ); + m_toolbar->insertLineSeparator(); + m_toolbar->insertButton( u8( "" ), BShow, true, i18n( "Show List" ) ); + + m_tags->setTitle( i18n( "Assigned Tags" ) ); + + m_lister->setRangeProvider( this ); // wee + // m_lister->setOpenToplevel( true ); + + m_description->setPaper( QBrush( colorGroup().background() ) ); + + connect( m_toolbar->getButton( BShow ), SIGNAL( clicked() ), + this, SIGNAL( showList() ) ); + connect( m_toolbar->getButton( BBack ), SIGNAL( clicked() ), + this, SIGNAL( back() ) ); + connect( m_toolbar->getButton( BForward ), SIGNAL( clicked() ), + this, SIGNAL( forward() ) ); + connect( m_lister, SIGNAL( detailsRequested( Lister::Entity ) ), + this, SIGNAL( detailsRequested( Lister::Entity ) ) ); + + observeComponent< component::State >(); + + adjustFontSize( m_name, 1 ); + + Cache &c = cache::Global::get( m_cache ); + component::Packages::iterator i = c.packages().packagesBegin(); + while ( !i->hasVersion() ) ++i; // ha hum... + setPackage( *i ); +} + +Lister::Range PackageDetails::listerRange() { + utils::Range< entity::Relation > r = m_package.depends(); + utils::VectorRange< entity::Entity > vr; + while ( r != r.end() ) { + if ( !r->targetPackages().empty() ) + std::cerr << r->targetPackages()->name() << std::endl; + vr.consume( *r ); + r = r.next(); + } + return vr.sorted(); +} + +void PackageDetails::loadFileListWorker() +{ + entity::Package p = m_package; + + std::string fl, flfile = "/var/lib/dpkg/info/" + p.name() + ".list"; + std::ifstream ifl( flfile.c_str() ); + + int i = 0; + kdDebug() << "PackageDetails::loadFileListWorker() entering loop" << endl; + + while ( ifl.is_open() && !ifl.eof() ) { + std::string line; + getline( ifl, line ); + if ( line == "/." || line == "" ) + continue; // nasty evil thing go away + m_qtMutex.lock(); + KURL url( "file:///" ); + url.addPath( u8( line ) ); + KFileItem *it = new KFileItem( url, u8( "" ), 0 ); + it->setName( u8( line ) ); + m_fileList->insertItem( it ); + ++i; + m_qtMutex.unlock(); + } + kdDebug() << "PackageDetails::loadFileListWorker() leaving loop" << endl; + ifl.close(); +} + +void PackageDetails::notifyPreRebuild( component::Base * ) { + kdDebug() << "PackageDetails::notifyPreRebuild()" << endl; + Threads::wait(); + m_logical->setEnabled( false ); + m_remove->setEnabled( false ); + m_logical->disconnect( SIGNAL( clicked() ) ); + m_remove->disconnect( SIGNAL( clicked() ) ); + delete m_logicalAct; + delete m_removeAct; + kdDebug() << "PackageDetails::notifyPreRebuild() done" << endl; +} + +void PackageDetails::loadFileList() { + Cache &c = cache::Global::get( m_cache ); + if ( m_fileListRunning || !c.isOpen() ) { + QTimer::singleShot( 100, this, SLOT( loadFileList() ) ); + return; + } + + kdDebug() << "PackageDetails::loadFileList()" << endl; + m_fileListRunning = true; + + // the following call is neccessary to invoke buildDefaultType of KMimeType + // the first time the method is called it will check for + // existence of application/octet-stream and *popup a dialog* if + // not found -- we don't want that to happen in a non-gui thread + KMimeType::defaultMimeTypePtr(); + m_thread = asyncCall( std::mem_fun( &PackageDetails::loadFileListWorker ), this ); + + m_qtMutex.lock(); + m_fileList->KFileView::clear(); + c.progress().OverallProgress( 0, 0, 0, i18n( "Loading filelist..." ) ); + + m_qtMutex.unlock(); + Threads::enqueue( m_thread, &m_qtMutex ); + Threads::wait(); + c.progress().Done(); + m_fileListRunning = false; + kdDebug() << "PackageDetails::loadFileList() finished" << endl; +} + +void PackageDetails::setPackage( cache::entity::Package p ) +{ + kdDebug() << "PackageDetails::setPackage()" << endl; + m_package = p.stable(); + m_name->setText( QString( "" ) + + p.name( std::string( "No package" ) ) + "" ); + m_info->setPackage( p ); + QString l = u8( p.longDescription( + std::string( i18n( "No long description available" ).local8Bit() ) ) ); + m_description->setText( QString( "" ) + + formatLongDescription( l ) + "" ); + + std::string na = u8( i18n( "not available" ) ); + m_tags->setTags( p.tags( entity::Package::TagSet() ) ); + m_tags->openToplevel(); + m_architecture->setText( labelFormat( i18n( "Architecture: " ), + p.architecture( na ) ) ); + m_filename->setText( labelFormat( i18n( "Filename: " ), p.fileName( na ) ) ); + m_md5->setText( labelFormat( i18n( "MD5: " ), p.md5sum( na ) ) ); + m_source->setText( labelFormat( i18n( "Source Package: " ), p.source( na ) ) ); + + /* IF IT ISN'T KUBUNTU, DON'T SUPPORT CHANGELOGS! */ +#ifdef KUBUNTU + // Lets go ahead and stick the changelog in there.... + try { + global_changelog->setParent(p); + m_changelog->setText(i18n("Loading...")); + connect(dynamic_cast(global_changelog), SIGNAL( changelogReady(QString) ), + dynamic_cast(this), SLOT( changelogDisplay(QString) )); + connect(dynamic_cast(this), SIGNAL( requestTheChangelog() ), + dynamic_cast(global_changelog), SIGNAL( changelogNeeded() )); + emit requestTheChangelog(); + } catch (...) {}; +#endif /* KUBUNTU */ + + notifyPostChange( 0 ); + m_lister->cleanRebuild(); + loadFileList(); +} + +void PackageDetails::changelogDisplay( QString content ) { + m_changelog->setText(content); +} + +void PackageDetails::notifyPostChange( cache::component::Base * ) +{ + kdDebug() << "PackageDetails::notifyPostChange()" << endl; + // without the timer to break it, there could be a loop where + // we connect the clicked() signal to a slot which would be + // invoked right away when we return -> evil + QTimer::singleShot( 0, this, SLOT( updateLogical() ) ); +} + +void PackageDetails::notifyPostRebuild( cache::component::Base *b ) +{ + kdDebug() << "PackageDetails::notifyPostRebuild( " << b << " )" << endl; + // can't call directly because stable entities are not guaranteed + // to be stabilised at this point yet + QTimer::singleShot( 0, this, SLOT( updateLogical() ) ); + QTimer::singleShot( 0, this, SLOT( loadFileList() ) ); + m_lister->cleanRebuild(); +} + +void PackageDetails::updateLogical() +{ + Cache &c = cache::Global::get( m_cache ); + if ( !c.isOpen() ) { + QTimer::singleShot( 100, this, SLOT( updateLogical() ) ); + return; + } + kdDebug() << "PackageDetails::updateLogical()" << endl; + entity::Package p = m_package; + kdDebug() << "PackageDetails::updateLogical: p = " << p.name() + << " p.component() = " << &p.component() << endl; + if ( !p.valid() ) return; // nothing to update + EntityActor *a = 0, *b = 0; + + if ( p.canUpgrade() ) { + a = new EntityActor( p.upgrade() ); + } else if ( p.canInstall() ) { + a = new EntityActor( p.install() ); + } else if ( p.canKeep() ) { + a = new EntityActor( p.keep() ); + } + + if ( p.canRemove() ) { + b = new EntityActor( p.remove() ); + } + + if ( a ) { + m_logical->setEnabled( true ); + m_logical->setText( u8( a->actor().prettyName() ) ); + connect( m_logical, SIGNAL( clicked() ), + a, SLOT( destructiveAct() ) ); + } else { + m_logical->setText( i18n( "Install" ) ); + m_logical->setEnabled( false ); + } + + if ( b ) { + m_remove->setEnabled( true ); + m_remove->setText( u8( b->actor().prettyName() ) ); + connect( m_remove, SIGNAL( clicked() ), + b, SLOT( destructiveAct() ) ); + } else { + m_remove->setText( i18n( "Remove" ) ); + m_remove->setEnabled( false ); + } + + m_logicalAct = a; + m_removeAct = b; + // std::copy( r, r.last(), vr ); + + // r.consume( utils::upcastRange< entity::Entity >( p.depends() ) ); +} + +void PackageDetails::setHasForward( bool e ) { + m_toolbar->setItemEnabled( BForward, e ); + // m_forward->setEnabled( e ); +} + +void PackageDetails::setHasBack( bool e ) { + m_toolbar->setItemEnabled( BBack, e ); + // m_back->setEnabled( e ); +} diff --git a/adept/adept/packagedetails.h b/adept/adept/packagedetails.h new file mode 100644 index 0000000..6d15185 --- /dev/null +++ b/adept/adept/packagedetails.h @@ -0,0 +1,58 @@ +/* -*- C++ -*- adept/packagedetails.h + written by Peter Rockai */ + +#include +#include +#include +#include + +#include +#include + +#ifndef EPT_PACKGEDETAILS_H +#define EPT_PACKGEDETAILS_H + +class KToolBarButton; +class QThread; + +namespace adept { + +using namespace aptFront; + +class PackageDetails : public PackageDetailsUi, public Lister::RangeProvider, + public cache::Observer +{ + Q_OBJECT +public: + enum ButtonID { BForward, BBack, BShow }; + PackageDetails( QWidget *p = 0, const char *n = 0 ); + void setPackage( cache::entity::Package ); + void setHasForward( bool ); + void setHasBack( bool ); + virtual Lister::Range listerRange(); + void notifyPostChange( cache::component::Base * ); + void notifyPreRebuild( cache::component::Base * ); + void notifyPostRebuild( cache::component::Base * ); +signals: + void showList(); + void back(); + void forward(); + void detailsRequested( Lister::Entity ); + void requestTheChangelog(); +protected slots: + void loadFileList(); + void updateLogical(); + void changelogDisplay(QString content); +protected: + void loadFileListWorker(); + cache::entity::StablePackage m_package; + QMutex m_qtMutex; + QThread *m_thread; + QGuardedPtr< EntityActor > m_logicalAct, m_removeAct; + int m_fileListRunning; + +}; + +} + +#endif diff --git a/adept/adept/packagedetailsui.ui b/adept/adept/packagedetailsui.ui new file mode 100644 index 0000000..06e436a --- /dev/null +++ b/adept/adept/packagedetailsui.ui @@ -0,0 +1,506 @@ + +PackageDetailsUi + + + PackageDetailsUi + + + + 0 + 0 + 705 + 529 + + + + Form1 + + + + unnamed + + + 0 + + + 0 + + + + m_toolbar + + + + + frame3 + + + + 5 + 5 + 0 + 8 + + + + NoFrame + + + Raised + + + + unnamed + + + 2 + + + + m_name + + + + 5 + 0 + 0 + 0 + + + + (title) + + + + + m_info + + + + 5 + 4 + 8 + 0 + + + + + 0 + 75 + + + + + + spacer4 + + + Vertical + + + Expanding + + + + 20 + 16 + + + + + + m_remove + + + (remove) + + + + + spacer2 + + + Horizontal + + + Fixed + + + + 20 + 20 + + + + + + m_logical + + + (logical) + + + + + spacer1 + + + Horizontal + + + Fixed + + + + 20 + 20 + + + + + + m_description + + + + 5 + 5 + 28 + 0 + + + + NoFocus + + + NoFrame + + + Sunken + + + AutoOneFit + + + Auto + + + AlwaysOff + + + description... + + + + + + + tabWidget2 + + + + 7 + 7 + 0 + 16 + + + + + tab + + + Package Relationships + + + + unnamed + + + 0 + + + + m_lister + + + + 5 + 5 + 0 + 0 + + + + + 0 + 120 + + + + + + + + tab + + + Installed Files + + + + unnamed + + + 0 + + + + m_fileList + + + + + + + TabPage + + + Additional Information + + + + unnamed + + + + m_tags + + + + 5 + 7 + 0 + 0 + + + + + 200 + 0 + + + + + + layout9 + + + + unnamed + + + 0 + + + + m_source + + + source + + + + + m_architecture + + + + 5 + 4 + 0 + 0 + + + + architecture + + + + + m_filename + + + file + + + + + m_md5 + + + md5 + + + + + spacer7 + + + Vertical + + + Expanding + + + + 20 + 61 + + + + + + + + + + changelog_tab + + + Developer Changelog + + + + unnamed + + + 0 + + + + m_changelog + + + NoFocus + + + NoFrame + + + Sunken + + + AutoOneFit + + + Auto + + + AlwaysOff + + + description... + + + + + + + + + + adept::TagChooser +
adept/tagchooser.h
+ + -1 + -1 + + 0 + + 5 + 5 + 0 + 0 + + image0 +
+ + adept::PackageInfo +
adept/packageinfo.h
+ + -1 + -1 + + 0 + + 5 + 5 + 0 + 0 + + image0 +
+ + adept::Lister +
adept/lister.h
+ + -1 + -1 + + 0 + + 5 + 5 + 0 + 0 + + image0 +
+ + KToolBar +
ktoolbar.h
+ + -1 + -1 + + 1 + + 5 + 5 + 0 + 0 + + image0 +
+ + KFileDetailView +
kfiledetailview.h
+ + -1 + -1 + + 0 + + 5 + 5 + 0 + 0 + + image0 +
+
+ + + 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b249444154388db5944d4c5c5518869f73ce9db9cc40f929cc30300e18129a50685268a28291982e1a2175212eaab1c49d3f8971e7aec6aedb54a32b435dd8685cb8c0c4b8b0feb421b7bd8186a069d23209144b18cb0c02f3732ff3c3ccbdd705a571941213f1dd9d93739ef37e6fbeef08d334d9d5d0d090c701c8344d2176c1a6697a5d5d5dd8b64d2a95c2b2ac7f05b12c8b783c8e6118d8b6fd685fdb753a39394928e2a7c55724d693a7e214104220242805520a84d8b9e4790f0b1302c7751958f1e30534be9fa41a0c60db362dbe227f64af91b6e7719c2dfc0117a71c603da591de2882a7d3d4ec27122b10acad50aeb88044d542b84de3af7ab44aa55274f4e449dbf354bc347aa096fbf37e7efa2ecbad1b36907d78b289de8120232f37726250c3f52cf0a026a0f6065b9645d929e038167aa096d91b307171059034b5f8e9e9eb44fa052b4b25eeccd9dc99cb71f6ad082fbea2e351c075bdbdc13b9109fc01b83fef63e2e232e03076b68393231a0dcd024daf502c1e66e67a89cb971ef0e5a74bb4b61e6378248094b92ab0ac024b70ca017ef8360394187b2dc6d8b89ffa500e4d4f93d9083275d5e6f9913ade3dd70ee87c7d25c95646a25415aadab152b09ed4f8c5cc130a853839eac3951b684a61e70ef3f9c739668c24eba912afbfddc6d4d506e6a6d7b8b7d082aa8eb8dab19482cdcd220e36dd3dc19df23545de0a71f952861923493456cfd3cf36123c54a0b7bf0e8064621b21f7712c040857071ca4eea0f40a99f510573ec971cb48030e811a1faded3e94be85f2fb00703d1ff26f96ab9f011a5b04d0c4f26fdb948a754c1b25668c2491483d5d5d611617d6b8f0fe32cb779b492ce65168b4c774a4701eefd8f3a02d56e6e8f13aeefe9a63fa5a89d1970e91d908f3d46003e1480d173e28b37827c9b977348ab92ce16890237d1ec907ee3e8e3d8f60d0e1f4583d009f7d9860662acff89bad1c1faad0717493f7ce7713ed8cb0995c255f2a317a26427b67198f6a70f51c0a41b902279ed1187f23cc17130b7c74de65eac77a7a8f05517e41e2deefa4930576db60fa7a8ee1535134df3e93e7b82e0817476439fd6a9070a49f6fbe4a3077739db99b15c001146dd13a46cf1cc1f83943c62e51de76b0738fc9381e8f3390f0236b252e124999e11724fd833196164bacadb87848224fe874f779b43fe9f2dca928956d505a96dbb3f9bdc18661e00534c26d1a7a40e13912a11c9454280da41048a9915c75585df500074d53d816dc9edd229528ef0db66dbbea3ffdaffa471f1f28d8344df1bf800f1a6e9aa6f813c39885bc050f269c0000000049454e44ae426082 + + + + + ktoolbar.h + adept/packageinfo.h + adept/lister.h + kfiledetailview.h + adept/tagchooser.h + +
diff --git a/adept/adept/packageinfo.cpp b/adept/adept/packageinfo.cpp new file mode 100644 index 0000000..dac788b --- /dev/null +++ b/adept/adept/packageinfo.cpp @@ -0,0 +1,181 @@ +/** -*- C++ -*- + @file adept/packageinfo.cpp + @author Peter Rockai +*/ + +#include +#include +#include +#include +#include + +#include +#include + +using namespace adept; +using namespace cache; + +PackageInfo::PackageInfo( QWidget *p, const char *n ) + : PackageInfoUi( p, n ), m_specificVersion( false ) +{ + observeComponent< component::State >(); +} + +void PackageInfo::adjustFontSize( int s ) { + adept::adjustFontSize( m_status, s ); + adept::adjustFontSize( m_change, s ); + adept::adjustFontSize( m_section, s ); + adept::adjustFontSize( m_installedSize, s ); + adept::adjustFontSize( m_maintainer, s ); + adept::adjustFontSize( m_candidateVer, s ); + adept::adjustFontSize( m_installedVer, s ); +} + +void PackageInfo::hideStatus() { + m_status->hide(); + m_change->hide(); +} + +namespace adept { + +QColor statusColor( entity::Package p ) +{ + if ( !p.valid() ) + return Qt::black; + + QColor c = Qt::blue; + if (p.isInstalled()) + c = Qt::darkGreen; + if (p.isUpgradable()) + c = Qt::darkYellow; + if (p.isBroken()) + c = Qt::red; + return c; +} + +QColor actionColor( entity::Package p ) +{ + if ( !p.valid() ) + return Qt::black; + + QColor c = Qt::blue; + if (p.markedNewInstall()) + c = Qt::darkGreen; + if (p.markedUpgrade()) + c = Qt::darkYellow; + if (p.markedReInstall()) + c = Qt::darkYellow; + if (p.markedRemove()) + c = Qt::darkRed; + if (p.markedPurge()) + c = Qt::red; + if (p.willBreak()) + c = Qt::red; + return c; +} + +/* QString hexColor( QColor c ) +{ + QString r( "#%1%2%3" ); + return r.arg( c.red(), -2, 16 ).arg( c.green(), -2, 16 ).arg( c.blue(), -2, 16 ); + } */ + +QString colorify( QColor c, QString s ) +{ + return QString( "" + s + ""; +} + +QString formatLongDescription( QString l ) +{ + QRegExp rx( u8( "^(.*)\n" ) ); + rx.setMinimal( true ); + l.replace( rx, u8( "\\1

" ) ); + rx = QRegExp( u8( "\\n[ ]*\\.\\n" ) ); + l.replace( rx, u8( "

" ) ); + rx = QRegExp( u8( "\n " ) ); + l.replace( rx, u8( " " ) ); + rx = QRegExp( u8( "\n - (.*)(\n|$)" ) ); + rx.setMinimal( true ); + l.replace( rx, u8( "\n

  • \\1
  • \n" ) ); + l.replace( rx, u8( "\n
  • \\1
  • \n" ) ); + return QString( "

    " ) + l + u8( "

    " ); +} + +void PackageInfo::setPackage( entity::Package p ) +{ + kdDebug() << "PackageInfo::setPackage()" << endl; + // ho hum, probably XXX fix libapt-front? + setVersion( p.valid() ? p.anyVersion() : entity::Version(), false ); +} + +void PackageInfo::setVersion( entity::Version v, bool specific ) +{ + m_specificVersion = specific; + m_version = v.stable(); + if ( !m_version.valid() ) return; + kdDebug() << "PackageInfo::setVersion() (valid)" << endl; + m_section->setText( + labelFormat( i18n( "Section:" ), u8( v.section( u8( i18n( "Unknown" ) ) ) ) ) ); + m_maintainer->setText( + labelFormat( i18n( "Maintainer:" ), u8( v.maintainer( u8( i18n( "Unknown" ) ) ) ), + false ) ); + + notifyPostChange( 0 ); +} + +void PackageInfo::notifyPostRebuild( component::Base *b ) { + return notifyPostChange( b ); +} + +void PackageInfo::notifyPostChange( component::Base * ) +{ + if ( !m_version.valid() ) return; + entity::Version v = m_version; + entity::Package p = v.package(); + QString cv = i18n( "n/a" ), iv = i18n( "n/a" ), is = i18n( "n/a" ), status, action; + + if (p.valid()) { + entity::Version _cv = p.candidateVersion(); + entity::Version _iv = p.installedVersion(); + + if (_cv.valid()) { + cv = u8( _cv.versionString() ); + is = u8( _cv.installedSizeString() ); + } + + if (_iv.valid()) { + iv = _iv.versionString(); + } + } + + std::string unk = u8( i18n( "unknown" ) ); + /* m_status->setText( i18n( "Currently " ) + colorify( + statusColor( p ), + u8( p.statusString( unk ) ) ) + + i18n( ", " ) + colorify( + actionColor( p ), + u8( p.actionString( unk ) ) ) + i18n( " + requested" ) ); */ + m_status->setText( + labelFormat( i18n( "Status:" ), colorify( + statusColor( p ), + u8( p.statusString( u8( i18n( "Unknown" ) ) ) ) ) ) ); + m_change->setText( + labelFormat( i18n( "Requested change:" ), colorify( + actionColor( p ), + u8( p.actionString( u8( i18n( "Unknown" ) ) ) + ) ) ) ); + + m_candidateVer->setText( + m_specificVersion ? + labelFormat( i18n( "Version:" ), + v.versionString() + "(" + i18n( "candidate" ) + " " + cv + ")" ) + : labelFormat( i18n( "Candidate Version:" ), cv ) ); + m_installedVer->setText( + labelFormat( i18n( "Installed Version:" ), iv ) ); + m_installedSize->setText( + labelFormat( i18n( "Installed Size:" ), is ) ); +} + +} diff --git a/adept/adept/packageinfo.h b/adept/adept/packageinfo.h new file mode 100644 index 0000000..1a83c0d --- /dev/null +++ b/adept/adept/packageinfo.h @@ -0,0 +1,49 @@ +/* -*- C++ -*- adept/packageinfo.h + written by Peter Rockai */ + +#include +#include +#include + +#ifndef EPT_PACKAGEINFO_H +#define EPT_PACKAGEINFO_H + +namespace adept { + +using namespace aptFront; + +class PackageInfo : public PackageInfoUi, public cache::Observer +{ + Q_OBJECT +public: + PackageInfo( QWidget *p, const char *n = 0 ); +public slots: + void setVersion( cache::entity::Version v, bool = true ); + void setPackage( cache::entity::Package v ); + void adjustFontSize( int ); +public: + void notifyPostChange( cache::component::Base * ); + void notifyPostRebuild( cache::component::Base * ); + void hideStatus(); +protected: + cache::entity::StableVersion m_version; + bool m_specificVersion; +}; + +inline QString labelFormat( const QString &what, + const QString &txt, bool nobr = true ) +{ + QString ret = "" + what + " " + (nobr ? "" : "") + + txt + (nobr ? "" : ""); + return ret; +} + +QColor actionColor( cache::entity::Package p ); +QColor statusColor( cache::entity::Package p ); + +QString formatLongDescription( QString in ); +QString colorify( QColor c, QString s ); + +} + +#endif diff --git a/adept/adept/packageinfoui.ui b/adept/adept/packageinfoui.ui new file mode 100644 index 0000000..d7d5dc5 --- /dev/null +++ b/adept/adept/packageinfoui.ui @@ -0,0 +1,180 @@ + +PackageInfoUi + + + details + + + + 0 + 0 + 253 + 128 + + + + Form2 + + + + unnamed + + + 1 + + + 0 + + + + m_indent + + + + 0 + 0 + 0 + 0 + + + + + 16 + 5 + + + + + 16 + 5 + + + + + + + + + m_maintainer + + + + 5 + 0 + 0 + 0 + + + + + 100 + 0 + + + + maintainer + + + AlignBottom + + + + + m_candidateVer + + + + 5 + 0 + 0 + 0 + + + + candidate version + + + + + m_installedVer + + + + 5 + 0 + 0 + 0 + + + + installed version + + + + + m_section + + + + 5 + 0 + 0 + 0 + + + + section + + + + + m_installedSize + + + + 5 + 0 + 0 + 0 + + + + installed size + + + + + m_status + + + + 5 + 0 + 0 + 0 + + + + status + + + + + m_change + + + + 5 + 0 + 0 + 0 + + + + change + + + + + + diff --git a/adept/adept/progress.cpp b/adept/adept/progress.cpp new file mode 100644 index 0000000..60a3bd3 --- /dev/null +++ b/adept/adept/progress.cpp @@ -0,0 +1,58 @@ +#include +#include +#include +#include +#include + +using namespace adept; + +Progress::Progress() + : m_pbar( 0 ), m_sbar( 0 ), m_busy( false ) +{ +} + +void Progress::Update () +{ + if (!m_sbar) + return; + if (!m_pbar) { + if (Percent) { + m_pbar = new KProgress( m_sbar ); + m_pbar->setMinimumWidth( 80 ); + m_pbar->setMaximumWidth( 120 ); + m_pbar->setTextEnabled( false ); + m_pbar->show(); + m_sbar->addWidget( m_pbar, 0, true ); + m_pbar->setTotalSteps( 100 ); + } + MajorChange = true; + } + if (MajorChange) { + if ( !m_busy ) { + QApplication::setOverrideCursor( QCursor( Qt::BusyCursor ) ); + m_busy = true; + } + m_sbar->message( u8( Op + "..." ) ); + } + if (CheckChange (0.05) == false) + return; + // kdDebug() << "Progress::Update()" << endl; + if (m_pbar) + m_pbar->setProgress( Percent ); + kapp->processEvents(); +} + +void Progress::Done () +{ + kdDebug() << "Progress::Done()" << endl; + + QApplication::restoreOverrideCursor(); + m_busy = false; + + if (m_sbar) + m_sbar->clear(); + delete m_pbar; + m_pbar = 0; +} + +Progress::~Progress() {} diff --git a/adept/adept/progress.h b/adept/adept/progress.h new file mode 100644 index 0000000..aef3d92 --- /dev/null +++ b/adept/adept/progress.h @@ -0,0 +1,30 @@ +/** -*- C++ -*- + @file adept/progress.h + @author Peter Rockai +*/ + +#include +#include +#include + +#ifndef EPT_PROGRESS_H +#define EPT_PROGRESS_H + +namespace adept { + +class Progress : public OpProgress { +public: + Progress(); + virtual ~Progress(); + virtual void Update(); + virtual void Done(); + void setStatusBar( KStatusBar *b ) { m_sbar = b; } +protected: + KProgress *m_pbar; + KStatusBar *m_sbar; + bool m_busy; +}; + +} + +#endif diff --git a/adept/adept/quickfilter.cpp b/adept/adept/quickfilter.cpp new file mode 100644 index 0000000..2cb0577 --- /dev/null +++ b/adept/adept/quickfilter.cpp @@ -0,0 +1,79 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "quickfilter.h" + +using namespace aptFront; +using namespace adept; + +QuickFilterWidget::QuickFilterWidget( QWidget *parent, const char *name ) + : QuickFilterUi( parent, name ) +{ + setFocusProxy( m_match ); + connect( m_match, SIGNAL( textChanged( const QString & ) ), + this, SLOT( textChanged( const QString & ) ) ); + /* connect( m_reset, SIGNAL( clicked() ), + this, SLOT( reset() ) ); */ + connect( m_match, SIGNAL( returnPressed() ), + this, SLOT( widgetsChanged() ) ); + connect( &timer, SIGNAL( timeout() ), + this, SLOT( widgetsChanged() ) ); + + QObjectList *chld = queryList( "QCheckBox" ); + QObjectListIt it( *chld ); + while( it.current() != 0 ) { + connect( it.current(), SIGNAL( toggled( bool ) ), + this, SLOT( widgetsChanged() ) ); + ++it; + } +} + +void QuickFilterWidget::mouseReleaseEvent( QMouseEvent *e ) { + m_match->setFocus(); + QuickFilterUi::mouseReleaseEvent( e ); +} + +void QuickFilterWidget::textChanged( const QString & ) +{ + kdDebug() << "QuickFilterWidget::textChanged" << endl; + timer.start( 1000, true ); +} + +QuickFilterWidget::Predicate QuickFilterWidget::predicate() +{ + typedef QuickFilter< entity::Package > F; + F f; int w = 0; + if ( m_name->isChecked() ) w |= F::Name; + if ( m_description->isChecked() ) w |= F::Description; + if ( m_maintainer->isChecked() ) w |= F::Maintainer; + + f.setMatch( u8( m_match->text() ) ); + f.setWhat( w ); + + return predicate::adapt< entity::Entity >( f ); +} + +static void blockedSet( QCheckBox *b, bool v ) { + b->blockSignals( true ); + b->setChecked( v ); + b->blockSignals( false ); +} + +void QuickFilterWidget::predicateChanged() { + typedef QuickFilter< entity::Package > F; + F f = downcast< F >( m_pred ); + m_match->blockSignals( true ); + m_match->setText( f.match() ); + m_match->blockSignals( false ); + int w = f.what(); + + blockedSet( m_name, w & F::Name ); + blockedSet( m_description, w & F::Description ); + blockedSet( m_maintainer, w & F::Maintainer ); +} + diff --git a/adept/adept/quickfilter.h b/adept/adept/quickfilter.h new file mode 100644 index 0000000..788c9da --- /dev/null +++ b/adept/adept/quickfilter.h @@ -0,0 +1,119 @@ +/** -*- C++ -*- + @file adept/quickfilter.h + @author Peter Rockai +*/ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#ifndef EPT_QUICKFILTER_H +#define EPT_QUICKFILTER_H + +class KLineEdit; + +namespace adept { + +template< typename T > +struct QuickFilter : predicate::Implementation< T, QuickFilter< T > >, + InterfacingPredicate +{ + enum Type { Regex, Substring, Exact }; + enum What { Name = 0x1, Description = 0x2, Maintainer = 0x4 }; + + QuickFilter() + : m_type( Substring ), m_match( "" ), m_what( Name | Description ) { + setupPredicate(); + } + + void setupPredicate() { + predicate::ArgumentList l; + l.push_back( m_match ); + predicate::Predicate< T > a = not predicate::True< T >(); + if ( m_what & Name ) a = a or predicate::Factory< T >::name( m_match ); + if ( m_what & Description ) + a = a or predicate::Factory< T >::description( m_match ); + if ( m_what & Maintainer ) + a = a or predicate::Factory< T >::maintainer( m_match ); + m_op = a; + /* m_op = predicate::map( + predicate::predicate( predicate::Factory< T >::description( "" ) + or predicate::Factory< T >::name( "" ) + or predicate::Factory< T + >::maintainer( "" ) ), l ); */ + } + + std::string summary() const { + return u8( i18n( "Search: " ) ) + "\"" + m_match + "\""; + } + + void parseArguments( const predicate::ArgumentList & ) {} + + bool operator==( const QuickFilter &o ) const { + return o.m_type == m_type && o.m_match == m_match; + } + + std::string typeString() const { + if (m_type == Regex) return "Regular Expression"; + if (m_type == Substring) return "Substring"; + if (m_type == Exact) return "Exact Match"; + } + + bool operator()( const T &p ) { + return m_op( p ); + } + + std::string match() const { + return m_match; + } + + void setMatch( const std::string &s ) { + m_match = s; + setupPredicate(); + } + + void setWhat( int w ) { + m_what = w; + setupPredicate(); + } + + int what() { return m_what; } + + virtual void reset() { + m_match = ""; + setupPredicate(); + } + +protected: + Type m_type; + std::string m_match; + int m_what; + predicate::Predicate< T > m_op; +}; + +class QuickFilterWidget : public QuickFilterUi +{ + Q_OBJECT +public: + QuickFilterWidget( QWidget *parent, const char *name = 0 ); + virtual Predicate predicate(); +public slots: + void predicateChanged(); +protected slots: + void textChanged( const QString & ); +protected: + void mouseReleaseEvent( QMouseEvent *e ); + QTimer timer; +}; + +} + +#endif diff --git a/adept/adept/quickfilterui.ui b/adept/adept/quickfilterui.ui new file mode 100644 index 0000000..d45c154 --- /dev/null +++ b/adept/adept/quickfilterui.ui @@ -0,0 +1,130 @@ + +adept::QuickFilterUi + + + QuickFilterUi + + + + 0 + 0 + 805 + 31 + + + + QuickFilterUi + + + + unnamed + + + 2 + + + 1 + + + + m_title + + + <b>Search:&nbsp;</b> + + + + + m_match + + + + 5 + 0 + 0 + 0 + + + + + 200 + 0 + + + + + + spacer2 + + + Horizontal + + + Fixed + + + + 20 + 20 + + + + + + textLabel2 + + + Match: + + + AutoText + + + + + m_name + + + package name, + + + + + m_description + + + description, + + + + + m_maintainer + + + maintainer. + + + + + spacer3 + + + Horizontal + + + Expanding + + + + 41 + 21 + + + + + + + adept/filterlist.h + + + diff --git a/adept/adept/sourceseditor.cpp b/adept/adept/sourceseditor.cpp new file mode 100644 index 0000000..3b04cf6 --- /dev/null +++ b/adept/adept/sourceseditor.cpp @@ -0,0 +1,165 @@ +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include "sourceseditor.h" +#include + +using namespace aptFront; +using namespace adept; + +SourcesEditor::SourcesEditor( std::string f, QWidget *p, const char *n ) + : SourcesEditorUi( p, n ), m_filename( f ) +{ + m_list->setSorting( -1 ); + m_list->setAcceptDrops( true ); + connect( m_close, SIGNAL( clicked() ), + this, SIGNAL( close() ) ); + connect( m_apply, SIGNAL( clicked() ), + this, SLOT( save() ) ); + connect( m_reset, SIGNAL( clicked() ), + this, SLOT( reset() ) ); + + connect( m_list, SIGNAL( contextMenuRequested( + QListViewItem *, const QPoint &, int) ), + this, SLOT( contextMenu( QListViewItem *, const QPoint & ) ) ); + + connect( m_newAdd, SIGNAL( clicked() ), + this, SLOT( newAdd() ) ); + + reset(); +} + +void SourcesEditor::newAdd() +{ + Sources::Entry e( true, Sources::Entry::Binary ); + std::string s = m_newLine->text(); + std::istringstream i( s ); + i >> e; + new EntryItem( e, m_list ); + m_newLine->setText( u8( "" ) ); +} + +void SourcesEditor::contextMenu( QListViewItem *, const QPoint &pt ) { + EntryItem *s = dynamic_cast< EntryItem * >( m_list->selectedItem() ); + if (!s) return; + KPopupMenu *m = new KPopupMenu (this); + m->insertItem( s->entry().enabled() ? i18n( "Disable" ) : i18n( "Enable" ), 0 ); + m->insertItem( i18n( "Clone" ), 1 ); + m->insertItem( i18n( "Remove" ), 2 ); + connect( m, SIGNAL( activated( int ) ), + this, SLOT( contextMenuActivated( int ) ) ); + m->exec( pt ); + delete m; +} + +void SourcesEditor::contextMenuActivated( int i ) { + EntryItem *s = dynamic_cast< EntryItem * >( m_list->selectedItem() ); + Sources::Entry e = s->entry(); + if (i == 0) { + e.setEnabled( !e.enabled() ); + s->setEntry( e ); + } + if (i == 2) + delete s; + if (i == 1) + new EntryItem( e, m_list, s ); +} + +void SourcesEditor::reset() { + std::ifstream in( m_filename.c_str() ); + m_sources.clear(); + in >> m_sources; + utils::Range< Sources::Entry > r = m_sources.entries(); + EntryItem *last = 0; + m_list->clear(); + while( r != r.end() ) { + last = last ? new EntryItem( *r, m_list, last ) : + new EntryItem( *r, m_list ); + ++ r; + } +} + +void SourcesEditor::save() { + m_sources.clear(); + EntryItem *i = dynamic_cast< EntryItem * >( m_list->firstChild() ); + while (i) { + m_sources.add( i->entry() ); + i = dynamic_cast< EntryItem * >( i->nextSibling() ); + } + std::ofstream out( m_filename.c_str() ); + out << m_sources; + std::cerr << "--" << m_sources << "--" << std::endl; + out.close(); + reset(); // re-parse +} + +/* void SourcesEditor::toggleSelectionEnabled() +{ + EntryItem *s = dynamic_cast< EntryItem * >( m_list->selectedItem() ); + if (s) { + Sources::Entry e = s->entry(); + e.setEnabled( !e.enabled() ); + s->setEntry( e ); + updateActions(); + } + } */ + +QString EntryItem::text( int c ) const { + if (entry().type() == Sources::Entry::Comment) { + if (c == 0) + if (entry().comment() == "") + return u8( "" ); + else + return entry().typeString(); + if (c == 1) + return entry().comment(); + return u8( "" ); + } + + if (c == 0) return entry().typeString(); + if (c == 1) return entry().url(); + if (c == 2) return entry().distribution(); + if (c == 3) return entry().components(); + return u8( "" ); +} + +void EntryItem::setText( int c, const QString &_s ) +{ + kdDebug() << "setText on column " << c << endl; + Sources::Entry e = entry(); + std::string s; + s = _s.local8Bit(); + if (c == 0) e.setTypeString( s ); + if (c == 1) + if (entry().type() == Sources::Entry::Comment) + e.setComment( s ); + else + e.setUrl( s ); + if (c == 2) e.setDistribution( s ); + if (c == 3) e.setComponents( s ); + setEntry( e ); + KListViewItem::setText( c, _s ); // stop qlistview from looping infinitely +} + +void EntryItem::paintCell (QPainter *p, const QColorGroup &cg, + int column, int width, int alignment ) +{ + QColorGroup _cg( cg ); + QColor c = _cg.text(); + QPixmap pm( width, height() ); + QPainter _p( &pm ); + if (!entry().enabled()) + c = Qt::gray; + _cg.setColor( QColorGroup::Text, c ); + KListViewItem::paintCell( &_p, _cg, column, width, AlignTop ); + p->drawPixmap( 0, 0, pm ); +} + diff --git a/adept/adept/sourceseditor.h b/adept/adept/sourceseditor.h new file mode 100644 index 0000000..32b474f --- /dev/null +++ b/adept/adept/sourceseditor.h @@ -0,0 +1,63 @@ +/** -*- C++ -*- + @file adept/sourceseditor.h + @author Peter Rockai +*/ + +#include +#include +#include + +namespace adept { + +using namespace aptFront; + +class SourcesEditor : public SourcesEditorUi +{ + Q_OBJECT +public: + SourcesEditor( std::string f, QWidget *p = 0, const char *n = 0 ); +public slots: + void save(); + void reset(); +protected slots: + void contextMenu( QListViewItem *, const QPoint & ); + void contextMenuActivated( int ); + void newAdd(); +signals: + void close(); +protected: + aptFront::Sources m_sources; + std::string m_filename; +}; + +class EntryItem : public KListViewItem { +public: + Sources::Entry entry() const { + return m_entry; + } + void setEntry( const Sources::Entry &e ) { + m_entry = e; + } + EntryItem( Sources::Entry e, KListView *v, EntryItem *prev ) + : KListViewItem( v, prev ), m_entry( e ) { + init(); + } + EntryItem( Sources::Entry e, KListView *v ) + : KListViewItem( v ), m_entry( e ) { + init(); + } + void init() { + setRenameEnabled( 0, false ); + setRenameEnabled( 1, true ); + setRenameEnabled( 2, true ); + setRenameEnabled( 3, true ); + } + QString text( int c ) const; + void setText( int c, const QString &s ); + virtual void paintCell (QPainter *p, const QColorGroup &cg, + int column, int width, int alignment); +protected: + Sources::Entry m_entry; +}; + +} diff --git a/adept/adept/sourceseditorui.ui b/adept/adept/sourceseditorui.ui new file mode 100644 index 0000000..43397d3 --- /dev/null +++ b/adept/adept/sourceseditorui.ui @@ -0,0 +1,173 @@ + +adept::SourcesEditorUi + + + adept::SourcesEditorUi + + + + 0 + 0 + 683 + 442 + + + + adept::SourcesEditorUi + + + + unnamed + + + + + Type + + + true + + + false + + + + + URL + + + true + + + true + + + + + Distribution + + + true + + + true + + + + + Components + + + true + + + true + + + + m_list + + + true + + + AllColumns + + + true + + + true + + + true + + + true + + + + + layout5 + + + + unnamed + + + + textLabel1 + + + New Repository: + + + + + m_newLine + + + Write or paste a normal sources.list line here to add it to your sources + + + + + m_newAdd + + + Add + + + + + + + layout13 + + + + unnamed + + + + m_reset + + + Reset + + + + + m_apply + + + Apply + + + + + m_close + + + Close + + + + + + + + + + m_newLine + m_newAdd + m_reset + m_apply + m_close + m_list + + + + klistview.h + + diff --git a/adept/adept/statefilter.cpp b/adept/adept/statefilter.cpp new file mode 100644 index 0000000..45ee470 --- /dev/null +++ b/adept/adept/statefilter.cpp @@ -0,0 +1,60 @@ +#include +#include +#include +#include +#include +#include +#include "statefilter.h" + +using namespace aptFront; +using namespace adept; + +StateFilterWidget::StateFilterWidget( QWidget *parent, const char *name ) + : StateFilterUi( parent, name ) +{ + QObjectList *chld = queryList( "QCheckBox" ); + QObjectListIt it( *chld ); + while( it.current() != 0 ) { + connect( it.current(), SIGNAL( toggled( bool ) ), + this, SLOT( widgetsChanged() ) ); + ++it; + } +} + +StateFilterWidget::Predicate StateFilterWidget::predicate() +{ + typedef StateFilter< entity::Package > F; + unsigned mask = 0; + if (m_installed->isChecked()) mask |= F::Installed; + if (m_notInstalled->isChecked()) mask |= F::NotInstalled; + if (m_upgradable->isChecked()) mask |= F::Upgradable; + if (m_keep->isChecked()) mask |= F::Keep; + if (m_install->isChecked()) mask |= F::Install; + if (m_remove->isChecked()) mask |= F::Remove; + if (m_upgrade->isChecked()) mask |= F::Upgrade; + + StateFilter< entity::Package > f; + f.setMask( mask ); + return predicate::adapt< entity::Entity >( f ); +} + +static void blockedSet( QCheckBox *b, bool v ) { + b->blockSignals( true ); + b->setChecked( v ); + b->blockSignals( false ); +} + +void StateFilterWidget::predicateChanged() +{ + typedef StateFilter< entity::Package > F; + F f = downcast< F >( m_pred ); + unsigned mask = f.mask(); + blockedSet( m_installed, mask & F::Installed ); + blockedSet( m_notInstalled, mask & F::NotInstalled ); + blockedSet( m_upgradable, mask & F::Upgradable ); + blockedSet( m_keep, mask & F::Keep ); + blockedSet( m_install, mask & F::Install ); + blockedSet( m_upgrade, mask & F::Upgrade ); + blockedSet( m_remove, mask & F::Remove ); +} + diff --git a/adept/adept/statefilter.h b/adept/adept/statefilter.h new file mode 100644 index 0000000..570edb1 --- /dev/null +++ b/adept/adept/statefilter.h @@ -0,0 +1,144 @@ +/** -*- C++ -*- + @file adept/filterwidgets.h + @author Peter Rockai +*/ + +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + +#ifndef EPT_STATEFILTER_H +#define EPT_STATEFILTER_H + +class KLineEdit; + +namespace adept { + +template< typename T > +struct StateFilter : predicate::Implementation< T, StateFilter< T > >, + InterfacingPredicate +{ + enum Mask { Installed = 1 << 0, + NotInstalled = 1 << 1, + Upgradable = 1 << 2, + Install = 1 << 3, + Remove = 1 << 4, + Keep = 1 << 5, + Upgrade = 1 << 6 }; + + StateFilter() + : m_mask( 0xff ) { + setupPredicate(); + } + + void setupPredicate() { + predicate::Predicate< T > + p0 = not predicate::True< T >(), + p1 = not predicate::True< T >(); + if (m_mask & Installed) + p0 = p0 or (predicate::Factory< T >::member( &T::isInstalled ) + and not predicate::Factory< T >::member( &T::isUpgradable ) ); + if (m_mask & NotInstalled) + p0 = p0 or not predicate::Factory< T >::member( &T::isInstalled ); + if (m_mask & Upgradable) + p0 = p0 or predicate::Factory< T >::member( &T::isUpgradable ); + + if (m_mask & Install) + p1 = p1 or predicate::Factory< T >::member( &T::markedNewInstall ); + if (m_mask & Remove) + p1 = p1 or predicate::Factory< T >::member( &T::markedRemove ); + if (m_mask & Keep) + p1 = p1 or predicate::Factory< T >::member( &T::markedKeep ); + if (m_mask & Upgrade) + p1 = p1 or predicate::Factory< T >::member( &T::markedUpgrade ); + + m_op = p0 and p1; + } + + std::string summary() const { + std::ostringstream s; + std::vector< std::string > r; + s << "State filter: "; + if (m_mask & Installed && m_mask & NotInstalled && m_mask & Upgradable) + r.push_back( "Any State" ); + else { + if (m_mask & Installed) + r.push_back( i18n( "Installed" ) ); + if (m_mask & NotInstalled) + r.push_back( i18n( "Not Installed" ) ); + if (m_mask & Upgradable) + r.push_back( i18n( "Upgradable" ) ); + } + std::copy( r.begin(), r.end(), + std::ostream_iterator< std::string >( s, " " ) ); + s << "; "; + r.clear(); + if (m_mask & Install && m_mask & Remove + && m_mask & Keep && m_mask & Upgrade) + r.push_back( i18n( "Any Action" ) ); + else { + if (m_mask & Install) + r.push_back( i18n( "Install" ) ); + if (m_mask & Remove) + r.push_back( i18n( "Remove" ) ); + if (m_mask & Keep) + r.push_back( i18n( "Keep" ) ); + if (m_mask & Upgrade) + r.push_back( i18n( "Upgrade" ) ); + } + std::copy( r.begin(), r.end(), + std::ostream_iterator< std::string >( s, " " ) ); + return s.str(); + } + + unsigned mask() const { + return m_mask; + } + + void setMask( unsigned m ) { + m_mask = m; + setupPredicate(); + } + + void parseArguments( const predicate::ArgumentList & ) {} + + bool operator==( const StateFilter &o ) const { + return o.m_op == m_op; + } + + bool operator()( const T &p ) { + return m_op( p ); + } + + virtual void reset() { + m_mask = 0xff; + setupPredicate(); + } + +protected: + unsigned m_mask; + predicate::Predicate< T > m_op; +}; + +class StateFilterWidget : public StateFilterUi +{ + Q_OBJECT +public: + StateFilterWidget( QWidget *parent, const char *name = 0 ); + virtual Predicate predicate(); +public slots: + void predicateChanged(); +}; + +} + +#endif diff --git a/adept/adept/statefilterui.ui b/adept/adept/statefilterui.ui new file mode 100644 index 0000000..1ef19e0 --- /dev/null +++ b/adept/adept/statefilterui.ui @@ -0,0 +1,166 @@ + +adept::StateFilterUi + + + StateFilterUi + + + + 0 + 0 + 574 + 55 + + + + StateFilterUi + + + + unnamed + + + 2 + + + 1 + + + + m_title + + + Show: + + + AlignVCenter + + + + + layout4 + + + + unnamed + + + + m_notInstalled + + + not installed, + + + + + m_installed + + + installed, + + + + + m_upgradable + + + upgradable packages, + + + + + spacer2 + + + Horizontal + + + Expanding + + + + 195 + 16 + + + + + + + + layout5 + + + + unnamed + + + + m_keep + + + no changes, + + + + + m_install + + + install, + + + + + m_remove + + + removal, + + + + + m_upgrade + + + upgrade requested. + + + + + spacer2_2 + + + Horizontal + + + Expanding + + + + 195 + 16 + + + + + + + + textLabel3 + + + with: + + + AlignVCenter|AlignRight + + + + + + adept/filterlist.h + + + diff --git a/adept/adept/tagchooser.cpp b/adept/adept/tagchooser.cpp new file mode 100644 index 0000000..d596133 --- /dev/null +++ b/adept/adept/tagchooser.cpp @@ -0,0 +1,147 @@ +#include +#include + +#include +#include +#include +#include +#include +#include + +using namespace adept; + +FacetItem::FacetItem( TagChooser *t ) + : KListViewItem( t ) +{ +} + +void FacetItem::removeTag( TagItem::Tag t ) { + // kdDebug() << "removing tag " << t.fullname() << endl; + for ( QListViewItem *n, *i = firstChild(); i != 0; i = n ) { + n = i->nextSibling(); + if ( dynamic_cast< TagItem * >( i )->tag() == t ) + delete i; + } +} + +TagItem::TagItem( FacetItem *p ) + : KListViewItem( p ), m_toplevel( false ) +{ +} + +TagItem::TagItem( TagChooser *l ) + : KListViewItem( l ), m_toplevel( true ) +{ +} + +QString TagItem::text( int c ) const +{ + if (c != 0) return u8( "" ); + return QString( "[" ) + m_tag.name() + "] " + m_tag.shortDescription(""); +} + +TagChooser::TagChooser( QWidget *p, const char *n ) + : KListView( p, n ) +{ + observeComponent< cache::component::PackageTags >(); + // addColumn( " ", 20 ); + setRootIsDecorated( true ); + addColumn( i18n( "Available Tags" ) ); + setResizeMode( LastColumn ); + setDragEnabled( true ); + setAcceptDrops( true ); + viewport()->setAcceptDrops( false ); + // kdDebug() << "TagChooser: tags set" << endl; +} + +void TagChooser::openToplevel() { + QListViewItem *i; + for ( i = firstChild(); i != 0; i = i->nextSibling() ) { + i->setOpen( true ); + } +} + +QDragObject *TagChooser::dragObject() +{ + TagItem *sel = dynamic_cast< TagItem * >( selectedItem() ); + if (sel) + return new QTextDrag( sel->tag().fullname(), this ); + return 0; +} + +void TagChooser::dragEnterEvent( QDragEnterEvent *e ) +{ + // hmmmmm :-) + kdDebug() << "TagChooser::dragEnterEvent" << endl; + e->accept( dynamic_cast< TagList * >( e->source() ) + && QTextDrag::canDecode( e ) ); + kdDebug() << dynamic_cast< TagList * >( e->source() ) + << "; can decode " << QTextDrag::canDecode( e ) << endl; +} + +void TagChooser::dropEvent( QDropEvent* e ) +{ + using namespace wibble::operators; + TagList *tl = dynamic_cast< TagList * >( e->source() ); + QString tag; + QTextDrag::decode( e, tag ); + tl->setTags( tl->tags() - cache::Global::get().tags().tagByName( + static_cast< const char * >( tag.local8Bit() ) ) ); +} + +QString FacetItem::text( int column ) const +{ + if ( column == 0 ) + return QString( "[" ) + m_facet.name() + "] " + m_facet.shortDescription( "" ); + return u8( "" ); +} + +static bool drop( TagChooser::Tag t ) { + if ( t.facet().name() == "special" ) + return true; + if ( t.name() == "TODO" ) + return true; + return false; +} + +void TagChooser::setTags( Tag::Set s ) +{ + using namespace wibble::operators; + std::set remove = m_tags - s; + std::set add = s - m_tags; + m_tags = s; + Tag::Set::iterator i; + + for ( i = add.begin(); i != add.end(); ++i ) { + + if ( drop( *i ) ) + continue; + + FacetItem *fi = m_facets[ i->facet() ]; + if ( fi == 0 ) { + fi = m_facets[ i->facet() ] = new FacetItem( this ); + fi->setFacet( i->facet() ); + } + + TagItem *ti = new TagItem( fi ); + ti->setTag( *i ); + } + + for ( i = remove.begin(); i != remove.end(); ++i ) { + + if ( drop( *i ) ) + continue; + + FacetItem *fi = m_facets[ i->facet() ]; + fi->removeTag( *i ); + if ( fi->childCount() == 0 ) { + m_facets[ i->facet() ] = 0; + delete fi; + } + } + +} + +void TagChooser::notifyPreRebuild( cache::component::Base *b ) { + setTags( Tag::Set() ); +} diff --git a/adept/adept/tagchooser.h b/adept/adept/tagchooser.h new file mode 100644 index 0000000..f6c6e2e --- /dev/null +++ b/adept/adept/tagchooser.h @@ -0,0 +1,83 @@ +/* -*- C++ -*- file adept/tagchooser.h + written by Peter Rockai */ + +#include +#include + +#include +#include + +#include + +#include + +#ifndef EPT_TAGCHOOSER_H +#define EPT_TAGCHOOSER_H + +namespace adept { + +using namespace aptFront; + +class FacetItem; +class FacetExtender; +class TagChooser; + +class TagItem : public KListViewItem { +public: + typedef ept::debtags::Tag Tag; + virtual QString text( int ) const; + TagItem( TagChooser *t ); + TagItem( FacetItem *t ); + void setTag( Tag t ) { m_tag = t; } + Tag tag() { return m_tag; } +protected: + bool m_toplevel; + Tag m_tag; +}; + +class FacetItem : public KListViewItem +{ +public: + typedef ept::debtags::Facet Facet; + virtual QString text( int ) const; + FacetItem( TagChooser *t ); + void setFacet( Facet f ) { m_facet = f; } + void removeTag( TagItem::Tag ); +protected: + Facet m_facet; +}; + +class TagChooser : public KListView, public cache::Observer // ExtendableList +{ + Q_OBJECT +public: + typedef ept::debtags::Tag Tag; + typedef ept::debtags::Facet Facet; + TagChooser( QWidget *p = 0, const char *n = 0 ); + virtual void notifyPreRebuild( cache::component::Base * ); +public slots: + virtual void setTags( TagChooser::Tag::Set ); + void setTitle( QString s ) { + setColumnText( 0, s ); + } + void openToplevel(); + +protected: + virtual void dragEnterEvent( QDragEnterEvent *e ); + virtual void dropEvent( QDropEvent* e ); + virtual void contentsDragEnterEvent( QDragEnterEvent *e ) { + kdDebug() << "TagChooser::contentsDragEnterEvent" << endl; + dragEnterEvent( e ); + } + virtual void contentsDropEvent( QDropEvent *e ) { + kdDebug() << "TagChooser::contentsDropEvent" << endl; + dropEvent( e ); + } + virtual QDragObject *dragObject(); + Tag::Set m_tags; + std::map< Facet, FacetItem * > m_facets; +}; + +} + +#endif diff --git a/adept/adept/tagfilter.cpp b/adept/adept/tagfilter.cpp new file mode 100644 index 0000000..fb17f8c --- /dev/null +++ b/adept/adept/tagfilter.cpp @@ -0,0 +1,67 @@ +/* -*- C++ -*- libapt/tagfilter.h + written by Peter Rockai */ + +#include +#include +#include + +#include +#include + +using namespace adept; + +TagFilterWidget::TagFilterWidget( QWidget *w, const char *n ) + : TagFilterUi( w, n ) +{ + m_wanted->setName( i18n( "Tags I Want (drop tags here)" ) ); + m_unwanted->setName( i18n( "Tags I Do Not Want (drop tags here)" ) ); + + connect( m_wanted, SIGNAL( tagsChanged( TagList::Tag::Set ) ), + this, SLOT( wantedChanged() ) ); + connect( m_unwanted, SIGNAL( tagsChanged( TagList::Tag::Set ) ), + this, SLOT( unwantedChanged() ) ); +} + +TagFilterWidget::Predicate TagFilterWidget::predicate() +{ + TagFilter< entity::Package > f; + f.setWanted( m_wanted->tags() ); + f.setUnwanted( m_unwanted->tags() ); + return predicate::adapt< entity::Entity >( f ); +} + +static void setTagsBlocking( TagList *l, TagList::Tag::Set s ) { + l->blockSignals( true ); + l->setTags( s ); + l->blockSignals( false ); +} + +void TagFilterWidget::predicateChanged() +{ + typedef TagFilter< entity::Package > F; + F f = downcast< F >( m_pred ); + setTagsBlocking( m_wanted, f.wanted() ); + setTagsBlocking( m_unwanted, f.unwanted() ); + if ( item() && item()->list() ) { + setupColors(); + item()->list()->delayedUpdateExtenders(); + } +} + +void TagFilterWidget::wantedChanged() +{ + using namespace wibble::operators; + setTagsBlocking( m_unwanted, m_unwanted->tags() - m_wanted->tags() ); + setupColors(); + widgetsChanged(); + item()->list()->delayedUpdateExtenders(); +} + +void TagFilterWidget::unwantedChanged() +{ + using namespace wibble::operators; + setTagsBlocking( m_wanted, m_wanted->tags() - m_unwanted->tags() ); + setupColors(); + widgetsChanged(); + item()->list()->delayedUpdateExtenders(); +} diff --git a/adept/adept/tagfilter.h b/adept/adept/tagfilter.h new file mode 100644 index 0000000..5ff8e47 --- /dev/null +++ b/adept/adept/tagfilter.h @@ -0,0 +1,110 @@ +/* -*- C++ -*- adept/tagfilter.h + written by Peter Rockai */ + +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#ifndef EPT_TAGFILTER_H +#define EPT_TAGFILTER_H + +namespace adept { + +template< typename T > +struct TagFilter : predicate::Implementation< T, TagFilter< T > >, + InterfacingPredicate, cache::Observer +{ + typedef ept::debtags::Tag Tag; + + TagFilter() { + setupPredicate(); + observeComponent< cache::component::PackageTags >(); + } + + void setupPredicate() { + Cache &cache = cache::Global::get(); // FIXME? + m_op = predicate::Factory< T >::tagSet( m_wanted ); + for (Tag::Set::iterator i = m_unwanted.begin(); i != m_unwanted.end(); ++i ) { + m_op = m_op and not predicate::Factory< T >::tag( *i ); + } + } + + std::string summary() const { + return u8( i18n( "Tag Filter" ) ); + } + + void parseArguments( const predicate::ArgumentList & ) {} + + bool operator==( const TagFilter &o ) const { + return o.m_wanted == m_wanted && o.m_unwanted == m_unwanted; + } + + bool operator()( const T &p ) { + return m_op( p ); + } + + void setWanted( Tag::Set t ) { + m_wanted = t; + setupPredicate(); + } + + void setUnwanted( Tag::Set t ) { + m_unwanted = t; + setupPredicate(); + } + + Tag::Set wanted() const { return m_wanted; } + Tag::Set unwanted() const { return m_unwanted; } + + void notifyPreRebuild( cache::component::Base * ) { + kdDebug() << "TagFilter pre-rebuild" << endl; + m_unwanted.clear(); m_wanted.clear(); + } + + void notifyPostRebuild( cache::component::Base * ) { + Cache &c = cache::Global::get( m_cache ); + setupPredicate(); + } + + virtual void reset() { + m_wanted.clear(); + m_unwanted.clear(); + setupPredicate(); + } + +protected: + predicate::Predicate< T > m_op; + Tag::Set m_wanted; + Tag::Set m_unwanted; +}; + +class TagFilterWidget : public TagFilterUi +{ + Q_OBJECT +public: + TagFilterWidget( QWidget *p, const char *n ); + virtual Predicate predicate(); +public slots: + void predicateChanged(); + void wantedChanged(); + void unwantedChanged(); +protected: + TagList *m_addingTo; + std::vector< ept::debtags::Tag > m_tagMenuMap; +}; + +} + +#endif diff --git a/adept/adept/tagfilterui.ui b/adept/adept/tagfilterui.ui new file mode 100644 index 0000000..1f78b8a --- /dev/null +++ b/adept/adept/tagfilterui.ui @@ -0,0 +1,95 @@ + +adept::TagFilterUi + + + TagFilterUi + + + true + + + + 0 + 0 + 627 + 130 + + + + Form1 + + + + unnamed + + + 2 + + + 2 + + + + m_wanted + + + + 7 + 5 + 0 + 0 + + + + + 0 + 90 + + + + + + m_unwanted + + + + 7 + 5 + 0 + 0 + + + + + + + + adept::TagList +
    adept/taglist.h
    + + -1 + -1 + + 0 + + 5 + 5 + 0 + 0 + + image0 +
    +
    + + + 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b249444154388db5944d4c5c5518869f73ce9db9cc40f929cc30300e18129a50685268a28291982e1a2175212eaab1c49d3f8971e7aec6aedb54a32b435dd8685cb8c0c4b8b0feb421b7bd8186a069d23209144b18cb0c02f3732ff3c3ccbdd705a571941213f1dd9d93739ef37e6fbeef08d334d9d5d0d090c701c8344d2176c1a6697a5d5d5dd8b64d2a95c2b2ac7f05b12c8b783c8e6118d8b6fd685fdb753a39394928e2a7c55724d693a7e214104220242805520a84d8b9e4790f0b1302c7751958f1e30534be9fa41a0c60db362dbe227f64af91b6e7719c2dfc0117a71c603da591de2882a7d3d4ec27122b10acad50aeb88044d542b84de3af7ab44aa55274f4e449dbf354bc347aa096fbf37e7efa2ecbad1b36907d78b289de8120232f37726250c3f52cf0a026a0f6065b9645d929e038167aa096d91b307171059034b5f8e9e9eb44fa052b4b25eeccd9dc99cb71f6ad082fbea2e351c075bdbdc13b9109fc01b83fef63e2e232e03076b68393231a0dcd024daf502c1e66e67a89cb971ef0e5a74bb4b61e6378248094b92ab0ac024b70ca017ef8360394187b2dc6d8b89ffa500e4d4f93d9083275d5e6f9913ade3dd70ee87c7d25c95646a25415aadab152b09ed4f8c5cc130a853839eac3951b684a61e70ef3f9c739668c24eba912afbfddc6d4d506e6a6d7b8b7d082aa8eb8dab19482cdcd220e36dd3dc19df23545de0a71f952861923493456cfd3cf36123c54a0b7bf0e8064621b21f7712c040857071ca4eea0f40a99f510573ec971cb48030e811a1faded3e94be85f2fb00703d1ff26f96ab9f011a5b04d0c4f26fdb948a754c1b25668c2491483d5d5d611617d6b8f0fe32cb779b492ce65168b4c774a4701eefd8f3a02d56e6e8f13aeefe9a63fa5a89d1970e91d908f3d46003e1480d173e28b37827c9b977348ab92ce16890237d1ec907ee3e8e3d8f60d0e1f4583d009f7d9860662acff89bad1c1faad0717493f7ce7713ed8cb0995c255f2a317a26427b67198f6a70f51c0a41b902279ed1187f23cc17130b7c74de65eac77a7a8f05517e41e2deefa4930576db60fa7a8ee1535134df3e93e7b82e0817476439fd6a9070a49f6fbe4a3077739db99b15c001146dd13a46cf1cc1f83943c62e51de76b0738fc9381e8f3390f0236b252e124999e11724fd833196164bacadb87848224fe874f779b43fe9f2dca928956d505a96dbb3f9bdc18661e00534c26d1a7a40e13912a11c9454280da41048a9915c75585df500074d53d816dc9edd229528ef0db66dbbea3ffdaffa471f1f28d8344df1bf800f1a6e9aa6f813c39885bc050f269c0000000049454e44ae426082 + + + + adept/filterlist.h + + + + adept/taglist.h + +
    diff --git a/adept/adept/taglist.cpp b/adept/adept/taglist.cpp new file mode 100644 index 0000000..c27d74f --- /dev/null +++ b/adept/adept/taglist.cpp @@ -0,0 +1,138 @@ +/* -*- C++ -*- adept/taglist.cpp + written by Peter Rockai */ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +using namespace adept; + +TagLabel::TagLabel( Tag t, TagList *l, QWidget *p, const char *n ) + : QHBox( p, n ), m_tag( t ), m_list( l ) +{ + if ( t == Tag() ) { + m_description = new QLabel( QString( " " ) + i18n( "[none]" ), this ); + } else { + m_remove = new QLabel( this ); + m_remove->setPixmap( SmallIcon( u8( "cancel" ) ) ); + m_remove->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ); + m_description = new QLabel( QString( " [" ) + t.fullname( "n/a" ) + "] " + + t.shortDescription( "n/a" ), this ); + } +} + +void TagLabel::mouseReleaseEvent( QMouseEvent *e ) { + using namespace wibble::operators; + if ( e->button() == Qt::LeftButton && + dynamic_cast< QLabel * >( childAt( e->pos() ) ) == m_remove ) + m_list->setTags( m_list->tags() - m_tag ); +} + +TagList::TagList( QWidget *p, const char *n ) + : QVBox( p, n ) +{ + m_name = new QLabel( this ); + m_tagBox = new QVBox( this ); + m_tagBox->setFrameShape( QFrame::Panel ); + m_tagBox->setFrameShadow( QFrame::Sunken ); + m_updateScheduled = false; + setAcceptDrops( true ); + scheduleUpdateList(); + m_tagSpacer = new QSpacerItem( 0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding ); +} + +void TagList::setTags( Tag::Set t ) +{ + m_tags = t; + scheduleUpdateList(); + emit tagsChanged( m_tags ); +} + +void TagList::addTag( Tag t ) +{ + using namespace wibble::operators; + if ( t == Tag() ) + return; + m_tags |= t; + scheduleUpdateList(); + emit tagsChanged( m_tags ); +} + +void TagList::setName( QString n ) +{ + m_name->setText( n ); +} + +void TagList::scheduleUpdateList() +{ + if (! m_updateScheduled) { + kdDebug() << "TagList: scheduling update" << endl; + QTimer::singleShot( 0, this, SLOT( updateList() ) ); + m_updateScheduled = true; + } +} + +void TagList::updateList() +{ + kdDebug() << "TagList (" + m_name->text() + "): updating list" << endl; + clearList(); + if ( m_tags.empty() ) { + appendLabel( new TagLabel( Tag(), this, m_tagBox ) ); + } else { + for ( Tag::Set::iterator i = m_tags.begin(); i != m_tags.end(); ++i ) { + appendLabel( new TagLabel( *i, this, m_tagBox ) ); + } + } + m_tagBox->layout()->addItem( m_tagSpacer ); + update(); + parentWidget()->adjustSize(); + m_updateScheduled = false; +} + +void TagList::appendLabel( TagLabel *l ) +{ + m_list.push_back( l ); + l->show(); +} + +void TagList::mouseMoveEvent( QMouseEvent *e ) { + TagLabel *child = dynamic_cast< TagLabel * >( childAt( e->pos() )->parentWidget() ); + if ( !child ) + return; + QDragObject *d = new QTextDrag( child->tag().fullname( "" ), this ); + d->dragCopy(); +} + +void TagList::dragEnterEvent( QDragEnterEvent *e ) { + kdDebug() << "TagList::dragEnterEvent" << endl; + e->accept( QTextDrag::canDecode( e ) ); +} + +void TagList::dropEvent( QDropEvent* e ) { + QString tag; + kdDebug() << "TagList: drop event" << endl; + QTextDrag::decode( e, tag ); + try { + addTag( aptFront::cache::Global::get().tags().tagByName( + static_cast< const char * >( tag.local8Bit() ) ) ); + } catch (...) {} // not a tag, ignore + scheduleUpdateList(); +} + +void TagList::clearList() +{ + for (List::iterator i = m_list.begin(); i != m_list.end(); ++i ) { + delete *i; + } + m_list.clear(); + m_tagBox->layout()->removeItem( m_tagSpacer ); +} diff --git a/adept/adept/taglist.h b/adept/adept/taglist.h new file mode 100644 index 0000000..3f652a9 --- /dev/null +++ b/adept/adept/taglist.h @@ -0,0 +1,72 @@ +/** -*- C++ -*- + @file adept/taglist.h + @author Peter Rockai +*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef EPT_TAGLIST_H +#define EPT_TAGLIST_H + +class QLabel; + +namespace adept { + +class TagList; + +class TagLabel : public QHBox +{ + Q_OBJECT +public: + typedef ept::debtags::Tag Tag; + TagLabel( Tag t, TagList *l, QWidget *p = 0, const char *n = 0 ); + Tag tag() { return m_tag; } +protected: + void mouseReleaseEvent( QMouseEvent *e ); + Tag m_tag; + QLabel *m_remove; + QLabel *m_description; + TagList *m_list; +}; + +class TagList : public QVBox +{ + Q_OBJECT +public: + typedef ept::debtags::Tag Tag; + TagList( QWidget *p = 0, const char *n = 0 ); + void setTags( Tag::Set t ); + void addTag( Tag t ); + Tag::Set tags() { return m_tags; } + void setName( QString n ); +public slots: + void scheduleUpdateList(); + void updateList(); +signals: + void tagsChanged( TagList::Tag::Set ); +protected: + void mouseMoveEvent( QMouseEvent *e ); + void dropEvent( QDropEvent * ); + void dragEnterEvent( QDragEnterEvent * ); + void appendLabel( TagLabel * ); + void clearList(); + + bool m_updateScheduled; + Tag::Set m_tags; + QLabel *m_name; + QVBox *m_tagBox; + QSpacerItem *m_tagSpacer; + typedef std::vector< TagLabel * > List; + List m_list; +}; + +} + +#endif diff --git a/adept/adept/threadutils.cpp b/adept/adept/threadutils.cpp new file mode 100644 index 0000000..722f75d --- /dev/null +++ b/adept/adept/threadutils.cpp @@ -0,0 +1,44 @@ +/** -*- C++ -*- + @file adept/utils.cpp + @author Peter Rockai +*/ + +#include +#include + +namespace adept { + +QMutex Threads::serialize; +Threads::Queue Threads::threads; + +void Threads::wait() { + static std::map< QMutex *, int > locked; + while ( !threads.empty() ) { + QThread *current = threads.front().first; + if ( current->finished() ) { + delete current; + threads.pop_front(); + continue; + } + for ( Queue::iterator thr = threads.begin(); thr != threads.end(); ++thr ) { + ++locked[ thr->second ]; + thr->second->lock(); + } + kapp->processEvents(); + for ( Queue::iterator thr = threads.begin(); thr != threads.end(); ++thr ) { + while ( locked[ thr->second ] > 0 ) { + thr->second->unlock(); + --locked[ thr->second ]; + } + } + usleep( 50000 ); + } +} + +void Threads::enqueue( QThread *t, QMutex *m ) +{ + threads.push_back( std::make_pair( t, m ) ); + t->start(); +} + +} diff --git a/adept/adept/utils.h b/adept/adept/utils.h new file mode 100644 index 0000000..6c3a3d3 --- /dev/null +++ b/adept/adept/utils.h @@ -0,0 +1,71 @@ +/** -*- C++ -*- + @file adept/utils.h + @author Peter Rockai +*/ + +#include +#include +#include +#include +#include +#include + +#ifndef EPT_UTILS_H +#define EPT_UTILS_H + +namespace adept { + +inline QString u8( std::string s ) { + return QString::fromUtf8( s.c_str() ); +} + +inline std::string u8( QString s ) { + return std::string( s.utf8() ); +} + +inline QString u8( const char *s ) { + return QString::fromUtf8( s ); +} + +struct Threads { + static QMutex serialize; + typedef std::deque< std::pair< QThread *, QMutex * > > Queue; + static Queue threads; + static void enqueue( QThread *t, QMutex *m ); + static void wait(); +}; + +template< typename F, typename P > +struct AsyncCall : public QThread +{ + AsyncCall( F f, P p ) : func( f ), param( p ) {} + virtual void run() + { + // kdDebug() << "Thread waiting for mutex..." << endl; + Threads::serialize.lock(); + // kdDebug() << "starting thread (mutex acquired)" << endl; + func( param ); + // kdDebug() << "finishing thread (releasing mutex)" << endl; + Threads::serialize.unlock(); + } + virtual ~AsyncCall() {} +protected: + F func; + P param; +}; + + +template< typename F, typename P > AsyncCall< F, P > *asyncCall( F f, P p ) { + return new AsyncCall< F, P >( f, p ); +} + +inline static void adjustFontSize( QWidget *w, int off ) { + QFont f = w->font(); + f.setPointSize( f.pointSize() + off ); // a bit smaller font... + w->setFont( f ); + w->updateGeometry(); +} + +} + +#endif diff --git a/adept/adept/view.cpp b/adept/adept/view.cpp new file mode 100644 index 0000000..207277c --- /dev/null +++ b/adept/adept/view.cpp @@ -0,0 +1,153 @@ +#include +#include + +#include +#include +#include + +#include +#include +#include + +using namespace adept; + +View::View( QWidget *p, const char *n ) + : QSplitter( p, n ) +{ + setOrientation( Qt::Vertical ); + m_flist = new FilterList( this ); + m_bottom = new QSplitter( this ); + m_bottom->setOrientation( Qt::Horizontal ); + m_lister = new Lister( m_bottom ); + m_flist->plugLister( m_lister ); + m_sidebar = new FilterSidebar( m_bottom ); + + connect( m_lister, SIGNAL( cardinalityChanged( const Lister::Cardinality & ) ), + m_sidebar, SLOT( setCardinality( const Lister::Cardinality & ) ) ); + + m_flist->setHiddenPredicate( + predicate::adapt< entity::Entity >( + predicate::Package::member( &entity::Package::hasVersion ) ) ); + m_flist->appendPredicate( + predicate::adapt< entity::Entity >( + StateFilter< entity::Package >() ) ); + m_flist->appendPredicate( + predicate::adapt< entity::Entity >( + TagFilter< entity::Package >() ) ); + m_flist->appendPredicate( + predicate::adapt< entity::Entity >( + QuickFilter< entity::Package >() ) ); + + m_lister->setRangeProvider( this ); + + QTimer::singleShot( 0, this, SLOT( delayed() ) ); +} + +Lister::Range View::listerRange() { + component::Packages &cp = cache::Global::get().packages(); + return cp.sorted(); + // return range( cp.packagesBegin(), cp.packagesEnd() ); +} + +void View::hideTags() { + QValueList< int > szl; + szl.append( 0 ); szl.append( 1 ); + setSizes( szl ); +} + +void View::hideFilters() { + QValueList< int > szl; + szl.append( 1 ); szl.append( 0 ); + m_bottom->setSizes( szl ); +} + +predicate::Predicate< entity::Entity > View::previewPredicate() +{ + return predicate::adapt< entity::Entity >( + (not predicate::Package::member( &entity::Package::markedKeep )) + or predicate::Package::member( &entity::Package::isBroken ) + or predicate::Package::member( &entity::Package::willBreak ) ); +} + +void View::setUpgradeMode() +{ + setPreviewMode(); + filterList()->setHiddenPredicate( + previewPredicate() or predicate::adapt< entity::Entity >( + predicate::Package::member( &entity::Package::isUpgradable ) ) ); +} + +void View::setPreviewMode() +{ + filterList()->setHiddenPredicate( previewPredicate() ); + hideFilters(); + hideTags(); +} + +void View::delayed() +{ + // cleanRebuild(); +} + +Browser::Browser( QWidget *p, const char *n ) + : QWidgetStack( p, n ), m_currentValid( false ) +{ + m_current = entity::Entity(); + addWidget( m_view = new View( this ) ); + addWidget( m_details = new PackageDetails( this ) ); + connect( m_view->lister(), SIGNAL( detailsRequested( Lister::Entity ) ), + this, SLOT( show( Lister::Entity ) ) ); + connect( m_details, SIGNAL( showList() ), + this, SLOT( showList() ) ); + connect( m_details, SIGNAL( back() ), + this, SLOT( back() ) ); + connect( m_details, SIGNAL( forward() ), + this, SLOT( forward() ) ); + connect( m_details, SIGNAL( detailsRequested( Lister::Entity ) ), + this, SLOT( show( Lister::Entity ) ) ); +} + +void Browser::showList() +{ + raiseWidget( m_view ); +} + +void Browser::back() +{ + m_forward.push_back( m_current ); + m_current = m_back.back(); + m_back.pop_back(); + doShow( m_current ); +} + +void Browser::forward() +{ + m_back.push_back( m_current ); + m_current = m_forward.back(); + m_forward.pop_back(); + doShow( m_current ); +} + +void Browser::doShow( Lister::Entity e ) +{ + m_details->setHasForward( !m_forward.empty() ); + m_details->setHasBack( !m_back.empty() ); + raiseWidget( m_details ); + m_details->setPackage( downcast< entity::Package >( e ) ); +} + +void Browser::show( Lister::Entity e ) +{ + m_forward.clear(); + if ( m_currentValid ) + m_back.push_back( m_current ); + m_currentValid = true; + m_current = e.stable(); + doShow( e ); +} + +/* Kolik existencialistu je potreba k zasroubovani zarovky? + Dva. Jeden sroubuje zarovku, a druhy premysli jak zarovka + sama o sobe predstavuje jednotlivy zarivy bod v subjektivni + realite v podsveti nekonecne absurdity dosahujici neuprimny + vesmir nicoty. */ diff --git a/adept/adept/view.h b/adept/adept/view.h new file mode 100644 index 0000000..ea6c6f5 --- /dev/null +++ b/adept/adept/view.h @@ -0,0 +1,66 @@ +// -*- C++ -*- + +#include + +#include +#include + +#include +#include + +#ifndef EPT_VIEW_H +#define EPT_VIEW_H + +class QSplitter; + +namespace adept { + +class FilterSidebar; +class PackageDetails; + +class View: public QSplitter, public Lister::RangeProvider { + Q_OBJECT +public: + View( QWidget *p = 0, const char *n = 0 ); + FilterList *filterList() { return m_flist; } + Lister *lister() { return m_lister; } + virtual Lister::Range listerRange(); +public slots: + void cleanRebuild() { m_lister->cleanRebuild(); } + void hideFilters(); + void hideTags(); + void setPreviewMode(); + void setUpgradeMode(); +protected slots: + void delayed(); +protected: + predicate::Predicate< entity::Entity > previewPredicate(); + QSplitter *m_bottom; + FilterList *m_flist; + Lister *m_lister; + FilterSidebar *m_sidebar; +}; + +class Browser : public QWidgetStack { + Q_OBJECT +public: + Browser( QWidget *p = 0, const char *n = 0 ); + View *searchView() const { return m_view; } +public slots: + void forward(); + void back(); + void show( Lister::Entity e ); + void showList(); + void doShow( Lister::Entity e ); +protected: + typedef std::deque< Lister::Entity > Deque; + Deque m_forward, m_back; + entity::Entity m_current; + View *m_view; + PackageDetails *m_details; + bool m_currentValid; +}; + +} + +#endif diff --git a/adept/batch/Makefile.am b/adept/batch/Makefile.am new file mode 100644 index 0000000..a14de1f --- /dev/null +++ b/adept/batch/Makefile.am @@ -0,0 +1,20 @@ +bin_PROGRAMS = adept_batch +noinst_HEADERS = app.h +adept_batch_SOURCES = main.cpp app.cpp +adept_batch_LDADD = ../adept/libadept.la $(LIBAPT_FRONT_LIBS) $(LIBEPT_LIBS) $(LIBTAGCOLL2_LIBS) $(LIBWIBBLE_LIBS) $(LIB_KIO) $(LIBKDE_UI) ../kubuntu_upgrader/libkubuntuupgradewizard.la +adept_batch_LDFLAGS = -L/usr/lib/debug +INCLUDES = $(all_includes) $(LIBAPT_FRONT_CFLAGS) $(LIBEPT_CFLAGS) $(LIBTAGCOLL2_CFLAGS) $(LIBWIBBLE_CFLAGS) -I$(srcdir)/.. -I.. +KDE_CXXFLAGS = $(USE_EXCEPTIONS) -DQT_NO_ASCII_CAST -DQT_NO_CAST_ASCII +METASOURCES = AUTO +KDE_ICON = AUTO + +rcdir = $(kde_datadir)/adept_batch +rc_DATA = adept_batchui.rc + +#shelldesktopdir = $(kde_appsdir)/System +#xdg_apps_DATA = adept_batch.desktop + +messages: rc.cpp + $(EXTRACTRC) `find . -name \*.ui -o -name \*.rc` > rc.cpp + $(EXTRACTRC) `find . -name "*.rc"` >> rc.cpp + $(XGETTEXT) *.cpp -o $(podir)/adept_batch.pot diff --git a/adept/batch/adept_batchui.rc b/adept/batch/adept_batchui.rc new file mode 100644 index 0000000..083b9e8 --- /dev/null +++ b/adept/batch/adept_batchui.rc @@ -0,0 +1,16 @@ + + + + + &Adept + + + + &Edit + + + + + + + diff --git a/adept/batch/adept_updater.desktop b/adept/batch/adept_updater.desktop new file mode 100644 index 0000000..dedcbab --- /dev/null +++ b/adept/batch/adept_updater.desktop @@ -0,0 +1,70 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=Adept Updater +Name[bg]=Обновяване на Adept +Name[ca]=Actualitzador Adept +Name[da]=Adept-opdatering +Name[el]=Ανανεωτής Adept +Name[es]=Actualizador experto +Name[et]=Adepti uuendaja +Name[fr]=Mise à jour Adept +Name[ga]=Nuashonróir Adept +Name[gl]=Actualizador de Adept +Name[it]=Aggiornamento Adept +Name[ka]=Adept განმაახლებელი +Name[lt]=Adept atnaujinimai +Name[pt]=Actualizador do Adept +Name[sk]=Adept aktualizácia +Name[sv]=Adept-uppdaterare +Name[xx]=xxAdept Updaterxx +GenericName=System Update Wizard +GenericName[bg]=Обновяване на Adept +GenericName[ca]=Assistent d'actualització del sistema +GenericName[cs]=Průvodce aktualizací systému +GenericName[da]=Systemopdateringsguide +GenericName[de]=Systemaktualisierungsassistent +GenericName[el]=Μάγος ενημέρωσης συστήματος +GenericName[es]=Asistente de actualización del sistema +GenericName[et]=Süsteemi uuendamine nõustaja +GenericName[fr]=Assistant de mise à jour du système +GenericName[gl]=Asistente de Actualizazón do Sistema +GenericName[it]=Procedura guidata aggiornamento sistema +GenericName[ja]=システムアップデートウィザード +GenericName[ka]=სისტემის განახლების ოსტატი +GenericName[lt]=Sistemos atnaujinimo vediklis +GenericName[nl]=Systeem-update-assistent +GenericName[pt]=Assistente de Actualização do Sistema +GenericName[sk]=Sprievodca systémovou aktualizáciou +GenericName[sv]=Systemuppdateringsguide +GenericName[xx]=xxSystem Update Wizardxx +Exec=adept_updater %i %m -caption "%c" +TryExec=adept_updater +Categories=Qt;KDE;System; +Icon=adept_updater +Type=Application +X-KDE-SubstituteUID=true +Comment=Update installed software +Comment[bg]=Обновяване на инсталиран софтуер +Comment[ca]=Actualitza el programari instal·lat +Comment[cs]=Aktualizace nainstalovaného softwaru +Comment[da]=Opdatér installeret programmel +Comment[de]=Aktualisiert installierte Software +Comment[el]=Ενημέρωση εγκατεστημένου λογισμικού +Comment[es]=Actualizar el software instalado +Comment[et]=Paigaldatud tarkvara uuendamine +Comment[fr]=Mise à jour des logiciels installés +Comment[ga]=Nuashonraigh bogearraí suiteáilte +Comment[gl]=Actualiza o software instalado +Comment[it]=Aggiorna il software installato +Comment[ja]=インストール済みのソフトウェアをアップデート +Comment[ka]=დაყენებული პროგრამების განახლება +Comment[lt]=Įdiegtų programų atnaujinimas +Comment[nl]=Geïnstalleerde software bijwerken +Comment[pt]=Actualiza o 'software' instalado +Comment[sk]=Aktualizácia inštalovaného softwaru +Comment[sr]=Ажурира инсталиране програме +Comment[sr@Latn]=Ažurira instalirane programe +Comment[sv]=Uppdatera installerad programvara +Comment[xx]=xxUpdate installed softwarexx +Terminal=false +NoDisplay=true diff --git a/adept/batch/app.cpp b/adept/batch/app.cpp new file mode 100644 index 0000000..dd99ec1 --- /dev/null +++ b/adept/batch/app.cpp @@ -0,0 +1,142 @@ +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +#include "app.h" + +using namespace aptFront; +using namespace aptFront::cache; +using namespace adept; + +App::App( KCmdLineArgs *args ) { + setMainWidget( this ); + initialize(); + QString qs_pkgname; + + updating = false; + enum { None, Remove, Install } m = None; + for(int i = 0; i < args->count(); i++) { + QCString a = args->arg( i ); + + if (m == None || + cache().packages().packageByName( std::string( a ) ).valid()) { + if ( m == Install ) { + kdDebug() << "installing " << a << endl; + cache().packages().packageByName( std::string( a ) ).markInstall(); + } else if ( m == Remove ) { + kdDebug() << "removing " << a << endl; + cache().packages().packageByName( std::string( a ) ).markRemove(); + } + + if ( m == None && a == "install" ) { + m = Install; + } if ( m == None && a == "remove" ) { + m = Remove; + } if ( m == None && a == "update" ) { + updating = true; + } + } else { + qs_pkgname = a; + kdDebug() << "The package '"<(); + + m_all = new QVBox( this ); + m_stack = new QWidgetStack( m_all ); + + m_stack->addWidget( m_progress = new adept::AcqProgressWidget( m_stack ) ); + m_stack->addWidget( m_commitProgress = new CommitProgress( m_stack ) ); + + connect(this, SIGNAL( imDone() ), + this, SLOT( handleDone() )); + + setStandardToolBarMenuEnabled( false ); + createStandardStatusBarAction(); + setupGUI( Keys|StatusBar|Save|Create ); + delete toolBar(); + + Application::setStatusBar( statusBar() ); + + QTimer::singleShot( + 0, this, + SLOT( delayed() ) ); + + m_stack->raiseWidget( m_progress ); + setCentralWidget( m_all ); +} + +void App::delayed() { + statusBar()->clear(); + + kdDebug() << "App::delayed starting commit" << endl; + + aptFront::Manager m; + m.setProgressCallback( m_progress->callback() ); + m.setUpdateInterval( 100000 ); + try { + if (updating) { + m_stack->raiseWidget( m_progress ); + m.update(); + } else { + m_stack->raiseWidget( m_progress ); + m.download(); + m_stack->raiseWidget( m_commitProgress ); + m.commit(); + } + emit imDone(); + } catch ( exception::OperationCancelled ) { + emit imDone(); + } catch ( ... ) { + KMessageBox::sorry( + this, i18n( "There was an error commiting changes. " + "Possibly there was a problem downloading some " + "packages or the commit would break packages. " ), + i18n( "Could not commit changes" ) ); + emit imDone(); + } +} + +void App::handleDone() { + kdDebug() << "I'm done here" << endl; + close(); +} + +#include "app.moc" diff --git a/adept/batch/app.h b/adept/batch/app.h new file mode 100644 index 0000000..604a5a2 --- /dev/null +++ b/adept/batch/app.h @@ -0,0 +1,54 @@ +/* -*- C++ -*- */ +#ifndef APP_H +#define APP_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +class QVBox; +class QWidgetStack; +class QSplitter; +class KAction; +class KPushButton; +namespace adept { +class AcqProgressWidget; +} + +using namespace aptFront; +using namespace adept; + +class App : public KMainWindow, Application { + Q_OBJECT +public: + void setupActions(); + ExtTerminalInterface *terminal(); + App( KCmdLineArgs *a ); +signals: + void imDone(); +protected slots: + void delayed(); + void handleDone(); +protected: + friend class WaitForLister; + + QWidgetStack *m_stack; + QVBox *m_all; + + // stacked widgets + adept::AcqProgressWidget *m_progress; + adept::CommitProgress *m_commitProgress; + + bool updating; +}; + +#endif diff --git a/adept/batch/main.cpp b/adept/batch/main.cpp new file mode 100644 index 0000000..7521f6c --- /dev/null +++ b/adept/batch/main.cpp @@ -0,0 +1,48 @@ +// KDE includes + +#include +#include +#include + +#include "app.h" + +static KCmdLineOptions options[] = +{ + { "+command", I18N_NOOP("Command"), 0 }, + KCmdLineLastOption +}; + +int main(int argc, char *argv[]) +{ + KLocale::setMainCatalogue("adept"); + + QString description = i18n("Adept Batch"); + + KAboutData aboutData( "adept_batch", + I18N_NOOP("Adept Batch"), + "2.1 Cruiser", + description.latin1(), + KAboutData::License_BSD, + I18N_NOOP("(c) 2006 Peter Rockai"), + 0, + "http://web.mornfall.net/adept.html"); + + aboutData.addAuthor ( "Peter Rockai", + I18N_NOOP("developer"), + "me at mornfall dot net", + "http://web.mornfall.net"); + + KCmdLineArgs::init( argc, argv, &aboutData ); + KCmdLineArgs::addCmdLineOptions( options ); + + KApplication app; + KCmdLineArgs* args = KCmdLineArgs::parsedArgs(); + KGlobal::locale()->insertCatalogue(QString::fromUtf8("libept")); + + App *ta = new App( args ); + + app.setMainWidget( ta ); + ta->show(); + + return app.exec(); +} diff --git a/adept/configure.in.in b/adept/configure.in.in new file mode 100644 index 0000000..eac3946 --- /dev/null +++ b/adept/configure.in.in @@ -0,0 +1,5 @@ +AC_ARG_ENABLE(adept, [ --enable-adept compile adept],, [DO_NOT_COMPILE="$DO_NOT_COMPILE adept"]) +LIBTAGCOLL2_DEFS +LIBAPT_FRONT_DEFS +LIBEPT_DEFS +LIBWIBBLE_DEFS diff --git a/adept/deb-build b/adept/deb-build new file mode 100755 index 0000000..dcd2967 --- /dev/null +++ b/adept/deb-build @@ -0,0 +1,21 @@ +#!/bin/sh +version=`head -1 debian/changelog | sed -r 's/.+\(([^)]+)\).+/\1/'` +tgt=_dist/adept-$version +wd="$(pwd)" + +dir=`basename $(pwd)` +cd .. + +rm -rf $tgt +mkdir -p $tgt + +cp -a $dir/debian $tgt/ +cp -a $dir $tgt/adept +cp -a admin $tgt/ +cp configure.in.in Makefile.am.in $tgt/ +(cd $tgt && patch -p1 < $wd/fix-autoconf.patch) +(cd $tgt && libtoolize --force) +cp -f /usr/share/aclocal/libtool.m4 $tgt/admin/libtool.m4.in +export UNSERMAKE=no +(cd $tgt && make -f admin/Makefile.common cvs) +(cd $tgt && debuild $@) diff --git a/adept/icons/Makefile.am b/adept/icons/Makefile.am new file mode 100644 index 0000000..e5515a8 --- /dev/null +++ b/adept/icons/Makefile.am @@ -0,0 +1 @@ +KDE_ICON = AUTO diff --git a/adept/icons/cr128-action-adept_notifier_warning.png b/adept/icons/cr128-action-adept_notifier_warning.png new file mode 100644 index 0000000000000000000000000000000000000000..49b0960e6c2f4e68f8af625e3c2fdfd4368d994b GIT binary patch literal 15265 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 literal 0 HcmV?d00001 diff --git a/adept/icons/cr16-action-adept_commit.png b/adept/icons/cr16-action-adept_commit.png new file mode 100644 index 0000000000000000000000000000000000000000..5b0f6a6174f67879d89b8c970d88734cd6f9f844 GIT binary patch literal 883 zcmV-(1C0EMP)wF51aIxG|t0o~WeTux?(*f!J?S`!vJrWM3^ z)v?u>(g^>@;xO#mkNlu=e*%b!BkO=S9U%&s|{QUTj4;ur+Qxv`b{1=&{q{_{@=tdkKKPJjPv{N-R+ z=H{q0b!wOgrI|?`QkZ(!{_7i9LV-VtRJx`%DQ2F^23wD{DqBhIRk` zF);r5{m+$GoMl&Put7+Jt2=`@4-Z4{!AlI=w!d7({+qd+0V(7F0suh(zW)OTFd63V z^!sFSNlF9<4gMd;*WzU&Dh*+FS2`3*A~OK^{__Bz$W0R(*Uum z?9l=80a*nF0_+3*1ONs71^@>82>=H93IGBCK>)u00}wAF|NZm@`|<(rTQ4UU0WcOM z00aL60Pp?k0KeVV0IsF+;Q#FbO$G-6;062!00#UB00{XE00{OE015OE00M|vNJE=} z^$*A6FQ5Ne@vDAS;$dfD`1Jo3!|5mY7`86`{^s{nmH;M>-&g)K|ATm%5g73x%=8b8 z0Ro7L;}<&v=RdZejL-PCo<9Aa;W^_ShKsN6GwfXY>&vg(Trted45#rWFn|DJV*bm{ z0Ky#q*cZJ%!~O8Y?dJ?fS26$kepw(JsCg%$6bcYP%o1uwz$j&AU}9wa&h(8#?9FW+ ziyzl{>lm2-O#9FFhv6UdZ-)OYzzhWT0wab200G2EX?6w(FaS`kAv2YZ@FM^K002ov JPDHLkV1n^7jC=q9 literal 0 HcmV?d00001 diff --git a/adept/icons/cr16-action-adept_distupgrade.png b/adept/icons/cr16-action-adept_distupgrade.png new file mode 100644 index 0000000000000000000000000000000000000000..3de9a44f18cef63f28cbcca98e0ee019b20323b5 GIT binary patch literal 987 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 a2rvM=hH&3aNF&Dp0000z|W literal 0 HcmV?d00001 diff --git a/adept/icons/cr16-action-adept_notifier_warning.png b/adept/icons/cr16-action-adept_notifier_warning.png new file mode 100644 index 0000000000000000000000000000000000000000..c3b94286399ac13370d7a98318e3a2c4fa4ed5c6 GIT binary patch literal 905 zcmV;419tq0P)i^SlIUsEXj-Gi(b?8gC>t8fZd4F-7t*d?RD@1gp|JI0u))}Ftcc!> z6)GEeq2Q);47K>DFe<2{wTw|zq?>hX8*{1#+og$3n$w(oC+GX#UDW#jfd}4;_x_heIy+i~?L|Bn?d1o`<(sqpbS4T4c<_~LC zu}}2?K2mPVV>nay)#Hgfa_-S+DLy>7`Vgf6ya1H0@B56$KK_asWwmzx9WZPy1dMP% zDTQn{i^8KJM6D4ZGq0p2{$5J{bENzm^AZODXQ<^{zN6!NW|Y-ZdKRu-gO%Z2E)U0% z5Wx@eG^2p@W3FdVJ3Ce@9;epb^Kajl9qLX^Ubi#g0boK(D+((>0v5nU64 z*r1i;z+qvy)R-GQcXY!kx~)6so4?RoPqiTu-NaB>ZHLFJa6 z;NdU=3w{*M`>K>lr&d140l@bq6@B}z4pK2|Ed-j7+4u=^70uB79HG<#JnPm$+q@YO ze>o;EB{Ww&|NJuGxilR*3nRBwgC%1x{_MSlwexuto0`zm(*xhOZP3P_a`P@iZv~Jd z*jX1IYZBJXJ@{{qA=ugqS4vDzPeX5S$9vWF%$oHaeJemYj-{E@*vkVFvb8PC?Y5+ fp`?VA^1uH9?2@BNoyY_Q00000NkvXXu0mjfiqE3w literal 0 HcmV?d00001 diff --git a/adept/icons/cr16-action-adept_preview.png b/adept/icons/cr16-action-adept_preview.png new file mode 100644 index 0000000000000000000000000000000000000000..487a3ecdb6d8a2b8002c49dfef3f156a74053489 GIT binary patch literal 1042 zcmV+t1nv8YP)^wp!#p< z1^@&Qvx<^}YeZ!HJY}l{&Wo?_GB67tV_;Oh#=yq+lHtQ=RtA1KHwI-PHKJr z@@+Y~0RRESWNK*8AaCTsaq!`32G&0}7~~YW8ICaRWcV!dj6sp_H^bA9ml^)c8Z%f~ zJ9scMGK8WV01!Y-2FBKUPkw%3VCO#0plJM?;Q_-lhA$r&818<2$?#L*9fP>+RfhkZ z-xy?6Oj!hYxuehx00r0;4on6O(g zJo^5ML4r++!S9zlgZw*9hQHr_GCaI>j^XXc&lizx2LXTpVt)1NrI?+mrLC2PC&R5* zj~PDvc*5|XgPB3{uQ&tS7Xbzx4Qqz?H*Ya4oj3g}=f_XEN(>B7`GFb*fN2Nh9Do2~ z{_yG3;pdOz`(^M!0_hUZH7Ppe==A}Niyp^x+VSU z)u00|*HT{o~~1uFA*6D**KMA{7P_1OD><0Px}J0L#6) z0HmIm^d$uZ189O-13W(NCgsZDPtfZ5u>t@A^6vlu00M}Ci<_H)pPwJ>AAUaG5II@t z_1apR7Zv2?&atzzF9ZtPWXXzb`_gCf|Nj-M|DR9z{IAp(y{gN=AT17*1PCCw0j$8N z6ciMIM=vOVVH{%y2C*7Jh8rKVx&HsZYV-foao_)CM&j3n85v~(0*INFjg5hsiHYI& z@81kS8yUWT|G~h*!t(Dw5WoyjWM=w$`P=`s5AOc=H#m@{3l3Z*I6JPvdV0_8IP!AAb02V$u%{aS>0ssI2 M07*qoM6N<$f-QLNGXMYp literal 0 HcmV?d00001 diff --git a/adept/icons/cr16-action-adept_purge.png b/adept/icons/cr16-action-adept_purge.png new file mode 100644 index 0000000000000000000000000000000000000000..145aca4fd6cabf5530d870a94852311b34d95678 GIT binary patch literal 536 zcmV+z0_XjSP)xn`FbHB1tPC1uK?zuhRViq_vVrBzdo##w{_i)V?P9DyX zB+)tuBS%m$vO}^?6Pz48OuoFGwEp=j>qiG0&mXR+cW{*)*w(y#O*ZAaN{qU88QPivN>j5Y4Wh$LNpHskbx{{ckHS_C?$%V zz#Y$lN?i^ZV3C;H(g8***BGC_KDV_Vr_rBVE{7C|0T)!{ZPefUX z20U!CVFe~}(=6CVE;vW|`gsf|0VW6=03m#&G|6cJLL#|~4lXdlAr+1y_gb-LL07hc5iNJ+Pb-Q9Yp~}SJ%0Ud^>d1umVzAQf6IWCq`34 zx9*G`%=x*42r~m9f;=Hi!`icb=lZwjuX&Dx7hL8Sc@zZ{8P`V`;@>3!5r2|_p38jv zSy%VKjl>3I@Vr#0fNl9@vnq=j9@YGI_9i!nl1wTKN86-bldNYj?pd7vD}p<%o=-m7 zSpQH}=@EQ2TNJX4ENWULKlJH)+h1B;y<{0>Q#1!Y@9+k1B!}%lP^g^Jd3kw7Pp@i- z9={SMr!1B~Fv4r^?C&t9P>zR}O1tWC=l9){mUpM2FcPu%wjb(0-Tg ze*g2zx2I0`EN)$2S3HrFJX#au{DuBX5o2lDIB82^dKTf7kDeFHkL=c-6`gS0D(oDb^jDs(cN6DLkyb3{Ys+QefkYJ z!IT*-2}L4Zgy_p;M%wVrK?DVWggj-eSn}kqZTofvt%n=!)r+PF4t;ZMdRmNid6qlk z+Sw>F5v{H+Tle9v4U3$tv*zl+@NH!12ZT9>HYW@{YCToE@R9Ok*9%B_VOpN4nUQaW znrD{A*Uhb}+E^K{cyV#V?DFQ9R~ZW$8}g?{t)?@-UX5#CcB1jb{mgBAd}-}>Z|&WA zU&nYCE(En8o;hi+v!^7S#=zx;U*ez+BF{x9$W2N#>LNTVVy(#Rpb ztf>m-R8*bX^7^wg_kZ={wKJFc-e)p)0Q>Gc?-jTx0_2fF;UURk5+PV(Th`GOx@S~p jcR+Yh=AvlZ1SJ0e=C_W_0VFG`00000NkvXXu0mjf(TLr+ literal 0 HcmV?d00001 diff --git a/adept/icons/cr16-action-adept_remove.png b/adept/icons/cr16-action-adept_remove.png new file mode 100644 index 0000000000000000000000000000000000000000..d555d921aca63ae58b81fdc20f2bb97ecf3b8a3a GIT binary patch literal 625 zcmV-%0*?KOP)k-9#K@4yU?IRNuvAG{MT+4+!{7h^fL{8`$iM*d**|6= z4P^fVVJ0wUWME=o`p?At@cFZEuRncB1qdJpzI47ba}Uk?|Kr!s|G$3!`TyhRum9hF zK=JqAK>Q1Wzk%@Y|3AL{`Tz6B-~ZcB?f)+or2iBkfLOGob+i+#;~6f!yu|SE{X+(J z7B&V3CZLTV1o9vwBM<>GNC3$H3xvX)LJS_J4h&{mrV;=F#KOtK@sEj#iJ^O6H^aK~ z>lj$LSr{0AW-tI<&&a~az|73dz{Cu6HVXuQ`~Qu>M#h?9tM@hrPBzZJ00F2XV-x^j z7z9cv`TuhRA=;X)qu}73hnoGd)hHEGiI`W8Wd+4gnzL6}5;?d6hzTh;Al{IJA|HldbA>qGJ3W z(Akj0gy6F>~2m}BC@bdcr6b}Ia=+hPe<`@_N6&DFT0suh(zW)Ra77vOTFCa!7|Na3T z7y|?q_SFCk0{{T|;Q9dA>-PW$1Ofp5{{8^j=mG%IY14AJEy~gc&&1WEh@5 zzQ(}vOCd~el8{kpjiyuJe&+1tV|3*hcSRc1|Wc#{{8v)pPQY5;rFlq4Da4EFbD~8Gl+`t zFbE0rFbD|nFkHCF%kcXz4+9@B3j-(6Ywx}=Fg*Ck3Jg%70YDP~0*L7^&=hu7pr610 zV|f4eAA^W6JA=45Cxe6t2ZM|xCqr!}BZHk8I|DN_E7;Z_|Ckx%71GeW(HMFPKK91{xLj#&%(eY%D}+S$-t0p z{+HnrQ1&oT4?qC1fSkbtbb+?=Uxt73Tnvk^0<|#$4P{~k+sFcpduAZbDagbi%+0{? zl>ro`!0`C{9~=e%0mSm{FB5~N;CF^F`40@Noa{hBpa!50RwgC}W{^Tg2p?qV?gwlP zNB=M~`~+(L2XZ=43?P75fKklA%J`c>QIvy$jhi1V$i~b74kS>5f&ic(FmBi%{{zPi z$kiYQNH0JD63J)<02l;;Dck@5@3v?cy@kP{;_5fRIOQnZ+y?-4=XBF|N5~Yrm`MwQ zg;!f&0I`6a3}gfGKL%j32OIF~55(U8P=bRENP(;ass)Mt0h-JVH2K%BKkNVj#PS=c zKwH?rw*3Wa{tZ+M%rjtzGXll_fa3Zu#5Hfnd_obO>Snp!^^*4gyKS&`XSPMV^ zF@jwHvh+6tClH572uOyA@Q6vXGjK5d`^WI_@2`LV6!;W$<`hih{KE2)G&PhM{&If-I_3}9{C_~(*cdq(zOlSx zc+7f{!HzA2Vc+^23^nsQ`~Lp^T>=n5Oh8*zw54=5&P|(c!fW!2;X3ybhVQH&fnNN{ z@RQ{m!*8}93_n@FGCcbHnBmytvkb5PJ!4Q5Rb*iO&nm<4`wu%n002P%zW)IZXAY^C zU6@wP6TAQg`vd?s_C^4?$iDLQ_4Mup0|f&5`TPGK4IUa^R#pY-0^;UsM0)7}t2ora29Fuim}H%fRvl6d`YbUXkTvk<9N; zYvdI&{=^`|pwI9$?;Sfp0I`76023oO%YWucuaA?5_(S;<43~k9(Y(&daPr)_V*mlf$PmuJ%*eztb!z<7bU8CVhMAAL z81y+U8RR&X8Gir&15Itfq|U;`@cjP+22NHs2K(>f3}rP_-X1!4#0MaNfG%M9_x~@` z=T9F$GyMF*&G7N_FNPn#|1$jk^$+NypFqt(?Tr5znEo>}DE={F_^yfDN z!^?LcUO#zscgLTt#}$A1Pks2-rV00IbN04Q_)0Y=5ApP-mfWMvnvWnkpi z{{82dFT?jQz-R literal 0 HcmV?d00001 diff --git a/adept/icons/cr16-action-adept_upgrade.png b/adept/icons/cr16-action-adept_upgrade.png new file mode 100644 index 0000000000000000000000000000000000000000..184c118b63424218e82ea1a7d8acf4aa7f4741dc GIT binary patch literal 906 zcmV;519kj~P)VFvnKmaj8 zi~&-tOdykhoPR+4yE`w}r0d|mFrNMU!#S#|tZIPb(;;$Ttx(Ls01!Z67cj6h12u#6 z{$*hJ`?okP)uedh1ZRd-cbOPI{a|2dZMA3k`-dU9v+L+fpew2wI9P#}GJ>@N1P}|{ zKoI!*$KJtNxoP?o7lu{0nHc7s{m=0I>ko$S@Bc8gwOcXVx%<9s?b_=X7+Bd>Gq6Go z002(O`0<@$42yR?WAJp7W(bQ^j|Upy3epM?06_r0{{a90{{R;znA6A1=l}Ql{Qva# z`~Uy@_y3f;LcX?f=u)<^LcpoZIoKfq2*hm6EDW#S{A4I=JM-uJ@4p{8IGH(qvOydV z5I|r9-hTMuwr<5$A%VDw!}=|E4={ZD zQ^df`#Ks`R@e!mKAb=nN!Nhp~A2-{51}WdP)QBU2M|DL2CzdgC$A9$Gy8OI zF%dHsF?j}FZdQgwTLuPI{@)BUc6?#FGoUxtJFYSO!&@s zVTNyC7#WmA|1kv;7xQ8U7M47q_dbBVhy(xv2yOr)8;8UpWc24+RCtuftk4;D0K&4N(2ZX zcuHhsX213K`*()-Z@<0-YK~=KVU7mogF6faGAlp;F;beH0RjvF%)ro?dH&0~00000 LNkvXXu0mjf?~zgP literal 0 HcmV?d00001 diff --git a/adept/icons/cr16-action-extender_opened.png b/adept/icons/cr16-action-extender_opened.png new file mode 100644 index 0000000000000000000000000000000000000000..a4f8e50f06aef4dfe51f4bb32b78c1a0d3118dfb GIT binary patch literal 808 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 V<>>zY)foT)002ovPDHLkV1gllY9{~y literal 0 HcmV?d00001 diff --git a/adept/icons/cr22-action-adept_keep.png b/adept/icons/cr22-action-adept_keep.png new file mode 100644 index 0000000000000000000000000000000000000000..f3925962f4aa70e9c3ac6e775cb045edd15ec72b GIT binary patch literal 1229 zcmV;;1Ty=HP);a;EI|9%nHd{zwAJnH(aV zPT&9k@BjDje=S%e$j2b(u>mm`3&a0&>0n`i0K)HLMySRQKeIU5n6K5>Sov1un{faC z`Nxvs>u&~z?|*<6{{tF~8JqwCgxg?7ps7FpsxkcdbIRRQY3jk9;R3ZK<_wZzTnztz z{rv?tkQv#}r~n{euhTAo<^5?}JB@aJD9z;K_-@SBkn zsGJdE3DE8T8O{M&?I2SC0*Dco+#r$nhYyJNMMUZuPoCt&AR@xWu>9(Oh6NWH88iic zGxWOtW4LznJ;Tm}PZ*ehPGVwa1Vde6WhFVDx2ld8+`7Z}DM{O`{{22M6c zU{w5P*m3MJ+%$jyLNfTzocIJilSx2BpZsEGXxY!e@aPjT1u^_$_z5)h=JTHn+3S7* z?fA{`>&GvK-#>qX>5rejGh{l6FoakMG5q<12xx!+f*UL&!xvOiXvXmNFEc~iK?a5= zpZ_y(G5%)w`3-2m&tE`8elolPvwt)E{{9n;fByKv@czShhL2zQfWZraFaQvMXEI9x z00g0+_mT2P2frLn=1q0@tvp?T|9hI0?T0}c7b zpee@4Q0gYaz|GFYzzWRrfByaj8u*vt_n*HEBD}2N6vE1ka4|ptAsNi{0hlrzni>xu z{P5w2a%Z~@!-P-)hVCst8Rj4O#_*Gug+Wz-`+fdv&CFk3S+0A0$+%Eog{P!0U^K4AV82~0YtMp41 literal 0 HcmV?d00001 diff --git a/adept/icons/cr22-action-adept_notifier_ok.png b/adept/icons/cr22-action-adept_notifier_ok.png new file mode 100644 index 0000000000000000000000000000000000000000..5cf139262f2512a19429e1a67942d01dc9f53704 GIT binary patch literal 1589 zcmV-52Fm$~P) zvw%2{PnLToLySc{gF3%D0}}(f{eKzmeYwZ5e9tC^Ni)_myn6WM7y~z(BT(WO%*6l! z!~}OG2>klJNlH?}ry;J6A=)N^fs=)s;qCYL3}63zW%&E=FBpIS^PS=Cj}HvYOsovS z9_|dS-3biJ20~UqiG#>i0|XGn;GaMj{bVfR;9~Lhb@gD77FJ?-`u-`y`ycNazWw=<1@q4H!m54goGFZ(+wGTr5G(3e*N!*84M7B1ai3n5Co#&1Kb$z z#)}15n>|>Gl~IEPbq~bPB1rT;hne{sAKjTsO-(Csfw3MQnG(nlw9=3)pkjz`e?*V~ zz8NeGFFTgYp&lI0tsf=DxnTAcKrB$zDS{Fl{9o8#GhBRji9uh%fPsMv7(&39{`2<_ z!#CD%V1pSM85w^6`_1s}_cw<3zuq&v`}vOH&CfRs=O0~U_{95yK|o%bTf`UqC~?GjOqR0$tArj*H)ae}jYO z-Mj5NTBayJ*ArnY&l<`sZsYRdr-hCzgGwf-#L z|BS{1tk%df5T=E`_070!2g4f;pb0Aa3%o=Ah5w-{(OG?|BJW)uM`&pI};1owcJ3%K{N*t zvjHt*W`Y>}4`k?{KfuUj1{M*Job~trKL&0_pf4W^GyM4c>kUW@Ab`LI|M|wa@!Ney zU13E*hTn|ez=m;vTn%+OI}n2m0y>T1571y%pld-Efn53rh<^gZR)|rE;qz54h9AFP z?E#qy5I_)T{N~!_?v*X8G{xJMMFVDck#>>FY3oJA_{xbY$17a3n zk^*KTcA(dJICvQtugfx=YGGtJckuC*|J)4Lpy+}b2M|Dz^4LcfSh@id=0`qYv;%GU z{->Lrg)>vzOoCh6iH|`_6BwTSe<3C77iNYRH~%nP-~W-}%JG*!zW(^O2{FP@he4{UD{GnDx&*Nd8lDyRL; z7xfkyKlRy~m7&>9Z-paHt(xljRVI3lIDLmY9|5`b8O|acsw_LsH(HE523-6|o zlj*MhZ=HrGA{7>7lPmQ)#kTJuc?Ns>Gv)*c+IA7sG&ynX zcS`vzlc&um-*XD9?-a6OmW8+atgCxOIU1AUt%5*cOuu*YW}3oL#jC2@t{#QsVr6n9dpgNvOome?Lv4GQ9tz`Kw+;YZ*YSG2 z{{a>+COBmZm0s_>okBE^VzmEr-J+Wh%Ptuzj)>f8jiVo*CYH^0qV!`Uw)$M1_Yy*~z>o~ppt&N4>`ZhSjeCaW=J^3HHm_BhL-u3G*^w_qIrd{-; zEL}>lww9=_$94&E8vs(uao5QQ5ql=E_qSlswOd-`rRwhPmThfqV`}9C2jpN~o!qS` zN2HXOM=`37HYWLmXr4JaEVM<7aKHKH!r2^PPB1v8CV(&y^?K`f3Gu+VUlYJbLbL`H zW!3aRKm%miXrn&=uz Z{|lDKeKp!N#=`&r002ovPDHLkV1hB9nqvR} literal 0 HcmV?d00001 diff --git a/adept/icons/cr22-action-adept_preview.png b/adept/icons/cr22-action-adept_preview.png new file mode 100644 index 0000000000000000000000000000000000000000..6f5792abbdd501140bdeee40b2c6d83aa7d667e1 GIT binary patch literal 1433 zcmV;K1!nq*P)j z#T~m2Y<}_L)dp5pme1e5eZy-oKmaj>WHEzx-2Sc=?Hm z;rkB;hJSy)FmN-yVPN=nnPKCmwFkFu+f)4a@1L{y3H^_oFIQlCLtK{f!WT^O6e009IJ zV?`xJy?1}u7$kTY8B{Dp8P5FN$FSqgM}{}w-!riM<79a7`6)xow{8X|Ze|8&18W97 zHgSeOFIX6)rKJ^a+`g|0G~z9~!2kgSHkh5AOOSz?k%6C+mEq#sD-1_JA7@|#x|HQV zC&TaG{~5mh{>|{@`#pw7UtTc?hzl}U@mn*zdjAEKG&zCVMX|XUAb`LIfB5kJEg$<| z;r|Rj88mqG82+-c1C!c&hKE3xf(-rphlxRhSA#)YK#xJ6M~C72lTSdOd}RQp z|0V+?6C2R`uYnndmEr95%M54lKVUF6c4ClW=V7>Y={UoqXD^NewLipWFhBr-gW|!% zhZ|O{Tz)7=O2N)l)tG^afsNtX{p}1kYUT{wqI?X7T-pq89)Dnn_KIa-{Laeo?#_9J zV@Hp^VgL7k9WWd|qhw`Jh67@N0Ag-vXkch(1 zE6ZTOZNk9zRe<3?6F&pMeErSv`}s?TQ~S3t?AW&X zH8%?jt4DYWn`N4UipkeYewREiILxqpcMvBO|NG z#>U3+?%lgTckkYLb?xTuqu;)KS-;Ryzu0R=f)hW>K?YVSR)(9+w|`{xUC2DZz_0-3 zVt@c*KrfG3SXf|8VW5Q;tgNiQK(-qY>i{tyNTW9!v(F`Gu228F`2PRjWBUL9=a~PO zN)10-GBCu#f&?Iduo?_1mvNS}P}%}$$XQdS@Bh06|Nq}-^8f#*=>Mnl^uC)jFvfw@ z00a|};9mv?Er0+b%f-xSV!A+=uQg_QzR{WcmnjS5KA?~xKmbu>Fe8%d nxfmEMIT#p{z=i@t3n0J%CKT3^S+hSR00000NkvXXu0mjfe=C}- literal 0 HcmV?d00001 diff --git a/adept/icons/cr22-action-adept_purge.png b/adept/icons/cr22-action-adept_purge.png new file mode 100644 index 0000000000000000000000000000000000000000..5d1bce88019eebb88950d04ec644b67c7efbfff7 GIT binary patch literal 646 zcmV;10(t$3P)jnS-0uxC@ zK~y-)?UcW36j2bzKQnJH-d%|7g`^27)g*;tV_{)o#6s}LA7G`G3RYGDd$CJl7er7b z77;`{K`>f~HWqf#MvEZC+=X1st-JT$SnTHZNMa$9Ldd}5%}nuqGvDvb6EkBkOxYvb z2kuz}@MuEfq{Bij9y%2U4?04yVBnn)fB@Kl07XtADENwif~liRDrvI(IU45D%)Bi{ z07-{?qtoZk9KU&+dSe*x{f>SDfB{nGO!GiQNYjKj&mT^HTbz9ioWRVOpB!v`{rKMg z)tWz+?e3MS%*=8s7#XR?W8-vIS9p7822@d1LLj$E-bV$ZoW9;|MJ_6GQD3|fAUS)H1BWIs^QCwI!9blOcI3dSh;uj* zTv4GqMMZHcAWGyERB3Fs(aHe*Tm0AK7620|1ucr&b=)AY(!6KQ7ww0DcEhgi+ZIK| z`59o?XF1>fz!Hgw3YB`D`1JW)Am>W)oWs-+)RC!>xu_?g0%R$b#%Lj|D}k-qN;jI# z>e$pVrstj^+CQvYj{KP)F%YG_wn}HcWj)}H_WI(7x!DURZ``6f6ca+&u>?RV&h|G{ z>81&Af9Kr0ckkYOk+>vT5v6v45nDSBAfZx?O)82)sY?7R73|d7sW7yH zFj_4Yt9Hg(UXiLL9Po0Jz}r6{7l&`0ne#Jwyyx0VsQD$iN)UX-L=V zGiINKmw6;Pw&LxYOU7J;*P$ZdX81f$O)_PoD6=-mSlg&X|4)NRP(K z115o(1egR+{QrpUGf&77j0_#wzii=ciM#K;71y(|!;mtsY^E10O<|$?GuA5I8y2#D z_6YDh&?`TC6V+ei>oAzg(9!Sy>et_|zH#mi{Bmb6H5X{Ubzw-?i9VE82&z8`4LS_? zu>CmeH@2|tm3NN?p}rAi?>}8*B_hPsRpiL8_~D!x^B!Bfn7M0?(s8mtd6B}hENn|- z1av@9=Df*5@xZ``ZtlQbc)7v}Pz5G%d z8@IB&aZi(cy5R?i2noK)aO$a`o?>dRD~;8q9$mUt^0|yGTDVs5F55*({X|Nxo<`|4 z*HAjGj?(KlUv}kv=J0#%a>aLFliL^Xlh<~=E$+E@eIg=5su*|{qPQ>T`-0>{OE+yf zu&@2=(V`+E+0tVn&H>{TgK@zE!eG~1t!?MMxc$JCHTT!>(XlM&R4A(B#g&7qNT{o- zvII_mHU^ExE!gPp0-2xMxXTpIHVq9adlB0DqS0&2sOC~Et*@{fgsJ8dI z{l3n1o)Qr*EV?#3B3T`EA{KcxAAWFxRJw1011l}e1%mDPnD?`G1sIy~f-AA~Tzc7p z4o2Vx8f}Bpn$XQldP9c|@a54}&gLCY>b{6ayv*T|C2M%}sZEn5bXS7@*kH(MK=*)S z=NqQimVeaI+5FbQLw_PDzL^}LO~1egjG_U$yE-zNbc$7P8dmJ~`SHA&j2ks_R$nyr z^FAjtKIdho;Q3QZ=bwzMy`> zZFh3#^27XW*11fMpJ4T>KXd5NCq|SdqAV4n#SeYG%ZTQ(FGj z%TqrZO?&G>?wa3}>NyomBG88iiN~tT$(r7`C(U-j%V?VpomP4mAw*mep*AzDzO z43dXNKnz`}0vC^pvE#{!G~Dt8+jbpz0%I?d^yYrzF={dZKH1q`ski#}JEoURy`c`{ zm5~bv8iWjro$_H(8k;+5`9~kmJT#8Iue`yMr7s-M^{TI7bhi{X{x2~YviOyGf(K(( z(TvLKc-$?CS)o{B&=|C&eLuQr@hm;A<{P*=VA~6?^6+oAcAA_w0o7~?P|I*qX k;M`n{_l}Rod_mlQ0fJ;*zRK(O`2YX_07*qoM6N<$f{q~KDgXcg literal 0 HcmV?d00001 diff --git a/adept/icons/cr22-action-adept_remove.png b/adept/icons/cr22-action-adept_remove.png new file mode 100644 index 0000000000000000000000000000000000000000..bb16f03f6b6d530db5dbb6a685e223efac0294d5 GIT binary patch literal 743 zcmV?P)+P{WDgjj~6B84|*B{>*W^G)kv0%rlr9dH5 zfB<3uB{zW#!S{!59{x`$c>MbLf5mX~-ykyq0toD4eolT4c~J$1mtS8pqA z5a9*X&&bTc$;AmVgqay)01G3+5GI6y$Og0jXJ=q#Vuct21pom=dUE@Z1ET?e07AGJ z7>J0mVV_00{(u00JBQ`N!v9uRguvFjX*S*pa#e zoGMWL4sr`4-p~R1hvD_dw+tUXy$5Rm2q3V*@4mi0*tNCOx7xp!L5NcTkwGvr2~xNr z@j<@*`R5nItW66U?mv5Y2P6g%K#ZWo49wEfK$*?b0j_23vl05Q_4pa%#bnw4$<0Yo!{0Ro6-1_J~T%?t(z ZFaWyV1=50&m~8+6002ovPDHLkV1g;-I9dPz literal 0 HcmV?d00001 diff --git a/adept/icons/cr22-action-adept_sourceseditor.png b/adept/icons/cr22-action-adept_sourceseditor.png new file mode 100644 index 0000000000000000000000000000000000000000..ceb2cbf6fce8a7e12be8c0c5f8e8cab8d64fcedb GIT binary patch literal 1578 zcmV+_2G#kAP)gQJSXh=pT8x2#N01`| zAOMMTlL8PB24MIdW*R>=Q#Q_F?f!d5AcYknA^OI`bAm^U2+wg9NoKWCT7rp_ZnzmI z;dX&$3G8;m%sY?7{1M2lqU}%4S5a3f+iF=Oa2fd0N1p&<;o{}!kTp|DXXM~ul{QiO zD@l#aIZ7||I2Xl;co^uRz{!${xkgfBgpXU z2Ll5a(4~CBd<_5o{$pTefmjS=G5`b+%b(wW|FZ!#aD>P8Ngy7GXVmKX{gR0qtf3I_Sk$Rt8QPJ_aEUh$BHk0T4i7gFzfnn*8(aKR75j*_j!51lSn3xPhiZ z^TYrD%nY-dSilx=01abjXJYsPb)7Kpe}-s_Uku+_*%>Z=WMKd%8U}y>V)+jZ3Q(Z` z0=A4D2ir z_J3e3{$XGNW|seuFb0|l5I`&-XM>#KEcb;$n(HgWKV}x7A&lT~WdeEw|+*#T$~Kmf6TY=h($AcOHAI2HT`Q9v3Lv0&R_ z*%TVaFaXlS1PxP=22gx=1@aHec8~?$s0R;ib6p$-nhJ#%CpMe1$QJ`e?7ic0UFt^>k|B)dy{@|Z~ zoIH$=KQaD)aO}z^fB*s-{EzX)qk9bhRR1t=02BH@P!5D2z03bIB+zYR}xBvhE07*qoM6N<$f+W(oXaE2J literal 0 HcmV?d00001 diff --git a/adept/icons/cr22-action-adept_update.png b/adept/icons/cr22-action-adept_update.png new file mode 100644 index 0000000000000000000000000000000000000000..0d1ae4562645a41314dc8c866725ed43e04080d0 GIT binary patch literal 1684 zcmV;F25b3=P){l3m0@X0{0@X1C z)iHsM_`l^L13&;VF%Sbl_WlOi@beD?!;fDg7OJ+IDnfE+7`}dP0U85UfC>NthzYM@ z{~34~{xL|xG05kDLL0L+Hfr;fG(9HjEOaB4mM1)h6;lTHe3^)Fr zU?_~OVG!mPkSv)~ck0)_Kl%(zOs_yn0RjkN@NWixes=y9^WztBSQ;2G?D?{W;o#SK z3_pMW0EP-9l6M#x{(k?<@b~XuhR^@sGu&g%U}z4S&v5qkHHn3r=GHKFrNQ2G5q}YoiW@hlEK=*jlqiFnc>q#7KW6bjNi}Sy-Z=? z;n@pIasUAYHkgBz!_!yCkD>Es8-v7ub%r4JB!;kw;r~xvKfV&^n>j$t3QWsPKu5o3 z_{7kmAg$okW?RS5wqznh=j#5C-~axLW?<*u%J3VM_8~3?2q3V*61^#2h7y}2lKLb1a z8*r-mhe*!=0R%Sq#g{jKk`^Vi@G$cOGa@6yomUSSf#G$Off*RCOn>=+uHa{2XL-!< zou7e${XfV0qdR{9W3`rnkGGHE-yac%?_Z=D{sDvF9}5!$EB7y;kuL!Ph!LEn6WJsg ze*9(wdiNj0U!biloc|bDn4dEI|LPA6*ZB-A+y{XH9LVsF8|Zj;RiL_G42=ICGBEzm z<>%m?pdzdQ3<4I0-+zBI+$EGv2WtB0!`}LZE;TsQwXF&oR$Vh+y zVuI&iMj#Vp&HtZj3_pI}Pj}A=J6L;w(O%UC=&|3T3?IL%GW_^r!|?T;4a1lB#ta|c z)+@_uhvxXDGOYbEkzwP%DGVRpePVe1{M8qbi2wlvaWOC%K?<55=G=^&dncw%<@Rv2 zWq8SWmqC$Vk-^c--GPmR=Q=QQ82|qThTb1WMlD$lrktQuhT8&18P+~p&d{blhhf8k zy$sKuKR*pJ5+HyeVVuAT^x7XaJ{G={vr=aWXd5apG~Lc;Fy^*l@DYw;`2O!ZJbysE z$;9xF?H9w=H>(&9yxGoBs?orp@Z6fgF)i}Pt4|+o{-3>m79fBiF8&EDwSNCiwKsJT z2sHO$h(6=VaO>M0hS#4yGVFY@m4TUw8MTyRWCUk(9bN;5i5g28zTV*&hG<$FAM7x_Qfqn`h0Zq_i`9{B?%m;o}=SfeAl?;UBXU5ChXJ zFbOfTe`R3dddk4T0jyS-F^YA7075N~|ATTG>l+3(PK!O~cJ+8SKhBdDRbXY{5&HqO z_!BT=d;(SgkfaGpn~b6xmgmUKOnD{d= z{5u7dlg6hLAb?nK%KQU`{hz&=S*9kFCpa;D_|FXX#N@2@WX!w&i}s|*#7-wc=7%h zL-W=TKxKa!CiUAfNXhV3FnsxK1=fpX0YCsD3}$75Nc{M{q`b<4*UCzYVa2uo49A}` zF>o^cX87^_Cm6Fa{9-us;2T5FmX{3b8vG26%~otcor@U$|7T)gLl_4TKujn>@acDk ztGBXQL7oxA>F56$=AUO|`19*G!>=E|7=Hcy#qb+Q|Nj1q;s38+4D$}WWtg$$8AEc6 z3PVJUhBCv~-)#&`2qyys5W?U;ePvx_=iDT;3vbs-#>wd z|AboblR-<2k-id4)&OQ4Kmfs$8}pyPGb*aB1k8*j z!2B#TW`@7Ne=)pz&%ltq?ia(GZ$BCS{s39>i=o6#m_b#70~kPz42*yOGU#XvFf`Pf zaTJsto(9xv1=0@?KyZWEg*coU*_j#UuDHhV3#jU&S012Ce}i2s!p91h2m27@T2T5$ zD;xj<2w^Zg14IGHDgVI+vwZpa2Uw#0WeBzs0*n0zmUw@Fm>Fo`=O4guW@Tjk&j>Y` z6{-&k00IbMFgIGL{AV~nYvawp9mgIs`~e0BJp6!~S(urCWyTN2|C}tB!G>Wega87F kkydpcKmgIK&I1TA02lGDOkBqlf{f&c&j literal 0 HcmV?d00001 diff --git a/adept/icons/cr22-action-extender_closed.png b/adept/icons/cr22-action-extender_closed.png new file mode 100644 index 0000000000000000000000000000000000000000..95fc56834dde61382c5ac0f770a494b3d15f97f3 GIT binary patch literal 1003 zcmVp$aU25z281~v``1{O{T2C-Rz zG%HjL%Kkr#55*jS0K#X)rL%|FE($ zxO*uxET8VjV5~1;#qifq_|AkYPr*;eZ8SX#%#c<^<1H+|v>MI6@Rp%KQ%q^uEW;YlxXsHNUGJN@W zo#EeqH+%*I1Q535wvB;@L+i=Y&*v7-JH>GN^izg=K$lP2$H4H3iI-tog*t=3lc)&8 zPo`}QzyG)4G8iC$7|}BbqxDi?;Iadg5Elaj6I%z6Q!K42!y=}v$nfni3xk6y14D!v z1Hin*$I)mNmFFfuYReEj+!$OT5|QwD~K2N@WAb(k4=dD$2kUNN$x8v_tPm>QgHyBu1ynrJ2@ug#c0Kznw ziB*7wN08y+dsYTUpkt&({xN+2^qt}DyFdT_GqEgYU|~uDSwkr20R#}H!7Qx*zy4xk z)VfiZ{K|V2{d#b12dB@Fx>BxS{?%g5F@SXJb(bAS)B(E ZU;rW>1jhUvkVOCh002ovPDHLkV1lI-xvT&H literal 0 HcmV?d00001 diff --git a/adept/icons/cr22-action-extender_opened.png b/adept/icons/cr22-action-extender_opened.png new file mode 100644 index 0000000000000000000000000000000000000000..53c2297cb764c00be9eff55c21f2de85141ed8e9 GIT binary patch literal 1029 zcmV+g1p51lP)BLfG=R|Y=r za0W)^Z497zU}R)q5Riq?VDR6N;V;8p21XVE1{T);3@kvSSlLhgU#4OSk_8ALxWNKk zEN+FFCQPi{Yz#k{nHUZod&#r^;L}A60_<80%-kaC1r&e{6cgY82&OAGcd7P09C0m{{7$X zWG}~X=La9d?H3FTU%&rj`1IyI$T!!3I2C3bKmZ}73ZRR4*}czPdiTC!$`u9?b|C*J z1A~^n41<=TEDO*}>luFk+o`D~!tqZ~oZ+f|6pJ+G*@BZ7vYm&=jKunQj}x333TbVUknT% z-+yEH^X=O|1}4@Vpx*n4$Yo#v2p|ND4`>RvAOizC=hpumY~4Kz?=YOZ{)s_H5)}Td z3_9j&4624I3~#=%F?{&K!0_qwZ-!r=fdS0Sycie+^AL`M0Du6(l0kq$z{Xtl^~e9? z9SiOOz4?bhS%iV%$A1on|16vgAHM<({q~>X$H$MLaJ>O^WeT;+0E;A9BHPyi4>@N~?; zErjmyHw-)s(Z|kz*d{Iap4m!Ekm2$ZU}U`nCfYwg{sSW`i{byj`?#_+KmZ|J{O=zs z{{IgYWV;yH*}69Ff6MUf^-l&X^}h`NzXAi8fq4OtSd6c%00*hrVx(0K0uVqnD~|yJh-L-@1Q5*(1_&?!sYxI!x4+WF00000NkvXXu0mjfi`UWc literal 0 HcmV?d00001 diff --git a/adept/icons/cr32-action-adept_commit.png b/adept/icons/cr32-action-adept_commit.png new file mode 100644 index 0000000000000000000000000000000000000000..592ce6f4a573e0feb59e1368f831b5e2d0362f86 GIT binary patch literal 1732 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 JZI9+x{SI|9k_G?( literal 0 HcmV?d00001 diff --git a/adept/icons/cr32-action-adept_install.png b/adept/icons/cr32-action-adept_install.png new file mode 100644 index 0000000000000000000000000000000000000000..90fec1df1bfef6f15863eac0024001ac81e8b4e2 GIT binary patch literal 1790 zcmV=Z*5)rK7^EQD7_2gBn}kAbTGGcW=n1TixF{r{IioJ*WRfJ1;G z#VwklW#t6vZ{NQuF)%Sdfkq(&Ga`i?5C8-a3s!G{6fuHAgc+iSk%5_&nH4N`tbRf};tZ$p1s57E6)<2p|@mVF?bV zf1nun4$}Vb-#@5X{~3P&{S9^i$aqGeZ$KC%_7@1jG5GH<12lX80Q(l4Sg~6J5J1=* zzz)PJ;J62C`!5Nk*--K>FtLFlkY;3L1YQ-H4f1r%Un_yZLE z{pSe-J6Ag}i!Oty1qdKy2k0{V`m-*=Hd->qBAS7lgPY<1KS;R!|NDH&hYmyFe`#X1{{YB2QC~J=w3c`$xn#6U`GH15W)dJ|KvDmJ4r51S-`-;j5}#? zuyEk;^?wF-CU%IgfcoupEHKnK8`uET%3sFL1$~7u2LJ>R!lu6rM*c?rV9kGliRjeh zQ@~LB1Bqj3c4Gm?3MdyqawlqhgXC^~xW#b##c6PsgeZa)qW>ARg|r#?Sos)yEL<46 zmQGcL=>rHL7Ia^Lz?WZN7<}gYFns#;30RmhGcYnk6B;ux;Q>oqW)@}!W+p^o1#%z{ z3lGEGOLH0KUYQGV9MEKN76r0@GyZ1S=(&->THG2~qyWngCPWnk5J1S4(SKOY2=?)R zgyG<<1{M2{qppBC9!x0V)*g*2e7R94T%P3M6`htAv|ZG0e}EPb^tJuLt=!Bm5X6P*aC2Q z4~kb-=nAGvax;s4Jck6?U&077aJvCP%2Ga1Q7phM2+J}+`X7ThpBOmk zzyJ9T7DrD9AU?hhc1}@cWnt$6<{wZE#_;#+HWMtgTz`?fv-`_tfKY#z@1vWB)6+4q8 z!>^xHfyJ{pDcS4C@1OsF{r*|N!1(VhFp01L%k>`&99)lp=DkGD6aWE)EgJ&sZ^jD@ zj7+ekF9xK(<12u06iUE&Vmt}Nry(g4dvy*FKr93+c3`Fen+J6ODE@J^h+u67q{az1 z*y8`V%R7Jo!r=f=Gl~h?hy=IGfK3C4;c7x^3|phOGJyD?iV0Rz{`vQZK~)G+$^H5J z2b4`2p=~;#i+~g>xW>h3ngIk53r0BvZo{!4)ujy2f#mIdR}RQWTZJ?5u=6n3%Gu%# zxRpmYGJN^)<~0L5_Y)Me!7XA`wEzKx>Hv_hL9JKREcP3ic)AuGTx7$=#?29A9>Bm1 z3}Sef@;{;k1qJ?m-hgROtuL?;d`jI{eiZQ5#|E~5F@+_PG<#onII0pnjU-@ zz5%;tOzhfBOsve{;t!>3#t4ijpdWwy1hxC-GcdAF1jPo1IX~GTYIj211`t4u1Km3Y g2%rJ4jsXG;0Hj4r?PBOqHUIzs07*qoM6N<$f=9pufdBvi literal 0 HcmV?d00001 diff --git a/adept/icons/cr32-action-adept_keep.png b/adept/icons/cr32-action-adept_keep.png new file mode 100644 index 0000000000000000000000000000000000000000..2568b59b325ab4cf3b6a1919146c565eba3fc3b8 GIT binary patch literal 1821 zcmV+&2jcjNP);niO(nA22WEdIP7{2|^Wcv1dcVM7egtDSQ zAj7YJ)(n4v3PAV|R3SGr#1S|EKmd{M0FX!i{a0pq|8uRhH1D*9v%MtN&GBLo7GP&! z_zkrAAJhRLb=*u48V>*nAQloWXJq*CH=5z!zt-49UAekS3kDSheulq)|1tdf^%oI7 zpeO=a&V&?VH~>HZ5$^y-MjnPwKRX0Oxw1Ms>=@G%b-||p`TYmg4p3U*0QsB|VmW~j z007ype>435$H?&g+aD%| zufLsu!Oj8H#{thhj8K}DiHU)e%(hNP&ax6yaOl4I`iEiq zIcA3a4;dLOC4Mt7{`Q;AEUVVWJy*da52cgs;E;&oJc-GsB~gj0{}B&}RJmmjP6g{|C|w zdL4i{?>|!5gCu~N0+=H>*;yElTzSI~n!igN-70_p!tQ|o|6EyE7^hF2=E0tnpaVAS z@WcNMvo0_JeZt7V$^3`m(~n=ksQAn9=Pwfw104els{afi3;zK#36TEx4`>W9kplUQ ze_0sVnE!)f<2Slh00D%}0kXibpHNrtzzebbAH&vLj0|%wFoUC$1L*VLKmRZ={r$sm z>*XJYlFfe@{`>(t{2yr9M_{}@fBg$=@oyme4^-|q2m|@= zKmA}(5n+O73T!zNAb_wqfH5#OR)>LugPGyltG^8ME;55PG6A#QuU`;LVE7-HAxGyGv-1=39a|1tapMaTdDSaT*o0AX_g8#_BV`7(U{^`GH8$XsA> z{{{u`uU|+GfCl$3NRWfsKwtmVkhe)~&k1M31dV4`IO zr**JHppF5>{V$LsSeY5v-~R?lGoxDt5J0$#VkXwk*RQ^_Mn`RGoIcB)DKb=*!5dfs zigNKWv~79AaQxqTYXAa>1!t=V6kMzA9j^|GT>Mj%^Qm|20%wo~X<0R#{W!R8kS%bf3j{@-n` zKQib1`Ikx)`t2B0WqBAH0vQ-?Jp0b@>o+8Yb8!PxA2;i21}>IO;93ja0ZiB%1^@xX zL{uA)g>gRv4~OHH4R^MVZjz|S6f@6Lz1pztkU8#>Q2{QA$#ASB2Mjs_G5|NKu>YX}4Y0*H7AKx*0_z&LLH z`H#V)wdv#q|L7eIS8jb~5EtPF*A;LpK@R%<4^)p4Y#jjv5P2OF7N#Q%{A^C=&b;jN z3fualsQDx?uLJ94W=0lB#lZk6e!u-A7!m*h#E9NEB&uTqV}m*y|NlEP{Qg(N$iu?) zpNTOUD0&B@V*+X+vq1ErcT4~Rh;g7hrvL#o;C(}Y02*)y00bBS7L@kzTSqsf00000 LNkvXXu0mjf#v()8 literal 0 HcmV?d00001 diff --git a/adept/icons/cr32-action-adept_notifier_ok.png b/adept/icons/cr32-action-adept_notifier_ok.png new file mode 100644 index 0000000000000000000000000000000000000000..1914a4235f09be11f2e4bf5d33420bf0ff880875 GIT binary patch literal 2473 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 KMNUMnLSTY^kyugy literal 0 HcmV?d00001 diff --git a/adept/icons/cr32-action-adept_preview.png b/adept/icons/cr32-action-adept_preview.png new file mode 100644 index 0000000000000000000000000000000000000000..e92f3ca656c132e67d13ad7d364dd9c5eaef9154 GIT binary patch literal 2474 zcmW+&e>~HP8~<$6kWV&8`AiAjHiMb&nc2^x2XBIWS#m1bC{rG%$_s8=*ujilVdA*n?Jy(4*WAJgQ2al(QC&s3xQobVjtZX08D)kAMlIFct_L1FiAv4vH%(lq5xR3GoG8DZ~W`ApdirM*%_=B zBWSh>2^&dN3+j%Gu1A7*g_w5=B<Gpv*iMJ8`B#3-!W zN=^eD9UXgV=ZHkTO`usxm|OUMYEF(HS3s)3wdcV73Rv!fUdI)Hl8)?{*5uiBqK`X$ z%=td)wX*(OE|me705U-J0=i(8oPWKxc1}CpOI}Mv;JD$QtPXRgfHVe{hOWpwLl98ZW6j9t1`%GSrH8)3e}jcM%3)y&H-@2&)^LTUt((SlMmM znXzyY4Tk%Iy!P+n)JoWy!z~0*W|od(L?OtNXeq6#BW&rX6OLSxr-0Dv?c-*uP?iQ) zxtCf)U(m^u?bu1cP_=!{+F`-zqnVkRf#F}=?+ztdQCk&vHMp*fB7DKmW3l4Kbo%j>LoC0@NS*_M;A;uxuOd7CS#Z&Sz0+2q zQ6-{@#P*euAF#{D@`F$<6H7~Kq0=(-QdiFHIwwwX4PJCl{u=rNKJ^l>`een`jH#dv z9(SN!W8N<)_g)N8KF$o($!sv3295`(y`9*LXzua?>{%1$YK=-z^!WO*@*1|cs5?>% zUSMOOw38!4bt_#AbWX@AZX&b8O}nDwNhNj^D=n3lq0%{`*8BK~`gV{#veF3*UG_D< zuzt4mj}i%(GoJ8kVNlRj@|jg8d;U!@A(hTIG`m}7=#Ldkre%Mz&^7VWafK(jm@dDUk;7+XC-f6pv z^vLE4kA5+A`rYo!=SW6JV&w6ZsBM`OHP#m}CXRlGxW~9HQ4cNi77D>{qkaT=1cAxJJq+J9b2V=>uX`~uEv}z&oE;_)ZeFUD z)uYz`f?|gy6oph$!us0I+=~{;u@I zqx|Ue4oKH?D<56SuN2UZf-oeBWmiD$!7$aB!+rRUgwaeh%?1gf_f>{@oHP2mC z^H>S#Psh=V8QX`7H{BeZaQtYNIuMz(3s^o`8G7w*`2DiZ54YBG=FT7E?yuzG$1cM+ zq^kU35YA!HTC-sNmg;(*$=ZGZVU#XxIzOCt>S^*UX>!;a%;8eO_|@ZJ*4#<@)~L6G zb)TnKqY>r^N`%%}#^y8ictyR^wW{?}nFBR>kBF;`gY@$O1a)*ip20}UmG;Ycpla?f zCenS$3Ck4848v~#@cL0GW}|QFRQZkEc8?Yi!{O9o_BWPdMBhx7fr8Uj$V30xA=22L zW{ofRE8c&~LVxMBn;UwXL>R$6B`iJ|c4frHP)6!zj8MZ8Pf!z5wW2eu(bwcNiL94i zjDN`9iemjOl!ZSENt^vk&@ecBi??ii-$t|}HUYhdYRcuv67dJLnAqMU!H5^I3x%Cx z)fD5Ew1nl{E?kYm-yv-9VqBAo9^VJ$r`l;=sf*Klt8e(Q)a&lDP3&3a>uqd=g*`oo zxI8=3I79bwXG>jibyF1;< ziW6sDdvP`mQ~FGa_Ulo{rGp^&3a;})+Oz8N0I=>!L&NCy?c1HEr>95y`}_MAlu9=O zYV;b3sYA+?8r2;0Y3A&^k{3KXK5}&b};u{9PerkpuriF~MF3b88+okry^u0j8I zwnYg+W8vCH&zT-n|L>|H2s*GC2Nh1S<{gAd4l^eEWh>8K?Z|aNG|qbtBpGPh#JGCS zhZXI`COfa`O0HfpvwGY6n@P>S@_RTap4acH)tnfdhvA4m7;b@dFf4{)*ySo5dU=P| zES7Q>`Oqn?d?O3k)Q#vu?ylbaDnFt^4-2MNVCL;NFkIoh#Gb$Hm8v3{{s+R`+nYKEe`BxMsQY!t}|g~&2rSN z#X@eys+)s(BhdIs%?riUXd*TgvS*!LhYV=4eP$_ksC-+lhj&gc!;N8DX35skbjtZl zyThVU_N; literal 0 HcmV?d00001 diff --git a/adept/icons/cr32-action-adept_purge.png b/adept/icons/cr32-action-adept_purge.png new file mode 100644 index 0000000000000000000000000000000000000000..9a6aadba85667d4d2215b639e6eacc810fc90b09 GIT binary patch literal 784 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 literal 0 HcmV?d00001 diff --git a/adept/icons/cr32-action-adept_sourceseditor.png b/adept/icons/cr32-action-adept_sourceseditor.png new file mode 100644 index 0000000000000000000000000000000000000000..ff21ea58b93d845c531b5a316bb41b9ab0228bbf GIT binary patch literal 2404 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 J|4D$g{|AaXAvXX3 literal 0 HcmV?d00001 diff --git a/adept/icons/cr32-action-adept_update.png b/adept/icons/cr32-action-adept_update.png new file mode 100644 index 0000000000000000000000000000000000000000..4b0e37a11c8f0d1de4f1eba383cd6895014f4c48 GIT binary patch literal 2536 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 literal 0 HcmV?d00001 diff --git a/adept/icons/cr32-action-extender_closed.png b/adept/icons/cr32-action-extender_closed.png new file mode 100644 index 0000000000000000000000000000000000000000..cd1be0cb74d2d4deaaf409daf7954224ba9014ad GIT binary patch literal 1591 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 A@c;k- literal 0 HcmV?d00001 diff --git a/adept/icons/cr48-action-adept_distupgrade.png b/adept/icons/cr48-action-adept_distupgrade.png new file mode 100644 index 0000000000000000000000000000000000000000..fb43a0603d2442be80480c27c327c24f0c2f66d5 GIT binary patch literal 2963 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 WuXhF7m+|$k8u0fC^uFpT%K8uKiWnjQ literal 0 HcmV?d00001 diff --git a/adept/icons/cr48-action-adept_install.png b/adept/icons/cr48-action-adept_install.png new file mode 100644 index 0000000000000000000000000000000000000000..1b12d6ccae121400fe5572ee79fdf9de70b2d80c GIT binary patch literal 2352 zcmY*bdsvbO7k}YZAVn@}h?zh+?=C^|Qd+(!QJR)IudNhF$Tp{#M*7SGP0>ty&}?cq zajwOhTiCL%t)?PcUP^6i%gQhBIL#&h4M`JI^`4bDnc9;=o=DvrT3I z09b_VV@DY+{exgoMjeM-DKZ+9W2|r%0Nn2MH7%Jo#^2POU}vY5(EGMrY(fciq3w;*TZn2CIST@+WnsI0tis>8xTMgj3ORw_rZ+$ znuD4oA^$Fuu0OiK)xm+Xk=ej6WpL?3?g$KJ$Q$7rTDO4_^xRO?&7d2O>iTjo<()fj zArC|sw^&ZRs(r_08fG7&ZIBpRXaJC9f7DxZdng>j(?yx)OclM6P8dTF7FTBCWN=_J zgRaW32TD4?LQ44txx_~I~8}aTJcfv=keg#2iMI(snw0tgXMmqaJhvGG^RCFS;tz5m7ifmZhf(Q{D%ceJG^u8YFFO)uZ3q zVc)5>^FCjdc-XqP+}7?T-RE)_BE>EiLf6 zP`9$|4E7|ERAwr)A$XUTI*K5yQ8j@D{*8YG4@Z@jE0Zw<$m65uWVuvIE^S%@caSS{ zTSJP8ZxI|Nn!E*v>|%`KB8wg2nqn~t0vP3qi!4iP3%3~g7;I_xo^E88jt|)vJLF|F zV0*vp95K|gY!27aBW~Iv4{*3&8azR}RjO;9msc~o;?ulrf1h8CH0%L8uoAeEsn`+wCO{zEi9aX{n-gfJ@%r{ zHkLBbCNjLO0Z`(!h!`rWeU|&)xFY#qMV`znyR(~u+bx@z?ja909XbBya%|Tz}uCE1G?tu+fRnE|&DMOg=CX834^nCB7 z>~dosZq7-tPq2W1x+#R%$;k;NCW-I2RwX5ogGhz++||W%d4)Bm*K5@iI}asDmNiF2 z;paWaVFTO~aleHS_37DCKA+978XO1y+@T1){hP8vo%kCiQ6##PDGhbE_61D{<{Vo7 zCJD4(9t^kFTVbg!l4Nc&ufYFmxoyx{_m5LD^R8XGhOh>76=Y@S!}pVB-!vo_WCKFd z9kc-$xk62sM=eX@e<+I*e@Mod-ei4iD840+xp@!_+s9}vIP}^Qsfe<8xw$&wFA8+r zdK57BxSigPfB=geJYdo1&~{z;s}StA$=XXRm8CPJB1On zrGbq+xr1d-iEw3yeQraO#;cl^%Iy(eSMdWr$QTcDhl`6@4PoQUK1rbZEe4Smo2DgO zD(@GZ^ljW&-%#41ym0ouxnqHG5_cK1)0-zQoE&tzYH zcq8&y2qwO+cDR>OjD1U5^vYcYQV-F8ddDK6|Bo@oQ{dNXo6kg(>5j!) zUc1^2){RV!Ysjy3_;+RJ=Fc;W=gvh%m*`C|XUI&7-<8^@ZBM!^wjEJ8Jj3j7&J`%jQu)dy z&-zXompL<_Xjne+|tI(L}bZcWMO0l!MKm^92Tp*t+o3e z5dU=!ygt8wb{0<3E3n9gR!L{S-`N07U+tY1=yZacG#%P&(69V$4l-v1BH{w|&@25> zJ{uufX74{h24fS!&RpJWQ^x zP6rwt`sXBs)9H^|uzq{%XaG%GY(KDS?)i`5S?Xa-$|RhmRe!wINV`V4(A43T$Z1lC z!)hLv$sc9QcRJpeJ&~U7ge9#dFmY;w6xiAZ_V0u}N5RpJ5(HaK;Lvwm~0q#LwiD5tf)OKLtP1=qJmqy;q6j@IUUhuwXdj_0AD$q;Psbl>= z@D1i_KO+KTB+Os2!Wa}h&E(eXntfU{g(Y6(+v0`-dbMNAcOFmtn)EAsL#%`^H>s-bhgo79{4YsE9^=acgzP!M{xOJ~ F|33iY5|ID^ literal 0 HcmV?d00001 diff --git a/adept/icons/cr48-action-adept_keep.png b/adept/icons/cr48-action-adept_keep.png new file mode 100644 index 0000000000000000000000000000000000000000..753b14f468862ad4ac227b805b22df126a8286cc GIT binary patch literal 2687 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 literal 0 HcmV?d00001 diff --git a/adept/icons/cr48-action-adept_notifier_warning.png b/adept/icons/cr48-action-adept_notifier_warning.png new file mode 100644 index 0000000000000000000000000000000000000000..5add44951d2723c1889629e7222a90629319b219 GIT binary patch literal 3965 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 XCls4|@%gGv00000NkvXXu0mjfU%RTu literal 0 HcmV?d00001 diff --git a/adept/icons/cr48-action-adept_preview.png b/adept/icons/cr48-action-adept_preview.png new file mode 100644 index 0000000000000000000000000000000000000000..3dc1678cef43915b6e6f8df3699f1ade5bdd56cf GIT binary patch literal 4442 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 UKa47P!2kdN07*qoM6N<$f(RhSF#rGn literal 0 HcmV?d00001 diff --git a/adept/icons/cr48-action-adept_remove.png b/adept/icons/cr48-action-adept_remove.png new file mode 100644 index 0000000000000000000000000000000000000000..984bf23a26f4660d0473ffcd3dd0404f8ab75323 GIT binary patch literal 1164 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCmUKs7M+S!VC(K#9UIO`&C9V-A z!TD(=<%vb942~)JNvR5+xryniL8*x;m4zo$ZGd{@JY5_^DsCnH`TyVkZ~z+v;}MH1 zwhRIe&i9xZ7)_p##cX-Rc+A9%F%g*!k=wvrkEoV6TzG>>)J?!Pi4h)H(8O#Gd z8nxZu|JOn6)29vt14AQYf#-~Dk8D58x8Se&`LFfi`|J5UJa6XsH#}=)aP?QJW>9E| zxRA`!v0Jk4@3-LT*OD|o>m`48XmDQ)hp*Qt-R0?b{`PT|1W+vAcdT4>R}i zC^k2@=mj5YXV^F}7&as^v`Joycq1Vs`QKao^xyse{v7*%kmXTz*MH+1-v81If?qk7 z0bOUfufs;F^JoN&q_(n2y~X2ii9$;3jo)J)d4&*A4a6;?BHDD>Dc zuqZI;F%<1NsUqC=-Tt2OhD{rso*ZapZb?f@Y5L&!$cINGXM>Dz3x6>GCzX!g9KIO7 ztnc;5{`1r~Y`DK`{=w*T(v#*lo@|}k%Bsx4z|_GSea%U4ri0@DcekzE%I)tx{Kl|L z`D10n#0vgDzkYM;w*EhU;vX<2IQfKZGT3;)aIX!6FCWWYHUS489%mT_mJ1WUGdM8t zR`R1T1p=2|xc|Ri^54JTrw_2?>^SHp;g-?N9dqz+`?U7~hHe>$d8f;C@UH%HAScCA zf#oIht&aVlT9_Ibk`Bg2E)t7>bLI`t8=W^LYuRTsPUvjpT)*1^7>5Q~NhR^0H+(e6 z@w|2D!}I&{9jqN?%-^0dD$jE5;n{Jz#HL80{KV%|%9pGH&hG#JAE>^8!Raf5^5whx z?dy#0)KqpKbU7%YbL7mCGYJZ*1`jg-{=M$c!yj+QXw~tPb(4hy!@{G2kNGCt-(CL2 zV9)<=i22 zw%9m4xV&ATN7(#KdPb}fW5fi5KPd@G8~^VA{4NueiV|N3ono-vD0@Tu^1~-W2?4_4 zsR_wx&aaOvsk-LWCe4tVqNlpaPGz&ih24u*#GXmdk2kWZ{l#%ZA^9)w8)3a0c+%~sL?O8dGPtNhis%MNxzb`6(#mJO# lf`2ti++dF}f}#=(=eqPe|K#620xV7#JYD@<);T3K0RUHv;bZ^+ literal 0 HcmV?d00001 diff --git a/adept/icons/cr48-action-adept_sourceseditor.png b/adept/icons/cr48-action-adept_sourceseditor.png new file mode 100644 index 0000000000000000000000000000000000000000..cab2a625b8871381a949513e86a4d95022caaf5d GIT binary patch literal 3645 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 literal 0 HcmV?d00001 diff --git a/adept/icons/cr48-action-adept_update.png b/adept/icons/cr48-action-adept_update.png new file mode 100644 index 0000000000000000000000000000000000000000..248f614d299319be14cd875ef22d6443891bb5fe GIT binary patch literal 4229 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 literal 0 HcmV?d00001 diff --git a/adept/icons/cr48-action-extender_opened.png b/adept/icons/cr48-action-extender_opened.png new file mode 100644 index 0000000000000000000000000000000000000000..ee521134ca1a2abb82723b18175450cbe74f720a GIT binary patch literal 2459 zcma)8`Cn595`Ql*c?s}HKoAoT2vr0tmcvK?p5J1njC%A*cvyG2#^<&E=FntCMo(+qr))4X&F@~^+Pl{(~wU?EN zTqVctEIg#Qkdymh=B+n4_sRQ-3Xo7h`r^DRf7oDt>ScV0iak9tWko-R&+*W`62M+J>ixWx4eXbIV^B@lUS)pg{n(K*IZt9J} zCPbr8CKOMn>Mq=;PZ52gs;NGBTRzV!L0#fKWX9i1#THPCTY50_a~h=Y3oGU$k8x|K zdAutg-E3hM_P8hkNt-K|Wy{6&^0Be)@S1cFIG5@HZ=q6p93SHeVsU}PUDW($5BY(4 zku=7Gy>gnNRhm?JVve%Z_KC{-0r^)H3*35aen^~B9A6#78gt)<*c6!37@fr}G z;>dn1qia>?`;gP5-58kG9f+#SqzMVK{hE)&113xW5+bO*q>694%wLwa-u~#UVBgj%@gtuo z1D>Z|k0^5RQq#*bFO78R3t+(pdAZ(BNIhhZX+$RGJmA!Hb5HKUIFp8~dch^n@0x-oR4z<1Uk) zOQA5FYXvT5$rsC{Hp-EX>=nDqA)-r3Om|U94I#%}kM&O5dMaxW*;g#?M#Y>{mEg9@ z6M+5o`{Sj9$9bY5!uD-K#715lOxGR|l=KH_5-s}PKKYC*)R>5qcDzIvYg1Yj zMA?H8od%~N4T$c-cMa~Xbo*{H`+7^e+q2TJyGLWa9DhiID;H05JS1#iEWp@j9Dvk%{JQqg^sQ2q-Uj4wKyQO92Tb*3xfng&aTdecj?L2=T7!X5tRyj)oR;mcd0jO~b+!jGwEGj;uUE@2wD(TW4|Ikh@p~U8WZ*Nb zMqnqn(g*cGEwgR`m#mR(eA>JX`EVuu0W9ab>?w+Q!xp!Q)VN!nI3-V z*?s=WEJlckQBsrnTf>a`Gx;B6|7k{dIYarUAZkJ0DJxC)2)6>Wj#VkG;pv!^eMoKyYKQlmqIuGIcM63B&BAPo|0YBT=wpWL!Qtwe39q~j@w*^UlX2X5#I2* znpbWoF8Wjz+Ha(l&L6EAO{Y1%UM}R^kj(Ma^!_Y9M~-@a zy7b8s_PDYnDI;>Sj>rdgdP17oG#b645EEIflLH6U<+l!kOEPfmt@fH@Lx~2wIrrRG zjVt&;0Zt7UWkjFKPX_6GK??K0Jji7aY+`;7eI0|aKDDCvGRHzg?l%DS)cqjpZdKp? zu^21as1H1J+6g4OIQ6cG@YGV?uYb)g5$B+gO*W;TJwS3jTFG7Zyts42B0e%xb{D`g^F-0fPe*K%v|# vpd%6_BpYZ`1fo&%-k#bylLq`vs04vK+OK literal 0 HcmV?d00001 diff --git a/adept/icons/cr64-action-adept_notifier_warning.png b/adept/icons/cr64-action-adept_notifier_warning.png new file mode 100644 index 0000000000000000000000000000000000000000..d868276b2c8c0d3eb30e3a9fdfc870a06b53e36c GIT binary patch literal 5963 zcmV-R7qsY!P)VjK@t;MD504eV}rrQ*tp9L7fF_ENmsYcop#RtaaC=}mW|22`+J`AoVhb| z%J=(gXU@zON-6%k#at*x18M&PmHTUtEsiw-=0c$X_!lTS!u!Vn%K!nq4=e%}`xhwd zm`-dMIi>`d3q=+1BoGD8@-I*wBWUx2HvKEz`t-{y+)Zz8munZrF}qI&-T0dmX;Fc*r8fM1JgS1%UQ5pw;XCIjdC7bxQpZN7#-cD47a`%cD9jRrsqV{5XXnE-R4(1Cjp+GY9`|FK@HEWb+NOWRNX@EO&- zvK08zP#Wy9mc_oSANy44sSAhfT#KYpz9sJJXZN|AUKpcns}{wdl;Vld->cQ1Y2rQd znF#3d-$jH<(%zdME5m1<-gi+3o9)J%|3Yd{&c8s-?>+s-8_VmJVpgg7@sIP-$sXbH zjzU=kym_L*B(Y$Ic*Gn$kn4a7capc4+Mhh%HDDnfwz+5NR1; zD8&;fo=W^gwH;Fe%!OhU@Hl}4-kW|GCt#n^chNR`K=%`1=WISn&Y^Pr6gjrMOdG0C zrBo02LdoR}EXzVlMcdw1_P1#eu2srs1DxYUnavl>KW)X`;hU`;HIfww) zm88>|J~EV2baZsGd+QqJj9o=QWrqfTpmj(E@$pTLkz1MFxk@_St>>e-wDjN9hX>AK zNUaP3{x%Seo=gAzBmI)wzS0NYwji4tvTR76Ox1)Fh6LXWR!TLXNDL#7QW7Z(*IZW- zi^Zv)coJ{#I(}r}9Sh71>{&6<)3NC~f7MA%O46z%Ylp(-ISlY9@G$;p+FC1@|^Qdc>J_vYkIZ(5`btaR= zb>%?;aqw>#Uw;xy*X-kx@GFDC9!Q9SbSD3nw2YF`3)OwYfghFt;Q#8U-ts$b;?� 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 literal 0 HcmV?d00001 diff --git a/adept/installer/Makefile.am b/adept/installer/Makefile.am new file mode 100644 index 0000000..7275f75 --- /dev/null +++ b/adept/installer/Makefile.am @@ -0,0 +1,22 @@ + +bin_PROGRAMS = adept_installer +noinst_HEADERS = app.h +adept_installer_SOURCES = main.cpp app.cpp +adept_installer_LDADD = ../adept/libadept.la -lapt-front $(LIBTAGCOLL2_LIBS) $(LIB_KIO) $(LIBKDE_UI) +adept_installer_LDFLAGS = -L/usr/lib/debug +INCLUDES = $(all_includes) $(LIBEPT_CFLAGS) $(LIBTAGCOLL2_CFLAGS) $(LIBAPT_FRONT_CFLAGS) $(LIBWIBBLE_CFLAGS) -I$(srcdir)/.. -I.. +KDE_CXXFLAGS = $(USE_EXCEPTIONS) -DQT_NO_ASCII_CAST -DQT_NO_CAST_ASCII \ + -DINSTALLER_DATA=\"/usr/share/app-install\" +METASOURCES = AUTO +KDE_ICON = AUTO + +rcdir = $(kde_datadir)/adept_installer +rc_DATA = adept_installerui.rc + +#shelldesktopdir = $(kde_appsdir)/System +xdg_apps_DATA = adept_installer.desktop + +messages: rc.cpp + $(EXTRACTRC) `find . -name \*.ui -o -name \*.rc` > rc.cpp + $(EXTRACTRC) `find . -name "*.rc"` >> rc.cpp + $(XGETTEXT) *.cpp -o $(podir)/adept_installer.pot diff --git a/adept/installer/adept_installer.desktop b/adept/installer/adept_installer.desktop new file mode 100644 index 0000000..4bba24c --- /dev/null +++ b/adept/installer/adept_installer.desktop @@ -0,0 +1,45 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=Add/Remove Programs +Name[bg]=Добавяне/Премахване на програми +Name[br]=Ouzhpennañ/Lemel programmoù +Name[ca]=Afegeix/Elimina programes +Name[cs]=Přidat/odstranit programy +Name[da]=Tilføj/Fjern programmer +Name[de]=Programme hinzufügen/entfernen +Name[el]=Προσθήκη/Αφαίρεση εφαρμογών +Name[es]=Añadir/eliminar programas +Name[gl]=Engade/Quita Programas +Name[it]=Aggiungi/Rimuovi Programmi +Name[ja]=プログラムの追加と削除 +Name[ka]=პროგრამების დაყენება/წაშლა +Name[lt]=Pridėti/šalinti programas +Name[nl]=Programma's toevoegen/verwijderen +Name[pt]=Adicionar/Remover Programas +Name[sk]=Pridať/Odstrániť programy +Name[sv]=Lägg till/Ta bort program +Exec=/opt/kde3/bin/adept_installer +Categories=Qt;KDE;Core; +Icon=adept_installer +Type=Application +X-KDE-SubstituteUID=true +Comment=Adept Installer: install and remove software packages +Comment[bg]=Инсталатор Adept: инсталиране на нови софтуерни пакети +Comment[ca]=Instal·lador Adept: instal·la i elimina paquets de programari +Comment[cs]=Adept Installer: instalace a smazání softwarových balíčků +Comment[da]=Adept installationsprogram: installér og fjern programmer +Comment[de]=Adept Installationsprogramm: Softwarepakete installieren und deinstallieren +Comment[el]=Εφαρμογή ενημέρωσης λογισμικού Adept: Εγκατάσταση και αφαίρεση πακέτων λογισμικού +Comment[es]=Instalador Adept: instala y elimina paquetes de software +Comment[fr]=Installeur Adept : Installation et mise à jour de paquetages logiciels +Comment[ga]=Suiteálaí Adept: suiteáil agus bain bogearraí +Comment[gl]=Instalador de Adept; instala e borra pacotes de software +Comment[it]=Installatore Adept: installa e rimuove pacchetti di programmi +Comment[ja]=Adept Installer: ソフトウェアパッケージのインストールと削除 +Comment[ka]=Adept დამყენებელი: პაკეტების დაყენება და წაშლა +Comment[lt]=Adept tvarkytuvė: programų paketų diegimas ir šalinimas +Comment[nl]=Adept Installer: installeer en verwijder softwarepakketten +Comment[pt]=Instalador Adept: Instalar e remover pacotes de 'software' +Comment[sk]=Adept Installer: inštaluje a odstraňuje softwarové balíky +Comment[sv]=Adept installationsprogram: installera och ta bort programvarupaket +Terminal=false diff --git a/adept/installer/adept_installerui.rc b/adept/installer/adept_installerui.rc new file mode 100644 index 0000000..a4eca27 --- /dev/null +++ b/adept/installer/adept_installerui.rc @@ -0,0 +1,20 @@ + + + +

    + &Adept + + + + &Edit + + + + + &View + + + + + + diff --git a/adept/installer/app.cpp b/adept/installer/app.cpp new file mode 100644 index 0000000..7c82421 --- /dev/null +++ b/adept/installer/app.cpp @@ -0,0 +1,416 @@ +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "app.h" + +#include // EVIL + +using namespace aptFront; +using namespace cache; +using namespace utils; +using namespace adept; + +std::string GroupPolicy::groupForCategories( Range< std::string > r ) { + /* std::cerr << "groupForCategories: "; + for ( Range< std::string > i = r; i != i.end(); ++i ) { + std::cerr << *i << " "; + } + std::cerr << std::endl; */ + for ( Range< std::string > i = r; i != i.end(); ++i ) { + if ( i->find( "X-KDE-settings" ) != std::string::npos ) + return "Settings"; + if ( i->find( "X-KDE-information" ) != std::string::npos ) + return "Settings"; + } + if ( r.contains( "Development" ) ) return "Development"; + if ( !r.contains( "Education" ) ) { + if ( r.contains( "Astronomy" ) || r.contains( "Biology" ) + || r.contains( "Chemistry" ) || r.contains( "Geology" ) + || r.contains( "MedicalSoftware" ) || r.contains( "Physics" ) + || r.contains( "Math" ) || r.contains( "Science" ) ) + return "Science"; + } else { + return "Edutainment"; + } + if ( r.contains( "Game" ) ) return "Games"; + if ( r.contains( "Graphics" ) ) return "Graphics"; + if ( r.contains( "Network" ) ) return "Internet"; + if ( r.contains( "AudioVideo" ) ) return "Multimedia"; + if ( r.contains( "Office" ) ) return "Office"; + if ( r.contains( "Settings" ) ) return "Settings"; + if ( r.contains( "System" ) ) return "System"; + if ( r.contains( "Utility" ) ) { + if ( r.contains( "Accessibility" ) ) + return "Accessibility"; + return "Utilities"; + } + return "Others"; +} + +QString IconPolicy::iconForGroup( QString g ) { + if ( g == u8( "Office" ) ) return u8( "package_wordprocessing" ); + if ( g == u8( "Internet" ) ) return u8( "package_network" ); + if ( g == u8( "Science" ) ) return u8( "edu_science" ); + if ( g == u8( "Accessibility" ) ) return u8( "access" ); + if ( g == u8( "Others" ) ) return u8( "package" ); + return QString( "package_" ) + g.lower(); +} + +void WaitForLister::waiting() +{ + kdDebug() << "WaitForLister::waiting()" << endl; + /* if (app->m_list->lister()->busy()) + QTimer::singleShot( 100, this, SLOT( waiting() ) ); + else */ { + QTimer::singleShot( 0, app, slot ); + deleteLater(); + } +} + +App::App() { + + m_all = new QVBox( this ); + m_stack = new QWidgetStack( m_all ); + + m_stack->addWidget( m_loading = new QLabel( i18n( "Loading, please wait..." ), m_stack ) ); + m_loading->setAlignment( Qt::AlignHCenter | Qt::AlignVCenter ); + + m_buttons = new QHBox( m_all ); + m_editSources = new KPushButton( i18n( "Edit Software Sources" ), m_buttons ); + m_reviewChanges = new KPushButton( i18n( "Review Changes" ), m_buttons ); + QLabel *space = new QLabel( m_buttons ); // spacing + m_next = new KPushButton( i18n( "Next" ), m_buttons ); + m_quit = new KPushButton( i18n( "Quit" ), m_buttons ); + m_editSources->setEnabled( false ); + m_reviewChanges->setEnabled( false ); + m_next->setEnabled( false ); + m_quit->setEnabled( false ); + + m_buttons->setSpacing( 2 ); + m_buttons->setMargin( 2 ); + QSizePolicy buttons( QSizePolicy::Preferred, QSizePolicy::Fixed, false ); + m_buttons->setSizePolicy( buttons ); + m_next->setSizePolicy( buttons ); + m_quit->setSizePolicy( buttons ); + space->setSizePolicy( QSizePolicy( + QSizePolicy::Expanding, + QSizePolicy::Fixed, false ) ); + + setStandardToolBarMenuEnabled( false ); + createStandardStatusBarAction(); + setupActions(); + setupGUI( Keys|StatusBar|Save|Create ); + delete toolBar(); + menuBar()->hide(); + + Application::setStatusBar( statusBar() ); + + QTimer::singleShot( + 0, this, + SLOT( delayed() ) ); + + setCentralWidget( m_all ); + setMinimumSize( 400, 300 ); +} + +void App::delayed() { + + initialize(); + cache().addComponent( new component::Desktop() ); + KGlobal::dirs()->addResourceDir( + "desktopicon", + u8( INSTALLER_DATA "/icons/" ) ); + + cache().component< component::Desktop >().setPolicy( new GroupPolicy() ); + cache().component< component::Desktop >().loadDirectory( + INSTALLER_DATA "/desktop/" ); + + QFile file(QString("/usr/bin/software-properties-kde")); + if (file.exists()) { + connect( m_editSources, SIGNAL( clicked() ), this, SLOT( editSources() ) ); + m_editSources->setEnabled( true ); + } + + connect( m_reviewChanges, SIGNAL( clicked() ), this, SLOT( togglePreview() ) ); + m_reviewChanges->setEnabled( true ); + + connect( m_quit, SIGNAL( clicked() ), this, SLOT( close() ) ); + m_quit->setEnabled( true ); + + m_stack->addWidget( m_view = new InstallerView( m_stack ) ); + connect( m_view->selector(), SIGNAL( request( cache::entity::Package, + cache::component::State::Action ) ), + this, SLOT( request( cache::entity::Package, + cache::component::State::Action ) ) ); + m_stack->addWidget( m_preview = new Browser( m_stack ) ); + m_preview->searchView()->setPreviewMode(); + m_view->selector()->setPolicy( new IconPolicy() ); + + m_stack->addWidget( + m_bye = new QLabel( i18n( "Installation Complete!" ), m_stack ) ); + m_bye->setAlignment( Qt::AlignHCenter | Qt::AlignVCenter ); + + m_stack->addWidget( m_progress = new adept::AcqProgressWidget( m_stack ) ); + m_stack->addWidget( m_commitProgress = new CommitProgress( m_stack ) ); + + m_stack->raiseWidget( m_view ); + + statusBar()->clear(); + m_view->rebuild(); + start(); +} + +bool App::confirmRequest( entity::Package p, component::State::Action a ) +{ + component::Desktop &d = cache::Global::get().component< component::Desktop >(); + typedef predicate::AttributeAdaptor< entity::Desktop, + predicate::match::Exact< entity::Package > > Adaptor; + + QString t; + + if ( a == component::State::ARemove ) + t = i18n( "You selected to remove a program. Following applications " + "are part of the same package, and they will be removed." + " Are you sure you want to remove? " ); + else + return true; + // create modal dialog for the question + KDialogBase *db = new KDialogBase( KDialogBase::Plain, i18n( "Confirm action" ), + KDialogBase::Ok | KDialogBase::Cancel, + KDialogBase::Ok, this ); + QVBoxLayout *layout = new QVBoxLayout( db->plainPage() ); + layout->setSpacing( 4 ); + // db->plainPage()->setLayout( layout = new QVBoxLayout( db->plainPage() ) ); + // QVBox *vb = new QVBox( db ); + QLabel *txt = new QLabel( db->plainPage() ); + txt->setAlignment( Qt::AlignLeft | Qt::AlignTop | Qt::WordBreak ); + txt->setMinimumWidth( 500 ); + txt->setText( t ); + txt->setFixedHeight( txt->heightForWidth( 320 ) ); + txt->setSizePolicy( QSizePolicy( + QSizePolicy::Expanding, QSizePolicy::Fixed, false ) ); + DesktopList *l = new DesktopList( db->plainPage() ); + l->setMinimumHeight( 220 ); + l->setMinimumWidth( 320 ); + l->setDisplayCheckboxes( false ); + layout->addWidget( txt ); + layout->addWidget( l ); + l->insertRange( filteredRange( d.entries(), + Adaptor( &entity::Desktop::package, p ) ) ); + db->adjustSize(); + connect( db, SIGNAL( okClicked() ), this, SLOT( requestOk() ) ); + m_currentRequestOk = false; + db->exec(); + return m_currentRequestOk; +} + +void App::request( entity::Package p, component::State::Action a ) { + if ( !confirmRequest( p, a ) ) return; + RequestList::iterator rm = m_requests.end(), i; + for ( i = m_requests.begin(); i != m_requests.end(); ++i ) { + if ( i->first == p ) { + rm = i; + break; + } + } + if ( rm != m_requests.end() ) + m_requests.erase( rm ); + if ( a != component::State::AKeep ) + m_requests.push_back( std::make_pair( p, a ) ); + cache::Global::get().state().revert(); + cache::Global::get().state().replay( range( m_requests.begin(), + m_requests.end() ) ); +} + +bool App::consistent() { + int remove = 0; + RequestList::iterator i; + for ( i = m_requests.begin(); i != m_requests.end(); ++i ) { + if ( i->second == component::State::ARemove ) { + ++remove; + } + } + if ( remove >= cache::Global::get().state().removeCount() ) + return true; + return false; +} + +void App::setupActions() +{ + KStdAction::quit( kapp, SLOT( quit() ), actionCollection() ); + m_undo = KStdAction::undo( this, SLOT( undo() ), actionCollection() ); + m_redo = KStdAction::redo( this, SLOT( redo() ), actionCollection() ); + m_previewAction = new KToggleAction( + i18n( "Review Changes" ), u8( "adept_preview" ), + 0, this, SLOT( togglePreview() ), actionCollection(), + "review" ); + + setHistoryEnabled( false ); + createStandardStatusBarAction(); +} + +void App::togglePreview() +{ + if ( m_state == Preview ) { + m_previewAction->setChecked( false ); + setState( Select ); + m_stack->raiseWidget( m_view ); + notifyPostChange( 0 ); + m_reviewChanges->setEnabled(true); + } else { + setState( Preview ); + m_stack->raiseWidget( m_preview ); + setNext( i18n( "Back to Program Selection" ), SLOT( togglePreview() ) ); + m_previewAction->setChecked( true ); + m_preview->searchView()->lister()->scheduleRebuild(); + m_reviewChanges->setEnabled(false); + } +} + +void App::inspect() +{ + m_state = Inspect; + m_stack->raiseWidget( m_preview ); + setNext( i18n( "Changes are OK, proceed" ), SLOT( commit() ) ); + m_preview->searchView()->lister()->scheduleRebuild(); +} + +void App::setHistoryEnabled( bool e ) { + if ( e && history() ) { + m_undo->setEnabled( history()->canUndo() ); + m_redo->setEnabled( history()->canRedo() ); + } else { + m_undo->setEnabled( false ); + m_redo->setEnabled( false ); + } +} + +void App::notifyPreRebuild( component::Base *b ) +{ + m_requests.clear(); +} + +void App::notifyPreChange( component::Base *b ) +{ + Application::notifyPreChange( b ); + checkpoint(); +} + +void App::notifyPostChange( component::Base *b ) +{ + Application::notifyPostChange( b ); + + if ( m_state == Select ) { + if ( cache().state().changed() ) + if ( consistent() ) + setNext( i18n( "Apply Changes" ), SLOT( commit() ) ); + else + setNext( i18n( "Inspect Changes" ), SLOT( inspect() ) ); + else + disableNext(); + } +} + +void App::setNext( QString s, const char *slot ) { + m_next->setText( s ); + m_next->setEnabled( true ); + m_next->disconnect( this ); + connect( m_next, SIGNAL( clicked() ), + this, slot ); + m_quit->setEnabled( true ); +} + +void App::disableNext() { + m_next->setText( i18n( "Next" ) ); + m_next->setEnabled( false ); + disconnect( m_next, SIGNAL( clicked() ), 0, 0 ); +} + +void App::disableButtons() { + disableNext(); + m_quit->setEnabled( false ); +} + +void App::editSources() { + KProcess* softwarePropertiesProcess = new KProcess(this); + *softwarePropertiesProcess << "/usr/bin/software-properties-kde"; + softwarePropertiesProcess->start(); +} + +void App::start() { + m_stack->raiseWidget( m_view ); + m_quit->setText( i18n( "Forget Changes and Quit" ) ); + disableNext(); + setState( Select ); + notifyPostChange( 0 ); +} + +void App::commit() { + kdDebug() << "App::commit" << endl; + setState( Commit ); + disableButtons(); + setHistoryEnabled( false ); + + aptFront::Manager m; + m.setProgressCallback( m_progress->callback() ); + m.setUpdateInterval( 100000 ); + try { + m_stack->raiseWidget( m_progress ); + m.download(); + m_stack->raiseWidget( m_commitProgress ); + m.commit(); + } catch ( exception::OperationCancelled ) { + return start(); + } catch ( ... ) { + KMessageBox::sorry( + this, i18n( "There was an error commiting changes. " + "Possibly there was a problem downloading some " + "packages or the commit would break packages. " ), + i18n( "Could not commit changes" ) ); + } + + cache().addComponent( new component::Desktop() ); + cache().component< component::Desktop >().setPolicy( new GroupPolicy() ); + cache().component< component::Desktop >().loadDirectory( + INSTALLER_DATA "/desktop/" ); + QTimer::singleShot( 500, m_view, SLOT( rebuild() ) ); + + m_stack->raiseWidget( m_bye ); + m_quit->setText( i18n( "Quit" ) ); + setNext( i18n( "Back to Program Selection" ), SLOT( start() ) ); + // setNext( i18n( "Done: Quit" ), SLOT( close() ) ); +} + +#include "app.moc" diff --git a/adept/installer/app.h b/adept/installer/app.h new file mode 100644 index 0000000..02ce2e0 --- /dev/null +++ b/adept/installer/app.h @@ -0,0 +1,128 @@ +/* -*- C++ -*- */ +#ifndef TESTUI_APP_H +#define TESTUI_APP_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class QVBox; +class QWidgetStack; +class QSplitter; +class KAction; +class KPushButton; +class KProcess; +namespace adept { +class AcqProgressWidget; +} + +using namespace aptFront; +using namespace adept; + +struct GroupPolicy : cache::component::Desktop::GroupPolicy { + virtual std::string groupForCategories( utils::Range< std::string > ); +}; + +struct IconPolicy : GroupedDesktopSelector::IconPolicy { + virtual QString iconForGroup( QString ); +}; + +class App : public KMainWindow, Application { + Q_OBJECT +public: + enum State { Select, Preview, Inspect, Commit }; + void setupActions(); + ExtTerminalInterface *terminal(); + App(); + + // check if the changes in cache are consistent with what is + // checked in the tree and we don't have any suspicious removals + // or other artifacts (broken packages) + bool consistent(); + +protected slots: + void start(); + void commit(); + void inspect(); + + void delayed(); + + void undo() { Application::undo(); } + void redo() { Application::redo(); } + void checkpoint() { Application::checkpoint(); } + + void setHistoryEnabled( bool ); + + void disableNext(); + void disableButtons(); + void setNext( QString str, const char *slot ); + void togglePreview(); + void editSources(); + + void request( cache::entity::Package, cache::component::State::Action ); + + bool confirmRequest( entity::Package, component::State::Action ); + void requestOk() { m_currentRequestOk = true; } + +protected: + friend class WaitForLister; + + void setState( State s ) { m_lastState = m_state; m_state = s; } + + virtual void notifyPreRebuild( cache::component::Base * ); + virtual void notifyPostChange( cache::component::Base * ); + virtual void notifyPreChange( cache::component::Base * ); + + QWidgetStack *m_stack; + QVBox *m_all; + QHBox *m_buttons; + QLabel *m_bye, *m_loading; + KPushButton *m_next, *m_quit; + KPushButton *m_editSources, *m_reviewChanges; + + // stacked widgets + adept::AcqProgressWidget *m_progress; + adept::CommitProgress *m_commitProgress; + // adept::GroupedDesktopSelector *m_desktopSelector; + adept::InstallerView *m_view; + adept::Browser *m_preview; + + // other stuff + std::vector m_actions; + QMap< QString, QString > m_icons; + KAction *m_undo, *m_redo; + KToggleAction *m_previewAction; + State m_state, m_lastState; + + typedef std::list< component::State::Request > RequestList; + RequestList m_requests; + + // XXX hack + bool m_currentRequestOk; +}; + +class WaitForLister : public QObject { + Q_OBJECT +public: + WaitForLister( App *a, const char *s ) + : app( a ), slot( s ) + { + waiting(); + } +protected slots: + void waiting(); +protected: + App *app; + const char *slot; + +}; + +#endif diff --git a/adept/installer/hi128-app-adept_installer.png b/adept/installer/hi128-app-adept_installer.png new file mode 100644 index 0000000000000000000000000000000000000000..98f792b25aee079bfca5e37811024701845030f5 GIT binary patch literal 14185 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%0DJ&O;g3{GPI^>6@?OH}} zvy72yeJAqdn~xiF7A;{shjrCOv~OBCJ2Usz!;y%=^h_6n1J~$s_YrlA^Gq`}52;r> zk;YCtHy8u<8#kbJr04I6Zrbsp(K2@lBSUa;kZWEC>D!>T?O@w3QcBY8%jk2up%)3bKz!Kl|G zwnQFzbtCCaBKrKNNs?2i3D3ziO@Qax*tUo7OM)OICM8j!@H|NvDyB~vqjmXo)P++< z;mH1P?el}Lw126sn;Gv8Pwp&5x}JMX&ssc32(y)HjyhREUl_oQw_wGy)Wl4rYJ^Aw zfs|y;)6|atiYQwIzEsw^!9%lmUxxxj<6CtF*aPgbc8EIB{`eQ>+RYpEXb$p2L`Qz2 z-Y)Y*O$vYJN+!~4NV`X=8TuKaB*-FRq#hL@ZvPL_+YhzdbjA8+Lq3ex!1%+2#TL|} zHN=A7G0Y?}?U5WiLG15?U>G0_6c9wBB9s{S1Ouo*0|L?AjakjY*IyA_1h)a?QqX=C zd>0G@g}@1XsEwiIeT)IL!q8R)V~T+BJgiuOc(8ymtrQ1n6H(2=rSY;}e3eE#9cv9lEW+*i@5HuyI4U7M1&%t#pLg|6@(SZ;ApK+jtDi?^< zML2rw7IGJ5_8 z!Zb}ZQIH;i@4*dQ5}ARC{)vx({r5F?`%b*)U%iq~W`~#6q+)FgW<1*2v20DmD_$ag z^kq~sZKyDSXhMdy*#t{o0G6AxI@YH;=69F+`+L3I@b=EbI=t7+zlqpT UFD{`95C8xG07*qoM6N<$f+nwAB>(^b literal 0 HcmV?d00001 diff --git a/adept/installer/hi32-app-adept_installer.png b/adept/installer/hi32-app-adept_installer.png new file mode 100644 index 0000000000000000000000000000000000000000..3f79aa4dbbcd693b72486cc324cf2ab57e3b927a GIT binary patch literal 2120 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 literal 0 HcmV?d00001 diff --git a/adept/installer/main.cpp b/adept/installer/main.cpp new file mode 100644 index 0000000..079cb19 --- /dev/null +++ b/adept/installer/main.cpp @@ -0,0 +1,51 @@ +// KDE includes + +#include +#include +#include + +#include "app.h" + +static KCmdLineOptions options[] = +{ + KCmdLineLastOption +}; + +int main(int argc, char *argv[]) +{ + + KLocale::setMainCatalogue("adept_installer"); + + putenv( "QT_IM_MODULE=xim" ); + QString description = i18n("Adept Installer"); + + KAboutData aboutData( "adept_installer", + I18N_NOOP("Adept Installer"), + "2.1 Cruiser", + description.latin1(), + KAboutData::License_BSD, + I18N_NOOP("(c) 2005, 2006 Peter Rockai"), + 0, + "http://web.mornfall.net/adept.html"); + + aboutData.addAuthor ( "Peter Rockai", + I18N_NOOP("developer"), + "me at mornfall dot net", + "http://web.mornfall.net"); + + KCmdLineArgs::init( argc, argv, &aboutData ); + KCmdLineArgs::addCmdLineOptions( options ); + + KApplication app; + + KCmdLineArgs* args = KCmdLineArgs::parsedArgs(); + + KGlobal::locale()->insertCatalogue(QString::fromUtf8("libept")); + + App *ta = new App(); + + app.setMainWidget(ta); + ta->show(); + + return app.exec(); +} diff --git a/adept/kubuntu_upgrader/Makefile.am b/adept/kubuntu_upgrader/Makefile.am new file mode 100644 index 0000000..63e9569 --- /dev/null +++ b/adept/kubuntu_upgrader/Makefile.am @@ -0,0 +1,11 @@ +METASOURCES = AUTO +noinst_LTLIBRARIES = libkubuntuupgradewizard.la +libkubuntuupgradewizard_la_SOURCES = \ + upgradewizardbase.ui errordialogbase.ui \ + errordialog.cpp upgradewizard.cpp +libkubuntuupgradewizard_la_LIBADD = $(LIB_KIO) $(LIBKDE_UI) +libkubuntuupgradewizard_la_LDFLAGS = -L/usr/lib/debug $(all_libraries) + +INCLUDES = $(all_includes) +KDE_CXXFLAGS = $(USE_EXCEPTIONS) -DQT_NO_ASCII_CAST -DQT_NO_CAST_ASCII + diff --git a/adept/kubuntu_upgrader/errordialog.cpp b/adept/kubuntu_upgrader/errordialog.cpp new file mode 100644 index 0000000..0a1feb0 --- /dev/null +++ b/adept/kubuntu_upgrader/errordialog.cpp @@ -0,0 +1,48 @@ +/*************************************************************************** + * Copyright (C) 2006 by Vladimir Stefan * + * vstefan85@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#include + +#include "errordialog.h" + +ErrorDialog::ErrorDialog(QWidget* parent, QString error_text, const char* name, bool modal, WFlags fl ) + : ErrorDialogDlg(parent,name, modal,fl) +{ + errorLabel->setText( error_text ); +} + +ErrorDialog::~ErrorDialog() +{} + +/*$SPECIALIZATION$*/ +void ErrorDialog::reject() +{ + QDialog::reject(); +} + +void ErrorDialog::accept() +{ + QDialog::accept(); +} + + + +#include "errordialog.moc" + diff --git a/adept/kubuntu_upgrader/errordialog.h b/adept/kubuntu_upgrader/errordialog.h new file mode 100644 index 0000000..cdb7d14 --- /dev/null +++ b/adept/kubuntu_upgrader/errordialog.h @@ -0,0 +1,51 @@ +/*************************************************************************** + * Copyright (C) 2006 by Vladimir Stefan * + * vstefan85@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#ifndef ERRORDIALOG_H +#define ERRORDIALOG_H + +#include "errordialogbase.h" + +class QString; + +class ErrorDialog : public ErrorDialogDlg +{ + Q_OBJECT + +public: + ErrorDialog(QWidget* parent = 0, QString error_text = QString::null, const char* name = 0, bool modal = FALSE, WFlags fl = 0 ); + ~ErrorDialog(); + /*$PUBLIC_FUNCTIONS$*/ + +public slots: + /*$PUBLIC_SLOTS$*/ + +protected: + /*$PROTECTED_FUNCTIONS$*/ + +protected slots: + /*$PROTECTED_SLOTS$*/ + virtual void reject(); + virtual void accept(); + +}; + +#endif + diff --git a/adept/kubuntu_upgrader/errordialogbase.ui b/adept/kubuntu_upgrader/errordialogbase.ui new file mode 100644 index 0000000..21af975 --- /dev/null +++ b/adept/kubuntu_upgrader/errordialogbase.ui @@ -0,0 +1,67 @@ + +ErrorDialogDlg + + + errorform + + + + 0 + 0 + 222 + 163 + + + + 0 + + + Error! + + + + unnamed + + + + errorLabel + + + NoFrame + + + Plain + + + <p align="center"></p> + + + WordBreak|AlignVCenter + + + + + exitButton + + + E&xit + + + Alt+X + + + + + retryButton + + + Retr&y + + + Alt+Y + + + + + + diff --git a/adept/kubuntu_upgrader/upgradewizard.cpp b/adept/kubuntu_upgrader/upgradewizard.cpp new file mode 100644 index 0000000..9b81c4d --- /dev/null +++ b/adept/kubuntu_upgrader/upgradewizard.cpp @@ -0,0 +1,545 @@ +/*************************************************************************** + * Copyright (C) 2006 by Vladimir Stefan * + * vstefan85@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "upgradewizard.h" +#include "errordialog.h" + +DistroEntry::DistroEntry(QString *d_field) +{ + dist_field = d_field; + supported_field = false; + name_field = NULL; + version_field = NULL; + date_field = NULL; + desc_field = NULL; + release_file_url = NULL; + release_notes_url = NULL; + upgrade_tool_url = NULL; + upgrade_tool_sig_url = NULL; +} + +DistroEntry::~DistroEntry() { + free( dist_field ); + free( name_field ); + free( version_field ); + free( date_field ); + free( desc_field ); + free( release_file_url ); + free( release_notes_url ); + free( upgrade_tool_url ); + free( upgrade_tool_sig_url ); +} + +UpgradeWizard::UpgradeWizard(QWidget* parent, const char* name, bool modal, WFlags fl) + : UpgradeWizardDlg(parent,name, modal,fl) +{ + err_dlg = NULL; + + for(int i=0; ihide(); + + p = page( pageCount()-2 ); + setNextEnabled( p, false ); + + QPushButton *fin = finishButton(); + connect(fin, SIGNAL( clicked() ), this, SLOT( launchDistUpdater() ) ); + +} + +UpgradeWizard::~UpgradeWizard() +{} + +// ** FUNCTIONS ** // + +void UpgradeWizard::removeDirectory(QString directoryName) +{ + // recursively delete a directory structure + // Mar-22-2007 Billy Pollifrone + QDir dir(directoryName); + QStringList files(dir.entryList()); + for (QStringList::Iterator i=files.begin(); i!=files.end(); i++) { + QString fileName(*(i)); + if (fileName == QString(".") || fileName == QString("..")) continue; + QFileInfo fileInfo(directoryName, fileName); + if (fileInfo.isDir()) { + removeDirectory(fileInfo.absFilePath()); + } else { + QFile file(fileInfo.absFilePath()); + file.remove(); + } + } + dir.rmdir(directoryName); +} + +void UpgradeWizard::removeOldUpgradeTool() +{ + // remove old files from dist-upgrade when we check if there is a knew one since + // adept kills us before we have a chance on the same run. + // Mar-22-2007 Billy Pollifrone + QString directoryName("/tmp/kde-root"); + QString directoryFilter("adept_*.tmp*"); + QDir dir(directoryName, directoryFilter); + QStringList files(dir.entryList()); + for (QStringList::Iterator i=files.begin(); i!=files.end(); i++) { + QString fileName(*(i)); + QFileInfo fileInfo(directoryName, fileName); + if (fileInfo.isDir()) { + removeDirectory(fileInfo.absFilePath()); + } else { + QFile file(fileInfo.absFilePath()); + file.remove(); + } + } +} + +bool UpgradeWizard::checkForDistUpgrade(bool skipIntrepid, QString url, bool developmentVersion) { + removeOldUpgradeTool(); + std::cout << "UpgradeWizard::checkForDistUpgrade" << std::endl; + + if (url == QString("")) { + url = QString("http://changelogs.ubuntu.com/meta-release"); + } + + bool upgrade_available = false; + KConfig* config = KGlobal::config(); + config->setGroup("General Settings"); + QString upgradeURL; + upgradeURL = config->readEntry(QString("upgradeURL"), url); + KURL metafile_url( upgradeURL ); + + QString temp_file_location; + + if( KIO::NetAccess::download( metafile_url, temp_file_location, NULL ) ) { + QFile temp_file( temp_file_location ); + temp_file.open( IO_ReadOnly ); + QTextIStream *temp_file_stream = new QTextIStream( temp_file.readAll() ); + + // need to spawn a process to call lsb_release -c -s + // to find out which version of kubuntu we are using + KProcess *proc = new KProcess; + *proc << "lsb_release"; + *proc << "-c" << "-s"; + connect(proc, SIGNAL( receivedStdout( KProcess*, char *, int ) ), + this, SLOT( receiveDistroName( KProcess*, char *, int ) ) ); + proc->start( KProcess::Block, KProcess::Stdout ); + + current_dist = 0; + QPtrList *entry_list = parseMetafile( temp_file_stream, distro_name ); + + upgrade_dist = entry_list->last(); + DistroEntry* entry; + + // if current_dist hasn't been set in parseMetafile then we can't upgrade, since we don't know what we are + if (current_dist == 0) { + return false; + } + + // find the distro version one newer than our current one + for( entry = entry_list->first(); entry; entry = entry_list->next() ) { + //std::cout << "current date: " << (*current_dist->date_field).toString().latin1() << std::endl; + //std::cout << "entry date: " << (*entry->date_field).toString().latin1() << std::endl; + if( *entry->date_field > *current_dist->date_field /*&& entry->supported_field == true*/ ) { + if (!skipIntrepid || QString::compare(*entry->dist_field, QString("intrepid")) != 0) { + upgrade_dist = entry; + upgrade_available = true; + //std::cout << "entry date: " << (*entry->name_field).latin1() << std::endl; + break; + } + } + } + // if there isn't one newer, find the current one + if (!upgrade_available) { + for( entry = entry_list->first(); entry; entry = entry_list->next() ) { + //std::cout << "current date: " << (*current_dist->date_field).toString().latin1() << std::endl; + //std::cout << "entry date: " << (*entry->date_field).toString().latin1() << std::endl; + if( *entry->date_field >= *current_dist->date_field && developmentVersion /*&& entry->supported_field == true*/ ) { + upgrade_dist = entry; + upgrade_available = true; + //std::cout << "entry date: " << (*entry->name_field).latin1() << std::endl; + break; + } + } + } + + // DistroEntry *entry = NULL; + /*Debugging + for( entry = entry_list->first(); entry; entry = entry_list->next() ) { + std::cout << "current date: " << (*current_dist->date_field).toString().latin1() << std::endl; + std::cout << "entry date: " << (*entry->date_field).toString().latin1() << std::endl; + + std::cout << "Dist: " << *entry->dist_field->latin1() << std::endl; + std::cout << "Name: " << *entry->name_field->latin1() << std::endl; + std::cout << "Version: " << *entry->version_field->latin1() << std::endl; + std::cout << "Date: " << entry->date_field->toString( QString( "ddd, dd MMM yyyy hh:mm:ss UTC" ) ).latin1() << std::endl; + //std::cout << "Supported: " << entry->supported_field.latin1() << std::endl; + std::cout << "Description: " << *entry->desc_field->latin1() << std::endl; + std::cout << "Release-File: " << entry->release_file_url->prettyURL().latin1() << std::endl; + if( entry->release_notes_url != NULL ) { + std::cout << "ReleaseNotes: " << entry->release_notes_url->prettyURL().latin1() << std::endl; + } + if( entry->upgrade_tool_url != NULL ) { + std::cout << "UpgradeTool: " << entry->upgrade_tool_url->prettyURL().latin1() << std::endl; + } + if( entry->upgrade_tool_sig_url != NULL ) { + std::cout << "UpgradeToolSignature: " << entry->upgrade_tool_sig_url->prettyURL().latin1() << std::endl; + } + + std::cout << std::endl; + } + */ + temp_file.close(); + KIO::NetAccess::removeTempFile( temp_file_location ); + } + + return upgrade_available; +} + +QPtrList *UpgradeWizard::parseMetafile( QTextIStream *text_stream, + QString my_distro_name ) +{ + QPtrList *metafile_entries = new QPtrList(); + DistroEntry *entry = NULL; + + while( !text_stream->atEnd() ) { + + QStringList line = QStringList::split( QChar(':'), text_stream->readLine() ); + + if( !line.isEmpty() ) { + QString first = line.first(); + if( QString::compare( first, QString( "Dist" ) ) == 0 ) { + // we've encountered a new entry: + // first save the old one + if( entry != NULL ) { + // if this entry is for the current version we are running, + // then add it at the start of the list + if( QString::compare( *entry->dist_field, my_distro_name ) == 0) { + current_dist = entry; + metafile_entries->prepend( entry ); + } else { + metafile_entries->append( entry ); + } + } + // now create a new entry + line.pop_front(); + entry = new DistroEntry( new QString( line.first().stripWhiteSpace() ) ); + } + + else if( QString::compare( first, QString( "Name" ) ) == 0 ) { + if( entry != NULL ) { + line.pop_front(); + entry->name_field = new QString( line.first().stripWhiteSpace() ); + } + } + + else if( QString::compare( first, QString( "Version" ) ) == 0 ) { + if( entry != NULL ) { + line.pop_front(); + entry->version_field = new QString( line.first().stripWhiteSpace() ); + } + } + + else if( QString::compare( first, QString( "Date" ) ) == 0 ) { + if( entry != NULL ) { + line.pop_front(); + QString temp = line.join( QChar(' ') ).stripWhiteSpace(); + // get the day(verbal) + line = QStringList::split( QChar(' '), temp ); + QString day_verbal = line.first(); + day_verbal.truncate(3); + // get the date + line.pop_front(); + QString date = line.first(); + // get the month(verbal) + line.pop_front(); + QString month_verbal = line.first(); + // get the year + line.pop_front(); + QString year = line.first(); + // get the time + line.pop_front(); + QString time = line.first() + ":"; + line.pop_front(); + time += line.first() + ":"; + line.pop_front(); + time += line.first(); + + QDate the_date( QDate::fromString( day_verbal + " " + month_verbal + " " + date + " " + year) ); + QTime the_time( QTime::fromString( time ) ); + + entry->date_field = new QDateTime( the_date, the_time ); + } + } + + else if( QString::compare( first, QString( "Supported" ) ) == 0 ) { + if( entry != NULL ) { + line.pop_front(); + entry->supported_field = line.first().stripWhiteSpace().toInt(); + } + } + + else if( QString::compare( first, QString( "Description" ) ) == 0 ) { + if( entry != NULL ) { + line.pop_front(); + entry->desc_field = new QString( line.first().stripWhiteSpace() ); + } + } + + else if( QString::compare( first, QString( "Release-File" ) ) == 0 ) { + if( entry != NULL ) { + line.pop_front(); + QString http_part = line.first().stripWhiteSpace() + ":"; + line.pop_front(); + QString complete_url = http_part + line.first().stripWhiteSpace(); + entry->release_file_url = new KURL( complete_url ); + } + } + + else if( QString::compare( first, QString( "ReleaseNotes" ) ) == 0 ) { + if( entry != NULL ) { + line.pop_front(); + QString http_part = line.first().stripWhiteSpace() + ":"; + line.pop_front(); + QString complete_url = http_part + line.first().stripWhiteSpace(); + entry->release_notes_url = new KURL( complete_url ); + } + } + + else if( QString::compare( first, QString( "UpgradeTool" ) ) == 0 ) { + if( entry != NULL ) { + line.pop_front(); + QString http_part = line.first().stripWhiteSpace() + ":"; + line.pop_front(); + QString complete_url = http_part + line.first().stripWhiteSpace(); + entry->upgrade_tool_url = new KURL( complete_url ); + } + } + + else if( QString::compare( first, QString( "UpgradeToolSignature" ) ) == 0 ) { + if( entry != NULL ) { + line.pop_front(); + QString http_part = line.first().stripWhiteSpace() + ":"; + line.pop_front(); + QString complete_url = http_part + line.first().stripWhiteSpace(); + entry->upgrade_tool_sig_url = new KURL( complete_url ); + } + } + } + + + } + // add the last one + // if this entry is for the current version we are running, + // then add it at the start of the list + if( QString::compare( *entry->dist_field, my_distro_name ) == 0 ) { + current_dist = entry; + metafile_entries->prepend( entry ); + } else { + metafile_entries->append( entry ); + } + + return metafile_entries; +} + +// ** SLOTS ** // + +void UpgradeWizard::receiveDistroName( KProcess*, char *buffer, int buflen ) { + distro_name = QString::fromAscii( buffer, buflen-1 ); +} + +void UpgradeWizard::launchDistUpdater() { + QDir dir; + dir.mkdir(upgrade_tool_location+"-extract"); + + KTar tarFile(upgrade_tool_location, QString("application/x-gzip")); + tarFile.open(IO_ReadOnly); + //KArchiveDirectory* tarDirectory = tarFile.directory(); + //tarDirectory->copyTo(upgrade_tool_location+"-extract"); + tarFile.directory()->copyTo(upgrade_tool_location+"-extract", true); + + KProcess *proc = new KProcess; + proc->setWorkingDirectory(upgrade_tool_location+"-extract"); + *proc << "python" << upgrade_tool_location+"-extract/dist-upgrade.py"; + *proc << "--frontend" << "DistUpgradeViewKDE"; + proc->start( KProcess::DontCare ); + + // don't kill adept, it stops the app from running + // parentWidget()->close(); +} + +void UpgradeWizard::fetchReleaseAnnounce() { + QString temp_file_location; + bool result = false; + + if (upgrade_dist->release_notes_url == NULL) { + kdDebug() << "No release notes URL, so I'm skipping the fetch." << endl; + } else { + KURL my_url(*upgrade_dist->release_notes_url); + result = KIO::NetAccess::download(my_url, temp_file_location, NULL ); + } + + if( result ) { + emit killErrorDialog(); + err_dlg = NULL; + textBrowser1->mimeSourceFactory()->setExtensionType( QString("tmp"), "text/plain" ); + textBrowser1->setSource( temp_file_location ); + QWidget *p = page( pageCount()-2 ); + setNextEnabled( p, true ); + } else { + if(err_dlg == NULL ) { + err_dlg = new ErrorDialog( this, i18n( "Could not download the release announcement. Please check that your Internet connection is active." ), 0, 1 ); + connect( err_dlg->retryButton, SIGNAL( clicked() ), this, SLOT( fetchReleaseAnnounce() ) ); + connect( err_dlg->exitButton, SIGNAL( clicked() ), err_dlg, SLOT( close() ) ); + connect( err_dlg->exitButton, SIGNAL( clicked() ), this, SLOT( close() ) ); + connect( this, SIGNAL( killErrorDialog() ), err_dlg, SLOT( close() ) ); + err_dlg->show(); + } + } +} + +void UpgradeWizard::fetchUpgradeTool() { + // download the upgrade tool + KURL my_url(*upgrade_dist->upgrade_tool_url); + bool result = KIO::NetAccess::download( my_url, upgrade_tool_location, NULL ); + // uncomment this to use for testing if you don't want to d/l the file every time + //bool result = KIO::NetAccess::download( "/home/vladi/edgy.tar.gz", upgrade_tool_location, NULL ); + if( result ) { + emit killErrorDialog(); + err_dlg = NULL; + fetchUpgradeToolSig(); + } else { + if(err_dlg == NULL ) { + err_dlg = new ErrorDialog( this, i18n( "Could not download the upgrade tool. Please check that your Internet connection is active." ), 0, 1 ); + connect( err_dlg->retryButton, SIGNAL( clicked() ), this, SLOT( fetchUpgradeTool() ) ); + connect( err_dlg->exitButton, SIGNAL( clicked() ), err_dlg, SLOT( close() ) ); + connect( err_dlg->exitButton, SIGNAL( clicked() ), this, SLOT( close() ) ); + connect( this, SIGNAL( killErrorDialog() ), err_dlg, SLOT( close() ) ); + err_dlg->show(); + } + } +} + +void UpgradeWizard::fetchUpgradeToolSig() { + bool result = KIO::NetAccess::download( *upgrade_dist->upgrade_tool_sig_url, upgrade_tool_sig_location, NULL ); + if( result) { + emit killErrorDialog(); + err_dlg = NULL; + verifyUpgradeTool(); + } else { + if(err_dlg == NULL ) { + err_dlg = new ErrorDialog( this, i18n( "Could not download the upgrade tool's GPG signature. Please check that your Internet connection is active." ), 0, 1 ); + connect( err_dlg->retryButton, SIGNAL( clicked() ), this, SLOT( fetchUpgradeToolSig() ) ); + connect( err_dlg->exitButton, SIGNAL( clicked() ), err_dlg, SLOT( close() ) ); + connect( err_dlg->exitButton, SIGNAL( clicked() ), this, SLOT( close() ) ); + connect( this, SIGNAL( killErrorDialog() ), err_dlg, SLOT( close() ) ); + err_dlg->show(); + } + } +} + +void UpgradeWizard::verifyUpgradeTool() { + // spawn a process to call gpg and verify the signature + KProcess *proc = new KProcess; + *proc << "gpg"; + *proc << "--keyring" << "/etc/apt/trusted.gpg" << "--verify" << upgrade_tool_sig_location << upgrade_tool_location; + + proc->start( KProcess::Block, KProcess::Stdout ); + // signature verification successful if gpg exist status = 0 + if( proc->exitStatus() == 0 ) { + emit killErrorDialog(); + err_dlg = NULL; + // remove the signature file + KIO::file_delete( KURL( upgrade_tool_sig_location ), false ); + QWidget *p = page( pageCount()-1 ); + setFinishEnabled( p, true ); + textLabel3->show(); + } else { + if(err_dlg == NULL ) { + err_dlg = new ErrorDialog( this, i18n( "Could not verify the integrity of the upgrader application. This program will now exit." ), 0, 1 ); + //connect( err_dlg->retryButton, SIGNAL( clicked() ), this, SLOT( verify_upgrade_tool() ) ); + err_dlg->retryButton->setEnabled( false ); + connect( err_dlg->exitButton, SIGNAL( clicked() ), err_dlg, SLOT( close() ) ); + connect( err_dlg->exitButton, SIGNAL( clicked() ), this, SLOT( close() ) ); + connect( this, SIGNAL( killErrorDialog() ), err_dlg, SLOT( close() ) ); + err_dlg->show(); + } + } +} + +void UpgradeWizard::back() +{ + QWizard::back(); +} + +void UpgradeWizard::next() +{ + QWizard::next(); + + // page 1: d/l release announcement + // and display it on page1 + if( indexOf( currentPage() ) == 1 ) { + fetchReleaseAnnounce(); + } + else if( indexOf( currentPage() ) == 2 ) { + // remove the temp file used to store the release announcement + KIO::file_delete( KURL( textBrowser1->source() ), false ); + + // download the tool, its signature, and verify + fetchUpgradeTool(); + } +} + + + + +#include "upgradewizard.moc" + diff --git a/adept/kubuntu_upgrader/upgradewizard.h b/adept/kubuntu_upgrader/upgradewizard.h new file mode 100644 index 0000000..21b3f3c --- /dev/null +++ b/adept/kubuntu_upgrader/upgradewizard.h @@ -0,0 +1,96 @@ +/*************************************************************************** + * Copyright (C) 2006 by Vladimir Stefan * + * vstefan85@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#ifndef UPGRADEWIZARD_H +#define UPGRADEWIZARD_H + +#include + +class QString; +class QTextIStream; +class QDateTime; +class KProcess; +class KURL; +class ErrorDialog; + +// ** Represents an entry in the metafile ** // +class DistroEntry { + public: + DistroEntry(QString *d_field); + ~DistroEntry(); + QString *dist_field; + QString *name_field; + QString *version_field; + QDateTime *date_field; + bool supported_field; + QString *desc_field; + KURL *release_file_url; + KURL *release_notes_url; + KURL *upgrade_tool_url; + KURL *upgrade_tool_sig_url; +}; + +class UpgradeWizard : public UpgradeWizardDlg +{ + Q_OBJECT + +public: + UpgradeWizard(QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 ); + ~UpgradeWizard(); + + /*$PUBLIC_FUNCTIONS$*/ + bool checkForDistUpgrade(bool skipIntrepid=true, QString url=QString(""), bool developmentVersion = false); + QPtrList *parseMetafile( QTextIStream *text_stream, + QString my_distro_name ); + +public slots: + /*$PUBLIC_SLOTS$*/ + void receiveDistroName( KProcess* p, char *buffer, int buflen ); + void launchDistUpdater(); + void fetchReleaseAnnounce(); + void fetchUpgradeTool(); + void fetchUpgradeToolSig(); + void verifyUpgradeTool(); + + + signals: + void killErrorDialog(); + +protected: + /*$PROTECTED_FUNCTIONS$*/ + void removeOldUpgradeTool(); + void removeDirectory(QString directoryName); + +protected slots: + /*$PROTECTED_SLOTS$*/ + virtual void back(); + virtual void next(); + +private: + QString upgrade_tool_location; + QString upgrade_tool_sig_location; + QString distro_name; + DistroEntry* upgrade_dist; + DistroEntry* current_dist; + ErrorDialog* err_dlg; +}; + +#endif + diff --git a/adept/kubuntu_upgrader/upgradewizardbase.ui b/adept/kubuntu_upgrader/upgradewizardbase.ui new file mode 100644 index 0000000..c2d1eee --- /dev/null +++ b/adept/kubuntu_upgrader/upgradewizardbase.ui @@ -0,0 +1,143 @@ + +UpgradeWizardDlg +Vladimir Stefan + + + upgrade_wizard + + + + 0 + 0 + 584 + 446 + + + + Upgrade Wizard + + + + WizardPage + + + Upgrade Wizard + + + + unnamed + + + + textLabel1 + + + A new distribution version is available! Click next if you wish to upgrade now. + + + WordBreak|AlignVCenter + + + + + spacer1 + + + Vertical + + + Expanding + + + + 20 + 271 + + + + + + + + WizardPage + + + Upgrade Wizard + + + + unnamed + + + + textLabel2 + + + Release Announcement: + + + + + textBrowser1 + + + + + + + + + + WizardPage + + + Upgrade Wizard + + + + unnamed + + + + textLabel1_2 + + + Downloading and verifying the upgrade tool ... + + + + + textLabel3 + + + true + + + Ready to upgrade! Click finish to close the Adept Package Manager and launch the distribution upgrade tool. + + + WordBreak|AlignVCenter + + + + + spacer2 + + + Vertical + + + Expanding + + + + 20 + 231 + + + + + + + + diff --git a/adept/libadept/Makefile.am b/adept/libadept/Makefile.am new file mode 100644 index 0000000..810f516 --- /dev/null +++ b/adept/libadept/Makefile.am @@ -0,0 +1,33 @@ +noinst_LTLIBRARIES = libadept.la +libadept_la_SOURCES = \ + acqprogresswidgetui.ui acqprogress.cpp \ + tagchooser.cpp filtersidebarui.ui filtersidebar.cpp \ + application.cpp \ + tagfilterui.ui tagfilter.cpp taglist.cpp \ + packageinfoui.ui packageinfo.cpp \ + commitprogressui.ui commitprogress.cpp \ + progress.cpp \ + sourceseditorui.ui sourceseditor.cpp \ + acqprogresswidget.cpp dpkgpm.cpp \ + dpkgpm-gui.cpp \ + extendablelist.cpp \ + desktopentryui.ui desktoplist.cpp \ + groupeddesktopselector.cpp \ + packagedetailsui.ui packagedetails.cpp view.cpp \ + listerextenderui.ui lister.cpp filterlist.cpp \ + filterwidget.cpp \ + quickfilterui.ui quickfilter.cpp \ + statefilterui.ui statefilter.cpp \ + easytagfilterui.ui easytagfilter.cpp \ + actor.h threadutils.cpp \ + installerviewui.ui installerview.cpp +libadept_la_LDFLAGS = -L/usr/lib/debug $(all_libraries) +libadept_la_LIBADD = -lapt-front -ltagcoll + +INCLUDES = -I$(srcdir)/.. -I.. $(all_includes) $(LIBTAGCOLL2_CFLAGS) $(LIBAPT_FRONT_CFLAGS) +KDE_CXXFLAGS = $(USE_EXCEPTIONS) -DQT_NO_ASCII_CAST -DQT_NO_CAST_ASCII -DDEFAULT_KONSOLE_HIDDEN=true +METASOURCES = AUTO + +messages: rc.cpp + $(EXTRACTRC) `find . -name \*.ui -o -name \*.rc` > rc.cpp + $(XGETTEXT) *.cpp -o $(podir)/libadept.pot diff --git a/adept/libadept/acqprogress.cpp b/adept/libadept/acqprogress.cpp new file mode 100644 index 0000000..4b0643f --- /dev/null +++ b/adept/libadept/acqprogress.cpp @@ -0,0 +1,295 @@ +// -*- C++ -*- + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "acqprogress.h" +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +#define _(a...) (a) // XXX + +using namespace std; + +namespace adept { + +AcqStatus::Item::Item (KListView *parent, pkgAcquire::ItemDesc &item, bool hit) +: KListViewItem( parent ) +{ + m_pbcol = 0; + m_prog = new ItemProgress( 0, 0 ); + m_prog->setStatus( "waiting" ); + m_prog->setTotalSteps( 100 ); + m_item = item; + m_id = m_item.Owner->ID; + /* if (item.Owner->FileSize > 0) + setText( 1, SizeToStr( item.Owner->FileSize ).c_str() + QString( "B" ) ); */ + setText( 1, u8( item.Description ) ); + // cerr << "create: id = " << item . Owner -> ID << ", myId = " << m_item . Owner -> ID << endl; + if (hit) { + m_prog->setStatus( "hit" ); + } else + m_prog->setStatus( "waiting" ); + // QString (SizeToStr (Itm.Owner -> FileSize) . c_str ()) + QString ("B"), + // /* QString (Itm . Owner -> ID) + */ QString (Itm.Description . c_str ())); +} + +AcqStatus::Item::~Item () +{ + delete m_prog; +} + +int AcqStatus::Item::compare (QListViewItem *i, int /*col*/, bool /*ascend*/) const +{ + int id1 = m_id; + int id2 = ((Item *) i) -> m_id; + return (id2 >= id1) - (id2 <= id1); +} + +void AcqStatus::Item::pulse (pkgAcquire::Worker *w) +{ + if (w) { + if (w->TotalSize) + setStatus( "progress", long( double( + w -> CurrentSize * 100.0) + / double( w->TotalSize ) ) ); + else + setStatus( "downloading", 0 ); + } +} + +void AcqStatus::Item::setStatus( const std::string &s, int i ) +{ + m_prog->setStatus( s, i ); +} + +void AcqStatus::Item::paintCell (QPainter *p, const QColorGroup &cg, + int column, int width, int alignment ) +{ + QColorGroup _cg( cg ); + QColor c = _cg.text(); + + if ( column == m_pbcol ) { + const QRect bar = QRect( 0, 0, width, height() ); + m_prog->resize( width, height() ); + QPixmap pm = QPixmap::grabWidget( m_prog ); + // p->fillRect( bar, listView()->paletteBackgroundColor() ); + p->drawPixmap( bar.x(), bar.y(), pm ); + } else { + QPixmap pm( width, height() ); + QPainter _p( &pm ); + _cg.setColor( QColorGroup::Text, c ); + KListViewItem::paintCell( &_p, _cg, column, width, alignment ); + p->drawPixmap( 0, 0, pm ); + } +} + +AcqStatus::Item *AcqStatus::findItem (pkgAcquire::ItemDesc &Itm) +{ + if ( Itm.Owner->ID < m_idOffset ) + return 0; + if ( Itm.Owner->ID - m_idOffset >= m_items.size() ) + return 0; + return m_items[ Itm.Owner->ID - m_idOffset ]; +} + +AcqStatus::AcqStatus(QWidget *parent, const char *name) + : KListView (parent, name), m_idOffset( 0 ), m_continue( true ) +{ + // m_lastItem = 0; + addColumn( i18n( "Progress" ) ); + addColumn( i18n( "Description" ) ); + setSorting (1); + setColumnWidth (0, 220); + setColumnWidth (1, 300); + setResizeMode (LastColumn); + ID = 0; +} + +void AcqStatus::Done (pkgAcquire::ItemDesc &Itm) +{ + Item *i = findItem (Itm); + if (i) { + i->setStatus( "done" ); + } + emit statusChanged( StWaiting ); + triggerUpdate(); + KApplication::kApplication()->processEvents(); +} + +void AcqStatus::clear() +{ + KListView::clear(); + m_idOffset += m_items.size(); + m_items.clear(); // got deleted by klistview already +} + +void AcqStatus::Start() +{ + clear(); + pkgAcquireStatus::Start(); + kdDebug() << "AcqStatus::Start ()" << endl; + _config -> Set ("APT::Fetcher::Select-Timeout-Usec", 100000); + emit statusChanged( StWaiting ); + triggerUpdate(); + KApplication::kApplication()->processEvents(); +} + +void AcqStatus::IMSHit(pkgAcquire::ItemDesc &Itm) +{ + Itm.Owner->ID = ID++; + Item *i = new Item( this, Itm, true ); + // ensureItemVisible( i ); + i->setStatus( "hit" ); + m_items.push_back( i ); + + kdDebug() << "imshit called on ID = " << ID - 1 << " i = " << (void *)i << endl; + triggerUpdate(); + KApplication::kApplication()->processEvents(); +}; + +void AcqStatus::Fetch(pkgAcquire::ItemDesc &Itm) + // an item started to download +{ + Update = true; + if (Itm.Owner->Complete == true) // XXX? + return; + + Itm.Owner->ID = ID++; + + Item *i = new Item( this, Itm ); + // ensureItemVisible( i ); + m_items.push_back( i ); + + kdDebug() << "fetch called on ID = " << ID - 1 << " i = " << (void *)i << endl; + emit statusChanged( StDownloading ); + triggerUpdate(); + KApplication::kApplication()->processEvents(); +}; + +void AcqStatus::Fail(pkgAcquire::ItemDesc &Itm) + // item failed to download +{ + kdDebug() << "fail, status = " << Itm.Owner->Status + << " ID = " << Itm.Owner->ID << endl; + // Ignore certain kinds of transient failures (bad code) + if (Itm.Owner->Status == pkgAcquire::Item::StatIdle) { + kdDebug() << "fail with StatIdle, ignoring" << endl; + return; + } + + Item *i = findItem (Itm); + kdDebug() << "fail, i = " << i << endl; + if (! i) + return; + if (Itm.Owner->Status == pkgAcquire::Item::StatDone) { + i->setStatus( "ignored" ); + } else { + i->setStatus( "error" ); + } + + triggerUpdate(); + KApplication::kApplication()->processEvents(); +}; + +void AcqStatus::Stop() +{ + pkgAcquireStatus::Stop(); + emit statusChanged( StDone ); + triggerUpdate (); + KApplication::kApplication()->processEvents(); +} + +bool AcqStatus::Pulse(pkgAcquire *Owner) +{ + pkgAcquireStatus::Pulse(Owner); + + for (pkgAcquire::Worker *I = Owner->WorkersBegin(); I != 0; + I = Owner->WorkerStep(I)) { + if (I -> CurrentItem) { + Item *i = findItem (* (I -> CurrentItem)); + if (i) + i -> pulse (I); + } + } + + triggerUpdate (); + // repaint (); + + if (TotalBytes > 0) + emit totalProgress( + long( double( + (CurrentBytes + + CurrentItems)*100.0)/double(TotalBytes+TotalItems) ) ); + else + emit totalProgress (-1); + KApplication::kApplication () -> processEvents (); + + if ( m_continue ) + return true; + + m_continue = true; + return false; +} + +bool AcqStatus::MediaChange(string Media,string Drive) +{ + int res = KMessageBox::warningContinueCancel( + this, i18n( "Please insert the disc " + "labeled '%1' in the drive " + "'%2' and press enter" ).arg( + u8( Media ) ).arg( u8( Drive ) ), + i18n( "Media Change" ) ); + if ( res == KMessageBox::Cancel ) + cancel(); + return true; +} + +void AcqStatus::cancel() +{ + m_continue = false; +} + +AcqStatusDialog::AcqStatusDialog (QWidget *parent, const char *name, bool modal) + : KDialogBase( parent, name, modal, + u8( "progress dialog (FIXME: waiting for headers, done)" ), + Ok|Cancel, Cancel, true ) +{ + m_status = new AcqStatus (this, ""); + setMainWidget( m_status.data() ); + enableButton (Ok, false); + connect (m_status.data(), SIGNAL (statusChanged (AcqStatus::Status)), + this, SLOT (statusChange (AcqStatus::Status))); +} + +void AcqStatusDialog::statusChange (AcqStatus::Status st) +{ + if (st == AcqStatus::StDownloading || st == AcqStatus::StWaiting) { + enableButton (Ok, false); + // XXX: cancel should be true; but needs implementation first + enableButton (Cancel, false); + } else if (st == AcqStatus::StDone) { + enableButton (Ok, true); + enableButton (Cancel, false); + } +} + +} + +#include "acqprogress.moc" diff --git a/adept/libadept/acqprogress.h b/adept/libadept/acqprogress.h new file mode 100644 index 0000000..9510825 --- /dev/null +++ b/adept/libadept/acqprogress.h @@ -0,0 +1,127 @@ +/** -*- C++ -*- + @file adept/acqprogress.h + @author Peter Rockai +*/ + +#ifndef ACQPROGRESS_H +#define ACQPROGRESS_H + +#include +#include +#include +#include + +#include +#include +#include + +class AcqStatus; +class QLabel; +class QProgressBar; +class QSpacer; +class QGridLayout; + +namespace adept { + +class AcqStatus : public KListView, public aptFront::ProgressCallback +{ + Q_OBJECT +protected: + class ItemProgress: public KProgress { + public: + ItemProgress( QWidget *parent, const char *name = 0 ) + : KProgress( parent, name ), m_spin( 0 ) {} + void setStatus( const std::string &s, + int prog = 0 ) { + m_status = s; + if (m_status == "hit" + || m_status == "ignored" + || m_status == "done") + prog = 100; + if (m_status == "waiting") { + prog = 0; + } + if (m_status == "progress" && prog != 100) + setFormat( i18n( "downloading (%p%)" ) ); + else if (prog == 100) // who cares about hit/ignore anyway? + setFormat( i18n( "done (%p%)" ) ); + else + setFormat( m_status ); + setProgress( prog ); + } + protected: + std::string m_status; + int m_spin; + }; + class Item : public KListViewItem { + protected: + ItemProgress *m_prog; + int m_pbcol; + unsigned long m_id; + pkgAcquire::ItemDesc m_item; + + public: + Item (KListView *parent, pkgAcquire::ItemDesc &item, + bool hit = false); + virtual ~Item (); + + virtual void paintCell (QPainter *p, const QColorGroup &cg, + int column, int width, int alignment); + + void setProgress (int); + virtual int compare (QListViewItem *i, int col, bool ascend) const; + virtual void pulse (pkgAcquire::Worker *); + void setStatus( const std::string &, int = 0 ); + + void setup() { + KListViewItem::setup(); + setHeight( height() + 6 ); + } + }; + unsigned long ID; + unsigned long m_idOffset; + std::vector m_items; + bool m_continue; + +public: + + enum Status { StWaiting, StDownloading, StDone }; + + AcqStatus (QWidget *parent, const char *name); + Item *findItem (pkgAcquire::ItemDesc &Itm); + + virtual bool MediaChange (string Media,string Drive); + virtual void IMSHit (pkgAcquire::ItemDesc &Itm); + virtual void Fetch (pkgAcquire::ItemDesc &Itm); + virtual void Done (pkgAcquire::ItemDesc &Itm); + virtual void Fail (pkgAcquire::ItemDesc &Itm); + virtual void Start (); + virtual void Stop (); + void addLine (QWidget *l, QWidget *s, QWidget *prog); + void clear(); + + bool Pulse (pkgAcquire *Owner); + +public slots: + void cancel(); + +signals: + void statusChanged (AcqStatus::Status st); + void totalProgress (int percent); + + //AcqTextStatus(unsigned int &ScreenWidth,unsigned int Quiet); +}; + +class AcqStatusDialog : public KDialogBase +{ + Q_OBJECT +protected: + aptFront::SharedPtr m_status; +public: + aptFront::SharedPtr callback() { return m_status.data(); }; + AcqStatusDialog (QWidget *parent, const char *name, bool modal); +public slots: + void statusChange (AcqStatus::Status st); +}; +} +#endif diff --git a/adept/libadept/acqprogresswidget.cpp b/adept/libadept/acqprogresswidget.cpp new file mode 100644 index 0000000..dd02f03 --- /dev/null +++ b/adept/libadept/acqprogresswidget.cpp @@ -0,0 +1,53 @@ +#include +#include +#include +#include +#include "acqprogresswidget.h" +#include "acqprogress.h" + +using namespace adept; + +AcqProgressWidget::AcqProgressWidget( QWidget *parent, const char *name ) + : AcqProgressWidgetUi( parent, name ) +{ + m_statusRef = m_status; + m_progress->setTotalSteps( 100 ); + m_progress->setProgress( 0 ); + connect(m_status, SIGNAL( totalProgress( int ) ), + this, SLOT( setProgress( int ) ) ); + connect(m_status, SIGNAL( statusChanged( AcqStatus::Status ) ), + this, SLOT( statusChange( AcqStatus::Status ) ) ); + connect( m_cancel, SIGNAL( clicked() ), + m_status, SLOT( cancel() ) ); +} + +void AcqProgressWidget::statusChange( AcqStatus::Status s ) +{ + QString t; + switch (s) { + case AcqStatus::StWaiting: + t = i18n( "Waiting for headers (%p%)" ); + break; + case AcqStatus::StDownloading: + t = i18n( "Downloading (%p%)" ); + break; + case AcqStatus::StDone: + t = i18n( "Done (%p%)" ); + m_progress->setProgress( 100 ); + break; + } + m_progress->setFormat( t ); +} + +void AcqProgressWidget::setProgress( int p ) +{ + if (p < 0) { + m_progress->setTotalSteps( 0 ); + m_progress->setProgress( m_progress->progress() + 1 ); + } else { + m_progress->setTotalSteps( 100 ); + m_progress->setProgress( p ); + } +} + +#include "acqprogresswidget.moc" diff --git a/adept/libadept/acqprogresswidget.h b/adept/libadept/acqprogresswidget.h new file mode 100644 index 0000000..54359c7 --- /dev/null +++ b/adept/libadept/acqprogresswidget.h @@ -0,0 +1,30 @@ +/** -*- C++ -*- + @file adept/acqprogresswidget.h + @author Peter Rockai + @todo Close button! +*/ + +#ifndef PROGRESSWIDGET_H +# define PROGRESSWIDGET_H + +#include +#include + +namespace adept { + +class AcqProgressWidget : public AcqProgressWidgetUi { + Q_OBJECT +public: + AcqProgressWidget (QWidget *parent = 0, const char *name = 0); + aptFront::SharedPtr callback() { return m_statusRef.data(); }; +public slots: + void statusChange( AcqStatus::Status ); + void setProgress( int ); +protected: + aptFront::SharedPtr m_statusRef; +}; + +} + +#endif /* ifndef PROGRESSWIDGET_H */ + diff --git a/adept/libadept/acqprogresswidgetui.ui b/adept/libadept/acqprogresswidgetui.ui new file mode 100644 index 0000000..26baa21 --- /dev/null +++ b/adept/libadept/acqprogresswidgetui.ui @@ -0,0 +1,79 @@ + +adept::AcqProgressWidgetUi + + + adept::AcqProgressWidgetUi + + + + 0 + 0 + 705 + 289 + + + + Download Progress + + + + unnamed + + + 0 + + + + m_status + + + + 300 + 150 + + + + + + m_progress + + + + + m_cancel + + + Cancel Download + + + + + + + adept::AcqStatus +
    acqprogress.h
    + + -1 + -1 + + 0 + + 5 + 5 + 0 + 0 + + image0 +
    +
    + + + 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b149444154388dad945f4c5b551cc73fe7dc4b7b4bcba0762d45c43114323599ee6192609c51d883892ce083f1718b3ebb185f8dc91e972cf39d2d2a2f1af664b6f1e0fe3863a0718969700eb0c52142da0242a1bd6d696f7bcff101585203ceb8fd9ece39f99dcff9fe7edf939f88c562ec465f5f9fe609442c161362173c3e3eae7b7a7ac8e7f36432196cdbfe4f907c3e4f2291201e8fe338cec3737357e9e8e828aded1e229d650e1f2d51754b082110124c13a4dc5ea341eb9dc284c0558a853f3ce8cb0677ef500fde7d39d2596679e326597b8e9abb85d7a770ab16ab6983ec5a05b487a70e36f0f4e10afe408d6a558310980108478dba4a1e8233990c5d474b64ed39aa3a8fe5f3317fbf81dbd70bccfeb205947632fd74f6589c1c6ea2f70d03a58ba0c1f2c9bdc1b66de3b8256a6e11cbe7e3ee1d181b590124fe2693aeee08d223c82c3a2c24b7b874bec8f26288774f7bd054504aef0dde6e99c0eb83f9fb266323cb80a27fb0958141836044605a2ee5523393371cc646fee2da37195aa35d0c0c5b4859ac03d7e91712dcaac5adab3650a3ff9d08ef7dd8404bb48869e5d958b5b87dadc4c9a1464e9f0d0326df7ebd86bd2e310cb1bf62d384d59441f2d70a070e1c60e09489929b988681bdd9cc97170bcc4c65595f71f8e0e3301337fc24a7732467831875a47f289652b0be5e4151e6d07316c1b0c0340d8ab92023e76d66a6b2840e36d2fb7a13fee632475e6edc367ea98a90fb98b7dd6310ca0328a44761582e1bab41befabcc0ec940d28bc5e93b68e064cab84e1d9beaeb48934eac1f53b01c1b000fca496aa54b61a99fcde61662a4b4b4b23d1680be9d426173e4df3602a48ea411989a4fd590f52a8fd156b05ed9d350e3defe3cfdf4b4c7ce770ea7d3fb9f520afbe1620daeee5c26735d20b9b9cfb6811a754a439e4e5c5639a4caa1e5caf586bfc0197b78702005cb9b4cae4cd3267ce8638fe964bd72b393e39d74928d242617303a756a37f284447770dcdbffc6384a05a85de1306e9a52057c7527c7131c3c42d3f475eb2303c82d4fc3276d6811db37efeb148723082d9b08f79f97c1e5729109a9a28307cc622d2d6cdf52b2b24efe548dedb00142009862cfa879ee1a71f6cec928353511472fbf4389148b0b0e0c108081412458dfe21c9f11351e67e7358595468246d1d1e5e38a6e9e851bc39d84ab502a669331dafec0d8ec7e3e8cb06e1a881d727d1ae40180a434a8c9db129a54126ad48a7358c2b4c5352c8c374bcccdab2bb37d8719cba79fab8211f9df218e0582c261e95f8bfc04f1a1e8bc5c4dfe0a190172af6a9690000000049454e44ae426082 + + + + + adept/acqprogress.h + kprogress.h + +
    diff --git a/adept/libadept/actor.h b/adept/libadept/actor.h new file mode 100644 index 0000000..115b202 --- /dev/null +++ b/adept/libadept/actor.h @@ -0,0 +1,43 @@ +/** -*- C++ -*- + @file adept/actor.h + @author Peter Rockai +*/ + +#include +#include +#include + +#ifndef EPT_ACTOR_H +#define EPT_ACTOR_H + +namespace adept { + +using namespace aptFront; + +class EntityActor : public QObject +{ + Q_OBJECT +public: + EntityActor( actor::Bound< cache::entity::Entity > a ) + : m_actor( a ), m_dead( false ) + {} + actor::Bound< cache::entity::Entity > actor() const { + return m_actor; + } +public slots: + void act() { m_actor(); } + void destructiveAct() { + // in case we don't get deleted soon enough + if ( m_dead ) return; + m_dead = true; + act(); + deleteLater(); + } +protected: + actor::Bound< cache::entity::Entity > m_actor; + bool m_dead; +}; + +} + +#endif diff --git a/adept/libadept/application.cpp b/adept/libadept/application.cpp new file mode 100644 index 0000000..8388fa2 --- /dev/null +++ b/adept/libadept/application.cpp @@ -0,0 +1,197 @@ +/** -*- C++ -*- + @file adept/application.cpp + @author Peter Rockai +*/ + +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace adept { +using namespace cache; + +/* void WaitForLister::waiting() +{ + kdDebug() << "WaitForLister::waiting()" << endl; + bool done = true; + for ( Vector::iterator i = listers.begin(); i != listers.end(); ++i ) { + if ( (*i)->busy() ) { + done = false; + break; + } + } + if ( listers.empty() ) done = false; + if ( done ) { + QTimer::singleShot( 0, app, slot ); + deleteLater(); + } else { + QTimer::singleShot( 100, this, SLOT( waiting() ) ); + } + } */ + +Application::Application() + : m_acceptReadOnly( false ), m_main( 0 ), m_history( 0 ), m_statusBar( 0 ) +{ +} + +void Application::openCache( unsigned flags ) +{ + bool ro = m_acceptReadOnly; + bool root = ::getuid() == 0 || ::geteuid() == 0; + try { + cache::Global::get().open( flags ); + } catch (...) { + try { + cache::Global::get().open( flags | Cache::OpenReadOnly ); + if ( ro && root ) { + KMessageBox::information( + m_main, i18n( + "You will not be able to change your system settings " + "in any way (install, remove or upgrade software), " + "because another process is using the packaging system database " + "(probably some other Adept application or apt-get or " + "aptitude). Please close the other application before " + "using this one." ), + i18n( "Read Only mode: Database Locked" ) ); + } else if ( !root && ro ) { + KMessageBox::information( + m_main, i18n( + "You will not be able to change your system settings " + "in any way (install, remove or upgrade software), " + "because this application needs special administrator " + "(root) privileges. Please run it as root or " + "through kdesu or sudo programs to be able to perform " + "these actions" ), + i18n( "Read Only mode: Need root privileges" ) ); + } else if ( root && !ro ) { + KMessageBox::information( + m_main, i18n( + "Another process is using the packaging system database " + "(probably some other Adept application or apt-get or " + "aptitude). Please close the other application before " + "using this one." ), + i18n( "Database Locked" ) ); + } else if ( !root && !ro ) { + KMessageBox::information( + m_main, i18n( "This application needs special administrator " + "(root) privileges. Please run it as root or " + "through kdesu or sudo programs" ), + i18n( "Need root privileges" ) ); + } + if ( !ro ) { + kdDebug() << "cannot continue, exiting" << endl; + exit( 1 ); + } + } catch (...) { + KMessageBox::sorry( + m_main, i18n( + "The APT Database could not be opened!" + " This may be caused by incorrect APT configuration" + " or some similar problem. Try running apt-setup and" + " apt-get update in terminal and see if it helps" + " to resolve the problem." ), i18n( "Could not open cache" ) ); + exit( 1 ); + } + } +} + +void Application::initHistory() { + cache::Global::get().addComponent( + m_history = new History() ); +} + +void Application::initKDEDebconf() +{ + // xxx unhardcode the package name somehow? + if (cache::Global::get().packages() + .packageByName( "libqt-perl" ).isInstalled()) + putenv( "DEBIAN_FRONTEND=kde" ); +} + +void Application::initialize() +{ + CommitProgress::initSystem(); + aptFront::init(); + openCache(); + initKDEDebconf(); + initHistory(); + observeComponent< component::State >(); +} + +void Application::checkpoint() { + if ( !history() ) return; + setHistoryEnabled( false ); + history()->checkpoint(); + setHistoryEnabled( true ); +} + +void Application::undo() { + if ( !history() ) return; + setHistoryEnabled( false ); + history()->undo(); + setHistoryEnabled( true ); +} + +void Application::redo() { + if ( !history() ) return; + setHistoryEnabled( false ); + history()->redo(); + setHistoryEnabled( true ); +} + +QString Application::changeString() { + component::State &s = cache().state(); + return i18n( " Install %1, upgrade %2, remove %3 " ) + .arg( s.newInstallCount() ).arg( s.upgradeCount() ) + .arg( s.removeCount() ); +} + +QString Application::statusString() { + component::State &s = cache().state(); + return i18n( " %1 installed, %2 upgradable, %3 available " ) + .arg( s.installedCount() ).arg( s.upgradableCount() ) + .arg( s.availableCount() ); +} + +QString Application::sizesString() { + QString dl = cache().state().downloadSizeString(); + QString inst = cache().state().installSizeString(); + return i18n( " download: %1, installation: %2 " ).arg( dl ).arg( inst ); +} + +void Application::setStatusBar( KStatusBar *s ) { + m_statusBar = s; + if ( s ) { + s->message( i18n( "Initializing..." ) ); + s->insertItem( u8( "" ), 0 ); + s->insertItem( u8( "" ), 1 ); + s->insertItem( u8( "" ), 2 ); + adjustFontSize( s, -1 ); + + adept::Progress *pr = new adept::Progress(); + pr->setStatusBar( s ); + cache::Global::get().setProgress( pr ); + } +} + +void Application::notifyPostChange( component::Base * ) +{ + if ( m_statusBar ) { + m_statusBar->changeItem( changeString(), 0 ); + m_statusBar->changeItem( statusString(), 1 ); + m_statusBar->changeItem( sizesString(), 2 ); + } +} + +} diff --git a/adept/libadept/application.h b/adept/libadept/application.h new file mode 100644 index 0000000..74e9506 --- /dev/null +++ b/adept/libadept/application.h @@ -0,0 +1,75 @@ +/** -*- C++ -*- + @file adept/application.h + @author Peter Rockai +*/ + +#include + +#include + +#include +#include +#include + +#ifndef EPT_APPLICATION_H +#define EPT_APPLICATION_H + +class KStatusBar; + +namespace adept { +using namespace aptFront; +using cache::Cache; + +class Lister; + +struct Application : cache::Observer { + Application(); + void setAcceptReadOnly( bool ro ) { m_acceptReadOnly = ro; } + bool writeable() { return cache::Global::get().writeable(); } + Cache &cache() { return cache::Global::get(); } + void openCache( unsigned flags = Cache::OpenDefault | Cache::OpenDebtags ); + void initialize(); + void initKDEDebconf(); + void initHistory(); + void setMainWidget( QWidget *w ) { m_main = w; } + void setStatusBar( KStatusBar *s ); + virtual void checkpoint(); + virtual void undo(); + virtual void redo(); + + virtual void notifyPostChange( cache::component::Base * ); + + QString changeString(); + QString statusString(); + QString sizesString(); +protected: + virtual void setHistoryEnabled( bool ) {} + typedef cache::component::History< cache::component::State > History; + virtual History *history() { return m_history; } + bool m_acceptReadOnly; + QWidget *m_main; + KStatusBar *m_statusBar; + History *m_history; +}; + +/* class WaitForLister : public QObject { + Q_OBJECT +public: + WaitForLister( QObject *a, const char *s ) + : obj( a ), slot( s ) + { + waiting(); + } + void addLister( Lister *l ) { listers.push_back( l ); } +protected slots: + void waiting(); +protected: + QObject *obj; + const char *slot; + typedef std::vector< Lister * > Vector; + Vector listers; + }; */ + +} + +#endif diff --git a/adept/libadept/commitprogress.cpp b/adept/libadept/commitprogress.cpp new file mode 100644 index 0000000..9100d9b --- /dev/null +++ b/adept/libadept/commitprogress.cpp @@ -0,0 +1,115 @@ +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +using namespace adept; +using namespace aptFront; + +PkgSystem *CommitProgress::s_system = 0; + +void CommitProgress::initSystem() { + CommitProgress::s_system = new PkgSystem(); +} + +CommitProgress::CommitProgress( QWidget *p, const char *n ) + : CommitProgressUi( p, n ) +{ + assert( s_system ); + m_konsoleFrame->installEventFilter( this ); + loadKonsole(); + connect( s_system, SIGNAL( statusChanged( int, QString ) ), + this, SLOT( updateProgress( int, QString ) ) ); + connect( m_details, SIGNAL( clicked() ), + this, SLOT( toggleDetails() ) ); + m_progress->setTotalSteps( 100 ); +} + +bool CommitProgress::eventFilter( QObject *o, QEvent *e ) { + // o == m_konsoleFrame + if ( e->type() == QEvent::Resize ) { + QResizeEvent *re = dynamic_cast< QResizeEvent * >( e ); + if ( !re ) return false; + m_konsole->widget()->setGeometry( 0, 0, re->size().width(), re->size().height() ); + m_occlude->setGeometry( 0, 0, re->size().width(), re->size().height() ); + } + return false; +}; + +void CommitProgress::toggleDetails() +{ + if ( !m_occlude->isVisible() ) { + // if ( m_stack->visibleWidget() == m_konsole->widget() ) { // hide + // m_stack->raiseWidget( m_emptyPage ); + m_occlude->show(); + m_bottomSpace->changeSize( 10, 10, QSizePolicy::Fixed, QSizePolicy::Expanding ); + m_details->setText( i18n( "Show Details" ) ); + } else { // show + m_occlude->hide(); + // m_stack->raiseWidget( m_konsole->widget() ); + m_bottomSpace->changeSize( 10, 10, QSizePolicy::Fixed, QSizePolicy::Fixed ); + m_details->setText( i18n( "Hide Details" ) ); + } +} + +void CommitProgress::updateProgress( int p, QString msg ) +{ + m_operation->setText( msg ); + m_progress->setProgress( p ); +} + +void CommitProgress::loadKonsole() +{ + if ( s_system->terminal() ) + kdDebug() << "WARNING: Hijacking PkgSystem terminal" << endl; + + KLibFactory* factory = KLibLoader::self()->factory( "libsanekonsolepart" ); + if (!factory) + factory = KLibLoader::self()->factory( "libkonsolepart" ); + + assert( factory ); + + delete m_occlude; + m_konsole = static_cast( + factory->create( m_konsoleFrame, "konsolepart", "QObject", + u8( "KParts::ReadOnlyPart" ) ) ); + // m_konsole->widget()->setGeometry( QRect( 0, 0, 40, 40 ) ); + + m_occlude = new QFrame( m_konsoleFrame, "m_occlude" ); + // m_occlude->setGeometry( QRect( 0, 0, 10, 10 ) ); + m_occlude->setFrameShape( QFrame::NoFrame ); + + assert( terminal() ); + + terminal()->setAutoDestroy( false ); + terminal()->setAutoStartShell( false ); + // m_stack->addWidget( m_konsole->widget() ); + + QStrList l; l.append( "echo" ); l.append( "-n" ); + terminal()->startProgram( u8( "/bin/echo" ), l ); + + s_system->setTerminal( m_konsole ); + + // m_stack->raiseWidget( m_konsole->widget() ); + // m_konsole->widget()->show(); + // m_stack->raiseWidget( m_emptyPage ); + m_operation->setText( i18n( "Idle" ) ); + QTimer::singleShot( 0, this, SLOT( toggleDetails() ) ); + if ( DEFAULT_KONSOLE_HIDDEN ) + QTimer::singleShot( 0, this, SLOT( toggleDetails() ) ); + QTimer::singleShot( 0, this, SLOT( hide() ) ); +} + diff --git a/adept/libadept/commitprogress.h b/adept/libadept/commitprogress.h new file mode 100644 index 0000000..ed557d7 --- /dev/null +++ b/adept/libadept/commitprogress.h @@ -0,0 +1,41 @@ +/* -*- C++ -*- file adept/commitprogress.h + written by Peter Rockai */ + +#include +#include +#include +#include + +#ifndef EPT_COMMITPROGRESS_H +#define EPT_COMMITPROGRESS_H + +namespace adept { + +class CommitProgress : public CommitProgressUi +{ + Q_OBJECT +public: + CommitProgress( QWidget *p = 0, const char *n = 0 ); + + ExtTerminalInterface *terminal() { + return static_cast( + m_konsole->qt_cast( "ExtTerminalInterface" ) ); + } + + // needs to be called before aptFront::init() :'(( + static void initSystem(); + virtual bool eventFilter( QObject *o, QEvent *e ); + +public slots: + void updateProgress( int p, QString msg ); + void toggleDetails(); +protected: + void loadKonsole(); + KParts::Part *m_konsole; + static adept::PkgSystem *s_system; // bla... +}; + +} + + +#endif diff --git a/adept/libadept/commitprogressui.ui b/adept/libadept/commitprogressui.ui new file mode 100644 index 0000000..5ccecbf --- /dev/null +++ b/adept/libadept/commitprogressui.ui @@ -0,0 +1,197 @@ + +adept::CommitProgressUi + + + CommitProgressUi + + + + 0 + 0 + 542 + 303 + + + + Form1 + + + + unnamed + + + 1 + + + + m_konsoleFrame + + + + 5 + 7 + 0 + 0 + + + + NoFrame + + + Raised + + + + m_occlude + + + + 40 + 10 + 460 + 60 + + + + StyledPanel + + + Raised + + + + + + spacer6 + + + Vertical + + + Fixed + + + + 20 + 16 + + + + + + layout6 + + + + unnamed + + + + spacer5 + + + Horizontal + + + Fixed + + + + 20 + 20 + + + + + + layout5 + + + + unnamed + + + + m_details + + + (details) + + + + + m_progress + + + + + m_operation + + + Preparing... + + + + + + + spacer4 + + + Horizontal + + + Fixed + + + + 20 + 20 + + + + + + + + m_bottomSpace + + + Vertical + + + Expanding + + + + 20 + 80 + + + + + + spacer6_2 + + + Vertical + + + Fixed + + + + 20 + 32 + + + + + + + + + + kprogress.h + + diff --git a/adept/libadept/desktopentryui.ui b/adept/libadept/desktopentryui.ui new file mode 100644 index 0000000..a40c766 --- /dev/null +++ b/adept/libadept/desktopentryui.ui @@ -0,0 +1,116 @@ + +adept::DesktopEntryUi + + + DesktopEntryUi + + + + 0 + 0 + 509 + 52 + + + + Form1 + + + + unnamed + + + 6 + + + 5 + + + + m_icon + + + + 0 + 0 + 0 + 0 + + + + + 32 + 32 + + + + + + + + + m_check + + + + 0 + 0 + 0 + 0 + + + + + + + + + m_name + + + (name) + + + + 7 + 0 + 0 + 0 + + + + + + m_description + + + (description) + + + WordBreak|AlignVCenter + + + + + spacer2 + + + Horizontal + + + Fixed + + + + 6 + 20 + + + + + + + adept/extendablelist.h + + + diff --git a/adept/libadept/desktoplist.cpp b/adept/libadept/desktoplist.cpp new file mode 100644 index 0000000..de64f11 --- /dev/null +++ b/adept/libadept/desktoplist.cpp @@ -0,0 +1,194 @@ +/** -*- C++ -*- + @file adept/desktoplist.cpp + @author Peter Rockai +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace adept { + +DesktopEntry::DesktopEntry( QWidget *p, const char *n ) + : DesktopEntryUi( p, n ) +{ + adjustFontSize( m_description, -1 ); +} + +void DesktopEntry::resize( int w, int h ) +{ + // kdDebug() << "DesktopEntry::resize( " << w << ", " << h << " )" << endl; + int margin = layout()->margin() + layout()->spacing() * 2 + + 6 /* spacer */ + m_icon->width() + m_check->width(); + if ( m_check->isVisible() ) margin += m_check->width() + layout()->spacing(); + int hFW1 = m_name->heightForWidth( w - margin ); + int hFW2 = m_description->heightForWidth( w - margin ); + /* kdDebug() << "margin = " << margin << ", hFW1 = " << hFW1 << ", hFW2 = " + << hFW2 << endl; */ + int height = 2 * layout()->margin() + layout()->spacing() + hFW1 + hFW2; + if ( height < 32 + 2*layout()->margin() /* icon size + margin */ ) + height = 32 + 2*layout()->margin(); + // m_description->resize( w - margin, m_description->heightForWidth( w - margin ) ); + QWidget::resize( w, height ); +} + +void DesktopEntry::setItem( ExtendableItem *i ) { + m_polished = false; + ItemExtender::setItem( i ); + m_name->setText( u8( "" ) + u8( entity().name() ) + u8( "" ) ); + m_description->setText( u8( entity().description() ) ); + if ( !item()->list()->displayCheckboxes() ) { + m_check->hide(); + } + if ( !package().valid() || !package().hasVersion() ) { + setEnabled( false ); + } else { + connect( m_check, SIGNAL( toggled( bool ) ), + this, SLOT( toggled() ) ); + notifyPostChange(); + } +} + +void DesktopEntry::mousePressEvent( QMouseEvent *e ) { + kdDebug() << "DesktopEntry::mousePressEvent" << endl; + e->ignore(); +} + +void DesktopEntry::mouseReleaseEvent( QMouseEvent *e ) { + kdDebug() << "DesktopEntry::mouseReleaseEvent" << endl; + e->ignore(); +} + +void DesktopEntry::showEvent( QShowEvent *e ) { + DesktopEntryUi::showEvent( e ); + // DesktopEntryUi::polish(); + if ( m_polished ) return; + item()->list()->polishing(); + kdDebug() << "polish for " << entity().name() << endl; + QImage icon( KGlobal::iconLoader()->iconPath( entity().icon(), -32, true ) ); + if ( icon.isNull() ) { + icon = QImage( KGlobal::dirs()->findResource( "desktopicon", entity().icon() ) ); + } + m_icon->setPixmap( icon.isNull() ? item()->list()->emptyIcon() : + QPixmap( icon.smoothScale( 32, 32, QImage::ScaleMin ) ) ); + item()->list()->polished(); + m_polished = true; +} + +void DesktopEntry::toggled() { + /* if ( package().isInstalled() ) { + if ( package().markedRemove() ) + package().markKeep(); + else + package().markRemove(); + } else if ( package().markedInstall() ) + package().markKeep(); + else + package().markInstall(); */ + + if ( package().isInstalled() ) { + if ( package().markedRemove() ) + item()->list()->fireRequest( package(), component::State::AKeep ); + else + item()->list()->fireRequest( package(), component::State::ARemove ); + } else if ( package().markedInstall() ) + item()->list()->fireRequest( package(), component::State::AKeep ); + else + item()->list()->fireRequest( package(), component::State::AInstall ); + notifyPostChange(); +} + +void DesktopList::polishing() { + if ( m_polishing == 0 ) + QApplication::setOverrideCursor( QCursor( Qt::BusyCursor ) ); + m_polishing++; + if ( m_polishing % 10 == 0 ) + kapp->processEvents(); +} + +void DesktopList::polished() { + if ( m_polishing == childCount() ) + QApplication::restoreOverrideCursor(); +} + +void DesktopList::notifyPostChange( component::Base * ) { + utils::Range< ExtendableItem * > r = extenders(); + for ( ; r != r.end(); ++r ) { + dynamic_cast< DesktopEntry * >( (*r)->extender() )->notifyPostChange(); + } +} + +void DesktopEntry::notifyPostChange() { + if ( !package().valid() || !package().hasVersion() ) + return; + + m_check->blockSignals( true ); + m_check->setChecked( ( package().isInstalled() + || entity().package().markedInstall() ) + && !entity().package().markedRemove() ); + m_check->blockSignals( false ); +} + +DesktopList::DesktopList( QWidget *parent, const char *name ) + : ExtendableList( parent, name ), m_polishing( 0 ), m_displayCheckboxes( true ) +{ + observeComponent< component::State >(); + addColumn( i18n( "Application" ) ); + setResizeMode( LastColumn ); + setToggleColumn( -1 ); // no toggling, thanks + setExtenderHighlight( true ); + m_emptyIcon = QPixmap( + QImage( + KGlobal::iconLoader()->iconPath( u8( "exec" ), -32, false ) + ).smoothScale( 32, 32, QImage::ScaleMin ) ); + connect( this, SIGNAL( clicked( QListViewItem *, const QPoint &, int ) ), + this, SLOT( processClick( QListViewItem *, const QPoint &, int ) ) ); +} + +void DesktopList::processClick( QListViewItem *it, const QPoint &, int ) { + kdDebug() << "DesktopList::processClick..." << endl; + DesktopItem *i = dynamic_cast< DesktopItem * >( it ); + if ( !i ) return; + emit showDescription( i->entity() ); +} + +void DesktopList::insertRange( Range r ) { + m_range = r; + DesktopItem *last = 0; + int i = 0; + QApplication::setOverrideCursor( QCursor( Qt::BusyCursor ) ); + for( ; r != r.end(); r.advance() ) { + if ( i % 20 == 0 ) + kapp->processEvents(); + if ( !r->package( entity::Package() ).valid() ) + continue; + DesktopItem *i = last ? new DesktopItem( this, last ) : new DesktopItem( this ); + last = i; + i->setEntity( *r ); + ++ i; + } + QApplication::restoreOverrideCursor(); +} + +ItemExtender *DesktopItem::createExtender() { + return new DesktopEntry(); +} + +DesktopItem *DesktopEntry::item() const { + return dynamic_cast< DesktopItem * >( m_item ); +} + +entity::Desktop DesktopEntry::entity() const { + return item()->entity(); +} + +} diff --git a/adept/libadept/desktoplist.h b/adept/libadept/desktoplist.h new file mode 100644 index 0000000..207b9a7 --- /dev/null +++ b/adept/libadept/desktoplist.h @@ -0,0 +1,117 @@ +/** -*- C++ -*- + @file adept/desktoplist.h + @author Peter Rockai +*/ + +#include +#include + +#include +#include +#include + +#ifndef EPT_DESKTOPLIST_H +#define EPT_DESKTOPLIST_H + +class QPopupMenu; + +namespace adept { +using namespace aptFront; +using namespace aptFront::cache; + +class DesktopItem; + +class DesktopList : public ExtendableList, public cache::Observer +{ + Q_OBJECT +public: + typedef utils::Range< entity::Desktop > Range; + DesktopList( QWidget *parent = 0, const char *name = 0 ); + void insertRange( Range ); + QPixmap emptyIcon() { return m_emptyIcon; } + void polishing(); + void polished(); + + void setTitle( QString s ) { + setColumnText( 0, i18n( "Application (" ) + s + i18n( ")" ) ); + } + + void setDisplayCheckboxes( bool d ) { m_displayCheckboxes = d; } + bool displayCheckboxes() { return m_displayCheckboxes; } + virtual void notifyPostChange( cache::component::Base * ); + void fireRequest( entity::Package p, component::State::Action a ) { + emit request( p, a ); + } +protected slots: + void processClick( QListViewItem *, const QPoint &, int ); +signals: + void request( cache::entity::Package, cache::component::State::Action ); + void showDescription( cache::entity::Desktop ); +protected: + Range m_range; + QPixmap m_emptyIcon; + int m_polishing; + bool m_displayCheckboxes; +}; + +class DesktopEntry : public DesktopEntryUi +{ + Q_OBJECT +public: + DesktopEntry( QWidget * = 0, const char * = 0 ); + DesktopItem *item() const; + entity::Desktop entity() const; + void setItem( ExtendableItem * ); + entity::Package package() { return entity().package(); } + virtual void notifyPostChange(); + virtual void resize( int, int ); + // virtual void polish(); +public slots: + void toggled(); +protected: + virtual void mousePressEvent( QMouseEvent *e ); + virtual void mouseReleaseEvent( QMouseEvent *e ); + virtual void showEvent( QShowEvent * ); + bool m_polished; +}; + +class DesktopItem : public ExtendableItem +{ +public: + ItemExtender *createExtender(); + DesktopItem( DesktopList *l ) + : ExtendableItem( l ), m_delayedDone( false ) + { + } + DesktopItem( DesktopList *v, DesktopItem *i ) + : ExtendableItem( v, i ), m_delayedDone( false ) + { + } + + void setup() { + ExtendableItem::setup(); + if (m_delayedDone) + return; + m_delayedDone = true; + showExtender(); + } + + DesktopList *list() { return dynamic_cast< DesktopList * >( listView() ); } + + QString text( int ) const { return QString( "you shouldn't see this" ); } + entity::Desktop entity() const { return m_entity; } + void setEntity( entity::Desktop e ) { m_entity = e; } + + virtual bool less( const ExtendableItem *other ) const { + const DesktopItem *o = dynamic_cast< const DesktopItem * >( other ); + return entity() < o->entity(); + } + +protected: + entity::Desktop m_entity; + bool m_delayedDone:1; +}; + +} + +#endif diff --git a/adept/libadept/dpkgpm-gui.cpp b/adept/libadept/dpkgpm-gui.cpp new file mode 100644 index 0000000..828d18f --- /dev/null +++ b/adept/libadept/dpkgpm-gui.cpp @@ -0,0 +1,258 @@ +/** -*- C++ -*- + @file adept/dpkgpm-gui.cpp + @author Peter Rockai +*/ + +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +#include +#include + +using namespace aptFront; +using namespace cache; + +namespace adept { + +PkgSystem::PkgSystem() + : m_terminalPart( 0 ) +{ + std::cerr << "kapture::PkgSystem::PkgSystem()" << std::endl; + Label = "adeptDPkgSystem"; +} + +void PkgSystem::setTerminal( KParts::Part *t ) +{ + m_terminalPart = t; +} + +pkgPackageManager *PkgSystem::CreatePM( pkgDepCache *c ) const +{ + std::cerr << "kapture::PkgSystem::CreatePM()" << std::endl; + adept::DPkgPM *pm = new adept::DPkgPM( c, m_terminalPart ); + connect( pm, SIGNAL( statusChanged( int, QString ) ), + this, SIGNAL( statusChanged( int, QString ) ) ); + return pm; +} + +DPkgPM::DPkgPM( pkgDepCache *cache, KParts::Part *t ) + : aptFront::DPkgPM (cache), m_terminalPart (t) +{ +} + +bool DPkgPM::forkDpkg( char *const argv[] ) +{ + bool ok = true; + std::cerr << "adept::DPkgPM::forkDpkg ()" << std::endl; + QStrList l; + for (int i = 0; argv[i]; i ++) + l.append( argv[i] ); + + m_processRunning = true; + connect( m_terminalPart, SIGNAL( processExited( KProcess * ) ), + this, SLOT( processExit( KProcess * ) ) ); + connect( m_terminalPart, SIGNAL( processExited( const KProcess * ) ), + this, SLOT( processExitC( const KProcess * ) ) ); + connect( m_terminalPart, SIGNAL( forkedChild() ), + this, SLOT( setupDpkgChild() ) ); + + terminal()->startProgram( u8( argv[0] ), l ); + + ::close( m_dpkgPipe[1] ); + ::fcntl( m_dpkgPipe[0], F_SETFL, O_NONBLOCK ); + + while (m_processRunning) { + dpkgMonitor(); + usleep( 50000 ); + } + + if (m_exitedProcess->normalExit()) { + if (m_exitedProcess->exitStatus() != 0) { + ok = _error->Error( "Child for %s exited with error %d", + argv [0], m_exitedProcess->exitStatus()); + } + } else { + ok = _error->Error( "Child for %s was killed by signal %d", + argv [0], m_exitedProcess->exitSignal()); + } + + if (ok) // do we run scripts in case dpkg died??? + ok = runScripts ("DPkg::Post-Invoke", false); + + return ok; +} + +ExtTerminalInterface *DPkgPM::terminal() { + return static_cast( + m_terminalPart->qt_cast( "ExtTerminalInterface" ) ); +} + +bool DPkgPM::forkScript (const char *cmd, bool fP) +{ + std::cerr << "adept::DPkgPM::forkScript(\"" << cmd << "\")" << std::endl; + if (fP) { + if (pipe( m_scriptPipe ) != 0) + return _error->Errno( + "pipe","Failed to create IPC pipe to subprocess"); + SetCloseExec (m_scriptPipe[0], true); + SetCloseExec (m_scriptPipe[1], true); + } + QStrList l; + l.append ("/bin/sh"); + l.append ("-c"); + l.append (cmd); + if (fP) { + connect( m_terminalPart, SIGNAL( forkedChild() ), + this, SLOT( setupScriptPipe() ) ); + } + + connect( m_terminalPart, SIGNAL( processExited( KProcess * ) ), + this, SLOT( processExit( KProcess * ) ) ); + connect( m_terminalPart, SIGNAL( processExited( const KProcess * ) ), + this, SLOT( processExitC( const KProcess * ) ) ); + + m_processRunning = true; + terminal()->startProgram( u8( "/bin/sh" ), l); + + if (fP) { + if (!feedPackages()) + return _error->Error("Failed feeding packages to script"); + } + + while (m_processRunning) { + kapp->processEvents(); + usleep(50000); + } + + std::cerr << "END: adept::DPkgPM::forkScript(\"" + << cmd << "\")" << std::endl; + + if (m_exitedProcess->normalExit()) { + if (m_exitedProcess->exitStatus() != 0) { + return _error -> Error("Child for %s exited with error %d", + cmd, m_exitedProcess->exitStatus()); + } else { + return true; + } + } else { + return _error->Error("Child for %s was killed by signal %d", + cmd, m_exitedProcess->exitSignal()); + } +} + +void DPkgPM::processExit(KProcess *p) { + processExitC( p ); +} + +void DPkgPM::processExitC(const KProcess *p) +{ + std::cerr << "a process exited!" << std::endl; + m_processRunning = false; + m_exitedProcess = p; +} + +void DPkgPM::setupScriptPipe() +{ + // setupScript(); + // std::cerr << "setupScriptPipe()" << std::endl; + dup2 (m_scriptPipe[0], STDIN_FILENO); +} + +void DPkgPM::setupDpkgChild() +{ + // setupScript(); + // std::cerr << "setupDpkgChild()" << std::endl; + setupChild(); +} + +bool DPkgPM::Go( int ) +{ + std::cerr << "kapture::DPkgPM::Go ()" << std::endl; + statusChanged( 0, i18n( "Preparing..." ) ); + bool ret = aptFront::DPkgPM::Go(-1); + QStrList l; + l.append("echo"); + l.append("dpkg run finished!"); + terminal()->startProgram( u8( "echo" ), l ); + statusChanged( 100, i18n( "Done" ) ); + return ret; +} + +void DPkgPM::dpkgMonitor () +{ + aptFront::DPkgPM::dpkgMonitor(); + kapp->processEvents(); +} + +void DPkgPM::updateStatus( std::string pkg, std::string ev, std::string r ) +{ + std::string op, msg; + aptFront::DPkgPM::updateStatus( pkg, ev, r ); + entity::Package p = cache::Global::get().packages().packageByName( pkg ); + + if ( m_currentOp == OInstall ) { + if ( p.markedNewInstall() ) { + if ( ev == "half-installed" ) + msg = u8( i18n( "Preparing installation of %1..." ) ); + else if ( ev == "unpacked" ) + msg = u8( i18n( "Unpacking %1..." ) ); + } else if ( p.markedUpgrade() ) { + if ( ev == "half-installed" ) + msg = u8( i18n( "Preparing upgrade of %1..." ) ); + else if ( ev == "unpacked" || ev == "half-configured" ) + msg = u8( i18n( "Replacing %1 with new version..." ) ); + } + } else if ( m_currentOp == OConfigure ) { + if ( p.markedNewInstall() ) { + if ( ev == "unpacked" ) + msg = u8( i18n( "Preparing to configure %1..." ) ); + else if ( ev == "half-configured" ) + msg = u8( i18n( "Configuring %1..." ) ); + else if ( ev == "installed" ) + msg = u8( i18n( "Installed %1" ) ); + } else if ( p.markedUpgrade() ) { + if ( ev == "unpacked" ) + msg = u8( i18n( "Preparing to configure new version of %1..." ) ); + else if ( ev == "half-configured" ) + msg = u8( i18n( "Configuring new version of %1..." ) ); + else if ( ev == "installed" ) + msg = u8( i18n( "Upgraded %1" ) ); + } + } else if ( m_currentOp == ORemove ) { + if ( ev == "installed" ) + msg = u8( i18n( "Preparing to remove %1..." ) ); + else if ( ev == "half-configured" || ev == "half-installed" ) + msg = u8( i18n( "Removing %1..." ) ); + else if ( ev == "config-files" || ev == "not-installed" ) + msg = u8( i18n( "Removed %1" ) ); + } else if ( m_currentOp == OPurge ) { + if ( ev == "config-files" ) + msg = u8( i18n( "Preparing to purge %1..." ) ); + else if ( ev == "not-installed" ) + msg = u8( i18n( "Purged %1" ) ); + } + + std::cerr << "updateStatus( " << pkg << ", " << ev << ", " << r << ")" << std::endl; + std::cerr << "updateStatus: msg = " << msg << std::endl; + std::cerr << "updateStatus: seen = " << m_seenOpCount + << ", total = " << m_totalOpCount << std::endl; + statusChanged( ( m_seenOpCount * 100 ) / m_totalOpCount, + u8( msg ).arg( pkg ) + ( ( r == "") ? "" : (" (" + r + ")") ) ); +} + +} + +#include "dpkgpm-gui.moc" diff --git a/adept/libadept/dpkgpm-gui.h b/adept/libadept/dpkgpm-gui.h new file mode 100644 index 0000000..435ee7f --- /dev/null +++ b/adept/libadept/dpkgpm-gui.h @@ -0,0 +1,68 @@ +/** -*- C++ -*- + @file adept/dpkgpm-gui.h + @author Peter Rockai +*/ + +#ifndef EPT_DPKGPM_H +# define EPT_DPKGPM_H + +#include +#include +#include +#include +#include + +class KListBox; +namespace KParts { +class Part; +} + +namespace adept { + +class PkgSystem : public QObject, public debSystem +{ + Q_OBJECT +public: + PkgSystem (); + virtual pkgPackageManager *CreatePM( pkgDepCache *Cache ) const; + virtual void setTerminal( KParts::Part *t ); + KParts::Part *terminal() { return m_terminalPart; } + virtual int Score( Configuration const &Cnf ) { + return debSystem::Score (Cnf) + 2; }; +protected: + KParts::Part *m_terminalPart; +signals: + void statusChanged( int p, QString m ); +}; + +class DPkgPM : public QObject, public aptFront::DPkgPM +{ + Q_OBJECT +public: + DPkgPM (pkgDepCache *c, KParts::Part *t); + virtual bool forkDpkg (char *const argv[]); + virtual void dpkgMonitor (void); + virtual bool Go (int); + virtual bool forkScript (const char *, bool); + ExtTerminalInterface *terminal(); + virtual void updateStatus( std::string pkg, std::string ev, std::string r ); + +public slots: + void processExitC(const KProcess *p); + void processExit(KProcess *p); + void setupScriptPipe(); + void setupDpkgChild(); + +signals: + void statusChanged( int p, QString m ); + +protected: + KParts::Part *m_terminalPart; + // DPkgProgress *m_prog; + bool m_processRunning:1; + const KProcess *m_exitedProcess; +}; + +} + +#endif diff --git a/adept/libadept/dpkgpm.cpp b/adept/libadept/dpkgpm.cpp new file mode 100644 index 0000000..b38b5fb --- /dev/null +++ b/adept/libadept/dpkgpm.cpp @@ -0,0 +1,451 @@ +/** -*- C++ -*- + @file adept/dpkgpm.cpp + @author Peter Rockai +*/ + +#include +#include +#include "dpkgpm.h" +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +using namespace std; +using namespace aptFront; +using namespace cache; + +/* === PkgSystem === */ +DPkgPM::DPkgPM (pkgDepCache *C) + : pkgDPkgPM (C), m_seenOpCount( 0 ), m_totalOpCount( 0 ) +{ +} + +bool DPkgPM::Go( int ) +{ + cerr << "DPkgPM::Go()" << endl; + computeTotals(); + if (runScripts ("DPkg::Pre-Invoke", false) == false) + return false; + if (runScripts ("DPkg::Pre-Install-Pkgs", true) == false) + return false; + + for (vector::iterator I = List.begin(); I != List.end();) { + char *const *argv; + if (! setupArgs (&argv, I)) + return false; + + cerr << "running '"; + for (unsigned int k = 0; argv [k]; k++) + cerr << argv[k] << ' '; + cerr << "'" << endl; + if (_config->FindB("Debug::pkgDPkgPM",false) == true) + { + for (unsigned int k = 0; argv [k]; k++) + cerr << argv[k] << ' '; + cerr << endl; + continue; + } + + if (! forkDpkg (argv)) + return false; + delete[] argv; + if (! runScripts ("DPkg::Post-Invoke", false)) + return false; + } + return true; +} + +void DPkgPM::computeTotals() +{ + m_totalOpCount = 0; + for (vector::iterator I = List.begin(); I != List.end();I++) + { + entity::Package p = cache::Global::get().packages().packageByName( + I->Pkg.Name() ); + int x = 0; + switch ( I->Op ) { + case Item::Remove: x = 4; break; + case Item::Install: p.markedUpgrade() ? x = 3 : x = 2; break; + case Item::Purge: x = 2; break; + case Item::Configure: x = 3; break; + } + m_totalOpCount += x; + } +} + +bool DPkgPM::forkDpkg (char *const argv[]) +{ + cerr << "DPkgPM::forkDpkg ()" << endl; + cout << flush; + clog << flush; + cerr << flush; + + /* Mask off sig int/quit. We do this because dpkg also does when + it forks scripts. What happens is that when you hit ctrl-c it sends + it to all processes in the group. Since dpkg ignores the signal + it doesn't die but we do! So we must also ignore it */ + sighandler_t old_SIGQUIT = signal(SIGQUIT,SIG_IGN); + sighandler_t old_SIGINT = signal(SIGINT,SIG_IGN); + + // Fork dpkg + pid_t Child = ExecFork(); + if (Child == 0) { + if (! setupChild ()) { + cerr << "Error in dpkg post-fork setup!" << endl; + _exit (100); + } + execvp (argv [0], argv); + cerr << "Error executing dpkg!" << endl; + _exit (100); + } + + close( m_dpkgPipe[1] ); + fcntl( m_dpkgPipe[0], F_SETFL, O_NONBLOCK ); + + int Status = 0; + int ret = 0; + while ((ret = waitpid (Child, &Status, WNOHANG)) != Child) { + if (errno == EINTR || ret == 0) { + dpkgMonitor (); + usleep (200000); // 0.2 second hang + continue; + } + runScripts ("DPkg::Post-Invoke", false); + + signal(SIGQUIT,old_SIGQUIT); + signal(SIGINT,old_SIGINT); + return _error -> Errno ("waitpid","Couldn't wait for subprocess"); + } + + signal(SIGQUIT,old_SIGQUIT); + signal(SIGINT,old_SIGINT); + + // Check for an error code. + if (WIFEXITED(Status) == 0 || WEXITSTATUS(Status) != 0) + { + runScripts ("DPkg::Post-Invoke", false); + if (WIFSIGNALED(Status) != 0 && WTERMSIG(Status) == SIGSEGV) + return _error->Error("Sub-process %s received a segmentation fault.", argv [0]); + + if (WIFEXITED(Status) != 0) + return _error->Error("Sub-process %s returned an error code (%u)", argv[0], WEXITSTATUS(Status)); + + return _error->Error("Sub-process %s exited unexpectedly", argv[0]); + } + + return true; +} + +bool DPkgPM::setupArgs (char *const**a, std::vector::iterator &I) +{ + cerr << "DPkgPM::setupArgs ()" << endl; + unsigned int MaxArgs = _config->FindI("Dpkg::MaxArgs",350); + unsigned int MaxArgBytes = _config->FindI("Dpkg::MaxArgBytes",8192); + + vector::iterator J = I; + for (; J != List.end() && J->Op == I->Op; J++); + + // Generate the argument list + const char **Args = new const char *[MaxArgs + 50]; + if (J - I > (signed)MaxArgs) + J = I + MaxArgs; + + unsigned int n = 0; + unsigned long Size = 0; + string Tmp = _config->Find("Dir::Bin::dpkg","dpkg"); + Args[n++] = Tmp.c_str(); + Size += strlen(Args[n-1]); + + // Stick in any custom dpkg options + Configuration::Item const *Opts = _config->Tree("DPkg::Options"); + if (Opts != 0) + { + Opts = Opts->Child; + for (; Opts != 0; Opts = Opts->Next) + { + if (Opts->Value.empty() == true) + continue; + Args[n++] = Opts->Value.c_str(); + Size += Opts->Value.length(); + } + } + + pipe( m_dpkgPipe ); + stringstream fds; + fds << m_dpkgPipe[1]; + std::cerr << "reading end of the pipe: " << m_dpkgPipe[0] << std::endl; + + Args[n++] = "--status-fd"; + Size += strlen(Args[n-1]); + // bah, we leak a string every time we run dpkg... silly eh + Args[n++] = ( new string( fds.str() ) )->c_str(); + Size += strlen(Args[n-1]); + + switch (I->Op) + { + case Item::Remove: + Args[n++] = "--force-depends"; + Size += strlen(Args[n-1]); + Args[n++] = "--force-remove-essential"; + Size += strlen(Args[n-1]); + Args[n++] = "--remove"; + Size += strlen(Args[n-1]); + m_currentOp = ORemove; + break; + + case Item::Purge: + Args[n++] = "--force-depends"; + Size += strlen(Args[n-1]); + Args[n++] = "--force-remove-essential"; + Size += strlen(Args[n-1]); + Args[n++] = "--purge"; + Size += strlen(Args[n-1]); + m_currentOp = OPurge; + break; + + case Item::Configure: + Args[n++] = "--configure"; + Size += strlen(Args[n-1]); + m_currentOp = OConfigure; + break; + + case Item::Install: + Args[n++] = "--unpack"; + Size += strlen(Args[n-1]); + m_currentOp = OInstall; + break; + } + + // Write in the file or package names + if (I->Op == Item::Install) + { + for (;I != J && Size < MaxArgBytes; I++) + { + if (I->File[0] != '/') + return _error->Error("Internal Error, Pathname to install is not absolute '%s'",I->File.c_str()); + Args[n++] = I->File.c_str(); + Size += strlen(Args[n-1]); + } + } + else + { + for (;I != J && Size < MaxArgBytes; I++) + { + Args[n++] = I->Pkg.Name(); + Size += strlen(Args[n-1]); + } + } + Args[n] = 0; + J = I; + *a = (char *const *)Args; + return true; +} + +bool DPkgPM::setupChild () +{ + // cerr << "DPkgPM::setupChild ()" << endl; + if (chdir(_config->FindDir("DPkg::Run-Directory","/").c_str()) != 0) + return false; + + if (_config->FindB("DPkg::FlushSTDIN",true) == true && isatty(STDIN_FILENO)) + { + int Flags,dummy; + if ((Flags = fcntl(STDIN_FILENO,F_GETFL,dummy)) < 0) + return false; + + // Discard everything in stdin before forking dpkg + if (fcntl(STDIN_FILENO,F_SETFL,Flags | O_NONBLOCK) < 0) + return false; + + while (read(STDIN_FILENO,&dummy,1) == 1); + + if (fcntl(STDIN_FILENO,F_SETFL,Flags & (~(long)O_NONBLOCK)) < 0) + return false; + } + + /* No Job Control Stop Env is a magic dpkg var that prevents it + from using sigstop */ + putenv("DPKG_NO_TSTP=yes"); + close( m_dpkgPipe[0] ); + + return true; +} + +void DPkgPM::dpkgMonitor () +{ + char buf[1024]; + int r = read( m_dpkgPipe[0], buf, 1023 ); + + if ( r > 0 ) { + buf[r] = 0; + std::string b( buf ); + + // parse status updates from dpkg + while ( true ) { + std::string::size_type colon, nl = b.find( '\n' ); + m_statusBuffer.append( string( b, 0, nl ) ); + if ( nl == std::string::npos ) + break; + + // cerr << "dpkg status completed line: " << m_statusBuffer << endl; + colon = m_statusBuffer.find( ": " ); + string l( m_statusBuffer, 0, colon ); + string r( m_statusBuffer, colon + 2, string::npos ); + + if ( l == "status" ) { + colon = r.find( ": " ); + std::string p( r, 0, colon ); + r = string( r, colon + 2, string::npos ); + + colon = r.find( ": " ); + std::string e( r, 0, colon ); + if ( colon == string::npos ) + r = ""; + else + r = string( r, colon + 2, string::npos ); + updateStatus( p, e, r ); + } + + b = string( b, nl + 1, string::npos ); + m_statusBuffer = string(); + nl = b.find( '\n' ); + } + } +} + +void DPkgPM::updateStatus( std::string pkg, std::string ev, std::string r ) +{ + OpAndStatus os = std::make_pair( m_currentOp, ev ); + if ( m_seenOps[ std::make_pair( os, pkg ) ] == 0 ) { + m_seenOpCount++; + m_seenOps[ std::make_pair( os, pkg ) ] = 1; + } +} + +bool DPkgPM::runScripts (const char *Cnf, bool sP) +{ + cerr << "DPkgPM::runScripts ('" << Cnf << "', " << sP << ")" << endl; + Configuration::Item const *Opts = _config->Tree(Cnf); + if (Opts == 0 || Opts->Child == 0) + return true; + Opts = Opts->Child; + + unsigned int Count = 1; + for (; Opts != 0; Opts = Opts->Next, Count++) + { + if (Opts->Value.empty() == true) + continue; + + // Determine the protocol version + string OptSec = Opts->Value; + string::size_type Pos; + if ((Pos = OptSec.find(' ')) == string::npos || Pos == 0) + Pos = OptSec.length(); + OptSec = "DPkg::Tools::Options::" + string(Opts->Value.c_str(),Pos); + + m_version = _config->FindI (OptSec + "::Version", 1); + + // Purified Fork for running the script + // pid_t Process = ExecFork(); + forkScript (Opts->Value.c_str(), sP); + } + + return true; +} + +bool DPkgPM::SendV1Pkgs (FILE *F) +{ + bool Die = false; + for (vector::iterator I = List.begin(); I != List.end(); ++I) + { + // Only deal with packages to be installed from .deb + if (I->Op != Item::Install) + continue; + + // No errors here.. + if (I->File[0] != '/') + continue; + + /* Feed the filename of each package that is pending install + into the pipe. */ + fprintf(F,"%s\n",I->File.c_str()); + if (ferror(F) != 0) + { + Die = true; + break; + } + } + return ! Die; +} + +bool DPkgPM::forkScript (const char *cmd, bool fP) +{ + cerr << "DPkgPM::forkScript ()" << endl; + if (fP) { + if (pipe( m_scriptPipe ) != 0) + return _error -> Errno("pipe", "Failed to create IPC pipe to subprocess"); + SetCloseExec( m_scriptPipe[ 0 ], true ); + SetCloseExec( m_scriptPipe[ 1 ], true ); + } + pid_t Process = ExecFork (); + if (Process == 0) + { + setupScript (cmd, fP); + + const char *Args[4]; + Args[0] = "/bin/sh"; + Args[1] = "-c"; + Args[2] = cmd; + Args[3] = 0; + execv(Args[0],(char **)Args); + _exit(100); + } + + if (fP) { + if (! feedPackages ()) + return _error -> Error ("Failed feeding packages to script"); + } + + // Clean up the sub process + if (ExecWait (Process, cmd) == false) + return _error -> Error("Failure running script %s", cmd); +} + +void DPkgPM::setupScript (const char * /*cmd*/, bool fP) +{ + cerr << "DPkgPM::setupScript ()" << endl; + if (fP) { + dup2 (m_scriptPipe [0], STDIN_FILENO); + SetCloseExec(STDOUT_FILENO, false); + SetCloseExec(STDIN_FILENO, false); + SetCloseExec(STDERR_FILENO, false); + } +} + +bool DPkgPM::feedPackages () +{ + close(m_scriptPipe[ 0 ]); + + FILE *F = fdopen(m_scriptPipe[ 1 ], "w"); + if (F == 0) + return _error->Errno("fdopen","Faild to open new FD"); + + // Feed it the filenames. + bool Die = false; + if (m_version <= 1) + Die = !SendV1Pkgs (F); + else + Die = !SendV2Pkgs(F); + + fclose(F); + return ! Die; +} diff --git a/adept/libadept/dpkgpm.h b/adept/libadept/dpkgpm.h new file mode 100644 index 0000000..b899693 --- /dev/null +++ b/adept/libadept/dpkgpm.h @@ -0,0 +1,49 @@ +/** -*- C++ -*- + @file adept/dpkgpm.h + @author Peter Rockai +*/ + +#include +#include +#include +#include + +#ifndef DPKGPM_H +# define DPKGPM_H + +namespace aptFront { + +class DPkgPM : public pkgDPkgPM { +protected: + enum Op { ORemove, OPurge, OConfigure, OInstall }; + Op m_currentOp; + int m_dpkgPipe[2]; + int m_scriptPipe[2]; + unsigned m_version; + std::string m_statusBuffer; + typedef std::pair< Op, std::string > OpAndStatus; + typedef std::map< std::pair< OpAndStatus, std::string >, int > SeenOps; + SeenOps m_seenOps; + int m_totalOpCount; + int m_seenOpCount; +public: + DPkgPM (pkgDepCache *C); + virtual bool Go ( int ); + virtual void computeTotals(); + virtual bool setupArgs (char *const **a, std::vector::iterator &I); + virtual bool forkDpkg (char *const argv[]); + virtual bool forkScript (const char *, bool); + virtual bool runScripts (const char *, bool); + virtual bool setupChild (); + virtual void setupScript (const char *, bool); + virtual void dpkgMonitor (void); + virtual bool SendV1Pkgs (FILE *); + virtual bool feedPackages (void); + virtual void updateStatus( std::string pkg, std::string ev, std::string r ); +}; + +} + + +#endif /* ifndef DPKGPM_H */ + diff --git a/adept/libadept/easytagfilter.cpp b/adept/libadept/easytagfilter.cpp new file mode 100644 index 0000000..4fa593b --- /dev/null +++ b/adept/libadept/easytagfilter.cpp @@ -0,0 +1,82 @@ +#include +#include +#include +#include +#include +#include +#include "easytagfilter.h" + +using namespace aptFront; +using namespace adept; +using namespace Tagcoll; + +static void fillCombo( QComboBox *c, const std::string f ) { + Cache &cache = cache::Global::get(); // FIXME? + OpSet< entity::Tag > t; + t = cache.tags().tags( f ); + for (OpSet< entity::Tag >::iterator i = t.begin(); i != t.end(); ++ i) { + c->insertItem( i->name() ); + } +} + +EasyTagFilterWidget::EasyTagFilterWidget( QWidget *parent, const char *name ) + : EasyTagFilterUi( parent, name ) +{ + fillCombo( m_use, "use" ); + fillCombo( m_interface, "interface" ); + fillCombo( m_worksWith, "works-with" ); + fillCombo( m_role, "role" ); + connect( m_use, SIGNAL( activated( int ) ), + this, SLOT( widgetsChanged() ) ); + connect( m_interface, SIGNAL( activated( int ) ), + this, SLOT( widgetsChanged() ) ); + connect( m_worksWith, SIGNAL( activated( int ) ), + this, SLOT( widgetsChanged() ) ); + connect( m_role, SIGNAL( activated( int ) ), + this, SLOT( widgetsChanged() ) ); + connect( m_reset, SIGNAL( clicked() ), + this, SLOT( reset() ) ); +} + +static void setFacet( QComboBox *c, const std::string fac, + EasyTagFilter< entity::Package > &f ) +{ + if (c->currentItem()) + f.set( fac, c->currentText() ); +} + +EasyTagFilterWidget::Predicate EasyTagFilterWidget::predicate() +{ + EasyTagFilter< entity::Package > f; + setFacet( m_use, "use", f ); + setFacet( m_interface, "interface", f ); + setFacet( m_worksWith, "works-with", f ); + setFacet( m_role, "role", f ); + return predicate::adapt< entity::Entity >( f ); +} + +static void setCombo( QComboBox *c, const std::string &t ) { + c->blockSignals( true ); + if (t == "") + c->setCurrentItem( 0 ); + else + c->setCurrentText( t ); + c->blockSignals( false ); +} + +void EasyTagFilterWidget::predicateChanged() { + typedef EasyTagFilter< entity::Package > F; + F f = downcast< F >( m_pred ); + setCombo( m_use, f.get( "use" ) ); + setCombo( m_interface, f.get( "interface" ) ); + setCombo( m_role, f.get( "role" ) ); + setCombo( m_worksWith, f.get( "works-with" ) ); +} + +void EasyTagFilterWidget::reset() { + setCombo( m_use, "" ); + setCombo( m_interface, "" ); + setCombo( m_role, "" ); + setCombo( m_worksWith, "" ); + emit widgetsChanged(); +} diff --git a/adept/libadept/easytagfilter.h b/adept/libadept/easytagfilter.h new file mode 100644 index 0000000..edbe8b5 --- /dev/null +++ b/adept/libadept/easytagfilter.h @@ -0,0 +1,93 @@ +/** -*- C++ -*- + @file adept/quickfilter.h + @author Peter Rockai +*/ + +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +#ifndef EPT_EASYTAGFILTER_H +#define EPT_EASYTAGFILTER_H + +namespace adept { + +template< typename T > +struct EasyTagFilter : predicate::Implementation< T, EasyTagFilter< T > >, + InterfacingPredicate +{ + typedef std::map< std::string, std::string > Tags; + + EasyTagFilter() { + setupPredicate(); + } + + void setupPredicate() { + Cache &cache = cache::Global::get(); // FIXME? + m_op = predicate::True< T >(); + for (Tags::iterator i = m_tags.begin(); i != m_tags.end(); ++i ) { + m_op = m_op and predicate::Factory< T >::tag( + cache.tags().tagByName( i->first + "::" + i->second ) ); + // kdDebug() << t.summary() << endl; + } + } + + std::string summary() const { + std::string r( i18n( "EasyTag filter: " ).local8Bit() ); + for (Tags::const_iterator j, i = m_tags.begin(); + i != m_tags.end(); ++i ) { + j = i; ++j; + r += i->first + ": " + i->second; + if (j != m_tags.end()) + r += ", "; + } + return r; + } + + void parseArguments( const predicate::ArgumentList & ) {} + + bool operator==( const EasyTagFilter &o ) const { + return o.m_tags == m_tags; + } + + bool operator()( const T &p ) { + return m_op( p ); + } + + void set( const std::string &f, const std::string &t ) { + m_tags[f] = t; + setupPredicate(); + } + + std::string get( const std::string &f ) { + return m_tags[ f ]; + } + +protected: + Tags m_tags; + predicate::Predicate< T > m_op; +}; + +class EasyTagFilterWidget : public EasyTagFilterUi +{ + Q_OBJECT +public: + EasyTagFilterWidget( QWidget *parent, const char *name = 0 ); + virtual Predicate predicate(); +public slots: + void predicateChanged(); + void reset(); +}; + +} + +#endif diff --git a/adept/libadept/easytagfilterui.ui b/adept/libadept/easytagfilterui.ui new file mode 100644 index 0000000..998bf2b --- /dev/null +++ b/adept/libadept/easytagfilterui.ui @@ -0,0 +1,201 @@ + +adept::EasyTagFilterUi + + + EasyTagFilterUi + + + + 0 + 0 + 611 + 116 + + + + QuickFilterUi + + + + unnamed + + + 2 + + + 1 + + + + m_title + + + + 5 + 5 + 0 + 0 + + + + <b>Easy Tag Filter</b> + + + + + layout4 + + + + unnamed + + + + spacer5 + + + Horizontal + + + Fixed + + + + 20 + 20 + + + + + + layout3 + + + + unnamed + + + + textLabel4 + + + Works With: + + + + + textLabel3 + + + Role: + + + + + + Anything + + + + m_worksWith + + + + + m_reset + + + Reset Filter + + + + + + Any + + + + m_interface + + + + + textLabel1 + + + Use: + + + + + + Any + + + + m_use + + + + + + Any + + + + m_role + + + + + textLabel2 + + + Interface: + + + + + + + spacer6 + + + Horizontal + + + Expanding + + + + 130 + 20 + + + + + + + + spacer7 + + + Vertical + + + Fixed + + + + 20 + 16 + + + + + + + adept/filterlist.h + + + diff --git a/adept/libadept/extendablelist.cpp b/adept/libadept/extendablelist.cpp new file mode 100644 index 0000000..55d1013 --- /dev/null +++ b/adept/libadept/extendablelist.cpp @@ -0,0 +1,332 @@ +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +using namespace adept; + +ExtendableList::ExtendableList( QWidget *p, const char *n ) + : KListView( p, n ), + m_toggleColumn( 0 ), m_inDtor( false ), + m_extenderUpdateScheduled( false ), + m_needSort( false ), + m_extenderHighlight( false ) +{ + // kdDebug() << "connecting processClick har har" << endl; + connect( this, SIGNAL( clicked( QListViewItem *, + const QPoint &, int ) ), + this, SLOT( processClick( QListViewItem *, + const QPoint &, int ) ) ); + connect( this, SIGNAL( moved() ), + this, SLOT( delayedUpdateExtenders() ) ); + connect( this, SIGNAL( collapsed( QListViewItem * ) ), + this, SLOT( delayedUpdateExtenders() ) ); + connect( this, SIGNAL( expanded( QListViewItem * ) ), + this, SLOT( delayedUpdateExtenders() ) ); + setTreeStepSize( 15 ); + + m_baseIcon = SmallIcon( u8( "extender_closed" ) ); + m_extendedIcon = SmallIcon( u8( "extender_opened" ) ); + QImage img; + img = m_baseIcon; + KIconEffect::toGray( img, 1.0 ); + m_unextendableIcon = QPixmap( img ); +} + +void ExtendableList::keyPressEvent( QKeyEvent *e ) { + ExtendableItem *item = dynamic_cast< ExtendableItem* >( currentItem() ); + if ( item && item->extendable() ) { + if ( item->extender() && e->key() == Qt::Key_Left ) { + return item->hideExtender(); + } else if ( !item->extender() && e->key() == Qt::Key_Right ) { + return item->showExtender(); + } + } + return KListView::keyPressEvent( e ); +} + +void ExtendableList::openToplevel() { + QListViewItem *i; + for ( i = firstChild(); i != 0; i = i->nextSibling() ) { + i->setOpen( true ); + } +} + +int ExtendableList::extenderOffset( ExtendableItem *i ) +{ + int c = 0, x = 0; + + while( c < m_toggleColumn ) { + x += columnWidth( c ); + c ++; + } + + if ( m_toggleColumn >= 0 ) { + // *sigh* + if ( i->pixmap( m_toggleColumn ) ) + x += i->pixmap( m_toggleColumn )->width(); + if ( rootIsDecorated() ) + x += treeStepSize(); + if ( i->parent() ) + x += treeStepSize(); + } + + return x; +} + +void ExtendableList::updateExtender( ExtendableItem *i ) +{ + // setUpdatesEnabled( false ); + + // since updateGeometries is private, we use this dirty trick to + // get at it (since setContentsPos in QListView calls it + setContentsPos( contentsX(), contentsY() ); + + if ( !i->isVisible() || ( i->parent() && !i->parent()->isOpen() ) ) { + kdDebug() << "hiding invisible item's extender" << endl; + i->hideExtender(); + return; + } + + // QRect rect = itemRect( i ); + addChild( i->extender(), extenderOffset( i ), itemPos( i ) ); + // addChild( i->extender(), x, rect.y() ); + i->extender()->show(); + i->extender()->resize( visibleWidth() - extenderOffset( i ), + i->extender()->height() ); + if ( i->height() != i->extender()->frameSize().height() ) { + i->setHeight( i->extender()->frameSize().height() ); + delayedUpdateExtenders(); // re-update since we broke layout + } + + i->extender()->setupColors(); + + // setUpdatesEnabled( true ); + // addChild( i->extender(), x, itemPos( i ) ); + // QTimer::singleShot( 0, this, SLOT( triggerUpdate() ) ); + // QTimer::singleShot( 0, i->extender(), SLOT( setupColors() ) ); +} + +void ExtendableList::delayedUpdateExtenders() +{ + if ( m_extenderUpdateScheduled ) + return; + m_extenderUpdateScheduled = true; + // kdDebug() << "ExtendableList::delayedUpdateExtenders()" << endl; + QTimer::singleShot( 0, this, SLOT( updateExtenders() ) ); +} + +void ExtendableList::clear() +{ + kdDebug() << "ExtendableList::clear()" << endl; + KListView::clear(); + kdDebug() << "end of ExtendableList::clear()" << endl; +} + +void ExtendableList::show() +{ + KListView::show(); + updateExtenders(); +} + +void ExtendableList::showEvent( QShowEvent *e ) +{ + KListView::showEvent( e ); + updateExtenders(); +} + +void ExtendableList::resizeEvent( QResizeEvent *e ) +{ + KListView::resizeEvent( e ); + updateExtenders(); + // delayedUpdateExtenders(); +} + +void ExtendableList::updateExtenders() +{ + m_extenderUpdateScheduled = false; + setUpdatesEnabled( false ); + // updateGeometries(); + // since updateGeometries is private, we use this dirty trick to + // get at it (since setContentsPos in QListView calls it + setContentsPos( contentsX(), contentsY() ); + extendersChanged(); + kdDebug() << "ExtendableList::updateExtenders(); count = " + << m_extenders.size() << endl; + if ( m_needSort ) { + std::sort( m_extenders.begin(), m_extenders.end(), ExtendableItem::s_less ); + m_needSort = false; + } + + std::for_each( m_extenders.begin(), m_extenders.end(), + std::bind1st( std::mem_fun( &ExtendableList::updateExtender ), + this ) ); + + setUpdatesEnabled( true ); + // triggerUpdate(); + if ( !m_extenderUpdateScheduled ) + QTimer::singleShot( 0, this, SLOT( triggerUpdate() ) ); + /* if ( m_extenders.empty() ) + QTimer::singleShot( 0, this, SLOT( triggerUpdate() ) ); */ + // QTimer::singleShot( 0, this, SIGNAL( extendersChanged() ) ); +} + +void ExtendableList::addExtender( ExtendableItem *item ) +{ + m_extenders.push_back( item ); + m_needSort = true; + // std::sort( m_extenders.begin(), m_extenders.end(), ExtendableItem::s_less ); + // updateExtender( item ); + delayedUpdateExtenders(); +} + +void ExtendableList::removeExtender( ExtendableItem *i ) +{ + kdDebug() << "ExtendableList::removeExtender( " << i << " )" << endl; + m_extenders.erase( std::remove( m_extenders.begin(), + m_extenders.end(), i ), + m_extenders.end() ); + // the above retains ordering so no need to re-sort + if (!m_inDtor) + delayedUpdateExtenders(); +} + +void ExtendableList::processClick( QListViewItem *it, + const QPoint &pt, int c ) +{ + // if (! it) return; + ExtendableItem *item = dynamic_cast< ExtendableItem* >( it ); + if (!item) return; + kdDebug() << "ExtendableList::processClick (a real item)" << endl; + + if (c == m_toggleColumn) + item->toggleExtender(); + if ( item->extender() ) + item->extender()->setupColors(); + delayedUpdateExtenders(); + /* if (item->extender()) { + if (c == m_toggleColumn) + item->toggleExtender(); + } else + item->toggleExtender(); */ +} + +ExtendableList::~ExtendableList() { +} + +ExtendableList *ExtendableItem::list() +{ + return dynamic_cast< ExtendableList * >( listView() ); +} + +bool ExtendableItem::s_less( + const ExtendableItem *a, const ExtendableItem *b ) +{ + return a->less( b ); +} + +int ExtendableItem::compare( QListViewItem *i, int c, bool asc ) const +{ + ExtendableItem *o = dynamic_cast< ExtendableItem * >( i ); + return int( o->less( this ) ) - int( less( o ) ); +} + +void ExtendableItem::updateIcon() { + QPixmap p; + if ( !extender() ) { + p = list()->baseIcon(); + if ( !extendable() && !firstChild() ) { + p = list()->unextendableIcon(); + } + } else { + p = list()->extendedIcon(); + } + setPixmap( list()->toggleColumn(), p ); + + // umm hack + if ( dynamic_cast< ExtendableItem * >( parent() ) ) + dynamic_cast< ExtendableItem * >( parent() )->updateIcon(); +} + + +void ExtendableItem::toggleExtender() +{ + if (m_extender) { + setup(); + if( list() ) // this could as well be 0... bah + list()->removeExtender( this ); + delete m_extender; + m_extender = 0; + } else { + m_extender = createExtender(); + if (m_extender) { + m_extender->setItem( this ); + list()->addExtender( this ); + } + if ( !m_extender && firstChild() ) { + setOpen( !isOpen() ); + } + } + updateIcon(); +} + +void ExtendableItem::paintBranches( QPainter *p, + const QColorGroup &cg, int w, int y, int h ) +{ + /* if (!isAlternate()) + p->setBackgroundColor( + KGlobalSettings::alternateBackgroundColor() ); + p->eraseRect( 0, y, w, h ); */ + p->eraseRect( 0, 0, w, h ); +} + +/* void ExtendableItem::paintCell( QPainter *p, const QColorGroup &cg, + int column, int width, int alignment ) +{ + QPixmap pm( width, height() ); + QPainter _p( &pm ); + KListViewItem::paintCell( &_p, cg, column, width, alignment ); + p->drawPixmap( 0, 0, pm ); + } */ + + +static void setcolor( QWidget *w, ExtendableItem *i ) { + if ( i->isSelected() && i->list()->extenderHighlight() ) + w->setPaletteBackgroundColor( w->colorGroup().highlight() ); + else if ( i->isAlternate() ) + w->setPaletteBackgroundColor( + KGlobalSettings::alternateBackgroundColor() ); + else + w->setPaletteBackgroundColor( w->colorGroup().base() ); + // w->setBackgroundMode( QWidget::PaletteBase ); +} +void ItemExtender::setupColors() +{ + if ( !item() ) return; + setcolor( this, item() ); + QObjectList *chld = queryList( "QWidget" ); + QObjectListIt it( *chld ); + QWidget *o; + while ((o = dynamic_cast< QWidget * >( it.current() )) != 0) { + setcolor( o, item() ); + ++it; + } +} + +ExtendableItem::~ExtendableItem() +{ + // kdDebug() << "~ExtendableList; list = " << list() << endl; + // kdDebug() << "extender() = " << extender() << endl; + while ( firstChild() ) + delete firstChild(); // har har + if( extender() && list() ) // list() could be 0... + list()->removeExtender( this ); + if (extender()) + extender()->deleteLater(); +} diff --git a/adept/libadept/extendablelist.h b/adept/libadept/extendablelist.h new file mode 100644 index 0000000..53a901b --- /dev/null +++ b/adept/libadept/extendablelist.h @@ -0,0 +1,165 @@ +// -*- C++ -*- +#include +#include +#include +#include +#include + +#include + +#ifndef EPT_EXTENDABLELIST_H +#define EPT_EXTENDABLELIST_H +namespace adept { + +using namespace aptFront; + +class ExtendableItem; +class ExtendableList; +class ItemExtender; + +class ExtendableList : public KListView { + Q_OBJECT +public: + typedef bool(*ItemCompare)( const ExtendableItem *, + const ExtendableItem * ); + ExtendableList( QWidget *p = 0, const char *n = 0 ); + virtual ~ExtendableList(); + QPixmap extendedIcon() { return m_extendedIcon; } + QPixmap baseIcon() { return m_baseIcon; } + QPixmap unextendableIcon() { return m_unextendableIcon; } + int extenderOffset( ExtendableItem *i ); + void setExtenderHighlight( bool e ) { m_extenderHighlight = e; } + bool extenderHighlight() { return m_extenderHighlight; } +public slots: + void addExtender( ExtendableItem *i ); + void removeExtender( ExtendableItem *i ); + void updateExtender( ExtendableItem *i ); + void delayedUpdateExtenders(); + void updateExtenders(); + void setToggleColumn( int c ) { + m_toggleColumn = c; + } + unsigned toggleColumn() { return m_toggleColumn; } + virtual void show(); + virtual void clear(); + utils::Range< ExtendableItem * > extenders() { + return utils::range( m_extenders.begin(), m_extenders.end() ); } + void openToplevel(); +protected slots: + void processClick( QListViewItem *, const QPoint &, int ); +signals: + void extendersChanged(); +protected: + virtual void resizeEvent( QResizeEvent * ); + virtual void showEvent( QShowEvent * ); + virtual void keyPressEvent( QKeyEvent * ); + std::vector< ExtendableItem * > m_extenders; + QPixmap m_extendedIcon; + QPixmap m_baseIcon; + QPixmap m_unextendableIcon; + int m_toggleColumn; + bool m_inDtor:1; + bool m_extenderUpdateScheduled:1; + bool m_needSort:1; + bool m_extenderHighlight:1; +}; + +class ExtendableItem : public KListViewItem { +public: + + ExtendableItem( ExtendableList *l ) + : KListViewItem( l ), m_extender( 0 ) { + } + + ExtendableItem( ExtendableList *l, ExtendableItem *prev ) + : KListViewItem( l, prev ), m_extender( 0 ) { + } + + ExtendableItem( ExtendableItem *p, ExtendableItem *prev ) + : KListViewItem( p, prev ), m_extender( 0 ) { + } + + ExtendableItem( ExtendableItem *p ) + : KListViewItem( p ), m_extender( 0 ) { + } + + virtual void setup() { + KListViewItem::setup(); + updateIcon(); + } + void toggleExtender(); + + void hideExtender() { + if (extender()) + toggleExtender(); + } + + void showExtender() { + if (!extender()) + toggleExtender(); + } + + ItemExtender *extender() { return m_extender; } + + static bool s_less( const ExtendableItem *a, const ExtendableItem *b ); + + ExtendableList *list(); + + virtual void updateIcon(); + + virtual void paintBranches( QPainter *, const QColorGroup &, int, int, int ); + + virtual ItemExtender *createExtender() = 0; + virtual bool extendable() const { return false; } + virtual bool less( const ExtendableItem * ) const = 0; + virtual int compare( QListViewItem *other, int col, bool ascending ) const; + + virtual ~ExtendableItem(); + virtual void setHeight( int h ) { KListViewItem::setHeight( h ); } +protected: + ItemExtender *m_extender; +}; + +class ItemExtender : public QWidget { + Q_OBJECT +public: + // ItemExtender( ExtendableItem *item ); + ItemExtender( QWidget *parent, const char *n ) + : QWidget( parent, n ), m_item( 0 ) + {} + + virtual void setItem( ExtendableItem *i ) { + m_item = i; + } + + virtual void polish() { + setupColors(); + } + + ExtendableItem *item() { + return m_item; + } + + void resize( int w, int h ) { + setUpdatesEnabled( false ); + QWidget::resize( w, h ); + setUpdatesEnabled( true ); + QWidget::resize( w, layout()->minimumSize().height() ); + } + + void resize( const QSize &s ) { + resize( s.width(), s.height() ); + } + +public slots: + void setupColors(); +protected: + virtual void mouseReleaseEvent( QMouseEvent *e ) { + e->accept(); + } // throw away mouse clicks :-) + ExtendableItem *m_item; +}; + +} + +#endif diff --git a/adept/libadept/filterlist.cpp b/adept/libadept/filterlist.cpp new file mode 100644 index 0000000..7d4a1b0 --- /dev/null +++ b/adept/libadept/filterlist.cpp @@ -0,0 +1,231 @@ +#include +#include +#include +#include + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + + +using namespace adept; +using namespace Tagcoll; + +// TODO: Beat enrico till this lands in some of our libs... +template< typename PKG, typename TAG > +class TagcollConsumerAdaptor : + public utils::ConsumerImpl< PKG,TagcollConsumerAdaptor > +{ +protected: + Consumer& m_out; + +public: + TagcollConsumerAdaptor( Consumer& out) : m_out( out ) {} + virtual void consume( const PKG& a ) { + if (a != PKG()) + m_out.consume(a, a.tags()); + } +}; + +PredicateInterface::PredicateInterface( QWidget *w, const char *n ) + : ItemExtender( w, n ) +{ +} + +void PredicateInterface::widgetsChanged() { + kdDebug() << "PredicateInterface::widgetsChanged()" << endl; + emit predicateDrop( m_pred ); + m_pred = predicate(); + emit predicateAdd( m_pred ); + downcast< FilterItem >( item() ).setPredicate( m_pred ); +} + +FilterList::FilterList( QWidget *parent, const char *name ) + : ExtendableList( parent, name ), + m_pred( predicate::True< entity::Entity >() ), + m_hidden( predicate::True< entity::Entity >() ) +{ + m_itemsSeen = 0; + // addColumn( " ", 20 ); + addColumn( i18n( "Active filters" ), 240 ); + // setSortColumn( -1 ); + /* setItemsMovable( true ); + setDragEnabled( true ); + setAcceptDrops( true ); */ + setResizeMode( LastColumn ); + setAllColumnsShowFocus (true); + + resize( 240, 180 ); + connect( this, SIGNAL( + contextMenuRequested( QListViewItem *, const QPoint + &, int ) ), + this, SLOT( contextMenu( QListViewItem *, const + QPoint &, int) ) ); + connect( this, SIGNAL( extendersChanged() ), + this, SLOT( updateHeight() ) ); +} + +void FilterList::emitPredicateChanged() { + predicateChanged( m_hidden and m_pred ); +} + +void FilterList::updateHeight() { + int h = header()->height() + 4; + for ( QListViewItem *i = firstChild(); i != 0; i = i->nextSibling() ) { + h += i->totalHeight(); + } + // int h = contentsHeight() + header()->height() + 4; // magic constant + setMinimumHeight( h ); + setMaximumHeight( h ); +} + +void FilterList::drawContents( QPainter *p, int a, int b, int c, int d ) { + if ( m_itemsSeen != childCount() ) { + m_itemsSeen = childCount(); + updateHeight(); + } // hmm, doesn't work... bah :p + KListView::drawContents( p, a, b, c, d ); +} + +void FilterList::plugLister( Lister *l ) { + m_lister = l; + connect( this, SIGNAL( predicateChanged( ListerPredicate ) ), + l, SLOT( baseSet( ListerPredicate ) ) ); +} + +void FilterList::setPredicate( Predicate p ) { + clear(); + m_pred = p; + appendPredicate( p ); + emitPredicateChanged(); +} + +void FilterList::setHiddenPredicate( Predicate p ) { + m_hidden = p; + emitPredicateChanged(); +} + +void FilterList::editorPredicateDrop( Predicate p ) { + m_pred = predicate::remove( m_pred, p ); + emitPredicateChanged(); +} + +void FilterList::editorPredicateAdd( Predicate p ) { + kdDebug() << "FilterList::editorPredicateAdd" << endl; + m_pred = m_pred and p; + emitPredicateChanged(); +} + +void FilterList::appendPredicate( Predicate p ) { + if (p.is< And >()) { + And a = p; + for (utils::Range< Predicate > r = a.parts(); + r != r.end(); ++r ) + appendPredicate( *r ); + } else if (p.is< predicate::True< entity::Entity > >() ) { + // we generally ignore truth + } else { + m_pred = m_pred and p; + // kdDebug() << p.serialize() << endl; + // kdDebug() << p.prettyPrint() << endl; + FilterItem *i; + i = new FilterItem( this ); + i->setPredicate( p ); + } +} + +void FilterList::contextMenu( QListViewItem *it, const QPoint &pt, int /*c*/ ) +{ + std::cerr << "FilterList::contextMenu(p);" << std::endl; + FilterItem *i = dynamic_cast< FilterItem * >( it ); + if (! i) + return; + QPopupMenu *m = new QPopupMenu( this ); + m->insertItem( i18n( "Reset Filter" ), 1 ); + m->insertItem( i18n( "Remove Filter" ), 0 ); + m->insertSeparator(); + m->insertItem( i18n( "Add Quick Filter" ), 8 ); + m->insertItem( i18n( "Add State Filter" ), 9 ); + m->insertItem( i18n( "Add Tag Filter" ), 10 ); + m->insertItem( i18n( "Add Easy Tag Filter" ), 11 ); + // m->insertItem( "Add Tag Filter", tagMenu() ); + m_context = i; + connect(m, SIGNAL(activated(int)), this, SLOT(contextActivated(int))); + m->exec(pt); + delete m; +} + + +void FilterList::contextActivated( int i ) +{ + predicate::Predicate< entity::Entity > p; + switch (i) { + case 0: + m_pred = predicate::remove( m_pred, m_context->predicate() ); + delete m_context; + emitPredicateChanged(); + return; + case 1: + m_context->reset(); + return; + case 8: + p = predicate::adapt< entity::Entity >( + QuickFilter< entity::Package >() ); + break; + case 9: + p = predicate::adapt< entity::Entity >( + StateFilter< entity::Package >() ); + break; + case 10: + p = predicate::adapt< entity::Entity >( + TagFilter< entity::Package >() ); + break; + case 11: + p = predicate::adapt< entity::Entity >( + EasyTagFilter< entity::Package >() ); + break; + } + if (p.impl()) { + kdDebug() << "summary: " << + downcast< InterfacingPredicate >( p ).summary() << endl; + appendPredicate( p ); + emitPredicateChanged(); + } +} + +ItemExtender *FilterItem::createExtender() +{ + PredicateInterface *o = 0; + if (m_pred.is< QuickFilter< entity::Package > >()) { + o = new QuickFilterWidget( list(), 0 ); + } else if (m_pred.is< StateFilter< entity::Package > >()) { + o = new StateFilterWidget( list(), 0 ); + } else if (m_pred.is< EasyTagFilter< entity::Package > >()) { + o = new EasyTagFilterWidget( list(), 0 ); + } else if (m_pred.is< TagFilter< entity::Package > >()) { + o = new TagFilterWidget( list(), 0 ); + } + if (o) { + o->setPredicate( m_pred ); + QObject::connect( o, SIGNAL( predicateAdd( Predicate ) ), + list(), SLOT( editorPredicateAdd( Predicate ) ) ); + QObject::connect( o, SIGNAL( predicateDrop( Predicate ) ), + list(), SLOT( editorPredicateDrop( Predicate ) ) ); + } + return o; +} + +QString FilterItem::text( int c ) const { + InterfacingPredicate &ip = downcast< InterfacingPredicate >( m_pred.impl() ); + if (c == 0) + return ip.summary(); + return u8( "" ); +} diff --git a/adept/libadept/filterlist.h b/adept/libadept/filterlist.h new file mode 100644 index 0000000..f904bc7 --- /dev/null +++ b/adept/libadept/filterlist.h @@ -0,0 +1,149 @@ +/** -*- C++ -*- + @file adept/filterlist.h + @author Peter Rockai +*/ + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include + +#ifndef EPT_FILTERLIST_H +#define EPT_FILTERLIST_H + +class QPopupMenu; + +namespace adept { +using namespace aptFront; +using namespace aptFront::cache; +class Lister; + +struct InterfacingPredicate +{ +public: + virtual std::string summary() const = 0; + virtual void reset() {} +signals: + void changed(); +}; + + +class PredicateInterface: public ItemExtender +{ + Q_OBJECT +public: + typedef predicate::Predicate< entity::Entity > Predicate; + PredicateInterface( QWidget *w = 0, const char *n = 0 ); + virtual Predicate predicate() = 0; +signals: + void predicateAdd( Predicate ); + void predicateDrop( Predicate ); +public slots: + virtual void setPredicate( const Predicate &p ) { + m_pred = p; + predicateChanged(); + } + virtual void widgetsChanged(); + virtual void predicateChanged() = 0; +protected: + predicate::Predicate< entity::Entity > m_pred; +}; + +class FilterItem; + +class FilterList : public ExtendableList +{ + Q_OBJECT +public: + friend class FilterItem; + typedef predicate::Predicate< entity::Entity > Predicate; + // typedef std::map< KListViewItem *, Predicate > Map; + FilterList( QWidget *parent = 0, const char *name = 0 ); + typedef predicate::And< entity::Entity > And; + void appendPredicate( Predicate p ); + void plugLister( Lister *l ); + void emitPredicateChanged(); +signals: + void predicateChanged( ListerPredicate p ); +public slots: + void setPredicate( Predicate p ); + void setHiddenPredicate( Predicate p ); +protected slots: + void editorPredicateDrop( Predicate ); + void editorPredicateAdd( Predicate ); + void contextMenu( QListViewItem *, const QPoint &, int ); + // QPopupMenu *tagMenu(); + void contextActivated( int ); + // void tagMenuActivated( int ); + void updateHeight(); +protected: + void drawContents( QPainter *, int, int, int, int ); + Predicate m_pred; + Predicate m_hidden; + FilterItem *m_context; + bool m_changed; + Lister *m_lister; + int m_itemsSeen; + std::vector< entity::Tag > m_tagMenuMap; +}; + +class FilterItem : public ExtendableItem +{ +public: + ItemExtender *createExtender(); + FilterItem( FilterList *l ) + : ExtendableItem( l ), m_delayedDone( false ) + { + } + void setup() { + ExtendableItem::setup(); + if (m_delayedDone) + return; + m_delayedDone = true; + showExtender(); + } + + QString text( int ) const; + + virtual bool less( const ExtendableItem *other ) const { + const FilterItem *o = dynamic_cast< const FilterItem * >( other ); + return downcast< InterfacingPredicate >( m_pred ).summary() < + downcast< InterfacingPredicate >( o->m_pred ).summary(); + } + + void setPredicate( predicate::Predicate< entity::Entity > p ) { + m_pred = p; + } + + FilterList::Predicate predicate() const { + return m_pred; + } + + FilterList *filterList() { return dynamic_cast< FilterList * >( list() ); } + + void reset() { + filterList()->editorPredicateDrop( m_pred ); + downcast< InterfacingPredicate >( m_pred ).reset(); + if ( extender() ) { + downcast< PredicateInterface >( extender() ).setPredicate( m_pred ); + extender()->setFocus(); + } + filterList()->editorPredicateAdd( m_pred ); + } + +protected: + predicate::Predicate< entity::Entity > m_pred; + bool m_delayedDone:1; +}; + +} + +#endif diff --git a/adept/libadept/filtersidebar.cpp b/adept/libadept/filtersidebar.cpp new file mode 100644 index 0000000..52d909e --- /dev/null +++ b/adept/libadept/filtersidebar.cpp @@ -0,0 +1,71 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace adept; +using namespace aptFront; +using namespace std; +using namespace __gnu_cxx; + +template< typename H, typename G1, typename G2 > +struct _compose2_binary { + _compose2_binary( H _h, G1 _g1, G2 _g2 ) + : h( _h ), g1( _g1 ), g2( _g2 ) + {} + + typename H::result_type operator()( + typename G1::argument_type a, + typename G2::argument_type b ) + { + return h( g1( a ), g2( b ) ); + } + + H h; + G1 g1; + G2 g2; +}; + +template< typename H, typename G1, typename G2 > +_compose2_binary< H, G1, G2 > compose2_binary( H h, G1 g1, G2 g2 ) { + return _compose2_binary< H, G1, G2 >( h, g1, g2 ); +} + +void FilterSidebar::setCardinality( const Lister::Cardinality &c ) +{ + cache::entity::Tag::Set all, smart; + + kdDebug() << "FilterSidebar::setCardinality" << endl; + Lister::Cardinality cprime; + remove_copy_if( c.begin(), c.end(), inserter( cprime, cprime.begin() ), + compose1( bind1st( equal_to< int >(), 0 ), + select2nd< + Lister::Cardinality::value_type >() ) ); + transform( cprime.begin(), cprime.end(), inserter( all, all.begin() ), + select1st< Lister::Cardinality::value_type >() ); + m_all->setTags( all ); + cache::component::Tags &t = cache::Global().get().tags(); + m_easy->setTags( all ^ ( t.facetByName( "interface" ).tags() + + t.facetByName( "works-with" ).tags() + + t.facetByName( "use" ).tags() + + t.facetByName( "role" ).tags() ) ); + + typedef vector< pair< cache::entity::Tag, int > > Vec; + Vec vec; + copy( cprime.begin(), cprime.end(), back_inserter( vec ) ); + sort( vec.begin(), vec.end(), + compose2_binary( less< int >(), + select2nd< Vec::value_type >(), + select2nd< Vec::value_type >() ) ); + Vec::reverse_iterator end = vec.rbegin(); + advance( end, vec.size() < 10 ? vec.size() : 10 ); + transform( vec.rbegin(), end, inserter( smart, smart.begin() ), + select1st< Vec::value_type >() ); + + m_smart->setTags( smart ); + m_smart->openToplevel(); +} diff --git a/adept/libadept/filtersidebar.h b/adept/libadept/filtersidebar.h new file mode 100644 index 0000000..0fac201 --- /dev/null +++ b/adept/libadept/filtersidebar.h @@ -0,0 +1,26 @@ +/* -*- C++ -*- file adept/filtersidebar.h + written by Peter Rockai */ + +#include +#include + +#ifndef EPT_FILTERSIDEBAR_H +#define EPT_FILTERSIDEBAR_H + +namespace adept { + +// using namespace aptFront; + +class FilterSidebar : public FilterSidebarUi { + Q_OBJECT +public: + FilterSidebar( QWidget *p = 0, const char *n = 0 ) + : FilterSidebarUi( p, n ) + {} +public slots: + void setCardinality( const Lister::Cardinality & ); +}; + +} + +#endif diff --git a/adept/libadept/filtersidebarui.ui b/adept/libadept/filtersidebarui.ui new file mode 100644 index 0000000..0f2efb4 --- /dev/null +++ b/adept/libadept/filtersidebarui.ui @@ -0,0 +1,119 @@ + +adept::FilterSidebarUi + + + adept::FilterSidebarUi + + + + 0 + 0 + 227 + 469 + + + + Form2 + + + + unnamed + + + 0 + + + 0 + + + + m_tabs + + + + tab0 + + + Smart + + + + unnamed + + + 0 + + + + m_smart + + + + + + + tab1 + + + Simple + + + + unnamed + + + 0 + + + + m_easy + + + + + + + tab2 + + + All + + + + unnamed + + + 0 + + + + m_all + + + + + + + + + + adept::TagChooser +
    adept/tagchooser.h
    + + -1 + -1 + + 0 + + 5 + 5 + 0 + 0 + +
    +
    + + + adept/tagchooser.h + +
    diff --git a/adept/libadept/filterwidget.cpp b/adept/libadept/filterwidget.cpp new file mode 100644 index 0000000..f294327 --- /dev/null +++ b/adept/libadept/filterwidget.cpp @@ -0,0 +1,36 @@ +#include +#include +#include +#include +#include "filterwidget.h" + +using namespace aptFront; +using namespace adept; + +void FilterWidget::connectLister( Lister *l ) { + connect( this, SIGNAL( drop( ListerPredicate ) ), + l, SLOT( interactiveDrop( ListerPredicate ) ) ); + connect( this, SIGNAL( changed( ListerPredicate ) ), + l, SLOT( interactiveAnd( ListerPredicate ) ) ); + connect( this, SIGNAL( apply( ListerPredicate ) ), + l, SLOT( baseAnd( ListerPredicate ) ) ); + +} + +void FilterWidget::changedInternal() { + setEnabled( false ); + emit drop( m_old ); + emit changed( m_old = predicate() ); + setEnabled( true ); + setFocus(); +} + +void FilterWidget::applyInternal() { + // check for emptiness? + setEnabled( false ); + emit drop( m_old ); + emit apply( m_old = predicate() ); + reset(); + setEnabled( true ); + setFocus(); +} diff --git a/adept/libadept/filterwidget.h b/adept/libadept/filterwidget.h new file mode 100644 index 0000000..78b0c38 --- /dev/null +++ b/adept/libadept/filterwidget.h @@ -0,0 +1,39 @@ +/** -*- C++ -*- + @file adept/filterwidgets.h + @author Peter Rockai +*/ + +#include +#include +#include + +#ifndef EPT_FILTERWIDGET_H +#define EPT_FILTERWIDGET_H + +class KLineEdit; + +namespace adept { + +class FilterWidget : public QWidget +{ + Q_OBJECT +public: + FilterWidget( QWidget *parent = 0, const char *n = 0 ) + : QWidget( parent, n ) {} + virtual ListerPredicate predicate() = 0; + void connectLister( Lister *l ); +protected slots: + void changedInternal(); + void applyInternal(); + virtual void reset() = 0; +signals: + void changed( ListerPredicate op ); + void apply( ListerPredicate op ); + void drop( ListerPredicate op ); +protected: + ListerPredicate m_old; +}; + +} + +#endif diff --git a/adept/libadept/groupeddesktopselector.cpp b/adept/libadept/groupeddesktopselector.cpp new file mode 100644 index 0000000..68afa98 --- /dev/null +++ b/adept/libadept/groupeddesktopselector.cpp @@ -0,0 +1,137 @@ +/** -*- C++ -*- + @file adept/groupeddestkopselector.cpp + @author Peter Rockai +*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +using namespace aptFront; +using namespace cache; + +namespace adept { + +GroupedDesktopSelector::GroupedDesktopSelector( QWidget *p, const char *n ) + : KJanusWidget( p, n, IconList ), m_policy( 0 ) +{ + observeComponent< cache::component::Packages >(); + m_pages.push_back( addPage( QString( "Initializing..." ) ) ); + QObjectList *chld = queryList( "QWidget" ); + QObjectListIt it( *chld ); QWidget *o; + while ((o = dynamic_cast< QWidget * >( it.current() )) != 0) { + if ( dynamic_cast< QLabel * >( o ) != 0 ) + o->hide(); + if ( dynamic_cast< KSeparator * >( o ) != 0 ) + o->hide(); + ++it; + } // *hack* + + // AAAA hack + QLayoutIterator li = layout()->iterator(); + QHBoxLayout *hbox = 0; + while ( li.current() != 0 ) { + hbox = dynamic_cast< QHBoxLayout * >( li.current() ); + if ( hbox ) break; + ++li; + } + kdDebug() << "hacking hbox = " << hbox << endl; + if ( hbox ) { + li = hbox->iterator(); + while ( li.current() != 0 ) { + QSpacerItem *spacer = dynamic_cast< QSpacerItem * >( li.current() ); + if ( spacer ) { + hbox->removeItem( spacer ); + delete spacer; + } + ++li; + } + } +} + +void GroupedDesktopSelector::notifyPreRebuild( component::Base * ) { + clear(); +} + +void GroupedDesktopSelector::notifyPostRebuild( component::Base * ) { + // QTimer::singleShot( 0, this, SLOT( fill() ) ); +} + +void GroupedDesktopSelector::clear() +{ + if ( !m_pages.empty() ) + showPage( m_pages.front() ); + while ( !m_pages.empty() ) { + removePage( m_pages.back() ); + delete m_pages.back(); + m_pages.pop_back(); + } +} + +void GroupedDesktopSelector::fill() +{ + component::Desktop &d = cache::Global::get().component< component::Desktop >(); + fill( d.entries() ); +} + +void GroupedDesktopSelector::fill( component::Desktop::EntityRange r ) +{ + component::Desktop &d = cache::Global::get().component< component::Desktop >(); + utils::Range< std::string > gr; + QString last = pageTitle( activePageIndex() ); + + clear(); + + bool shown = false; + + for ( gr = d.availableGroups( r ); gr != gr.end(); gr.advance() ) { + + component::Desktop::EntityRange cr = d.group( *gr ); + QString name = u8( *gr ); + std::cerr << "group for " << cr->name() << ": " << r->group() << std::endl; + name = ( name != u8( "" ) ? name : u8( "Legacy" ) ); + + QPixmap icon( KGlobal::iconLoader()->iconPath( + policy() ? policy()->iconForGroup( name ) : u8( "" ), -32 ) ); + + QVBox *b = addVBoxPage( name, name, icon ); + m_pages.push_back( b ); + std::cerr << "creating list for " << *gr << std::endl; + + DesktopList *l = new DesktopList( b ); + l->setTitle( name ); + connect( l, SIGNAL( request( cache::entity::Package, + cache::component::State::Action ) ), + this, SIGNAL( request( cache::entity::Package, + cache::component::State::Action ) ) ); + connect( l, SIGNAL( showDescription( cache::entity::Desktop ) ), + this, SIGNAL( showDescription( cache::entity::Desktop ) ) ); + + l->insertRange( intersectionRange( r, cr ) ); + // l->insertRange( cr ); + + std::cerr << "created list for " << *gr << std::endl; + if ( name == last ) { + showPage( b ); + shown = true; + } + kapp->processEvents(); + } + + if ( m_pages.empty() ) + m_pages.push_back( addPage( QString( "No Results" ) ) ); + if ( !shown ) + showPage( pageIndex( m_pages.front() ) ); +} + +} diff --git a/adept/libadept/groupeddesktopselector.h b/adept/libadept/groupeddesktopselector.h new file mode 100644 index 0000000..a54f7aa --- /dev/null +++ b/adept/libadept/groupeddesktopselector.h @@ -0,0 +1,39 @@ +/** -*- C++ -*- + @file adept/groupeddestkopselector.h + @author Peter Rockai +*/ + +#include +#include + +namespace adept { +using namespace aptFront; +using namespace aptFront::cache; + +// XXX needs fixing +class GroupedDesktopSelector : public KJanusWidget, cache::Observer +{ + Q_OBJECT +public: + struct IconPolicy { + virtual QString iconForGroup( QString group ) { return group; } + }; + GroupedDesktopSelector( QWidget *p = 0, const char *n = 0 ); + void fill( component::Desktop::EntityRange r ); + void setPolicy( IconPolicy *p ) { m_policy = p; } + IconPolicy *policy() { return m_policy; } + virtual void notifyPreRebuild( cache::component::Base * ); + virtual void notifyPostRebuild( cache::component::Base * ); +public slots: + void clear(); + void fill(); +signals: + void request( cache::entity::Package, cache::component::State::Action ); + void showDescription( cache::entity::Desktop ); +protected: + IconPolicy *m_policy; + std::vector< QWidget * > m_pages; + // IconPolicy m_defaultPolicy; +}; + +} diff --git a/adept/libadept/installerview.cpp b/adept/libadept/installerview.cpp new file mode 100644 index 0000000..eac9dc7 --- /dev/null +++ b/adept/libadept/installerview.cpp @@ -0,0 +1,88 @@ +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +using namespace adept; +using namespace aptFront; +using namespace cache; + +void InstallerView::rebuild() +{ + typedef predicate::Factory< entity::Desktop > Factory; + if ( m_inRebuild ) { + QTimer::singleShot( 500, this, SLOT( rebuild() ) ); + return; + } + m_inRebuild = true; + + component::Desktop &d = cache::Global::get().component< component::Desktop >(); + component::Tags &t = + cache::Global::get().component< component::Tags >(); + + Predicate p = predicate::True< entity::Desktop >(); + if ( m_search->text() != u8( "" ) ) { + Predicate tmp = Factory::name( u8( m_search->text() ) ) + or Factory::description( u8( m_search->text() ) ); + p = p and tmp; + } + + std::string st = ""; + int si = m_suite->currentItem(); + + if ( si == 0 ) st = "suite::kde"; + if ( si == 1 ) st = "suite::gnome"; + + if ( st != "" ) + p = p and Factory::tag( t.tagByName( st ) ); + + if ( !m_unsupported->isChecked() ) { + p = p and not Factory::sectionSubstring( "contrib" ) + and not Factory::sectionSubstring( "universe" ) + and not Factory::sectionSubstring( "multiverse" ); + } + + if ( !m_nonfree->isChecked() ) { + p = p and not Factory::sectionSubstring( "non-free" ) + and not Factory::sectionSubstring( "multiverse" ) + and not Factory::sectionSubstring( "restricted" ); + } + + selector()->fill( filteredRange( d.entries(), p ) ); + + m_inRebuild = false; +} + +InstallerView::InstallerView( QWidget *p , const char *n ) + : InstallerViewUi( p, n ), m_inRebuild( false ) +{ + connect( m_search, SIGNAL( textChanged( const QString & ) ), + this, SLOT( textChanged() ) ); + connect( &timer, SIGNAL( timeout() ), this, SLOT( rebuild() ) ); + connect( m_suite, SIGNAL( activated( int ) ), this, SLOT( rebuild() ) ); + connect( m_unsupported, SIGNAL( toggled( bool ) ), this, SLOT( rebuild() ) ); + connect( m_nonfree, SIGNAL( toggled( bool ) ), this, SLOT( rebuild() ) ); + connect( selector(), SIGNAL( showDescription( cache::entity::Desktop ) ), + this, SLOT( showDescription( cache::entity::Desktop ) ) ); +} + +void InstallerView::textChanged() { + timer.start( 1000, true ); +} + +void InstallerView::showDescription( entity::Desktop e ) +{ + kdDebug() << "InstallerView::showDescription..." << endl; + m_description->setText( u8( "" ) + e.name() + u8( "" ) + + i18n( "
    Package: " ) + e.package().name() + + formatLongDescription( + e.package().longDescription( std::string( "" ) ) ) ); +} diff --git a/adept/libadept/installerview.h b/adept/libadept/installerview.h new file mode 100644 index 0000000..ed955dc --- /dev/null +++ b/adept/libadept/installerview.h @@ -0,0 +1,33 @@ +/** -*- C++ -*- + @file adept/installerview.h + @author Peter Rockai +*/ + +#include +#include +#include + +#ifndef EPT_INSTALLERVIEW_H +#define EPT_INSTALLERVIEW_H + +namespace adept { +class InstallerView : public InstallerViewUi +{ + Q_OBJECT +public: + typedef predicate::Predicate< entity::Desktop > Predicate; + InstallerView( QWidget *p = 0, const char *n = 0 ); + GroupedDesktopSelector *selector() { return m_selector; } +protected slots: + void textChanged(); + void showDescription( cache::entity::Desktop ); +public slots: + void rebuild(); +protected: + bool m_inRebuild; + QTimer timer; +}; + +} + +#endif diff --git a/adept/libadept/installerviewui.ui b/adept/libadept/installerviewui.ui new file mode 100644 index 0000000..6f8b5d7 --- /dev/null +++ b/adept/libadept/installerviewui.ui @@ -0,0 +1,194 @@ + +InstallerViewUi + + + InstallerViewUi + + + + 0 + 0 + 666 + 314 + + + + Form1 + + + + unnamed + + + 0 + + + 0 + + + + layout5 + + + + unnamed + + + 4 + + + + textLabel2 + + + + 0 + 5 + 0 + 0 + + + + Search: + + + + + m_search + + + + 7 + 0 + 0 + 0 + + + + + + + KDE + + + + + GNOME + + + + + Any Suite + + + + m_suite + + + + 5 + 0 + 0 + 0 + + + + + + spacer2 + + + Horizontal + + + Expanding + + + + 21 + 20 + + + + + + textLabel1 + + + Show: + + + + + m_unsupported + + + unsupported, + + + + + m_nonfree + + + proprietary software. + + + + + + + m_selector + + + + 5 + 5 + 6 + 1 + + + + + + m_description + + + + 7 + 7 + 4 + 0 + + + + + + + + adept::GroupedDesktopSelector +
    adept/groupeddesktopselector.h
    + + -1 + -1 + + 0 + + 5 + 5 + 0 + 0 + + image0 +
    +
    + + + 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000042949444154388db5954d6c545514c77ff7de37eff1a6a550da994e5ba798868f948fc847a2a2911816c436b0a02ed0083161a1981877ee10d90aa94656063491882c5cd4c4b8103f20cd806909a98604da8482341de80cb69de9bcd799799d79efba980f1da3a80b4f727273939bdff99f9b93f3175a6b6a21849080020c4002a29a8f0a5dcd002803bed63a1035f0d0d0504b6f6fef51d7758fa4d3e98d8ee3fc03af128ee3303939399548242eb8aefb09300f78464de9f0f0f0d148cc7caf3d5424de97a7ec17104220242805520a44557bbd4b21f083801d33e63a6d1bc7bf19c6064e0319a35a58b9ae7ba43d54e4d7c54b64dc097c7f09d30ef04b36736983cc7c11b4456b9b492c5e20dc54a6540e00896a8268a7017010f8bcae1830d2e9f4c69ebe3c197782b2ce60d94ddc9b30f9feeb45ae5d7181c5ead35636ef08d3ffe26a76ee3208b4031a56d80aa00768fda362e9380e25bf80ef3b587613d7afc099533380a4b5dda46fcb5aa42998b9eb7173dce5e6788e434763ec7fc942532008ea436003660d2caa7f8d69c3bd8910674e4d033e83877ad8d36fb0aa4d6058658ac5358c5df6383bf480f31fdda5a3632bbbfb6da4ccd5c00a10b2012cc12fd97cfb5516f0187c25cee0619396480ec3ca909d0f3372d1e5f9fe66de3ad605587c712ec55256a2540d5519d19ae24a29057329839f7ecc138944d833102290f3184ae1e6d6f0e98739c61229e6d21eafbed1c9c8c5558c8f3ee4ceed76946a1c43d97091828585223e2eebfbc295f60d45de89707628cb58224577bc85a79e5d4d786581cddb9b0148259711b20145836221400416e0232d1f6595c9ce4538773ac7b54406f0b15784e8e80aa1ac2594190220d021e49f2437960156b70ba095e95f96f18acd8c263cc6122962b1167a7ba34cdd7ec8c977a699bed546722a8fc2a02b6e2185fff78ab586ce78894ddb9ab9f5738ed14b1e030756929d8ff2e4ae5544632b38f96e89a99b298ebd6950cc2d12ed0eb3618b26f520788462ad09877df60db600f0f1fb49c646f21c7ebd836dcf94e9d9b4c0db27d6d3bd36c6426a96bce731703046d7da129a4670836284a054869d4f1b1c7e2dca67676ef3c1898091ef5ad8bc358c3205c93bf7c9a40ad4c660f4728edd7bbb3142ea2fc1da711cfc200011e08b45f6bd1c261adbce9717928c5f9d63fc6a19f0014567773303073790f8214bd6f5282dfbb8b9fa1f6b40d7c1939393533b92e63ad9240990484aec7e41b27d579cbb531e0f67023492d86316ebb768ba1e0f786e6f37e56550c62237aee7011e54abd7c1412291b8a06de378b4d3c0b215da9708e5a3a442192085404a83d4accfecac067c0c43e13a70e3fa12e96409e0325000966bbb354465339d04a6f9dd15fe6dde07ce030780278088d05ad72cc9a6b2f2daaaa74d75a1f0e8d0d5f60b40868a8364ead6248430000b0857a126ffcdf396abf03ce089ffcb4c7f033046c6b4a995e7a00000000049454e44ae426082 + + + + + adept/groupeddesktopselector.h + +
    diff --git a/adept/libadept/lister.cpp b/adept/libadept/lister.cpp new file mode 100644 index 0000000..85142c3 --- /dev/null +++ b/adept/libadept/lister.cpp @@ -0,0 +1,707 @@ +// -*- Mode: C++; c-basic-offset: 4; -*- +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +using namespace aptFront; +using namespace aptFront::predicate; +using namespace aptFront::cache; +using namespace aptFront::utils; +using namespace adept; + +Lister::Lister( QWidget *parent, const char *name ) + : ExtendableList( parent, name ), + m_rangeProvider( 0 ), + m_baseF( predicate::True< entity::Entity >() ), + m_interactiveF( True() ), m_itemCount( -1 ), + m_rebuildScheduled( false ), m_inRebuild( false ), m_cancelRebuild( false ), + m_openToplevel( false ), m_rebuildMutex( true ) +{ + observeComponent< component::State >(); + observeComponent< component::Packages >(); + observeComponent< component::PackageTags >(); + setRootIsDecorated( false ); + setSelectionModeExt( Extended ); + setAllColumnsShowFocus (true); + + m_icons[ u8( "package-install" ) ] = u8( "adept_install" ); + m_icons[ u8( "package-remove" ) ] = u8( "adept_remove" ); + m_icons[ u8( "package-upgrade" ) ] = u8( "adept_upgrade" ); + m_icons[ u8( "package-keep" )] = u8( "adept_keep" ); + m_icons[ u8( "package-reinstall" )] = u8( "adept_reinstall" ); + m_icons[ u8( "package-purge" )] = u8( "adept_purge" ); + + setSorting( -1 ); + // addColumn(" ", 40); + // addColumn(" ", 18); + addColumn( i18n( "Package" ), 180); + addColumn( i18n( "Status" ), 110); + addColumn( i18n( "Requested" ), 90); + addColumn( i18n( "Description" ), 300); + setToggleColumn( 0 ); + + setResizeMode (LastColumn); + connect( this, SIGNAL( selectionChanged() ), SLOT( updateActions() ) ); + connect( this, + SIGNAL( contextMenuRequested( QListViewItem *, + const QPoint &, int ) ), + this, SLOT( + contextMenu( QListViewItem *, const QPoint &, int) ) ); + m_tip = 0; + // m_tip = new ListerTooltip( viewport(), this ); +} + +Lister::~Lister() +{ + delete m_tip; +} + +void Lister::scheduleRebuild() +{ + if (!m_rebuildScheduled) { + // kdDebug() << "Lister scheduling rebuild" << endl; + QTimer::singleShot( 0, this, SLOT( rebuild() ) ); + } + m_rebuildScheduled = true; +} + +void Lister::updateActions() +{ + emit actionsChanged( this ); +} + +void Lister::notifyPostChange( component::Base * ) +{ + kdDebug() << "notifyRefresh()" << endl; + updateActions(); + triggerUpdate(); +} + +void Lister::notifyPreRebuild( component::Base *b ) +{ + kdDebug() << "Lister::notifyPreRebuild( " << b << " )" << endl; + Cache &c = cache::Global::get( m_cache ); + setEnabled( false ); + if ( dynamic_cast< component::PackageTags * >( b ) != 0 ) { + kdDebug() << "clearing cardinality" << endl; + m_cardinality.clear(); + } + if ( dynamic_cast< component::Packages * >( b ) != 0 ) { + kdDebug() << "clearing lister" << endl; + clear(); + m_items.clear(); + m_cardinality.clear(); + } +} + +void Lister::notifyPostRebuild( component::Base *b ) +{ + kdDebug() << "Lister::notifyPostRebuild( " << b << " )" << endl; + scheduleRebuild(); + if ( dynamic_cast< component::State * >( b ) != 0 ) { + setEnabled( true ); + } +} + +bool lessByName( const entity::Entity &e1, const entity::Entity &e2 ) +{ + if ( e1.is< entity::Named >() && e2.is< entity::Named >() ) { + entity::Named &n1 = downcast< entity::Named >( e1 ), + &n2 = downcast< entity::Named >( e2 ); + return n1.name() < n2.name(); + } + return e1 < e2; +} + +bool Lister::cancelRebuild() { + // kdDebug() << "cancel rebuild: " << m_inRebuild << ", " << m_cancelRebuild << endl; + if ( m_inRebuild ) { + m_rebuildScheduled = false; + m_cancelRebuild = true; + } + if ( !cache::Global::get( m_cache ).isOpen() ) { + m_rebuildScheduled = false; + return true; + } + return m_cancelRebuild; +} + +void Lister::cleanRebuild() +{ + scheduleRebuild(); +} + +Lister::CreateItem::CreateItem( Lister *_l, ListerItem *p ) + : l( _l ), time( 0 ), items( 0 ), last( 0 ), parent( p ) +{ +} + +Lister::CreateItem::~CreateItem() +{ + // delete timer; +} + +Lister::Map::value_type Lister::CreateItem::operator()( entity::Entity e ) +{ + items ++; + if ( l->m_cancelRebuild ) throw 0; // XXX proper exception please + // kdDebug() << "trying to acquire mutex" << endl; + l->m_rebuildMutex.lock(); + // kdDebug() << "mutex acquired" << endl; + + // count tags + if ( e.is< entity::Package >() ) { + const entity::Tag::Set &tags = downcast< entity::Package >( e ).tags(); + for (entity::Tag::Set::iterator i = tags.begin(); i != tags.end(); ++ i ) + l->m_cardinality[ *i ] ++; + } + + if ( last ) { + if ( parent ) + last = new ListerItem( parent, last, e ); + else + last = new ListerItem( l, last, e ); + } else { + if ( parent ) + last = new ListerItem( parent, e ); + else + last = new ListerItem( l, e ); + } + l->m_rebuildMutex.unlock(); + if ( e.is< entity::Relation >() ) + // this should be safe because the parent thread is waiting + // for us and ensures that universe (libapt-front) is kept + // unchanged while we run + l->insertRangeInternal( InsertRangePair( + last, downcast< entity::Relation >( e ).targetPackages() ) ); + // we may want to use recursive async call instead? why? + /* Threads::enqueue( + asyncCall( std::bind2nd( std::mem_fun( &Lister::insertRangeInternal ), + InsertRangePair( + last, + downcast< entity::Relation >( e ).targetPackages() ) ), + l ), &(l->m_rebuildMutex) ); + */ + return std::make_pair( e, last ); +} + +void Lister::reallyUpdate() +{ + bool en = isUpdatesEnabled(); + setUpdatesEnabled( true ); + triggerUpdate(); + setUpdatesEnabled( en ); +} + +void Lister::insertRange( Range r ) { + insertRangeInternal( InsertRangePair( 0, r ) ); +} +void Lister::insertRangeInternal( InsertRangePair a ) +{ + // kdDebug() << "insertRange running..." << endl; + try { + std::transform( a.second, a.second.end(), + inserter( m_items, m_items.begin() ), + CreateItem( this, a.first ) ); + } catch ( ... ) {} + m_itemCount = m_items.size(); +} + +/* void Lister::rebuildInsertRange( Range r ) { + insertRange( 0, r ); + } */ + +void Lister::rebuild() +{ + Cache &c = cache::Global::get( m_cache ); + if ( cancelRebuild() ) { + scheduleRebuild(); + return; + } + + m_inRebuild = true; + m_rebuildMutex.lock(); + + emit rebuildStarted(); + + c.progress().OverallProgress( 0, 0, 0, i18n( "Filtering" ) ); + kdDebug() << "rebuild running" << endl; + clock_t _c = clock(), C; + for ( Cardinality::iterator i = m_cardinality.begin(); + i != m_cardinality.end(); ++i ) + i->second = 0; + + kdDebug() << "querying m_rangeProvider " << m_rangeProvider << "..." << endl; + + Range r = filteredRange( m_rangeProvider ? + m_rangeProvider->listerRange() : range( VectorRange() ), + m_baseF ); + C = (clock() - _c) / 1000; _c = clock(); + + setUpdatesEnabled( false ); + kdDebug() << "clearing..." << endl; + clear(); + m_items.clear(); + + kdDebug() << "asyncCall to rebuildInsertRange..." << endl; + QThread *t = asyncCall( std::bind2nd( + std::mem_fun( &Lister::insertRangeInternal ), + InsertRangePair( 0, r ) ), + this ); + + kdDebug() << "starting the thread..." << endl; + + QTimer timer; + connect( &timer, SIGNAL( timeout() ), + this, SLOT( reallyUpdate() ) ); + timer.start( 0 ); + + m_rebuildMutex.unlock(); + Threads::enqueue( t, &m_rebuildMutex ); + Threads::wait(); + + timer.stop(); + + kdDebug() << "thread finished..." << endl; + C = (clock() - _c) / 1000; _c = clock(); + kdDebug() << m_items.size() << " entities synced, time = " << C << endl; + + setUpdatesEnabled( true ); + c.progress().Done(); + if ( m_openToplevel ) openToplevel(); + triggerUpdate(); + + if ( !m_cancelRebuild ) { + for ( Cardinality::iterator i = m_cardinality.begin(); + i != m_cardinality.end(); ++i ) + if ( i->second == m_itemCount ) + i->second = -1; + emit cardinalityChanged( m_cardinality ); + } + + m_inRebuild = false; + m_rebuildScheduled = false; + m_cancelRebuild = false; + emit rebuildFinished(); +} + +void Lister::baseAnd( Predicate o ) +{ + m_baseF = predicate::predicate( m_baseF and o ); + // emit filterChanged( m_baseF ); + cancelRebuild(); + scheduleRebuild(); +} + +void Lister::baseSet( Predicate o ) +{ + m_baseF = o; + // emit filterChanged( m_baseF ); + cancelRebuild(); + scheduleRebuild(); +} + +void Lister::interactiveAnd( Predicate o ) +{ + m_interactiveF = predicate::predicate( m_interactiveF and o ); + cancelRebuild(); + scheduleRebuild(); +} + +void Lister::interactiveDrop( Predicate o ) +{ + m_interactiveF = predicate::remove( m_interactiveF, o ); + cancelRebuild(); + scheduleRebuild(); +} + +bool Lister::itemSelected( Map::value_type i ) +{ + return not i.second->isSelected(); +} + +entity::Entity Lister::extractKey( Map::value_type i ) +{ + return i.first; +} + +Lister::VectorRange Lister::selection() +{ + VectorRange ret; + Map m; + std::remove_copy_if( m_items.begin(), m_items.end(), + inserter( m, m.begin() ), + itemSelected ); + std::transform( m.begin(), m.end(), + consumer( ret ), + extractKey ); + return ret; +} + +Lister::VectorRange Lister::content() +{ + VectorRange ret; + std::transform( m_items.begin(), m_items.end(), + consumer( ret ), + extractKey ); + return ret; +} + +QString ListerItem::text( int column ) const +{ + // if (column == 0) return ""; // until we redo paintcell for the col + if (entity().is()) { + entity::Package p = entity(); + switch (column) { + case 0: return u8( p.name( u8( i18n( "n/a" ) ) ) ); + case 1: return u8( p.statusString( u8( i18n( "n/a" ) ) ) ); + case 2: return u8( p.actionString( u8( i18n( "n/a" ) ) ) ); + case 3: return u8( p.shortDescription( u8( i18n( "n/a" ) ) ) ); + // case 2: return p.candidateVersion().versionString(); + } + } + if ( entity().is< entity::Relation >() && column == 0 ) + return downcast< entity::Relation >( entity() ).format(); + return u8( "" ); +} + +void ListerItem::paintCell (QPainter *p, const QColorGroup &cg, + int column, int width, int alignment ) +{ + if ( width <= 0 ) + return; + QColorGroup _cg( cg ); + QColor c = _cg.text(); + QPixmap pm( width, height() ); + QPainter _p( &pm ); + if (entity().is()) { + entity::Package p = entity(); + if (column == 1) + c = statusColor( p ); + if (column == 2) + c = actionColor( p ); + } + _cg.setColor( QColorGroup::Text, c ); + KListViewItem::paintCell( &_p, _cg, column, width, AlignTop ); + p->drawPixmap( 0, 0, pm ); +} + +void Lister::contextMenu( QListViewItem *it, const QPoint &pt, int /*c*/ ) +{ + if (! it) // check for actor when we have one... + return; + m_context = dynamic_cast< ListerItem * >( it ); + VectorRange sel = selection(); + // entity::Package p = (dynamic_cast(it)->entity()); + KPopupMenu *m = new KPopupMenu (this); + utils::Range< Actor > r = actor::Global< entity::Package >::list(); + int id = 8; + try { + for (; r != r.end(); ++r) { + m->insertItem( SmallIconSet( m_icons[ u8( r->name() ) ] ), + r->prettyName(), id ); + m->setItemEnabled( + id, r->possible( utils::upcastRange< entity::Package >( sel ) ) ); + ++id; + } + } catch ( std::bad_cast ) {} // ignore (this is broken, but + // easiest fix) + bool open = m_context->extender(); + m->insertItem( open ? i18n( "Hide details" ) : + i18n( "Show details" ), open ? 1 : 0 ); + connect(m, SIGNAL(activated(int)), this, SLOT(contextActivated(int))); + m->exec(pt); + delete m; +} + +void Lister::contextActivated( int id ) +{ + VectorRange sel = selection(); + try { + if (id >= 8) { + utils::Range< Actor > r = actor::Global< entity::Package >::list(); + std::advance( r, id - 8 ); + (*r)( utils::upcastRange< entity::Package >( sel ) ); + updateActions(); + } + if (id < 8) { + VectorRange i = sel.begin(); + while (i != i.end()) { + if (id == 0) + m_items[*i]->showExtender(); + if (id == 1) + m_items[*i]->hideExtender(); + ++ i; + } + } + } catch ( std::bad_cast ) {} // ignore (this is broken, but +} + +ListerItemExtender::~ListerItemExtender() +{ +} + +ListerItemExtender::ListerItemExtender( QWidget *parent, const char * n) + : ListerItemExtenderUi( parent, n ) +{ + observeComponent< component::State >(); + adjustFontSize( m_description, -1 ); + connect( m_details, SIGNAL( clicked() ), + this, SLOT( detailsClicked() ) ); + + m_packageInfo->adjustFontSize( -1 ); + m_packageInfo->hideStatus(); +} + +void ListerItemExtender::detailsClicked() { + detailsRequested( m_entity ); +} + +ListerItem *ListerItemExtender::item() +{ + return dynamic_cast< ListerItem * >( m_item ); +} + +void ListerItemExtender::mouseReleaseEvent( QMouseEvent *e ) { + e->ignore(); + if ( childAt( e->pos() ) != static_cast< QWidget * >( m_name ) ) + e->accept(); +} +void ListerItemExtender::setItem( ExtendableItem *i ) +{ + ItemExtender::setItem( i ); + m_entity = item()->entity(); + // setupColors(); + + kdDebug() << "ListerItemExtender::setItem connecting" << endl; + connect( this, SIGNAL( detailsRequested( Lister::Entity ) ), + item()->list(), SIGNAL( detailsRequested( Lister::Entity ) ) ); + + entity::Version v; + entity::Package p; + + if ( m_entity.is< entity::Version >() ) { + v = m_entity; + p = v.package(); + } + + if ( m_entity.is< entity::Package >() ) { + p = m_entity; + v = p.anyVersion(); + } + + if ( !v.valid() ) { + m_logical->setText( i18n( "Immutable" ) ); + m_logical->setEnabled( false ); + m_details->setEnabled( false ); + return; + } + + m_name->setText( /* QString( "" ) + */ + v.package().name( std::string( "oops" ) ) /* + "" */ ); + QString l = u8( v.longDescription( + u8( i18n( "No long description available" ) ) ) ); + + m_description->setText( QString( "" ) + + formatLongDescription( l ) + "" ); + m_description->adjustSize(); + m_description->installEventFilter( this ); + + m_packageInfo->setVersion( v, m_entity.is< entity::Version >() ); + + notifyPostChange( 0 ); +} + +void ListerItemExtender::notifyPostRebuild( component::Base *b ) +{ // need to catch undo/redo effects + return notifyPostChange( b ); +} + +void ListerItemExtender::notifyPostChange( component::Base * ) +{ + // without the timer to break it, there could be a loop where + // we connect the clicked() signal to a slot which would be + // invoked right away when we return -> evil + QTimer::singleShot( 0, this, SLOT( updateLogical() ) ); +} + +void ListerItemExtender::updateLogical() { + entity::Package pkg = entity(); + EntityActor *a = 0; + + m_status->setText( colorify( + statusColor( pkg ), + u8( pkg.statusString( u8( i18n( "Unknown" ) ) ) ) ) ); + m_change->setText( colorify( + actionColor( pkg ), + u8( pkg.actionString( u8( i18n( "Unknown" ) ) ) ) ) ); + + + m_logical->setEnabled( true ); + if (pkg.canUpgrade()) { + a = new EntityActor( pkg.upgrade() ); + } else if (pkg.canInstall()) { + a = new EntityActor( pkg.install() ); + } else if (pkg.canKeep()) { + a = new EntityActor( pkg.keep() ); + } else if (pkg.canRemove()) { + a = new EntityActor( pkg.remove() ); + } + + if (a) { + m_logical->setText( u8( a->actor().prettyName() ) ); + connect( m_logical, SIGNAL( clicked() ), + a, SLOT( destructiveAct() ) ); + } else { + m_logical->setText( i18n( "Immutable" ) ); + m_logical->setEnabled( false ); + } + +} + +bool ListerItemExtender::eventFilter( QObject *o, QEvent *e ) +{ + if (o == m_description && e->type() == QEvent::Wheel) { + // kdDebug() << "discarding wheel event..." << endl; + QApplication::sendEvent( this, e ); + return true; + } + return false; +} + +void ListerItemExtender::resize( int w, int h ) +{ + int namew = - item()->lister()->extenderOffset( item() ) - 2 + - layout()->margin() + - layout()->spacing() + + item()->lister()->columnWidth( 0 ); + int statw = item()->lister()->columnWidth( 1 ) + - layout()->spacing(); + int chw = item()->lister()->columnWidth( 2 ) - 2 + - layout()->spacing(); + m_name->setMinimumWidth( namew ); + m_status->setMinimumWidth( statw ); + m_change->setMinimumWidth( chw ); + m_packageInfo->adjustSize(); + m_leftHeight = m_name->height() + m_packageInfo->height() + + m_logical->height() + 20; + QWidget::resize( w, 500 ); + QWidget::resize( + w, + QMAX( m_description->contentsHeight() + 16, + m_leftHeight ) ); +} + +bool entityLess::operator()( entity::Entity e1, entity::Entity e2 ) +{ + if ( e1.is< entity::Package >() ) { + if ( e2.is< entity::Package >() ) + return e1 < e2; + return true; + } + + if ( e1.is< entity::Version >() ) { + if ( e2.is< entity::Package >() ) + return false; + if ( e2.is< entity::Version >() ) + return e1 < e2; + return true; + } + + if ( e1.is< entity::Relation >() ) { + if ( e2.is< entity::Package >() ) + return false; + if ( e2.is< entity::Version >() ) + return false; + if ( e2.is< entity::Relation >() ) + return e1 < e2; + return true; + } + return true; +} + +bool ListerItem::less( const ExtendableItem *b ) const +{ + entity::Entity e1 = entity(), e2 = dynamic_cast< const ListerItem * >( b )->entity(); + return entityLess()( e1, e2 ); +} + +bool ListerItem::keepLess( const ListerItem *o ) const +{ + const ListerItem *b = o; + while ( b != 0 ) { + if ( b == this ) + return false; + b = b->m_previous; + } + while ( o != 0 ) { + o = dynamic_cast< const ListerItem * >( o->nextSibling() ); + if ( o == this ) + return true; + } + return false; +} + +QString ListerTooltip::format( const QString &what, + const QString &txt, bool nobr ) +{ + QString ret = "" + what + " " + (nobr ? "" : "") + + txt + (nobr ? "" : "") + "
    "; + return ret; +} + +void ListerTooltip::maybeTip( const QPoint &pt ) +{ + if ( !m_parent ) + return; + kdDebug() << "ListTreeWidgetTooltip::maybeTip ()" << endl; + ListerItem *x = dynamic_cast( m_parent->itemAt( pt ) ); + if ( !x ) + return; + if ( x->extender() ) + return; // no tips for extended items, thank you + QString str = u8( "" ); + QString descr, cand, cur; + descr = cand = cur = i18n( "Not available" ); + entity::Package p( x->entity() ); + descr = p.shortDescription( std::string( + i18n( "Not available" ).local8Bit() ) ); + try { + cand = u8( p.candidateVersion().versionString() ); + } catch (...) {} + try { + cur = u8( p.installedVersion().versionString() ); + } catch (...) {} + + str += format( i18n( "Package:" ), u8( p.name() ) ); + str += format( i18n( "Description:" ), descr ); + str += format( i18n( "Current Version:" ), cur ); + str += format( i18n( "Candidate Version:" ), cand ); + + str.append( u8( "" ) ); + tip( m_parent->itemRect( x ), str ); +} diff --git a/adept/libadept/lister.h b/adept/libadept/lister.h new file mode 100644 index 0000000..dede538 --- /dev/null +++ b/adept/libadept/lister.h @@ -0,0 +1,220 @@ +/** -*- C++ -*- + @file adept/lister.h + @author Peter Rockai +*/ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#ifndef EPT_LISTER_H +#define EPT_LISTER_H + +class KLineEdit; + +namespace adept { + +using namespace aptFront; +using namespace aptFront::cache; +class ListerTooltip; +class ListerItemExtender; +class ListerItem; +class Lister; + +struct entityLess { + bool operator()( entity::Entity e1, entity::Entity e2 ); +}; + +class Lister: public ExtendableList, public Observer +{ + Q_OBJECT +public: + typedef entity::Entity Entity; + typedef std::vector< Entity > Vector; + typedef utils::Range< Entity > Range; + typedef utils::VectorRange< Entity > VectorRange; + typedef std::set< Entity > Set; + typedef std::map< Entity, ListerItem *, entityLess > Map; + typedef actor::Actor< entity::Package > Actor; + typedef predicate::Predicate< Entity > Predicate; + typedef std::map< cache::entity::Tag, int > Cardinality; + struct RangeProvider { + virtual Range listerRange() = 0; + }; + + Lister (QWidget *parent = 0, const char *name = 0); + ~Lister(); + void setSource(); + virtual void notifyPostChange( component::Base * ); + virtual void notifyPreRebuild( component::Base * ); + virtual void notifyPostRebuild( component::Base * ); + VectorRange selection(); + VectorRange content(); + int itemCount() { return m_itemCount; } + // void setRange( const Range &r ) { m_range = r; } + void setRangeProvider( RangeProvider *r ) { m_rangeProvider = r; } + void insertRange( Range ); + void setOpenToplevel( bool o ) { m_openToplevel = o; } + + bool busy() { return m_rebuildScheduled || m_inRebuild; } + +signals: + // this is adept::Lister because of braindead moc + void actionsChanged( adept::Lister * ); + void cardinalityChanged( const Lister::Cardinality & ); + void detailsRequested( Lister::Entity ); + void rebuildStarted(); + void rebuildFinished(); + // void filterChanged( Lister::Predicate ); + +public slots: + virtual void cleanRebuild(); + virtual void rebuild(); + virtual void baseAnd( ListerPredicate ); + virtual void interactiveDrop( ListerPredicate ); + virtual void interactiveAnd( ListerPredicate ); + virtual void baseSet( ListerPredicate ); + virtual void updateActions(); + virtual void scheduleRebuild(); + virtual void reallyUpdate(); +protected slots: + void contextMenu( QListViewItem *, const QPoint &, int ); + void contextActivated( int ); +protected: + typedef std::pair< ListerItem *, Range > InsertRangePair; + void insertRangeInternal( InsertRangePair ); + ListerTooltip *m_tip; + + static Entity extractKey( Map::value_type ); + static bool itemSelected( Map::value_type ); + + struct CreateItem { + CreateItem( Lister *, ListerItem * ); + ~CreateItem(); + Map::value_type operator()( Entity ); + Lister *l; + int time; + int items; + ListerItem *last; + ListerItem *parent; + }; + + bool cancelRebuild(); + void rebuildInsertRange( Range ); + + ListerItem *m_context; + QMap< QString, QString > m_icons; + Map m_items; + Vector m_all; + RangeProvider *m_rangeProvider; + Predicate m_baseF, m_interactiveF; + int m_itemCount; + bool m_rebuildScheduled:1; + bool m_inRebuild:1; + bool m_cancelRebuild:1; + bool m_openToplevel:1; + Cardinality m_cardinality; + QMutex m_rebuildMutex; +}; + +class ListerTooltip : public QToolTip +{ +public: + ListerTooltip (QWidget *v, Lister *p) : QToolTip (v, 0), m_parent (p) {}; +protected: + QString format( const QString &, const QString &, bool = true ); + virtual void maybeTip (const QPoint &p); + Lister *m_parent; +}; + +class ListerItemExtender : public ListerItemExtenderUi, + public cache::Observer { + Q_OBJECT +public: + ListerItemExtender( QWidget *parent = 0, const char * n = 0 ); + ~ListerItemExtender(); + virtual void resize( int w, int h ); + void setItem( ExtendableItem *i ); + ListerItem *item(); + entity::Entity entity() const { return m_entity; } + void notifyPostChange( component::Base * ); + void notifyPostRebuild( component::Base * ); +protected slots: + void detailsClicked(); + void updateLogical(); +signals: + void detailsRequested( Lister::Entity ); +protected: + bool eventFilter( QObject *o, QEvent *e ); + void mouseReleaseEvent( QMouseEvent *e ); + entity::Entity m_entity; + unsigned m_leftHeight; +}; + +class ListerItem: public ExtendableItem +{ +public: + ListerItem(Lister *v, entity::Entity e) + : ExtendableItem (v), m_previous( 0 ), m_entity( e ) + {} + ListerItem(Lister *v, ListerItem *i, entity::Entity e) + : ExtendableItem( v, i ), m_previous( i ), m_entity( e ) + {} + ListerItem(ListerItem *p, ListerItem *i, entity::Entity e) + : ExtendableItem( p, i ), m_previous( i ), m_entity( e ) + {} + ListerItem(ListerItem *p, entity::Entity e) + : ExtendableItem( p ), m_previous( 0 ), m_entity( e ) + {} + + virtual ItemExtender *createExtender() { + if ( extendable() ) + return new ListerItemExtender(); + return 0; + } + + /* virtual void updateIcon( const QPixmap &p ) { + if ( m_entity.is< entity::Package >() + || m_entity.is< entity::Version >() ) + return ExtendableItem::updateIcon( p ); + setPixmap( list()->toggleColumn(), QPixmap() ); + } */ + + virtual QString text( int column ) const; + entity::Entity entity() { return m_entity; } + const entity::Entity entity() const { return m_entity; } + virtual void paintCell (QPainter *p, const QColorGroup &cg, + int column, int width, int alignment); + virtual bool less( const ExtendableItem * ) const; + Lister *lister() { + return dynamic_cast< Lister* >( listView() ); + } + + // beware, makes sort O(n^2lg(n^2)) + bool keepLess( const ListerItem *o ) const; + virtual bool extendable() const { + return ( entity().is< entity::Package >() + || m_entity.is< entity::Version >() ); + } + +protected: + ListerItem *m_previous; + entity::Entity m_entity; +}; + +} + +#endif /* ifndef PKGLIST_H */ diff --git a/adept/libadept/listerextenderui.ui b/adept/libadept/listerextenderui.ui new file mode 100644 index 0000000..de2e481 --- /dev/null +++ b/adept/libadept/listerextenderui.ui @@ -0,0 +1,310 @@ + +adept::ListerItemExtenderUi + + + ListerItemExtenderrUi + + + + 0 + 0 + 587 + 230 + + + + ListerItemExtenderrUi + + + + unnamed + + + 0 + + + 0 + + + + spacer3 + + + Vertical + + + Expanding + + + + 20 + 16 + + + + + + spacer6 + + + Vertical + + + Fixed + + + + 20 + 4 + + + + + + spacer2 + + + Horizontal + + + Fixed + + + + 4 + 20 + + + + + + layout7 + + + + unnamed + + + + m_name + + + + 5 + 4 + 0 + 0 + + + + 0 + + + name + + + AlignTop + + + + + m_status + + + + 5 + 4 + 0 + 0 + + + + 0 + + + status + + + AlignTop + + + + + m_change + + + + 5 + 4 + 0 + 0 + + + + 0 + + + 0 + + + change + + + AlignTop + + + + + + + m_description + + + NoFocus + + + NoFrame + + + Plain + + + AutoOneFit + + + AlwaysOff + + + AlwaysOff + + + description... + + + + + layout3 + + + + unnamed + + + 4 + + + 4 + + + + spacer5 + + + Horizontal + + + Preferred + + + + 10 + 20 + + + + + + m_logical + + + logical + + + + + m_details + + + Details + + + + + spacer5_2 + + + Horizontal + + + Preferred + + + + 10 + 20 + + + + + + + + m_packageInfo + + + + 0 + 80 + + + + + + spacer13 + + + Horizontal + + + Fixed + + + + 4 + 20 + + + + + + + + adept::PackageInfo +
    adept/packageinfo.h
    + + -1 + -1 + + 0 + + 5 + 5 + 0 + 0 + + image0 +
    +
    + + + 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b249444154388db5944d4c5c5518869f73ce9db9cc40f929cc30300e18129a50685268a28291982e1a2175212eaab1c49d3f8971e7aec6aedb54a32b435dd8685cb8c0c4b8b0feb421b7bd8186a069d23209144b18cb0c02f3732ff3c3ccbdd705a571941213f1dd9d93739ef37e6fbeef08d334d9d5d0d090c701c8344d2176c1a6697a5d5d5dd8b64d2a95c2b2ac7f05b12c8b783c8e6118d8b6fd685fdb753a39394928e2a7c55724d693a7e214104220242805520a84d8b9e4790f0b1302c7751958f1e30534be9fa41a0c60db362dbe227f64af91b6e7719c2dfc0117a71c603da591de2882a7d3d4ec27122b10acad50aeb88044d542b84de3af7ab44aa55274f4e449dbf354bc347aa096fbf37e7efa2ecbad1b36907d78b289de8120232f37726250c3f52cf0a026a0f6065b9645d929e038167aa096d91b307171059034b5f8e9e9eb44fa052b4b25eeccd9dc99cb71f6ad082fbea2e351c075bdbdc13b9109fc01b83fef63e2e232e03076b68393231a0dcd024daf502c1e66e67a89cb971ef0e5a74bb4b61e6378248094b92ab0ac024b70ca017ef8360394187b2dc6d8b89ffa500e4d4f93d9083275d5e6f9913ade3dd70ee87c7d25c95646a25415aadab152b09ed4f8c5cc130a853839eac3951b684a61e70ef3f9c739668c24eba912afbfddc6d4d506e6a6d7b8b7d082aa8eb8dab19482cdcd220e36dd3dc19df23545de0a71f952861923493456cfd3cf36123c54a0b7bf0e8064621b21f7712c040857071ca4eea0f40a99f510573ec971cb48030e811a1faded3e94be85f2fb00703d1ff26f96ab9f011a5b04d0c4f26fdb948a754c1b25668c2491483d5d5d611617d6b8f0fe32cb779b492ce65168b4c774a4701eefd8f3a02d56e6e8f13aeefe9a63fa5a89d1970e91d908f3d46003e1480d173e28b37827c9b977348ab92ce16890237d1ec907ee3e8e3d8f60d0e1f4583d009f7d9860662acff89bad1c1faad0717493f7ce7713ed8cb0995c255f2a317a26427b67198f6a70f51c0a41b902279ed1187f23cc17130b7c74de65eac77a7a8f05517e41e2deefa4930576db60fa7a8ee1535134df3e93e7b82e0817476439fd6a9070a49f6fbe4a3077739db99b15c001146dd13a46cf1cc1f83943c62e51de76b0738fc9381e8f3390f0236b252e124999e11724fd833196164bacadb87848224fe874f779b43fe9f2dca928956d505a96dbb3f9bdc18661e00534c26d1a7a40e13912a11c9454280da41048a9915c75585df500074d53d816dc9edd229528ef0db66dbbea3ffdaffa471f1f28d8344df1bf800f1a6e9aa6f813c39885bc050f269c0000000049454e44ae426082 + + + + adept/extendablelist.h + + + + adept/packageinfo.h + +
    diff --git a/adept/libadept/listerpredicate.h b/adept/libadept/listerpredicate.h new file mode 100644 index 0000000..98f1b41 --- /dev/null +++ b/adept/libadept/listerpredicate.h @@ -0,0 +1,14 @@ +// -*- C++ -*- +#include +#include + +#ifndef EPT_LISTERPREDICATE_H +#define EPT_LISTERPREDICATE_H + +namespace adept { +using namespace aptFront; +using namespace cache; +typedef predicate::Predicate< entity::Entity > ListerPredicate; +} + +#endif diff --git a/adept/libadept/packagedetails.cpp b/adept/libadept/packagedetails.cpp new file mode 100644 index 0000000..4e97fd4 --- /dev/null +++ b/adept/libadept/packagedetails.cpp @@ -0,0 +1,253 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +using namespace adept; + +PackageDetails::PackageDetails( QWidget *w, const char *n ) + : PackageDetailsUi( w, n ), + m_thread( 0 ), + m_qtMutex( true ), + m_logicalAct( 0 ), m_removeAct( 0 ), + m_fileListRunning( false ) +{ + m_toolbar->setIconSize( 22 ); + m_toolbar->setIconText( KToolBar::IconTextRight ); + + m_toolbar->insertButton( u8( "back" ), BBack, false, i18n( "Back" ) ); + m_toolbar->insertButton( u8( "forward" ), BForward, false, i18n( "Forward" ) ); + m_toolbar->insertLineSeparator(); + m_toolbar->insertButton( u8( "" ), BShow, true, i18n( "Show List" ) ); + + m_tags->setTitle( i18n( "Assigned Tags" ) ); + + m_lister->setRangeProvider( this ); // wee + // m_lister->setOpenToplevel( true ); + + m_description->setPaper( QBrush( colorGroup().background() ) ); + + connect( m_toolbar->getButton( BShow ), SIGNAL( clicked() ), + this, SIGNAL( showList() ) ); + connect( m_toolbar->getButton( BBack ), SIGNAL( clicked() ), + this, SIGNAL( back() ) ); + connect( m_toolbar->getButton( BForward ), SIGNAL( clicked() ), + this, SIGNAL( forward() ) ); + connect( m_lister, SIGNAL( detailsRequested( Lister::Entity ) ), + this, SIGNAL( detailsRequested( Lister::Entity ) ) ); + + observeComponent< component::State >(); + + adjustFontSize( m_name, 1 ); + + Cache &c = cache::Global::get( m_cache ); + component::Packages::iterator i = c.packages().packagesBegin(); + while ( !i->hasVersion() ) ++i; // ha hum... + setPackage( *i ); +} + +Lister::Range PackageDetails::listerRange() { + utils::Range< entity::Relation > r = m_package.depends(); + utils::VectorRange< entity::Entity > vr; + while ( r != r.end() ) { + if ( !r->targetPackages().empty() ) + std::cerr << r->targetPackages()->name() << std::endl; + vr.consume( *r ); + r = r.next(); + } + return vr.sorted(); +} + +void PackageDetails::loadFileListWorker() +{ + entity::Package p = m_package; + + std::string fl, flfile = "/var/lib/dpkg/info/" + p.name() + ".list"; + std::ifstream ifl( flfile.c_str() ); + + int i = 0; + kdDebug() << "PackageDetails::loadFileListWorker() entering loop" << endl; + + while ( ifl.is_open() && !ifl.eof() ) { + std::string line; + getline( ifl, line ); + if ( line == "/." || line == "" ) + continue; // nasty evil thing go away + m_qtMutex.lock(); + KURL url( "file:///" ); + url.addPath( u8( line ) ); + KFileItem *it = new KFileItem( url, u8( "" ), 0 ); + it->setName( u8( line ) ); + m_fileList->insertItem( it ); + ++i; + m_qtMutex.unlock(); + } + kdDebug() << "PackageDetails::loadFileListWorker() leaving loop" << endl; + ifl.close(); +} + +void PackageDetails::notifyPreRebuild( component::Base * ) { + kdDebug() << "PackageDetails::notifyPreRebuild()" << endl; + Threads::wait(); + m_logical->setEnabled( false ); + m_remove->setEnabled( false ); + m_logical->disconnect( SIGNAL( clicked() ) ); + m_remove->disconnect( SIGNAL( clicked() ) ); + delete m_logicalAct; + delete m_removeAct; + kdDebug() << "PackageDetails::notifyPreRebuild() done" << endl; +} + +void PackageDetails::loadFileList() { + Cache &c = cache::Global::get( m_cache ); + if ( m_fileListRunning || !c.isOpen() ) { + QTimer::singleShot( 100, this, SLOT( loadFileList() ) ); + return; + } + + kdDebug() << "PackageDetails::loadFileList()" << endl; + m_fileListRunning = true; + + // the following call is neccessary to invoke buildDefaultType of KMimeType + // the first time the method is called it will check for + // existence of application/octet-stream and *popup a dialog* if + // not found -- we don't want that to happen in a non-gui thread + KMimeType::defaultMimeTypePtr(); + m_thread = asyncCall( std::mem_fun( &PackageDetails::loadFileListWorker ), this ); + + m_qtMutex.lock(); + m_fileList->KFileView::clear(); + c.progress().OverallProgress( 0, 0, 0, i18n( "Loading filelist..." ) ); + + m_qtMutex.unlock(); + Threads::enqueue( m_thread, &m_qtMutex ); + Threads::wait(); + c.progress().Done(); + m_fileListRunning = false; + kdDebug() << "PackageDetails::loadFileList() finished" << endl; +} + +void PackageDetails::setPackage( cache::entity::Package p ) +{ + kdDebug() << "PackageDetails::setPackage()" << endl; + m_package = p.stable(); + m_name->setText( QString( "" ) + + p.name( std::string( "No package" ) ) + "" ); + m_info->setPackage( p ); + QString l = p.longDescription( + std::string( i18n( "No long description available" ).local8Bit() ) ); + m_description->setText( QString( "" ) + + formatLongDescription( l ) + "" ); + + std::string na = u8( i18n( "not available" ) ); + m_tags->setTags( p.tags( entity::Package::TagSet() ) ); + m_tags->openToplevel(); + m_architecture->setText( labelFormat( i18n( "Architecture: " ), + p.architecture( na ) ) ); + m_filename->setText( labelFormat( i18n( "Filename: " ), p.fileName( na ) ) ); + m_md5->setText( labelFormat( i18n( "MD5: " ), p.md5sum( na ) ) ); + m_source->setText( labelFormat( i18n( "Source Package: " ), p.source( na ) ) ); + + + notifyPostChange( 0 ); + m_lister->cleanRebuild(); + loadFileList(); +} + +void PackageDetails::notifyPostChange( cache::component::Base * ) +{ + kdDebug() << "PackageDetails::notifyPostChange()" << endl; + // without the timer to break it, there could be a loop where + // we connect the clicked() signal to a slot which would be + // invoked right away when we return -> evil + QTimer::singleShot( 0, this, SLOT( updateLogical() ) ); +} + +void PackageDetails::notifyPostRebuild( cache::component::Base *b ) +{ + kdDebug() << "PackageDetails::notifyPostRebuild( " << b << " )" << endl; + // can't call directly because stable entities are not guaranteed + // to be stabilised at this point yet + QTimer::singleShot( 0, this, SLOT( updateLogical() ) ); + QTimer::singleShot( 0, this, SLOT( loadFileList() ) ); + m_lister->cleanRebuild(); +} + +void PackageDetails::updateLogical() +{ + Cache &c = cache::Global::get( m_cache ); + if ( !c.isOpen() ) { + QTimer::singleShot( 100, this, SLOT( updateLogical() ) ); + return; + } + kdDebug() << "PackageDetails::updateLogical()" << endl; + entity::Package p = m_package; + kdDebug() << "PackageDetails::updateLogical: p = " << p.name() + << " p.component() = " << &p.component() << endl; + if ( !p.valid() ) return; // nothing to update + EntityActor *a = 0, *b = 0; + + if ( p.canUpgrade() ) { + a = new EntityActor( p.upgrade() ); + } else if ( p.canInstall() ) { + a = new EntityActor( p.install() ); + } else if ( p.canKeep() ) { + a = new EntityActor( p.keep() ); + } + + if ( p.canRemove() ) { + b = new EntityActor( p.remove() ); + } + + if ( a ) { + m_logical->setEnabled( true ); + m_logical->setText( u8( a->actor().prettyName() ) ); + connect( m_logical, SIGNAL( clicked() ), + a, SLOT( destructiveAct() ) ); + } else { + m_logical->setText( i18n( "Install" ) ); + m_logical->setEnabled( false ); + } + + if ( b ) { + m_remove->setEnabled( true ); + m_remove->setText( u8( b->actor().prettyName() ) ); + connect( m_remove, SIGNAL( clicked() ), + b, SLOT( destructiveAct() ) ); + } else { + m_remove->setText( i18n( "Remove" ) ); + m_remove->setEnabled( false ); + } + + m_logicalAct = a; + m_removeAct = b; + // std::copy( r, r.last(), vr ); + + // r.consume( utils::upcastRange< entity::Entity >( p.depends() ) ); +} + +void PackageDetails::setHasForward( bool e ) { + m_toolbar->setItemEnabled( BForward, e ); + // m_forward->setEnabled( e ); +} + +void PackageDetails::setHasBack( bool e ) { + m_toolbar->setItemEnabled( BBack, e ); + // m_back->setEnabled( e ); +} diff --git a/adept/libadept/packagedetails.h b/adept/libadept/packagedetails.h new file mode 100644 index 0000000..655e226 --- /dev/null +++ b/adept/libadept/packagedetails.h @@ -0,0 +1,55 @@ +/* -*- C++ -*- adept/packagedetails.h + written by Peter Rockai */ + +#include +#include +#include + +#include +#include + +#ifndef EPT_PACKGEDETAILS_H +#define EPT_PACKGEDETAILS_H + +class KToolBarButton; +class QThread; + +namespace adept { + +using namespace aptFront; + +class PackageDetails : public PackageDetailsUi, public Lister::RangeProvider, + public cache::Observer +{ + Q_OBJECT +public: + enum ButtonID { BForward, BBack, BShow }; + PackageDetails( QWidget *p = 0, const char *n = 0 ); + void setPackage( cache::entity::Package ); + void setHasForward( bool ); + void setHasBack( bool ); + virtual Lister::Range listerRange(); + void notifyPostChange( cache::component::Base * ); + void notifyPreRebuild( cache::component::Base * ); + void notifyPostRebuild( cache::component::Base * ); +signals: + void showList(); + void back(); + void forward(); + void detailsRequested( Lister::Entity ); +protected slots: + void loadFileList(); + void updateLogical(); +protected: + void loadFileListWorker(); + cache::entity::StablePackage m_package; + QMutex m_qtMutex; + QThread *m_thread; + QGuardedPtr< EntityActor > m_logicalAct, m_removeAct; + int m_fileListRunning; + +}; + +} + +#endif diff --git a/adept/libadept/packagedetailsui.ui b/adept/libadept/packagedetailsui.ui new file mode 100644 index 0000000..dacf7be --- /dev/null +++ b/adept/libadept/packagedetailsui.ui @@ -0,0 +1,464 @@ + +PackageDetailsUi + + + PackageDetailsUi + + + + 0 + 0 + 705 + 529 + + + + Form1 + + + + unnamed + + + 0 + + + 0 + + + + m_toolbar + + + + + frame3 + + + + 5 + 5 + 0 + 8 + + + + NoFrame + + + Raised + + + + unnamed + + + 2 + + + + m_name + + + + 5 + 0 + 0 + 0 + + + + (title) + + + + + m_info + + + + 5 + 4 + 8 + 0 + + + + + 0 + 75 + + + + + + spacer4 + + + Vertical + + + Expanding + + + + 20 + 16 + + + + + + m_remove + + + (remove) + + + + + spacer2 + + + Horizontal + + + Fixed + + + + 20 + 20 + + + + + + m_logical + + + (logical) + + + + + spacer1 + + + Horizontal + + + Fixed + + + + 20 + 20 + + + + + + m_description + + + + 5 + 5 + 28 + 0 + + + + NoFocus + + + NoFrame + + + Sunken + + + AutoOneFit + + + Auto + + + AlwaysOff + + + description... + + + + + + + tabWidget2 + + + + 7 + 7 + 0 + 16 + + + + + tab + + + Package Relationships + + + + unnamed + + + 0 + + + + m_lister + + + + 5 + 5 + 0 + 0 + + + + + 0 + 120 + + + + + + + + tab + + + Installed Files + + + + unnamed + + + 0 + + + + m_fileList + + + + + + + TabPage + + + Additional Information + + + + unnamed + + + + m_tags + + + + 5 + 7 + 0 + 0 + + + + + 200 + 0 + + + + + + layout9 + + + + unnamed + + + 0 + + + + m_source + + + source + + + + + m_architecture + + + + 5 + 4 + 0 + 0 + + + + architecture + + + + + m_filename + + + file + + + + + m_md5 + + + md5 + + + + + spacer7 + + + Vertical + + + Expanding + + + + 20 + 61 + + + + + + + + + + + + + adept::TagChooser +
    adept/tagchooser.h
    + + -1 + -1 + + 0 + + 5 + 5 + 0 + 0 + + image0 +
    + + adept::PackageInfo +
    adept/packageinfo.h
    + + -1 + -1 + + 0 + + 5 + 5 + 0 + 0 + + image0 +
    + + adept::Lister +
    adept/lister.h
    + + -1 + -1 + + 0 + + 5 + 5 + 0 + 0 + + image0 +
    + + KToolBar +
    ktoolbar.h
    + + -1 + -1 + + 1 + + 5 + 5 + 0 + 0 + + image0 +
    + + KFileDetailView +
    kfiledetailview.h
    + + -1 + -1 + + 0 + + 5 + 5 + 0 + 0 + + image0 +
    +
    + + + 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b249444154388db5944d4c5c5518869f73ce9db9cc40f929cc30300e18129a50685268a28291982e1a2175212eaab1c49d3f8971e7aec6aedb54a32b435dd8685cb8c0c4b8b0feb421b7bd8186a069d23209144b18cb0c02f3732ff3c3ccbdd705a571941213f1dd9d93739ef37e6fbeef08d334d9d5d0d090c701c8344d2176c1a6697a5d5d5dd8b64d2a95c2b2ac7f05b12c8b783c8e6118d8b6fd685fdb753a39394928e2a7c55724d693a7e214104220242805520a84d8b9e4790f0b1302c7751958f1e30534be9fa41a0c60db362dbe227f64af91b6e7719c2dfc0117a71c603da591de2882a7d3d4ec27122b10acad50aeb88044d542b84de3af7ab44aa55274f4e449dbf354bc347aa096fbf37e7efa2ecbad1b36907d78b289de8120232f37726250c3f52cf0a026a0f6065b9645d929e038167aa096d91b307171059034b5f8e9e9eb44fa052b4b25eeccd9dc99cb71f6ad082fbea2e351c075bdbdc13b9109fc01b83fef63e2e232e03076b68393231a0dcd024daf502c1e66e67a89cb971ef0e5a74bb4b61e6378248094b92ab0ac024b70ca017ef8360394187b2dc6d8b89ffa500e4d4f93d9083275d5e6f9913ade3dd70ee87c7d25c95646a25415aadab152b09ed4f8c5cc130a853839eac3951b684a61e70ef3f9c739668c24eba912afbfddc6d4d506e6a6d7b8b7d082aa8eb8dab19482cdcd220e36dd3dc19df23545de0a71f952861923493456cfd3cf36123c54a0b7bf0e8064621b21f7712c040857071ca4eea0f40a99f510573ec971cb48030e811a1faded3e94be85f2fb00703d1ff26f96ab9f011a5b04d0c4f26fdb948a754c1b25668c2491483d5d5d611617d6b8f0fe32cb779b492ce65168b4c774a4701eefd8f3a02d56e6e8f13aeefe9a63fa5a89d1970e91d908f3d46003e1480d173e28b37827c9b977348ab92ce16890237d1ec907ee3e8e3d8f60d0e1f4583d009f7d9860662acff89bad1c1faad0717493f7ce7713ed8cb0995c255f2a317a26427b67198f6a70f51c0a41b902279ed1187f23cc17130b7c74de65eac77a7a8f05517e41e2deefa4930576db60fa7a8ee1535134df3e93e7b82e0817476439fd6a9070a49f6fbe4a3077739db99b15c001146dd13a46cf1cc1f83943c62e51de76b0738fc9381e8f3390f0236b252e124999e11724fd833196164bacadb87848224fe874f779b43fe9f2dca928956d505a96dbb3f9bdc18661e00534c26d1a7a40e13912a11c9454280da41048a9915c75585df500074d53d816dc9edd229528ef0db66dbbea3ffdaffa471f1f28d8344df1bf800f1a6e9aa6f813c39885bc050f269c0000000049454e44ae426082 + + + + + ktoolbar.h + adept/packageinfo.h + adept/lister.h + kfiledetailview.h + adept/tagchooser.h + +
    diff --git a/adept/libadept/packageinfo.cpp b/adept/libadept/packageinfo.cpp new file mode 100644 index 0000000..dac788b --- /dev/null +++ b/adept/libadept/packageinfo.cpp @@ -0,0 +1,181 @@ +/** -*- C++ -*- + @file adept/packageinfo.cpp + @author Peter Rockai +*/ + +#include +#include +#include +#include +#include + +#include +#include + +using namespace adept; +using namespace cache; + +PackageInfo::PackageInfo( QWidget *p, const char *n ) + : PackageInfoUi( p, n ), m_specificVersion( false ) +{ + observeComponent< component::State >(); +} + +void PackageInfo::adjustFontSize( int s ) { + adept::adjustFontSize( m_status, s ); + adept::adjustFontSize( m_change, s ); + adept::adjustFontSize( m_section, s ); + adept::adjustFontSize( m_installedSize, s ); + adept::adjustFontSize( m_maintainer, s ); + adept::adjustFontSize( m_candidateVer, s ); + adept::adjustFontSize( m_installedVer, s ); +} + +void PackageInfo::hideStatus() { + m_status->hide(); + m_change->hide(); +} + +namespace adept { + +QColor statusColor( entity::Package p ) +{ + if ( !p.valid() ) + return Qt::black; + + QColor c = Qt::blue; + if (p.isInstalled()) + c = Qt::darkGreen; + if (p.isUpgradable()) + c = Qt::darkYellow; + if (p.isBroken()) + c = Qt::red; + return c; +} + +QColor actionColor( entity::Package p ) +{ + if ( !p.valid() ) + return Qt::black; + + QColor c = Qt::blue; + if (p.markedNewInstall()) + c = Qt::darkGreen; + if (p.markedUpgrade()) + c = Qt::darkYellow; + if (p.markedReInstall()) + c = Qt::darkYellow; + if (p.markedRemove()) + c = Qt::darkRed; + if (p.markedPurge()) + c = Qt::red; + if (p.willBreak()) + c = Qt::red; + return c; +} + +/* QString hexColor( QColor c ) +{ + QString r( "#%1%2%3" ); + return r.arg( c.red(), -2, 16 ).arg( c.green(), -2, 16 ).arg( c.blue(), -2, 16 ); + } */ + +QString colorify( QColor c, QString s ) +{ + return QString( "" + s + ""; +} + +QString formatLongDescription( QString l ) +{ + QRegExp rx( u8( "^(.*)\n" ) ); + rx.setMinimal( true ); + l.replace( rx, u8( "\\1

    " ) ); + rx = QRegExp( u8( "\\n[ ]*\\.\\n" ) ); + l.replace( rx, u8( "

    " ) ); + rx = QRegExp( u8( "\n " ) ); + l.replace( rx, u8( " " ) ); + rx = QRegExp( u8( "\n - (.*)(\n|$)" ) ); + rx.setMinimal( true ); + l.replace( rx, u8( "\n

  • \\1
  • \n" ) ); + l.replace( rx, u8( "\n
  • \\1
  • \n" ) ); + return QString( "

    " ) + l + u8( "

    " ); +} + +void PackageInfo::setPackage( entity::Package p ) +{ + kdDebug() << "PackageInfo::setPackage()" << endl; + // ho hum, probably XXX fix libapt-front? + setVersion( p.valid() ? p.anyVersion() : entity::Version(), false ); +} + +void PackageInfo::setVersion( entity::Version v, bool specific ) +{ + m_specificVersion = specific; + m_version = v.stable(); + if ( !m_version.valid() ) return; + kdDebug() << "PackageInfo::setVersion() (valid)" << endl; + m_section->setText( + labelFormat( i18n( "Section:" ), u8( v.section( u8( i18n( "Unknown" ) ) ) ) ) ); + m_maintainer->setText( + labelFormat( i18n( "Maintainer:" ), u8( v.maintainer( u8( i18n( "Unknown" ) ) ) ), + false ) ); + + notifyPostChange( 0 ); +} + +void PackageInfo::notifyPostRebuild( component::Base *b ) { + return notifyPostChange( b ); +} + +void PackageInfo::notifyPostChange( component::Base * ) +{ + if ( !m_version.valid() ) return; + entity::Version v = m_version; + entity::Package p = v.package(); + QString cv = i18n( "n/a" ), iv = i18n( "n/a" ), is = i18n( "n/a" ), status, action; + + if (p.valid()) { + entity::Version _cv = p.candidateVersion(); + entity::Version _iv = p.installedVersion(); + + if (_cv.valid()) { + cv = u8( _cv.versionString() ); + is = u8( _cv.installedSizeString() ); + } + + if (_iv.valid()) { + iv = _iv.versionString(); + } + } + + std::string unk = u8( i18n( "unknown" ) ); + /* m_status->setText( i18n( "Currently " ) + colorify( + statusColor( p ), + u8( p.statusString( unk ) ) ) + + i18n( ", " ) + colorify( + actionColor( p ), + u8( p.actionString( unk ) ) ) + i18n( " + requested" ) ); */ + m_status->setText( + labelFormat( i18n( "Status:" ), colorify( + statusColor( p ), + u8( p.statusString( u8( i18n( "Unknown" ) ) ) ) ) ) ); + m_change->setText( + labelFormat( i18n( "Requested change:" ), colorify( + actionColor( p ), + u8( p.actionString( u8( i18n( "Unknown" ) ) ) + ) ) ) ); + + m_candidateVer->setText( + m_specificVersion ? + labelFormat( i18n( "Version:" ), + v.versionString() + "(" + i18n( "candidate" ) + " " + cv + ")" ) + : labelFormat( i18n( "Candidate Version:" ), cv ) ); + m_installedVer->setText( + labelFormat( i18n( "Installed Version:" ), iv ) ); + m_installedSize->setText( + labelFormat( i18n( "Installed Size:" ), is ) ); +} + +} diff --git a/adept/libadept/packageinfo.h b/adept/libadept/packageinfo.h new file mode 100644 index 0000000..1a83c0d --- /dev/null +++ b/adept/libadept/packageinfo.h @@ -0,0 +1,49 @@ +/* -*- C++ -*- adept/packageinfo.h + written by Peter Rockai */ + +#include +#include +#include + +#ifndef EPT_PACKAGEINFO_H +#define EPT_PACKAGEINFO_H + +namespace adept { + +using namespace aptFront; + +class PackageInfo : public PackageInfoUi, public cache::Observer +{ + Q_OBJECT +public: + PackageInfo( QWidget *p, const char *n = 0 ); +public slots: + void setVersion( cache::entity::Version v, bool = true ); + void setPackage( cache::entity::Package v ); + void adjustFontSize( int ); +public: + void notifyPostChange( cache::component::Base * ); + void notifyPostRebuild( cache::component::Base * ); + void hideStatus(); +protected: + cache::entity::StableVersion m_version; + bool m_specificVersion; +}; + +inline QString labelFormat( const QString &what, + const QString &txt, bool nobr = true ) +{ + QString ret = "" + what + " " + (nobr ? "" : "") + + txt + (nobr ? "" : ""); + return ret; +} + +QColor actionColor( cache::entity::Package p ); +QColor statusColor( cache::entity::Package p ); + +QString formatLongDescription( QString in ); +QString colorify( QColor c, QString s ); + +} + +#endif diff --git a/adept/libadept/packageinfoui.ui b/adept/libadept/packageinfoui.ui new file mode 100644 index 0000000..d7d5dc5 --- /dev/null +++ b/adept/libadept/packageinfoui.ui @@ -0,0 +1,180 @@ + +PackageInfoUi + + + details + + + + 0 + 0 + 253 + 128 + + + + Form2 + + + + unnamed + + + 1 + + + 0 + + + + m_indent + + + + 0 + 0 + 0 + 0 + + + + + 16 + 5 + + + + + 16 + 5 + + + + + + + + + m_maintainer + + + + 5 + 0 + 0 + 0 + + + + + 100 + 0 + + + + maintainer + + + AlignBottom + + + + + m_candidateVer + + + + 5 + 0 + 0 + 0 + + + + candidate version + + + + + m_installedVer + + + + 5 + 0 + 0 + 0 + + + + installed version + + + + + m_section + + + + 5 + 0 + 0 + 0 + + + + section + + + + + m_installedSize + + + + 5 + 0 + 0 + 0 + + + + installed size + + + + + m_status + + + + 5 + 0 + 0 + 0 + + + + status + + + + + m_change + + + + 5 + 0 + 0 + 0 + + + + change + + + + + + diff --git a/adept/libadept/progress.cpp b/adept/libadept/progress.cpp new file mode 100644 index 0000000..60a3bd3 --- /dev/null +++ b/adept/libadept/progress.cpp @@ -0,0 +1,58 @@ +#include +#include +#include +#include +#include + +using namespace adept; + +Progress::Progress() + : m_pbar( 0 ), m_sbar( 0 ), m_busy( false ) +{ +} + +void Progress::Update () +{ + if (!m_sbar) + return; + if (!m_pbar) { + if (Percent) { + m_pbar = new KProgress( m_sbar ); + m_pbar->setMinimumWidth( 80 ); + m_pbar->setMaximumWidth( 120 ); + m_pbar->setTextEnabled( false ); + m_pbar->show(); + m_sbar->addWidget( m_pbar, 0, true ); + m_pbar->setTotalSteps( 100 ); + } + MajorChange = true; + } + if (MajorChange) { + if ( !m_busy ) { + QApplication::setOverrideCursor( QCursor( Qt::BusyCursor ) ); + m_busy = true; + } + m_sbar->message( u8( Op + "..." ) ); + } + if (CheckChange (0.05) == false) + return; + // kdDebug() << "Progress::Update()" << endl; + if (m_pbar) + m_pbar->setProgress( Percent ); + kapp->processEvents(); +} + +void Progress::Done () +{ + kdDebug() << "Progress::Done()" << endl; + + QApplication::restoreOverrideCursor(); + m_busy = false; + + if (m_sbar) + m_sbar->clear(); + delete m_pbar; + m_pbar = 0; +} + +Progress::~Progress() {} diff --git a/adept/libadept/progress.h b/adept/libadept/progress.h new file mode 100644 index 0000000..aef3d92 --- /dev/null +++ b/adept/libadept/progress.h @@ -0,0 +1,30 @@ +/** -*- C++ -*- + @file adept/progress.h + @author Peter Rockai +*/ + +#include +#include +#include + +#ifndef EPT_PROGRESS_H +#define EPT_PROGRESS_H + +namespace adept { + +class Progress : public OpProgress { +public: + Progress(); + virtual ~Progress(); + virtual void Update(); + virtual void Done(); + void setStatusBar( KStatusBar *b ) { m_sbar = b; } +protected: + KProgress *m_pbar; + KStatusBar *m_sbar; + bool m_busy; +}; + +} + +#endif diff --git a/adept/libadept/quickfilter.cpp b/adept/libadept/quickfilter.cpp new file mode 100644 index 0000000..2cb0577 --- /dev/null +++ b/adept/libadept/quickfilter.cpp @@ -0,0 +1,79 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "quickfilter.h" + +using namespace aptFront; +using namespace adept; + +QuickFilterWidget::QuickFilterWidget( QWidget *parent, const char *name ) + : QuickFilterUi( parent, name ) +{ + setFocusProxy( m_match ); + connect( m_match, SIGNAL( textChanged( const QString & ) ), + this, SLOT( textChanged( const QString & ) ) ); + /* connect( m_reset, SIGNAL( clicked() ), + this, SLOT( reset() ) ); */ + connect( m_match, SIGNAL( returnPressed() ), + this, SLOT( widgetsChanged() ) ); + connect( &timer, SIGNAL( timeout() ), + this, SLOT( widgetsChanged() ) ); + + QObjectList *chld = queryList( "QCheckBox" ); + QObjectListIt it( *chld ); + while( it.current() != 0 ) { + connect( it.current(), SIGNAL( toggled( bool ) ), + this, SLOT( widgetsChanged() ) ); + ++it; + } +} + +void QuickFilterWidget::mouseReleaseEvent( QMouseEvent *e ) { + m_match->setFocus(); + QuickFilterUi::mouseReleaseEvent( e ); +} + +void QuickFilterWidget::textChanged( const QString & ) +{ + kdDebug() << "QuickFilterWidget::textChanged" << endl; + timer.start( 1000, true ); +} + +QuickFilterWidget::Predicate QuickFilterWidget::predicate() +{ + typedef QuickFilter< entity::Package > F; + F f; int w = 0; + if ( m_name->isChecked() ) w |= F::Name; + if ( m_description->isChecked() ) w |= F::Description; + if ( m_maintainer->isChecked() ) w |= F::Maintainer; + + f.setMatch( u8( m_match->text() ) ); + f.setWhat( w ); + + return predicate::adapt< entity::Entity >( f ); +} + +static void blockedSet( QCheckBox *b, bool v ) { + b->blockSignals( true ); + b->setChecked( v ); + b->blockSignals( false ); +} + +void QuickFilterWidget::predicateChanged() { + typedef QuickFilter< entity::Package > F; + F f = downcast< F >( m_pred ); + m_match->blockSignals( true ); + m_match->setText( f.match() ); + m_match->blockSignals( false ); + int w = f.what(); + + blockedSet( m_name, w & F::Name ); + blockedSet( m_description, w & F::Description ); + blockedSet( m_maintainer, w & F::Maintainer ); +} + diff --git a/adept/libadept/quickfilter.h b/adept/libadept/quickfilter.h new file mode 100644 index 0000000..788c9da --- /dev/null +++ b/adept/libadept/quickfilter.h @@ -0,0 +1,119 @@ +/** -*- C++ -*- + @file adept/quickfilter.h + @author Peter Rockai +*/ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#ifndef EPT_QUICKFILTER_H +#define EPT_QUICKFILTER_H + +class KLineEdit; + +namespace adept { + +template< typename T > +struct QuickFilter : predicate::Implementation< T, QuickFilter< T > >, + InterfacingPredicate +{ + enum Type { Regex, Substring, Exact }; + enum What { Name = 0x1, Description = 0x2, Maintainer = 0x4 }; + + QuickFilter() + : m_type( Substring ), m_match( "" ), m_what( Name | Description ) { + setupPredicate(); + } + + void setupPredicate() { + predicate::ArgumentList l; + l.push_back( m_match ); + predicate::Predicate< T > a = not predicate::True< T >(); + if ( m_what & Name ) a = a or predicate::Factory< T >::name( m_match ); + if ( m_what & Description ) + a = a or predicate::Factory< T >::description( m_match ); + if ( m_what & Maintainer ) + a = a or predicate::Factory< T >::maintainer( m_match ); + m_op = a; + /* m_op = predicate::map( + predicate::predicate( predicate::Factory< T >::description( "" ) + or predicate::Factory< T >::name( "" ) + or predicate::Factory< T + >::maintainer( "" ) ), l ); */ + } + + std::string summary() const { + return u8( i18n( "Search: " ) ) + "\"" + m_match + "\""; + } + + void parseArguments( const predicate::ArgumentList & ) {} + + bool operator==( const QuickFilter &o ) const { + return o.m_type == m_type && o.m_match == m_match; + } + + std::string typeString() const { + if (m_type == Regex) return "Regular Expression"; + if (m_type == Substring) return "Substring"; + if (m_type == Exact) return "Exact Match"; + } + + bool operator()( const T &p ) { + return m_op( p ); + } + + std::string match() const { + return m_match; + } + + void setMatch( const std::string &s ) { + m_match = s; + setupPredicate(); + } + + void setWhat( int w ) { + m_what = w; + setupPredicate(); + } + + int what() { return m_what; } + + virtual void reset() { + m_match = ""; + setupPredicate(); + } + +protected: + Type m_type; + std::string m_match; + int m_what; + predicate::Predicate< T > m_op; +}; + +class QuickFilterWidget : public QuickFilterUi +{ + Q_OBJECT +public: + QuickFilterWidget( QWidget *parent, const char *name = 0 ); + virtual Predicate predicate(); +public slots: + void predicateChanged(); +protected slots: + void textChanged( const QString & ); +protected: + void mouseReleaseEvent( QMouseEvent *e ); + QTimer timer; +}; + +} + +#endif diff --git a/adept/libadept/quickfilterui.ui b/adept/libadept/quickfilterui.ui new file mode 100644 index 0000000..d45c154 --- /dev/null +++ b/adept/libadept/quickfilterui.ui @@ -0,0 +1,130 @@ + +adept::QuickFilterUi + + + QuickFilterUi + + + + 0 + 0 + 805 + 31 + + + + QuickFilterUi + + + + unnamed + + + 2 + + + 1 + + + + m_title + + + <b>Search:&nbsp;</b> + + + + + m_match + + + + 5 + 0 + 0 + 0 + + + + + 200 + 0 + + + + + + spacer2 + + + Horizontal + + + Fixed + + + + 20 + 20 + + + + + + textLabel2 + + + Match: + + + AutoText + + + + + m_name + + + package name, + + + + + m_description + + + description, + + + + + m_maintainer + + + maintainer. + + + + + spacer3 + + + Horizontal + + + Expanding + + + + 41 + 21 + + + + + + + adept/filterlist.h + + + diff --git a/adept/libadept/sourceseditor.cpp b/adept/libadept/sourceseditor.cpp new file mode 100644 index 0000000..3b04cf6 --- /dev/null +++ b/adept/libadept/sourceseditor.cpp @@ -0,0 +1,165 @@ +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include "sourceseditor.h" +#include + +using namespace aptFront; +using namespace adept; + +SourcesEditor::SourcesEditor( std::string f, QWidget *p, const char *n ) + : SourcesEditorUi( p, n ), m_filename( f ) +{ + m_list->setSorting( -1 ); + m_list->setAcceptDrops( true ); + connect( m_close, SIGNAL( clicked() ), + this, SIGNAL( close() ) ); + connect( m_apply, SIGNAL( clicked() ), + this, SLOT( save() ) ); + connect( m_reset, SIGNAL( clicked() ), + this, SLOT( reset() ) ); + + connect( m_list, SIGNAL( contextMenuRequested( + QListViewItem *, const QPoint &, int) ), + this, SLOT( contextMenu( QListViewItem *, const QPoint & ) ) ); + + connect( m_newAdd, SIGNAL( clicked() ), + this, SLOT( newAdd() ) ); + + reset(); +} + +void SourcesEditor::newAdd() +{ + Sources::Entry e( true, Sources::Entry::Binary ); + std::string s = m_newLine->text(); + std::istringstream i( s ); + i >> e; + new EntryItem( e, m_list ); + m_newLine->setText( u8( "" ) ); +} + +void SourcesEditor::contextMenu( QListViewItem *, const QPoint &pt ) { + EntryItem *s = dynamic_cast< EntryItem * >( m_list->selectedItem() ); + if (!s) return; + KPopupMenu *m = new KPopupMenu (this); + m->insertItem( s->entry().enabled() ? i18n( "Disable" ) : i18n( "Enable" ), 0 ); + m->insertItem( i18n( "Clone" ), 1 ); + m->insertItem( i18n( "Remove" ), 2 ); + connect( m, SIGNAL( activated( int ) ), + this, SLOT( contextMenuActivated( int ) ) ); + m->exec( pt ); + delete m; +} + +void SourcesEditor::contextMenuActivated( int i ) { + EntryItem *s = dynamic_cast< EntryItem * >( m_list->selectedItem() ); + Sources::Entry e = s->entry(); + if (i == 0) { + e.setEnabled( !e.enabled() ); + s->setEntry( e ); + } + if (i == 2) + delete s; + if (i == 1) + new EntryItem( e, m_list, s ); +} + +void SourcesEditor::reset() { + std::ifstream in( m_filename.c_str() ); + m_sources.clear(); + in >> m_sources; + utils::Range< Sources::Entry > r = m_sources.entries(); + EntryItem *last = 0; + m_list->clear(); + while( r != r.end() ) { + last = last ? new EntryItem( *r, m_list, last ) : + new EntryItem( *r, m_list ); + ++ r; + } +} + +void SourcesEditor::save() { + m_sources.clear(); + EntryItem *i = dynamic_cast< EntryItem * >( m_list->firstChild() ); + while (i) { + m_sources.add( i->entry() ); + i = dynamic_cast< EntryItem * >( i->nextSibling() ); + } + std::ofstream out( m_filename.c_str() ); + out << m_sources; + std::cerr << "--" << m_sources << "--" << std::endl; + out.close(); + reset(); // re-parse +} + +/* void SourcesEditor::toggleSelectionEnabled() +{ + EntryItem *s = dynamic_cast< EntryItem * >( m_list->selectedItem() ); + if (s) { + Sources::Entry e = s->entry(); + e.setEnabled( !e.enabled() ); + s->setEntry( e ); + updateActions(); + } + } */ + +QString EntryItem::text( int c ) const { + if (entry().type() == Sources::Entry::Comment) { + if (c == 0) + if (entry().comment() == "") + return u8( "" ); + else + return entry().typeString(); + if (c == 1) + return entry().comment(); + return u8( "" ); + } + + if (c == 0) return entry().typeString(); + if (c == 1) return entry().url(); + if (c == 2) return entry().distribution(); + if (c == 3) return entry().components(); + return u8( "" ); +} + +void EntryItem::setText( int c, const QString &_s ) +{ + kdDebug() << "setText on column " << c << endl; + Sources::Entry e = entry(); + std::string s; + s = _s.local8Bit(); + if (c == 0) e.setTypeString( s ); + if (c == 1) + if (entry().type() == Sources::Entry::Comment) + e.setComment( s ); + else + e.setUrl( s ); + if (c == 2) e.setDistribution( s ); + if (c == 3) e.setComponents( s ); + setEntry( e ); + KListViewItem::setText( c, _s ); // stop qlistview from looping infinitely +} + +void EntryItem::paintCell (QPainter *p, const QColorGroup &cg, + int column, int width, int alignment ) +{ + QColorGroup _cg( cg ); + QColor c = _cg.text(); + QPixmap pm( width, height() ); + QPainter _p( &pm ); + if (!entry().enabled()) + c = Qt::gray; + _cg.setColor( QColorGroup::Text, c ); + KListViewItem::paintCell( &_p, _cg, column, width, AlignTop ); + p->drawPixmap( 0, 0, pm ); +} + diff --git a/adept/libadept/sourceseditor.h b/adept/libadept/sourceseditor.h new file mode 100644 index 0000000..32b474f --- /dev/null +++ b/adept/libadept/sourceseditor.h @@ -0,0 +1,63 @@ +/** -*- C++ -*- + @file adept/sourceseditor.h + @author Peter Rockai +*/ + +#include +#include +#include + +namespace adept { + +using namespace aptFront; + +class SourcesEditor : public SourcesEditorUi +{ + Q_OBJECT +public: + SourcesEditor( std::string f, QWidget *p = 0, const char *n = 0 ); +public slots: + void save(); + void reset(); +protected slots: + void contextMenu( QListViewItem *, const QPoint & ); + void contextMenuActivated( int ); + void newAdd(); +signals: + void close(); +protected: + aptFront::Sources m_sources; + std::string m_filename; +}; + +class EntryItem : public KListViewItem { +public: + Sources::Entry entry() const { + return m_entry; + } + void setEntry( const Sources::Entry &e ) { + m_entry = e; + } + EntryItem( Sources::Entry e, KListView *v, EntryItem *prev ) + : KListViewItem( v, prev ), m_entry( e ) { + init(); + } + EntryItem( Sources::Entry e, KListView *v ) + : KListViewItem( v ), m_entry( e ) { + init(); + } + void init() { + setRenameEnabled( 0, false ); + setRenameEnabled( 1, true ); + setRenameEnabled( 2, true ); + setRenameEnabled( 3, true ); + } + QString text( int c ) const; + void setText( int c, const QString &s ); + virtual void paintCell (QPainter *p, const QColorGroup &cg, + int column, int width, int alignment); +protected: + Sources::Entry m_entry; +}; + +} diff --git a/adept/libadept/sourceseditorui.ui b/adept/libadept/sourceseditorui.ui new file mode 100644 index 0000000..43397d3 --- /dev/null +++ b/adept/libadept/sourceseditorui.ui @@ -0,0 +1,173 @@ + +adept::SourcesEditorUi + + + adept::SourcesEditorUi + + + + 0 + 0 + 683 + 442 + + + + adept::SourcesEditorUi + + + + unnamed + + + + + Type + + + true + + + false + + + + + URL + + + true + + + true + + + + + Distribution + + + true + + + true + + + + + Components + + + true + + + true + + + + m_list + + + true + + + AllColumns + + + true + + + true + + + true + + + true + + + + + layout5 + + + + unnamed + + + + textLabel1 + + + New Repository: + + + + + m_newLine + + + Write or paste a normal sources.list line here to add it to your sources + + + + + m_newAdd + + + Add + + + + + + + layout13 + + + + unnamed + + + + m_reset + + + Reset + + + + + m_apply + + + Apply + + + + + m_close + + + Close + + + + + + + + + + m_newLine + m_newAdd + m_reset + m_apply + m_close + m_list + + + + klistview.h + + diff --git a/adept/libadept/statefilter.cpp b/adept/libadept/statefilter.cpp new file mode 100644 index 0000000..45ee470 --- /dev/null +++ b/adept/libadept/statefilter.cpp @@ -0,0 +1,60 @@ +#include +#include +#include +#include +#include +#include +#include "statefilter.h" + +using namespace aptFront; +using namespace adept; + +StateFilterWidget::StateFilterWidget( QWidget *parent, const char *name ) + : StateFilterUi( parent, name ) +{ + QObjectList *chld = queryList( "QCheckBox" ); + QObjectListIt it( *chld ); + while( it.current() != 0 ) { + connect( it.current(), SIGNAL( toggled( bool ) ), + this, SLOT( widgetsChanged() ) ); + ++it; + } +} + +StateFilterWidget::Predicate StateFilterWidget::predicate() +{ + typedef StateFilter< entity::Package > F; + unsigned mask = 0; + if (m_installed->isChecked()) mask |= F::Installed; + if (m_notInstalled->isChecked()) mask |= F::NotInstalled; + if (m_upgradable->isChecked()) mask |= F::Upgradable; + if (m_keep->isChecked()) mask |= F::Keep; + if (m_install->isChecked()) mask |= F::Install; + if (m_remove->isChecked()) mask |= F::Remove; + if (m_upgrade->isChecked()) mask |= F::Upgrade; + + StateFilter< entity::Package > f; + f.setMask( mask ); + return predicate::adapt< entity::Entity >( f ); +} + +static void blockedSet( QCheckBox *b, bool v ) { + b->blockSignals( true ); + b->setChecked( v ); + b->blockSignals( false ); +} + +void StateFilterWidget::predicateChanged() +{ + typedef StateFilter< entity::Package > F; + F f = downcast< F >( m_pred ); + unsigned mask = f.mask(); + blockedSet( m_installed, mask & F::Installed ); + blockedSet( m_notInstalled, mask & F::NotInstalled ); + blockedSet( m_upgradable, mask & F::Upgradable ); + blockedSet( m_keep, mask & F::Keep ); + blockedSet( m_install, mask & F::Install ); + blockedSet( m_upgrade, mask & F::Upgrade ); + blockedSet( m_remove, mask & F::Remove ); +} + diff --git a/adept/libadept/statefilter.h b/adept/libadept/statefilter.h new file mode 100644 index 0000000..570edb1 --- /dev/null +++ b/adept/libadept/statefilter.h @@ -0,0 +1,144 @@ +/** -*- C++ -*- + @file adept/filterwidgets.h + @author Peter Rockai +*/ + +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + +#ifndef EPT_STATEFILTER_H +#define EPT_STATEFILTER_H + +class KLineEdit; + +namespace adept { + +template< typename T > +struct StateFilter : predicate::Implementation< T, StateFilter< T > >, + InterfacingPredicate +{ + enum Mask { Installed = 1 << 0, + NotInstalled = 1 << 1, + Upgradable = 1 << 2, + Install = 1 << 3, + Remove = 1 << 4, + Keep = 1 << 5, + Upgrade = 1 << 6 }; + + StateFilter() + : m_mask( 0xff ) { + setupPredicate(); + } + + void setupPredicate() { + predicate::Predicate< T > + p0 = not predicate::True< T >(), + p1 = not predicate::True< T >(); + if (m_mask & Installed) + p0 = p0 or (predicate::Factory< T >::member( &T::isInstalled ) + and not predicate::Factory< T >::member( &T::isUpgradable ) ); + if (m_mask & NotInstalled) + p0 = p0 or not predicate::Factory< T >::member( &T::isInstalled ); + if (m_mask & Upgradable) + p0 = p0 or predicate::Factory< T >::member( &T::isUpgradable ); + + if (m_mask & Install) + p1 = p1 or predicate::Factory< T >::member( &T::markedNewInstall ); + if (m_mask & Remove) + p1 = p1 or predicate::Factory< T >::member( &T::markedRemove ); + if (m_mask & Keep) + p1 = p1 or predicate::Factory< T >::member( &T::markedKeep ); + if (m_mask & Upgrade) + p1 = p1 or predicate::Factory< T >::member( &T::markedUpgrade ); + + m_op = p0 and p1; + } + + std::string summary() const { + std::ostringstream s; + std::vector< std::string > r; + s << "State filter: "; + if (m_mask & Installed && m_mask & NotInstalled && m_mask & Upgradable) + r.push_back( "Any State" ); + else { + if (m_mask & Installed) + r.push_back( i18n( "Installed" ) ); + if (m_mask & NotInstalled) + r.push_back( i18n( "Not Installed" ) ); + if (m_mask & Upgradable) + r.push_back( i18n( "Upgradable" ) ); + } + std::copy( r.begin(), r.end(), + std::ostream_iterator< std::string >( s, " " ) ); + s << "; "; + r.clear(); + if (m_mask & Install && m_mask & Remove + && m_mask & Keep && m_mask & Upgrade) + r.push_back( i18n( "Any Action" ) ); + else { + if (m_mask & Install) + r.push_back( i18n( "Install" ) ); + if (m_mask & Remove) + r.push_back( i18n( "Remove" ) ); + if (m_mask & Keep) + r.push_back( i18n( "Keep" ) ); + if (m_mask & Upgrade) + r.push_back( i18n( "Upgrade" ) ); + } + std::copy( r.begin(), r.end(), + std::ostream_iterator< std::string >( s, " " ) ); + return s.str(); + } + + unsigned mask() const { + return m_mask; + } + + void setMask( unsigned m ) { + m_mask = m; + setupPredicate(); + } + + void parseArguments( const predicate::ArgumentList & ) {} + + bool operator==( const StateFilter &o ) const { + return o.m_op == m_op; + } + + bool operator()( const T &p ) { + return m_op( p ); + } + + virtual void reset() { + m_mask = 0xff; + setupPredicate(); + } + +protected: + unsigned m_mask; + predicate::Predicate< T > m_op; +}; + +class StateFilterWidget : public StateFilterUi +{ + Q_OBJECT +public: + StateFilterWidget( QWidget *parent, const char *name = 0 ); + virtual Predicate predicate(); +public slots: + void predicateChanged(); +}; + +} + +#endif diff --git a/adept/libadept/statefilterui.ui b/adept/libadept/statefilterui.ui new file mode 100644 index 0000000..1ef19e0 --- /dev/null +++ b/adept/libadept/statefilterui.ui @@ -0,0 +1,166 @@ + +adept::StateFilterUi + + + StateFilterUi + + + + 0 + 0 + 574 + 55 + + + + StateFilterUi + + + + unnamed + + + 2 + + + 1 + + + + m_title + + + Show: + + + AlignVCenter + + + + + layout4 + + + + unnamed + + + + m_notInstalled + + + not installed, + + + + + m_installed + + + installed, + + + + + m_upgradable + + + upgradable packages, + + + + + spacer2 + + + Horizontal + + + Expanding + + + + 195 + 16 + + + + + + + + layout5 + + + + unnamed + + + + m_keep + + + no changes, + + + + + m_install + + + install, + + + + + m_remove + + + removal, + + + + + m_upgrade + + + upgrade requested. + + + + + spacer2_2 + + + Horizontal + + + Expanding + + + + 195 + 16 + + + + + + + + textLabel3 + + + with: + + + AlignVCenter|AlignRight + + + + + + adept/filterlist.h + + + diff --git a/adept/libadept/tagchooser.cpp b/adept/libadept/tagchooser.cpp new file mode 100644 index 0000000..6443663 --- /dev/null +++ b/adept/libadept/tagchooser.cpp @@ -0,0 +1,144 @@ +#include +#include + +#include +#include +#include +#include +#include + +using namespace adept; + +FacetItem::FacetItem( TagChooser *t ) + : KListViewItem( t ) +{ +} + +void FacetItem::removeTag( TagItem::Tag t ) { + // kdDebug() << "removing tag " << t.fullname() << endl; + for ( QListViewItem *n, *i = firstChild(); i != 0; i = n ) { + n = i->nextSibling(); + if ( dynamic_cast< TagItem * >( i )->tag() == t ) + delete i; + } +} + +TagItem::TagItem( FacetItem *p ) + : KListViewItem( p ), m_toplevel( false ) +{ +} + +TagItem::TagItem( TagChooser *l ) + : KListViewItem( l ), m_toplevel( true ) +{ +} + +QString TagItem::text( int c ) const +{ + if (c != 0) return u8( "" ); + return QString( "[" ) + m_tag.name() + "] " + m_tag.shortDescription(""); +} + +TagChooser::TagChooser( QWidget *p, const char *n ) + : KListView( p, n ) +{ + observeComponent< cache::component::PackageTags >(); + // addColumn( " ", 20 ); + setRootIsDecorated( true ); + addColumn( i18n( "Available Tags" ) ); + setResizeMode( LastColumn ); + setDragEnabled( true ); + setAcceptDrops( true ); + viewport()->setAcceptDrops( false ); + // kdDebug() << "TagChooser: tags set" << endl; +} + +void TagChooser::openToplevel() { + QListViewItem *i; + for ( i = firstChild(); i != 0; i = i->nextSibling() ) { + i->setOpen( true ); + } +} + +QDragObject *TagChooser::dragObject() +{ + TagItem *sel = dynamic_cast< TagItem * >( selectedItem() ); + if (sel) + return new QTextDrag( sel->tag().fullname(), this ); + return 0; +} + +void TagChooser::dragEnterEvent( QDragEnterEvent *e ) +{ + // hmmmmm :-) + kdDebug() << "TagChooser::dragEnterEvent" << endl; + e->accept( dynamic_cast< TagList * >( e->source() ) + && QTextDrag::canDecode( e ) ); + kdDebug() << dynamic_cast< TagList * >( e->source() ) + << "; can decode " << QTextDrag::canDecode( e ) << endl; +} + +void TagChooser::dropEvent( QDropEvent* e ) +{ + TagList *tl = dynamic_cast< TagList * >( e->source() ); + QString tag; + QTextDrag::decode( e, tag ); + tl->setTags( tl->tags() - cache::Global::get().tags().tagByName( + static_cast< const char * >( tag.local8Bit() ) ) ); +} + +QString FacetItem::text( int column ) const +{ + if ( column == 0 ) + return QString( "[" ) + m_facet.name() + "] " + m_facet.shortDescription( "" ); + return u8( "" ); +} + +static bool drop( TagChooser::Tag t ) { + if ( t.facet().name() == "special" ) + return true; + if ( t.name() == "TODO" ) + return true; + return false; +} + +void TagChooser::setTags( Tag::Set s ) +{ + Tag::Set remove = m_tags - s; + Tag::Set add = s - m_tags; + m_tags = s; + Tag::Set::iterator i; + + for ( i = add.begin(); i != add.end(); ++i ) { + + if ( drop( *i ) ) + continue; + + FacetItem *fi = m_facets[ i->facet() ]; + if ( fi == 0 ) { + fi = m_facets[ i->facet() ] = new FacetItem( this ); + fi->setFacet( i->facet() ); + } + + TagItem *ti = new TagItem( fi ); + ti->setTag( *i ); + } + + for ( i = remove.begin(); i != remove.end(); ++i ) { + + if ( drop( *i ) ) + continue; + + FacetItem *fi = m_facets[ i->facet() ]; + fi->removeTag( *i ); + if ( fi->childCount() == 0 ) { + m_facets[ i->facet() ] = 0; + delete fi; + } + } + +} + +void TagChooser::notifyPreRebuild( cache::component::Base *b ) { + setTags( Tag::Set() ); +} diff --git a/adept/libadept/tagchooser.h b/adept/libadept/tagchooser.h new file mode 100644 index 0000000..082a60b --- /dev/null +++ b/adept/libadept/tagchooser.h @@ -0,0 +1,82 @@ +/* -*- C++ -*- file adept/tagchooser.h + written by Peter Rockai */ + +#include +#include + +#include +#include +#include + +#include + +#ifndef EPT_TAGCHOOSER_H +#define EPT_TAGCHOOSER_H + +namespace adept { + +using namespace aptFront; + +class FacetItem; +class FacetExtender; +class TagChooser; + +class TagItem : public KListViewItem { +public: + typedef cache::entity::Tag Tag; + virtual QString text( int ) const; + TagItem( TagChooser *t ); + TagItem( FacetItem *t ); + void setTag( Tag t ) { m_tag = t; } + Tag tag() { return m_tag; } +protected: + bool m_toplevel; + Tag m_tag; +}; + +class FacetItem : public KListViewItem +{ +public: + typedef cache::entity::Facet Facet; + virtual QString text( int ) const; + FacetItem( TagChooser *t ); + void setFacet( Facet f ) { m_facet = f; } + void removeTag( TagItem::Tag ); +protected: + Facet m_facet; +}; + +class TagChooser : public KListView, public cache::Observer // ExtendableList +{ + Q_OBJECT +public: + typedef cache::entity::Tag Tag; + typedef cache::entity::Facet Facet; + TagChooser( QWidget *p = 0, const char *n = 0 ); + virtual void notifyPreRebuild( cache::component::Base * ); +public slots: + virtual void setTags( TagChooser::Tag::Set ); + void setTitle( QString s ) { + setColumnText( 0, s ); + } + void openToplevel(); + +protected: + virtual void dragEnterEvent( QDragEnterEvent *e ); + virtual void dropEvent( QDropEvent* e ); + virtual void contentsDragEnterEvent( QDragEnterEvent *e ) { + kdDebug() << "TagChooser::contentsDragEnterEvent" << endl; + dragEnterEvent( e ); + } + virtual void contentsDropEvent( QDropEvent *e ) { + kdDebug() << "TagChooser::contentsDropEvent" << endl; + dropEvent( e ); + } + virtual QDragObject *dragObject(); + Tag::Set m_tags; + std::map< Facet, FacetItem * > m_facets; +}; + +} + +#endif diff --git a/adept/libadept/tagfilter.cpp b/adept/libadept/tagfilter.cpp new file mode 100644 index 0000000..4a08adc --- /dev/null +++ b/adept/libadept/tagfilter.cpp @@ -0,0 +1,67 @@ +/* -*- C++ -*- libapt/tagfilter.h + written by Peter Rockai */ + +#include +#include +#include + +#include + +#include +#include + +using namespace adept; + +TagFilterWidget::TagFilterWidget( QWidget *w, const char *n ) + : TagFilterUi( w, n ) +{ + m_wanted->setName( i18n( "Tags I Want (drop tags here)" ) ); + m_unwanted->setName( i18n( "Tags I Do Not Want (drop tags here)" ) ); + + connect( m_wanted, SIGNAL( tagsChanged( TagList::Tag::Set ) ), + this, SLOT( wantedChanged() ) ); + connect( m_unwanted, SIGNAL( tagsChanged( TagList::Tag::Set ) ), + this, SLOT( unwantedChanged() ) ); +} + +TagFilterWidget::Predicate TagFilterWidget::predicate() +{ + TagFilter< entity::Package > f; + f.setWanted( m_wanted->tags() ); + f.setUnwanted( m_unwanted->tags() ); + return predicate::adapt< entity::Entity >( f ); +} + +static void setTagsBlocking( TagList *l, TagList::Tag::Set s ) { + l->blockSignals( true ); + l->setTags( s ); + l->blockSignals( false ); +} + +void TagFilterWidget::predicateChanged() +{ + typedef TagFilter< entity::Package > F; + F f = downcast< F >( m_pred ); + setTagsBlocking( m_wanted, f.wanted() ); + setTagsBlocking( m_unwanted, f.unwanted() ); + if ( item() && item()->list() ) { + setupColors(); + item()->list()->delayedUpdateExtenders(); + } +} + +void TagFilterWidget::wantedChanged() +{ + setTagsBlocking( m_unwanted, m_unwanted->tags() - m_wanted->tags() ); + setupColors(); + widgetsChanged(); + item()->list()->delayedUpdateExtenders(); +} + +void TagFilterWidget::unwantedChanged() +{ + setTagsBlocking( m_wanted, m_wanted->tags() - m_unwanted->tags() ); + setupColors(); + widgetsChanged(); + item()->list()->delayedUpdateExtenders(); +} diff --git a/adept/libadept/tagfilter.h b/adept/libadept/tagfilter.h new file mode 100644 index 0000000..1afa44a --- /dev/null +++ b/adept/libadept/tagfilter.h @@ -0,0 +1,113 @@ +/* -*- C++ -*- adept/tagfilter.h + written by Peter Rockai */ + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#ifndef EPT_TAGFILTER_H +#define EPT_TAGFILTER_H + +namespace adept { + +using namespace Tagcoll; + +template< typename T > +struct TagFilter : predicate::Implementation< T, TagFilter< T > >, + InterfacingPredicate, cache::Observer +{ + typedef cache::entity::Tag Tag; + + TagFilter() { + setupPredicate(); + observeComponent< cache::component::Tags >(); + } + + void setupPredicate() { + Cache &cache = cache::Global::get(); // FIXME? + m_op = predicate::Factory< T >::tagSet( m_wanted ); + for (Tag::Set::iterator i = m_unwanted.begin(); i != m_unwanted.end(); ++i ) { + m_op = m_op and not predicate::Factory< T >::tag( *i ); + } + } + + std::string summary() const { + return u8( i18n( "Tag Filter" ) ); + } + + void parseArguments( const predicate::ArgumentList & ) {} + + bool operator==( const TagFilter &o ) const { + return o.m_wanted == m_wanted && o.m_unwanted == m_unwanted; + } + + bool operator()( const T &p ) { + return m_op( p ); + } + + void setWanted( Tag::Set t ) { + m_wanted = t; + setupPredicate(); + } + + void setUnwanted( Tag::Set t ) { + m_unwanted = t; + setupPredicate(); + } + + Tag::Set wanted() const { return m_wanted; } + Tag::Set unwanted() const { return m_unwanted; } + + void notifyPreRebuild( cache::component::Base * ) { + kdDebug() << "TagFilter pre-rebuild" << endl; + m_unwanted.clear(); m_wanted.clear(); + } + + void notifyPostRebuild( cache::component::Base * ) { + Cache &c = cache::Global::get( m_cache ); + setupPredicate(); + } + + virtual void reset() { + m_wanted.clear(); + m_unwanted.clear(); + setupPredicate(); + } + +protected: + predicate::Predicate< T > m_op; + Tag::Set m_wanted; + Tag::Set m_unwanted; +}; + +class TagFilterWidget : public TagFilterUi +{ + Q_OBJECT +public: + TagFilterWidget( QWidget *p, const char *n ); + virtual Predicate predicate(); +public slots: + void predicateChanged(); + void wantedChanged(); + void unwantedChanged(); +protected: + TagList *m_addingTo; + std::vector< entity::Tag > m_tagMenuMap; +}; + +} + +#endif diff --git a/adept/libadept/tagfilterui.ui b/adept/libadept/tagfilterui.ui new file mode 100644 index 0000000..1f78b8a --- /dev/null +++ b/adept/libadept/tagfilterui.ui @@ -0,0 +1,95 @@ + +adept::TagFilterUi + + + TagFilterUi + + + true + + + + 0 + 0 + 627 + 130 + + + + Form1 + + + + unnamed + + + 2 + + + 2 + + + + m_wanted + + + + 7 + 5 + 0 + 0 + + + + + 0 + 90 + + + + + + m_unwanted + + + + 7 + 5 + 0 + 0 + + + + + + + + adept::TagList +
    adept/taglist.h
    + + -1 + -1 + + 0 + + 5 + 5 + 0 + 0 + + image0 +
    +
    + + + 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b249444154388db5944d4c5c5518869f73ce9db9cc40f929cc30300e18129a50685268a28291982e1a2175212eaab1c49d3f8971e7aec6aedb54a32b435dd8685cb8c0c4b8b0feb421b7bd8186a069d23209144b18cb0c02f3732ff3c3ccbdd705a571941213f1dd9d93739ef37e6fbeef08d334d9d5d0d090c701c8344d2176c1a6697a5d5d5dd8b64d2a95c2b2ac7f05b12c8b783c8e6118d8b6fd685fdb753a39394928e2a7c55724d693a7e214104220242805520a84d8b9e4790f0b1302c7751958f1e30534be9fa41a0c60db362dbe227f64af91b6e7719c2dfc0117a71c603da591de2882a7d3d4ec27122b10acad50aeb88044d542b84de3af7ab44aa55274f4e449dbf354bc347aa096fbf37e7efa2ecbad1b36907d78b289de8120232f37726250c3f52cf0a026a0f6065b9645d929e038167aa096d91b307171059034b5f8e9e9eb44fa052b4b25eeccd9dc99cb71f6ad082fbea2e351c075bdbdc13b9109fc01b83fef63e2e232e03076b68393231a0dcd024daf502c1e66e67a89cb971ef0e5a74bb4b61e6378248094b92ab0ac024b70ca017ef8360394187b2dc6d8b89ffa500e4d4f93d9083275d5e6f9913ade3dd70ee87c7d25c95646a25415aadab152b09ed4f8c5cc130a853839eac3951b684a61e70ef3f9c739668c24eba912afbfddc6d4d506e6a6d7b8b7d082aa8eb8dab19482cdcd220e36dd3dc19df23545de0a71f952861923493456cfd3cf36123c54a0b7bf0e8064621b21f7712c040857071ca4eea0f40a99f510573ec971cb48030e811a1faded3e94be85f2fb00703d1ff26f96ab9f011a5b04d0c4f26fdb948a754c1b25668c2491483d5d5d611617d6b8f0fe32cb779b492ce65168b4c774a4701eefd8f3a02d56e6e8f13aeefe9a63fa5a89d1970e91d908f3d46003e1480d173e28b37827c9b977348ab92ce16890237d1ec907ee3e8e3d8f60d0e1f4583d009f7d9860662acff89bad1c1faad0717493f7ce7713ed8cb0995c255f2a317a26427b67198f6a70f51c0a41b902279ed1187f23cc17130b7c74de65eac77a7a8f05517e41e2deefa4930576db60fa7a8ee1535134df3e93e7b82e0817476439fd6a9070a49f6fbe4a3077739db99b15c001146dd13a46cf1cc1f83943c62e51de76b0738fc9381e8f3390f0236b252e124999e11724fd833196164bacadb87848224fe874f779b43fe9f2dca928956d505a96dbb3f9bdc18661e00534c26d1a7a40e13912a11c9454280da41048a9915c75585df500074d53d816dc9edd229528ef0db66dbbea3ffdaffa471f1f28d8344df1bf800f1a6e9aa6f813c39885bc050f269c0000000049454e44ae426082 + + + + adept/filterlist.h + + + + adept/taglist.h + +
    diff --git a/adept/libadept/taglist.cpp b/adept/libadept/taglist.cpp new file mode 100644 index 0000000..22b3d58 --- /dev/null +++ b/adept/libadept/taglist.cpp @@ -0,0 +1,134 @@ +/* -*- C++ -*- adept/taglist.cpp + written by Peter Rockai */ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +using namespace adept; + +TagLabel::TagLabel( Tag t, TagList *l, QWidget *p, const char *n ) + : QHBox( p, n ), m_tag( t ), m_list( l ) +{ + if ( t == Tag() ) { + m_description = new QLabel( QString( " " ) + i18n( "[none]" ), this ); + } else { + m_remove = new QLabel( this ); + m_remove->setPixmap( SmallIcon( u8( "cancel" ) ) ); + m_remove->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ); + m_description = new QLabel( QString( " [" ) + t.fullname( "n/a" ) + "] " + + t.shortDescription( "n/a" ), this ); + } +} + +void TagLabel::mouseReleaseEvent( QMouseEvent *e ) { + if ( e->button() == Qt::LeftButton && + dynamic_cast< QLabel * >( childAt( e->pos() ) ) == m_remove ) + m_list->setTags( m_list->tags() - m_tag ); +} + +TagList::TagList( QWidget *p, const char *n ) + : QVBox( p, n ) +{ + m_name = new QLabel( this ); + m_tagBox = new QVBox( this ); + m_tagBox->setFrameShape( QFrame::Panel ); + m_tagBox->setFrameShadow( QFrame::Sunken ); + m_updateScheduled = false; + setAcceptDrops( true ); + scheduleUpdateList(); + m_tagSpacer = new QSpacerItem( 0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding ); +} + +void TagList::setTags( Tag::Set t ) +{ + m_tags = t; + scheduleUpdateList(); + emit tagsChanged( m_tags ); +} + +void TagList::addTag( Tag t ) +{ + if ( t == Tag() ) + return; + m_tags += t; + scheduleUpdateList(); + emit tagsChanged( m_tags ); +} + +void TagList::setName( QString n ) +{ + m_name->setText( n ); +} + +void TagList::scheduleUpdateList() +{ + if (! m_updateScheduled) { + kdDebug() << "TagList: scheduling update" << endl; + QTimer::singleShot( 0, this, SLOT( updateList() ) ); + m_updateScheduled = true; + } +} + +void TagList::updateList() +{ + kdDebug() << "TagList (" + m_name->text() + "): updating list" << endl; + clearList(); + if ( m_tags.empty() ) { + appendLabel( new TagLabel( Tag(), this, m_tagBox ) ); + } else { + for ( Tag::Set::iterator i = m_tags.begin(); i != m_tags.end(); ++i ) { + appendLabel( new TagLabel( *i, this, m_tagBox ) ); + } + } + m_tagBox->layout()->addItem( m_tagSpacer ); + update(); + parentWidget()->adjustSize(); + m_updateScheduled = false; +} + +void TagList::appendLabel( TagLabel *l ) +{ + m_list.push_back( l ); + l->show(); +} + +void TagList::mouseMoveEvent( QMouseEvent *e ) { + TagLabel *child = dynamic_cast< TagLabel * >( childAt( e->pos() )->parentWidget() ); + if ( !child ) + return; + QDragObject *d = new QTextDrag( child->tag().fullname( "" ), this ); + d->dragCopy(); +} + +void TagList::dragEnterEvent( QDragEnterEvent *e ) { + kdDebug() << "TagList::dragEnterEvent" << endl; + e->accept( QTextDrag::canDecode( e ) ); +} + +void TagList::dropEvent( QDropEvent* e ) { + QString tag; + kdDebug() << "TagList: drop event" << endl; + QTextDrag::decode( e, tag ); + try { + addTag( cache::Global::get().tags().tagByName( + static_cast< const char * >( tag.local8Bit() ) ) ); + } catch (...) {} // not a tag, ignore + scheduleUpdateList(); +} + +void TagList::clearList() +{ + for (List::iterator i = m_list.begin(); i != m_list.end(); ++i ) { + delete *i; + } + m_list.clear(); + m_tagBox->layout()->removeItem( m_tagSpacer ); +} diff --git a/adept/libadept/taglist.h b/adept/libadept/taglist.h new file mode 100644 index 0000000..4cd55a3 --- /dev/null +++ b/adept/libadept/taglist.h @@ -0,0 +1,75 @@ +/** -*- C++ -*- + @file adept/taglist.h + @author Peter Rockai +*/ + +#include +#include +#include +#include +#include +#include +#include + +#include + +#ifndef EPT_TAGLIST_H +#define EPT_TAGLIST_H + +class QLabel; + +namespace adept { + +using namespace aptFront; + +class TagList; + +class TagLabel : public QHBox +{ + Q_OBJECT +public: + typedef cache::entity::Tag Tag; + TagLabel( Tag t, TagList *l, QWidget *p = 0, const char *n = 0 ); + Tag tag() { return m_tag; } +protected: + void mouseReleaseEvent( QMouseEvent *e ); + Tag m_tag; + QLabel *m_remove; + QLabel *m_description; + TagList *m_list; +}; + +class TagList : public QVBox +{ + Q_OBJECT +public: + typedef cache::entity::Tag Tag; + TagList( QWidget *p = 0, const char *n = 0 ); + void setTags( Tag::Set t ); + void addTag( Tag t ); + Tag::Set tags() { return m_tags; } + void setName( QString n ); +public slots: + void scheduleUpdateList(); + void updateList(); +signals: + void tagsChanged( TagList::Tag::Set ); +protected: + void mouseMoveEvent( QMouseEvent *e ); + void dropEvent( QDropEvent * ); + void dragEnterEvent( QDragEnterEvent * ); + void appendLabel( TagLabel * ); + void clearList(); + + bool m_updateScheduled; + Tag::Set m_tags; + QLabel *m_name; + QVBox *m_tagBox; + QSpacerItem *m_tagSpacer; + typedef std::vector< TagLabel * > List; + List m_list; +}; + +} + +#endif diff --git a/adept/libadept/threadutils.cpp b/adept/libadept/threadutils.cpp new file mode 100644 index 0000000..722f75d --- /dev/null +++ b/adept/libadept/threadutils.cpp @@ -0,0 +1,44 @@ +/** -*- C++ -*- + @file adept/utils.cpp + @author Peter Rockai +*/ + +#include +#include + +namespace adept { + +QMutex Threads::serialize; +Threads::Queue Threads::threads; + +void Threads::wait() { + static std::map< QMutex *, int > locked; + while ( !threads.empty() ) { + QThread *current = threads.front().first; + if ( current->finished() ) { + delete current; + threads.pop_front(); + continue; + } + for ( Queue::iterator thr = threads.begin(); thr != threads.end(); ++thr ) { + ++locked[ thr->second ]; + thr->second->lock(); + } + kapp->processEvents(); + for ( Queue::iterator thr = threads.begin(); thr != threads.end(); ++thr ) { + while ( locked[ thr->second ] > 0 ) { + thr->second->unlock(); + --locked[ thr->second ]; + } + } + usleep( 50000 ); + } +} + +void Threads::enqueue( QThread *t, QMutex *m ) +{ + threads.push_back( std::make_pair( t, m ) ); + t->start(); +} + +} diff --git a/adept/libadept/utils.h b/adept/libadept/utils.h new file mode 100644 index 0000000..6c3a3d3 --- /dev/null +++ b/adept/libadept/utils.h @@ -0,0 +1,71 @@ +/** -*- C++ -*- + @file adept/utils.h + @author Peter Rockai +*/ + +#include +#include +#include +#include +#include +#include + +#ifndef EPT_UTILS_H +#define EPT_UTILS_H + +namespace adept { + +inline QString u8( std::string s ) { + return QString::fromUtf8( s.c_str() ); +} + +inline std::string u8( QString s ) { + return std::string( s.utf8() ); +} + +inline QString u8( const char *s ) { + return QString::fromUtf8( s ); +} + +struct Threads { + static QMutex serialize; + typedef std::deque< std::pair< QThread *, QMutex * > > Queue; + static Queue threads; + static void enqueue( QThread *t, QMutex *m ); + static void wait(); +}; + +template< typename F, typename P > +struct AsyncCall : public QThread +{ + AsyncCall( F f, P p ) : func( f ), param( p ) {} + virtual void run() + { + // kdDebug() << "Thread waiting for mutex..." << endl; + Threads::serialize.lock(); + // kdDebug() << "starting thread (mutex acquired)" << endl; + func( param ); + // kdDebug() << "finishing thread (releasing mutex)" << endl; + Threads::serialize.unlock(); + } + virtual ~AsyncCall() {} +protected: + F func; + P param; +}; + + +template< typename F, typename P > AsyncCall< F, P > *asyncCall( F f, P p ) { + return new AsyncCall< F, P >( f, p ); +} + +inline static void adjustFontSize( QWidget *w, int off ) { + QFont f = w->font(); + f.setPointSize( f.pointSize() + off ); // a bit smaller font... + w->setFont( f ); + w->updateGeometry(); +} + +} + +#endif diff --git a/adept/libadept/view.cpp b/adept/libadept/view.cpp new file mode 100644 index 0000000..207277c --- /dev/null +++ b/adept/libadept/view.cpp @@ -0,0 +1,153 @@ +#include +#include + +#include +#include +#include + +#include +#include +#include + +using namespace adept; + +View::View( QWidget *p, const char *n ) + : QSplitter( p, n ) +{ + setOrientation( Qt::Vertical ); + m_flist = new FilterList( this ); + m_bottom = new QSplitter( this ); + m_bottom->setOrientation( Qt::Horizontal ); + m_lister = new Lister( m_bottom ); + m_flist->plugLister( m_lister ); + m_sidebar = new FilterSidebar( m_bottom ); + + connect( m_lister, SIGNAL( cardinalityChanged( const Lister::Cardinality & ) ), + m_sidebar, SLOT( setCardinality( const Lister::Cardinality & ) ) ); + + m_flist->setHiddenPredicate( + predicate::adapt< entity::Entity >( + predicate::Package::member( &entity::Package::hasVersion ) ) ); + m_flist->appendPredicate( + predicate::adapt< entity::Entity >( + StateFilter< entity::Package >() ) ); + m_flist->appendPredicate( + predicate::adapt< entity::Entity >( + TagFilter< entity::Package >() ) ); + m_flist->appendPredicate( + predicate::adapt< entity::Entity >( + QuickFilter< entity::Package >() ) ); + + m_lister->setRangeProvider( this ); + + QTimer::singleShot( 0, this, SLOT( delayed() ) ); +} + +Lister::Range View::listerRange() { + component::Packages &cp = cache::Global::get().packages(); + return cp.sorted(); + // return range( cp.packagesBegin(), cp.packagesEnd() ); +} + +void View::hideTags() { + QValueList< int > szl; + szl.append( 0 ); szl.append( 1 ); + setSizes( szl ); +} + +void View::hideFilters() { + QValueList< int > szl; + szl.append( 1 ); szl.append( 0 ); + m_bottom->setSizes( szl ); +} + +predicate::Predicate< entity::Entity > View::previewPredicate() +{ + return predicate::adapt< entity::Entity >( + (not predicate::Package::member( &entity::Package::markedKeep )) + or predicate::Package::member( &entity::Package::isBroken ) + or predicate::Package::member( &entity::Package::willBreak ) ); +} + +void View::setUpgradeMode() +{ + setPreviewMode(); + filterList()->setHiddenPredicate( + previewPredicate() or predicate::adapt< entity::Entity >( + predicate::Package::member( &entity::Package::isUpgradable ) ) ); +} + +void View::setPreviewMode() +{ + filterList()->setHiddenPredicate( previewPredicate() ); + hideFilters(); + hideTags(); +} + +void View::delayed() +{ + // cleanRebuild(); +} + +Browser::Browser( QWidget *p, const char *n ) + : QWidgetStack( p, n ), m_currentValid( false ) +{ + m_current = entity::Entity(); + addWidget( m_view = new View( this ) ); + addWidget( m_details = new PackageDetails( this ) ); + connect( m_view->lister(), SIGNAL( detailsRequested( Lister::Entity ) ), + this, SLOT( show( Lister::Entity ) ) ); + connect( m_details, SIGNAL( showList() ), + this, SLOT( showList() ) ); + connect( m_details, SIGNAL( back() ), + this, SLOT( back() ) ); + connect( m_details, SIGNAL( forward() ), + this, SLOT( forward() ) ); + connect( m_details, SIGNAL( detailsRequested( Lister::Entity ) ), + this, SLOT( show( Lister::Entity ) ) ); +} + +void Browser::showList() +{ + raiseWidget( m_view ); +} + +void Browser::back() +{ + m_forward.push_back( m_current ); + m_current = m_back.back(); + m_back.pop_back(); + doShow( m_current ); +} + +void Browser::forward() +{ + m_back.push_back( m_current ); + m_current = m_forward.back(); + m_forward.pop_back(); + doShow( m_current ); +} + +void Browser::doShow( Lister::Entity e ) +{ + m_details->setHasForward( !m_forward.empty() ); + m_details->setHasBack( !m_back.empty() ); + raiseWidget( m_details ); + m_details->setPackage( downcast< entity::Package >( e ) ); +} + +void Browser::show( Lister::Entity e ) +{ + m_forward.clear(); + if ( m_currentValid ) + m_back.push_back( m_current ); + m_currentValid = true; + m_current = e.stable(); + doShow( e ); +} + +/* Kolik existencialistu je potreba k zasroubovani zarovky? + Dva. Jeden sroubuje zarovku, a druhy premysli jak zarovka + sama o sobe predstavuje jednotlivy zarivy bod v subjektivni + realite v podsveti nekonecne absurdity dosahujici neuprimny + vesmir nicoty. */ diff --git a/adept/libadept/view.h b/adept/libadept/view.h new file mode 100644 index 0000000..ea6c6f5 --- /dev/null +++ b/adept/libadept/view.h @@ -0,0 +1,66 @@ +// -*- C++ -*- + +#include + +#include +#include + +#include +#include + +#ifndef EPT_VIEW_H +#define EPT_VIEW_H + +class QSplitter; + +namespace adept { + +class FilterSidebar; +class PackageDetails; + +class View: public QSplitter, public Lister::RangeProvider { + Q_OBJECT +public: + View( QWidget *p = 0, const char *n = 0 ); + FilterList *filterList() { return m_flist; } + Lister *lister() { return m_lister; } + virtual Lister::Range listerRange(); +public slots: + void cleanRebuild() { m_lister->cleanRebuild(); } + void hideFilters(); + void hideTags(); + void setPreviewMode(); + void setUpgradeMode(); +protected slots: + void delayed(); +protected: + predicate::Predicate< entity::Entity > previewPredicate(); + QSplitter *m_bottom; + FilterList *m_flist; + Lister *m_lister; + FilterSidebar *m_sidebar; +}; + +class Browser : public QWidgetStack { + Q_OBJECT +public: + Browser( QWidget *p = 0, const char *n = 0 ); + View *searchView() const { return m_view; } +public slots: + void forward(); + void back(); + void show( Lister::Entity e ); + void showList(); + void doShow( Lister::Entity e ); +protected: + typedef std::deque< Lister::Entity > Deque; + Deque m_forward, m_back; + entity::Entity m_current; + View *m_view; + PackageDetails *m_details; + bool m_currentValid; +}; + +} + +#endif diff --git a/adept/manager/Makefile.am b/adept/manager/Makefile.am new file mode 100644 index 0000000..a7b8a0f --- /dev/null +++ b/adept/manager/Makefile.am @@ -0,0 +1,20 @@ +bin_PROGRAMS = adept_manager +noinst_HEADERS = app.h +adept_manager_SOURCES = main.cpp app.cpp +adept_manager_LDADD = ../adept/libadept.la -lapt-front $(LIBEPT_LIBS) $(LIBTAGCOLL2_LIBS) $(LIBWIBBLE_LIBS) $(LIB_KIO) $(LIB_KDEUI) ../kubuntu_upgrader/libkubuntuupgradewizard.la +adept_manager_LDFLAGS = -L/usr/lib/debug +INCLUDES = $(all_includes) $(LIBAPT_FRONT_CFLAGS) $(LIBEPT_CFLAGS) $(LIBTAGCOLL2_CFLAGS) $(LIBWIBBLE_CFLAGS) -I$(srcdir)/.. -I.. +KDE_CXXFLAGS = $(USE_EXCEPTIONS) -DQT_NO_ASCII_CAST -DQT_NO_CAST_ASCII +METASOURCES = AUTO +KDE_ICON = AUTO + +rcdir = $(kde_datadir)/adept_manager +rc_DATA = adept_managerui.rc + +#shelldesktopdir = $(kde_appsdir)/System +xdg_apps_DATA = adept_manager.desktop + +messages: rc.cpp + $(EXTRACTRC) `find . -name \*.ui -o -name \*.rc` > rc.cpp + $(EXTRACTRC) `find . -name "*.rc"` >> rc.cpp + $(XGETTEXT) *.cpp -o $(podir)/adept.pot diff --git a/adept/manager/adept_manager.desktop b/adept/manager/adept_manager.desktop new file mode 100644 index 0000000..6e7e311 --- /dev/null +++ b/adept/manager/adept_manager.desktop @@ -0,0 +1,43 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=Adept Manager +Name[ca]=Gestor Adept +Name[ga]=Bainisteoir Adept +Name[ja]=Adept マネージャ +Name[pt]=Gestor do Adept +Name[sv]=Adept-hantering +GenericName=Manage Packages +GenericName[ca]=Gestiona de paquets +GenericName[ga]=Bainistigh Pacáistí +GenericName[ja]=パッケージを管理 +GenericName[pt]=Gestão de Pacotes +GenericName[sv]=Hantera paket +Exec=/opt/kde3/bin/adept_manager +Categories=Qt;KDE;System; +Icon=adept_manager +Type=Application +X-KDE-SubstituteUID=true +Comment=Manage installed and available software +Comment[bg]=Управление на инсталиран и наличен софтуер +Comment[ca]=Gestiona el programari instal·lat i disponible +Comment[cs]=Správa nainstalovaného a dostupného softwaru +Comment[da]=Håndtér installeret og tilgængelig software +Comment[de]=Verwaltet installierte und verfügbare Software +Comment[el]=Διαχείριση εγκατεστημένου και διαθέσιμου λογισμικού +Comment[es]=Administrar el software instalado y disponible +Comment[et]=Paigaldatud ja saadaoleva tarkvara haldamine +Comment[fr]=Gestion des logiciels disponibles et installés +Comment[ga]=Bainistigh bogearraí atá suiteáilte agus ar fáil +Comment[gl]=Xestiona o software instalado e disponíbel +Comment[it]=Gestisce il software installato e disponibile +Comment[ja]=インストール済み及び利用可能なソフトウェアを管理 +Comment[ka]=დაყენებული და ხელმისაწვდომი პროგრამების მართვა +Comment[lt]=Įdiegtų ir prieinamų programų tvarkymas +Comment[nl]=Beheren van geïnstalleerde en beschikbare software software +Comment[pt]=Gerir o 'software' instalado e disponível +Comment[sk]=Manažuje inštalovaný a dostupný software +Comment[sr]=Управља инсталираним и доступним програмима +Comment[sr@Latn]=Upravlja instaliranim i dostupnim programima +Comment[sv]=Hantera installerad och tillgänglig programvara +Comment[xx]=xxManage installed and available softwarexx +Terminal=false diff --git a/adept/manager/adept_managerui.rc b/adept/manager/adept_managerui.rc new file mode 100644 index 0000000..add78d4 --- /dev/null +++ b/adept/manager/adept_managerui.rc @@ -0,0 +1,38 @@ + + + + + &Adept + + + + + + + + + + + &View + + + + + + &Edit + + + + + + + + + + + + + + + + diff --git a/adept/manager/app.cpp b/adept/manager/app.cpp new file mode 100644 index 0000000..832016e --- /dev/null +++ b/adept/manager/app.cpp @@ -0,0 +1,450 @@ +#define KUBUNTU + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// bleeeh +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#ifdef KUBUNTU +#include +#endif + +#include "app.h" + +using namespace aptFront; +using namespace aptFront::cache; +using namespace adept; + +TestApp::TestApp() { + kdDebug() << "ctor running" << endl; + setAcceptReadOnly( true ); + + setupActions(); + setupGUI(); + + m_rebuilds = 0; + m_stack = new QWidgetStack( this ); + + m_stack->addWidget( m_loading = new QLabel( i18n( "Loading, please wait..." ), m_stack ) ); + m_loading->setAlignment( Qt::AlignHCenter | Qt::AlignVCenter ); + + Application::setStatusBar( statusBar() ); + + setCentralWidget( m_stack ); + + QTimer::singleShot( + 0, this, + SLOT( delayed() ) ); + + kdDebug() << "ctor done" << endl; + +#ifdef KUBUNTU + m_upgradeButtonAdded = false; +#endif +} + +void TestApp::guardLister( Lister *l ) +{ + connect( l, SIGNAL( rebuildStarted() ), + this, SLOT( rebuildStarted() ) ); + connect( l, SIGNAL( rebuildFinished() ), + this, SLOT( rebuildFinished() ) ); +} + +void TestApp::delayed() { + initialize(); + + observeComponent< component::State >(); + + m_stack->addWidget( m_list = new adept::Browser( m_stack ) ); + guardLister( m_list->searchView()->lister() ); + + m_stack->addWidget( m_sources = new adept::SourcesEditor( + _config->FindFile( + "Dir::Etc::sourcelist").c_str(), + this ) ); + + connect ( m_sources, SIGNAL( close() ), + this, SLOT( closeSources() ) ); + + // set up preview widget + m_stack->addWidget( m_preview = new adept::Browser( m_stack ) ); + + m_preview->searchView()->setPreviewMode(); + guardLister( m_preview->searchView()->lister() ); + + m_stack->addWidget( m_progress = new adept::AcqProgressWidget( m_stack ) ); + m_stack->addWidget( m_commitProgress = new adept::CommitProgress( m_stack ) ); + + m_stack->raiseWidget( m_list ); + + addMode( Sources, m_sourcesAction, m_sources ); + addMode( Preview, m_previewAction, m_preview ); + addMode( Download, m_progressAction, m_progress ); + addMode( Commit, m_commitProgressAction, m_commitProgress ); + + m_list->searchView()->lister()->cleanRebuild(); + m_preview->searchView()->lister()->cleanRebuild(); + setActionsEnabled( true ); + statusBar()->clear(); + notifyPostChange( 0 ); +} + +void TestApp::setupActions() +{ + (new KAction( + i18n( "Fetch Updates" ), u8( "adept_update" ), + 0, this, SLOT( update() ), actionCollection(), + "update" ))->setEnabled( false ); + + (new KAction( + i18n( "Reload Cache" ), u8( "adept_reload" ), + 0, this, SLOT( reload() ), actionCollection(), + "reload" ))->setEnabled( false ); + + m_upgrade = new KAction( + i18n( "Safe Upgrade" ), u8( "adept_upgrade" ), + 0, this, SLOT( upgrade() ), actionCollection(), + "upgrade" ); + m_distUpgrade = new KAction( + i18n( "Full Upgrade" ), u8( "adept_distupgrade" ), + 0, this, SLOT( distUpgrade() ), actionCollection(), + "dist-upgrade" ); + m_commit = new KAction( + i18n( "Apply Changes" ), u8( "adept_commit" ), + 0, this, SLOT( commit() ), actionCollection(), + "commit" ); + + m_sourcesAction = new KToggleAction( + i18n( "Manage Repositories" ), u8( "adept_sourceseditor" ), + 0, this, SLOT( toggleSources() ), actionCollection(), + "sourceseditor" ); + m_previewAction = new KToggleAction( + i18n( "Preview Changes" ), u8( "adept_preview" ), + 0, this, SLOT( togglePreview() ), actionCollection(), + "preview" ); + + m_progressAction = new KToggleAction( + i18n( "Show Last Download" ), u8( "adept_download_out" ), + 0, this, SLOT( toggleDownload() ), actionCollection(), + "download_out" ); + + m_commitProgressAction = new KToggleAction( + i18n( "Show Last DPkg Run" ), u8( "adept_commit_out" ), + 0, this, SLOT( toggleCommit() ), actionCollection(), + "commit_out" ); + + m_listAction = new KToggleAction( + i18n( "Show Package List" ), u8( "adept_packagelist" ), + 0, this, SLOT( closeModes() ), actionCollection(), + "packagelist" ); + + m_sourcesAction->setEnabled( true ); + m_progressAction->setEnabled( false ); + m_previewAction->setEnabled( false ); + m_commitProgressAction->setEnabled( false ); + m_listAction->setEnabled( false ); + + m_modesClosed = m_listAction; + m_listAction->setChecked( true ); + + m_undo = KStdAction::undo( this, SLOT( undo() ), actionCollection() ); + m_redo = KStdAction::redo( this, SLOT( redo() ), actionCollection() ); + + m_distUpgrade->setEnabled( false ); + m_upgrade->setEnabled( false ); + + m_commit->setEnabled( false ); + KStdAction::quit( this, SLOT( close() ), actionCollection() ); + setHistoryEnabled( false ); + createStandardStatusBarAction(); +} + +void TestApp::setHistoryEnabled( bool e ) { + if ( e && history() ) { + m_undo->setEnabled( history()->canUndo() ); + m_redo->setEnabled( history()->canRedo() ); + } else { + m_undo->setEnabled( false ); + m_redo->setEnabled( false ); + } +} + +void TestApp::setActionsEnabled( bool e ) +{ + m_actionsEnabled = e; + updateActionState(); +} + +void TestApp::updateActionState() +{ + bool e = m_actionsEnabled; + bool w = cache::Global::get().writeable(); + component::State &s = cache::Global::get().state(); + KActionPtrList a = actionCollection()->actions(); + /* View menus seem to be BROKEN HERE?! */ + for (KActionPtrList::iterator i = a.begin(); i != a.end(); ++i) { + if ( u8( (*i)->name() ) == u8( "update" ) ) { + (*i)->setEnabled( e && w ); + } else if ( u8( (*i)->name() ) == u8( "preview" ) ) { + (*i)->setEnabled( e ); + } else { + (*i)->setEnabled(e && w); + } + } + setHistoryEnabled( e ); + m_commit->setEnabled( e && w && s.changed() ); + m_upgrade->setEnabled( e && w && s.upgradableCount() ); + m_distUpgrade->setEnabled( e && w && s.upgradableCount() ); +} + +template< typename T, typename In > +void TestApp::aptAction( In b, In e ) { + const KAction *a = dynamic_cast( sender() ); // HACK + typename T::Vector v = T::list(); + for (typename T::Vector::iterator i = v.begin(); i != v.end(); ++i) { + if( a->name() == i->name() ) { + (*i)( b, e ); + return; + } + } +} + +void TestApp::notifyPostRebuild( component::Base *b ) +{ + Application::notifyPostRebuild( b ); + notifyPostChange( b ); +} + +void TestApp::notifyPreChange( component::Base *b ) +{ + Application::notifyPreChange( b ); + checkpoint(); +} + +void TestApp::notifyPostChange( component::Base *b ) +{ + Application::notifyPostChange( b ); + updateActionState(); +} + +void TestApp::closeEvent( QCloseEvent *e ) { + cache::component::State &s = cache::Global::get().state(); + if (s.changed()) { + if (KMessageBox::warningYesNo( + this, i18n( "You have done changes that were left uncommited. " + "Are you sure you want to exit? " ), + i18n( "Uncommited changes, really quit?" ) ) == KMessageBox::Yes) + e->accept(); + } else + e->accept(); +} + +void TestApp::foregroundClosed() +{ + m_stack->raiseWidget( m_list ); +} + +void TestApp::update() { + closeModes(); + setActionsEnabled( false ); + aptFront::Manager m; + m.setProgressCallback( m_progress->callback() ); + m.setUpdateInterval( 100000 ); + try { + m_stack->raiseWidget( m_progress ); + m.update(); + } catch ( exception::OperationCancelled ) { // ignore + } catch (...) { + KMessageBox::sorry( this, + i18n( "There was an error downloading updates. " ), + i18n( "Could not fetch updates" ) ); + } + kdDebug() << "closing progress widget" << endl; + m_stack->raiseWidget( m_list ); + setActionsEnabled( true ); + notifyPostChange( 0 ); +#ifdef KUBUNTU + wizard = new UpgradeWizard(this, 0, 1); + if( !m_upgradeButtonAdded && wizard->checkForDistUpgrade(true) ) { + KToolBar* tool = toolBar(); + tool->insertButton(QString("2uparrow"), 12345, SIGNAL(released()), this, SLOT(releaseUpgrade()), true, i18n("Version Upgrade")); + m_upgradeButtonAdded = true; + } else { + wizard->close(); + } +#endif +} + +#ifdef KUBUNTU +void TestApp::releaseUpgrade() { + wizard->show(); +} +#endif + +#ifdef KUBUNTU +void TestApp::addVersionUpgrade(QString url, bool develVersion) { + wizard = new UpgradeWizard(this, 0, 1); + bool show = wizard->checkForDistUpgrade(false, url, develVersion); + if (show || develVersion) { + KToolBar* tool = toolBar(); + tool->insertButton(QString("2uparrow"), 12345, SIGNAL(released()), this, SLOT(releaseUpgrade()), true, i18n("Version Upgrade")); + m_upgradeButtonAdded = true; + } +} +#endif + +void TestApp::reload() { + cache().reopen(); +} + +void TestApp::commit() { + closeModes(); + setActionsEnabled( false ); + + aptFront::Manager m; + m.setProgressCallback( m_progress->callback() ); + m.setUpdateInterval( 100000 ); + try { + m_stack->raiseWidget( m_progress ); + m.download(); + m_stack->raiseWidget( m_commitProgress ); + m.commit(); + } catch ( exception::OperationCancelled ) { + } catch (...) { + KMessageBox::sorry( + this, i18n( "There was an error commiting changes. " + "Possibly there was a problem downloading some " + "packages or the commit would break packages. " ), + i18n( "Could not commit changes" ) ); + // FIXME: this should be handled by libapt-front + cache::Global::get().reopen(); + } + m_stack->raiseWidget( m_list ); + setActionsEnabled( true ); + notifyPostChange( 0 ); +} + +void TestApp::upgrade() { + closeModes(); + cache::Global::get().state().upgrade(); +} + +void TestApp::distUpgrade() { + closeModes(); + cache::Global::get().state().distUpgrade(); +} + +void TestApp::togglePreview() { + if ( modeActive( Preview ) ) + closeModes(); + else + openPreview(); +} + +void TestApp::toggleSources() { + QFile file(QString("/usr/bin/software-properties-kde")); + if (file.exists()) { + softwarePropertiesProcess = new KProcess(this); + + *softwarePropertiesProcess << "/usr/bin/software-properties-kde" << "--no-update"; + QApplication::connect(softwarePropertiesProcess, SIGNAL(processExited(KProcess *)), + this, SLOT(softwarePropertiesExited(KProcess *))); + softwarePropertiesProcess->start(); + } else { + kdDebug() << " no software-properties-kde exists" << endl; + if ( modeActive( Sources ) ) + closeModes(); + else + openSources(); + } +} + +void TestApp::softwarePropertiesExited(KProcess *) { + if (softwarePropertiesProcess->exitStatus() == 1) { + update(); + } +} + +void TestApp::toggleDownload() { + toggleMode( Download ); +} + +void TestApp::toggleCommit() { + toggleMode( Commit ); +} + +void TestApp::toggleMode( Mode m ) { + if ( modeActive( m ) ) + closeModes(); + else + openMode( m ); +} + +void TestApp::openPreview() { + if ( openMode( Preview ) ) + m_preview->searchView()->lister()->scheduleRebuild(); +} + +void TestApp::closePreview() { + if ( closeMode( Preview ) ) + m_list->searchView()->lister()->scheduleRebuild(); +} + +void TestApp::openSources() { + if ( openMode( Sources ) ) + m_sources->reset(); +} + +void TestApp::closeSources() { + closeMode( Sources ); +} + +bool TestApp::closeMode ( Mode m ) { + if ( modeActive( m ) ) { + m_stack->raiseWidget( m_list ); + modeAction( m )->setChecked( false ); + return true; + } + return false; +} + +bool TestApp::openMode( Mode m ) { + if ( !modeActive( m ) ) { + closeModes(); + m_modesClosed->setChecked( false ); + kdDebug() << "openMode widget: " << modeWidget( m ) << endl; + m_stack->raiseWidget( modeWidget( m ) ); + return true; + } + return false; +} + +#include "app.moc" diff --git a/adept/manager/app.h b/adept/manager/app.h new file mode 100644 index 0000000..0fc1927 --- /dev/null +++ b/adept/manager/app.h @@ -0,0 +1,162 @@ +/* -*- C++ -*- */ +#ifndef TESTUI_APP_H +#define TESTUI_APP_H + +#define KUBUNTU + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef KUBUNTU +#include +#endif + +class QVBox; +class QWidgetStack; +class QSplitter; +class KAction; +namespace adept { +class AcqProgressWidget; +} + +using namespace aptFront; +using namespace adept; + +class TestApp : public KMainWindow, Application { + Q_OBJECT +public: + enum Mode { Default, Sources, Preview, Download, Commit }; + void setupActions(); + ExtTerminalInterface *terminal(); + TestApp(); +#ifdef KUBUNTU + void addVersionUpgrade(QString url, bool develVersion=false); +#endif +protected slots: + void delayed(); // initialisation + + void setActionsEnabled( bool ); + void setHistoryEnabled( bool ); + + void update(); // actions + void upgrade(); + void distUpgrade(); +#ifdef KUBUNTU + void releaseUpgrade(); +#endif + void commit(); + + void reload(); // debugging + + void undo() { Application::undo(); } + void redo() { Application::redo(); } + void checkpoint() { Application::checkpoint(); } + + void foregroundClosed(); + + void togglePreview(); + void toggleSources(); + void softwarePropertiesExited(KProcess *); + void toggleDownload(); + void toggleCommit(); + + void closePreview(); + void closeSources(); + + void openPreview(); + void openSources(); + + bool modeActive( Mode m ) { + // return modeAction( m )->isChecked(); + return modeWidget( m ) == m_stack->visibleWidget(); + } + + void closeModes() { + closePreview(); + closeSources(); + closeMode( Download ); + closeMode( Commit ); + m_modesClosed->setChecked( true ); + } + + void rebuildStarted() { + if ( !m_rebuilds ) setActionsEnabled( false ); + m_rebuilds ++; + } + + void rebuildFinished() { + m_rebuilds --; + if ( !m_rebuilds ) setActionsEnabled( true ); + } + +protected: + void updateActionState(); + void guardLister( adept::Lister * ); + void addMode( Mode m, KToggleAction *a, QWidget *w ) { + m_modeActionMap[ m ] = a; + m_modeWidgetMap[ m ] = w; + a->setChecked( false ); + } + + KToggleAction *modeAction( Mode m ) { + return m_modeActionMap[ m ]; + } + + QWidget *modeWidget( Mode m ) { + return m_modeWidgetMap[ m ]; + } + + bool openMode( Mode ); + bool closeMode( Mode ); + void toggleMode( Mode ); + + friend class WaitForLister; + virtual void closeEvent( QCloseEvent * ); + virtual void notifyPostChange( cache::component::Base * ); + virtual void notifyPostRebuild( cache::component::Base * ); + virtual void notifyPreChange( cache::component::Base * ); + + QWidgetStack *m_stack; + QLabel *m_loading; + + // stacked widgets + adept::AcqProgressWidget *m_progress; + adept::Browser *m_list, *m_preview; + adept::SourcesEditor *m_sources; + adept::CommitProgress *m_commitProgress; + + // other stuff + std::vector m_actions; + QMap< QString, QString > m_icons; + KAction *m_undo, *m_redo; + + int m_rebuilds; + bool m_actionsEnabled; + + KAction *m_commit, *m_upgrade, *m_distUpgrade; + KToggleAction *m_sourcesAction, *m_commitProgressAction, *m_listAction, + *m_previewAction, *m_progressAction; + std::map< Mode, KToggleAction * > m_modeActionMap; + std::map< Mode, QWidget * > m_modeWidgetMap; + KToggleAction *m_modesClosed; +private: + template void plugAptActions(); + // template void updateAptActions( In b, In e ); + template void aptAction( In b, In e ); + KProcess* softwarePropertiesProcess; +#ifdef KUBUNTU + UpgradeWizard* wizard; + bool m_upgradeButtonAdded; +#endif +}; + +#endif diff --git a/adept/manager/hi128-app-adept_manager.png b/adept/manager/hi128-app-adept_manager.png new file mode 100644 index 0000000000000000000000000000000000000000..ba3cb4bdc510101110b7896463e3df3273d0e03d GIT binary patch literal 26416 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 literal 0 HcmV?d00001 diff --git a/adept/manager/hi22-app-adept_manager.png b/adept/manager/hi22-app-adept_manager.png new file mode 100644 index 0000000000000000000000000000000000000000..dc4392d949efa916e5cca68b301494d4c9c71d9d GIT binary patch literal 2346 zcmV+_3Dx$AP)n4qAbd$i!M+XbV0kT3bayDRl0x% zNSFPt!?-2 z>grcs>F#cC@97amNs?t*CPY;;86X^{^wuq)x>{9}Ng$t3rN+i)W`>4_hf}HH;h%pV z9Gsdud-nYKWKvbnof{p^*tQL* zs&YYX+qNm41vL!AFipTT4Z|=1zdsy~MuCS9i^a8Tfj}Uey?GM|hgCI~19)ChW@dnJ zSP(=p5V(DNYRa-kMl{W`08Qf`1M@t`0UX!Yw_-&g(A&Fi-L`E#J?qy4u4Bjf`|rDV z0ZP;9d-niM6NDv8fMBq$E*1l9+kMY8P1CYwK`WI?g^=0*ZQHUe3lM~Gc+nzYa?&)L zngGXfLESHbGiOFdN~Irv{OYU0K}|bxLKHa;5XC1==O)l`Zrm6jC*;PB+FD(on5e1g z?2N@^dDSY8%VyJQjx&sGHkShkS-g1PKEUsvKR*_8BWPKGs;X+G0!&V3GU+s+DCM%E z06Z@UqBxrY#vF&|0YxbkW@dm$B%8f>5iktX$)yUfMG0Kwr?Nc@%a6r5TNV2 zP6%-SemXrd0qFYlbTSDTM!B5L0)$ZN^8uph@%Vgh-Y5lBwOlS1frbX#PNe{kXW6nf zYbag0a@DFtqN}T_ic-_8uKx1N3l}n(W5>i*tKxB>qa%@MY6=EhTRS_KFOS7KJ6l>7 zF089tytux8>C(EoNQAMfs!)hh$4RGiIYFS*aU2IA#NDE%xvAH6O)HlHzuz<`Cjm-r z8vsfrO{=d5JRV631_9fqlrbP24uw1(z~iZ^TCxOi971%R=TDwIefrw9Q>Ts``Qe9D z>f?{c#!4l}866ed+hZ|c#fqMu_V!?~x3{lv$BvGUty|;qmtSsgZ*B$xfp8db992~m zAP}gj$>#x&M^(?A15DGlTU!B+gH9UmVZJ$Ufs$+58yKb)E(1bF!H866fyo(BYB!Gf9^ zpt-rbyR9u0>h6B)tqmLE@ps;N{q;S2cJAD{)92%P!0QDvnLqvj94DWD^vJDENdgo_ zmJPQYk6*uj@7|p|BO@C( z?%K6;=jP3!(DLOyJ@e-mi?ZC&0fa(+|CK9%BxN!~LqJW9C{9cOH8r7-X#%<)2q?Gln{V1)6{i<5Z5lHt`|WNMNxD;3IF0qHYc!amg6X` zR1AaTip58dbRF<|eZI*_VE%kb@_5{~@OS{9kK^3h)b&Eay{jtVIPT;#48zcM;ORQ$ zc~@l^bH~3VJs){aV2*Pfw=oFOG(m_)3Au0qn3G?vOFG9 z1VSN2nVbYTj*vWO2yR# zH(R!CSpd&_y|N5sv!zm1RX%_0*ss5qN}qpz;>5^^q8vL$2xEY*KNG;YBkW#lYb6P& zt?lS&Z1nlMy0&atvSi-8?b~~L+S;nCdwW}3BN0(dBtjuk)HF!~2q~4^nzbx|Qg?9J zwp$v5gZJ-C((v%7pAHNZi~aq-{F2F-=Gn7u%RSwAF9s;`$MAQD-*vZ2A}Tf27a z*2Rmfs)pILk*Kd1gq9Y@+zI&2H&?FYa^HUY*=JX-luDm`GBKg5jHOcl zuD|~p_<0#=Y?Nh=i^bNgX>63F4I3m$6gf_o&zwo6DwWfxHO)Qxyr}(u03R literal 0 HcmV?d00001 diff --git a/adept/manager/hi32-app-adept_manager.png b/adept/manager/hi32-app-adept_manager.png new file mode 100644 index 0000000000000000000000000000000000000000..d1b4a614bda7832864f118950f1526c1327e3261 GIT binary patch literal 3909 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 PECB|(COY-nj?exNT75MX literal 0 HcmV?d00001 diff --git a/adept/manager/hi64-app-adept_manager.png b/adept/manager/hi64-app-adept_manager.png new file mode 100644 index 0000000000000000000000000000000000000000..cabb87bfa5e691f7c019952a0b369263201fb7c3 GIT binary patch literal 10284 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 Pet^2Nj?xze+n4_bqGj-z literal 0 HcmV?d00001 diff --git a/adept/manager/hisc-app-adept_manager.svgz b/adept/manager/hisc-app-adept_manager.svgz new file mode 100644 index 0000000000000000000000000000000000000000..55ac033b333b90167c64c1f45a351587765544d3 GIT binary patch literal 3643 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 + +#include +#include +#include + +#include "app.h" + +static KCmdLineOptions options[] = +{ + { "dist-upgrade", I18N_NOOP("add toolbar button to launch the version upgrade tool to the latest release"), 0}, + { "dist-upgrade-proposed", I18N_NOOP("add toolbar button to launch the version upgrade tool to proposed next release"), 0}, + { "dist-upgrade-devel", I18N_NOOP("add toolbar button to launch the version upgrade tool to development version"), 0}, + KCmdLineLastOption +}; + +int main(int argc, char *argv[]) +{ + + KLocale::setMainCatalogue("adept"); + + putenv( "QT_IM_MODULE=xim" ); + QString description = i18n("Adept Manager"); + + KAboutData aboutData( "adept_manager", + I18N_NOOP("Adept Manager"), + "2.1 Cruiser", + description.latin1(), + KAboutData::License_BSD, + I18N_NOOP("(c) 2005, 2006 Peter Rockai"), + 0, + "http://web.mornfall.net/adept.html"); + + aboutData.addAuthor ( "Peter Rockai", + I18N_NOOP("developer"), + "me at mornfall dot net", + "http://web.mornfall.net"); + + KCmdLineArgs::init( argc, argv, &aboutData ); + KCmdLineArgs::addCmdLineOptions( options ); + + KApplication app; + + KCmdLineArgs* args = KCmdLineArgs::parsedArgs(); + // if (args && args->isSet("xy")) ... + + /* KConfig* config = KGlobal::config(); + config->setGroup("General Settings"); + QString version = config->readEntry("Version"); */ + + KGlobal::locale()->insertCatalogue(QString::fromUtf8("libept")); + KGlobal::locale()->insertCatalogue(QString::fromUtf8("libapt-front")); + + TestApp *ta = new TestApp(); + + app.setMainWidget(ta); + +#ifdef KUBUNTU + if (args && args->isSet("dist-upgrade")) { + ta->addVersionUpgrade(QString("http://changelogs.ubuntu.com/meta-release")); + } else if (args && args->isSet("dist-upgrade-proposed")) { + ta->addVersionUpgrade(QString("http://changelogs.ubuntu.com/meta-release-proposed")); + } else if (args && args->isSet("dist-upgrade-devel")) { + ta->addVersionUpgrade(QString("http://changelogs.ubuntu.com/meta-release-development"), true); + } +#endif + + ta->show(); + + return app.exec(); +} diff --git a/adept/notifier/15adept-periodic-update b/adept/notifier/15adept-periodic-update new file mode 100644 index 0000000..d1922e3 --- /dev/null +++ b/adept/notifier/15adept-periodic-update @@ -0,0 +1,3 @@ +APT::Periodic::Update-Package-Lists "1"; +APT::Periodic::Download-Upgradeable-Packages "0"; +APT::Periodic::AutocleanInterval "0"; diff --git a/adept/notifier/Makefile.am b/adept/notifier/Makefile.am new file mode 100644 index 0000000..6b576be --- /dev/null +++ b/adept/notifier/Makefile.am @@ -0,0 +1,26 @@ + +bin_PROGRAMS = adept_notifier +#kdeinit_LTLIBRARIES = adept-notifier.la +noinst_HEADERS = app.h + +adept_notifier_SOURCES = app.cpp +adept_notifier_LDADD = ../adept/libadept.la $(LIBAPT_FRONT_LIBS) $(LIBEPT_LIBS) $(LIBTAGCOLL2_LIBS) $(LIB_KIO) $(LIBKDE_UI) +adept_notifier_LDFLAGS = -L/usr/lib/debug + +INCLUDES = $(all_includes) $(LIBAPT_FRONT_CFLAGS) $(LIBEPT_CFLAGS) $(LIBTAGCOLL2_CFLAGS) $(LIBWIBBLE_CFLAGS) -I$(srcdir)/.. -I.. +KDE_CXXFLAGS = $(USE_EXCEPTIONS) -DQT_NO_ASCII_CAST -DQT_NO_CAST_ASCII +METASOURCES = AUTO +KDE_ICON = AUTO + +rcdir = $(kde_datadir)/adept-notifier +#rc_DATA = adept-updaterui.rc + +#shelldesktopdir = $(kde_appsdir)/System +xdg_apps_DATA = adept_notifier.desktop +autostart_DATA = adept_notifier_auto.desktop +autostartdir = /etc/xdg/autostart + +messages: rc.cpp + $(EXTRACTRC) `find . -name \*.ui -o -name \*.rc` > rc.cpp + $(EXTRACTRC) `find . -name "*.rc"` >> rc.cpp + $(XGETTEXT) *.cpp -o $(podir)/adept_notifier.pot diff --git a/adept/notifier/adept_notifier.desktop b/adept/notifier/adept_notifier.desktop new file mode 100644 index 0000000..453ef5f --- /dev/null +++ b/adept/notifier/adept_notifier.desktop @@ -0,0 +1,63 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=Adept Notifier +Name[ca]=Notificador Adept +Name[da]=Adept underretninger +Name[de]=Adept Benachrichtigung +Name[el]=Ειδοποίηση ενημερώσεων του Adept +Name[es]=Notificador Adept +Name[fr]=Notificateur Adept +Name[ga]=Fógróir Adept +Name[gl]=Notificador de Adept +Name[it]=Notifica automatica Adept +Name[ka]=Adept შემტყობინებელი +Name[lt]=Adept informuoklis +Name[pt]=Notificador do Adept +Name[sk]=Adept upozornenie +Name[sv]=Adept uppdatering +Name[xx]=xxAdept Notifierxx +GenericName=Update Reminder +GenericName[bg]=Напомняне за обновяване +GenericName[ca]=Recordador d'actualitzacions +GenericName[cs]=Upozorňování na aktualizace +GenericName[da]=Opdateringspåmindelser +GenericName[de]=Aktualisierungsbenachrichtigung +GenericName[el]=Υπενθύμιση ενημέρωσης +GenericName[es]=Recordar actualización +GenericName[gl]=Recorda-lle a existéncia de Actualizazóns +GenericName[it]=Avviso aggiornamenti +GenericName[ja]=アップデートを通知 +GenericName[ka]=შემხსენებლის განახლება +GenericName[lt]=Atnaujinimų priminimai +GenericName[nl]=Updateherinnering +GenericName[pt]=Chamada de Atenção de Actualizações +GenericName[sk]=Pripomienka aktualizácie +GenericName[sv]=Uppdateringspåminnelse +GenericName[xx]=xxUpdate Reminderxx +Exec=adept_notifier -caption "%c" +TryExec=adept_notifier +Categories=Qt;KDE;System; +Icon=adept_notifier +Type=Application +X-KDE-SubstituteUID=false +Comment=Watch for updates +Comment[bg]=Следене за обновяване +Comment[ca]=Vigila les actualitzacions +Comment[cs]=Sledování aktualizací +Comment[da]=Overvåg opdateringer +Comment[de]=Überprüft Aktualisierungen +Comment[el]=Παρακολούθηση για ενημερώσεις +Comment[es]=Busca actualizaciones +Comment[ga]=Déan faire ar nuashonruithe +Comment[gl]=Comproba as actualizazóns +Comment[it]=Controlla la presenza di aggiornamenti +Comment[ja]=アップデートを監視 +Comment[ka]=განახლებების თვალთვალი +Comment[lt]=Atnaujinimų stebėjimas +Comment[nl]=Updates volgen +Comment[pt]=Pesquisar actualizações +Comment[sk]=Sledovať aktualizácie +Comment[sv]=Bevaka uppdateringar +Comment[xx]=xxWatch for updatesxx +Terminal=false +NoDisplay=true diff --git a/adept/notifier/adept_notifier_auto.desktop b/adept/notifier/adept_notifier_auto.desktop new file mode 100644 index 0000000..42c37ba --- /dev/null +++ b/adept/notifier/adept_notifier_auto.desktop @@ -0,0 +1,23 @@ +[Desktop Entry] +Encoding=UTF-8 +Exec=adept_notifier +Name=Adept Notifier +Name[ca]=Notificador Adept +Name[da]=Adept underretninger +Name[de]=Adept Benachrichtigung +Name[el]=Ειδοποίηση ενημερώσεων του Adept +Name[es]=Notificador Adept +Name[fr]=Notificateur Adept +Name[ga]=Fógróir Adept +Name[gl]=Notificador de Adept +Name[it]=Notifica automatica Adept +Name[ka]=Adept შემტყობინებელი +Name[lt]=Adept informuoklis +Name[pt]=Notificador do Adept +Name[sk]=Adept upozornenie +Name[sv]=Adept uppdatering +Name[xx]=xxAdept Notifierxx +X-KDE-autostart-after=panel +Type=Service +X-KDE-autostart-condition=adept_notifierrc:General:Autostart:true +OnlyShowIn=KDE; diff --git a/adept/notifier/app.cpp b/adept/notifier/app.cpp new file mode 100644 index 0000000..2ed8c2b --- /dev/null +++ b/adept/notifier/app.cpp @@ -0,0 +1,342 @@ +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + +#include "app.h" + +using namespace aptFront; +using namespace cache; +using namespace utils; +using namespace adept; + +TrayWindow::TrayWindow(QWidget *parent, const char *name) + : KSystemTray(parent, name), m_updates( 0 ) +{ + setAvailableUpdates( m_updates ); + // actionCollection()->remove( actionCollection()->action( "quit" ) ); + m_quit = KStdAction::quit( this, SIGNAL( quitSelected() ), actionCollection() ); + m_about = KStdAction::aboutApp( this, SIGNAL( aboutSelected() ), actionCollection() ); + // setPixmap( loadIcon( u8( "adept_notifier_warning" ) ) ); +} + +void TrayWindow::contextMenuAboutToShow( KPopupMenu *r ) { + kdDebug() << "TrayWindow::contextMenu()" << endl; + r->clear(); + m_about->plug( r ); + m_quit->plug( r ); +} + +void TrayWindow::setAvailableUpdates( int n ) +{ + m_updates = n; + kdDebug() << "TrayWindow obtained " << n << endl; + + setPixmap( m_updates == 0 ? + loadIcon( u8( "adept_notifier_ok" ) ) : + loadIcon( u8( "adept_notifier_warning" ) ) ); + + if ( m_updates == 0 ) + hide(); + else + show(); + + QToolTip::remove(this); + QToolTip::add(this, n == 0 ? i18n( "No updates needed." ) + : i18n( "There is %n updated package available", + "There are %n updated packages available", n ) ); +} + +void TrayWindow::mouseReleaseEvent(QMouseEvent *ev) +{ + if (ev->button() == QMouseEvent::LeftButton) + emit clicked(); + KSystemTray::mouseReleaseEvent(ev); +} + +void ApportTrayWindow::mousePressEvent(QMouseEvent *ev) +{ + emit clicked(); + hide(); +} + +void RebootTrayWindow::mousePressEvent(QMouseEvent *ev) +{ + emit clicked(); +} + +NotifierApp::NotifierApp(bool allowStyles, bool GUIenabled) + : KUniqueApplication(allowStyles, GUIenabled), + m_tray( 0 ) +{ + sharedConfig()->setGroup( "General" ); + m_okAutostart = sharedConfig()->readBoolEntry( "Autostart", true ); + m_timer = new QTimer( this ); + m_tray = new TrayWindow( 0, 0 ); + m_tray->show(); + m_rebootRequired = false; + m_rebootShown = false; + + aptFront::init(); + + fileUpdated( "/var/cache/apt/pkglist.bin", m_updateStamp ); + // fileUpdated( "/var/lib/apt/periodic/update-stamp", m_updateStamp ); + fileUpdated( "/var/lib/dpkg/status", m_statusStamp ); + + m_tray->setAvailableUpdates( upgradable() ); + + connect( m_tray, SIGNAL( clicked() ), this, SLOT( clicked() ) ); + // connect( m_tray, SIGNAL( quitSelected() ), this, SLOT( quit() ) ); + connect( m_tray, SIGNAL( quitSelected() ), this, SLOT( askQuit() ) ); + connect( m_tray, SIGNAL( aboutSelected() ), this, SLOT( about() ) ); + connect( m_timer, SIGNAL( timeout() ), this, SLOT( checkUpdates() ) ); + m_timer->start( 1000*5 ); // 5 secs now, used to be 60 + if ( !m_okAutostart ) { + int r = KMessageBox::questionYesNo( + m_tray, i18n( "You disabled automatic startup of Adept Notifier last time " + "you quit the application. " + "Do you want to start Adept Notifier next time you log in?" ), + i18n( "Automatic Startup" ), + KGuiItem( i18n( "Start" ) ), KGuiItem( i18n( "Don't Start" ) ), + u8( "enableAutostart" ) ); + if ( r == KMessageBox::Yes ) { + sharedConfig()->setGroup( "General" ); + sharedConfig()->writeEntry( "Autostart", true ); + m_okAutostart = true; + } + } + + // if apport crash handler it installed, watch for crash reports appearing and run + // the apport frontend when they do + bool runApport = sharedConfig()->readBoolEntry( "Apport", true ); + if ( QFile::exists(QString("/usr/share/apport/apport-qt")) && runApport ) { + m_dirWatch = new KDirWatch(this); + m_dirWatch->addDir(QString("/var/crash")); + connect( m_dirWatch, SIGNAL( dirty(const QString&) ), this, SLOT( crashWatcher() ) ); + + KProcess *proc = new KProcess; + *proc << "/usr/share/apport/apport-checkreports"; + connect( proc, SIGNAL(processExited(KProcess*)), this, SLOT(apportCheckExited(KProcess*)) ); + proc->start(KProcess::Block); + + if (m_crashes) { + ApportTrayWindow* crashApplet = new ApportTrayWindow; + crashApplet->setPixmap( crashApplet->loadIcon(u8("apport")) ); + QString crashMessage = i18n("An application has crashed on your " + "system (now or in the past).\n" + "Click to " + "display details. " + ); + QToolTip::add(crashApplet, crashMessage); + connect( crashApplet, SIGNAL(clicked()), this, SLOT(crashWatcher()) ); + crashApplet->show(); + QPixmap icon = BarIcon(u8("apport")); + KPassivePopup::message(i18n("Crash Handler"), crashMessage, icon, crashApplet); + } + } + // if reboot-required is installed watch for reboot-required and dpkg-run-stamp + if ( QFile::exists(QString("/usr/share/update-notifier/notify-reboot-required")) ) { + m_rebootDirWatch = new KDirWatch(this); + m_rebootDirWatch->addFile(QString("/var/run/reboot-required")); + m_rebootDirWatch->addFile(QString("/var/lib/update-notifier/dpkg-run-stamp")); + connect( m_rebootDirWatch, SIGNAL( dirty(const QString&) ), this, SLOT( rebootWatcher(const QString&) ) ); + + } +} + +void NotifierApp::crashWatcher() { + // find out if there are system crash reports first, if there are run it as root + KProcess *proc = new KProcess; + *proc << "/usr/share/apport/apport-checkreports"; + *proc << "--system"; + connect( proc, SIGNAL(processExited(KProcess*)), this, SLOT(apportCheckExited(KProcess*)) ); + proc->start(KProcess::Block); + + if (m_crashes) { + KProcess *proc2 = new KProcess; + *proc2 << "kdesu" << "/usr/share/apport/apport-qt"; + proc2->start(KProcess::DontCare); + } else { + KShellProcess *proc2 = new KShellProcess; + *proc2 << "sleep 1; /usr/share/apport/apport-qt"; //needs a seconds delay else we're too fast for apport + proc2->start(KProcess::DontCare); + } +} + +void NotifierApp::apportCheckExited(KProcess* proc) { + if (proc->exitStatus() == 0) { + m_crashes = true; + } else { + m_crashes = false; + } +} + +void NotifierApp::rebootWatcher(const QString& path) { + kdDebug() << "NotifierApp::rebootWatcher: " << path << endl; + + if (path == QString("/var/run/reboot-required")) { + m_rebootRequired = true; + } + + if (path == QString("/var/lib/update-notifier/dpkg-run-stamp") && m_rebootRequired && !m_rebootShown) { + + RebootTrayWindow* rebootApplet = new RebootTrayWindow; + rebootApplet->setPixmap( rebootApplet->loadIcon(u8("reload")) ); + + QString rebootMessage = i18n("In order to complete the update your system needs to be restarted."); + QToolTip::add(rebootApplet, rebootMessage); + connect( rebootApplet, SIGNAL(clicked()), this, SLOT(rebootClicked()) ); + rebootApplet->show(); + QPixmap icon = BarIcon(u8("reload")); + KPassivePopup::message(i18n("Reboot Required"), rebootMessage, icon, rebootApplet); + m_rebootShown = true; + } + +} + +void NotifierApp::rebootClicked() { + kdDebug() << "NotifierApp::rebootClicked" << endl; + if (KMessageBox::questionYesNo(0, QString("In order to complete the update your system needs to be restarted."), QString("Restart Require")) == KMessageBox::Yes) { + kdDebug() << "NotifierApp::rebootClicked yes!" << endl; + KProcess *proc = new KProcess; + *proc << "/usr/bin/dcop"; + *proc << "ksmserver" << "ksmserver" << "logout" << "0" << "1" << "2"; // 0 1 2 == ShutdownConfirmNo ShutdownTypeReboot ShutdownModeForceNow + proc->start(); + } +} + +void NotifierApp::askQuit() { + if ( m_okAutostart ) { + int r = KMessageBox::questionYesNoCancel( + m_tray, i18n( "Do you want to start Adept Notifier next time you log in?" ), + i18n( "Automatic Startup" ), + KGuiItem( i18n( "Start" ) ), KGuiItem( i18n( "Don't Start" ) ) ); + if ( r == KMessageBox::Cancel ) + return; + if ( r == KMessageBox::No ) { + sharedConfig()->setGroup( "General" ); + sharedConfig()->writeEntry( "Autostart", false ); + } + } + exit( 0 ); + +} + +bool NotifierApp::fileUpdated( const char *f, time_t &stamp ) { + time_t old = stamp; + struct stat s; + ::stat( f, &s ); + stamp = s.st_mtime; + if ( stamp > old ) + return true; + return false; +} + +int NotifierApp::upgradable() { + try { + kdDebug() << "checking cache for upgradable packages..." << endl; + cache::Cache &c = cache::Global::get(); + c.open( Cache::OpenReadOnly + | Cache::OpenPackages + | Cache::OpenState ); + + kdDebug() << "cache opened, listing..." << endl; + Range< entity::Package > r = range( c.packages().packagesBegin(), + c.packages().packagesEnd() ); + kdDebug() << "looking for upgradable packages..." << endl; + Range< entity::Package > fr = filteredRange( + r, predicate::Package::member( &entity::Package::isUpgradable ) ); + VectorRange< entity::Package > vr = VectorRange< entity::Package >(); + fr.output( vr ); + kdDebug() << "found " << vr.size() << " upgradable package(s)" << endl; + int ret = vr.size(); + c.close(); + return ret; + } catch ( exception::Error e ) { + kdDebug() << "error checking cache for upgradable packages..." << endl; + kdDebug() << "what: " << e.message() << endl; + } catch ( std::exception e ) { + kdDebug() << "exception checking cache for upgradable packages..." << endl; + kdDebug() << "what: " << e.what() << endl; + // XXX error handling + } + return true; // we don't know, so assume true (safe) +} + +void NotifierApp::checkUpdates() { + // kdDebug() << "checking updates status" << endl; + if ( // fileUpdated( "/var/lib/apt/periodic/update-stamp", m_updateStamp ) + fileUpdated( "/var/cache/apt/pkgcache.bin", m_updateStamp ) + || fileUpdated( "/var/lib/dpkg/status", m_statusStamp ) ) + m_tray->setAvailableUpdates( upgradable() ); +} + +void NotifierApp::about() { + KAboutApplication *a = new KAboutApplication( m_tray, "", true ); + a->exec(); + delete a; +} + +NotifierApp::~NotifierApp() +{ + delete m_tray; +} + +void NotifierApp::clicked() +{ + if ( m_tray->updates() == 0 ) + return KMessageBox::information( + 0, i18n( "There are no known updates available." ), + i18n( "Nothing to do" ) ); + startServiceByDesktopName( u8( "adept_updater" ) ); +} + +/* void NotifierApp::menuActivated(int id) +{ + // implement help +} */ + +const char * DESCRIPTION = + I18N_NOOP("Adept update notifier utility"); + +/* extern "C" KDE_EXPORT */ +int main(int argc, char *argv[]) +{ + KAboutData about("adept_notifier", I18N_NOOP("Adept Notifier"), + "2.1 Cruiser", + DESCRIPTION, KAboutData::License_BSD, + "Copyright (C) 2005, 2006 Peter Rockai"); + KCmdLineArgs::init(argc, argv, &about); + NotifierApp::addCmdLineOptions(); + + if (!NotifierApp::start()) + return 0; + + NotifierApp app; + app.disableSessionManagement(); + app.exec(); + return 0; +} diff --git a/adept/notifier/app.h b/adept/notifier/app.h new file mode 100644 index 0000000..c543aaa --- /dev/null +++ b/adept/notifier/app.h @@ -0,0 +1,93 @@ +#ifndef EPT_NOTIFIER_H +#define EPT_NOTIFIER_H + +#include +#include +#include +#include +#include + +class QWidget; +class KAction; +// class KGlobalAccel; + +// the status indicator in system tray +class TrayWindow : public KSystemTray +{ + Q_OBJECT +public: + TrayWindow(QWidget *parent=0, const char *name=0); + void setAvailableUpdates( int n ); + int updates() { return m_updates; } + void contextMenuAboutToShow ( KPopupMenu * ); +signals: + void clicked(); + void aboutSelected(); +protected: + void mouseReleaseEvent( QMouseEvent * ); + int m_updates; + KAction *m_quit, *m_about; +}; + +// the apport indicator in system tray +// gets shown where the app is started and +// existing apport reports are found. +// clicking starts apport-qt +class ApportTrayWindow : public KSystemTray +{ + Q_OBJECT +signals: + void clicked(); +protected: + void mousePressEvent(QMouseEvent*); +}; + +// used for the reboot notifier +class RebootTrayWindow : public KSystemTray +{ + Q_OBJECT +signals: + void clicked(); +protected: + void mousePressEvent(QMouseEvent*); +}; + + + +// application watching the current status +// it will update the icon and run +class NotifierApp : public KUniqueApplication +{ + Q_OBJECT +public: + NotifierApp(bool allowStyles=true, bool GUIenabled=true); + ~NotifierApp(); + bool fileUpdated( const char *, time_t & ); + int upgradable(); + +protected slots: +// void menuActivated(int id); + void clicked(); + void checkUpdates(); + void askQuit(); + void about(); + // for apport + void crashWatcher(); + void apportCheckExited(KProcess*); + void rebootWatcher(const QString& path); + void rebootClicked(); + +protected: + TrayWindow *m_tray; + QTimer *m_timer; + time_t m_updateStamp, m_statusStamp; + bool m_okAutostart; + // for apport crash handler + KDirWatch* m_dirWatch; + KDirWatch* m_rebootDirWatch; + bool m_crashes; + bool m_rebootRequired; + bool m_rebootShown; //have we already shown the reboot notifier? +}; + +#endif diff --git a/adept/tests/libcapture/celem-test.cpp b/adept/tests/libcapture/celem-test.cpp new file mode 100644 index 0000000..ada22e3 --- /dev/null +++ b/adept/tests/libcapture/celem-test.cpp @@ -0,0 +1,34 @@ +#include +#include +#include +#include + +namespace tut { + + using namespace std; + using namespace capture; + + struct celem_shar { + }; + + typedef test_group tg; + typedef tg::object to; + tg celem_tg ("celem"); + template<> template<> + void to::test<1> () + { + cacheInit (); + PkgCElemPtr a = cElem (PkgManager::cache () -> FindPkg ("postfix")); + ensure (a -> id () == string ("postfix")); + cerr << "a -> id () = " << a -> id () << endl; + ensure (a -> Name () == string ("postfix")); + cerr << "a -> Name () = " << a -> id () << endl; + VerCElemPtr b = a -> VersionList (); + cerr << "b -> id () = " << b -> id () << endl; + pkgCache::PkgIterator bp = (PkgManager::cache () -> FindPkg + ("postfix")); + string bver = bp . VersionList () . VerStr (); + ensure (bver == b -> id ()); + ensure (bver == b -> VerStr ()); + } +}; diff --git a/adept/tests/libcapture/grouper-test.cpp b/adept/tests/libcapture/grouper-test.cpp new file mode 100644 index 0000000..c454f78 --- /dev/null +++ b/adept/tests/libcapture/grouper-test.cpp @@ -0,0 +1,44 @@ +#include +#define protected public +#include +#include +#include +#include +#include + +namespace tut { + + using namespace std; + using namespace capture; + + struct grouper_shar { + }; + + typedef test_group tg; + typedef tg::object to; + tg grouper_tg ("grouper"); +#define IT(x) dynamic_cast (c -> m_vec [x] . second) + template<> template<> + void to::test<1> () + { + Param::Map a; + GrouperChain *c; + GrouperTNode *n0, *n1, *n2, *n3; + c = new GrouperChain ("test"); + n0 = c -> addFactory ("SectGrouper", "sect"); + ensure (IT (0)); ensure (IT (0) == n0); + n1 = c -> addFactory ("EndGrouper", "end"); + ensure (IT (1)); ensure (IT (1) == n1); + n2 = c -> addFactory ("PkgExistFilter", "exist", a, Grouper::Custom, 1); + ensure (IT (2)); + ensure (IT (0) == n0); + ensure (IT (1) == n2); + ensure (IT (2) == n1); + n3 = c -> addFactory ("PkgNameFilter", "name", a, Grouper::BeforeLast); + ensure (IT (3)); + ensure (IT (0) == n0); + ensure (IT (1) == n2); + ensure (IT (2) == n3); + ensure (IT (3) == n1); + } +}; diff --git a/adept/tests/libcapture/pkgcache-test.cpp b/adept/tests/libcapture/pkgcache-test.cpp new file mode 100644 index 0000000..662aaed --- /dev/null +++ b/adept/tests/libcapture/pkgcache-test.cpp @@ -0,0 +1,71 @@ +#include + +#include +#include +#include +#include + +namespace tut { + + using namespace std; + using namespace capture; + + struct pkgcache_shar { + }; + + typedef test_group tg; + typedef tg::object to; + tg pkgcache_tg ("pkgcache"); + template<> template<> + void to::test<1> () + { + cacheInit (true); + pkgCache::PkgIterator P; + // P = (PkgManager::cache ()) -> FindPkg ("amavis-ng"); + // PkgManager::cache () -> setExtState (P, true, 500); + // PkgManager::cache () -> updateAWanted (true); + P = (PkgManager::cache ()) -> FindPkg ("k3b"); + PkgManager::cache () -> setExtState (P, true, 500); + PkgManager::cache () -> updateAWanted (); + P = (PkgManager::cache ()) -> FindPkg ("kapture"); + PkgManager::cache () -> setExtState (P, true, 500); + PkgManager::cache () -> updateAWanted (); + /* P = (PkgManager::cache ()) -> FindPkg ("apt-listchanges"); + PkgManager::cache () -> setExtState (P, true, 900); + PkgManager::cache () -> updateAWanted (true); + P = (PkgManager::cache ()) -> FindPkg ("exim"); + PkgManager::cache () -> setExtState (P, true, 600); + PkgManager::cache () -> updateAWanted (true); + P = (PkgManager::cache ()) -> FindPkg ("harden"); + PkgManager::cache () -> setExtState (P, true, 700); + PkgManager::cache () -> updateAWanted (true); */ + /* P = (PkgManager::cache ()) -> FindPkg ("rmail"); + PkgManager::cache () -> setExtState (P, true, 200); */ + + // PkgManager::cache () -> updateAWanted (0); + // PkgManager::cache () -> saveExtState ("pkgcache-test.out"); + /* PkgManager::cache () -> updateAWanted (1); + PkgManager::cache () -> saveExtState ("pkgcache-test-1.out"); + PkgManager::cache () -> updateAWanted (2); + PkgManager::cache () -> saveExtState ("pkgcache-test-2.out"); */ + cout << "WANTED PACKAGES:" << endl; + PkgCache::ExtState *s; + for (pkgCache::PkgIterator mP = PkgManager::cache() -> PkgBegin (); ! mP . end (); mP ++) { + s = PkgManager::cache() -> extState (mP); + if (s -> a_wanted_pri > s -> a_unwanted_pri) { + cout << mP . Name () + << ": a_wanted_pri = " << s -> a_wanted_pri + << ", a_unwanted_pri = " << s -> a_unwanted_pri << endl; + } + } + cout << "UNWANTED PACKAGES:" << endl; + for (pkgCache::PkgIterator mP = PkgManager::cache() -> PkgBegin (); ! mP . end (); mP ++) { + s = PkgManager::cache() -> extState (mP); + if (s -> a_unwanted_pri > s -> a_wanted_pri) { + cout << mP . Name () + << ": a_wanted_pri = " << s -> a_wanted_pri + << ", a_unwanted_pri = " << s -> a_unwanted_pri << endl; + } + } + } +} diff --git a/adept/tests/libcapture/stl_util-test.cpp b/adept/tests/libcapture/stl_util-test.cpp new file mode 100644 index 0000000..a083db8 --- /dev/null +++ b/adept/tests/libcapture/stl_util-test.cpp @@ -0,0 +1,56 @@ +#include "stl_util.h" +#include +#include + +namespace tut { + + using namespace std; + using namespace capture; + + struct stl_util_shar { + }; + + typedef test_group tg; + typedef tg::object to; + tg stl_util_tg ("stl_util"); + + template<> template<> + void to::test<1> () + { + argmap test; + test["test1"] = "test2"; + test["fjioj @,,ping"] = "jfdiosqj @@,,"; + test[",,"] = "#@@@"; + string out = argmap2string( test ); + argmap test2 = string2argmap( out ); + ensure( test2.size() == 3 ); + ensure( test2["test1"] == "test2" ); + ensure( test2["fjioj @,,ping"] == "jfdiosqj @@,," ); + ensure( test2[",,"] == "#@@@" ); + } + template<> template<> + void to::test<2> () + { + list test; + test . push_back (string ("test, #1")); + test . push_back (string ("test, #2")); + string joinedf2 = join( test, "," ); + test . push_back ( joinedf2 ); + list testret = explode (join (test, ","), ","); + ensure( test.size() == testret.size() ); + list::iterator i, j; + i = test.begin(); + j = testret.begin(); + for ( ; i != test.end(); ++i, ++j ) + ensure( *i == *j ); + + string joinedf3 = join( test, "," ); + test.push_back( joinedf3 ); + string str = join (test, "::"); + testret = explode (str, "::"); + i = test.begin(); + j = testret.begin(); + for ( ; i != test.end(); ++i, ++j ) + ensure( *i == *j ); + } +} diff --git a/adept/tests/libcapture/tree-test.cpp b/adept/tests/libcapture/tree-test.cpp new file mode 100644 index 0000000..0e2f8d5 --- /dev/null +++ b/adept/tests/libcapture/tree-test.cpp @@ -0,0 +1,86 @@ +// #define protected public +// #define private public +#include +#include +#include + +#include + +namespace tut { + + using namespace std; + using namespace capture; + + struct tree_shar { + }; + + typedef test_group tg; + typedef tg::object to; + tg tree_tg ("tree"); + + class STF: public TreeFactory + { + public: + TreePkgNode *makePkgNode (TreeNode *parent, pkgCache::PkgIterator P) + { return new TreePkgNode (parent, P); } + TreeBranchNode *makeBranchNode (TreeNode *parent, string id, string name) + { return new TreeBranchNode (parent, id, name); } + TreeGroupNode *makeGroupNode (TreeNode *parent, pkgTagSection s) + { return new TreeGroupNode (parent, s); } + TreeBranchNode *makeRoot () { return new TreeBranchNode (0, "ROOT"); } + TreeDepNode *makeDepNode (TreeNode *parent, pkgCache::DepIterator) { return 0; } + TreeVerNode *makeVerNode (TreeNode *parent, pkgCache::VerIterator) { return 0; } + }; + + /* class TestProd: public NodeProducer { + public: + Tree *t; + void getNodes (TreeFactory *f, NodeConsumer *c) + { + TreeNode *a, *b; + a = t -> top (); + // c -> consumeNode (a = f -> makeBNode (t -> top (), "blah1")); + c -> consumeNode (f -> makePkgNode (a, pkgCache::PkgIterator ())); + c -> consumeNode (f -> makePkgNode (a, pkgCache::PkgIterator ())); + c -> consumeNode (f -> makePkgNode (a, pkgCache::PkgIterator ())); + // c -> consumeNode (b = f -> makeBNode (t -> top (), "blah2")); + // c -> consumeNode (f -> makePkg (b, pkgCache::PkgIterator ())); + // c -> consumeNode (f -> makePkg (b, pkgCache::PkgIterator ())); + } + }; */ + template<> template<> + void to::test<1> () + { + TreeFactory *f = new STF; + TestProd *p = new TestProd; + Tree *t = new Tree; + GrouperChain *c = new GrouperChain ("grouperchain"); + c -> addFactory ("EndGrouper", "end"); + t -> setGrouper (c); + t -> setProducer (p); + t -> setTreeFact (f); + p -> t = t; + t -> rebuild (); + + TreeNode *A, *B, *C; + ensure (t -> top ()); + A = t -> top () -> firstChild (); + ensure (A); + B = A -> nextSibling (); + ensure (B); + for (C = B; C -> nextSibling (); C = C -> nextSibling ()); + ensure (C); + ensure (A -> nextSibling () == B); + ensure (B -> nextSibling () == C); + t -> refresh (); + ensure (t -> top ()); + A = t -> top () -> firstChild (); + ensure (A); + B = A -> nextSibling (); + ensure (B); + for (C = B; C -> nextSibling (); C = C -> nextSibling ()); + ensure (C); + ensure (A -> nextSibling () == B); + ensure (B -> nextSibling () == C); + } +}; diff --git a/adept/tests/tut-main.cpp b/adept/tests/tut-main.cpp new file mode 100644 index 0000000..5c278a1 --- /dev/null +++ b/adept/tests/tut-main.cpp @@ -0,0 +1,61 @@ +#include +#include +#include + +namespace tut +{ + test_runner_singleton runner; +} + +int main(int argc,const char* argv[]) +{ + tut::reporter visi; + + if( argc < 2 || argc > 3 ) + { + std::cout << "TUT example test application." << std::endl; + std::cout << "Usage: example [regression] | [list] | [ group] [test]" << std::endl; + std::cout << " List all groups: example list" << std::endl; + std::cout << " Run all tests: example regression" << std::endl; + std::cout << " Run one group: example std::auto_ptr" << std::endl; + std::cout << " Run one test: example std::auto_ptr 3" << std::endl;; + } + + std::cout << "\nFAILURE and EXCEPTION in these tests are FAKE ;)\n\n"; + + tut::runner.get().set_callback(&visi); + + try + { + if( argc == 1 || (argc == 2 && std::string(argv[1]) == "regression") ) + { + tut::runner.get().run_tests(); + } + else if( argc == 2 && std::string(argv[1]) == "list" ) + { + std::cout << "registered test groups:" << std::endl; + tut::groupnames gl = tut::runner.get().list_groups(); + tut::groupnames::const_iterator i = gl.begin(); + tut::groupnames::const_iterator e = gl.end(); + while( i != e ) + { + std::cout << " " << *i << std::endl; + ++i; + } + } + else if( argc == 2 && std::string(argv[1]) != "regression" ) + { + tut::runner.get().run_tests(argv[1]); + } + else if( argc == 3 ) + { + tut::runner.get().run_test(argv[1],::atoi(argv[2])); + } + } + catch( const std::exception& ex ) + { + std::cerr << "tut raised ex: " << ex.what() << std::endl; + } + + return 0; +} diff --git a/adept/tests/tut.h b/adept/tests/tut.h new file mode 100644 index 0000000..dec471a --- /dev/null +++ b/adept/tests/tut.h @@ -0,0 +1,872 @@ +#ifndef TUT_H_GUARD +#define TUT_H_GUARD + +#include +#include +#include +#include +#include +#include +#include + +#if defined(TUT_USE_SEH) +#include +#include +#endif + +/** + * Template Unit Tests Framework for C++. + * http://tut.dozen.ru + * + * @author dozen, tut@dozen.ru + */ +namespace tut +{ + /** + * Exception to be throwed when attempted to execute + * missed test by number. + */ + struct no_such_test : public std::logic_error + { + no_such_test() : std::logic_error("no such test"){}; + }; + + /** + * No such test and passed test number is higher than + * any test number in current group. Used in one-by-one + * test running when upper bound is not known. + */ + struct beyond_last_test : public no_such_test + { + beyond_last_test(){}; + }; + + /** + * Group not found exception. + */ + struct no_such_group : public std::logic_error + { + no_such_group(const std::string& grp) : + std::logic_error(grp){}; + }; + + /** + * Internal exception to be throwed when + * no more tests left in group or journal. + */ + struct no_more_tests + { + no_more_tests(){}; + }; + + /** + * Exception to be throwed when ensure() fails or fail() called. + */ + class failure : public std::logic_error + { + public: + failure(const std::string& msg) : std::logic_error(msg){}; + }; + + /** + * Exception to be throwed when test desctructor throwed an exception. + */ + class warning : public std::logic_error + { + public: + warning(const std::string& msg) : std::logic_error(msg){}; + }; + + /** + * Exception to be throwed when test issued SEH (Win32) + */ + class seh : public std::logic_error + { + public: + seh(const std::string& msg) : std::logic_error(msg){}; + }; + + /** + * Return type of runned test/test group. + * + * For test: contains result of test and, possible, message + * for failure or exception. + */ + struct test_result + { + /** + * Test group name. + */ + std::string group; + + /** + * Test number in group. + */ + int test; + + /** + * ok - test finished successfully + * fail - test failed with ensure() or fail() methods + * ex - test throwed an exceptions + * warn - test finished successfully, but test destructor throwed + * term - test forced test application to terminate abnormally + */ + typedef enum { ok, fail, ex, warn, term } result_type; + result_type result; + + /** + * Exception message for failed test. + */ + std::string message; + std::string exception_typeid; + + /** + * Default constructor. + */ + test_result() + : test(0),result(ok) + { + } + + /** + * Constructor. + */ + test_result( const std::string& grp,int pos,result_type res) + : group(grp),test(pos),result(res) + { + } + + /** + * Constructor with exception. + */ + test_result( const std::string& grp,int pos, + result_type res, + const std::exception& ex) + : group(grp),test(pos),result(res), + message(ex.what()),exception_typeid(typeid(ex).name()) + { + } + }; + + /** + * Interface. + * Test group operations. + */ + struct group_base + { + virtual ~group_base(){}; + + // execute tests iteratively + virtual void rewind() = 0; + virtual test_result run_next() = 0; + + // execute one test + virtual test_result run_test(int n) = 0; + }; + + /** + * Test runner callback interface. + * Can be implemented by caller to update + * tests results in real-time. User can implement + * any of callback methods, and leave unused + * in default implementation. + */ + struct callback + { + /** + * Virtual destructor is a must for subclassed types. + */ + virtual ~callback(){}; + + /** + * Called when new test run started. + */ + virtual void run_started(){}; + + /** + * Called when a test finished. + * @param tr Test results. + */ + virtual void test_completed(const test_result& /*tr*/){}; + + /** + * Called when all tests in run completed. + */ + virtual void run_completed(){}; + }; + + /** + * Typedef for runner::list_groups() + */ + typedef std::vector groupnames; + + /** + * Test runner. + */ + class test_runner + { + protected: + typedef std::map groups; + typedef groups::iterator iterator; + typedef groups::const_iterator const_iterator; + groups groups_; + + callback default_callback_; + callback* callback_; + + public: + /** + * Constructor + */ + test_runner() : callback_(&default_callback_) + { + } + + /** + * Stores another group for getting by name. + */ + void register_group(const std::string& name,group_base* gr) + { + if( gr == 0 ) + { + throw std::invalid_argument("group shall be non-null"); + } + + groups::iterator found = groups_.find(name); + if( found != groups_.end() ) + { + std::string msg("attempt to add already existent group "+name); + // this exception terminates application so we use cerr also + std::cerr << msg << std::endl; + throw std::logic_error(msg); + } + + groups_[name] = gr; + } + + /** + * Stores callback object. + */ + void set_callback(callback* cb) + { + callback_ = cb==0? &default_callback_:cb; + } + + /** + * Returns callback object. + */ + callback& get_callback() const + { + return *callback_; + } + + /** + * Returns list of known test groups. + */ + const groupnames list_groups() const + { + groupnames ret; + const_iterator i = groups_.begin(); + const_iterator e = groups_.end(); + while( i != e ) + { + ret.push_back(i->first); + ++i; + } + return ret; + } + + /** + * Runs all tests in all groups. + * @param callback Callback object if exists; null otherwise + */ + void run_tests() const + { + callback_->run_started(); + + const_iterator i = groups_.begin(); + const_iterator e = groups_.end(); + while( i != e ) + { + try + { + // iterate all tests + i->second->rewind(); + for( ;; ) + { + test_result tr = i->second->run_next(); + callback_->test_completed(tr); + } + } + catch( const no_more_tests& ) + { + // ok + } + + ++i; + } + + callback_->run_completed(); + } + + /** + * Runs all tests in specified group. + */ + void run_tests(const std::string& group_name) const + { + callback_->run_started(); + + const_iterator i = groups_.find(group_name); + if( i == groups_.end() ) + { + throw no_such_group(group_name); + } + + try + { + // iterate all tests + i->second->rewind(); + for(;;) + { + test_result tr = i->second->run_next(); + callback_->test_completed(tr); + } + } + catch( const no_more_tests& ) + { + // ok + } + + callback_->run_completed(); + } + + /** + * Runs one test in specified group. + */ + test_result run_test(const std::string& group_name,int n) const + { + callback_->run_started(); + + const_iterator i = groups_.find(group_name); + if( i == groups_.end() ) + { + throw no_such_group(group_name); + } + + try + { + test_result tr = i->second->run_test(n); + callback_->test_completed(tr); + callback_->run_completed(); + return tr; + } + catch( const beyond_last_test& ) + { + callback_->run_completed(); + throw; + } + catch( const no_such_test& ) + { + callback_->run_completed(); + throw; + } + } + }; + + /** + * Singleton for test_runner implementation. + * Instance with name runner_singleton shall be implemented + * by user. + */ + class test_runner_singleton + { + public: + static test_runner& get() + { + static test_runner tr; + return tr; + } + }; + extern test_runner_singleton runner; + + /** + * Test object. Contains data test run upon and default test method + * implementation. Inherited from Data to allow tests to + * access test data as members. + */ + template + class test_object : public Data + { + public: + /** + * Default constructor + */ + test_object(){}; + + /** + * The flag is set to true by default (dummy) test. + * Used to detect usused test numbers and avoid unnecessary + * test object creation which may be time-consuming depending + * on operations described in Data::Data() and Data::~Data(). + * TODO: replace with throwing special exception from default test. + */ + bool called_method_was_a_dummy_test_; + + /** + * Default do-nothing test. + */ + template + void test() + { + called_method_was_a_dummy_test_ = true; + } + }; + + namespace + { + /** + * Tests provided condition. + * Throws if false. + */ + void ensure(bool cond) + { + if( !cond ) throw failure(""); + } + + /** + * Tests provided condition. + * Throws if false. + */ + void ensure(const char* msg,bool cond) + { + if( !cond ) throw failure(msg); + } + + /** + * Tests two objects for being equal. + * Throws if false. + * + * NB: both T and Q must have operator << defined somewhere, or + * client code will not compile at all! + */ + template + void ensure_equals(const char* msg,const Q& actual,const T& expected) + { + if( expected != actual ) + { + std::stringstream ss; + ss << (msg?msg:"") << (msg?": ":"") << "expected " << expected << " actual " << actual; + throw failure(ss.str().c_str()); + } + } + + template + void ensure_equals(const Q& actual,const T& expected) + { + ensure_equals<>(0,actual,expected); + } + + /** + * Tests two objects for being at most in given distance one from another. + * Borders are excluded. + * Throws if false. + * + * NB: T must have operator << defined somewhere, or + * client code will not compile at all! Also, T shall have + * operators + and -, and be comparable. + */ + template + void ensure_distance(const char* msg,const T& actual,const T& expected,const T& distance) + { + if( expected-distance >= actual || expected+distance <= actual ) + { + std::stringstream ss; + ss << (msg?msg:"") << (msg?": ":"") << "expected [" << expected-distance << ";" + << expected+distance << "] actual " << actual; + throw failure(ss.str().c_str()); + } + } + + template + void ensure_distance(const T& actual,const T& expected,const T& distance) + { + ensure_distance<>(0,actual,expected,distance); + } + + /** + * Unconditionally fails with message. + */ + void fail(const char* msg="") + { + throw failure(msg); + } + } + + /** + * Walks through test tree and stores address of each + * test method in group. Instantiation stops at 0. + */ + template + struct tests_registerer + { + static void reg(Group& group) + { + group.reg(n,&Test::template test); + tests_registerer::reg(group); + } + }; + + template + struct tests_registerer + { + static void reg(Group&){}; + }; + + /** + * Test group; used to recreate test object instance for + * each new test since we have to have reinitialized + * Data base class. + */ + template + class test_group : public group_base + { + const char* name_; + + typedef void (test_object::*testmethod)(); + typedef std::map tests; + typedef typename tests::iterator tests_iterator; + typedef typename tests::const_iterator tests_const_iterator; + typedef typename tests::const_reverse_iterator + tests_const_reverse_iterator; + typedef typename tests::size_type size_type; + + tests tests_; + tests_iterator current_test_; + + /** + * Exception-in-destructor-safe smart-pointer class. + */ + template + class safe_holder + { + T* p_; + bool permit_throw_in_dtor; + + safe_holder(const safe_holder&); + safe_holder& operator = (const safe_holder&); + + public: + safe_holder() : p_(0),permit_throw_in_dtor(false) + { + } + + ~safe_holder() + { + release(); + } + + T* operator -> () const { return p_; }; + T* get() const { return p_; }; + + /** + * Tell ptr it can throw from destructor. Right way is to + * use std::uncaught_exception(), but some compilers lack + * correct implementation of the function. + */ + void permit_throw(){ permit_throw_in_dtor = true; } + + /** + * Specially treats exceptions in test object destructor; + * if test itself failed, exceptions in destructor + * are ignored; if test was successful and destructor failed, + * warning exception throwed. + */ + void release() + { + try + { + if( delete_obj() == false ) + { + throw warning("destructor of test object raised an SEH exception"); + } + } + catch( const std::exception& ex ) + { + if( permit_throw_in_dtor ) + { + std::string msg = "destructor of test object raised exception: "; + msg += ex.what(); + throw warning(msg); + } + } + catch( ... ) + { + if( permit_throw_in_dtor ) + { + throw warning("destructor of test object raised an exception"); + } + } + } + + /** + * Re-init holder to get brand new object. + */ + void reset() + { + release(); + permit_throw_in_dtor = false; + p_ = new T(); + } + + bool delete_obj() + { +#if defined(TUT_USE_SEH) + __try + { +#endif + T* p = p_; + p_ = 0; + delete p; +#if defined(TUT_USE_SEH) + } + __except(handle_seh_(::GetExceptionCode())) + { + if( permit_throw_in_dtor ) + { + return false; + } + } +#endif + return true; + } + }; + + public: + typedef test_object object; + + /** + * Creates and registers test group with specified name. + */ + test_group(const char* name) + : name_(name) + { + // register itself + runner.get().register_group(name_,this); + + // register all tests + tests_registerer::reg(*this); + }; + + /** + * This constructor is used in self-test run only. + */ + test_group(const char* name,test_runner& another_runner) + : name_(name) + { + // register itself + another_runner.register_group(name_,this); + + // register all tests + tests_registerer, + test_group,MaxTestsInGroup>::reg(*this); + }; + + /** + * Registers test method under given number. + */ + void reg(int n,testmethod tm) + { + tests_[n] = tm; + } + + /** + * Reset test position before first test. + */ + void rewind() + { + current_test_ = tests_.begin(); + } + + /** + * Runs next test. + */ + test_result run_next() + { + if( current_test_ == tests_.end() ) + { + throw no_more_tests(); + } + + // find next user-specialized test + safe_holder obj; + while( current_test_ != tests_.end() ) + { + try + { + return run_test_(current_test_++,obj); + } + catch( const no_such_test& ) + { + continue; + } + } + + throw no_more_tests(); + } + + /** + * Runs one test by position. + */ + test_result run_test(int n) + { + // beyond tests is special case to discover upper limit + if( tests_.rbegin() == tests_.rend() ) throw beyond_last_test(); + if( tests_.rbegin()->first < n ) throw beyond_last_test(); + + // withing scope; check if given test exists + tests_iterator ti = tests_.find(n); + if( ti == tests_.end() ) throw no_such_test(); + + safe_holder obj; + return run_test_(ti,obj); + } + + private: + /** + * VC allows only one exception handling type per function, + * so I have to split the method + */ + test_result run_test_(const tests_iterator& ti,safe_holder& obj) + { + try + { + if( run_test_seh_(ti->second,obj) == false ) + throw seh("seh"); + } + catch(const no_such_test&) + { + throw; + } + catch(const warning& ex) + { + // test ok, but destructor failed + test_result tr(name_,ti->first,test_result::warn,ex); + return tr; + } + catch(const failure& ex) + { + // test failed because of ensure() or similar method + test_result tr(name_,ti->first,test_result::fail,ex); + return tr; + } + catch(const seh& ex) + { + // test failed with sigsegv, divide by zero, etc + test_result tr(name_,ti->first,test_result::term,ex); + return tr; + } + catch(const std::exception& ex) + { + // test failed with std::exception + test_result tr(name_,ti->first,test_result::ex,ex); + return tr; + } + catch(...) + { + // test failed with unknown exception + test_result tr(name_,ti->first,test_result::ex); + return tr; + } + + // test passed + test_result tr(name_,ti->first,test_result::ok); + return tr; + } + + /** + * Runs one under SEH if platform supports it. + */ + bool run_test_seh_(testmethod tm,safe_holder& obj) + { +#if defined(TUT_USE_SEH) + __try + { +#endif + if( obj.get() == 0 ) obj.reset(); + obj->called_method_was_a_dummy_test_ = false; + +#if defined(TUT_USE_SEH) + __try + { +#endif + (obj.get()->*tm)(); +#if defined(TUT_USE_SEH) + } + __except(handle_seh_(::GetExceptionCode())) + { + // throw seh("SEH"); + return false; + } +#endif + + if( obj->called_method_was_a_dummy_test_ ) + { + // do not call obj.release(); reuse object + throw no_such_test(); + } + + obj.permit_throw(); + obj.release(); +#if defined(TUT_USE_SEH) + } + __except(handle_seh_(::GetExceptionCode())) + { + // throw seh("SEH"); + return false; + } +#endif + return true; + } + }; + + +#if defined(TUT_USE_SEH) + /** + * Decides should we execute handler or ignore SE. + */ + inline int handle_seh_(DWORD excode) + { + switch(excode) + { + case EXCEPTION_ACCESS_VIOLATION: + case EXCEPTION_DATATYPE_MISALIGNMENT: + case EXCEPTION_BREAKPOINT: + case EXCEPTION_SINGLE_STEP: + case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: + case EXCEPTION_FLT_DENORMAL_OPERAND: + case EXCEPTION_FLT_DIVIDE_BY_ZERO: + case EXCEPTION_FLT_INEXACT_RESULT: + case EXCEPTION_FLT_INVALID_OPERATION: + case EXCEPTION_FLT_OVERFLOW: + case EXCEPTION_FLT_STACK_CHECK: + case EXCEPTION_FLT_UNDERFLOW: + case EXCEPTION_INT_DIVIDE_BY_ZERO: + case EXCEPTION_INT_OVERFLOW: + case EXCEPTION_PRIV_INSTRUCTION: + case EXCEPTION_IN_PAGE_ERROR: + case EXCEPTION_ILLEGAL_INSTRUCTION: + case EXCEPTION_NONCONTINUABLE_EXCEPTION: + case EXCEPTION_STACK_OVERFLOW: + case EXCEPTION_INVALID_DISPOSITION: + case EXCEPTION_GUARD_PAGE: + case EXCEPTION_INVALID_HANDLE: + return EXCEPTION_EXECUTE_HANDLER; + }; + + return EXCEPTION_CONTINUE_SEARCH; + } +#endif +} + +#endif + diff --git a/adept/tests/tut_reporter.h b/adept/tests/tut_reporter.h new file mode 100644 index 0000000..941d653 --- /dev/null +++ b/adept/tests/tut_reporter.h @@ -0,0 +1,182 @@ +#ifndef TUT_REPORTER +#define TUT_REPORTER + +#include + +/** + * Template Unit Tests Framework for C++. + * http://tut.dozen.ru + * + * @author dozen, tut@dozen.ru + */ +namespace +{ + std::ostream& operator << (std::ostream& os,const tut::test_result& tr) + { + switch(tr.result) + { + case tut::test_result::ok: + os << '.'; + break; + + case tut::test_result::fail: + os << '[' << tr.test << "=F]"; + break; + + case tut::test_result::ex: + os << '[' << tr.test << "=X]"; + break; + + case tut::test_result::warn: + os << '[' << tr.test << "=W]"; + break; + + case tut::test_result::term: + os << '[' << tr.test << "=T]"; + break; + } + + return os; + } +} + +namespace tut +{ + /** + * Default TUT callback handler. + */ + class reporter : public tut::callback + { + std::string current_group; + typedef std::vector not_passed_list; + not_passed_list not_passed; + std::ostream& os; + + public: + int ok_count; + int exceptions_count; + int failures_count; + int terminations_count; + int warnings_count; + + reporter() : os(std::cout) + { + init(); + } + + reporter(std::ostream& out) : os(out) + { + init(); + } + + void run_started() + { + init(); + } + + void test_completed(const tut::test_result& tr) + { + if( tr.group != current_group ) + { + os << std::endl << tr.group << ": " << std::flush; + current_group = tr.group; + } + + os << tr << std::flush; + if( tr.result == tut::test_result::ok ) ok_count++; + else if( tr.result == tut::test_result::ex ) exceptions_count++; + else if( tr.result == tut::test_result::fail ) failures_count++; + else if( tr.result == tut::test_result::warn ) warnings_count++; + else terminations_count++; + + if( tr.result != tut::test_result::ok ) + { + not_passed.push_back(tr); + } + } + + void run_completed() + { + os << std::endl; + + if( not_passed.size() > 0 ) + { + not_passed_list::const_iterator i = not_passed.begin(); + while( i != not_passed.end() ) + { + tut::test_result tr = *i; + + os << std::endl; + + os << "---> " << "test: " << tr.group << ", test<" << tr.test << ">" << std::endl; + + os << " problem: "; + switch(tr.result) + { + case test_result::fail: + os << "assertion failed" << std::endl; + break; + case test_result::ex: + os << "unexpected exception" << std::endl; + if( tr.exception_typeid != "" ) + { + os << " exception typeid: " + << tr.exception_typeid << std::endl; + } + break; + case test_result::term: + os << "would be terminated" << std::endl; + break; + case test_result::warn: + os << "test passed, but cleanup code (destructor) raised an exception" << std::endl; + break; + default: break; + } + + if( tr.message != "" ) + { + if( tr.result == test_result::fail ) + { + os << " failed assertion: \"" << tr.message << "\"" << std::endl; + } + else + { + os << " message: \"" << tr.message << "\"" << std::endl; + } + } + + ++i; + } + } + + os << std::endl; + + os << "tests summary:"; + if( terminations_count > 0 ) os << " terminations:" << terminations_count; + if( exceptions_count > 0 ) os << " exceptions:" << exceptions_count; + if( failures_count > 0 ) os << " failures:" << failures_count; + if( warnings_count > 0 ) os << " warnings:" << warnings_count; + os << " ok:" << ok_count; + os << std::endl; + } + + bool all_ok() const + { + return not_passed.size() == 0; + } + + private: + void init() + { + ok_count = 0; + exceptions_count = 0; + failures_count = 0; + terminations_count = 0; + warnings_count = 0; + + not_passed.clear(); + } + }; +}; + +#endif diff --git a/adept/updater/Makefile.am b/adept/updater/Makefile.am new file mode 100644 index 0000000..83afaae --- /dev/null +++ b/adept/updater/Makefile.am @@ -0,0 +1,21 @@ + +bin_PROGRAMS = adept_updater +noinst_HEADERS = app.h +adept_updater_SOURCES = main.cpp app.cpp +adept_updater_LDADD = ../adept/libadept.la $(LIBAPT_FRONT_LIBS) $(LIBEPT_LIBS) $(LIBTAGCOLL2_LIBS) $(LIBWIBBLE_LIBS) $(LIB_KIO) $(LIBKDE_UI) ../kubuntu_upgrader/libkubuntuupgradewizard.la +adept_updater_LDFLAGS = -L/usr/lib/debug +INCLUDES = $(all_includes) $(LIBAPT_FRONT_CFLAGS) $(LIBEPT_CFLAGS) $(LIBTAGCOLL2_CFLAGS) $(LIBWIBBLE_CFLAGS) -I$(srcdir)/.. -I.. +KDE_CXXFLAGS = $(USE_EXCEPTIONS) -DQT_NO_ASCII_CAST -DQT_NO_CAST_ASCII +METASOURCES = AUTO +KDE_ICON = AUTO + +rcdir = $(kde_datadir)/adept_updater +rc_DATA = adept_updaterui.rc + +#shelldesktopdir = $(kde_appsdir)/System +xdg_apps_DATA = adept_updater.desktop + +messages: rc.cpp + $(EXTRACTRC) `find . -name \*.ui -o -name \*.rc` > rc.cpp + $(EXTRACTRC) `find . -name "*.rc"` >> rc.cpp + $(XGETTEXT) *.cpp *.h -o $(podir)/adept_updater.pot diff --git a/adept/updater/adept_updater.desktop b/adept/updater/adept_updater.desktop new file mode 100644 index 0000000..8dae4d6 --- /dev/null +++ b/adept/updater/adept_updater.desktop @@ -0,0 +1,69 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=Adept Updater +Name[bg]=Обновяване на Adept +Name[ca]=Actualitzador Adept +Name[da]=Adept-opdatering +Name[el]=Ανανεωτής Adept +Name[es]=Actualizador experto +Name[et]=Adepti uuendaja +Name[fr]=Mise à jour Adept +Name[ga]=Nuashonróir Adept +Name[gl]=Actualizador de Adept +Name[it]=Aggiornamento Adept +Name[ka]=Adept განმაახლებელი +Name[lt]=Adept atnaujinimai +Name[pt]=Actualizador do Adept +Name[sk]=Adept aktualizácia +Name[sv]=Adept-uppdaterare +Name[xx]=xxAdept Updaterxx +GenericName=System Update Wizard +GenericName[bg]=Обновяване на Adept +GenericName[ca]=Assistent d'actualització del sistema +GenericName[cs]=Průvodce aktualizací systému +GenericName[da]=Systemopdateringsguide +GenericName[de]=Systemaktualisierungsassistent +GenericName[el]=Μάγος ενημέρωσης συστήματος +GenericName[es]=Asistente de actualización del sistema +GenericName[et]=Süsteemi uuendamine nõustaja +GenericName[fr]=Assistant de mise à jour du système +GenericName[gl]=Asistente de Actualizazón do Sistema +GenericName[it]=Procedura guidata aggiornamento sistema +GenericName[ja]=システムアップデートウィザード +GenericName[ka]=სისტემის განახლების ოსტატი +GenericName[lt]=Sistemos atnaujinimo vediklis +GenericName[nl]=Systeem-update-assistent +GenericName[pt]=Assistente de Actualização do Sistema +GenericName[sk]=Sprievodca systémovou aktualizáciou +GenericName[sv]=Systemuppdateringsguide +GenericName[xx]=xxSystem Update Wizardxx +Exec=/opt/kde3/bin/adept_updater +Categories=Qt;KDE;System; +Icon=adept_updater +Type=Application +X-KDE-SubstituteUID=true +Comment=Update installed software +Comment[bg]=Обновяване на инсталиран софтуер +Comment[ca]=Actualitza el programari instal·lat +Comment[cs]=Aktualizace nainstalovaného softwaru +Comment[da]=Opdatér installeret programmel +Comment[de]=Aktualisiert installierte Software +Comment[el]=Ενημέρωση εγκατεστημένου λογισμικού +Comment[es]=Actualizar el software instalado +Comment[et]=Paigaldatud tarkvara uuendamine +Comment[fr]=Mise à jour des logiciels installés +Comment[ga]=Nuashonraigh bogearraí suiteáilte +Comment[gl]=Actualiza o software instalado +Comment[it]=Aggiorna il software installato +Comment[ja]=インストール済みのソフトウェアをアップデート +Comment[ka]=დაყენებული პროგრამების განახლება +Comment[lt]=Įdiegtų programų atnaujinimas +Comment[nl]=Geïnstalleerde software bijwerken +Comment[pt]=Actualiza o 'software' instalado +Comment[sk]=Aktualizácia inštalovaného softwaru +Comment[sr]=Ажурира инсталиране програме +Comment[sr@Latn]=Ažurira instalirane programe +Comment[sv]=Uppdatera installerad programvara +Comment[xx]=xxUpdate installed softwarexx +Terminal=false +NoDisplay=true diff --git a/adept/updater/adept_updaterui.rc b/adept/updater/adept_updaterui.rc new file mode 100644 index 0000000..083b9e8 --- /dev/null +++ b/adept/updater/adept_updaterui.rc @@ -0,0 +1,16 @@ + + + + + &Adept + + + + &Edit + + + + + + + diff --git a/adept/updater/app.cpp b/adept/updater/app.cpp new file mode 100644 index 0000000..c16424b --- /dev/null +++ b/adept/updater/app.cpp @@ -0,0 +1,275 @@ +#define KUBUNTU + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#ifdef KUBUNTU +#include +#endif + +#include "app.h" + +using namespace aptFront; +using namespace aptFront::cache; +using namespace adept; + +void WaitForLister::waiting() +{ + kdDebug() << "WaitForLister::waiting()" << endl; + if (app->m_list->searchView()->lister()->busy()) + QTimer::singleShot( 100, this, SLOT( waiting() ) ); + else { + QTimer::singleShot( 0, app, slot ); + deleteLater(); + } +} + +TestApp::TestApp() +{ + m_all = new QVBox( this ); + m_stack = new QWidgetStack( m_all ); + + m_stack->addWidget( m_loading = new QLabel( i18n( "Loading, please wait..." ), m_stack ) ); + m_loading->setAlignment( Qt::AlignHCenter | Qt::AlignVCenter ); + + m_buttons = new QHBox( m_all ); + QLabel *space = new QLabel( m_buttons ); // spacing + m_next = new KPushButton( i18n( "Next" ), m_buttons ); + m_quit = new KPushButton( i18n( "Quit" ), m_buttons ); + m_next->setEnabled( false ); + m_quit->setEnabled( false ); + + m_buttons->setSpacing( 2 ); + m_buttons->setMargin( 2 ); + QSizePolicy buttons( QSizePolicy::Preferred, QSizePolicy::Fixed, false ); + m_buttons->setSizePolicy( buttons ); + m_next->setSizePolicy( buttons ); + m_quit->setSizePolicy( buttons ); + space->setSizePolicy( QSizePolicy( + QSizePolicy::Expanding, + QSizePolicy::Fixed, false ) ); + + setStandardToolBarMenuEnabled( false ); + createStandardStatusBarAction(); + setupActions(); + setupGUI( Keys|StatusBar|Save|Create ); + delete toolBar(); + + Application::setStatusBar( statusBar() ); + + QTimer::singleShot( + 0, this, + SLOT( delayed() ) ); + + setCentralWidget( m_all ); + setMinimumSize( 400, 300 ); +} + +void TestApp::delayed() +{ + initialize(); + observeComponent< component::State >(); + + m_stack->addWidget( m_list = new adept::Browser( m_stack ) ); + m_stack->addWidget( m_bye = new QLabel( i18n( "Update Complete" ), + m_stack ) ); + m_stack->addWidget( m_start = new QLabel( i18n( "Welcome to Adept Updater" ), + m_stack ) ); + m_bye->setAlignment( Qt::AlignHCenter | Qt::AlignVCenter ); + m_start->setAlignment( Qt::AlignHCenter | Qt::AlignVCenter ); + + m_list->searchView()->setUpgradeMode(); + + m_stack->addWidget( m_progress = new adept::AcqProgressWidget( m_stack ) ); + m_stack->addWidget( m_commitProgress = new CommitProgress( m_stack ) ); + + m_stack->raiseWidget( m_start ); + + statusBar()->clear(); + notifyPostChange(0); + start(); +} + +void TestApp::setupActions() +{ + KStdAction::quit( kapp, SLOT( quit() ), actionCollection() ); + m_undo = KStdAction::undo( this, SLOT( undo() ), actionCollection() ); + m_redo = KStdAction::redo( this, SLOT( redo() ), actionCollection() ); + setHistoryEnabled( false ); + createStandardStatusBarAction(); +} + +void TestApp::setHistoryEnabled( bool e ) { + if (e && history() ) { + m_undo->setEnabled( history()->canUndo() ); + m_redo->setEnabled( history()->canRedo() ); + } else { + m_undo->setEnabled( false ); + m_redo->setEnabled( false ); + } +} + +void TestApp::notifyPreChange( component::Base *b ) +{ + Application::notifyPreChange( b ); + checkpoint(); +} + +void TestApp::notifyPostChange( component::Base *b ) +{ + Application::notifyPostChange( b ); + m_list->searchView()->lister()->scheduleRebuild(); // rebuild on change... +} + +void TestApp::setNext( QString s, const char *slot, QString q, const char *quits ) { + disconnect( m_next, SIGNAL( clicked() ), 0, 0 ); + m_next->setText( s ); + m_next->setEnabled( slot ); + if ( slot ) + connect( m_next, SIGNAL( clicked() ), this, slot ); + + disconnect( m_quit, SIGNAL( clicked() ), 0, 0 ); + m_quit->setEnabled( quits ); + m_quit->setText( q ); + if ( quits ) + connect( m_quit, SIGNAL( clicked() ), this, quits ); +} + +void TestApp::disableNext() { + setNext( i18n( "Next" ), 0 ); +} + +void TestApp::disableButtons() { + disableNext(); + m_quit->setEnabled( false ); +} + +void TestApp::start() { +// disableNext(); + update(); +// setNext( i18n( "Fetch List of Updates" ), SLOT( update() ), +// i18n( "Skip Fetching List" ), SLOT( postUpdate() ) ); +} + +void TestApp::update() { + kdDebug() << "TestApp::update" << endl; + disableButtons(); + + aptFront::Manager m; + m.setProgressCallback( m_progress->callback() ); + m.setUpdateInterval( 100000 ); + kdDebug() << "manager set up" << endl; + try { + m_stack->raiseWidget( m_progress ); + m.update(); + } catch ( exception::OperationCancelled ) { + } catch ( ... ) { + KMessageBox::sorry( + this, i18n( "There was an error downloading updates. " ), + i18n( "Could not fetch updates" ) ); + } + postUpdate(); +} + +void TestApp::postUpdate() { + cache::Global::get().state().distUpgrade(); + if ( cache::Global::get().state().upgradableCount() > 0 ) { + m_list->searchView()->lister()->scheduleRebuild(); + m_stack->raiseWidget( m_list ); + setHistoryEnabled( true ); + setNext( i18n( "Apply Updates" ), SLOT( commit() ) ); + } else { + m_bye->setText( i18n( "Nothing to Update" ) ); + m_stack->raiseWidget( m_bye ); + disableNext(); + // setNext( i18n( "Nothing to do, Quit" ), SLOT( close() ) ); + m_quit->setText( i18n( "Quit" ) ); + m_quit->setEnabled( true ); +#ifdef KUBUNTU + wizard = new UpgradeWizard(this, 0, 1); + if( wizard->checkForDistUpgrade() ) { + m_bye->setText(i18n("A new distribution version is available! Click next if you wish to upgrade now.")); //FIXME improve text + setNext( i18n( "Version Upgrade" ), SLOT( releaseUpgrade() ) ); + } else { + wizard->close(); + } +#endif + } +} + +void TestApp::commit() { + kdDebug() << "TestApp::commit" << endl; + disableButtons(); + setHistoryEnabled( false ); + if (m_list->searchView()->lister()->busy()) { + new WaitForLister( this, SLOT( commit() ) ); + return; + } + + aptFront::Manager m; + m.setProgressCallback( m_progress->callback() ); + m.setUpdateInterval( 100000 ); + try { + m_stack->raiseWidget( m_progress ); + m.download(); + m_stack->raiseWidget( m_commitProgress ); + m.commit(); + } catch ( exception::OperationCancelled ) { + } catch ( ... ) { + KMessageBox::sorry( + this, i18n( "There was an error commiting changes. " + "Possibly there was a problem downloading some " + "packages or the commit would break packages. " ), + i18n( "Could not commit changes" ) ); + } + + m_stack->raiseWidget( m_bye ); + disableNext(); +#ifdef KUBUNTU + wizard = new UpgradeWizard(this, 0, 1); + if( wizard->checkForDistUpgrade() ) { + m_bye->setText(i18n("A new distribution version is available! Click next if you wish to upgrade now.")); //FIXME improve text + setNext( i18n( "Version Upgrade" ), SLOT( releaseUpgrade() ) ); + } else { + wizard->close(); + } +#endif + m_quit->setText( i18n( "Quit" ) ); + m_quit->setEnabled( true ); + notifyPostChange( 0 ); +} + +#ifdef KUBUNTU +void TestApp::releaseUpgrade() { + wizard->show(); +} +#endif + +#include "app.moc" diff --git a/adept/updater/app.h b/adept/updater/app.h new file mode 100644 index 0000000..a51986c --- /dev/null +++ b/adept/updater/app.h @@ -0,0 +1,105 @@ +/* -*- C++ -*- */ +#ifndef TESTUI_APP_H +#define TESTUI_APP_H + +#define KUBUNTU + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef KUBUNTU +#include +#endif + +class QVBox; +class QWidgetStack; +class QSplitter; +class KAction; +class KPushButton; +namespace adept { +class AcqProgressWidget; +} + +using namespace aptFront; +using namespace adept; + +class TestApp : public KMainWindow, Application { + Q_OBJECT +public: + void setupActions(); + ExtTerminalInterface *terminal(); + TestApp(); +protected slots: + void start(); + void update(); + void postUpdate(); + void commit(); + + void delayed(); + + void undo() { Application::undo(); } + void redo() { Application::redo(); } + void checkpoint() { Application::checkpoint(); } + + void setHistoryEnabled( bool ); + + void disableNext(); + void disableButtons(); + void setNext( QString str, const char *slot, + QString qstr = i18n( "Forget Changes and Quit" ), + const char *qslot = SLOT( close() ) ); +#ifdef KUBUNTU + void releaseUpgrade(); +#endif +protected: + friend class WaitForLister; + + virtual void notifyPostChange( cache::component::Base * ); + virtual void notifyPreChange( cache::component::Base * ); + + QWidgetStack *m_stack; + QVBox *m_all; + QHBox *m_buttons; + QLabel *m_start, *m_bye, *m_loading; + KPushButton *m_next, *m_quit; + + // stacked widgets + adept::AcqProgressWidget *m_progress; + adept::CommitProgress *m_commitProgress; + adept::Browser *m_list; + + // other stuff + std::vector m_actions; + QMap< QString, QString > m_icons; + KAction *m_undo, *m_redo; + cache::component::History< cache::component::State > *m_history; + +#ifdef KUBUNTU + UpgradeWizard* wizard; +#endif +}; + +class WaitForLister : public QObject { + Q_OBJECT +public: + WaitForLister( TestApp *a, const char *s ) + : app( a ), slot( s ) + { + waiting(); + } +protected slots: + void waiting(); +protected: + TestApp *app; + const char *slot; + +}; + +#endif diff --git a/adept/updater/hi128-app-adept_updater.png b/adept/updater/hi128-app-adept_updater.png new file mode 100644 index 0000000000000000000000000000000000000000..a68965f5cdfd3d307be30ba5dc90a061a8477c72 GIT binary patch literal 27523 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 literal 0 HcmV?d00001 diff --git a/adept/updater/hi16-app-adept_updater.png b/adept/updater/hi16-app-adept_updater.png new file mode 100644 index 0000000000000000000000000000000000000000..4952024e7e5bd02464412a465bd1e5f1da0fabb5 GIT binary patch literal 1509 zcmVYB$h&mkg&9nSP+pCf;Ng$6hpOIrR`|P z+|KX4ckbN3_gmbLFOjd|%Xb#<>OJQ?=bYy}2l$`HafARY8w?5p5D5HNfA)7DM3H3y zk7w7eb?eH@ckT=ZMG*)DMn+`WvPMT+TN@fAsjcn!@dF2<(c{O%;b4%`P)O4hrBKkc zY*y23JCm_2#{q2n*Z5?r#FdpLC4_`R$BymaUt4?h=)Qdi54N`M-{05w{CQvB(9n$= zuU|{j-MejV+qP}mv|~qgbxloqc_ad)QZHWu#p2LVXJ;bu;>FXavDowH?d?yWj*Ydq zKYH}>V?O`r(eUu(q-A~n{1X7f5CSkvef_+7K3`qksZ)m!Z{B?BR8!N|tDbuN5TGcs z%=3WPTUl9G2iUgbPzq?8s%jdbs*0j003jUb^8v{u$JN#Xxm+@-ssJImoGcU4)%EF9 zKL7af`}c{2WyNAYIiRY=BBhGr@mQ9s^8D)6;V`9Z*0Aiz$fr+&psF)wY}fz@LS^NW zC4i#j^NIq*>j z#m2`e{qUiqIm=>cq;VWv$37^bu|5&^2Kb^X;VVAiZ;^5#uI5OjTf9EipG`;*DR!3!5UIuePq zXWb4N24@(S1sKM}L^f;Ni9~z*%a`f&ojZcSvV()7*xGvN(9D_Jw}1aGiVY1ctEwIk zA%NGL%k}jEWo0ZY%RnTe>$h&X?C?r3}L`0HuaeEV?5ggkb=HQh=LE2bjP2 zBb}CIkB8F!{$g>-65z>`RElMRdGq}KIdg!uYYT;o7XgMzrTY6_I%l)4X8A-^cklmIBTZAt;t%;j_)@Om9*co=XTS=M!+xA)sO#{nV{Nvf#29AjEN8+5STSfa6fgvXWFR_VjR^Z5u{1=~hx-4}`;hzvBQb%W;7K zkk1#3E*A=geBSkT9Dw6^UK9aY&SoirKP3ImPryJ(P$vRaV%R_ zHf>rkC`lYwQQ`Hv0`}$0l`DYXud2ht03n4!It^HsW%0ai-@N(m9mCwZb>hT>2bs)~ zBNG#<>NxTEZ*PIi0fvzzpO27=iWMuWs(ik>x~8Uu3qzqTTWV_;ESNoe-MXbqMR90o z?%a|Rj?*+j7#~li94D1Jf4-|r*Uy}}e7Uz*RnMKvW=)gQOy-Y|(NyM6k&sZx>jlE$ zXfzxa#g!{pt*WW<``500`0(>*O}l^p-n}nh3WeLZT{&{!f3v>;b>7V6MS@q#00000 LNkvXXu0mjf5sc-@ literal 0 HcmV?d00001 diff --git a/adept/updater/hi22-app-adept_updater.png b/adept/updater/hi22-app-adept_updater.png new file mode 100644 index 0000000000000000000000000000000000000000..3b3880cc5a1c05c78a75319adbfd6f9076888797 GIT binary patch literal 2357 zcmV-53Ci|~P)nn zAGWoH!$4~*%Q6hWvgNX>0+q_u`|)^P9njM9!VCA`ABh}1SX1M66A}!TN|lPPmrA0j zszAB?Kg*0^C<>tI2Or$B#p4+mn3_6vY~Q}g$uGWm{q>C-hlgV^pAU#egTX)`7z~FG z9eV!xJMQ@Gvr1)R;=T6>DVN8_UVKqiCnt{{?eCwMIDGhtCt6w#9ooISyPM1jef|2&y2 z7Qg@A>+R?m81VZyZd|vnt*xgAa5!k1VJekUX>k#7yEX0CUx9E~RnMOXBxzyc(j`Ti zo<4VOc6NF?nH(KmT1qBIMt=XjR622De0*t1)5gd1d07T>xf=p^cGlNZRD1j2;8Ra+ z+B7)W-~ZTS4?VPJ4^8vD&qvdynNFutz{-lMCK7ckSxzBt%gZ1pwyfCno_> zEEahlaJf1X#$F(D5`3IDhl9sd%d9$kj)m0Tekv&aOKMAC{R;V zt*)#9fGFnkfMuyF!)V&b$n>-TP5XR} zjlj~9VKg-XgxH{jsH&y`$BvDSl}bZHLqq4z$@0*U-_No@AaKnk2(hnYV{>z=IzH}l z6CYn~&=4MG!Rks_^wD$G~9sn4I z=e=HANm&LK7gMRZIlwdvg{dh(*Q?b`29PAfU|GQFbUJz7ZW+S>s#Uv!kq9t94{%&h z&z3Eg)z#J6+0?XdT|U3Gl*^S$@4x@eH;apdgG^svTN|)_dso-$)ipIeJ-xjfH@3F+ z_BJ=SwA9x(H@CJnHHAWJ)>szHy4{vVQFC+Yw8LRpgjg1!D5`20fFvo3rU9xd%aUZf zK_&yxv}poBu_#Hg7{GBn9|&Amx~?u5Bm{7|yxx`;Kv4>XT+XsS`Q+%)pME-g_}zC; zp1gedjW?E;Wf@4P8NZ+70I#>9AsD3TSgfZfk%&ZkdJ>7=-tO+TYdJ0u2!&Xd5Jiz? zz~kY0jssY>P#78lRJB@-#{orQn5HJc>2$eR7N}P3?}kB$rU4YiFg$P9P?mv)21Pk@ z28c$>XP7#kZMotvAP85}%u;_~HJU(M%r9mwTw=)-k&9uE)-ZP?J<%(5Fc z?A^O-iKDmGYqmS}D$FVHS0`v2K`~eV>PG7oYPqk$MlEm}zIFL?zz3bNl zg+eH_X%oP4Znq!+t5%6(G6@6%#p0PWb^@vjP!vsD7Vz!2KmNG9JUY5}@5dicP4)GO zqG15V;5VW|qxn1)-}8 z&@`T}RDfWxP#7NvWZ8BDuU8NNAQofUUw#3c&MQ|gTmV>hWo2T*9&&ro9S({DOw;x$ zLJY$&s2lDF1~&Z5K=0oQh?K0EMB|_5F*R=34*2>2C%&X&@{`kEP$p7u`G(R)A%d+O@Xg!VHk>H z7(gz!yc~-G>9k?g)&k#sH#3vV0W?ifgaF&O$71#MfY)m;)4DoYUR(qSvHh2#bX`>e z%Q6gI2NcD!?6Gt>91dHU|3q^Oz;-0~ar5v#JV= zj>)cRV}Q%0X|fEMrmD&^peVK!mSyWm(+tBfwm=N?4}b|FgrX>l zWld8QDJl{%jAO?DmrE3*QNZJ&>CR3-mQ_{PfmqDvV;I0R{r=UffqXujjYa`M(6ogG zKvivE%evZX6y1^48ep1sOI&RMhl62UECZejJ;2)-PG=&)ahlfA5ehk-6jfK}a#0jbyWPQ{$0GJc&doMAPl*;B1bh)~_31JwXr>IXqJ#}h%`N)xv zJ{lb@m*06On^jdpGMQU_-#-SvQP`sw2y}JT);gW**YiBXP!z|VK7IMJrX`cQZXfUe b+yDI+0%o2eS*gV^00000NkvXXu0mjf_7YRV literal 0 HcmV?d00001 diff --git a/adept/updater/hi32-app-adept_updater.png b/adept/updater/hi32-app-adept_updater.png new file mode 100644 index 0000000000000000000000000000000000000000..ee196a81fb9ac4b4cd6005938a9e9866df35e1e8 GIT binary patch literal 4053 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 Hu0mjfGBCEd literal 0 HcmV?d00001 diff --git a/adept/updater/hi48-app-adept_updater.png b/adept/updater/hi48-app-adept_updater.png new file mode 100644 index 0000000000000000000000000000000000000000..5abac9bb01dcc0982164be4642fd31fee3bdc3e7 GIT binary patch literal 7011 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

    AKr1PE;hq0uVRn$=het{;rUqb;SfQypv_JJwYL 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 jckc8EB1 +#include +#include + +#include "app.h" + +static KCmdLineOptions options[] = +{ + KCmdLineLastOption +}; + +int main(int argc, char *argv[]) +{ + + KLocale::setMainCatalogue("adept_updater"); + + putenv( "QT_IM_MODULE=xim" ); + QString description = i18n("Adept Updater"); + + KAboutData aboutData( "adept_updater", + I18N_NOOP("Adept Updater"), + "2.1 Cruiser", + description.latin1(), + KAboutData::License_BSD, + I18N_NOOP("(c) 2005, 2006 Peter Rockai"), + 0, + "http://web.mornfall.net/adept.html"); + + aboutData.addAuthor ( "Peter Rockai", + I18N_NOOP("developer"), + "me at mornfall dot net", + "http://web.mornfall.net"); + + KCmdLineArgs::init( argc, argv, &aboutData ); + KCmdLineArgs::addCmdLineOptions( options ); + + KApplication app; + + KCmdLineArgs* args = KCmdLineArgs::parsedArgs(); + // if (args && args->isSet("xy")) ... + + /* KConfig* config = KGlobal::config(); + config->setGroup("General Settings"); + QString version = config->readEntry("Version"); */ + + KGlobal::locale()->insertCatalogue(QString::fromUtf8("libept")); + + TestApp *ta = new TestApp(); + + app.setMainWidget(ta); + ta->show(); + + return app.exec(); +} diff --git a/config.h.in b/config.h.in new file mode 100644 index 0000000..854b254 --- /dev/null +++ b/config.h.in @@ -0,0 +1,394 @@ +/* config.h.in. Generated from configure.in by autoheader. */ + +/* Define to 1 if you have the header file. */ +#undef HAVE_CARBON_CARBON_H + +/* Define if you have the CoreAudio API */ +#undef HAVE_COREAUDIO + +/* Define to 1 if you have the header file. */ +#undef HAVE_CRT_EXTERNS_H + +/* Defines if your system has the crypt function */ +#undef HAVE_CRYPT + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#undef HAVE_DIRENT_H + +/* Define if you have dlfcn */ +#undef HAVE_DLFCN + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_DL_H + +/* Define to 1 if you have the `fabsl' function. */ +#undef HAVE_FABSL + +/* Define to 1 if you have the header file. */ +#undef HAVE_FCNTL_H + +/* Define to 1 if you have the `flock' function. */ +#undef HAVE_FLOCK + +/* Define to 1 if you have the header file. */ +#undef HAVE_FNMATCH_H + +/* Define if you have getdomainname */ +#undef HAVE_GETDOMAINNAME + +/* Define if you have the getdomainname prototype */ +#undef HAVE_GETDOMAINNAME_PROTO + +/* Define if you have gethostname */ +#undef HAVE_GETHOSTNAME + +/* Define if you have the gethostname prototype */ +#undef HAVE_GETHOSTNAME_PROTO + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define if you have libjpeg */ +#undef HAVE_LIBJPEG + +/* Define if you have libpng */ +#undef HAVE_LIBPNG + +/* Define if you have a working libpthread (will enable threaded code) */ +#undef HAVE_LIBPTHREAD + +/* Define if you have libz */ +#undef HAVE_LIBZ + +/* Define to 1 if you have the header file. */ +#undef HAVE_LINUX_TCP_H + +/* Define to 1 if the type `long double' works and has more range or precision + than `double'. */ +#undef HAVE_LONG_DOUBLE + +/* Define to 1 if the type `long double' works and has more range or precision + than `double'. */ +#undef HAVE_LONG_DOUBLE_WIDER + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the header file, and it defines `DIR'. */ +#undef HAVE_NDIR_H + +/* Define if your system needs _NSGetEnviron to set up the environment */ +#undef HAVE_NSGETENVIRON + +/* Define to 1 if you have the header file. */ +#undef HAVE_PATHS_H + +/* Define if you have res_init */ +#undef HAVE_RES_INIT + +/* Define if you have the res_init prototype */ +#undef HAVE_RES_INIT_PROTO + +/* Define to 1 if you have the `re_comp' function. */ +#undef HAVE_RE_COMP + +/* Define if you have setenv */ +#undef HAVE_SETENV + +/* Define if you have the setenv prototype */ +#undef HAVE_SETENV_PROTO + +/* Define if you have a STL implementation by SGI */ +#undef HAVE_SGI_STL + +/* Define if you have shload */ +#undef HAVE_SHLOAD + +/* Define to 1 if you have the `snprintf' function. */ +#undef HAVE_SNPRINTF + +/* Define to 1 if you have the `socket' function. */ +#undef HAVE_SOCKET + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the `strdup' function. */ +#undef HAVE_STRDUP + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define if you have strlcat */ +#undef HAVE_STRLCAT + +/* Define if you have the strlcat prototype */ +#undef HAVE_STRLCAT_PROTO + +/* Define if you have strlcpy */ +#undef HAVE_STRLCPY + +/* Define if you have the strlcpy prototype */ +#undef HAVE_STRLCPY_PROTO + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYSENT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_BITYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_CDEFS_H + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#undef HAVE_SYS_DIR_H + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#undef HAVE_SYS_NDIR_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_PARAM_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_PROC_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIME_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define if you have unsetenv */ +#undef HAVE_UNSETENV + +/* Define if you have the unsetenv prototype */ +#undef HAVE_UNSETENV_PROTO + +/* Define to 1 if you have the header file. */ +#undef HAVE_UTMP_H + +/* Define to 1 if you have the `vsnprintf' function. */ +#undef HAVE_VSNPRINTF + +/* Suffix for lib directories */ +#undef KDELIBSUFF + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* The size of `char *', as computed by sizeof. */ +#undef SIZEOF_CHAR_P + +/* The size of `int', as computed by sizeof. */ +#undef SIZEOF_INT + +/* The size of `long', as computed by sizeof. */ +#undef SIZEOF_LONG + +/* The size of `short', as computed by sizeof. */ +#undef SIZEOF_SHORT + +/* The size of `size_t', as computed by sizeof. */ +#undef SIZEOF_SIZE_T + +/* The size of `unsigned long', as computed by sizeof. */ +#undef SIZEOF_UNSIGNED_LONG + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define to 1 if you can safely include both and . */ +#undef TIME_WITH_SYS_TIME + +/* Version number of package */ +#undef VERSION + +/* Defined if compiling without arts */ +#undef WITHOUT_ARTS + +/* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a + `char[]'. */ +#undef YYTEXT_POINTER + +/* + * jpeg.h needs HAVE_BOOLEAN, when the system uses boolean in system + * headers and I'm too lazy to write a configure test as long as only + * unixware is related + */ +#ifdef _UNIXWARE +#define HAVE_BOOLEAN +#endif + + + +/* + * AIX defines FD_SET in terms of bzero, but fails to include + * that defines bzero. + */ + +#if defined(_AIX) +#include +#endif + + + +#if defined(HAVE_NSGETENVIRON) && defined(HAVE_CRT_EXTERNS_H) +# include +# include +# define environ (*_NSGetEnviron()) +#endif + + + +#if !defined(HAVE_GETDOMAINNAME_PROTO) +#ifdef __cplusplus +extern "C" { +#endif +#include + int getdomainname (char *, size_t); +#ifdef __cplusplus +} +#endif +#endif + + + +#if !defined(HAVE_GETHOSTNAME_PROTO) +#ifdef __cplusplus +extern "C" { +#endif +int gethostname (char *, unsigned int); +#ifdef __cplusplus +} +#endif +#endif + + + +#if !defined(HAVE_RES_INIT_PROTO) +#ifdef __cplusplus +extern "C" { +#endif +int res_init(void); +#ifdef __cplusplus +} +#endif +#endif + + + +#if !defined(HAVE_SETENV_PROTO) +#ifdef __cplusplus +extern "C" { +#endif +int setenv (const char *, const char *, int); +#ifdef __cplusplus +} +#endif +#endif + + + +#if !defined(HAVE_STRLCAT_PROTO) +#ifdef __cplusplus +extern "C" { +#endif +unsigned long strlcat(char*, const char*, unsigned long); +#ifdef __cplusplus +} +#endif +#endif + + + +#if !defined(HAVE_STRLCPY_PROTO) +#ifdef __cplusplus +extern "C" { +#endif +unsigned long strlcpy(char*, const char*, unsigned long); +#ifdef __cplusplus +} +#endif +#endif + + + +#if !defined(HAVE_UNSETENV_PROTO) +#ifdef __cplusplus +extern "C" { +#endif +void unsetenv (const char *); +#ifdef __cplusplus +} +#endif +#endif + + + +/* + * On HP-UX, the declaration of vsnprintf() is needed every time ! + */ + +#if !defined(HAVE_VSNPRINTF) || defined(hpux) +#if __STDC__ +#include +#include +#else +#include +#endif +#ifdef __cplusplus +extern "C" +#endif +int vsnprintf(char *str, size_t n, char const *fmt, va_list ap); +#ifdef __cplusplus +extern "C" +#endif +int snprintf(char *str, size_t n, char const *fmt, ...); +#endif + + + +#if defined(__SVR4) && !defined(__svr4__) +#define __svr4__ 1 +#endif + + +/* type to use in place of socklen_t if not defined */ +#undef kde_socklen_t + +/* type to use in place of socklen_t if not defined (deprecated, use + kde_socklen_t) */ +#undef ksize_t diff --git a/configure.files b/configure.files new file mode 100644 index 0000000..d4d7dbc --- /dev/null +++ b/configure.files @@ -0,0 +1,3 @@ +./admin/configure.in.min +configure.in.in +./adept/configure.in.in diff --git a/configure.in b/configure.in new file mode 100644 index 0000000..eb5813e --- /dev/null +++ b/configure.in @@ -0,0 +1,160 @@ +dnl ======================================================= +dnl FILE: ./admin/configure.in.min +dnl ======================================================= + +dnl This file is part of the KDE libraries/packages +dnl Copyright (C) 2001 Stephan Kulow (coolo@kde.org) + +dnl This file is free software; you can redistribute it and/or +dnl modify it under the terms of the GNU Library General Public +dnl License as published by the Free Software Foundation; either +dnl version 2 of the License, or (at your option) any later version. + +dnl This library is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl Library General Public License for more details. + +dnl You should have received a copy of the GNU Library General Public License +dnl along with this library; see the file COPYING.LIB. If not, write to +dnl the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +dnl Boston, MA 02110-1301, USA. + +# Original Author was Kalle@kde.org +# I lifted it in some mater. (Stephan Kulow) +# I used much code from Janos Farkas + +dnl Process this file with autoconf to produce a configure script. + +AC_INIT(acinclude.m4) dnl a source file from your sub dir + +dnl This is so we can use kde-common +AC_CONFIG_AUX_DIR(admin) + +dnl This ksh/zsh feature conflicts with `cd blah ; pwd` +unset CDPATH + +dnl Checking host/target/build systems, for make, install etc. +AC_CANONICAL_SYSTEM +dnl Perform program name transformation +AC_ARG_PROGRAM + +dnl Automake doc recommends to do this only here. (Janos) +AM_INIT_AUTOMAKE(adept-2.1.3ubuntu24, "3.5.2") dnl searches for some needed programs + +KDE_SET_PREFIX + +dnl generate the config header +AM_CONFIG_HEADER(config.h) dnl at the distribution this done + +dnl Checks for programs. +AC_CHECK_COMPILERS +AC_ENABLE_SHARED(yes) +AC_ENABLE_STATIC(no) +KDE_PROG_LIBTOOL + +dnl for NLS support. Call them in this order! +dnl WITH_NLS is for the po files +AM_KDE_WITH_NLS + +KDE_USE_QT(3.3) +AC_PATH_KDE +dnl ======================================================= +dnl FILE: configure.in.in +dnl ======================================================= + +#MIN_CONFIG(3.3) +# Define a symbol, to know that we're compiling WITH kde. (for apps that +# can compile without KDE, optionally) +AM_CONDITIONAL(KDE_INSTALLED, test "$have_kde" = "yes") + +dnl Checks for header files. +AC_HEADER_DIRENT +AC_HEADER_STDC +AC_CHECK_HEADERS(fcntl.h sys/time.h sys/stat.h stdint.h) +AC_CHECK_HEADERS(sys/cdefs.h fnmatch.h sysent.h strings.h paths.h) +AC_CHECK_HEADERS(utmp.h sys/param.h linux/tcp.h sys/proc.h) + +dnl Checks for typedefs, structures, and compiler characteristics. +AC_HEADER_TIME + +AC_C_LONG_DOUBLE + +dnl Checks for library functions. +KDE_CHECK_DLOPEN +AC_CHECK_FUNCS(socket fabsl strdup vsnprintf re_comp flock) +AC_CHECK_SETENV +AC_CHECK_UNSETENV +AC_CHECK_GETDOMAINNAME +AC_CHECK_GETHOSTNAME +AM_PROG_LEX +LFLAGS="-o${LEX_OUTPUT_ROOT}.c" +AC_SUBST(LFLAGS) +dnl ======================================================= +dnl FILE: ./adept/configure.in.in +dnl ======================================================= + +AC_ARG_ENABLE(adept, [ --enable-adept compile adept],, [DO_NOT_COMPILE="$DO_NOT_COMPILE adept"]) +LIBTAGCOLL2_DEFS +LIBAPT_FRONT_DEFS +LIBEPT_DEFS +LIBWIBBLE_DEFS +KDE_CREATE_SUBDIRSLIST +AM_CONDITIONAL(adept_SUBDIR_included, test "x$adept_SUBDIR_included" = xyes) +AC_CONFIG_FILES([ Makefile ]) +AC_CONFIG_FILES([ adept/Makefile ]) +AC_CONFIG_FILES([ adept/adept/Makefile ]) +AC_CONFIG_FILES([ adept/batch/Makefile ]) +AC_CONFIG_FILES([ adept/icons/Makefile ]) +AC_CONFIG_FILES([ adept/installer/Makefile ]) +AC_CONFIG_FILES([ adept/kubuntu_upgrader/Makefile ]) +AC_CONFIG_FILES([ adept/libadept/Makefile ]) +AC_CONFIG_FILES([ adept/manager/Makefile ]) +AC_CONFIG_FILES([ adept/notifier/Makefile ]) +AC_CONFIG_FILES([ adept/updater/Makefile ]) +AC_OUTPUT +# Check if KDE_SET_PREFIX was called, and --prefix was passed to configure +if test -n "$kde_libs_prefix" -a -n "$given_prefix"; then + # And if so, warn when they don't match + if test "$kde_libs_prefix" != "$given_prefix"; then + # And if kde doesn't know about the prefix yet + echo ":"`kde-config --path exe`":" | grep ":$given_prefix/bin/:" 2>&1 >/dev/null + if test $? -ne 0; then + echo "" + echo "Warning: you chose to install this package in $given_prefix," + echo "but KDE was found in $kde_libs_prefix." + echo "For this to work, you will need to tell KDE about the new prefix, by ensuring" + echo "that KDEDIRS contains it, e.g. export KDEDIRS=$given_prefix:$kde_libs_prefix" + echo "Then restart KDE." + echo "" + fi + fi +fi + +if test x$GXX = "xyes" -a x$kde_have_gcc_visibility = "xyes" -a x$kde_cv_val_qt_gcc_visibility_patched = "xno"; then + echo "" + echo "Your GCC supports symbol visibility, but the patch for Qt supporting visibility" + echo "was not included. Therefore, GCC symbol visibility support remains disabled." + echo "" + echo "For better performance, consider including the Qt visibility supporting patch" + echo "located at:" + echo "" + echo "http://bugs.kde.org/show_bug.cgi?id=109386" + echo "" + echo "and recompile all of Qt and KDE. Note, this is entirely optional and" + echo "everything will continue to work just fine without it." + echo "" +fi + +if test "$all_tests" = "bad"; then + if test ! "$cache_file" = "/dev/null"; then + echo "" + echo "Please remove the file $cache_file after changing your setup" + echo "so that configure will find the changes next time." + echo "" + fi +else + echo "" + echo "Good - your configure finished. Start make now" + echo "" +fi diff --git a/configure.in.in b/configure.in.in new file mode 100644 index 0000000..49e3383 --- /dev/null +++ b/configure.in.in @@ -0,0 +1,27 @@ +#MIN_CONFIG(3.3) +# Define a symbol, to know that we're compiling WITH kde. (for apps that +# can compile without KDE, optionally) +AM_CONDITIONAL(KDE_INSTALLED, test "$have_kde" = "yes") + +dnl Checks for header files. +AC_HEADER_DIRENT +AC_HEADER_STDC +AC_CHECK_HEADERS(fcntl.h sys/time.h sys/stat.h stdint.h) +AC_CHECK_HEADERS(sys/cdefs.h fnmatch.h sysent.h strings.h paths.h) +AC_CHECK_HEADERS(utmp.h sys/param.h linux/tcp.h sys/proc.h) + +dnl Checks for typedefs, structures, and compiler characteristics. +AC_HEADER_TIME + +AC_C_LONG_DOUBLE + +dnl Checks for library functions. +KDE_CHECK_DLOPEN +AC_CHECK_FUNCS(socket fabsl strdup vsnprintf re_comp flock) +AC_CHECK_SETENV +AC_CHECK_UNSETENV +AC_CHECK_GETDOMAINNAME +AC_CHECK_GETHOSTNAME +AM_PROG_LEX +LFLAGS="-o${LEX_OUTPUT_ROOT}.c" +AC_SUBST(LFLAGS) diff --git a/subdirs b/subdirs new file mode 100644 index 0000000..427e062 --- /dev/null +++ b/subdirs @@ -0,0 +1 @@ +adept